{ config, flake, pkgs, ... }: let inherit (flake.config.aesthetics.themes) currentTheme palettes cursor; inherit (flake.config.people) user0 user1 user2; user = config.home.username; niri = config.lib.niri.actions; themeLogic = if user == user0 then currentTheme.theme0 else if user == user1 then currentTheme.theme1 else if user == user2 then currentTheme.theme2 else currentTheme.theme0; el = palettes.${themeLogic}.colours; makeColour = c: "#" + c; in { programs.niri = { settings = let workspace0 = "messaging"; workspace1 = "work"; workspace2 = "gaming"; workspace3 = "media"; workspace4 = "extra"; in { prefer-no-csd = true; cursor = { size = cursor.size; theme = "catppuccin-macchiato-dark-cursors"; }; input = { focus-follows-mouse.enable = true; mouse.accel-profile = "flat"; }; spawn-at-startup = [ { command = [ "swaylock" ]; } { command = [ "wl-clipboard" ]; } { command = [ "wpaperd" ]; } { command = [ "gammastep" ]; } { command = [ "dunst" ]; } { command = [ "playerctld" ]; } { command = [ "waybar" ]; } { command = [ "nm-applet" ]; } { command = [ "blueman-applet" ]; } { command = [ "rfkill block bluetooth" ]; } { command = [ "rfkill unblock bluetooth" ]; } { command = [ "easyeffects -r" ]; } { command = [ "vesktop" ]; } { command = [ "signal" ]; } { command = [ "floorp" ]; } ]; animations = { enable = true; config-notification-open-close = { spring = { damping-ratio = 0.600000; epsilon = 0.001000; stiffness = 1000; }; }; horizontal-view-movement = { spring = { damping-ratio = 1.000000; epsilon = 0.000100; stiffness = 800; }; }; window-close = { easing = { curve = "ease-out-quad"; duration-ms = 150; }; }; window-open = { spring = { damping-ratio = 1.000000; epsilon = 0.000100; stiffness = 800; }; }; window-resize = { spring = { damping-ratio = 1.000000; epsilon = 0.000100; stiffness = 800; }; }; workspace-switch = { spring = { damping-ratio = 1.000000; epsilon = 0.000100; stiffness = 1000; }; }; }; binds = { "Super+z".action = niri.spawn "obsidian"; "Super+l".action = niri.spawn "slack"; "Super+h".action = niri.spawn "feishin"; "Super+g".action = niri.spawn "scrcpy"; "Super+k".action = niri.spawn "ghostty -e nu -e y"; "Super+s".action = niri.spawn "steam"; "Super+r".action = niri.spawn "ghostty -e zellij a dotfiles"; "Super+n".action = niri.spawn "signal-desktop"; "Super+t".action = niri.spawn "zeditor"; "Super+b".action = niri.spawn "floorp"; "Super+x".action = niri.spawn "freetube"; "Super+v".action = niri.spawn "vesktop"; "Super+m".action = niri.spawn "element-desktop"; "Super+d".action = niri.spawn "ghostty"; "Super+p".action = niri.spawn "bitwarden"; "Super+Space".action = niri.spawn "fuzzel"; "Super+Tab".action = niri.close-window; "Super+u".action = niri.maximize-column; "Super+comma".action = niri.focus-workspace-down; "Super+period".action = niri.focus-workspace-up; "Super+f".action = niri.swap-window-left; "Super+o".action = niri.swap-window-right; # "Ctrl+Alt+1".action = niri.move-window-to-workspace workspace0; # "Ctrl+Alt+2".action = niri.move-window-to-workspace workspace1; # "Ctrl+Alt+3".action = niri.move-window-to-workspace workspace2; # "Ctrl+Alt+4".action = niri.move-window-to-workspace workspace3; # "Ctrl+Alt+5".action = niri.move-window-to-workspace workspace4; # "Super+Enter".action = niri.toggle-overview; "Super+1".action = niri.focus-workspace workspace0; "Super+2".action = niri.focus-workspace workspace1; "Super+3".action = niri.focus-workspace workspace2; "Super+4".action = niri.focus-workspace workspace3; "Super+5".action = niri.focus-workspace workspace4; "Super+c".action = niri.focus-column-or-monitor-left; "Super+a".action = niri.focus-window-or-workspace-up; "Super+e".action = niri.focus-window-or-workspace-down; "Super+i".action = niri.focus-column-or-monitor-right; "Super+Shift+t".action = niri.spawn "ghostty"; "Super+Shift+s".action = niri.spawn "flameshot gui"; "Super+Shift+period".action = niri.spawn "emote"; "Super+Shift+Tab".action = niri.fullscreen-window; "Ctrl+Alt+c".action = niri.move-column-left; "Ctrl+Alt+i".action = niri.move-column-right; "Ctrl+Alt+f".action = niri.set-column-width "-10%"; "Ctrl+Alt+o".action = niri.set-column-width "+10%"; }; hotkey-overlay.skip-at-startup = true; outputs = { "DP-1" = { background-color = makeColour el.base02; mode = { width = 2560; height = 1080; refresh = 199.92; }; position = { x = 0; y = 0; }; }; }; window-rules = [ { open-focused = true; } { matches = let windowMatch = c: { app-id = c; is-floating = true; is-focused = true; }; appIDs = [ ".blueman-manager-wrapped" "org.gnome.Calculator" "com.github.wwmm.easyeffects" "emote" "mpv" "vlc" "org.nomacs.ImageLounge" "flameshot" "^.protonvpn-app-wrapped$" "^Picture-in-Picture$" "^Discord Popout$" "^Enter name of file to save to…$" "^File Upload$" ".scrcpy-wrapped" "^Battle.net$" ]; in builtins.map windowMatch appIDs; } { matches = let windowMatch = c: { app-id = c; opacity = 1.0; }; appIDs = [ "floop" "org.kde.kdenlive" "krita" "mpv" "vlc" "Brave-browser" "org.kde.okular" ]; in builtins.map windowMatch appIDs; } { matches = let windowMatch = c: { app-id = c; open-on-workspace = workspace0; }; appIDs = [ "signal" "vesktop" ]; in builtins.map windowMatch appIDs; } { matches = let windowMatch = c: { app-id = c; open-on-workspace = workspace1; }; appIDs = [ "code" "zeditor" ]; in builtins.map windowMatch appIDs; } { matches = let windowMatch = c: { app-id = c; open-on-workspace = workspace2; }; appIDs = [ "steam" "org.kde.kdenlive" ]; in builtins.map windowMatch appIDs; } { matches = let windowMatch = c: { app-id = c; open-on-workspace = workspace3; }; appIDs = [ "feishin" ".scrcpy-wrapped" ]; in builtins.map windowMatch appIDs; } { clip-to-geometry = true; focus-ring.enable = false; geometry-corner-radius = let radius = 10.0; in { top-left = radius; top-right = radius; bottom-left = radius; bottom-right = radius; }; } ]; layout = { border = { enable = true; width = 2; active.color = makeColour el.base0E; inactive.color = makeColour el.base02; }; gaps = 10; shadow = { enable = true; color = el.base11; draw-behind-window = true; offset.x = 0; offset.y = 0; spread = 3; }; }; workspaces = { default = { name = workspace0; }; ${workspace1} = { name = workspace1; }; ${workspace2} = { name = workspace2; }; ${workspace3} = { name = workspace3; }; ${workspace4} = { name = workspace4; }; }; }; }; }