about summary refs log tree commit diff stats
path: root/modules/by-name/ri
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xmodules/by-name/ri/river/init_base.sh12
-rw-r--r--modules/by-name/ri/river/keymap.nix139
-rw-r--r--modules/by-name/ri/river/module.nix33
-rw-r--r--modules/by-name/ri/river/river-start/package.nix23
-rwxr-xr-xmodules/by-name/ri/river/river-start/river-start.sh20
5 files changed, 222 insertions, 5 deletions
diff --git a/modules/by-name/ri/river/init_base.sh b/modules/by-name/ri/river/init_base.sh
index 938b46b1..b68d147b 100755
--- a/modules/by-name/ri/river/init_base.sh
+++ b/modules/by-name/ri/river/init_base.sh
@@ -1,7 +1,17 @@
 #!/usr/bin/env sh
 
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
 # NOTE: Keep this in sync with the file from `river-start` <2025-02-03>
-RIVER_LOG_FILE="$HOME/.local/share/river/log"
+RIVER_LOG_FILE="$HOME/.cache/river/log"
 
 err_fail() {
     if ! "$@"; then
diff --git a/modules/by-name/ri/river/keymap.nix b/modules/by-name/ri/river/keymap.nix
new file mode 100644
index 00000000..052d36c3
--- /dev/null
+++ b/modules/by-name/ri/river/keymap.nix
@@ -0,0 +1,139 @@
+{
+  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: {
+    command = [
+      "spawn"
+      "${lib.getExe' pkg binaryName} ${args}"
+    ];
+
+    description = "${binaryName} ${args}";
+  };
+  mkSpawn = pkg: args: (mkSpawn' pkg pkg.meta.mainProgram args);
+
+  cfg = config.soispha.programs.river;
+in {
+  soispha.programs.river.init.mappings.keymap = lib.mkIf cfg.enable {
+    "<LEFT_SUPER>" = {
+      # 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" = mkSpawn pkgs.alacritty "";
+        "b" = mkSpawn pkgs.tskm "open select";
+        "k" = mkSpawn pkgs.keepassxc "";
+        "s" = mkSpawn pkgs.signal-desktop "";
+        "p" = mkSpawn pkgs.screenshot_persistent "";
+      };
+
+      # Client changes
+      "c" = {
+        "f" = ["toggle-fullscreen"];
+        "c" = ["close"];
+        " " = ["toggle-float"];
+        "<ENTER>" = ["zoom"];
+        "o" = ["send-to-output" "next"];
+        "t" = ["swap" "next"];
+        "n" = ["swap" "previous"];
+      };
+
+      # River compositor control.
+      "x" = {
+        "q" = ["exit"];
+        "l" = mkSpawn pkgs.lock "";
+      };
+
+      # 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;
+      };
+    };
+
+    # Audio
+    "<MEDIA_RAISEVOLUME>" =
+      (mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%+")
+      // {
+        allow_locked = true;
+      };
+    "<MEDIA_LOWERVOLUME>" =
+      (mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%-")
+      // {
+        allow_locked = true;
+      };
+    "<MEDIA_MUTEVOLUME>" =
+      (mkSpawn pkgs.mpp "toggle")
+      // {
+        allow_locked = true;
+      };
+
+    # Mouse
+    "<Meta-<MOUSE_LEFT>>" = ["move-view"];
+    "<Meta-<MOUSE_RIGHT>>" = ["resize-view"];
+
+    # Lock screen.
+    "<Meta-L>" = mkSpawn pkgs.lock "";
+
+    # Screenshot
+    "<PRINTSCREEN>" = mkSpawn pkgs.screenshot_persistent "";
+  };
+}
diff --git a/modules/by-name/ri/river/module.nix b/modules/by-name/ri/river/module.nix
index 139e8b66..4b446934 100644
--- a/modules/by-name/ri/river/module.nix
+++ b/modules/by-name/ri/river/module.nix
@@ -1,9 +1,18 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
   lib,
-  qmk_firmware,
   system,
   pkgs,
+  externalBinaries,
   ...
 }: let
   cfg = config.soispha.programs.river;
@@ -27,10 +36,22 @@
   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;
+      cp "$JSON_FILE" "$out"
+    '';
 
   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 = {
@@ -166,8 +187,12 @@ in {
     };
   };
 
+  imports = [
+    ./keymap.nix
+  ];
+
   config = lib.mkIf cfg.enable {
-    services.udev.packages = lib.mkIf cfg.unicodeInput.enable [qmk_firmware.packages.${system}.qmk_unicode_type];
+    services.udev.packages = lib.mkIf cfg.unicodeInput.enable [externalBinaries.qmk_firmware.packages.${system}.qmk_unicode_type];
 
     home-manager.users.soispha = {
       home.sessionVariables = {
@@ -184,7 +209,7 @@ in {
       };
 
       home.packages = [
-        pkgs.river-start
+        (pkgs.callPackage ./river-start/package.nix {})
       ];
 
       xdg.configFile."river/init" = {
diff --git a/modules/by-name/ri/river/river-start/package.nix b/modules/by-name/ri/river/river-start/package.nix
new file mode 100644
index 00000000..10957cc0
--- /dev/null
+++ b/modules/by-name/ri/river/river-start/package.nix
@@ -0,0 +1,23 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  writeShellApplication,
+  river,
+}:
+writeShellApplication {
+  name = "river-start";
+  text = builtins.readFile ./river-start.sh;
+  runtimeInputs = [
+    river
+  ];
+  meta = {
+    mainProgram = "river-start";
+  };
+}
diff --git a/modules/by-name/ri/river/river-start/river-start.sh b/modules/by-name/ri/river/river-start/river-start.sh
new file mode 100755
index 00000000..b4c5b0a6
--- /dev/null
+++ b/modules/by-name/ri/river/river-start/river-start.sh
@@ -0,0 +1,20 @@
+#! /usr/bin/env sh
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# NOTE: Keep this in sync with the file from `base_init.sh` <2025-02-03>
+RIVER_LOG_FILE="$HOME/.cache/river/log"
+
+[ -d "$(dirname "$RIVER_LOG_FILE")" ] || mkdir --parents "$(dirname "$RIVER_LOG_FILE")"
+
+exec river -log-level info >"$RIVER_LOG_FILE" 2>&1
+
+# vim: ft=sh