From 505e6dc583372579414023dbf6a2636385a34100 Mon Sep 17 00:00:00 2001 From: Myned Date: Wed, 11 Sep 2024 18:16:44 -0500 Subject: [PATCH] hyprland: refactor binds and rules Signed-off-by: Myned --- options/custom/desktops/hyprland/binds.nix | 357 +++++++++--------- options/custom/desktops/hyprland/rules.nix | 397 +++++++++------------ 2 files changed, 341 insertions(+), 413 deletions(-) diff --git a/options/custom/desktops/hyprland/binds.nix b/options/custom/desktops/hyprland/binds.nix index f788cab..4cf3040 100644 --- a/options/custom/desktops/hyprland/binds.nix +++ b/options/custom/desktops/hyprland/binds.nix @@ -5,27 +5,17 @@ pkgs, ... }: - -with lib; - -let +with lib; let clipse = "${pkgs.clipse}/bin/clipse"; - codium = "${ - config.home-manager.users.${config.custom.username}.programs.vscode.package - }/bin/codium"; - firefox-esr = "${ - config.home-manager.users.${config.custom.username}.programs.firefox.finalPackage - }/bin/firefox-esr"; + codium = "${config.home-manager.users.${config.custom.username}.programs.vscode.package}/bin/codium"; + firefox-esr = "${config.home-manager.users.${config.custom.username}.programs.firefox.finalPackage}/bin/firefox-esr"; gnome-text-editor = "${pkgs.gnome-text-editor}/bin/gnome-text-editor"; hyprctl = "${pkgs.hyprland}/bin/hyprctl"; - hyprlock = "${ - config.home-manager.users.${config.custom.username}.programs.hyprlock.package - }/bin/hyprlock"; + hyprlock = "${config.home-manager.users.${config.custom.username}.programs.hyprlock.package}/bin/hyprlock"; hyprpicker = "${pkgs.hyprpicker}/bin/hyprpicker"; jq = "${pkgs.jq}/bin/jq"; kill = "${pkgs.procps}/bin/kill"; kitty = "${config.home-manager.users.${config.custom.username}.programs.kitty.package}/bin/kitty"; - libreoffice = "${config.custom.programs.libreoffice.package}/bin/libreoffice"; loginctl = "${pkgs.systemd}/bin/loginctl"; nautilus = "${pkgs.nautilus}/bin/nautilus"; networkmanager_dmenu = "${pkgs.networkmanager_dmenu}/bin/networkmanager_dmenu"; @@ -35,6 +25,7 @@ let playerctl = "${pkgs.playerctl}/bin/playerctl"; rofi-rbw = "${pkgs.rofi-rbw}/bin/rofi-rbw"; sleep = "${pkgs.coreutils}/bin/sleep"; + steam = "${config.programs.steam.package}/bin/steam"; swayosd-client = "${pkgs.swayosd}/bin/swayosd-client"; systemctl = "${pkgs.systemd}/bin/systemctl"; virt-manager = "${config.programs.virt-manager.package}/bin/virt-manager"; @@ -42,214 +33,206 @@ let wofi = "${config.home-manager.users.${config.custom.username}.programs.wofi.package}/bin/wofi"; cfg = config.custom.desktops.hyprland.binds; -in -{ - options.custom.desktops.hyprland.binds.enable = mkOption { default = false; }; +in { + options.custom.desktops.hyprland.binds.enable = mkOption {default = false;}; config.home-manager.users.${config.custom.username} = mkIf cfg.enable { - wayland.windowManager.hyprland.settings = { + wayland.windowManager.hyprland.settings = let + # Reverse mods and key for alphabetical sorting + #?? key <"KEY"> <"MODS"|null> <"DISPATCHER"> <"PARAMS"|null> + key = key: mods: dispatcher: params: "${ + if (isNull mods) + then "" + else mods + }, ${key}, ${dispatcher}${ + if (isNull params) + then "" + else ", ${params}" + }"; + in { # https://wiki.hyprland.org/Configuring/Binds #?? bind = MODS, KEY, DISPATCHER, [PARAMS] #?? wev - binds = { - allow_workspace_cycles = true; - disable_keybind_grabbing = true; - scroll_event_delay = 0; - }; # Lockscreen binds bindl = [ - ### System - "CTRL, Delete, exec, ${hyprctl} reload" - "CTRL+ALT, Delete, exec, ${loginctl} terminate-session ''" - "SUPER, L, exec, ${hyprlock} --immediate & ${sleep} 1 && ${hyprctl} dispatch dpms off" + (key "Delete" "Ctrl" "exec" "${hyprctl} reload") + (key "Delete" "Ctrl+Alt" "exec" "${loginctl} terminate-session ''") + (key "Delete" "Super" "exec" "inhibit") + (key "L" "Super" "exec" "${hyprlock} --immediate & ${sleep} 1 && ${hyprctl} dispatch dpms off") # Laptop lid switches # https://wiki.hyprland.org/Configuring/Binds/#switches #?? hyprctl devices - ", switch:on:Lid Switch, dpms, off" # Close - ", switch:off:Lid Switch, dpms, on" # Open - - ### Scripts - "SUPER, Delete, exec, inhibit" + (key "switch:off:Lid Switch" null "dpms" "on") # Open + (key "switch:on:Lid Switch" null "dpms" "off") # Close ]; # Mouse binds bindm = [ - "SUPER, mouse:272, movewindow" # LMB - "SUPER, mouse:273, resizewindow" # RMB + (key "mouse:272" "Super" "movewindow" null) # LMB + (key "mouse:273" "Super" "resizewindow" null) # RMB ]; # Repeat binds binde = [ # Media keys # https://github.com/xkbcommon/libxkbcommon/blob/master/include/xkbcommon/xkbcommon-keysyms.h - ", XF86AudioMute, exec, ${swayosd-client} --output-volume mute-toggle" - ", XF86AudioLowerVolume, exec, ${swayosd-client} --output-volume lower" - ", XF86AudioRaiseVolume, exec, ${swayosd-client} --output-volume raise" - ", XF86AudioPlay, exec, ${playerctl} play-pause" - ", XF86AudioPrev, exec, ${playerctl} previous" - ", XF86AudioNext, exec, ${playerctl} next" - ", XF86MonBrightnessDown, exec, ${swayosd-client} --brightness lower" - ", XF86MonBrightnessUp, exec, ${swayosd-client} --brightness raise" - - # TODO: Unused media key - #// ", XF86AudioMedia, exec, null" + (key "XF86AudioMute" null "exec" "${swayosd-client} --output-volume mute-toggle") # F1 + (key "XF86AudioLowerVolume" null "exec" "${swayosd-client} --output-volume lower") # F2 + (key "XF86AudioRaiseVolume" null "exec" "${swayosd-client} --output-volume raise") # F3 + (key "XF86AudioPrev" null "exec" "${playerctl} previous") # F4 + (key "XF86AudioPlay" null "exec" "${playerctl} play-pause") # F5 + (key "XF86AudioNext" null "exec" "${playerctl} next") # F6 + (key "XF86MonBrightnessDown" null "exec" "${swayosd-client} --brightness lower") # F7 + (key "XF86MonBrightnessUp" null "exec" "${swayosd-client} --brightness raise") # F8 + (key "XF86AudioMedia" null "exec" "${notify-send} test") # F12 ]; # Release binds bindr = [ - ### Layouts - "SUPER+CTRL, Control_L, layoutmsg, swapwithmaster master" - "SUPER+SHIFT+CTRL, Control_L, layoutmsg, addmaster" - "SUPER+SHIFT+CTRL+ALT, Control_L, layoutmsg, removemaster" - - ### Workspaces - "SUPER+SHIFT, Shift_L, workspace, previous" - - # Special workspaces - "SUPER, Super_L, togglespecialworkspace, scratchpad" - "SUPER+SHIFT, Super_L, movetoworkspacesilent, special:scratchpad" - "SUPER+ALT, Alt_L, togglespecialworkspace, wallpaper" + (key "Alt_L" "Super+Alt" "togglespecialworkspace" "wallpaper") + (key "Control_L" "Super+Ctrl" "layoutmsg" "swapwithmaster master") + (key "Control_L" "Super+Ctrl+Alt+Shift" "layoutmsg" "removemaster") + (key "Control_L" "Super+Ctrl+Shift" "layoutmsg" "addmaster") + (key "Shift_L" "Super+Shift" "workspace" "previous") + (key "Super_L" "Super" "exec" "${pkill} wofi || ${wofi} --show drun") + (key "Super_L" "Super+Alt" "exec" "${pkill} wofi || ${rofi-rbw}") + (key "Super_L" "Super+Ctrl" "exec" "${pkill} wofi || calc") + (key "Super_L" "Super+Ctrl+Shift" "exec" "${pkill} wofi || ${networkmanager_dmenu}") + (key "Super_L" "Super+Shift" "exec" "${pkill} wofi || ${wofi} --show run") ]; # Regular binds bind = [ - ### Scripts - ", Print, exec, screenshot" - "SHIFT, Print, exec, screenshot -d" - "SUPER, Print, exec, screenshot -e" - "SUPER+SHIFT, Print, exec, screenshot -ed" - "SUPER+SHIFT, Delete, exec, vrr" - "SUPER, Minus, exec, audio" - "SUPER, Equal, exec, audio Normalizer" - "SUPER+SHIFT, W, exec, vm -x ${if config.custom.hidpi then "/scale:140 +f" else ""}" - "SUPER+SHIFT+CTRL, W, exec, vm ${virt-manager} --connect qemu:///system --show-domain-console myndows" - "SUPER+SHIFT+CTRL, Q, exec, close" # Quit all windows + (key "mouse:274" "Super" "layoutmsg" "swapwithmaster master") + (key "mouse:274" "Super+Shift" "layoutmsg" "addmaster") + (key "mouse:274" "Super+Ctrl+Shift" "layoutmsg" "removemaster") - # BUG: Freezes window when toggled - # https://github.com/hyprwm/Hyprland/issues/7609 - "CTRL, Space, exec, toggle dropdown special:dropdown ${kitty} --app-id dropdown --override font_size=12" - - "CTRL+SHIFT, Space, exec, toggle pip special:pip" + (key "Backslash" "Super" "layoutmsg" "orientationcenter") + (key "Backslash" "Super+Shift" "splitratio" "exact 0.5") # Reset layout ratio + (key "Backspace" "Super" "changegroupactive" "f") + (key "Backspace" "Super+Ctrl" "togglegroup" null) + (key "Backspace" "Super+Ctrl+Shift" "lockactivegroup" "toggle") + (key "Backspace" "Super+Shift" "changegroupactive" "b") + (key "Bracketleft" "Super" "layoutmsg" "orientationprev") + (key "Bracketleft" "Super+Shift" "splitratio" "-0.1") + (key "Bracketright" "Super" "layoutmsg" "orientationnext") + (key "Bracketright" "Super+Shift" "splitratio" "+0.1") # TODO: Toggle trackball hand - #// "SUPER, Delete, exec, left" + #// (key "Delete" "Super" "exec" "left") - ### Applications - "SUPER, B, exec, [tag +browser] ${firefox-esr}" - "SUPER, C, exec, ${codium}" - "SUPER, E, exec, ${gnome-text-editor}" - "SUPER, F, exec, ${nautilus}" - "SUPER, K, exec, ${obsidian}" - "SUPER, O, exec, ${libreoffice}" - "SUPER, P, exec, ${hyprpicker} --autocopy" - "SUPER+SHIFT, P, exec, ${hyprpicker} --autocopy --format rgb" - "SUPER+CTRL, T, exec, ${kitty}" - "SUPER+SHIFT+CTRL, T, exec, ${pkill} kitty" - "SUPER, V, exec, ${kitty} --app-id clipboard --override font_size=12 ${clipse}" - "SUPER+SHIFT, V, exec, ${clipse} -clear && ${notify-send} clipse 'Clipboard cleared' --urgency low" - "SUPER, Space, exec, ${pkill} wofi || ${wofi} --show drun" - "SUPER+SHIFT, Space, exec, ${pkill} wofi || ${wofi} --show run" - "SUPER+CTRL, Space, exec, ${pkill} wofi || calc" - "SUPER+ALT, Space, exec, ${pkill} wofi || ${rofi-rbw}" - "SUPER+SHIFT+CTRL, Space, exec, ${pkill} wofi || ${networkmanager_dmenu}" + (key "Delete" "Super+Shift" "exec" "vrr") + (key "Down" "Super" "movewindoworgroup" "d") + (key "Equal" "Super" "exec" "audio Normalizer") + (key "Escape" "Super" "togglefloating" null) + (key "Escape" "Super+Alt" "exec" "lifx state --color red") + (key "Escape" "Super+Shift" "centerwindow" null) + (key "Left" "Super" "movewindoworgroup" "l") + (key "Minus" "Super" "exec" "audio") + (key "Print" "Shift" "exec" "screenshot -d") + (key "Print" "Super" "exec" "screenshot -e") + (key "Print" "Super+Shift" "exec" "screenshot -ed") + (key "Print" null "exec" "screenshot") + (key "Return" "Super" "fullscreen" "1") # Maximize + (key "Return" "Super+Shift" "fullscreen" "0") # Fullscreen + (key "Right" "Super" "movewindoworgroup" "r") + (key "Space" "Ctrl" "exec" (concatStringsSep " " [ + "toggle" + "--focus" + "--type class" + "--expression '^dropdown$'" + "--workspace special:dropdown" + "--" + "${kitty} --app-id dropdown --override font_size=12" + ])) + (key "Space" "Ctrl+Alt" "exec" "lifx toggle") + (key "Space" "Ctrl+Shift" "exec" (concatStringsSep " " [ + "toggle" + "--type title" + "--expression '^Picture.in.[Pp]icture$'" + "--workspace special:pip" + ])) + (key "Space" "Super" "togglespecialworkspace" "scratchpad") + (key "Space" "Super+Ctrl" "movetoworkspacesilent" "special:scratchpad") + (key "Tab" "Super" "cyclenext" "tiled") + (key "Tab" "Super+Shift" "alterzorder" "top") + (key "Tab" "Super+Shift" "cyclenext" "floating") + (key "Up" "Super" "movewindoworgroup" "u") - # Kill applications - "SUPER, Q, killactive" - "SUPER+SHIFT, Q, exec, ${kill} -9 $(${hyprctl} -j activewindow | ${jq} .pid)" - "SUPER+SHIFT, A, exec, ${waydroid} session stop" - "SUPER+SHIFT, S, exec, ${pkill} steam" - "SUPER+SHIFT+CTRL, G, exec, ${pkill} gamescope" - - # LIFX - "SUPER+ALT, Escape, exec, lifx state --color red" - "SUPER+ALT, 1, exec, lifx state --kelvin 1500" - "SUPER+ALT, 2, exec, lifx state --kelvin 2500" - "SUPER+ALT, 3, exec, lifx state --kelvin 3000" - "SUPER+ALT, 4, exec, lifx state --kelvin 4000" - "SUPER+ALT, 5, exec, lifx state --kelvin 5000" - "CTRL+ALT, 1, exec, lifx state --brightness 0.01" - "CTRL+ALT, 2, exec, lifx state --brightness 0.25" - "CTRL+ALT, 3, exec, lifx state --brightness 0.50" - "CTRL+ALT, 4, exec, lifx state --brightness 0.75" - "CTRL+ALT, 5, exec, lifx state --brightness 1.00" - "CTRL+ALT, Space, exec, lifx toggle" - - ### Windows - "SUPER, Escape, togglefloating" - "SUPER+SHIFT, Escape, centerwindow" - "SUPER, Return, fullscreen, 1" # Maximize - "SUPER+SHIFT, Return, fullscreen, 0" # Fullscreen - "SUPER, Tab, cyclenext, tiled" - - # FIXME: Handle hover focus and zorder - "SUPER+SHIFT, Tab, cyclenext, floating" - "SUPER+SHIFT, Tab, alterzorder, top" - - ### Groups - "SUPER, Backspace, changegroupactive, f" - "SUPER+SHIFT, Backspace, changegroupactive, b" - "SUPER+CTRL, Backspace, togglegroup" - "SUPER+SHIFT+CTRL, Backspace, lockactivegroup, toggle" - "SUPER, Up, movewindoworgroup, u" - "SUPER, Down, movewindoworgroup, d" - "SUPER, Left, movewindoworgroup, l" - "SUPER, Right, movewindoworgroup, r" - - ### Layouts - "SUPER, mouse:274, layoutmsg, swapwithmaster master" - "SUPER+SHIFT, mouse:274, layoutmsg, addmaster" - "SUPER+SHIFT+CTRL, mouse:274, layoutmsg, removemaster" - "SUPER, Bracketleft, layoutmsg, orientationprev" - "SUPER, Bracketright, layoutmsg, orientationnext" - "SUPER, Backslash, layoutmsg, orientationcenter" - "SUPER+SHIFT, Backslash, splitratio, exact 0.5" # Reset layout ratio - "SUPER+SHIFT, Bracketleft, splitratio, -0.1" - "SUPER+SHIFT, Bracketright, splitratio, +0.1" - - ### Workspaces - "SUPER, 1, workspace, 1" - "SUPER+SHIFT, 1, movetoworkspacesilent, 1" - "SUPER, 2, workspace, 2" - "SUPER+SHIFT, 2, movetoworkspacesilent, 2" - "SUPER, 3, workspace, 3" - "SUPER+SHIFT, 3, movetoworkspacesilent, 3" - "SUPER, 4, workspace, 4" - "SUPER+SHIFT, 4, movetoworkspacesilent, 4" - "SUPER, 5, workspace, 5" - "SUPER+SHIFT, 5, movetoworkspacesilent, 5" - "SUPER, 6, workspace, 6" - "SUPER+SHIFT, 6, movetoworkspacesilent, 6" - "SUPER, 7, workspace, 7" - "SUPER+SHIFT, 7, movetoworkspacesilent, 7" - "SUPER, 8, workspace, 8" - "SUPER+SHIFT, 8, movetoworkspacesilent, 8" - "SUPER, 9, workspace, 9" - "SUPER+SHIFT, 9, movetoworkspacesilent, 9" - "SUPER, 0, workspace, 10" - "SUPER+SHIFT, 0, movetoworkspacesilent, 10" - "SUPER, Z, workspace, -1" - "SUPER+SHIFT, Z, movetoworkspacesilent, -1" - "SUPER, X, workspace, +1" - "SUPER+SHIFT, X, movetoworkspacesilent, +1" - - # Named workspaces - "SUPER, G, workspace, name:game" - "SUPER+SHIFT, G, movetoworkspacesilent, name:game" - "SUPER+CTRL, G, workspace, name:gamescope" - - # Special workspaces - "SUPER, A, togglespecialworkspace, android" - "SUPER+SHIFT, A, movetoworkspacesilent, android" - "SUPER, M, togglespecialworkspace, music" - "SUPER+SHIFT, M, movetoworkspacesilent, music" - "SUPER, S, togglespecialworkspace, steam" - "SUPER+SHIFT, S, movetoworkspacesilent, steam" - "SUPER, T, togglespecialworkspace, terminal" - "SUPER+SHIFT, T, movetoworkspacesilent, terminal" - "SUPER, W, togglespecialworkspace, vm" - "SUPER+SHIFT, W, movetoworkspacesilent, vm" + (key "0" "Super" "workspace" "10") + (key "0" "Super+Ctrl" "movetoworkspacesilent" "10") + (key "1" "Ctrl+Alt" "exec" "lifx state --brightness 0.01") + (key "1" "Super" "workspace" "1") + (key "1" "Super+Alt" "exec" "lifx state --kelvin 1500") + (key "1" "Super+Ctrl" "movetoworkspacesilent" "1") + (key "2" "Ctrl+Alt" "exec" "lifx state --brightness 0.25") + (key "2" "Super" "workspace" "2") + (key "2" "Super+Alt" "exec" "lifx state --kelvin 2500") + (key "2" "Super+Ctrl" "movetoworkspacesilent" "2") + (key "3" "Ctrl+Alt" "exec" "lifx state --brightness 0.50") + (key "3" "Super" "workspace" "3") + (key "3" "Super+Alt" "exec" "lifx state --kelvin 3000") + (key "3" "Super+Ctrl" "movetoworkspacesilent" "3") + (key "4" "Ctrl+Alt" "exec" "lifx state --brightness 0.75") + (key "4" "Super" "workspace" "4") + (key "4" "Super+Alt" "exec" "lifx state --kelvin 4000") + (key "4" "Super+Ctrl" "movetoworkspacesilent" "4") + (key "5" "Ctrl+Alt" "exec" "lifx state --brightness 1.00") + (key "5" "Super" "workspace" "5") + (key "5" "Super+Alt" "exec" "lifx state --kelvin 5000") + (key "5" "Super+Ctrl" "movetoworkspacesilent" "5") + (key "6" "Super" "workspace" "6") + (key "6" "Super+Ctrl" "movetoworkspacesilent" "6") + (key "7" "Super" "workspace" "7") + (key "7" "Super+Ctrl" "movetoworkspacesilent" "7") + (key "8" "Super" "workspace" "8") + (key "8" "Super+Ctrl" "movetoworkspacesilent" "8") + (key "9" "Super" "workspace" "9") + (key "9" "Super+Ctrl" "movetoworkspacesilent" "9") + (key "A" "Ctrl+Alt" "exec" "${waydroid} session stop") + (key "A" "Super" "togglespecialworkspace" "android") + (key "A" "Super+Ctrl" "movetoworkspacesilent" "android") + (key "B" "Super" "exec" "[group new lock; tile] ${firefox-esr}") + (key "C" "Super" "exec" codium) + (key "E" "Super" "exec" gnome-text-editor) + (key "F" "Super" "exec" nautilus) + (key "G" "Super" "workspace" "name:game") + (key "G" "Super+Alt" "workspace" "name:gamescope") + (key "G" "Super+Ctrl" "movetoworkspacesilent" "name:game") + (key "G" "Super+Ctrl+Alt" "exec" "${pkill} gamescope") + (key "K" "Super" "exec" obsidian) + (key "M" "Super" "togglespecialworkspace" "music") + (key "M" "Super+Ctrl" "movetoworkspacesilent" "music") + (key "O" "Super" "togglespecialworkspace" "office") + (key "P" "Super" "exec" "${hyprpicker} --autocopy") + (key "P" "Super+Shift" "exec" "${hyprpicker} --autocopy --format rgb") + (key "Q" "Ctrl+Alt" "exec" "${kill} -9 $(${hyprctl} -j activewindow | ${jq} .pid)") + (key "Q" "Ctrl+Alt+Shift" "exec" "close") # Quit all windows + (key "Q" "Super" "killactive" null) + (key "S" "Ctrl+Alt" "exec" "${pkill} steam") + (key "S" "Super" "togglespecialworkspace" "steam") + (key "S" "Super+Ctrl" "movetoworkspacesilent" "steam") + (key "S" "Super+Shift" "exec" steam) + (key "T" "Ctrl+Alt" "exec" "${pkill} kitty") + (key "T" "Super" "togglespecialworkspace" "terminal") + (key "T" "Super+Ctrl" "movetoworkspacesilent" "terminal") + (key "T" "Super+Shift" "exec" kitty) + (key "V" "Super" "exec" "${kitty} --app-id clipboard --override font_size=12 ${clipse}") + (key "V" "Super+Shift" "exec" "${clipse} -clear && ${notify-send} clipse 'Clipboard cleared' --urgency low") + (key "W" "Super" "togglespecialworkspace" "vm") + (key "W" "Super+Shift" "exec" "vm -x ${ + if config.custom.hidpi + then "/scale:140 +f" + else "" + }") + (key "W" "Super+Ctrl" "movetoworkspacesilent" "vm") + (key "W" "Super+Ctrl+Shift" "exec" "vm ${virt-manager} --show-domain-console myndows") + (key "X" "Super" "workspace" "+1") + (key "X" "Super+Ctrl" "movetoworkspacesilent" "+1") + (key "Z" "Super" "workspace" "-1") + (key "Z" "Super+Ctrl" "movetoworkspacesilent" "-1") ]; }; }; diff --git a/options/custom/desktops/hyprland/rules.nix b/options/custom/desktops/hyprland/rules.nix index a58c3ab..f2d1218 100644 --- a/options/custom/desktops/hyprland/rules.nix +++ b/options/custom/desktops/hyprland/rules.nix @@ -4,22 +4,20 @@ pkgs, ... }: - -with lib; - -let +with lib; let gamescope = "${config.programs.gamescope.package}/bin/gamescope"; + kitty = "${config.home-manager.users.${config.custom.username}.programs.kitty.package}/bin/kitty"; + libreoffice = "${config.custom.programs.libreoffice.package}/bin/libreoffice"; loupe = "${pkgs.loupe}/bin/loupe"; + pgrep = "${pkgs.procps}/bin/pgrep"; steam = "${config.programs.steam.package}/bin/steam"; virt-manager = "${pkgs.virt-manager}/bin/virt-manager"; waydroid = "${pkgs.waydroid}/bin/waydroid"; - kitty = "${config.home-manager.users.${config.custom.username}.programs.kitty.package}/bin/kitty"; youtube-music = "${pkgs.youtube-music}/bin/youtube-music"; cfg = config.custom.desktops.hyprland.rules; -in -{ - options.custom.desktops.hyprland.rules.enable = mkOption { default = false; }; +in { + options.custom.desktops.hyprland.rules.enable = mkOption {default = false;}; config.home-manager.users.${config.custom.username} = mkIf cfg.enable { wayland.windowManager.hyprland.settings = { @@ -30,246 +28,193 @@ in "special:android, on-created-empty:${waydroid} app launch com.YoStarEN.Arknights" "special:music, on-created-empty:${youtube-music}" + "special:office, on-created-empty:${libreoffice}" "special:steam, on-created-empty:${steam}" "special:terminal, on-created-empty:${kitty}" + "special:vm, on-created-empty:${pgrep} -x vm || ${virt-manager}" "special:wallpaper, on-created-empty:[tile] ${loupe} /tmp/wallpaper.png" ]; # https://wiki.hyprland.org/Configuring/Window-Rules #?? windowrulev2 = RULE, WINDOW - windowrulev2 = - with config.custom; - let - # Return hypr-formatted string, converting booleans into 0/1 - format = - field: expr: - "${field}:${ - toString ( - if expr == true then - 1 - else if expr == false then - 0 - else - expr - ) - }"; + windowrulev2 = with config.custom; let + ### Hardware-dependent rules + # Convert truncated float to string + tr = num: toString (builtins.floor num); - # Generate hypr-formatted window rules - #?? merge - merge = - field: expr: rules: - map ( - rule: - if builtins.isAttrs field then - "${rule}, ${lib.concatStringsSep ", " (lib.mapAttrsToList (f: e: format f e) field)}" - else - "${rule}, ${format field expr}" - ) rules; + # Bottom center + clipboard = rec { + x = tr (width / scale / 2 - (toInt w) / 2); + y = tr (height / scale - (toInt h) - gap - border - padding); + w = "600"; + h = tr (height / scale * 0.5 * scale); + }; - class = expr: rules: merge "class" "^${expr}$" rules; - floating = expr: rules: merge "floating" expr rules; - fullscreen = expr: rules: merge "fullscreen" expr rules; - pinned = expr: rules: merge "pinned" expr rules; - tag = expr: rules: merge "tag" expr rules; - title = expr: rules: merge "title" "^${expr}$" rules; + # Bottom center + dropdown = rec { + x = tr (width / scale / 2 - (toInt w) / 2); + y = tr (height / scale - (toInt h) - gap - border - padding); + w = tr (width + / scale + * ( + if ultrawide + then 0.5 + else 1 + ) + - gap + - gap / 2 + + 1); + h = tr (height / scale * 0.2 * scale); + }; - fields = fields: rules: merge fields null rules; + # Top right + pip = rec { + x = tr (width / scale - (toInt w) - gap - border); + y = tr (gap + border); + w = tr (width / scale * 0.25 - gap - gap + 1); + h = tr ((toInt w) * 9 / 16); # 16:9 aspect ratio + }; - ### Hardware-dependent rules - # Convert truncated float to string - tr = num: toString (builtins.floor num); + ### Rules + # Return hypr-formatted string, converting booleans into 0/1 + format = field: expr: "${field}:${ + toString ( + if expr == true + then 1 + else if expr == false + then 0 + else expr + ) + }"; - # Bottom center - clipboard = rec { - x = tr (width / scale / 2 - (toInt w) / 2); - y = tr (height / scale - (toInt h) - gap - border - padding); - w = "600"; - h = tr (height / scale * 0.5 * scale); - }; + # Generate hypr-formatted window rules + #?? merge + merge = field: expr: rules: + map ( + rule: + if builtins.isAttrs field + then "${rule}, ${lib.concatStringsSep ", " (lib.mapAttrsToList (f: e: format f e) field)}" + else "${rule}, ${format field expr}" + ) + rules; - # Bottom center - dropdown = rec { - x = tr (width / scale / 2 - (toInt w) / 2); - y = tr (height / scale - (toInt h) - gap - border - padding); - w = tr (width / scale * (if ultrawide then 0.5 else 1) - gap - gap / 2 + 1); - h = tr (height / scale * 0.2 * scale); - }; + class = expr: rules: merge "class" "^${expr}$" rules; + floating = expr: rules: merge "floating" expr rules; + fullscreen = expr: rules: merge "fullscreen" expr rules; + pinned = expr: rules: merge "pinned" expr rules; + title = expr: rules: merge "title" "^${expr}$" rules; - # Top right - pip = rec { - x = tr (width / scale - (toInt w) - gap - border); - y = tr (gap + border); - w = tr (width / scale * 0.25 - gap - gap + 1); - h = tr ((toInt w) * 9 / 16); # 16:9 aspect ratio - }; - in + fields = fields: rules: merge fields null rules; + + ### Pseudo-tags + # Wrap generated rules in Nix categories + tag = { + android = rules: [ + (class "waydroid.*" rules) + ]; + clipboard = rules: [ + (class "clipboard" rules) + ]; + dropdown = rules: [ + (class "dropdown" rules) + ]; + editor = rules: [ + (class "codium-url-handler" rules) # VSCode + (class "obsidian" (rules ++ ["group barred"])) + ]; + files = rules: [ + (class "org\\.gnome\\.Nautilus" rules) + ]; + game = rules: [ + (class "moe\\.launcher\\.the-honkers-railway-launcher" (rules ++ ["size 1280 730"])) # Honkai: Star Rail + (class "steam_app_.+" rules) # Proton + ]; + music = rules: [ + (class "Spotify" rules) + (class "YouTube Music" rules) + (title "Spotify Premium" rules) + ]; + office = rules: [ + (class "libreoffice.+" rules) + ]; + pip = rules: [ + (title "Picture.in.[Pp]icture" rules) + ]; + social = rules: [ + (class "cinny" rules) + (class "discord" rules) + (class "Element" rules) + (class "org\\.telegram\\.desktop" rules) + ]; + steam = rules: [ + (class "SDL Application" rules) # Steam + (class "steam" rules) + ]; + terminal = rules: [ + (class "foot" rules) + (class "kitty" rules) + (class "org\\.wezfurlong\\.wezterm" rules) + ]; + vm = rules: [ + (class "(sdl-|wl|x)freerdp" (rules ++ ["nomaxsize" "tile"])) + (class "virt-manager" rules) + ]; + wine = rules: [ + (class ".*\\.(exe|x86_64)" rules) # Wine + ]; + }; + in flatten [ ### Defaults - (class ".*" [ - "center" - "float" - "suppressevent maximize" - "syncfullscreen" - ]) - (floating true [ - "bordercolor rgb(073642)" - "workspace special:scratchpad" - ]) - (fullscreen true [ "idleinhibit focus" ]) - (pinned true [ "bordercolor rgb(073642) rgb(073642)" ]) + (class ".*" ["float" "suppressevent maximize" "syncfullscreen"]) + (floating true ["bordercolor rgb(073642)"]) + (fullscreen true ["idleinhibit focus"]) + (pinned true ["bordercolor rgb(073642) rgb(073642)"]) - # TODO: Convert to nix variables instead of tags - ### Tags - (tag "android" [ - "tile" - "workspace special:android" - ]) - (tag "browser" [ - "group new lock" - "tile" - "workspace unset" - ]) - (tag "clipboard" [ - "move ${clipboard.x} ${clipboard.y}" - "pin" - "size ${clipboard.w} ${clipboard.h}" - "stayfocused" - ]) - (tag "dropdown" [ - "move ${dropdown.x} ${dropdown.y}" - "pin" - "size ${dropdown.w} ${dropdown.h}" - "workspace special:dropdown" - ]) - (tag "editor" [ - "group invade" - "tile" - "workspace unset" - ]) - (tag "files" [ - "size 1000 625" - ]) - (tag "game" [ - "group barred" - "idleinhibit always" - "noborder" - "noshadow" - "renderunfocused" - "workspace name:game" - ]) - (tag "music" [ - "tile" - "workspace special:music" - ]) - (tag "pip" [ - "keepaspectratio" - "move ${pip.x} ${pip.y}" - "pin" - "size ${pip.w} ${pip.h}" - ]) - (tag "social" [ - "group" - "tile" - "workspace unset" - ]) - (tag "steam" [ "workspace special:steam" ]) - (tag "terminal" [ - "tile" - "workspace unset" - ]) - (tag "vm" [ "workspace special:vm" ]) - (tag "wine" [ - "noborder" - "noshadow" - ]) - - ### Applications - (class ".*\\.(exe|x86_64)" [ "tag +wine" ]) # Wine - (class "(sdl-|wl|x)freerdp" [ - "nomaxsize" - "tag +vm" - "tile" - ]) - (class "cinny" [ "tag +social" ]) - (class "clipboard" [ "tag +clipboard" ]) - (class "codium-url-handler" [ "tag +editor" ]) # VSCode - (class "discord" [ "tag +social" ]) - (class "dropdown" [ "tag +dropdown" ]) - (class "Element" [ "tag +social" ]) - (class "foot" [ "tag +terminal" ]) - (class "kitty" [ "tag +terminal" ]) - (class "libreoffice.+" [ - "tile" - "workspace unset" - ]) - (class "moe\\.launcher\\.the-honkers-railway-launcher" [ - "size 1280 730" - "tag +game" - ]) - (class "obsidian" [ - "group barred" - "tag +editor" - ]) - (class "org\\.gnome\\.Nautilus" [ "tag +files" ]) - (class "org\\.telegram\\.desktop" [ "tag +social" ]) - (class "org\\.wezfurlong\\.wezterm" [ "tag +terminal" ]) - (class "SDL Application" [ "tag +steam" ]) # Steam - (class "Spotify" [ "tag +music" ]) - (class "steam_app_1473350" [ "workspace 0" ]) # (the) Gnorp Apologue - (class "steam" [ "tag +steam" ]) - (class "steam_app_.+" [ "tag +game" ]) # Proton - (class "Tap Wizard 2.x86_64" [ "workspace 0" ]) - (class "virt-manager" [ "tag +vm" ]) - (class "waydroid.*" [ "tag +android" ]) - (class "YouTube Music" [ "tag +music" ]) - - (title "Picture.in.[Pp]icture" [ "tag +pip" ]) - (title "Spotify Premium" [ "tag +music" ]) + (tag.android ["tile" "workspace special:android"]) + (tag.clipboard ["move ${clipboard.x} ${clipboard.y}" "pin" "size ${clipboard.w} ${clipboard.h}" "stayfocused"]) + (tag.dropdown ["move ${dropdown.x} ${dropdown.y}" "pin" "size ${dropdown.w} ${dropdown.h}"]) + (tag.editor ["group invade" "tile"]) + (tag.files ["size 1000 625"]) + (tag.game ["group barred" "idleinhibit always" "noborder" "noshadow" "renderunfocused" "workspace name:game"]) + (tag.music ["tile" "workspace special:music"]) + (tag.office ["tile" "workspace special:office"]) + (tag.pip ["keepaspectratio" "move ${pip.x} ${pip.y}" "pin" "size ${pip.w} ${pip.h}"]) + (tag.social ["group" "tile"]) + (tag.steam ["workspace special:steam"]) + (tag.terminal ["tile"]) + (tag.vm ["workspace special:vm"]) + (tag.wine ["noborder" "noshadow"]) ### Overrides - #!! Expressions are not wrapped in ^$ - (fields - { - class = "^lutris$"; - title = "^Lutris$"; - } - [ - "center" - "size 1000 500" - ] - ) - (fields { - tag = "steam"; - title = "^notificationtoasts$"; - } [ "workspace unset" ]) - (fields { - tag = "steam"; - title = "^Steam$"; - } [ "tile" ]) + (class "steam_app_1473350" ["workspace 0"]) # (the) Gnorp Apologue + (class "Tap Wizard 2.x86_64" ["workspace 0"]) - (fields - { - class = "^com\\.github\\.wwmm\\.easyeffects$"; - title = "^Easy Effects$"; - } - [ - "size 50% 50%" - ] - ) - (fields - { - class = "^discord$"; - title = "^Discord Updater$"; - } - [ - "float" - "nofocus" - ] - ) + #!! Expressions are not wrapped in ^$ + (fields { + class = "^com\\.github\\.wwmm\\.easyeffects$"; + title = "^Easy Effects$"; # Main window + } ["size 50% 50%"]) + (fields { + class = "^discord$"; + title = "^Discord Updater$"; # Update dialog + } ["float" "nofocus"]) + (fields { + class = "^lutris$"; + title = "^Lutris$"; # Main window + } ["center" "size 1000 500"]) + (fields { + class = "^steam$"; + title = "^notificationtoasts$"; # Steam notifications + } []) + (fields { + class = "^steam$"; + title = "^Steam$"; # Main window + } ["tile"]) (fields { class = "^virt-manager$"; - title = "^.+on QEMU/KVM$"; - } [ "tile" ]) + title = "^.+on QEMU/KVM$"; # VM window + } ["tile"]) ]; }; };