{ config, pkgs, lib, ... }: let cfg = config.local.window-manager.river; pow = n: exp: if exp == 1 then n else if exp == 0 then 1 else n * pow n (exp - 1); tile-cmd = c: ''send-layout-cmd rivertile "${c}"''; in { options.local.window-manager.river = with lib; { enable = mkEnableOption "river window manager"; }; config = lib.mkIf cfg.enable { home.packages = with pkgs.unstable; [ wl-clipboard dmenu-wayland ]; wayland.windowManager.river = { enable = true; package = pkgs.unstable.river; systemd.enable = true; xwayland.enable = true; settings = { background-color = "0x002b36"; border-color-focused = "0x93a1a1"; border-color-unfocused = "0x586e75"; default-attach-mode = "below"; focus-follows-cursor = "disabled"; hide-cursor = "when-typing enabled"; set-repeat = "35 200"; map.normal = lib.mkMerge (lib.flatten [ { "Alt+Shift Return" = "spawn foot"; "Alt+Shift B" = "spawn librewolf"; "Alt P" = "spawn dmenu-wl_run"; "Alt Space" = "toggle-fullscreen"; "Super+Shift C" = "close"; # system "Super L" = "spawn waylock"; "Super+Shift Q" = "exit"; } (lib.flip lib.mapAttrsToList { K = "previous"; J = "next"; } (k: d: { # focus window "Alt ${k}" = "focus-view ${d}"; # swap windows "Alt+Shift ${k}" = "swap ${d}"; } )) # decrease/increase the main ration { "Alt H" = tile-cmd "main-ratio -0.01"; "Alt L" = tile-cmd "main-ratio +0.01"; "Alt Comma" = tile-cmd "main-count +1"; "Alt Period" = tile-cmd "main-count -1"; } (lib.flip map [ 1 2 3 4 5 6 7 8 9 ] (i: let wid = i - 1; in let wtag = pow 2 wid; in { "Alt ${toString i}" = "set-focused-tags ${toString wtag}"; # set-view-tags ${wtag} # toggle-focused-tags ${wtag} # toggle-view-tags ${wtag} } )) ]); }; extraConfig = ( let kb = config.home.keyboard; in '' riverctl keyboard-layout \ -model ${kb.model} \ -variant ${kb.variant} \ -options ${lib.head kb.options} \ ${kb.layout} riverctl default-layout rivertile rivertile \ -main-location top \ -view-padding 6 \ -outer-padding 6 \ & '' ); }; }; }