feat: hyprland gestures

This commit is contained in:
KoenDR06 2025-12-04 18:08:06 +01:00
parent c264999fb4
commit dcfc21469b
4 changed files with 550 additions and 484 deletions

View file

@ -27,6 +27,8 @@ in {
}") }")
hypr.keybindings.binds)} hypr.keybindings.binds)}
${concatStringsSep "\n" (map (gs: toString gs) hypr.gestures.gestures)}
${concatStringsSep "\n\n" (map (sm: '' ${concatStringsSep "\n\n" (map (sm: ''
bind${concatStringsSep "" sm.enterBind.flags} = ${concatStringsSep " " sm.enterBind.mods}, ${sm.enterBind.key}, submap, ${sm.name} bind${concatStringsSep "" sm.enterBind.flags} = ${concatStringsSep " " sm.enterBind.mods}, ${sm.enterBind.key}, submap, ${sm.name}
submap = ${sm.name} submap = ${sm.name}

View file

@ -1,5 +1,6 @@
{...}: { {...}: {
imports = [ imports = [
./standard-options.nix ./standard-options.nix
./gestures.nix
]; ];
} }

61
lib/hyprland/gestures.nix Normal file
View file

@ -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;
};
};
}

View file

@ -7,504 +7,506 @@
cfg = config.horseman.wm.hyprland; cfg = config.horseman.wm.hyprland;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
horseman.wm.hyprland.config.keybindings = { horseman.wm.hyprland.config = {
submaps = [ keybindings = {
{ submaps = [
name = "disable-all"; {
enterBind = { 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"]; flags = ["o"];
mods = ["SUPER"]; mods = ["SUPER"];
key = "ESCAPE"; key = "L";
}; dispatcher = "exec";
exitBind = { params = "hyprlock";
flags = ["o"]; }
{
flags = ["e"];
mods = ["SUPER"]; 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 = [];
flags = []; mods = ["SUPER"];
mods = ["SUPER"]; key = "P";
key = "SPACE"; dispatcher = "pin";
dispatcher = "exec"; params = "";
params = "pkill wofi || wofi -i -S drun -M multi-contains"; }
} {
flags = [];
mods = ["SUPER" "SHIFT"];
key = "S";
dispatcher = "exec";
params = "hyprshot -m region --clipboard-only";
}
{ {
flags = []; flags = [];
mods = ["SUPER"]; mods = ["SUPER"];
key = "B"; key = "H";
dispatcher = "exec"; dispatcher = "movefocus";
params = "pkill waybar || waybar"; 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 = []; flags = [];
mods = ["SUPER"]; mods = ["SUPER" "SHIFT"];
key = "RETURN"; key = "H";
dispatcher = "exec"; dispatcher = "movewindow";
params = "kitty"; 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 = []; flags = ["e"];
mods = ["SUPER"]; mods = ["SUPER"];
key = "Q"; key = "Left";
dispatcher = "killactive"; dispatcher = "moveactive";
params = ""; 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 = []; flags = ["e"];
mods = []; mods = ["SUPER" "SHIFT"];
key = "F11"; key = "Left";
dispatcher = "fullscreen"; dispatcher = "resizeactive";
params = ""; params = "-50 0";
} }
{ {
flags = ["o"]; flags = ["e"];
mods = ["SUPER"]; mods = ["SUPER" "SHIFT"];
key = "L"; key = "Right";
dispatcher = "exec"; dispatcher = "resizeactive";
params = "hyprlock"; params = "50 0";
} }
{ {
flags = ["e"]; flags = ["e"];
mods = ["SUPER"]; mods = ["SUPER" "SHIFT"];
key = "TAB"; key = "Up";
dispatcher = "changegroupactive"; dispatcher = "resizeactive";
params = "f"; params = "0 -50";
} }
{
flags = ["e"];
mods = ["SUPER" "SHIFT"];
key = "Down";
dispatcher = "resizeactive";
params = "0 50";
}
{ {
flags = ["e"]; flags = [];
mods = ["SUPER" "SHIFT"]; mods = ["SUPER"];
key = "TAB"; key = "grave";
dispatcher = "changegroupactive"; dispatcher = "togglespecialworkspace";
params = "b"; params = "";
} }
{ {
flags = []; flags = [];
mods = ["SUPER"]; mods = ["SUPER"];
key = "F"; key = "1";
dispatcher = "togglefloating"; dispatcher = "workspace";
params = ""; params = "1";
} }
{ {
flags = []; flags = [];
mods = ["SUPER"]; mods = ["SUPER"];
key = "T"; key = "2";
dispatcher = "togglegroup"; dispatcher = "workspace";
params = ""; 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 = []; flags = [];
mods = ["SUPER"]; mods = ["SUPER" "SHIFT"];
key = "P"; key = "grave";
dispatcher = "pin"; dispatcher = "movetoworkspace";
params = ""; params = "special";
} }
{ {
flags = []; flags = [];
mods = ["SUPER" "SHIFT"]; mods = ["SUPER" "SHIFT"];
key = "S"; key = "1";
dispatcher = "exec"; dispatcher = "movetoworkspace";
params = "hyprshot -m region --clipboard-only"; 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 = []; flags = ["e"];
mods = ["SUPER"]; mods = ["SUPER" "CONTROL"];
key = "H"; key = "Right";
dispatcher = "movefocus"; dispatcher = "workspace";
params = "l"; params = "e+1";
} }
{ {
flags = []; flags = ["e"];
mods = ["SUPER"]; mods = ["SUPER" "CONTROL"];
key = "L"; key = "Left";
dispatcher = "movefocus"; dispatcher = "workspace";
params = "r"; params = "e-1";
} }
{
flags = [];
mods = ["SUPER"];
key = "K";
dispatcher = "movefocus";
params = "u";
}
{
flags = [];
mods = ["SUPER"];
key = "J";
dispatcher = "movefocus";
params = "d";
}
{ {
flags = []; flags = ["m"];
mods = ["SUPER" "SHIFT"]; mods = ["SUPER"];
key = "H"; key = "mouse:272";
dispatcher = "movewindow"; dispatcher = "movewindow";
params = "l"; params = "";
} }
{ {
flags = []; flags = ["m"];
mods = ["SUPER" "SHIFT"]; mods = ["SUPER" "SHIFT"];
key = "L"; key = "mouse:272";
dispatcher = "movewindow"; dispatcher = "resizewindow";
params = "r"; params = "";
} }
{
flags = [];
mods = ["SUPER" "SHIFT"];
key = "K";
dispatcher = "movewindow";
params = "u";
}
{
flags = [];
mods = ["SUPER" "SHIFT"];
key = "J";
dispatcher = "movewindow";
params = "d";
}
{ {
flags = ["e"]; flags = ["e" "l"];
mods = ["SUPER"]; mods = [];
key = "Left"; key = "XF86AudioRaiseVolume";
dispatcher = "moveactive"; dispatcher = "exec";
params = "-50 0"; params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+";
} }
{ {
flags = ["e"]; flags = ["e" "l"];
mods = ["SUPER"]; mods = [];
key = "Right"; key = "XF86AudioLowerVolume";
dispatcher = "moveactive"; dispatcher = "exec";
params = "50 0"; params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%-";
} }
{ {
flags = ["e"]; flags = ["e" "l"];
mods = ["SUPER"]; mods = ["SHIFT"];
key = "Up"; key = "XF86AudioRaiseVolume";
dispatcher = "moveactive"; dispatcher = "exec";
params = "0 -50"; params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 1%+";
} }
{ {
flags = ["e"]; flags = ["e" "l"];
mods = ["SUPER"]; mods = ["SHIFT"];
key = "Down"; key = "XF86AudioLowerVolume";
dispatcher = "moveactive"; dispatcher = "exec";
params = "0 50"; params = "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 1%-";
} }
{
{ flags = ["e" "l"];
flags = ["e"]; mods = [];
mods = ["SUPER" "SHIFT"]; key = "XF86AudioMute";
key = "Left"; dispatcher = "exec";
dispatcher = "resizeactive"; params = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
params = "-50 0"; }
} {
{ flags = ["e" "l"];
flags = ["e"]; mods = [];
mods = ["SUPER" "SHIFT"]; key = "XF86AudioMicMute";
key = "Right"; dispatcher = "exec";
dispatcher = "resizeactive"; params = "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle";
params = "50 0"; }
} {
{ flags = ["e" "l"];
flags = ["e"]; mods = [];
mods = ["SUPER" "SHIFT"]; key = "XF86MonBrightnessUp";
key = "Up"; dispatcher = "exec";
dispatcher = "resizeactive"; params = "brightnessctl s 10%+";
params = "0 -50"; }
} {
{ flags = ["e" "l"];
flags = ["e"]; mods = [];
mods = ["SUPER" "SHIFT"]; key = "XF86MonBrightnessDown";
key = "Down"; dispatcher = "exec";
dispatcher = "resizeactive"; params = "brightnessctl s 10%-";
params = "0 50"; }
} {
flags = ["l"];
{ mods = [];
flags = []; key = "XF86AudioNext";
mods = ["SUPER"]; dispatcher = "exec";
key = "grave"; params = "playerctl next";
dispatcher = "togglespecialworkspace"; }
params = ""; {
} flags = ["l"];
{ mods = [];
flags = []; key = "XF86AudioPause";
mods = ["SUPER"]; dispatcher = "exec";
key = "1"; params = "playerctl play-pause";
dispatcher = "workspace"; }
params = "1"; {
} flags = ["l"];
{ mods = [];
flags = []; key = "XF86AudioPlay";
mods = ["SUPER"]; dispatcher = "exec";
key = "2"; params = "playerctl play-pause";
dispatcher = "workspace"; }
params = "2"; {
} flags = ["l"];
{ mods = [];
flags = []; key = "XF86AudioPrev";
mods = ["SUPER"]; dispatcher = "exec";
key = "3"; params = "playerctl previous";
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";
}
];
}; };
}; };
} }