diff options
author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-06-29 10:59:57 +0200 |
---|---|---|
committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-06-29 10:59:57 +0200 |
commit | 00a9fb7587b76b3f86c6515d6bea138a78eac096 (patch) | |
tree | aea91c4bba0b67f204bd26b0f109f958576ba1c2 /modules/by-name | |
parent | pkgs/river-mk-keymap: Don't emit duplicate key mappings (diff) | |
download | nixos-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-- | modules/by-name/ri/river/keymap.nix | 127 | ||||
-rw-r--r-- | modules/by-name/ri/river/module.nix | 17 |
2 files changed, 143 insertions, 1 deletions
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]; |