about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-06-29 10:59:57 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-06-29 10:59:57 +0200
commit00a9fb7587b76b3f86c6515d6bea138a78eac096 (patch)
treeaea91c4bba0b67f204bd26b0f109f958576ba1c2
parentpkgs/river-mk-keymap: Don't emit duplicate key mappings (diff)
downloadnixos-config-00a9fb7587b76b3f86c6515d6bea138a78eac096.zip
modules/river: Use the same keymap for both tiamat and apzu
This avoids bit-rot in apzu's key mappings and maybe helps me to
actually learn all the possible key mappings.
Diffstat (limited to '')
-rw-r--r--hosts/by-name/apzu/configuration.nix72
-rw-r--r--hosts/by-name/tiamat/configuration.nix92
-rw-r--r--modules/by-name/ri/river/keymap.nix127
-rw-r--r--modules/by-name/ri/river/module.nix17
4 files changed, 150 insertions, 158 deletions
diff --git a/hosts/by-name/apzu/configuration.nix b/hosts/by-name/apzu/configuration.nix
index d4aad0f9..4464011e 100644
--- a/hosts/by-name/apzu/configuration.nix
+++ b/hosts/by-name/apzu/configuration.nix
@@ -39,78 +39,6 @@
       river.init = {
         mappings = {
           layout = "dvorak-modified";
-          keymap =
-            {
-              # Focus change
-              "<Meta-T>" = {command = ["focus-view" "next"];};
-              "<Meta-N>" = {command = ["focus-view" "previous"];};
-              "<Meta+Ctrl-T>" = {command = ["focus-output" "next"];};
-              "<Meta+Ctrl-N>" = {command = ["focus-output" "previous"];};
-
-              # Standard programs
-              "<Meta-<ENTER>>" = {command = ["spawn" "${lib.getExe pkgs.alacritty}"];};
-              "<Meta+Shift-q>" = {command = ["exit"];};
-              "<Meta-L>" = {command = ["spawn" "${lib.getExe pkgs.lock}"];};
-
-              # Screenshot
-              "<PRINTSCREEN>" = {command = ["spawn" "${lib.getExe pkgs.screenshot_persistent}"];};
-
-              # Audio
-              "<MEDIA_RAISEVOLUME>" = {
-                command = ["spawn" "${lib.getExe' pkgs.wireplumber "wpctl"} set-volume @DEFAULT_SINK@ 5%+"];
-                modes = ["normal" "locked"];
-              };
-              "<MEDIA_LOWERVOLUME>" = {
-                command = ["spawn" "${lib.getExe' pkgs.wireplumber "wpctl"} set-volume @DEFAULT_SINK@ 5%-"];
-                modes = ["normal" "locked"];
-              };
-              "<MEDIA_MUTEVOLUME>" = {
-                command = ["spawn" "${lib.getExe pkgs.mpp} toggle"];
-                modes = ["normal" "locked"];
-              };
-
-              # Launcher
-              "<Meta-R>" = {command = ["spawn" "${lib.getExe pkgs.rofi} -show combi -modes combi -combi-modes 'window, drun, run' -show-icons"];};
-              "<Meta-<F1>>" = {command = ["spawn" "${lib.getExe pkgs.tskm} open select"];};
-              "<Meta-<F2>>" = {command = ["spawn" "${lib.getExe pkgs.keepassxc}"];};
-              "<Meta-<F3>>" = {command = ["spawn" "${lib.getExe pkgs.signal-desktop}"];};
-              # "<Meta-<F4>>" = {command = ["spawn" "${lib.getExe pkgs.steam}"];};
-
-              # Client
-              "<Meta-f>" = {command = ["toggle-fullscreen"];};
-              "<Meta+Shift-c>" = {command = ["close"];};
-              "<Meta+Ctrl- >" = {command = ["toggle-float"];};
-              "<Meta+Ctrl-<ENTER>>" = {command = ["zoom"];};
-              "<Meta-o>" = {command = ["send-to-output" "next"];};
-              "<Meta+Shift-T>" = {command = ["swap" "next"];};
-              "<Meta+Shift-N>" = {command = ["swap" "previous"];};
-
-              # Toggle all tags
-              "<Meta-0>" = {command = ["set-focused-tags" (builtins.toString ((baseLib.pow 2 32) - 1))];};
-              "<Meta+Shift-0>" = {command = ["set-view-tags" (builtins.toString ((baseLib.pow 2 32) - 1))];};
-
-              # Mouse
-              "<Meta-<MOUSE_LEFT>>" = {
-                command = ["move-view"];
-                map_mode = "MapMouse";
-              };
-              "<Meta-<MOUSE_RIGHT>>" = {
-                command = ["resize-view"];
-                map_mode = "MapMouse";
-              };
-            }
-            // (
-              builtins.foldl' (acc: elem: acc // elem) {} (
-                builtins.map (index: let
-                  num = builtins.toString index;
-                  index2tag = input: builtins.toString (baseLib.pow 2 (input - 1));
-                in {
-                  "<Meta-${num}>" = {command = ["set-focused-tags" (index2tag index)];};
-                  "<Meta+Shift-${num}>" = {command = ["set-view-tags" (index2tag index)];};
-                  "<Meta+Shift+Ctrl-${num}>" = {command = ["toggle-view-tags" (index2tag index)];};
-                }) (builtins.genList (i: i + 1) 9)
-              )
-            );
         };
         screenSetupCode = {};
       };
diff --git a/hosts/by-name/tiamat/configuration.nix b/hosts/by-name/tiamat/configuration.nix
index efb77b96..18393543 100644
--- a/hosts/by-name/tiamat/configuration.nix
+++ b/hosts/by-name/tiamat/configuration.nix
@@ -46,91 +46,13 @@
         init = {
           mappings = {
             layout = "us";
-            keymap = let
-              map = key: "<Alt+Ctrl+Meta+Shift-${key}>";
-            in
-              (lib.mapAttrs' (name: value: lib.nameValuePair (map name) value) {
-                # Movement
-                "A" = {command = ["exit"];};
-                "B" = {command = ["close"];};
-
-                "C" = {command = ["focus-view" "previous"];};
-                "D" = {command = ["focus-view" "next"];};
-
-                "E" = {command = ["swap" "previous"];};
-                "F" = {command = ["swap" "next"];};
-
-                "G" = {command = ["zoom"];};
-
-                "H" = {command = ["toggle-fullscreen"];};
-                "I" = {command = ["toggle-float"];};
-
-                "J" = {command = ["send-to-output" "next"];};
-
-                "K" = {command = ["spawn" "${lib.getExe pkgs.alacritty}"];};
-                "L" = {command = ["spawn" "${lib.getExe pkgs.screenshot_persistent}"];};
-
-                # Audio
-                # "M" = {command = ["spawn" "video-pause toggle"]; modes = ["normal" "locked"]; };
-                "N" = {
-                  command = ["spawn" "${lib.getExe pkgs.mpp} toggle"];
-                  modes = ["normal" "locked"];
-                };
-
-                # Launcher
-                "O" = {command = ["spawn" "${lib.getExe pkgs.rofi} -show combi -modes combi -combi-modes 'window,drun,run' -show-icons"];};
-                "P" = {command = ["spawn" "${lib.getExe pkgs.tskm} open select"];};
-                "Q" = {command = ["spawn" "${lib.getExe pkgs.keepassxc}"];};
-                # "R" = {command = ["spawn" "nheko"];};
-                "S" = {command = ["spawn" "${lib.getExe pkgs.signal-desktop}"];};
-                "T" = {command = ["spawn" "${lib.getExe pkgs.lock}"];};
-
-                "U" = {command = ["focus-output" "next"];};
-                "V" = {command = ["focus-previous-tags"];};
-                "W" = {command = ["send-to-previous-tags"];};
-                # "X" = {command = ["spawn" "bemenu-run"];};
-                # "Y" = {command = ["spawn" "bemenu-run"];};
-
-                # Toggle all tags
-                "0" = {command = ["set-focused-tags" "${builtins.toString ((libraries.base.pow 2 32) - 1)}"];};
-
-                # Support Unicode input
-                "Z" = {command = ["spawn" "${lib.getExe externalBinaries.qmk_firmware.packages.${system}.qmk_unicode_type} 106 65377"];};
-              })
-              // ({
-                  # TODO: add toggle-focus mapping
-
-                  # Toggle all tags
-                  "<Alt+Ctrl+Shift-0>" = {
-                    command = [
-                      "set-view-tags"
-                      "${builtins.toString
-                        ((libraries.base.pow 2 32) - 1)}"
-                    ];
-                  };
-
-                  # Mouse
-                  "<Meta-<MOUSE_LEFT>>" = {
-                    command = ["move-view"];
-                    map_mode = "MapMouse";
-                  };
-                  "<Meta-<MOUSE_RIGHT>>" = {
-                    command = ["resize-view"];
-                    map_mode = "MapMouse";
-                  };
-                }
-                // (
-                  builtins.foldl' (acc: elem: acc // elem) {} (
-                    builtins.map (index: let
-                      num = builtins.toString index;
-                      index2tag = input: builtins.toString (libraries.base.pow 2 (input - 1));
-                    in {
-                      "${map num}" = {command = ["set-focused-tags" (index2tag index)];};
-                      "<Alt+Ctrl+Shift-${num}>" = {command = ["set-view-tags" (index2tag index)];};
-                      # "<Super+Shift+Ctrl-${num}>" = {command = ["toggle-view-tags" (index2tag index)];};
-                    }) (builtins.genList (i: i + 1) 9)
-                  )
-                ));
+            keymap = {
+              # Support Unicode input
+              "<Alt+Ctrl+Meta+Shift-Z>" = [
+                "spawn"
+                "${lib.getExe externalBinaries.qmk_firmware.packages.${system}.qmk_unicode_type} 106 65377"
+              ];
+            };
           };
           screenSetupCode = {
             "DP-2" = {pos = "2560,0";};
diff --git a/modules/by-name/ri/river/keymap.nix b/modules/by-name/ri/river/keymap.nix
new file mode 100644
index 00000000..420db61a
--- /dev/null
+++ b/modules/by-name/ri/river/keymap.nix
@@ -0,0 +1,127 @@
+{
+  lib,
+  pkgs,
+  libraries,
+  config,
+  ...
+}: let
+  index2tag = input: builtins.toString (libraries.base.pow 2 (input - 1));
+
+  mkCommand = name: index: [name (index2tag index)];
+
+  cfg = config.soispha.programs.river;
+in {
+  soispha.programs.river.init.mappings.keymap = lib.mkIf cfg.enable {
+    "<SUPER_LEFT>" = {
+      # Change focus
+      "f" = {
+        "t" = ["focus-view" "next"];
+        "n" = ["focus-view" "previous"];
+        "<Ctrl-t>" = ["focus-output" "next"];
+        "<Ctrl-n>" = ["focus-output" "previous"];
+      };
+
+      # Spawn standard programs
+      "r" = {
+        "a" = ["spawn" "${lib.getExe pkgs.alacritty}"];
+        "b" = ["spawn" "${lib.getExe pkgs.tskm} open select"];
+        "k" = ["spawn" "${lib.getExe pkgs.keepassxc}"];
+        "s" = ["spawn" "${lib.getExe pkgs.signal-desktop}"];
+        "p" = ["spawn" "${lib.getExe pkgs.screenshot_persistent}"];
+      };
+
+      # Client changes
+      "c" = {
+        "f" = ["toggle-fullscreen"];
+        "c" = ["close"];
+        "<SPACE>" = ["toggle-float"];
+        "<ENTER>" = ["zoom"];
+        "o" = ["send-to-output" "next"];
+        "t" = ["swap" "next"];
+        "n" = ["swap" "previous"];
+      };
+
+      # River compositor control.
+      "x" = {
+        "q" = ["exit"];
+        "l" = ["spawn" "${lib.getExe pkgs.lock}"];
+      };
+
+      # Media control
+      "m" = {
+        "r" = ["spawn" "${lib.getExe' pkgs.wireplumber "wpctl"} set-volume @DEFAULT_SINK@ 5%+"];
+        "l" = ["spawn" "${lib.getExe' pkgs.wireplumber "wpctl"} set-volume @DEFAULT_SINK@ 5%-"];
+        "m" = ["spawn" "${lib.getExe pkgs.mpp} toggle"];
+      };
+
+      # Select tags to view.
+      "v" = {
+        "0" = ["set-view-tags" (builtins.toString ((libraries.base.pow 2 32) - 1))];
+        "p" = ["send-to-previous-tags"];
+
+        "1" = mkCommand "set-view-tags" 1;
+        "2" = mkCommand "set-view-tags" 2;
+        "3" = mkCommand "set-view-tags" 3;
+        "4" = mkCommand "set-view-tags" 4;
+        "5" = mkCommand "set-view-tags" 5;
+        "6" = mkCommand "set-view-tags" 6;
+        "7" = mkCommand "set-view-tags" 7;
+        "8" = mkCommand "set-view-tags" 8;
+        "9" = mkCommand "set-view-tags" 9;
+
+        # Add tags to view.
+        "a" = {
+          "1" = mkCommand "toggle-view-tags" 1;
+          "2" = mkCommand "toggle-view-tags" 2;
+          "3" = mkCommand "toggle-view-tags" 3;
+          "4" = mkCommand "toggle-view-tags" 4;
+          "5" = mkCommand "toggle-view-tags" 5;
+          "6" = mkCommand "toggle-view-tags" 6;
+          "7" = mkCommand "toggle-view-tags" 7;
+          "8" = mkCommand "toggle-view-tags" 8;
+          "9" = mkCommand "toggle-view-tags" 9;
+        };
+      };
+
+      # Select tags to focus.
+      "f" = {
+        "0" = ["set-focused-tags" (builtins.toString ((libraries.base.pow 2 32) - 1))];
+        "p" = ["focus-previous-tags"];
+
+        "1" = mkCommand "set-focused-tags" 1;
+        "2" = mkCommand "set-focused-tags" 2;
+        "3" = mkCommand "set-focused-tags" 3;
+        "4" = mkCommand "set-focused-tags" 4;
+        "5" = mkCommand "set-focused-tags" 5;
+        "6" = mkCommand "set-focused-tags" 6;
+        "7" = mkCommand "set-focused-tags" 7;
+        "8" = mkCommand "set-focused-tags" 8;
+        "9" = mkCommand "set-focused-tags" 9;
+      };
+    };
+
+    # Audio
+    "<MEDIA_RAISEVOLUME>" = {
+      command = ["spawn" "${lib.getExe' pkgs.wireplumber "wpctl"} set-volume @DEFAULT_SINK@ 5%+"];
+      allow_locked = true;
+    };
+    "<MEDIA_LOWERVOLUME>" = {
+      command = ["spawn" "${lib.getExe' pkgs.wireplumber "wpctl"} set-volume @DEFAULT_SINK@ 5%-"];
+      allow_locked = true;
+    };
+    "<MEDIA_MUTEVOLUME>" = {
+      command = ["spawn" "${lib.getExe pkgs.mpp} toggle"];
+      allow_locked = true;
+    };
+
+    # Mouse
+    "<Meta-<MOUSE_LEFT>>" = ["move-view"];
+    "<Meta-<MOUSE_RIGHT>>" = ["resize-view"];
+
+    # Lock screen.
+    "<Meta-L>" = ["spawn" "${lib.getExe pkgs.lock}"];
+
+    # Screenshot
+    "<PRINTSCREEN>" = ["spawn" "${lib.getExe pkgs.screenshot_persistent}"];
+  };
+}
diff --git a/modules/by-name/ri/river/module.nix b/modules/by-name/ri/river/module.nix
index 38d4bdef..ed7eb363 100644
--- a/modules/by-name/ri/river/module.nix
+++ b/modules/by-name/ri/river/module.nix
@@ -36,10 +36,21 @@
   longRunningPrograms = builtins.concatStringsSep "\n" (builtins.map mkLrProgram cfg.init.backgroundStart);
 
   keymapFormat = pkgs.formats.json {};
+  keymapGenerate = name: value:
+    pkgs.runCommandLocal "mk-${name}-and-check" {
+      nativeBuildInputs = [pkgs.river-mk-keymap];
+      preferLocalBuild = true;
+
+      env = {
+        JSON_FILE = keymapFormat.generate name value;
+      };
+    } ''
+      river-mk-keymap --keymap "$JSON_FILE" init --dry-run
+    '';
 
   keymappings = ''
     err_fail ${riverctl} keyboard-layout ${esa cfg.init.mappings.layout}
-    err_fail ${lib.getExe pkgs.river-mk-keymap} ${keymapFormat.generate "keys.json" cfg.init.mappings.keymap}
+    err_fail ${lib.getExe pkgs.river-mk-keymap} ${keymapGenerate "keys.json" cfg.init.mappings.keymap}
   '';
 
   mkRule = {
@@ -175,6 +186,10 @@ in {
     };
   };
 
+  imports = [
+    ./keymap.nix
+  ];
+
   config = lib.mkIf cfg.enable {
     services.udev.packages = lib.mkIf cfg.unicodeInput.enable [externalBinaries.qmk_firmware.packages.${system}.qmk_unicode_type];