about summary refs log tree commit diff stats
path: root/modules/by-name/ri/river/keymap.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/by-name/ri/river/keymap.nix')
-rw-r--r--modules/by-name/ri/river/keymap.nix143
1 files changed, 143 insertions, 0 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..d1266576
--- /dev/null
+++ b/modules/by-name/ri/river/keymap.nix
@@ -0,0 +1,143 @@
+{
+  lib,
+  pkgs,
+  libraries,
+  config,
+  ...
+}: let
+  index2tag = input: builtins.toString (libraries.base.pow 2 (input - 1));
+
+  mkTagCommand = name: index: [name (index2tag index)];
+  mkSpawn' = pkg: binaryName: args: further: (further
+    // {
+      command = [
+        "spawn"
+        "${lib.getExe' pkg binaryName} ${args}"
+      ];
+
+      description = "${binaryName} ${args}";
+    });
+
+  mkSpawn = pkg: args: further: (mkSpawn' pkg pkg.meta.mainProgram args further);
+
+  cfg = config.soispha.programs.river;
+
+  coreKeymap = {
+    # Change focus
+    "f" = {
+      "t" = ["focus-view" "next"];
+      "n" = ["focus-view" "previous"];
+      "T" = ["focus-output" "next"];
+      "N" = ["focus-output" "previous"];
+    };
+
+    # Spawn standard programs
+    "r" = {
+      "a" = mkSpawn pkgs.alacritty "" {};
+      "b" = mkSpawn pkgs.tskm "open select" {once = true;};
+      "k" = mkSpawn pkgs.keepassxc "" {once = true;};
+      "s" = mkSpawn pkgs.signal-desktop "" {once = true;};
+      "p" = mkSpawn pkgs.screenshot_persistent "" {once = true;};
+    };
+
+    # Client changes
+    "c" = {
+      "f" = ["toggle-fullscreen"];
+      "c" = ["close"];
+      " " = ["toggle-float"];
+      "<ENTER>" = ["zoom"];
+      "o" = ["send-to-output" "next"];
+      "t" = ["swap" "next"];
+      "n" = ["swap" "previous"];
+    };
+
+    # This is a fill in for <Super-L>, as that is otherwise impossible to input.
+    "l" = coreKeymap.x.l;
+
+    # River compositor control.
+    "x" = {
+      "q" = ["exit"];
+      "l" = mkSpawn pkgs.lock "" {once = true;};
+    };
+
+    # Media control
+    "m" = {
+      "r" = mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%+" {};
+      "l" = mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%-" {};
+      "m" = mkSpawn 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" = mkTagCommand "set-view-tags" 1;
+      "2" = mkTagCommand "set-view-tags" 2;
+      "3" = mkTagCommand "set-view-tags" 3;
+      "4" = mkTagCommand "set-view-tags" 4;
+      "5" = mkTagCommand "set-view-tags" 5;
+      "6" = mkTagCommand "set-view-tags" 6;
+      "7" = mkTagCommand "set-view-tags" 7;
+      "8" = mkTagCommand "set-view-tags" 8;
+      "9" = mkTagCommand "set-view-tags" 9;
+
+      # Add tags to view.
+      "a" = {
+        "1" = mkTagCommand "toggle-view-tags" 1;
+        "2" = mkTagCommand "toggle-view-tags" 2;
+        "3" = mkTagCommand "toggle-view-tags" 3;
+        "4" = mkTagCommand "toggle-view-tags" 4;
+        "5" = mkTagCommand "toggle-view-tags" 5;
+        "6" = mkTagCommand "toggle-view-tags" 6;
+        "7" = mkTagCommand "toggle-view-tags" 7;
+        "8" = mkTagCommand "toggle-view-tags" 8;
+        "9" = mkTagCommand "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" = mkTagCommand "set-focused-tags" 1;
+      "2" = mkTagCommand "set-focused-tags" 2;
+      "3" = mkTagCommand "set-focused-tags" 3;
+      "4" = mkTagCommand "set-focused-tags" 4;
+      "5" = mkTagCommand "set-focused-tags" 5;
+      "6" = mkTagCommand "set-focused-tags" 6;
+      "7" = mkTagCommand "set-focused-tags" 7;
+      "8" = mkTagCommand "set-focused-tags" 8;
+      "9" = mkTagCommand "set-focused-tags" 9;
+    };
+  };
+in {
+  soispha.programs.river.init.mappings.keymap = lib.mkIf cfg.enable {
+    "<LEFT_SUPER>" = coreKeymap;
+
+    # Audio
+    "<MEDIA_RAISEVOLUME>" =
+      coreKeymap.m.r
+      // {
+        allow_locked = true;
+      };
+    "<MEDIA_LOWERVOLUME>" =
+      coreKeymap.m.l
+      // {
+        allow_locked = true;
+      };
+    "<MEDIA_MUTEVOLUME>" =
+      coreKeymap.m.m
+      // {
+        allow_locked = true;
+      };
+
+    # Mouse
+    "<Meta-<MOUSE_LEFT>>" = ["move-view"];
+    "<Meta-<MOUSE_RIGHT>>" = ["resize-view"];
+
+    # Screenshot
+    "<PRINTSCREEN>" = coreKeymap.r.p;
+  };
+}