dotfiles/modules/home/gui/desktop/niri/default.nix
2025-05-09 15:11:56 -05:00

314 lines
9.2 KiB
Nix
Executable file

{
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 "discordcanary";
"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-monitor-up;
"Super+e".action = niri.focus-window-or-monitor-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;
};
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;
};
in
[
(windowMatch ".blueman-manager-wrapped")
(windowMatch "org.gnome.Calculator")
(windowMatch "com.github.wwmm.easyeffects")
(windowMatch "emote")
(windowMatch "mpv")
(windowMatch "vlc")
(windowMatch "org.nomacs.ImageLounge")
(windowMatch "flameshot")
(windowMatch "^.protonvpn-app-wrapped$")
(windowMatch "^Picture-in-Picture$")
(windowMatch "^Discord Popout$")
(windowMatch "^Enter name of file to save to$")
(windowMatch "^File Upload$")
(windowMatch ".scrcpy-wrapped")
(windowMatch "^Battle.net$")
];
}
{
matches = [
{ app-id = "floop"; }
{ app-id = "org.kde.kdenlive"; }
{ app-id = "krita"; }
{ app-id = "mpv"; }
{ app-id = "vlc"; }
{ app-id = "Brave-browser"; }
{ app-id = "org.kde.okular"; }
];
opacity = 1.0;
}
{
matches = [
{ app-id = "signal"; }
{ app-id = "vesktop"; }
];
open-on-workspace = workspace0;
}
{
matches = [
{ app-id = "code"; }
{ app-id = "zeditor"; }
];
open-on-workspace = workspace1;
}
{
matches = [
{ app-id = "steam"; }
{ app-id = "org.kde.kdenlive"; }
];
open-on-workspace = workspace2;
}
{
matches = [
{ app-id = "feishin"; }
{ app-id = ".scrcpy-wrapped"; }
];
open-on-workspace = workspace3;
}
{
clip-to-geometry = true;
focus-ring = {
active.color = makeColour el.base0E;
inactive.color = makeColour el.base02;
};
border = {
width = 1;
active.color = makeColour el.base0E;
inactive.color = makeColour el.base02;
};
geometry-corner-radius =
let
radius = 10.0;
in
{
top-left = radius;
top-right = radius;
bottom-left = radius;
bottom-right = radius;
};
}
];
layout = {
gaps = 10;
focus-ring.enable = true;
# struts = {
# top = 0;
# bottom = 0;
# left = 0;
# right = 0;
# };
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;
};
};
};
};
}