diff --git a/dots/.config/hypr/hyprland.conf.nix b/dots/.config/hypr/hyprland.conf.nix index ad20077..0f39505 100644 --- a/dots/.config/hypr/hyprland.conf.nix +++ b/dots/.config/hypr/hyprland.conf.nix @@ -27,6 +27,8 @@ in { }") hypr.keybindings.binds)} + ${concatStringsSep "\n" (map (gs: toString gs) hypr.gestures.gestures)} + ${concatStringsSep "\n\n" (map (sm: '' bind${concatStringsSep "" sm.enterBind.flags} = ${concatStringsSep " " sm.enterBind.mods}, ${sm.enterBind.key}, submap, ${sm.name} submap = ${sm.name} diff --git a/lib/hyprland/default.nix b/lib/hyprland/default.nix index 4fa480d..a408962 100644 --- a/lib/hyprland/default.nix +++ b/lib/hyprland/default.nix @@ -1,5 +1,6 @@ {...}: { imports = [ ./standard-options.nix + ./gestures.nix ]; } diff --git a/lib/hyprland/gestures.nix b/lib/hyprland/gestures.nix new file mode 100644 index 0000000..862c039 --- /dev/null +++ b/lib/hyprland/gestures.nix @@ -0,0 +1,61 @@ +{lib, ...}: let + inherit (lib) mkOption types; + inherit (builtins) concatStringsSep; + + # v0.52.1 + + # gesture = fingers, direction, action, options + gesture = + types.submodule { + options = { + fingers = mkOption { + type = types.ints.positive; + }; + direction = mkOption { + type = types.enum ["swipe" "horizontal" "vertical" "left" "right" "up" "down" "pinch" "pinchin" "pinchout"]; + }; + mods = mkOption { + type = types.listOf types.str; + default = []; + }; + scale = mkOption { + type = types.numbers.positive; + default = 1; + }; + action = mkOption { + type = types.enum ["dispatcher" "workspace" "move" "resize" "special" "close" "fullscreen" "float"]; + }; + options = mkOption { + type = types.listOf types.str; + default = []; + }; + }; + } + // { + }; +in { + options.horseman.wm.hyprland.config = { + gestures.gestures = mkOption { + type = types.listOf gesture; + default = []; + apply = gs: + map (it: + it + // { + __toString = gs: "gesture = ${concatStringsSep ", " ( + [ + (toString gs.fingers) + (gs.direction) + ] + ++ map (it: "mod: ${it}") gs.mods + ++ [ + "scale: ${toString gs.scale}" + (gs.action) + ] + ++ gs.options + )}"; + }) + gs; + }; + }; +} diff --git a/modules/wm/hyprland/keybindings.nix b/modules/wm/hyprland/keybindings.nix index c455ea9..3f710cd 100644 --- a/modules/wm/hyprland/keybindings.nix +++ b/modules/wm/hyprland/keybindings.nix @@ -7,504 +7,506 @@ cfg = config.horseman.wm.hyprland; in { config = mkIf cfg.enable { - horseman.wm.hyprland.config.keybindings = { - submaps = [ - { - name = "disable-all"; - enterBind = { + horseman.wm.hyprland.config = { + keybindings = { + submaps = [ + { + name = "disable-all"; + enterBind = { + flags = ["o"]; + mods = ["SUPER"]; + key = "ESCAPE"; + }; + exitBind = { + flags = ["o"]; + mods = ["SUPER"]; + key = "ESCAPE"; + }; + + binds = []; + } + ]; + + binds = [ + { + flags = []; + mods = ["SUPER"]; + key = "SPACE"; + dispatcher = "exec"; + params = "pkill wofi || wofi -i -S drun -M multi-contains"; + } + + { + flags = []; + mods = ["SUPER"]; + key = "B"; + dispatcher = "exec"; + params = "pkill waybar || waybar"; + } + + { + flags = []; + mods = ["SUPER"]; + key = "RETURN"; + dispatcher = "exec"; + params = "kitty"; + } + + { + flags = []; + mods = ["SUPER"]; + key = "Q"; + dispatcher = "killactive"; + params = ""; + } + + { + flags = []; + mods = []; + key = "F11"; + dispatcher = "fullscreen"; + params = ""; + } + { flags = ["o"]; mods = ["SUPER"]; - key = "ESCAPE"; - }; - exitBind = { - flags = ["o"]; + key = "L"; + dispatcher = "exec"; + params = "hyprlock"; + } + { + flags = ["e"]; mods = ["SUPER"]; - key = "ESCAPE"; - }; + key = "TAB"; + dispatcher = "changegroupactive"; + params = "f"; + } - binds = []; - } - ]; + { + flags = ["e"]; + mods = ["SUPER" "SHIFT"]; + key = "TAB"; + dispatcher = "changegroupactive"; + params = "b"; + } + { + flags = []; + mods = ["SUPER"]; + key = "F"; + dispatcher = "togglefloating"; + params = ""; + } + { + flags = []; + mods = ["SUPER"]; + key = "T"; + dispatcher = "togglegroup"; + params = ""; + } - binds = [ - { - flags = []; - mods = ["SUPER"]; - key = "SPACE"; - dispatcher = "exec"; - params = "pkill wofi || wofi -i -S drun -M multi-contains"; - } + { + flags = []; + mods = ["SUPER"]; + key = "P"; + dispatcher = "pin"; + params = ""; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "S"; + dispatcher = "exec"; + params = "hyprshot -m region --clipboard-only"; + } - { - flags = []; - mods = ["SUPER"]; - key = "B"; - dispatcher = "exec"; - params = "pkill waybar || waybar"; - } + { + flags = []; + mods = ["SUPER"]; + key = "H"; + dispatcher = "movefocus"; + params = "l"; + } + { + flags = []; + mods = ["SUPER"]; + key = "L"; + dispatcher = "movefocus"; + params = "r"; + } + { + flags = []; + mods = ["SUPER"]; + key = "K"; + dispatcher = "movefocus"; + params = "u"; + } + { + flags = []; + mods = ["SUPER"]; + key = "J"; + dispatcher = "movefocus"; + params = "d"; + } - { - flags = []; - mods = ["SUPER"]; - key = "RETURN"; - dispatcher = "exec"; - params = "kitty"; - } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "H"; + dispatcher = "movewindow"; + params = "l"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "L"; + dispatcher = "movewindow"; + params = "r"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "K"; + dispatcher = "movewindow"; + params = "u"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "J"; + dispatcher = "movewindow"; + params = "d"; + } - { - flags = []; - mods = ["SUPER"]; - key = "Q"; - dispatcher = "killactive"; - params = ""; - } + { + flags = ["e"]; + mods = ["SUPER"]; + key = "Left"; + dispatcher = "moveactive"; + params = "-50 0"; + } + { + flags = ["e"]; + mods = ["SUPER"]; + key = "Right"; + dispatcher = "moveactive"; + params = "50 0"; + } + { + flags = ["e"]; + mods = ["SUPER"]; + key = "Up"; + dispatcher = "moveactive"; + params = "0 -50"; + } + { + flags = ["e"]; + mods = ["SUPER"]; + key = "Down"; + dispatcher = "moveactive"; + params = "0 50"; + } - { - flags = []; - mods = []; - key = "F11"; - dispatcher = "fullscreen"; - params = ""; - } - { - flags = ["o"]; - mods = ["SUPER"]; - key = "L"; - dispatcher = "exec"; - params = "hyprlock"; - } - { - flags = ["e"]; - mods = ["SUPER"]; - key = "TAB"; - dispatcher = "changegroupactive"; - params = "f"; - } + { + flags = ["e"]; + mods = ["SUPER" "SHIFT"]; + key = "Left"; + dispatcher = "resizeactive"; + params = "-50 0"; + } + { + flags = ["e"]; + mods = ["SUPER" "SHIFT"]; + key = "Right"; + dispatcher = "resizeactive"; + params = "50 0"; + } + { + flags = ["e"]; + mods = ["SUPER" "SHIFT"]; + key = "Up"; + dispatcher = "resizeactive"; + params = "0 -50"; + } + { + flags = ["e"]; + mods = ["SUPER" "SHIFT"]; + key = "Down"; + dispatcher = "resizeactive"; + params = "0 50"; + } - { - flags = ["e"]; - mods = ["SUPER" "SHIFT"]; - key = "TAB"; - dispatcher = "changegroupactive"; - params = "b"; - } - { - flags = []; - mods = ["SUPER"]; - key = "F"; - dispatcher = "togglefloating"; - params = ""; - } - { - flags = []; - mods = ["SUPER"]; - key = "T"; - dispatcher = "togglegroup"; - params = ""; - } + { + flags = []; + mods = ["SUPER"]; + key = "grave"; + dispatcher = "togglespecialworkspace"; + params = ""; + } + { + flags = []; + mods = ["SUPER"]; + key = "1"; + dispatcher = "workspace"; + params = "1"; + } + { + flags = []; + mods = ["SUPER"]; + key = "2"; + dispatcher = "workspace"; + params = "2"; + } + { + flags = []; + mods = ["SUPER"]; + key = "3"; + dispatcher = "workspace"; + params = "3"; + } + { + flags = []; + mods = ["SUPER"]; + key = "4"; + dispatcher = "workspace"; + params = "4"; + } + { + flags = []; + mods = ["SUPER"]; + key = "5"; + dispatcher = "workspace"; + params = "5"; + } + { + flags = []; + mods = ["SUPER"]; + key = "6"; + dispatcher = "workspace"; + params = "6"; + } + { + flags = []; + mods = ["SUPER"]; + key = "7"; + dispatcher = "workspace"; + params = "7"; + } + { + flags = []; + mods = ["SUPER"]; + key = "8"; + dispatcher = "workspace"; + params = "8"; + } + { + flags = []; + mods = ["SUPER"]; + key = "9"; + dispatcher = "workspace"; + params = "9"; + } + { + flags = []; + mods = ["SUPER"]; + key = "0"; + dispatcher = "workspace"; + params = "10"; + } - { - flags = []; - mods = ["SUPER"]; - key = "P"; - dispatcher = "pin"; - params = ""; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "S"; - dispatcher = "exec"; - params = "hyprshot -m region --clipboard-only"; - } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "grave"; + dispatcher = "movetoworkspace"; + params = "special"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "1"; + dispatcher = "movetoworkspace"; + params = "1"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "2"; + dispatcher = "movetoworkspace"; + params = "2"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "3"; + dispatcher = "movetoworkspace"; + params = "3"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "4"; + dispatcher = "movetoworkspace"; + params = "4"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "5"; + dispatcher = "movetoworkspace"; + params = "5"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "6"; + dispatcher = "movetoworkspace"; + params = "6"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "7"; + dispatcher = "movetoworkspace"; + params = "7"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "8"; + dispatcher = "movetoworkspace"; + params = "8"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "9"; + dispatcher = "movetoworkspace"; + params = "9"; + } + { + flags = []; + mods = ["SUPER" "SHIFT"]; + key = "0"; + dispatcher = "movetoworkspace"; + params = "10"; + } - { - flags = []; - mods = ["SUPER"]; - key = "H"; - dispatcher = "movefocus"; - params = "l"; - } - { - flags = []; - mods = ["SUPER"]; - key = "L"; - dispatcher = "movefocus"; - params = "r"; - } - { - flags = []; - mods = ["SUPER"]; - key = "K"; - dispatcher = "movefocus"; - params = "u"; - } - { - flags = []; - mods = ["SUPER"]; - key = "J"; - dispatcher = "movefocus"; - params = "d"; - } + { + flags = ["e"]; + mods = ["SUPER" "CONTROL"]; + key = "Right"; + dispatcher = "workspace"; + params = "e+1"; + } + { + flags = ["e"]; + mods = ["SUPER" "CONTROL"]; + key = "Left"; + dispatcher = "workspace"; + params = "e-1"; + } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "H"; - dispatcher = "movewindow"; - params = "l"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "L"; - dispatcher = "movewindow"; - params = "r"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "K"; - dispatcher = "movewindow"; - params = "u"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "J"; - dispatcher = "movewindow"; - params = "d"; - } + { + flags = ["m"]; + mods = ["SUPER"]; + key = "mouse:272"; + dispatcher = "movewindow"; + params = ""; + } + { + flags = ["m"]; + mods = ["SUPER" "SHIFT"]; + key = "mouse:272"; + dispatcher = "resizewindow"; + params = ""; + } - { - flags = ["e"]; - mods = ["SUPER"]; - key = "Left"; - dispatcher = "moveactive"; - params = "-50 0"; - } - { - flags = ["e"]; - mods = ["SUPER"]; - key = "Right"; - dispatcher = "moveactive"; - params = "50 0"; - } - { - flags = ["e"]; - mods = ["SUPER"]; - key = "Up"; - dispatcher = "moveactive"; - params = "0 -50"; - } - { - flags = ["e"]; - mods = ["SUPER"]; - key = "Down"; - dispatcher = "moveactive"; - params = "0 50"; - } - - { - flags = ["e"]; - mods = ["SUPER" "SHIFT"]; - key = "Left"; - dispatcher = "resizeactive"; - params = "-50 0"; - } - { - flags = ["e"]; - mods = ["SUPER" "SHIFT"]; - key = "Right"; - dispatcher = "resizeactive"; - params = "50 0"; - } - { - flags = ["e"]; - mods = ["SUPER" "SHIFT"]; - key = "Up"; - dispatcher = "resizeactive"; - params = "0 -50"; - } - { - flags = ["e"]; - mods = ["SUPER" "SHIFT"]; - key = "Down"; - dispatcher = "resizeactive"; - params = "0 50"; - } - - { - flags = []; - mods = ["SUPER"]; - key = "grave"; - dispatcher = "togglespecialworkspace"; - params = ""; - } - { - flags = []; - mods = ["SUPER"]; - key = "1"; - dispatcher = "workspace"; - params = "1"; - } - { - flags = []; - mods = ["SUPER"]; - key = "2"; - dispatcher = "workspace"; - params = "2"; - } - { - flags = []; - mods = ["SUPER"]; - key = "3"; - dispatcher = "workspace"; - params = "3"; - } - { - flags = []; - mods = ["SUPER"]; - key = "4"; - dispatcher = "workspace"; - params = "4"; - } - { - flags = []; - mods = ["SUPER"]; - key = "5"; - dispatcher = "workspace"; - params = "5"; - } - { - flags = []; - mods = ["SUPER"]; - key = "6"; - dispatcher = "workspace"; - params = "6"; - } - { - flags = []; - mods = ["SUPER"]; - key = "7"; - dispatcher = "workspace"; - params = "7"; - } - { - flags = []; - mods = ["SUPER"]; - key = "8"; - dispatcher = "workspace"; - params = "8"; - } - { - flags = []; - mods = ["SUPER"]; - key = "9"; - dispatcher = "workspace"; - params = "9"; - } - { - flags = []; - mods = ["SUPER"]; - key = "0"; - dispatcher = "workspace"; - params = "10"; - } - - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "grave"; - dispatcher = "movetoworkspace"; - params = "special"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "1"; - dispatcher = "movetoworkspace"; - params = "1"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "2"; - dispatcher = "movetoworkspace"; - params = "2"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "3"; - dispatcher = "movetoworkspace"; - params = "3"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "4"; - dispatcher = "movetoworkspace"; - params = "4"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "5"; - dispatcher = "movetoworkspace"; - params = "5"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "6"; - dispatcher = "movetoworkspace"; - params = "6"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "7"; - dispatcher = "movetoworkspace"; - params = "7"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "8"; - dispatcher = "movetoworkspace"; - params = "8"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "9"; - dispatcher = "movetoworkspace"; - params = "9"; - } - { - flags = []; - mods = ["SUPER" "SHIFT"]; - key = "0"; - dispatcher = "movetoworkspace"; - params = "10"; - } - - { - flags = ["e"]; - mods = ["SUPER" "CONTROL"]; - key = "Right"; - dispatcher = "workspace"; - params = "e+1"; - } - { - flags = ["e"]; - mods = ["SUPER" "CONTROL"]; - key = "Left"; - dispatcher = "workspace"; - params = "e-1"; - } - - { - flags = ["m"]; - mods = ["SUPER"]; - key = "mouse:272"; - dispatcher = "movewindow"; - params = ""; - } - { - flags = ["m"]; - mods = ["SUPER" "SHIFT"]; - key = "mouse:272"; - dispatcher = "resizewindow"; - params = ""; - } - - { - flags = ["e" "l"]; - mods = []; - key = "XF86AudioRaiseVolume"; - dispatcher = "exec"; - params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+"; - } - { - flags = ["e" "l"]; - mods = []; - key = "XF86AudioLowerVolume"; - dispatcher = "exec"; - params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%-"; - } - { - flags = ["e" "l"]; - mods = ["SHIFT"]; - key = "XF86AudioRaiseVolume"; - dispatcher = "exec"; - params = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%+"; - } - { - flags = ["e" "l"]; - mods = ["SHIFT"]; - key = "XF86AudioLowerVolume"; - dispatcher = "exec"; - params = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%-"; - } - { - flags = ["e" "l"]; - mods = []; - key = "XF86AudioMute"; - dispatcher = "exec"; - params = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; - } - { - flags = ["e" "l"]; - mods = []; - key = "XF86AudioMicMute"; - dispatcher = "exec"; - params = "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; - } - { - flags = ["e" "l"]; - mods = []; - key = "XF86MonBrightnessUp"; - dispatcher = "exec"; - params = "brightnessctl s 10%+"; - } - { - flags = ["e" "l"]; - mods = []; - key = "XF86MonBrightnessDown"; - dispatcher = "exec"; - params = "brightnessctl s 10%-"; - } - { - flags = ["l"]; - mods = []; - key = "XF86AudioNext"; - dispatcher = "exec"; - params = "playerctl next"; - } - { - flags = ["l"]; - mods = []; - key = "XF86AudioPause"; - dispatcher = "exec"; - params = "playerctl play-pause"; - } - { - flags = ["l"]; - mods = []; - key = "XF86AudioPlay"; - dispatcher = "exec"; - params = "playerctl play-pause"; - } - { - flags = ["l"]; - mods = []; - key = "XF86AudioPrev"; - dispatcher = "exec"; - params = "playerctl previous"; - } - ]; + { + flags = ["e" "l"]; + mods = []; + key = "XF86AudioRaiseVolume"; + dispatcher = "exec"; + params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+"; + } + { + flags = ["e" "l"]; + mods = []; + key = "XF86AudioLowerVolume"; + dispatcher = "exec"; + params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%-"; + } + { + flags = ["e" "l"]; + mods = ["SHIFT"]; + key = "XF86AudioRaiseVolume"; + dispatcher = "exec"; + params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 1%+"; + } + { + flags = ["e" "l"]; + mods = ["SHIFT"]; + key = "XF86AudioLowerVolume"; + dispatcher = "exec"; + params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 1%-"; + } + { + flags = ["e" "l"]; + mods = []; + key = "XF86AudioMute"; + dispatcher = "exec"; + params = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + } + { + flags = ["e" "l"]; + mods = []; + key = "XF86AudioMicMute"; + dispatcher = "exec"; + params = "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; + } + { + flags = ["e" "l"]; + mods = []; + key = "XF86MonBrightnessUp"; + dispatcher = "exec"; + params = "brightnessctl s 10%+"; + } + { + flags = ["e" "l"]; + mods = []; + key = "XF86MonBrightnessDown"; + dispatcher = "exec"; + params = "brightnessctl s 10%-"; + } + { + flags = ["l"]; + mods = []; + key = "XF86AudioNext"; + dispatcher = "exec"; + params = "playerctl next"; + } + { + flags = ["l"]; + mods = []; + key = "XF86AudioPause"; + dispatcher = "exec"; + params = "playerctl play-pause"; + } + { + flags = ["l"]; + mods = []; + key = "XF86AudioPlay"; + dispatcher = "exec"; + params = "playerctl play-pause"; + } + { + flags = ["l"]; + mods = []; + key = "XF86AudioPrev"; + dispatcher = "exec"; + params = "playerctl previous"; + } + ]; + }; }; }; }