Files
nixos-config/modules/desktop/niri.nix

291 lines
9.0 KiB
Nix
Raw Normal View History

2025-08-20 18:24:02 +03:00
{ 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";
}