diff --git a/modules/desktop.nix b/modules/desktop.nix index dcf2d6e..c1e7181 100644 --- a/modules/desktop.nix +++ b/modules/desktop.nix @@ -4,6 +4,10 @@ with lib; let cfg = config.desktop-custom; + # Import gvariant for dconf types + mkTuple = lib.gvariant.mkTuple; + mkUint32 = lib.gvariant.mkUint32; + mkEmptyArray = lib.gvariant.mkEmptyArray; in { @@ -80,5 +84,42 @@ in environment.systemPackages = with pkgs; [ hicolor-icon-theme # Fallback icon theme ]; + + # System-level dconf configuration with lockAll to prevent overrides + # This ensures keybindings persist after suspend/resume + programs.dconf = { + enable = true; + profiles.user.databases = [{ + lockAll = true; # Prevents GNOME and extensions from changing these settings + settings = { + # Mutter keybindings - window tiling (vim-style hjkl) + "org/gnome/mutter/keybindings" = { + toggle-tiled-left = [ "h" ]; # Tile left: Super+h + toggle-tiled-right = [ "l" ]; # Tile right: Super+l + }; + + # Window manager keybindings (vim-style hjkl) + "org/gnome/desktop/wm/keybindings" = { + # Window maximize/restore + maximize = [ "k" ]; # Maximize: Super+k + unmaximize = [ "j" ]; # Restore: Super+j + + # Move window between monitors + move-to-monitor-left = [ "h" ]; # Move left: Super+Shift+h + move-to-monitor-right = [ "l" ]; # Move right: Super+Shift+l + move-to-monitor-up = [ "k" ]; # Move up: Super+Shift+k + move-to-monitor-down = [ "j" ]; # Move down: Super+Shift+j + + # Disable conflicting keybindings + minimize = mkEmptyArray "s"; # Disable Super+h conflict (was minimize window) + }; + + # Disable screen lock on Super+L to free it for tiling right + "org/gnome/settings-daemon/plugins/media-keys" = { + screensaver = mkEmptyArray "s"; # Remove Super+L screen lock binding + }; + }; + }]; + }; }; } diff --git a/modules/gnome.nix b/modules/gnome.nix index 0691d1c..52ce5ec 100644 --- a/modules/gnome.nix +++ b/modules/gnome.nix @@ -120,27 +120,9 @@ in tile-bottomright-quarter = [ "g" ]; # Bottom-right: Super+G }; - # Mutter keybindings - window tiling (vim-style hjkl) - "org/gnome/mutter/keybindings" = { - toggle-tiled-left = [ "h" ]; # Tile left: Super+h (replaces Super+Left) - toggle-tiled-right = [ "l" ]; # Tile right: Super+l (replaces Super+Right) - }; - - # Window manager keybindings (vim-style hjkl) - "org/gnome/desktop/wm/keybindings" = { - # Window maximize/restore - maximize = [ "k" ]; # Maximize: Super+k (replaces Super+Up) - unmaximize = [ "j" ]; # Restore: Super+j (replaces Super+Down) - - # Move window between monitors - move-to-monitor-left = [ "h" ]; # Move left: Super+Shift+h - move-to-monitor-right = [ "l" ]; # Move right: Super+Shift+l - move-to-monitor-up = [ "k" ]; # Move up: Super+Shift+k - move-to-monitor-down = [ "j" ]; # Move down: Super+Shift+j - - # Disable conflicting keybindings - minimize = []; # Disable Super+h conflict - }; + # NOTE: vim-style hjkl keybindings (Super+h/j/k/l) are configured at the + # system level in desktop.nix with lockAll = true to prevent them from + # being overridden after suspend/resume or by GNOME extensions };