diff options
| author | Fuwn <[email protected]> | 2024-08-29 21:31:09 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-08-29 21:31:09 -0700 |
| commit | 653f81eec07eb3e33c380810676a7feb45e1df43 (patch) | |
| tree | 00d43c8f1b2cb2cf8ebaf1b7c1a4c026718033bb /home/ebisu/fortune/desktop | |
| parent | some stuff (diff) | |
| download | nixos-config-653f81eec07eb3e33c380810676a7feb45e1df43.tar.xz nixos-config-653f81eec07eb3e33c380810676a7feb45e1df43.zip | |
some stuff
Diffstat (limited to 'home/ebisu/fortune/desktop')
42 files changed, 2674 insertions, 0 deletions
diff --git a/home/ebisu/fortune/desktop/agnostic/default.nix b/home/ebisu/fortune/desktop/agnostic/default.nix new file mode 100644 index 0000000..4531cc4 --- /dev/null +++ b/home/ebisu/fortune/desktop/agnostic/default.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + showmethekey + brightnessctl + bibata-cursors + xorg.xlsclients + libnotify + # lemurs + # emptty + ]; +} diff --git a/home/ebisu/fortune/desktop/default.nix b/home/ebisu/fortune/desktop/default.nix new file mode 100644 index 0000000..061a773 --- /dev/null +++ b/home/ebisu/fortune/desktop/default.nix @@ -0,0 +1,8 @@ +{ ... }: +{ + imports = [ + ./agnostic + ./wayland + # ./xorg + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/clipboard.nix b/home/ebisu/fortune/desktop/wayland/clipboard.nix new file mode 100644 index 0000000..05784b9 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/clipboard.nix @@ -0,0 +1,8 @@ +{ pkgs +, ... +}: { + home.packages = with pkgs; [ + wl-clipboard + cliphist + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/default.nix b/home/ebisu/fortune/desktop/wayland/default.nix new file mode 100644 index 0000000..9f5fc47 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/default.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: +{ + imports = [ + ./hyprland + ./waybar + ./clipboard.nix + ./mako.nix + ./screenshot.nix + ./wlogout.nix + ]; + + home.packages = with pkgs; [ + gammastep + wlr-randr + ydotool + swappy + swww + rofi-wayland + hyprpicker + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/default.nix b/home/ebisu/fortune/desktop/wayland/hyprland/default.nix new file mode 100644 index 0000000..b3d92be --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/default.nix @@ -0,0 +1,32 @@ +{ inputs, pkgs, ... }: +{ + imports = [ + ./hypridle.nix + ./hyprland + ./hyprlock.nix + # ./hyprpaper.nix + ]; + + wayland.windowManager.hyprland = { + enable = true; + package = inputs.hyprland.packages.${pkgs.system}.hyprland; + xwayland.enable = true; + + systemd = { + enable = true; + + variables = [ "--all" ]; + }; + + plugins = [ + # inputs.Hyprspace.packages.${pkgs.system}.Hyprspace + inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprtrails + ]; + }; + + xdg.configFile."hypr/xdph.conf".text = '' + screencopy { + max_fps = 0 + } + ''; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hypridle.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hypridle.nix new file mode 100644 index 0000000..d1b0835 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hypridle.nix @@ -0,0 +1,35 @@ +{ pkgs, ... }: +{ + services.hypridle = { + enable = true; + + settings = { + "$lock_command" = "pidof ${pkgs.hyprlock}/bin/hyprlock || ${pkgs.hyprlock}/bin/hyprlock"; + # $suspend_command = pidof steam || systemctl suspend || loginctl suspend + + general = { + lock_cmd = "$lock_command"; + # before_sleep_cmd = $suspend_command + before_sleep_cmd = "${pkgs.playerctl}/bin/playerctl pause"; + ignore_dbus_inhibit = false; + ignore_systemd_inhibit = false; + }; + + listener = [ + { + timeout = 180; # 3 minutes + on-timeout = "$lock_command"; + } + { + timeout = 240; # 4 minutes + on-timeout = "hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on"; + } + # { + # timeout = 540; # 9 minutes + # on-timeout = "$suspend_cmd"; + # } + ]; + }; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/animations.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/animations.nix new file mode 100644 index 0000000..c47c164 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/animations.nix @@ -0,0 +1,86 @@ +_: { + wayland.windowManager.hyprland = { + extraConfig = '' + # animations { + # enabled = yes + + # # bezier = myBezier, 0.05, 0.9, 0.1, 1.05 + + # # animation = windows, 1, 5, myBezier + # # animation = windowsOut, 1, 7, default, popin + # # animation = border, 1, 10, default + # # animation = fade, 1, 7, default + # # animation = workspaces, 1, 6, default, slidevert + + # # bezier = overshot,0.5,0.1,0.4,1.2 + + # # animation = global, 1, 3, default + # # animation = workspaces, 1, 4, default + # # animation = windowsMove, 1, 2, default + # # animation = fade, 1, 2, default + + # bezier = overshot, 0.05, 0.5, 0.1, 1.05 + # bezier = smoothOut, 0.36, 0, 0.66, -0.56 + # bezier = smoothIn, 0.25, 0.8, 0.5, 1 + + # animation = windows, 1, 5, overshot, slide + # animation = windowsOut, 1, 4, smoothOut, slide + # animation = windowsMove, 1, 4, default + # animation = border, 1, 10, default + # animation = fade, 1, 10, smoothIn + # animation = fadeDim, 1, 10, smoothIn + # animation = workspaces, 1, 6, default + # } + + bezier = smoothIn, 0.25, 1, 0.5, 1 + bezier = wind, 0.05, 0.9, 0.1, 1.06 + bezier = winIn, 0.1, 1.1, 0.1, 1.05 + bezier = linear, 1, 1, 1, 1 + + animations { + enabled = yes + + # buttery_smoooooooth... (slide) + # animation = windows, 1, 5, default, slide + # animation = windowsOut, 1, 8, smoothIn, slide + # animation = windowsMove, 1, 7, default + # animation = fade, 1, 5, smoothIn + # animation = fadeOut, 1, 4, smoothIn + # animation = fadeDim, 1, 3, smoothIn + # animation = workspaces, 1, 5, default, slidefadevert + # animation = specialWorkspace, 1, 5, default, fade + + # buttery_smoooooooth... (Popin...) + # animation = windows, 1, 3, default, popin 70% + # animation = windowsOut, 1, 20, default, popin 85% + # animation = windowsMove, 1, 7, default + # animation = fade, 1, 6, smoothIn + # animation = fadeOut, 1, 3, smoothIn + # animation = fadeDim, 1, 3, smoothIn + # animation = workspaces, 1, 5, wind, slidefadevert 40% + + # fasssstt popin + animation = windows, 1, 2, default, popin 80% + animation = windowsOut, 1, 5, default, popin 90% + animation = windowsMove, 1, 5, default + animation = layers, 1, 3, default, popin 90% + animation = fade, 1, 4, smoothIn + animation = fadeOut, 1, 2, smoothIn + animation = fadeDim, 1, 3, smoothIn + animation = workspaces, 1, 3, default, slidefadevert 15% + animation = specialWorkspace, 1, 3, default, slidefadevert 15% + + # Random... + # animation = windows, 1, 5, wind, slide + # animation = windowsIn, 1, 4, winIn, slide + # animation = windowsOut, 1 , 7, smoothIn, slide + # animation = windowsMove, 1, 6, default + # animation = fade, 1, 5, smoothIn + # animation = fadeOut, 1, 3, smoothIn + # animation = fadeDim, 1, 3, smoothIn + # animation = workspaces, 1, 4, wind, slidefadevert 15% + # animation = specialWorkspace, 1, 3, default, slidefadevert 15% + } + ''; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/binds.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/binds.nix new file mode 100644 index 0000000..4059ba5 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/binds.nix @@ -0,0 +1,209 @@ +_: { + wayland.windowManager.hyprland = { + settings = { + "$mod" = "SUPER"; + "$mail" = "mailspring --password-store=\"gnome-libsecret\" --enable-features=UseOzonePlatform --ozone-platform=wayland"; + "$script_path" = "$HOME/.config/hypr/hyprland/scripts"; + "$term" = "kitty"; + + bind = ( + builtins.concatLists + (builtins.genList + ( + x: + let + ws = + let + c = (x + 1) / 10; + in + builtins.toString (x + 1 - (c * 10)); + in + [ + # Switch pseudo-tag (workspaces) + "$mod, ${ws}, exec, $script_path/switch_workspace ${toString (x + 1)}" + # "$mod, ${ws}, split-workspace, ${toString (x + 1)}" + + # Move window to pseudo-tag (workspace) + "$mod SHIFT, ${ws}, exec, $script_path/move_window_to_workspace ${toString (x + 1)}" + # "$mod SHIFT, ${ws}, split-movetoworkspacesilent, ${toString (x + 1)}" + ] + ) + 10) + ++ + [ + # Scratchpads + "$mod, apostrophe, exec, hyprctl dispatch togglespecialworkspace simple_calculator" + "$mod SHIFT, RETURN, exec, hyprctl dispatch togglespecialworkspace simple_terminal" + "$mod SHIFT, c, exec, hyprctl dispatch togglespecialworkspace chatgpt" + "$mod SHIFT, s, exec, hyprctl dispatch togglespecialworkspace spotify" + "$mod SHIFT, apostrophe, exec, hyprctl dispatch togglespecialworkspace calculator" + + # Focus + "$mod, k, movefocus, u" + "$mod, j, movefocus, d" + "$mod, l, movefocus, r" + "$mod, h, movefocus, l" + + # "$mod, j, layoutmsg, cyclenext" + # "$mod, j, layoutmsg, cycleprev" + + # "$mod, tab, hycov:toggleoverview" + # "$mod SHIFT, tab, overview:toggle" + + # Emoji picker + "$mod, GRAVE, exec, rofi -modi emoji -show emoji" + + # Volume control + "$mod, MINUS, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + "$mod SHIFT, MINUS, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 15%-" + "$mod, EQUAL, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" + "$mod SHIFT, EQUAL, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 15%+" + + # Session control + "$mod SHIFT, Q, exec, wlogout" + "$mod SHIFT, R, exec, hyprctl reload" + + # Window control + "$mod, F, fullscreen" + # "$mod SHIFT, F, fullscreen, 2" + "$mod SHIFT, F, exec, hyprctl dispatch fakefullscreen && $script_path/fake_fullscreen_status" + "$mod, G, togglefloating" + "$mod, P, pseudo" + "$mod SHIFT, P, pin" + "$mod, T, togglesplit" + "$mod, U, focusurgentorlast" + "$mod, Q, killactive" + "$mod, S, exec, hyprctl keyword window:sticky 1" + "$mod, b, exec, pkill -SIGUSR1 waybar" + "$mod, SPACE, layoutmsg, swapwithmaster" + "$mod, V, exec, $script_path/toggle_layout" + + # Application binds + "$mod, W, exec, $BROWSER" + "$mod SHIFT, W, exec, $term -e sudo nmtui" + "$mod, E, exec, $mail" + "$mod SHIFT, R, exec, $term -e htop" + "$mod, R, exec, rofi -show run" + "$mod SHIFT, D, exec, bitwarden-desktop" + "$mod, RETURN, exec, $term" + "$mod SHIFT, N, exec, $BROWSER https://sumi.news" + "$mod, M, exec, spotify" + "$mod SHIFT, M, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + "$mod ALT, A, exec, hyprpicker -a" + + # Launchers + "$mod, D, exec, rofi -show combi" + "$mod, C, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy" + + # Spotify control + "$mod, P, exec, spt pb --toggle" + "$mod SHIFT, P, exec, mpc pause; pauseallmpv" + "$mod, BRACKETLEFT, exec, spt pb --seek -10" + "$mod SHIFT, BRACKETLEFT, exec, spt pb --seek -60" + "$mod, BRACKETRIGHT, exec, spt pb --seek +10" + "$mod SHIFT, BRACKETRIGHT, exec, spt pb --seek +60" + "$mod, COMMA, exec, spt pb --pp" + "$mod, PERIOD, exec, spt pb --next" + "$mod SHIFT, PERIOD, exec, spt pb --previous" + + # Gaps control + "$mod, a, exec, $script_path/toggle_gaps" + "$mod SHIFT, a, exec, bash -c 'hyprctl keyword general:gaps_in 5; hyprctl keyword general:gaps_out 10'" + + # Increment gaps + "$mod, mouse_up, exec, hyprctl keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') + 3`" + "$mod, mouse_up, exec, hyprctl keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') + 2`" + + # Decrement gaps + "$mod, mouse_down, exec, hyprctl keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') - 3`" + "$mod, mouse_down, exec, hyprctl keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') - 2`" + + # Move focus to monitor + "$mod, LEFT, exec, $script_path/move_focus_to_monitor left" + "$mod, RIGHT, exec, $script_path/move_focus_to_monitor right" + + # Move window to monitor + "$mod SHIFT, h, exec, $script_path/move_window_to_monitor left" + "$mod SHIFT, l, exec, $script_path/move_window_to_monitor right" + + # Screenshot + ", Print, exec, screenshot --area" + "$mod SHIFT, Print, exec, screenshot --window" + "$mod CTRL, Print, exec, screenshot --monitor" + "$mod, Print, exec, screenshot --now" + "$mod SHIFT, v, exec, screenshot --now --clipboard && hyprctl dispatch togglespecialworkspace chatgpt && ydotool key 42:1 1:1 1:0 42:0 29:1 47:1 29:0 47:0" + + # Media keys + # ... + ] + ); + + binde = ( + [ + # Increment gaps + "$mod, Z, exec, hyprctl --batch \"keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') + 3`; keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') + 2`\"" + + # Decrement gaps + "$mod, X, exec, hyprctl --batch \"keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') - 3`; keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') - 2`\"" + + # Resize active window + "$mod SHIFT, UP, resizeactive, 0 -50" + "$mod SHIFT, DOWN, resizeactive, 0 50" + "$mod SHIFT, RIGHT, resizeactive, 50 0" + "$mod SHIFT, LEFT, resizeactive, -50 0" + + # Move active window + "$mod ALT, k, moveactive, 0 -100" + "$mod ALT, j, moveactive, 0 100" + "$mod ALT, l, moveactive, 100 0" + "$mod ALT, h, moveactive, -100 0" + ] + ); + + bindm = ( + [ + # Move window with mouse + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + "$mod SHIFT, mouse:273, resizewindow 1" + ] + ); + }; + + extraConfig = '' + # Media keys + bind = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + bind = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 0%- && wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ + bind = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 0%+ && wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- + bind = , XF86AudioPrev, exec, playerctl previous + bind = , XF86AudioNext, exec, playerctl next + bind = , XF86AudioPause, exec, playerctl play-pause + bind = , XF86AudioPlay, exec, playerctl play-pause + bind = , XF86AudioStop, exec, playerctl stop + bind = , XF86AudioRewind, exec, playerctl position -10 + bind = , XF86AudioForward, exec, playerctl position +10 + bind = , XF86AudioMedia, exec, spotify + bind = , XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle + + # Other media keys + bind = , XF86Calculator, exec, $term -e bc -l + bind = , XF86Sleep, exec, sudo -A zzz + bind = , XF86WWW, exec, $BROWSER + bind = , XF86DOS, exec, $term + bind = , XF86ScreenSaver, exec, pidof hyprlock || hyprlock && hyprctl dispatch dpms off + bind = , XF86TaskPane, exec, $term -e htop + bind = , XF86Mail, exec, $mail + bind = , XF86MyComputer, exec, $term -e ranger + bind = , XF86Launch1, exec, hyprctl dispatch dpms off + + # Touchpad control + bind = , XF86TouchpadToggle, exec, (synclient | grep 'TouchpadOff.*1' && synclient TouchpadOff=0) || synclient TouchpadOff=1 + bind = , XF86TouchpadOff, exec, synclient TouchpadOff=1 + bind = , XF86TouchpadOn, exec, synclient TouchpadOff=0 + + # Brightness control + bind = , XF86MonBrightnessUp, exec, xbacklight -inc 15 + bind = , XF86MonBrightnessDown, exec, xbacklight -dec 15 + ''; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/decoration.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/decoration.nix new file mode 100644 index 0000000..feb9145 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/decoration.nix @@ -0,0 +1,43 @@ +_: { + wayland.windowManager.hyprland.settings.decoration = { + rounding = 10; + drop_shadow = true; + shadow_ignore_window = true; + shadow_range = 8; + shadow_render_power = 10; + shadow_offset = "2 2"; + "col.shadow" = "rgba(00000055)"; # 2A + + blurls = [ + "gtk-layer-shell" + "lockscreen" + ]; + + # active_opacity = 0.9 + # inactive_opacity = 0.7 + # fullscreen_opacity = 1.0 + active_opacity = 1.0; + inactive_opacity = 0.95; + + blur = { + enabled = true; + xray = true; + special = false; + # size = 1; + passes = 2; + ignore_opacity = true; + new_optimizations = true; + # vibrancy = 0.1696; + # noise = 0.01; + brightness = 1; + contrast = 1; + + popups = true; + popups_ignorealpha = 0.6; + }; + + dim_special = 0.35; + dim_inactive = false; + dim_strength = 0.1; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/default.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/default.nix new file mode 100644 index 0000000..d01ddaf --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/default.nix @@ -0,0 +1,39 @@ +_: { + imports = [ + ./animations.nix + ./binds.nix + ./decoration.nix + ./environment.nix + ./executions.nix + ./general.nix + ./plugins.nix + ./rules.nix + ./workspaces.nix + ]; + + xdg.configFile = ( + (builtins.listToAttrs ( + map + (script: { + name = "hypr/hyprland/scripts/${script}"; + + value = { + source = ./scripts/${script}; + }; + }) + [ + "common.sh" + "fake_fullscreen_status" + # "hycov_easymotion" + "initialise_waybar" + "initialise_xdg_portal" + "move_focus_to_monitor" + "move_window_to_monitor" + "move_window_to_workspace" + "switch_workspace" + "toggle_gaps" + "toggle_layout" + ] + )) + ); +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/environment.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/environment.nix new file mode 100644 index 0000000..73690ac --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/environment.nix @@ -0,0 +1,80 @@ +_: +let cursorSize = "18"; in +{ + wayland.windowManager.hyprland.settings.env = [ + # Proton + "PROTON_ENABLE_NGX_UPDATER, 1" + + # Cursor + "XCURSOR_SIZE, ${cursorSize}" + "HYPRCURSOR_SIZE, ${cursorSize}" + "HYPERCURSOR_THEME, Bibata-Modern-Ice" # WhiteSur-cursors + "XCURSOR_THEME, Bibata-Modern-Ice" + + # Wayland & Xwayland + "GDK_BACKEND, wayland,x11,*" + "SDL_VIDEODRIVER, wayland" + "CLUTTER_BACKEND, wayland" + "XWAYLAND_NO_GLAMOR, 1" # Gamescope + + # Nvidia + "LIBVA_DRIVER_NAME, nvidia" + "GBM_BACKEND, nvidia-drm" + "__GLX_VENDOR_LIBRARY_NAME, nvidia" + "__VK_LAYER_NV_optimus, NVIDIA_only" + "__NV_PRIME_RENDER_OFFLOAD, 1" + "NVD_BACKEND, direct" + + # OpenGL + "__GL_GSYNC_ALLOWED, 1" + "__GL_VRR_ALLOWED, 1" + "__GL_MaxFramesAllowed, 1" + + # Electron + # "ELECTRON_OZONE_PLATFORM_HINT, auto" + "OZONE_PLATFORM, wayland" + + # Qt + "QT_AUTO_SCREEN_SCALE_FACTOR, 1" + "QT_QPA_PLATFORM, wayland;xcb" + "QT_WAYLAND_DISABLE_WINDOWDECORATION, 1" + "QT_QPA_PLATFORMTHEME, qt5ct" + # "QT_STYLE_OVERRIDE, kvantum" + + # wlroots + "WLR_NO_HARDWARE_CURSORS, 1" + "WLR_DRM_NO_ATOMIC, 1" + "WLR_USE_LIBINPUT, 1" + "WLR_RENDERER_ALLOW_SOFTWARE, 1" + # "WLR_DRM_DEVICES, /dev/dri/card0" + # "WLR_EGL_NO_MODIFIERS, 1" + + # XDG + "XDG_SESSION_TYPE, wayland" + "XDG_CURRENT_DESKTOP, Hyprland" + "XDG_SESSION_DESKTOP, Hyprland" + + # Mozilla + "MOZ_ENABLE_WAYLAND, 1" + "MOZ_DISABLE_RDD_SANDBOX, 1" + + # Fcitx + # https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland + "QT_IM_MODULE, fcitx" + "XMODIFIERS, @im=fcitx" + # "GTK_IM_MODULE, wayland" + # "GTK_IM_MODULE, fcitx" + "SDL_IM_MODULE, fcitx" + "GLFW_IM_MODULE, ibus" + "INPUT_METHOD, fcitx" + + # GTK + "GTK_USE_PORTAL, 1" + + # Java + "_JAVA_AWT_WM_NONREPARENTING, 1" + + # SSH + # "SSH_AUTH_SOCK, $XDG_RUNTIME_DIR/ssh-agent.socket" + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/executions.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/executions.nix new file mode 100644 index 0000000..ad25ea5 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/executions.nix @@ -0,0 +1,53 @@ +{ pkgs, ... }: +{ + wayland.windowManager.hyprland.settings = { + exec-once = ([ + # One-shots + "hyprctl dispatch workspace 1" + "swww-daemon" + "gammastep -l 45.540750:-122.385330 >/dev/null" + "${pkgs.pyprland}/bin/pypr" + "hyprpm reload" + "swaddle" + # "${pkgs.waybar}/bin/waybar" + "waybar" + "hyprctl setcursor Bibata-Modern-Ice 18" + + # Fcitx5 + "fcitx5-remote -r" + "fcitx5 -d --replace" + "fcitx5-remote -r" + + # KWallet + # "pam_kwallet_init" + # "kwalletd6" + + # GNOME/Keyring + "gnome-keyring-daemon --replace --components=pkcs11,secrets,ssh,gpg" + "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 || /usr/libexec/polkit-gnome-authentication-agent-1" + + # XDG, XDPH, & Qt + "dbus-update-activation-environment --systemd --all" + "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" + "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" + "systemctl --user import-environment QT_QPA_PLATFORMTHEME" + "$script_path/initialise_xdg_portal" + + # Clipboard + "wl-paste --type text --watch cliphist store" + "wl-paste --type image --watch cliphist store" + + # JamesDSP & Solaar + "jamesdsp -t" + # "solaar -w hide" + + # SSH + # "killall -q ssh-agent" + # "eval $(ssh-agent -c)" + # "set -Ux SSH_AUTH_SOCK $SSH_AUTH_SOCK" + # "set -Ux SSH_AGENT_PID $SSH_AGENT_PID" + # "set -Ux SSH_AUTH_SOCK $SSH_AUTH_SOCK" + # "export SSH_AUTH_SOCK=\"$XDG_RUNTIME_DIR/ssh-agent.socket\"" + ]); + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/general.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/general.nix new file mode 100644 index 0000000..92d7c67 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/general.nix @@ -0,0 +1,119 @@ +{ config, ... }: { + wayland.windowManager.hyprland = { + settings = { + monitor = [ + "HDMI-A-2, [email protected], 0x0, 1" + "DP-2, [email protected], 1920x0, 1" + "DP-1, [email protected], 3840x0, 1" + ]; + + source = "${config.home.homeDirectory}/.cache/wal/colors-hyprland"; + + general = { + gaps_in = 5; + gaps_out = 10; + border_size = 0; + layout = "master"; + allow_tearing = true; + resize_on_border = true; + no_focus_fallback = true; + }; + + input = { + kb_layout = "us"; + # kb_variant = + # kb_model = + # kb_options = + # kb_rules = + repeat_rate = 35; # 50 + repeat_delay = 250; # 200 + follow_mouse = 1; + special_fallthrough = true; + + touchpad = { + natural_scroll = true; + disable_while_typing = true; + clickfinger_behavior = true; + scroll_factor = 0.15; + tap-to-click = true; + middle_button_emulation = true; + }; + + sensitivity = -0.5; + accel_profile = "flat"; + scroll_factor = 1.0; + # natural_scroll = false; + }; + + binds = { + allow_workspace_cycles = true; + scroll_event_delay = 0; + workspace_back_and_forth = true; + }; + + dwindle = { + pseudotile = true; + preserve_split = true; + force_split = 2; + smart_split = false; + smart_resizing = false; + no_gaps_when_only = 0; + special_scale_factor = 0.98; + }; + + master = { + allow_small_split = true; + new_status = "master"; + mfact = 0.55; + # no_gaps_when_only = yes; + orientation = "left"; + inherit_fullscreen = false; + }; + + gestures = { + workspace_swipe = true; + workspace_swipe_distance = 700; + workspace_swipe_fingers = 4; + workspace_swipe_cancel_ratio = 0.2; + workspace_swipe_min_speed_to_force = 5; + workspace_swipe_direction_lock = true; + workspace_swipe_direction_lock_threshold = 10; + workspace_swipe_create_new = true; + }; + + misc = { + vrr = false; + vfr = false; + enable_swallow = true; + swallow_regex = "^(kitty|footclient|foot|Alacritty|wezterm)$"; + disable_hyprland_logo = true; + disable_splash_rendering = true; + force_default_wallpaper = 0; + mouse_move_enables_dpms = true; + # key_press_enables_dpms = true; + # focus_on_activate = true; + animate_manual_resizes = true; + # animate_mouse_windowdragging = false; + mouse_move_focuses_monitor = true; + # new_window_takes_over_fullscreen = 2; + allow_session_lock_restore = true; + initial_workspace_tracking = false; + }; + + cursor = { + hide_on_key_press = true; + enable_hyprcursor = true; + }; + + xwayland = { + force_zero_scaling = true; + }; + + debug = { + watchdog_timeout = 0; + disable_logs = false; + damage_blink = false; + }; + }; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/plugins.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/plugins.nix new file mode 100644 index 0000000..61d73e3 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/plugins.nix @@ -0,0 +1,69 @@ +_: { + wayland.windowManager.hyprland.settings.plugin = { + # split-monitor-workspaces = { + # count = 10; + # keep_focused = 0; + # enable_notifications = 0; + # }; + + hyprtrails = { + color = "rgba(cfddf619)"; + }; + + hyprfocus = { + enabled = true; + animate_floating = true; + animate_workspacechange = true; + focus_animation = "flash"; + + bezier = [ + "bezIn, 0.5, 0.0, 1.0, 0.5" + "bezOut, 0.0, 0.5, 0.5, 1.0" + "overshot, 0.05, 0.9, 0.1, 1.05" + "smoothOut, 0.36, 0, 0.66, -0.56" + "smoothIn, 0.25, 1, 0.5, 1" + "realsmooth, 0.28, 0.29, .69, 1.08" + ]; + + flash = { + flash_opacity = 0.85; + in_bezier = "realsmooth"; + in_speed = 0.5; + out_bezier = "realsmooth"; + out_speed = 3; + }; + + shrink = { + shrink_percentage = 0.99; + in_bezier = "realsmooth"; + in_speed = 1; + out_bezier = "realsmooth"; + out_speed = 2; + }; + }; + + hycov = { + overview_gappo = 10; # gaps width from screen edge + overview_gappi = 10; # gaps width from clients + enable_hotarea = 0; # enable mouse cursor hotarea, when cursor enter hotarea, it will toggle overview + enable_click_action = 1; # enable mouse left button jump and right button kill in overview mode + hotarea_monitor = "all"; # monitor name which hotarea is in, default is all + hotarea_pos = 1; # position of hotarea (1: bottom left, 2: bottom right, 3: top left, 4: top right) + hotarea_size = 10; # hotarea size, 10x10 + swipe_fingers = 4; # finger number of gesture,move any directory + move_focus_distance = 100; # distance for movefocus,only can use 3 finger to move + enable_gesture = 0; # enable gesture + auto_exit = 1; # enable auto exit when no client in overview + auto_fullscreen = 0; # auto make active window maximize after exit overview + only_active_workspace = 0; # only overview the active workspace + only_active_monitor = 0; # only overview the active monitor + enable_alt_release_exit = 1; # alt swith mode arg,see readme for detail + alt_replace_key = "Super_L"; # alt swith mode arg,see readme for detail + alt_toggle_auto_next = 0; # auto focus next window when toggle overview in alt swith mode + click_in_cursor = 1; # when click to jump,the target windwo is find by cursor, not the current foucus window. + height_of_titlebar = 0; # height deviation of title bar height + show_special = 0; # show windwos in special workspace in overview. + raise_float_to_top = 1; # raise the window that is floating before to top after leave overview mode + }; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/rules.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/rules.nix new file mode 100644 index 0000000..d933d5e --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/rules.nix @@ -0,0 +1,79 @@ +_: { + wayland.windowManager.hyprland = { + settings = { + # Layer Rules + layerrule = [ + "animation slide, notifications" + "noanim, selection" + "noanim, picker" + ]; + + windowrulev2 = [ + # Dialog Rules + "float, class:file_progress" + "float, class:confirm" + "float, class:dialog" + "float, class:download" + "float, class:notification" + "float, class:error" + "float, class:splash" + "float, class:confirmreset" + "float, title:Open File" + "float, title:Save File" + "float, title:branchdialog" + "float, title:^(Open File)(.*)$" + "float, title:^(Select a File)(.*)$" + "float, title:^(Choose wallpaper)(.*)$" + "float, title:^(Open Folder)(.*)$" + "float, title:^(Save As)(.*)$" + "float, title:^(Library)(.*)$" + "float, initialClass:^(xdg-desktop-portal-.*)$" + + # Control Application Rules + "float, class:^(Network)$" + "float, class:^(pavucontrol)$" + "float, class:^(Color Picker)$" + "float, class:^(File Picker)$" + "float, class:^(nm-connection-editor)$" + "float, class:pavucontrol-qt" + "float, class:pavucontrol" + "float, title:^(Media viewer)$" + "float, title:^(Volume Control)$" + "float, title:^(Picture-in-Picture)$" + "float, class:^(blueberry.py)$" + "float, class:Lxappearance" + "pseudo, class:fcitx" + "size 50% 50%, title:^(Volume Control)$" + + # Application Rules + "float, class:^(transmission-gtk)$" + "float, class:viewnior" + "float, class:feh" + "float, class:^(steam)$" + "float, class:file-roller" + "center, class:feh" + "workspace 9, initialTitle:^(Spotify Premium)$" + "tile, initialTitle:^(Photopea)$" + "tile, initialTitle:^(WorldsPlayer by Worlds Inc)$" + # "size 75% 75%, class:feh" + + # XWayland Video Bridge + "noblur, class:^(xwaylandvideobridge)$" + "noanim, class:^(xwaylandvideobridge)$" + "noinitialfocus, class:^(xwaylandvideobridge)$" + "opacity 0.0 override, class:^(xwaylandvideobridge)$" + "maxsize 1 1, class:^(xwaylandvideobridge)$" + + # Tearing + "immediate, class:.*\.exe" + "immediate, class:(steam_app)" + + # Idle Inhibit + # "idleinhibit fullscreen, class:^(*)$" + # "idleinhibit fullscreen, title:^(*)$" + "idleinhibit fullscreen, fullscreen:1" + "idleinhibit focus, class:mpv" + ]; + }; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/common.sh b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/common.sh new file mode 100644 index 0000000..25be5b6 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/common.sh @@ -0,0 +1,146 @@ +#!/usr/bin/env bash + +# . "$(dirname "$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || echo "${0}")" || true)/common.sh" +# or +# . "${HOME}/.config/hypr/hyprland/scripts/common.sh" + +get_hyprctl_monitors() { + hyprctl monitors -j || true +} + +get_hyprctl_workspaces() { + hyprctl workspaces -j || true +} + +get_focused_monitor() { + (get_hyprctl_monitors || true) | + jq -r '.[] | select(.focused) | .name' +} + +get_active_monitor() { + get_focused_monitor +} + +get_active_workspaces() { + local monitor=$1 + + (get_hyprctl_workspaces || true) | + (jq -r ".[] | select(.monitor == \"${monitor}\") | .id" || true) | + grep -v '-' +} + +get_active_workspace() { + local monitor=$1 + + (get_hyprctl_monitors || true) | + jq -r ".[] | select(.name == \"${monitor}\") | .activeWorkspace.id" +} + +get_current_workspace() { + (hyprctl activeworkspace -j || true) | + jq -r ".id" +} + +get_empty_workspace() { + local monitor=$1 + + (hyprctl workspaces -j || true) | + (jq -r ".[] | select(.monitor == \"${monitor}\" and .windows == 0) | .id" || true) | + (grep -v '-' || true) | + head -n 1 +} + +get_workspace_client_count() { + local workspace=$1 + + (hyprctl workspaces -j || true) | jq -r ".[] | select(.id == ${workspace}) | .windows" +} + +get_relative_target_workspace() { + target_workspace=$1 + workspace=0 + + case "$(get_focused_monitor)" in + "HDMI-A-2") + workspace=$((target_workspace + 10)) + ;; + "DP-2") + workspace=${target_workspace} + ;; + "DP-1") + workspace=$((target_workspace + 20)) + ;; + *) + exit 1 + ;; + esac + + echo "${workspace}" +} + +is_monitor_fullscreen() { + monitor=$1 + + (hyprctl workspaces -j || true) | + jq -r ".[] | select(.monitor == \"${monitor}\") | select(.id == $(get_active_workspace "${monitor}" || true)) | .hasfullscreen" +} + +get_relative_target_monitor() { + direction=$1 + ignore_fullscreen=${2:-0} + + case $(get_focused_monitor) in + "HDMI-A-2") + if [[ "${direction}" == "right" ]]; then + target_monitor="DP-2" + else + target_monitor="DP-1" + fi + ;; + "DP-2") + if [[ "${direction}" == "right" ]]; then + target_monitor="DP-1" + else + target_monitor="HDMI-A-2" + fi + ;; + "DP-1") + if [[ "${direction}" == "left" ]]; then + target_monitor="DP-2" + else + target_monitor="HDMI-A-2" + fi + ;; + *) + exit 1 + ;; + esac + + if [[ "$(is_monitor_fullscreen "${target_monitor}")" == "true" && "${ignore_fullscreen}" = 0 ]]; then + case $target_monitor in + "HDMI-A-2") + if [[ "$direction" == "right" ]]; then + target_monitor="DP-2" + else + target_monitor="DP-1" + fi + ;; + "DP-2") + if [[ "$direction" == "right" ]]; then + target_monitor="DP-1" + else + target_monitor="HDMI-A-2" + fi + ;; + "DP-1") + if [[ "$direction" == "left" ]]; then + target_monitor="DP-2" + else + target_monitor="HDMI-A-2" + fi + ;; + esac + fi + + echo "${target_monitor}" +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status new file mode 100755 index 0000000..e198758 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +. "${HOME}/.config/hypr/hyprland/scripts/common.sh" + +previous_id=$(cat /tmp/fake_fullscreen_notify_id 2>/dev/null) +previous_id_flag="" + +if [[ -n "${previous_id}" ]]; then + previous_id_flag="-r ${previous_id}" +fi + +id=$(notify-send -p ${previous_id_flag} "$(hyprctl activewindow -j | jq -r '.title') + +Fake fullscreen is $([[ "$(hyprctl activewindow -j | jq -r '.fakeFullscreen')" == "true" ]] && + echo "enabled" || + echo "disabled").") + +echo "${id}" >/tmp/fake_fullscreen_notify_id diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion new file mode 100755 index 0000000..ab7c3bb --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion @@ -0,0 +1,10 @@ +#!/usr/bin/env dash + +workspace_name=$(hyprctl -j activeworkspace | jq -r '.name') + +if [ "${workspace_name}" = "OVERVIEW" ]; then + hyprctl dispatch hycov:leaveoverview +else + hyprctl dispatch hycov:enteroverview + hyprctl dispatch 'easymotion action:hyprctl --batch "dispatch focuswindow address:{} ; dispatch hycov:leaveoverview"' +fi diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk new file mode 100755 index 0000000..861aa12 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk @@ -0,0 +1,19 @@ +#!/usr/bin/env dash + +THEME='WhiteSur-Dark' +ICONS='WhiteSur-dark' +FONT='SF Pro Text' +# CURSOR='WhiteSur-cursors' +CURSOR='Bibata-Modern-Ice' +CURSOR_SIZE='18' +SCHEMA='gsettings set org.gnome.desktop.interface' + +apply_themes() { + ${SCHEMA} gtk-theme "${THEME}" + ${SCHEMA} icon-theme "${ICONS}" + ${SCHEMA} cursor-theme "${CURSOR}" + ${SCHEMA} cursor-size "${CURSOR_SIZE}" + ${SCHEMA} font-name "${FONT}" +} + +apply_themes diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar new file mode 100755 index 0000000..09f7ff9 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar @@ -0,0 +1,19 @@ +#!/usr/bin/env dash + +CONFIG_FILES="${HOME}/.config/waybar/config.json ${HOME}/.config/waybar/default-modules.json ${HOME}/.config/waybar/style.css ${HOME}/.cache/wal/colors-waybar.css" + +trap "pkill -x waybar" EXIT + +\cp -r ~/.cache/wal/colors-waybar.css ~/.config/waybar/ + +while true; do + if ! pgrep -x "waybar" >/dev/null; then + waybar -c ~/.config/waybar/config.json -s ~/.config/waybar/style.css & + fi + + inotifywait -e create,modify ${CONFIG_FILES} + + pkill -x waybar + + while pgrep -x waybar >/dev/null; do sleep 0.5; done +done diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal new file mode 100755 index 0000000..10470eb --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal @@ -0,0 +1,13 @@ +#!/usr/bin/env dash + +sleep 1 + +killall -e xdg-desktop-portal-hyprland +killall -e xdg-desktop-portal-wlr +killall xdg-desktop-portal + +/usr/lib/xdg-desktop-portal-hyprland & + +sleep 2 + +/usr/lib/xdg-desktop-portal & diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor new file mode 100755 index 0000000..27562a9 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +. "${HOME}/.config/hypr/hyprland/scripts/common.sh" + +target_monitor=$(get_relative_target_monitor "$1" 1) + +if [[ -n "${target_monitor}" ]]; then + hyprctl dispatch focusmonitor "${target_monitor}" +fi diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor new file mode 100755 index 0000000..06e4f94 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +. "${HOME}/.config/hypr/hyprland/scripts/common.sh" + +target_monitor=$(get_relative_target_monitor "$1") +target_workspace=$(get_active_workspace "${target_monitor}") + +# target_workspace=$(get_empty_workspace $target_monitor) + +# if [[ -z "$target_workspace" ]]; then +# target_workspace=$(get_active_workspaces $target_monitor | head -n 1) +# fi + +if [[ -n "${target_workspace}" ]]; then + hyprctl dispatch movetoworkspace "${target_workspace}" +fi diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace new file mode 100755 index 0000000..4256a9f --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +. "${HOME}/.config/hypr/hyprland/scripts/common.sh" + +initial_active_workspace="$(get_current_workspace)" +target_workspace="$(get_relative_target_workspace "${1}")" + +hyprctl dispatch movetoworkspace "${target_workspace}" + +if [[ $(get_workspace_client_count "${target_workspace}") -gt 2 ]]; then + hyprctl dispatch workspace "${initial_active_workspace}" +fi diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/source.bak/screenshot.ab b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/source.bak/screenshot.ab new file mode 100644 index 0000000..6bc510d --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/source.bak/screenshot.ab @@ -0,0 +1,158 @@ +let current_date_time = unsafe $date +%Y-%m-%d-%H-%M-%S$ +let output_directory = "{unsafe $xdg-user-dir PICTURES$}/Screenshots" +let output_file = "Screenshot_{current_date_time}_{unsafe $echo \$RANDOM$}.png" + +fun notify_command(message: Text): Null { + unsafe $notify-send -h string:x-canonical-private-synchronous:shot-notify -u low "{message}"$ +} + +fun notify(clipboard: Bool, type: Text): Null { + notify_command("Screenshot copied to clipboard. ({type})") + + if not clipboard { + if unsafe $test -f "{output_directory}/{output_file}" && + echo 'true' || + echo 'false'$ == "true" + { + // unsafe $feh "{output_directory}/{output_file}"$ + + notify_command("Screenshot saved. ({type})") + } else { + notify_command("Screenshot deleted.") + } + } +} + +fun get_hyprctl_monitors(): Text { + return $hyprctl monitors -j || true$ failed { + notify_command("Failed to get monitors.") + + fail status + } +} + +fun get_focused_monitor(): Text { + let monitors = get_hyprctl_monitors() failed { + notify_command("Failed to get monitors.") + + fail status + } + + return $echo {monitors} | jq -r '.[] | select(.focused) | .name'$ failed { + notify_command("Failed to get focused monitor.") + + fail status + } +} + +fun screenshot_now(clipboard: Bool): Null { + if clipboard { + unsafe $(grim - || true) | wl-copy$ + } else { + unsafe $cd "{output_directory}" && + grim - | + tee "{output_file}" | + wl-copy$ + } + + notify(clipboard, "now") +} + +fun screenshot_window(clipboard: Bool): Null { + let width_position = unsafe $hyprctl activewindow | + grep 'at:' | + cut -d':' -f2 | + tr -d ' ' | + tail -n1$ + let width_size = unsafe $hyprctl activewindow | + grep 'size:' | + cut -d':' -f2 | + tr -d ' ' | + tail -n1 | + sed s/,/x/g$ + + if clipboard { + unsafe $grim -g "{width_position} {width_size}" - | wl-copy$ + } else { + unsafe $cd "{output_directory}" && + grim -g "{width_position} {width_size}" - | + tee "{output_file}" | + wl-copy$ + } + + notify(clipboard, "window") +} + +fun screenshot_monitor(clipboard: Bool): Null { + if clipboard { + unsafe $grim -o "{get_focused_monitor()}" - | wl-copy$ + } else { + unsafe $cd "{output_directory}" && + grim -o "{get_focused_monitor()}" - | + tee "{output_file}" | + wl-copy$ + } + + notify(clipboard, "monitor") +} + +fun screenshot_area(clipboard: Bool): Null { + // slurp -b 1B1F28CC -c E06B74ff -s C778DD0D -w 2 + + if clipboard { + unsafe $grim -g "{unsafe $slurp$}" - | wl-copy$ + } else { + unsafe $cd "{output_directory}" && + grim -g "{unsafe $slurp$}" - | + tee "{output_file}" | + wl-copy$ + } + + notify(clipboard, "area") +} + +fun screenshot(mode: Text, clipboard: Bool): Null { + if { + mode == "now" { + screenshot_now(clipboard) + } + mode == "window" { + screenshot_window(clipboard) + } + mode == "monitor" { + screenshot_monitor(clipboard) + } + mode == "area" { + screenshot_area(clipboard) + } + else { + echo "usage: {unsafe $echo "\${0}"$} [flags]\n" + echo "flags:" + echo " --now" + echo " --window" + echo " --area" + echo " --monitor" + echo " --clipboard" + echo " --help" + echo "" + } + } +} + +main { + if unsafe $test -d "{output_directory}" && + echo 'true' || + echo 'false'$ == "false" + { + $mkdir -p "{output_directory}"$ failed { + notify_command("Failed to create output directory.") + + fail status + } + } + + screenshot( + unsafe $echo "\${1}" | sed -E s/--//g$, + unsafe $echo "\${2}"$ == "--clipboard" + ) +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/switch_workspace b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/switch_workspace new file mode 100755 index 0000000..fc8900c --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/switch_workspace @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +. "${HOME}/.config/hypr/hyprland/scripts/common.sh" + +hyprctl dispatch workspace "$(get_relative_target_workspace "${1}")" diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps new file mode 100755 index 0000000..d593ab2 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps @@ -0,0 +1,13 @@ +#!/usr/bin/env dash + +inner_gap_size=5 +outer_gap_size=10 + +if [ "$(hyprctl getoption general:gaps_in | awk '{print $3}' || true)" -eq 0 ] && + [ "$(hyprctl getoption general:gaps_out | awk '{print $3}' || true)" -eq 0 ]; then + hyprctl keyword general:gaps_in "${inner_gap_size}" + hyprctl keyword general:gaps_out "${outer_gap_size}" +else + hyprctl keyword general:gaps_in 0 + hyprctl keyword general:gaps_out 0 +fi diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/toggle_layout b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/toggle_layout new file mode 100755 index 0000000..1ef8774 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/scripts/toggle_layout @@ -0,0 +1,22 @@ +#!/usr/bin/env dash + +layout=$(hyprctl -j getoption general:layout) +new_layout="" + +case "$(echo "${layout}" | jq -r .str)" in +dwindle) + hyprctl keyword general:layout master + + new_layout="master" + + ;; +master) + hyprctl keyword general:layout dwindle + + new_layout="dwindle" + + ;; +*) ;; +esac + +notify-send "You've changed the layout to ${new_layout}." diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/workspaces.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/workspaces.nix new file mode 100644 index 0000000..99599d3 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprland/workspaces.nix @@ -0,0 +1,45 @@ +{ config, pkgs, ... }: +{ + wayland.windowManager.hyprland.settings.workspace = + ( + let + generateWorkspaces = + monitor: workspaces: offset: + builtins.genList ( + x: + let + ws = + let + c = (x + 1) / workspaces; + in + builtins.toString (x + 1 - (c * workspaces)); + in + [ "${toString (x + offset + 1)}, monitor:${monitor}" ] + ) workspaces; + generateWorkspacesAll = + monitors: tags: + builtins.concatLists ( + builtins.map ( + monitor: + generateWorkspaces (builtins.elemAt monitors monitor) tags ( + builtins.elemAt (builtins.genList (index: index * tags) (builtins.length monitors)) monitor + ) + ) (builtins.genList (index: index) (builtins.length monitors)) + ); + in + builtins.concatLists ( + generateWorkspacesAll [ + "DP-2" + "HDMI-A-2" + "DP-1" + ] 10 + ) + ) + ++ [ + "special:simple_terminal, on-created-empty:[float;center;size 50% 65%] ${pkgs.kitty}/bin/kitty --class simple_terminal" + "special:simple_calculator, on-created-empty:[float;center;size 50% 50%] ${pkgs.kitty}/bin/kitty --class simple_calculator -e bc -lq" + "special:chatgpt, on-created-empty:[float;center;size 65% 75%] thorium --user-data-dir=${config.home.homeDirectory}/.local/share/thorium-browser-chatgpt --app='https://chatgpt.com/'" + "special:spotify, on-created-empty:[float;center;size 65% 90%] ${pkgs.spotify}/bin/spotify" + "special:calculator, on-created-empty:[float;center;size 50% 50%] ${pkgs.qalculate-gtk}/bin/qalculate-gtk" + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprlock.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprlock.nix new file mode 100644 index 0000000..51dddd9 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprlock.nix @@ -0,0 +1,102 @@ +{ pkgs, config, ... }: +let + colourScheme = builtins.fromJSON ( + builtins.readFile "${config.home.homeDirectory}/.cache/wal/colors.json" + ); + replaceHash = str: builtins.replaceStrings [ "#" ] [ "" ] str; +in +{ + programs.hyprlock = { + enable = true; + + # https://github.com/hyprwm/hyprlock/issues/128#issuecomment-2063629880 + package = pkgs.hyprlock.overrideAttrs (old: { + version = "git"; + src = pkgs.fetchFromGitHub { + owner = "hyprwm"; + repo = "hyprlock"; + rev = "2bce52f"; + sha256 = "36qa6MOhCBd39YPC0FgapwGRHZXjstw8BQuKdFzwQ4k="; + }; + patchPhase = '' + substituteInPlace src/core/hyprlock.cpp \ + --replace "5000" "16" + ''; + }); + + settings = { + general = { + disable_loading_bar = false; + hide_cursor = true; + ignore_empty_input = true; + grace = 10; + }; + + background = [ + { path = "${config.home.homeDirectory}/nixos-config/home/${config.home.username}/wallpaper.png"; } + ]; + + input-field = [ + { + # Size & Position + size = "500, 75"; + position = "0, 0"; + + # Other + fade_on_empty = true; + dots_size = 0.2; + dots_spacing = 0.5; + outline_thickness = 3; + placeholder_text = ""; + fail_text = ""; + + # Colour + outer_color = "rgb(1D2433)"; # bg + inner_color = "rgb(1D2433)"; # bg + font_color = "rgb(BDD9F2)"; # fg + check_color = "rgb(9BB8F2)"; # blue + fail_color = "rgb(D67C8E)"; # red + capslock_color = "rgb(D6A37C)"; # orange + + # Shadow + shadow_passes = 1; + shadow_size = 8; + shadow_boost = 0.6; + } + ]; + + label = [ + { + # Text + text = "cmd[update:60000] LC_ALL='ja_JP.utf8' TZ=America/Los_Angeles date '+%H時%M分'"; + position = "75, -75"; + color = "rgba(9BB8F290)"; # blue + + # Font + font_size = 120; + font_family = "SF Pro, Hiragino Sans"; + + # Shadow + shadow_passes = 1; + shadow_size = 6; + shadow_boost = 0.75; + } + { + # Text + text = "cmd[update:60000] LC_ALL='ja_JP.utf8' TZ=America/Los_Angeles date '+%b%-e日(%a)'"; + position = "75, 0"; + color = "rgba(9BB8F270)"; # blue + + # Font + font_size = 40; + font_family = "SF Pro, Hiragino Sans"; + + # Shadow + shadow_passes = 1; + shadow_size = 4; + shadow_boost = 0.9; + } + ]; + }; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/hyprpaper.nix b/home/ebisu/fortune/desktop/wayland/hyprland/hyprpaper.nix new file mode 100644 index 0000000..ce6c79a --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/hyprpaper.nix @@ -0,0 +1,12 @@ +{ + services.hyprpaper = { + enable = true; + + settings = { + preload = "~/Pictures/wallpaper.png"; + wallpaper = ",~/Pictures/wallpaper.png"; + splash = false; + ipc = true; + }; + }; +} diff --git a/home/ebisu/fortune/desktop/wayland/hyprland/inspo.txt b/home/ebisu/fortune/desktop/wayland/hyprland/inspo.txt new file mode 100644 index 0000000..39d2483 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/hyprland/inspo.txt @@ -0,0 +1,4 @@ +https://github.com/codingjerk/dotfiles/blob/main/config/hypr/hyprland.conf +https://github.com/JoshM-Yoru/dotfiles/blob/main/hypr/hyprland.conf +https://github.com/end-4/dots-hyprland/blob/main/.config/hypr/hyprland.conf +https://github.com/Andy3153/hyprland-rice
\ No newline at end of file diff --git a/home/ebisu/fortune/desktop/wayland/mako.nix b/home/ebisu/fortune/desktop/wayland/mako.nix new file mode 100644 index 0000000..4ec2a09 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/mako.nix @@ -0,0 +1,59 @@ +{ pkgs, config, ... }: +let + colourScheme = builtins.fromJSON ( + builtins.readFile "${config.home.homeDirectory}/.cache/wal/colors.json" + ); +in +{ + services.mako.enable = true; + + xdg.configFile."mako/config".text = '' + font=SF Mono 11 + + layer=overlay + + anchor=top-right + width=330 + padding=10 + margin=10 + border-radius=10 + outer-margin=0 + + default-timeout=5000 + max-history=0 + ignore-timeout=1 + + format=%s\n%b + + icons=1 + # max-icon-size=32 + + max-visible=-1 + + border-color=#00000040 + border-size=1 + + background-color=${colourScheme.colors.color0} + text-color=${colourScheme.colors.color15} + + # [urgency=low] + # border-color=${colourScheme.colors.color2} + # background-color=${colourScheme.colors.color4} + # text-color=${colourScheme.colors.color6} + + # [urgency=normal] + # border-color=${colourScheme.colors.color1} + # background-color=${colourScheme.colors.color3} + # text-color=${colourScheme.colors.color5} + # default-timeout=10000 + # ignore-timeout=1 + + # [urgency=high] + # font=Sauce Code Pro 16 + # border-color=${colourScheme.colors.color1} + # background-color=${colourScheme.colors.color2} + # text-color=${colourScheme.colors.color6} + # default-timeout=0 + # ignore-timeout=1 + ''; +} diff --git a/home/ebisu/fortune/desktop/wayland/screenshot.nix b/home/ebisu/fortune/desktop/wayland/screenshot.nix new file mode 100644 index 0000000..5900ee2 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/screenshot.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ + grim + slurp + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/default.nix b/home/ebisu/fortune/desktop/wayland/waybar/default.nix new file mode 100644 index 0000000..698ebb3 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/default.nix @@ -0,0 +1,96 @@ +{ pkgs, ... }: +{ + programs.waybar = { + enable = true; + style = ./waybar/style.css; + + settings = ( + let + defaultModules = (import ./waybar/default-modules.nix { inherit pkgs; }); + hyprland-workspaces-base = { + disable-scroll = true; + disable-markup = false; + all-outputs = false; + format = "{icon}"; + }; + in + [ + ( + defaultModules + // { + output = "HDMI-A-2"; + "hyprland/workspaces" = hyprland-workspaces-base // { + format-icons = { + "11" = "一"; + "12" = "二"; + "13" = "三"; + "14" = "四"; + "15" = "五"; + "16" = "六"; + "17" = "七"; + "18" = "八"; + "19" = "九"; + "20" = "十"; + }; + }; + } + ) + ( + defaultModules + // { + output = "DP-2"; + "hyprland/workspaces" = hyprland-workspaces-base // { + format-icons = { + "1" = "一"; + "2" = "二"; + "3" = "三"; + "4" = "四"; + "5" = "五"; + "6" = "六"; + "7" = "七"; + "8" = "八"; + "9" = "九"; + "10" = "十"; + }; + }; + } + ) + ( + defaultModules + // { + output = "DP-1"; + "hyprland/workspaces" = hyprland-workspaces-base // { + format-icons = { + "21" = "一"; + "22" = "二"; + "23" = "三"; + "24" = "四"; + "25" = "五"; + "26" = "六"; + "27" = "七"; + "28" = "八"; + "29" = "九"; + "30" = "十"; + }; + }; + } + ) + ] + ); + }; + + xdg.configFile = ( + let + scripts = [ "mediaplayer.py" ]; + in + (builtins.listToAttrs ( + map (script: { + name = "waybar/scripts/${script}"; + + value = { + source = ./waybar/scripts/${script}; + }; + }) scripts + )) + ); +} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/default-modules.nix b/home/ebisu/fortune/desktop/wayland/waybar/waybar/default-modules.nix new file mode 100644 index 0000000..07d741d --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/waybar/default-modules.nix @@ -0,0 +1,231 @@ +{ pkgs, ... }: +let + python-shell = pkgs.mkShell { + packages = [ + (pkgs.python3.withPackages (python-pkgs: [ python-pkgs.pygobject3 ])) + pkgs.playerctl + pkgs.gobject-introspection + ]; + }; +in +{ + layer = "top"; + position = "top"; + margin-left = 8; + margin-right = 8; + height = 40; + + bluetooth = { + format = ""; + on-click = "${pkgs.blueberry}/bin/blueberry"; + }; + + clock = { + locale = "ja_JP.utf8"; + interval = 5; + tooltip-format = "<tt><small>{calendar}</small></tt>"; + # format = "{:%m月 %d日 %H:%M:%S}"; + format = "{:L%m月 %d日 %H:%M}"; + format-alt = "{:L%G年%b %d日 %A}"; + }; + + # For when clock doesn't work + "custom/clock" = { + exec = "date '+%m月 %d日 %H:%M'"; + tooltip = false; + interval = 5; + }; + + cpu = { + interval = 5; + format = " {usage}% ({load})"; + + states = { + warning = 70; + critical = 90; + }; + + on-click = "${pkgs.kitty}/bin/kitty -e '${pkgs.bottom}/bin/btm'"; + }; + + memory = { + interval = 5; + format = " {}%"; + format-alt = " {used:0.1f}/{total:0.1f}ギガ"; + + # I might remove these. I have 64GB of RAM .... + states = { + warning = 70; + critical = 90; + }; + }; + + network = { + interval = 1; + # format-wifi = " {bandwidthUpBytes} {bandwidthDownBytes}", + # format-ethernet = " {bandwidthUpBytes} {bandwidthDownBytes}", + format = " {bandwidthUpBytes} {bandwidthDownBytes}"; + format-disconnected = "⚠ Disconnected"; + tooltip-format = "{ifname}: {ipaddr}"; + on-click = "${pkgs.kitty}/bin/kitty -e 'nmtui'"; + }; + + "hyprland/mode" = { + format = "{}"; + tooltip = false; + }; + + "hyprland/window" = { + format = "{}"; + max-length = 120; + separate-outputs = true; + icon = false; + + rewrite = { + "(.*) - Thorium" = " $1"; + "(.*) - NVIM" = " $1"; + "ChatGPT" = " ChatGPT"; + "~(.*)" = " ~$1"; + "…(.*)" = " …$1"; + "zsh" = " ~"; + "fish" = " ~"; + "kitty" = " ~"; + "Volume Control" = " Volume Control"; + "Bluetooth" = " Bluetooth"; + "JamesDSP for Linux" = " JamesDSP"; + }; + }; + + pulseaudio = { + scroll-step = 1; + format = "{icon} {volume}%"; + # format-bluetooth = "{volume}% {icon} {format_source}"; + # format-bluetooth-muted = " {icon} {format_source}"; + format-muted = ""; + + format-icons = { + headphone = ""; + hands-free = "וֹ"; + headset = ""; + phone = ""; + portable = ""; + car = ""; + + default = [ "" ]; + }; + + on-click = "pactl set-sink-mute @DEFAULT_SINK@ toggle"; + on-click-right = "${pkgs.pavucontrol}/bin/pavucontrol"; + on-scroll-up = "pactl set-sink-volume @DEFAULT_SINK@ +2%"; + on-scroll-down = "pactl set-sink-volume @DEFAULT_SINK@ -2%"; + }; + + tray = { + spacing = 10; + show-passive-items = true; + }; + + "image#album-art" = { + path = "/tmp/mediaplayer_art"; + size = 22.5; # (18 + (18 / 4)) + interval = 5; + on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; + }; + + "custom/media" = { + format = "{icon} {}"; + return-type = "json"; + max-length = 40; + + format-icons = { + spotify = " "; + default = " "; + }; + + escape = true; + exec = "${python-shell}/bin/python3 ~/.config/waybar/scripts/mediaplayer.py 2> /dev/null"; + on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; + on-scroll-up = "${pkgs.playerctl}/bin/playerctl next"; + on-scroll-down = "${pkgs.playerctl}/bin/playerctl previous"; + }; + + cava = { + framerate = 280; + autosens = 1; + sensitivity = 3; + bars = 26; + lower_cutoff_freq = 50; + higher_cutoff_freq = 10000; + method = "pipewire"; + source = "auto"; + stereo = true; + reverse = true; + bar_delimiter = 0; + monstercat = false; + waves = false; + hide_on_silence = true; + noise_reduction = 0.77; + input_delay = 0; + on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; + + # actions = { + # on-click-right = "mode"; + # }; + + # format-icons = ["░", "▒", "▓", "█", "█", "█", "█", "█"] + # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎼", "⎻", "⎺", "⎹"] + # format-icons = ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"] + format-icons = [ + "⠁" + "⠃" + "⠇" + "⠋" + "⠛" + "⠟" + "⠿" + "⣿" + ]; + # format-icons = ["◰", "◳", "◲", "◱", "▘", "▝", "▖", "▗"] + # format-icons = ["▖", "▗", "▘", "▝", "▚", "▞", "▛", "▟"] + # format-icons = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊"] + # format-icons = ["⎯", "⎰", "⎱", "⎲", "⎳", "⎴", "⎵", "⎶"] + # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎾", "⎿", "⏀", "⏁"] + # format-icons = ["♪", "♫", "♬", "♭", "♮", "♯", "♩", "♪"] + # format-icons = ["→", "⇉", "⇒", "⇉", "→", "⇉", "⇒", "⇉"] + # format-icons = ["·", ":", "⁙", "⁘", "⁙", ":", "·", "•"] + # format-icons = ["○", "◔", "◑", "◕", "●", "◍", "◎", "◉"] + # format-icons = ["△", "▲", "▴", "▸", "▶", "▹", "►", "▻"] + # format-icons = ["◇", "◈", "◉", "◍", "◎", "◯", "⦿", "◑"] + # format-icons = ["-", "–", "—", "––", "–––", "——", "———", "——––"] + # format-icons = ["-", "=", "≡", "≣", "≠", "≢", "≜", "≝"] + # format-icons = ["✓", "✔", "✕", "✖", "✗", "✘", "✙", "✚"] + # format-icons = ["✩", "✪", "✫", "✬", "✭", "✮", "✯", "✰"] + }; + + "custom/gpu" = { + exec = "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader | sed 's/ %/%/'"; + interval = 5; + format = " {}"; + on-click = "${pkgs.kitty}/bin/kitty -e '${pkgs.nvtopPackages.nvidia}/bin/nvtop'"; + }; + + modules-left = [ + "hyprland/workspaces" + "hyprland/window" + "custom/media" + "image#album-art" + ]; + + modules-center = [ "clock" ]; + + modules-right = [ + # "cava" + # "network" + "tray" + "cpu" + "custom/gpu" + "memory" + "bluetooth" + "pulseaudio" + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py b/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py new file mode 100755 index 0000000..c44ee0b --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 + +import argparse +import logging +import os +import sys +import signal +import gi +import json + +gi.require_version("Playerctl", "2.0") + +from gi.repository import Playerctl, GLib + +logger = logging.getLogger(__name__) + + +def write_output(text, player): + logger.info("Writing output") + + output = { + "text": text, + "class": "custom-" + player.props.player_name, + "alt": player.props.player_name, + "art": player.props.metadata["mpris:artUrl"], + } + + sys.stdout.write(json.dumps(output) + "\n") + sys.stdout.flush() + + +def on_play(player, status, manager): + logger.info("Received new playback status") + on_metadata(player, player.props.metadata, manager) + + +def on_metadata(player, metadata, manager): + logger.info("Received new metadata") + + track_info = "" + + if ( + player.props.player_name == "spotify" + and "mpris:trackid" in metadata.keys() + and ":ad:" in player.props.metadata["mpris:trackid"] + ): + track_info = "AD PLAYING" + elif player.get_artist() != "" and player.get_title() != "": + track_info = "{title} - {artist}".format( + artist=player.get_artist(), title=player.get_title() + ) + else: + track_info = player.get_title() + + if "file://" in player.props.metadata["mpris:artUrl"]: + os.system( + f"cp $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') /tmp/mediaplayer_art" + ) + else: + os.system( + f"curl --silent $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') --output /tmp/mediaplayer_art" + ) + + # if player.props.status != 'Playing' and track_info: + # track_info = ' ' + track_info + + write_output(track_info, player) + + +def on_player_appeared(manager, player, selected_player=None): + if player is not None and ( + selected_player is None or player.name == selected_player + ): + init_player(manager, player) + else: + logger.debug("New player appeared, but it's not the selected player, skipping") + + +def on_player_vanished(manager, player): + logger.info("Player has vanished") + sys.stdout.write("\n") + sys.stdout.flush() + os.system("rm /tmp/mediaplayer_art") + + +def init_player(manager, name): + logger.debug("Initialize player: {player}".format(player=name.name)) + + player = Playerctl.Player.new_from_name(name) + + player.connect("playback-status", on_play, manager) + player.connect("metadata", on_metadata, manager) + manager.manage_player(player) + on_metadata(player, player.props.metadata, manager) + + +def signal_handler(sig, frame): + logger.debug("Received signal to stop, exiting") + sys.stdout.write("\n") + sys.stdout.flush() + # loop.quit() + sys.exit(0) + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + parser.add_argument("-v", "--verbose", action="count", default=0) + parser.add_argument("--player") + + return parser.parse_args() + + +def main(): + arguments = parse_arguments() + logging.basicConfig( + stream=sys.stderr, + level=logging.DEBUG, + format="%(name)s %(levelname)s %(message)s", + ) + + logger.setLevel(max((3 - arguments.verbose) * 10, 0)) + logger.debug("Arguments received {}".format(vars(arguments))) + + manager = Playerctl.PlayerManager() + loop = GLib.MainLoop() + + manager.connect( + "name-appeared", lambda *args: on_player_appeared(*args, arguments.player) + ) + manager.connect("player-vanished", on_player_vanished) + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + + for player in manager.props.player_names: + if arguments.player is not None and arguments.player != player.name: + logger.debug( + "{player} is not the filtered player, skipping it".format( + player=player.name + ) + ) + + continue + + init_player(manager, player) + + loop.run() + + +if __name__ == "__main__": + main() diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py.bak b/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py.bak new file mode 100755 index 0000000..1630d97 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py.bak @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +import argparse +import logging +import sys +import signal +import gi +import json +gi.require_version('Playerctl', '2.0') +from gi.repository import Playerctl, GLib + +logger = logging.getLogger(__name__) + + +def write_output(text, player): + logger.info('Writing output') + + output = {'text': text, + 'class': 'custom-' + player.props.player_name, + 'alt': player.props.player_name} + + sys.stdout.write(json.dumps(output) + '\n') + sys.stdout.flush() + + +def on_play(player, status, manager): + logger.info('Received new playback status') + on_metadata(player, player.props.metadata, manager) + + +def on_metadata(player, metadata, manager): + logger.info('Received new metadata') + track_info = '' + + if player.props.player_name == 'spotify' and \ + 'mpris:trackid' in metadata.keys() and \ + ':ad:' in player.props.metadata['mpris:trackid']: + track_info = 'AD PLAYING' + elif player.get_artist() != '' and player.get_title() != '': + track_info = '{artist} - {title}'.format(artist=player.get_artist(), + title=player.get_title()) + else: + track_info = player.get_title() + + if player.props.status != 'Playing' and track_info: + track_info = ' ' + track_info + write_output(track_info, player) + + +def on_player_appeared(manager, player, selected_player=None): + if player is not None and (selected_player is None or player.name == selected_player): + init_player(manager, player) + else: + logger.debug("New player appeared, but it's not the selected player, skipping") + + +def on_player_vanished(manager, player): + logger.info('Player has vanished') + sys.stdout.write('\n') + sys.stdout.flush() + + +def init_player(manager, name): + logger.debug('Initialize player: {player}'.format(player=name.name)) + player = Playerctl.Player.new_from_name(name) + player.connect('playback-status', on_play, manager) + player.connect('metadata', on_metadata, manager) + manager.manage_player(player) + on_metadata(player, player.props.metadata, manager) + + +def signal_handler(sig, frame): + logger.debug('Received signal to stop, exiting') + sys.stdout.write('\n') + sys.stdout.flush() + # loop.quit() + sys.exit(0) + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + # Increase verbosity with every occurrence of -v + parser.add_argument('-v', '--verbose', action='count', default=0) + + # Define for which player we're listening + parser.add_argument('--player') + + return parser.parse_args() + + +def main(): + arguments = parse_arguments() + + # Initialize logging + logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, + format='%(name)s %(levelname)s %(message)s') + + # Logging is set by default to WARN and higher. + # With every occurrence of -v it's lowered by one + logger.setLevel(max((3 - arguments.verbose) * 10, 0)) + + # Log the sent command line arguments + logger.debug('Arguments received {}'.format(vars(arguments))) + + manager = Playerctl.PlayerManager() + loop = GLib.MainLoop() + + manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player)) + manager.connect('player-vanished', on_player_vanished) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + + for player in manager.props.player_names: + if arguments.player is not None and arguments.player != player.name: + logger.debug('{player} is not the filtered player, skipping it' + .format(player=player.name) + ) + continue + + init_player(manager, player) + + loop.run() + + +if __name__ == '__main__': + main() diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css b/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css new file mode 100644 index 0000000..121c792 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css @@ -0,0 +1,134 @@ +@import "/home/ebisu/.cache/wal/colors-waybar.css"; + +* { + /* font-family: CartographCF Nerd Font, Iosevka Nerd Font, cursive; */ + /* font-family: Noto Sans Mono, Sarasa Mono J, cursive; */ + /* font-family: SF Mono, cursive; */ + /* font-family: MesloLGS NF; */ + font-family: SF Pro, Hiragino Sans, cursive; + font-size: 15px; +} + +window#waybar { + background-color: rgba(0, 0, 0, 0); + color: @foreground; + /* -gtk-icon-shadow: */ + /* -1px 0 #ffffff, */ + /* 0 1px #ffffff, */ + /* 1px 0 #ffffff, */ + /* 0 -1px #ffffff; */ +} + +#battery, +#cava, +#custom-know, +#clock, +#custom-clock, +#backlight, +#cpu, +#custom-keyboard-layout, +#memory, +#mode, +#custom-weather, +#network, +#pulseaudio, +#temperature, +#tray, +#idle_inhibitor, +#window, +#bluetooth, +#custom-power, +#workspaces, +#custom-media, +#custom-gpu, +#custom-PBPbattery { + /* padding: 0.25rem 0.75rem; */ + /* margin: 10px 5px 0px 0; */ + padding: 5px 15px; + margin: 10px 1rem 0px 0; + background-color: @background; + border-radius: 10px; /* 9 */ + color: @foreground; +} + +#image { + margin-top: 10px; + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; + background-color: @background; + margin-right: 1rem; + padding-right: 1rem; +} + +#image > * { + border-radius: 10px; +} + +#image.empty { + background-color: transparent; + min-width: 0; + min-height: 0; + margin: 0; + padding: 0; +} + +window#waybar #custom-media { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + padding-right: 1rem; + margin-right: 0; +} + +window#waybar.empty #window { + background-color: transparent; + padding: 0; + margin: 0; +} + +window#custom-media.empty #window { + background-color: transparent; +} + +#workspaces button.active { + color: @color11; +} + +#workspaces button:hover { + background-color: unset; +} + +#pulseaudio { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: 0; + padding-left: 0.5rem; +} + +#bluetooth { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: 0; + padding-right: 0.5rem; +} + +#memory { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: 0; + padding-left: 0.5rem; +} + +#custom-gpu { + border-radius: 0; + margin-right: 0; + margin-left: 0; + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +#cpu { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: 0; + padding-right: 0.5rem; +} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css.bak b/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css.bak new file mode 100644 index 0000000..3858c71 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css.bak @@ -0,0 +1,221 @@ +@import "colors-waybar.css"; + +* { + font-family: CartographCF Nerd Font, Iosevka Nerd Font, cursive; + font-size: 14px; +} + +window#waybar { + background-color: rgba(0, 0, 0, 0); + color: @foreground; + transition-property: background-color; + transition-duration: 0.5s; +} + +window#waybar.hidden { + opacity: 0.1; +} + +#window { + color: @foreground; +} + +#clock, +#cpu, +#memory, +#custom-media, +#tray, +#mode, +#workspaces, +#battery, +#idle_inhibitor, +#window, +#custom-power-menu, +#custom-wallpaper, +#custom-launcher, +#custom-spotify, +#custom-weather, +#custom-theme, +#custom-weather.severe, +#custom-weather.sunnyDay, +#custom-weather.clearNight, +#custom-weather.cloudyFoggyDay, +#custom-weather.cloudyFoggyNight, +#custom-weather.rainyDay, +#custom-weather.rainyNight, +#custom-weather.showyIcyDay, +#custom-weather.snowyIcyNight, +#custom-weather.default { + color: @foreground; + padding: 2px 10px; + background-color: @background; + border-radius: 8px; + margin: 6px 3px 0; +} + +#window { + color: @color8; +} + +#custom-launcher { + color: @color9; + padding: 0 20px 0 20px; + margin-left: 8px; +} + +#cpu { + /* color: @color10; */ + color: @foreground; +} + +#memory { + /* color: @color11; */ + color: @foreground; +} + +#workspaces {} + +#workspaces button { + color: @color10; + box-shadow: inset 0 -3px transparent; + margin-right: 0em; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); +} + +#workspaces button.active { + color: @foreground; + margin-right: 0em; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); +} + +/* If workspaces is the leftmost module, omit left margin */ +.modules-left>widget:first-child>#workspaces { + margin-left: 0; +} + +/* If workspaces is the rightmost module, omit right margin */ +.modules-right>widget:last-child>#workspaces { + margin-right: 0; +} + +#tray {} + +#tray>.passive { + -gtk-icon-effect: dim; +} + +#tray>.needs-attention { + -gtk-icon-effect: highlight; + background-color: #eb4d4b; +} + +#custom-spotify { + /* color: @color10; */ + color: @color8; +} + +#custom-wallpaper { + padding: 0 18px 0 12px; + color: @color14; +} + +#custom-theme { + padding: 0 18px 0 12px; + color: @color13; +} + +#bluetooth, +#backlight, +#pulseaudio, +#network { + color: @color5; + background-color: @background; + padding: 0 12px; + margin: 6px 0 0; +} + +#bluetooth { + border-radius: 8px 0px 0px 8px; + /* color: @color11; */ + margin-left: 3px; + border-right: none; +} + +#network { + color: @color13; + padding-right: 14px; + border-right: none; + border-left: none; +} + +#network.disconnected { + color: @color11; +} + +#pulseaudio { + /* color: @color10; */ + border-left: none; + /* border-right: none; */ + border-radius: 0 8px 8px 0; + padding-right: 12px; +} + +#pulseaudio.muted { + color: @color11; +} + +#backlight { + margin-right: 3px; + padding-right: 8px; + color: @color13; + border-radius: 0 8px 8px 0; + border-left: none; +} + +#battery { + color: @color9; + border-radius: 8px; + padding: 0 12px; +} + +#battery.critical, +#battery.warning, +#battery.full, +#battery.plugged { + color: @color15; +} + +#clock { + color: @foreground; + margin-left: 6px; +} + +#custom-power-menu { + color: @color10; + margin-right: 8px; + padding: 0 12px 0 10px; +} + +@keyframes blink { + to { + background-color: rgba(30, 34, 42, 0.5); + color: #abb2bf; + } +} + +tooltip { + border-radius: 15px; + padding: 15px; + background-color: @background; + color: @foreground; + font-family: CartographCF Nerd Font; +} + +tooltip label { + padding: 5px; + color: @foreground; +} + +label:focus { + background-color: @background; +} diff --git a/home/ebisu/fortune/desktop/wayland/wlogout.nix b/home/ebisu/fortune/desktop/wayland/wlogout.nix new file mode 100644 index 0000000..5e20380 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/wlogout.nix @@ -0,0 +1,114 @@ +{ pkgs, config, ... }: +{ + home.packages = with pkgs; [ wlogout ]; + + xdg.configFile = { + "wlogout/layout".text = '' + { + "label" : "lock", + "action" : "hyprlock", + "text" : "鍵をかける", + "keybind" : "l" + } + { + "label" : "hibernate", + "action" : "hyprctl dispatch dpms off", + "text" : "ハイブネート", + "keybind" : "h" + } + { + "label" : "logout", + "action" : "hyprctl dispatch exit", + "text" : "WMを出る", + "keybind" : "e" + } + { + "label" : "shutdown", + "action" : "doas systemctl poweroff -i", + "text" : "シャットダウン", + "keybind" : "s" + } + { + "label" : "suspend", + "action" : "doas systemctl suspend -i && hyprlock", + "text" : "寝", + "keybind" : "u" + } + { + "label" : "reboot", + "action" : "doas systemctl reboot -i", + "text" : "再起動", + "keybind" : "r" + } + ''; + + "wlogout/style.css".text = '' + @import "/home/${config.home.username}/.cache/wal/colors-waybar.css"; + + * { + background-image: none; + box-shadow: none; + } + + window { + background-color: rgba(0, 0, 0, 0.5); + } + + button { + opacity: 0.95; + border-radius: 10px; + border-color: black; + text-decoration-color: @foreground; + color: @foreground; + background-color: @background; + border-style: none; + background-repeat: no-repeat; + background-position: center; + background-size: 25%; + margin: 5px; + } + + button:focus, + button:active, + button:hover { + background-color: @color11; + } + + #lock { + background-image: image( + url("/home/${config.home.username}/.nix-profile/share/wlogout/icons/lock.png") + ); + } + + #logout { + background-image: image( + url("/home/${config.home.username}/.nix-profile/share/wlogout/icons/logout.png") + ); + } + + #suspend { + background-image: image( + url("/home/${config.home.username}/.nix-profile/share/wlogout/icons/suspend.png") + ); + } + + #hibernate { + background-image: image( + url("/home/${config.home.username}/.nix-profile/share/wlogout/icons/hibernate.png") + ); + } + + #shutdown { + background-image: image( + url("/home/${config.home.username}/.nix-profile/share/wlogout/icons/shutdown.png") + ); + } + + #reboot { + background-image: image( + url("/home/${config.home.username}/.nix-profile/share/wlogout/icons/reboot.png") + ); + } + ''; + }; +} diff --git a/home/ebisu/fortune/desktop/xorg/default.nix b/home/ebisu/fortune/desktop/xorg/default.nix new file mode 100644 index 0000000..801a736 --- /dev/null +++ b/home/ebisu/fortune/desktop/xorg/default.nix @@ -0,0 +1,17 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ + gifsicle + main + unclutter + xcape + xcolor + xclip + xsel + # xrootgif + xwallpaper + xbanish + xdotool + clipnotify + sxhkd + ]; +} |