From 91654b306802d5e15676154dec8949572efff51a Mon Sep 17 00:00:00 2001 From: alexion Date: Sun, 11 Oct 2026 15:58:50 -0400 Subject: [PATCH 1/2] feat(hyprland): add remaining window actions --- .../desktop/session/hyprland/default.nix | 19 +++++++++++++++++++ configs/nixos/registry/keybind.nix | 13 +++++++++++++ 2 files changed, 32 insertions(+) diff --git a/configs/nixos/modules/desktop/session/hyprland/default.nix b/configs/nixos/modules/desktop/session/hyprland/default.nix index 5dee9af..7236346 100644 --- a/configs/nixos/modules/desktop/session/hyprland/default.nix +++ b/configs/nixos/modules/desktop/session/hyprland/default.nix @@ -93,6 +93,22 @@ } ] )) + { + hyprland-toggle-floating = { + keys = "SUPER + Space"; + action.kind = "toggle-floating"; + }; + + hyprland-toggle-fullscreen = { + keys = "SUPER + F"; + action.kind = "toggle-fullscreen"; + }; + + hyprland-close-window = { + keys = "SUPER + SHIFT + Q"; + action.kind = "close-window"; + }; + } ]; # This program integration owns the session, portals, and polkit, launched @@ -160,6 +176,9 @@ .${keybind.action.direction} ) })"; + "toggle-floating" = ''hl.dsp.window.float({ action = "toggle" })''; + "toggle-fullscreen" = "hl.dsp.window.fullscreen()"; + "close-window" = "hl.dsp.window.close()"; } .${keybind.action.kind} )) diff --git a/configs/nixos/registry/keybind.nix b/configs/nixos/registry/keybind.nix index 7abd253..fa2e1bc 100644 --- a/configs/nixos/registry/keybind.nix +++ b/configs/nixos/registry/keybind.nix @@ -23,6 +23,16 @@ && entry.value.action.direction != null && entry.value.action.workspace == null ) + || ( + builtins.elem entry.value.action.kind [ + "toggle-floating" + "toggle-fullscreen" + "close-window" + ] + && entry.value.action.command == null + && entry.value.action.direction == null + && entry.value.action.workspace == null + ) ) entries; message = "Desktop keybind actions must set the fields their kind requires."; } @@ -54,6 +64,9 @@ "focus" "move-window" "resize-window" + "toggle-floating" + "toggle-fullscreen" + "close-window" ]; }; -- 2.47.3 From 10299cec19ef51c8d63c24b98905800ec0e4bb79 Mon Sep 17 00:00:00 2001 From: alexion Date: Sun, 11 Oct 2026 16:00:38 -0400 Subject: [PATCH 2/2] refactor(hyprland): place keybind definitions after config --- .../desktop/session/hyprland/default.nix | 158 +++++++++--------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/configs/nixos/modules/desktop/session/hyprland/default.nix b/configs/nixos/modules/desktop/session/hyprland/default.nix index 7236346..2a82bb7 100644 --- a/configs/nixos/modules/desktop/session/hyprland/default.nix +++ b/configs/nixos/modules/desktop/session/hyprland/default.nix @@ -8,6 +8,85 @@ options.modules.desktop.session.hyprland.enable = lib.mkEnableOption "the Hyprland compositor"; config = lib.mkIf config.modules.desktop.session.hyprland.enable { + + # This program integration owns the session, portals, and polkit, launched + # through the universal Wayland session manager. + programs.hyprland = { + enable = true; + withUWSM = true; + }; + + home-manager.users.${config.user.name}.wayland.windowManager.hyprland = { + enable = true; + + # One package drives the whole session, so there is never a version split. + # The program integration above installs it and the portal, leaving home- + # manager to write only the config. + package = null; + portalPackage = null; + + # uwsm owns the systemd graphical-session targets. + systemd.enable = false; + + # Write the native Lua Hyprland config. Home Manager renders the Nix + # settings below as hl.* calls. + configType = "lua"; + + settings = { + config.general.layout = "dwindle"; + + bind = lib.mapAttrsToList (_name: keybind: { + _args = [ + keybind.keys + (lib.generators.mkLuaInline ( + { + exec = "hl.dsp.exec_cmd(${lib.generators.toLua { } keybind.action.command})"; + focus = "hl.dsp.focus(${ + lib.generators.toLua { } { inherit (keybind.action) direction workspace; } + })"; + "move-window" = "hl.dsp.window.move(${ + lib.generators.toLua { } { inherit (keybind.action) direction workspace; } + })"; + "resize-window" = "hl.dsp.window.resize(${ + lib.generators.toLua { } ( + { + down = { + x = 0; + y = 10; + relative = true; + }; + left = { + x = -10; + y = 0; + relative = true; + }; + right = { + x = 10; + y = 0; + relative = true; + }; + up = { + x = 0; + y = -10; + relative = true; + }; + } + .${keybind.action.direction} + ) + })"; + "toggle-floating" = ''hl.dsp.window.float({ action = "toggle" })''; + "toggle-fullscreen" = "hl.dsp.window.fullscreen()"; + "close-window" = "hl.dsp.window.close()"; + } + .${keybind.action.kind} + )) + ] + ++ lib.optional keybind.repeating { + repeating = true; + }; + }) (lib.attrByPath [ config.networking.hostName ] { } config.registry.keybind); + }; + }; registry.keybind.${config.networking.hostName} = lib.mkMerge [ # Generate numeric workspace keybinds. (lib.listToAttrs ( @@ -110,84 +189,5 @@ }; } ]; - - # This program integration owns the session, portals, and polkit, launched - # through the universal Wayland session manager. - programs.hyprland = { - enable = true; - withUWSM = true; - }; - - home-manager.users.${config.user.name}.wayland.windowManager.hyprland = { - enable = true; - - # One package drives the whole session, so there is never a version split. - # The program integration above installs it and the portal, leaving home- - # manager to write only the config. - package = null; - portalPackage = null; - - # uwsm owns the systemd graphical-session targets. - systemd.enable = false; - - # Write the native Lua Hyprland config. Home Manager renders the Nix - # settings below as hl.* calls. - configType = "lua"; - - settings = { - config.general.layout = "dwindle"; - - bind = lib.mapAttrsToList (_name: keybind: { - _args = [ - keybind.keys - (lib.generators.mkLuaInline ( - { - exec = "hl.dsp.exec_cmd(${lib.generators.toLua { } keybind.action.command})"; - focus = "hl.dsp.focus(${ - lib.generators.toLua { } { inherit (keybind.action) direction workspace; } - })"; - "move-window" = "hl.dsp.window.move(${ - lib.generators.toLua { } { inherit (keybind.action) direction workspace; } - })"; - "resize-window" = "hl.dsp.window.resize(${ - lib.generators.toLua { } ( - { - down = { - x = 0; - y = 10; - relative = true; - }; - left = { - x = -10; - y = 0; - relative = true; - }; - right = { - x = 10; - y = 0; - relative = true; - }; - up = { - x = 0; - y = -10; - relative = true; - }; - } - .${keybind.action.direction} - ) - })"; - "toggle-floating" = ''hl.dsp.window.float({ action = "toggle" })''; - "toggle-fullscreen" = "hl.dsp.window.fullscreen()"; - "close-window" = "hl.dsp.window.close()"; - } - .${keybind.action.kind} - )) - ] - ++ lib.optional keybind.repeating { - repeating = true; - }; - }) (lib.attrByPath [ config.networking.hostName ] { } config.registry.keybind); - }; - }; }; } -- 2.47.3