{ config, pkgs, lib, osConfig, ... }: let inherit (lib) getExe getExe'; DISPLAY = ":1"; bash = getExe pkgs.bash; swaylock = getExe pkgs.swaylock-effects; fuzzel = getExe pkgs.fuzzel; wpctl = getExe' pkgs.wireplumber "wpctl"; waybar = getExe pkgs.waybar; swaync = getExe pkgs.swaynotificationcenter; swaybg = getExe pkgs.swaybg; fcitx5 = getExe' osConfig.i18n.inputMethod.package "fcitx5"; xwayland-satellite = getExe pkgs.xwayland-satellite; polkit-kde-agent = getExe' pkgs.kdePackages.polkit-kde-agent-1 "polkit-kde-agent"; wl-paste = getExe' pkgs.wl-clipboard "wl-paste"; wl-copy = getExe' pkgs.wl-clipboard "wl-copy"; cliphist = getExe' pkgs.cliphist "cliphist"; ghostty = getExe pkgs.ghostty; in { binds = let inherit (config.lib.niri.actions) spawn show-hotkey-overlay toggle-column-tabbed-display close-window toggle-overview focus-column-left focus-window-down focus-window-up focus-column-right focus-column-or-monitor-left focus-window-or-workspace-down focus-window-or-workspace-up focus-column-or-monitor-right move-column-left move-window-down move-window-up move-column-right move-column-left-or-to-monitor-left move-window-down-or-to-workspace-down move-window-up-or-to-workspace-up move-column-right-or-to-monitor-right focus-column-first focus-column-last move-column-to-first move-column-to-last focus-monitor-left focus-monitor-down focus-monitor-up focus-monitor-right move-column-to-monitor-left move-column-to-monitor-down move-column-to-monitor-up move-column-to-monitor-right focus-workspace-up focus-workspace-down move-column-to-workspace-down move-column-to-workspace-up move-workspace-down move-workspace-up focus-workspace move-column-to-workspace toggle-window-floating toggle-windowed-fullscreen focus-window-previous switch-focus-between-floating-and-tiling consume-or-expel-window-left consume-or-expel-window-right consume-window-into-column expel-window-from-column switch-preset-column-width switch-preset-window-height reset-window-height maximize-column fullscreen-window center-column set-column-width set-window-height screenshot screenshot-window quit expand-column-to-available-width toggle-keyboard-shortcuts-inhibit set-dynamic-cast-window clear-dynamic-cast-target; in { "Mod+V".action = spawn bash "-c" "${cliphist} list | ${fuzzel} --dmenu | ${cliphist} decode | ${wl-copy}"; "Mod+Shift+P".action = spawn swaylock "--screenshots" "--clock" "--indicator" "--indicator-radius" "100" "--indicator-thickness" "7" "--effect-blur" "7x5" "--effect-vignette" "0.5:0.5" "--grace" "2" "--fade-in" "0.5"; "Mod+Shift+Slash".action = show-hotkey-overlay; "Mod+T".action = spawn ghostty; "Mod+Shift+T".action = toggle-column-tabbed-display; "Mod+Space".action = spawn fuzzel; XF86AudioRaiseVolume = { action = spawn wpctl "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; allow-when-locked = true; }; XF86AudioLowerVolume = { action = spawn wpctl "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; allow-when-locked = true; }; XF86AudioMute = { action = spawn wpctl "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; allow-when-locked = true; }; XF86AudioMicMute = { action = spawn wpctl "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; allow-when-locked = true; }; "Mod+Q".action = close-window; "Mod+O".action = toggle-overview; "Mod+Left".action = focus-column-left; "Mod+Down".action = focus-window-down; "Mod+Up".action = focus-window-up; "Mod+Right".action = focus-column-right; "Mod+H".action = focus-column-or-monitor-left; "Mod+J".action = focus-window-or-workspace-down; "Mod+K".action = focus-window-or-workspace-up; "Mod+L".action = focus-column-or-monitor-right; "Mod+Shift+Left".action = move-column-left; "Mod+Shift+Down".action = move-window-down; "Mod+Shift+Up".action = move-window-up; "Mod+Shift+Right".action = move-column-right; "Mod+Shift+H".action = move-column-left-or-to-monitor-left; "Mod+Shift+J".action = move-window-down-or-to-workspace-down; "Mod+Shift+K".action = move-window-up-or-to-workspace-up; "Mod+Shift+L".action = move-column-right-or-to-monitor-right; "Mod+Home".action = focus-column-first; "Mod+End".action = focus-column-last; "Mod+Ctrl+Home".action = move-column-to-first; "Mod+Ctrl+End".action = move-column-to-last; "Mod+Ctrl+Left".action = focus-monitor-left; "Mod+Ctrl+Down".action = focus-monitor-down; "Mod+Ctrl+Up".action = focus-monitor-up; "Mod+Ctrl+Right".action = focus-monitor-right; "Mod+Ctrl+H".action = focus-monitor-left; "Mod+Ctrl+J".action = focus-monitor-down; "Mod+Ctrl+K".action = focus-monitor-up; "Mod+Ctrl+L".action = focus-monitor-right; "Mod+Shift+Ctrl+Left".action = move-column-to-monitor-left; "Mod+Shift+Ctrl+Down".action = move-column-to-monitor-down; "Mod+Shift+Ctrl+Up".action = move-column-to-monitor-up; "Mod+Shift+Ctrl+Right".action = move-column-to-monitor-right; "Mod+Shift+Ctrl+H".action = move-column-to-monitor-left; "Mod+Shift+Ctrl+J".action = move-column-to-monitor-down; "Mod+Shift+Ctrl+K".action = move-column-to-monitor-up; "Mod+Shift+Ctrl+L".action = move-column-to-monitor-right; "Mod+Page_Down".action = focus-workspace-down; "Mod+Page_Up".action = focus-workspace-up; "Mod+U".action = focus-workspace-down; "Mod+I".action = focus-workspace-up; "Mod+Shift+Page_Down".action = move-column-to-workspace-down; "Mod+Shift+Page_Up".action = move-column-to-workspace-up; "Mod+Shift+U".action = move-column-to-workspace-down; "Mod+Shift+I".action = move-column-to-workspace-up; "Mod+Ctrl+Page_Down".action = move-workspace-down; "Mod+Ctrl+Page_Up".action = move-workspace-up; "Mod+Ctrl+U".action = move-workspace-down; "Mod+Ctrl+I".action = move-workspace-up; "Mod+Shift+WheelScrollDown" = { action = focus-workspace-down; cooldown-ms = 150; }; "Mod+Shift+WheelScrollUp" = { action = focus-workspace-up; cooldown-ms = 150; }; "Mod+WheelScrollDown".action = focus-column-right; "Mod+WheelScrollUp".action = focus-column-left; "Mod+1".action = focus-workspace 1; "Mod+2".action = focus-workspace 2; "Mod+3".action = focus-workspace 3; "Mod+4".action = focus-workspace 4; "Mod+5".action = focus-workspace 5; "Mod+6".action = focus-workspace 6; "Mod+7".action = focus-workspace 7; "Mod+8".action = focus-workspace 8; "Mod+9".action = focus-workspace 9; "Mod+Shift+1".action = move-column-to-workspace 1; "Mod+Shift+2".action = move-column-to-workspace 2; "Mod+Shift+3".action = move-column-to-workspace 3; "Mod+Shift+4".action = move-column-to-workspace 4; "Mod+Shift+5".action = move-column-to-workspace 5; "Mod+Shift+6".action = move-column-to-workspace 6; "Mod+Shift+7".action = move-column-to-workspace 7; "Mod+Shift+8".action = move-column-to-workspace 8; "Mod+Shift+9".action = move-column-to-workspace 9; "Mod+F".action = toggle-window-floating; "Mod+Shift+F".action = toggle-windowed-fullscreen; "Mod+Tab".action = focus-window-previous; "Mod+Shift+Tab".action = switch-focus-between-floating-and-tiling; "Mod+BracketLeft".action = consume-or-expel-window-left; "Mod+BracketRight".action = consume-or-expel-window-right; "Mod+Comma".action = consume-window-into-column; "Mod+Period".action = expel-window-from-column; "Mod+R".action = switch-preset-column-width; "Mod+Shift+R".action = switch-preset-window-height; "Mod+Ctrl+R".action = reset-window-height; "Mod+M".action = maximize-column; "Mod+Shift+M".action = fullscreen-window; "Mod+Z".action = center-column; "Mod+Minus".action = set-column-width "-10%"; "Mod+Equal".action = set-column-width "+10%"; "Mod+Shift+Minus".action = set-window-height "-10%"; "Mod+Shift+Equal".action = set-window-height "+10%"; "Print".action = screenshot; # since niri add another parameter for the variant, the regex can not parse the action # [Track] https://github.com/sodiboo/niri-flake/issues/922 "Ctrl+Print".action.screenshot-screen = []; "Alt+Print".action = screenshot-window; "Mod+Shift+Q".action = quit; "Mod+E".action = expand-column-to-available-width; "Mod+Shift+S".action = toggle-keyboard-shortcuts-inhibit; "Mod+Shift+C".action = set-dynamic-cast-window; "Mod+Shift+Ctrl+C".action = clear-dynamic-cast-target; }; screenshot-path = "${config.xdg.userDirs.pictures}/screenshots/%Y-%m-%d_%H:%M:%S.png"; hotkey-overlay.skip-at-startup = true; prefer-no-csd = true; spawn-at-startup = [ { command = [waybar]; } { command = [swaync]; } { command = [swaybg "-i" "${config.home.homeDirectory}/wallpaper/01.png"]; } { command = [fcitx5 "-d" "--replace"]; } { command = [xwayland-satellite DISPLAY]; } { command = [polkit-kde-agent]; } { command = [wl-paste "--watch" cliphist "store"]; } ]; input = { touchpad = { click-method = "clickfinger"; dwt = true; scroll-method = "two-finger"; tap-button-map = "left-right-middle"; }; warp-mouse-to-focus = true; }; cursor = { hide-after-inactive-ms = 3000; hide-when-typing = true; }; layout = { border = { enable = true; width = 4; active = { color = "#7fc8ff"; }; inactive = { color = "#505050"; }; }; focus-ring = { enable = false; width = 4; active = { color = "#7fc8ff"; }; inactive = { color = "#505050"; }; }; preset-column-widths = [ { proportion = 1. / 4.; } { proportion = 1. / 3.; } { proportion = 1. / 2.; } { proportion = 2. / 3.; } { proportion = 3. / 4.; } { proportion = 4. / 4.; } ]; always-center-single-column = true; center-focused-column = "never"; default-column-display = "tabbed"; default-column-width = { proportion = 1. / 2.; }; empty-workspace-above-first = true; gaps = 16; }; animations = { enable = true; window-close = { spring = { damping-ratio = 1.0; stiffness = 800; epsilon = 0.0001; }; }; }; environment = { inherit DISPLAY; }; window-rules = [ { draw-border-with-background = true; geometry-corner-radius = { bottom-left = 12.; bottom-right = 12.; top-left = 12.; top-right = 12.; }; clip-to-geometry = true; } { matches = [ { app-id = "^showmethekey-gtk$"; } ]; geometry-corner-radius = { bottom-left = 0.0; bottom-right = 0.0; top-left = 0.0; top-right = 0.0; }; clip-to-geometry = false; open-floating = true; open-focused = false; default-column-width = { fixed = 300; }; default-window-height = { fixed = 70; }; draw-border-with-background = false; default-floating-position = { relative-to = "bottom-right"; x = 20; y = 20; }; focus-ring.enable = false; border.enable = false; shadow.enable = false; baba-is-float = true; # tiled-state = false; } { matches = [ { app-id = "^org\\.keepassxc\\.KeePassXC$"; } { app-id = "^org\\.gnome\\.World\\.Secrets$"; } ]; block-out-from = "screen-capture"; } { matches = [ { app-id = "^com\\.mitchellh\\.ghostty$"; is-active = true; } ]; draw-border-with-background = false; } { matches = [ { app-id = "^com\\.mitchellh\\.ghostty$"; is-active = false; } ]; opacity = 0.8; draw-border-with-background = false; } { matches = [ { is-window-cast-target = true; } ]; focus-ring = { active = { color = "#f38ba8"; }; inactive = { color = "#7d0d2d"; }; }; border = { active = { color = "#f38ba8"; }; inactive = { color = "#7d0d2d"; }; }; tab-indicator = { active = { color = "#f38ba8"; }; inactive = { color = "#7d0d2d"; }; }; shadow.enable = true; } { matches = [ { app-id = "^org\\.telegram\\.desktop$"; title = "Media viewer"; } ]; open-floating = true; } ]; layer-rules = [ { matches = [ { namespace = "^swaync-notification-window$"; } { namespace = "^swaync-control-center$"; } ]; block-out-from = "screen-capture"; } { matches = [ { namespace = "^launcher$"; } ]; shadow.enable = true; geometry-corner-radius = { top-left = 10.; top-right = 10.; bottom-left = 10.; bottom-right = 10.; }; } ]; }