hyprland: refactor binds and rules
Signed-off-by: Myned <dev@bjork.tech>
This commit is contained in:
parent
29972bf2d8
commit
505e6dc583
2 changed files with 341 additions and 413 deletions
|
@ -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
|
||||
{
|
||||
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")
|
||||
];
|
||||
};
|
||||
};
|
||||
|
|
|
@ -4,21 +4,19 @@
|
|||
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
|
||||
{
|
||||
in {
|
||||
options.custom.desktops.hyprland.rules.enable = mkOption {default = false;};
|
||||
|
||||
config.home-manager.users.${config.custom.username} = mkIf cfg.enable {
|
||||
|
@ -30,51 +28,16 @@ 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
|
||||
)
|
||||
}";
|
||||
|
||||
# Generate hypr-formatted window rules
|
||||
#?? merge <FIELD|{FIELDS}> <EXPRESSION> <RULES>
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
fields = fields: rules: merge fields null rules;
|
||||
|
||||
windowrulev2 = with config.custom; let
|
||||
### Hardware-dependent rules
|
||||
# Convert truncated float to string
|
||||
tr = num: toString (builtins.floor num);
|
||||
|
@ -91,7 +54,16 @@ in
|
|||
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);
|
||||
w = tr (width
|
||||
/ scale
|
||||
* (
|
||||
if ultrawide
|
||||
then 0.5
|
||||
else 1
|
||||
)
|
||||
- gap
|
||||
- gap / 2
|
||||
+ 1);
|
||||
h = tr (height / scale * 0.2 * scale);
|
||||
};
|
||||
|
||||
|
@ -102,173 +74,146 @@ in
|
|||
w = tr (width / scale * 0.25 - gap - gap + 1);
|
||||
h = tr ((toInt w) * 9 / 16); # 16:9 aspect ratio
|
||||
};
|
||||
|
||||
### 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
|
||||
)
|
||||
}";
|
||||
|
||||
# Generate hypr-formatted window rules
|
||||
#?? merge <FIELD|{FIELDS}> <EXPRESSION> <RULES>
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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"
|
||||
])
|
||||
(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
|
||||
{
|
||||
#!! Expressions are not wrapped in ^$
|
||||
(fields {
|
||||
class = "^com\\.github\\.wwmm\\.easyeffects$";
|
||||
title = "^Easy Effects$";
|
||||
}
|
||||
[
|
||||
"size 50% 50%"
|
||||
]
|
||||
)
|
||||
(fields
|
||||
{
|
||||
title = "^Easy Effects$"; # Main window
|
||||
} ["size 50% 50%"])
|
||||
(fields {
|
||||
class = "^discord$";
|
||||
title = "^Discord Updater$";
|
||||
}
|
||||
[
|
||||
"float"
|
||||
"nofocus"
|
||||
]
|
||||
)
|
||||
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$";
|
||||
title = "^.+on QEMU/KVM$"; # VM window
|
||||
} ["tile"])
|
||||
];
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue