{ lib, pkgs, config, inputs, username, ... }: { imports = [ inputs.niri.nixosModules.niri ]; hm.imports = [ inputs.ags.homeManagerModules.ags ]; nixpkgs.overlays = [ inputs.niri.overlays.niri (final: prev: { c.niri = final.niri-unstable; }) ]; programs.light.enable = true; programs.niri = { enable = true; package = pkgs.c.niri; }; hm.home.packages = with pkgs; [ mako wofi wl-clipboard wl-clipboard-x11 swaybg swayidle swaylock yambar ]; hm.programs.niri.settings = { environment = { QT_QPA_PLATFORM = "wayland"; NIXOS_OZONE_WL = "1"; GSK_RENDERER = "gl"; }; input = { touchpad = { natural-scroll = false; scroll-method = "two-finger"; tap = true; }; keyboard = { xkb = { layout = "pl,by(ru)"; options = "grp:caps_toggle,compose:menu"; }; }; }; spawn-at-startup = [ { command = [ "${lib.getExe pkgs.mako}" ]; } { command = [ "${lib.getExe pkgs.xwayland-satellite}" ]; } { command = [ "${lib.getExe pkgs.swaybg}" "--image" "/home/${username}/Pictures/Wallpapers/1.png" ]; } { command = let swaylock = "${lib.getExe pkgs.swaylock} -f -c 000000"; niri = lib.getExe pkgs.niri; light = lib.getExe pkgs.light; script = pkgs.writeShellScript "lockscript.sh" '' ${lib.getExe pkgs.swayidle} -w \ lock '${swaylock} && ${niri} msg action power-off-monitors' \ unlock '${niri} msg action power-on-monitors' \ timeout 200 '${swaylock}' \ timeout 210 '${niri} msg action power-off-monitors' \ resume '${niri} msg action power-on-monitors' \ timeout 195 '${light} -U 50' \ resume '${light} -A 50' \ before-sleep '${swaylock}' ''; in [ "sh" "-e" "${script}" ]; } { command = [ "${lib.getExe pkgs.yambar}" ]; } ]; binds = with config.hm.lib.niri.actions; let workspaces = [1 2 3 4 5 6 7 8 9]; tags-binds = map (x: { "Mod+${toString x}".action = focus-workspace x; "Mod+Shift+${toString x}".action = move-column-to-index x; }) workspaces; in lib.mkMerge (tags-binds ++ [{ # Volume "XF86AudioRaiseVolume" = { action = spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.01+"; allow-when-locked = true; }; "XF86AudioLowerVolume".action = spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.01-"; "XF86AudioMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; "XF86AudioMicMute".action = spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; "XF86Calculator".action = spawn "foot" "-e" "qalc"; "XF86MonBrightnessUp".action = spawn "${lib.getExe pkgs.light}" "-A" "2"; "XF86MonBrightnessDown".action = spawn "${lib.getExe pkgs.light}" "-U" "2"; "XF86ScreenSaver".action = let session = "loginctl session-status | awk '{ print $1 }' | head -n 1"; in spawn "loginctl lock-session $(${session})"; "Mod+Shift+Q".action = close-window; "Mod+Shift+E".action = quit; "Mod+Space".action = toggle-window-floating; "Mod+O".action = toggle-overview; "Mod+Slash".action = show-hotkey-overlay; "Mod+P".action = toggle-window-rule-opacity; "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%"; "Mod+W".action = toggle-column-tabbed-display; "Mod+Ctrl+H".action = consume-or-expel-window-left; "Mod+Ctrl+L".action = consume-or-expel-window-right; "Mod+R".action = switch-preset-column-width; "Mod+Shift+R".action = reset-window-height; "Mod+F".action = maximize-column; "Mod+Shift+F".action = fullscreen-window; "Mod+C".action = center-column; # Mouse "Mod+WheelScrollUp".action = focus-workspace-up; "Mod+WheelScrollDown".action = focus-workspace-down; "Mod+Shift+WheelScrollDown".action = focus-column-right; "Mod+Shift+WheelScrollUp".action = focus-column-left; "Mod+Ctrl+Shift+WheelScrollDown".action = move-column-right; "Mod+Ctrl+Shift+WheelScrollUp".action = move-column-left; # Focus window or workspace "Mod+Left".action = focus-column-left; "Mod+Down".action = focus-window-or-workspace-down; "Mod+Up".action = focus-window-or-workspace-up; "Mod+Right".action = focus-column-right; "Mod+H".action = focus-column-left; "Mod+J".action = focus-window-or-workspace-down; "Mod+K".action = focus-window-or-workspace-up; "Mod+L".action = focus-column-right; # Move window or workspace "Mod+Shift+Left".action = move-column-left; "Mod+Shift+Down".action = move-window-down-or-to-workspace-down; "Mod+Shift+Up".action = move-window-up-or-to-workspace-up; "Mod+Shift+Right".action = move-column-right; "Mod+Shift+H".action = move-column-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; # Move workspace "Mod+U".action = move-workspace-down; "Mod+I".action = move-workspace-up; "Mod+Ctrl+J".action = move-workspace-down; "Mod+Ctrl+K".action = move-workspace-up; "Mod+Ctrl+Down".action = move-workspace-down; "Mod+Ctrl+Up".action = move-workspace-up; # Screenshots "Print".action = screenshot; # "Ctrl+Print".action = screenshot-screen; # Only on niri-stable "Alt+Print".action = screenshot-window; # "Mod+B".action = spawn "${lib.getExe pkgs.ungoogled-chromium}"; "Mod+B".action = spawn "${lib.getExe pkgs.firefox}"; "Mod+Shift+B".action = spawn "${lib.getExe pkgs.ungoogled-chromium}"; "Mod+D".action = spawn "${lib.getExe pkgs.wofi}" "--show" "drun"; # "Mod+Return".action = spawn "footclient"; "Mod+Return".action = spawn "${lib.getExe pkgs.foot}"; }]); window-rules = [ { matches = [ { title = "Cinny"; } { title = "cinny"; } { title = "Element"; } { title = "element"; } { title = "Library"; } { title = "YouTube"; } { title = "Invidious"; } { title = "Piped"; } { app-id = "org\.keepassxc\.KeePassXC"; } { app-id = "org\.gnome\.World\.Secrets"; } { app-id = "org\.gnome\.Nautilus"; } { title = "File Upload"; } { title = "Open File"; } { title = "Open Folder"; } { app-id = "xdg-desktop-portal-gnome"; } { title = "Telegram"; } { app-id= "io\.github\.tdesktop_x64\.TDesktop"; } ]; block-out-from = "screencast"; } { matches = [ { app-id = "librewolf"; } { app-id = "firefox"; } ]; open-maximized = true; } { matches = [ { app-id = "alacritty"; } { app-id = "foot"; } { app-id = "footclient"; } ]; default-column-width = { proportion = 0.50; }; } { matches = [ { is-active = false; } ]; opacity = 0.9; } { matches = [ { is-active = true; } ]; opacity = 1.0; } { matches = [ { is-window-cast-target = true; } ]; focus-ring.active.gradient = { # TODO: set colors using stylix from = "#f38ba8"; to = "#7d0d2d70"; }; focus-ring.inactive.color = "#7d0d2d"; shadow = { enable = true; color = "#7d0d2d70"; }; } { geometry-corner-radius = { top-left = 3.0; top-right = 3.0; bottom-left = 0.0; bottom-right = 0.0; }; clip-to-geometry = true; } ]; layer-rules = [ { matches = [ { namespace = "waybar"; } { namespace = "yambar"; } ]; opacity = 0.8; shadow = { enable = true; softness = 40; spread = 5; offset.x = 0; offset.y = 5; draw-behind-window = true; color = "#00000064"; }; } ]; hotkey-overlay.skip-at-startup = true; prefer-no-csd = true; animations = { workspace-switch.spring = { damping-ratio = 1.000000; epsilon = 0.000100; stiffness = 1000; }; }; layout = { border.enable = false; focus-ring = { enable = true; width = 2; active.color = config.lib.stylix.colors.base0D; }; tab-indicator = { enable = true; gap = 5; width = 4; gaps-between-tabs = 3; active.color = config.lib.stylix.colors.base05; }; }; }; environment.etc."lemurs/wayland/niri".source = pkgs.writeShellScript "niri.sh" "${pkgs.niri}/bin/niri-session"; }