{ 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' pkgs 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 { "" = { # Change focus "f" = { "t" = ["focus-view" "next"]; "n" = ["focus-view" "previous"]; "" = ["focus-output" "next"]; "" = ["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"]; "" = ["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 "" = { command = mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%+"; allow_locked = true; }; "" = { command = mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%-"; allow_locked = true; }; "" = { command = mkSpawn pkgs.mpp "toggle"; allow_locked = true; }; # Mouse ">" = ["move-view"]; ">" = ["resize-view"]; # Lock screen. "" = mkSpawn pkgs.lock ""; # Screenshot "" = mkSpawn pkgs.screenshot_persistent ""; }; }