Files
nixos-blueprint/modules/home/desktop/niri/default.nix
2025-04-18 15:43:10 +03:00

1088 lines
34 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
osConfig,
config,
pkgs,
lib,
...
}: let
inherit (lib.strings) removeSuffix;
inherit (lib) mkIf mkEnableOption mkDefault mkForce getExe;
inherit (config.lib.stylix) colors;
inherit (config.stylix) cursor;
inherit (osConfig.module.stylix) theme;
inherit (osConfig.networking) hostName;
cfg = config.desktop.niri;
keyboard =
if hostName == "eldrid"
then "chromeos"
else "platform";
xdgPics =
config.xdg.userDirs.pictures;
ifLaptop = mkIf (hostName != "dunamis");
# TODO: make terminal depent on thing outside a module
terminal = getExe pkgs.ghostty;
launcher = getExe pkgs.fuzzel;
browser = "app.zen_browser.zen";
lockscreen = getExe pkgs.gtklock;
in {
options = {
desktop.niri.enable =
mkEnableOption "enable niri desktop";
};
config = mkIf cfg.enable {
stylix.targets = {
waybar.enable = false;
wpaperd.enable = true;
qt.enable = false;
};
services = {
copyq.enable = true;
network-manager-applet.enable = true;
playerctld.enable = true;
swayosd = {
enable = true;
topMargin = 0.8;
};
wpaperd.enable = true;
gnome-keyring = {
enable = true;
components = ["secrets"];
};
gammastep = {
enable = true;
provider = "manual";
latitude = 49.6;
longitude = 36.1;
tray = true;
temperature = {
day = 6500;
night = 3000;
};
};
udiskie = {
enable = true;
automount = false;
notify = true;
tray = "auto";
};
swaync = {
enable = true;
settings = {
cssPriority = "user";
image-visibility = "when-available";
keyboard-shortcut = true;
relative-timestamps = true;
timeout = 5;
timeout-low = 5;
timeout-critical = 0;
script-fail-notify = true;
transition-time = 200;
# Layer settings
layer-shell = true;
layer = "overlay";
control-center-layer = "overlay";
# Notification settings
positionX = "right";
positionY = "top";
notification-2fa-action = true;
notification-inline-replies = false;
notification-icon-size = 32;
notification-body-image-height = 100;
notification-body-image-width = 200;
notification-window-width = 400;
# Control center settings
control-center-positionX = "right";
control-center-positionY = "top";
control-center-width = 500;
control-center-exclusive-zone = true;
fit-to-screen = true;
hide-on-action = true;
hide-on-clear = false;
# Widget settings
widgets = [
"title"
"dnd"
"notifications"
"mpris"
];
widget-config = {
title = {
text = "Notifications";
clear-all-button = true;
button-text = "Clear All";
};
dnd = {
text = "Do Not Disturb";
};
mpris = {
image-size = 96;
image-radius = 12;
blur = true;
};
};
};
style = ''
/*** Global ***/
progress,
progressbar,
trough {
border-radius: 16px;
}
.app-icon,
.image {
-gtk-icon-effect: none;
}
.notification-action {
border-radius: 12px;
margin: 0.5rem;
}
.close-button {
margin: 24px;
padding: 0.2rem;
border-radius: 16px;
}
/*** Notifications ***/
.notification-group.collapsed
.notification-row:not(:last-child)
.notification-action,
.notification-group.collapsed
.notification-row:not(:last-child)
.notification-default-action {
opacity: 0;
}
.trough {
margin: 4px;
border-radius: 7px;
}
.notification,
.notification.low,
.notification.normal,
.notification.critical,
.control-center {
margin: 16px;
border-radius: 7px;
}
.floating-notifications,
.notification-content {
border-radius: 7px;
}
.control-center-list {
background: transparent;
}
/*** Widgets ***/
/* Title widget */
.widget-title {
margin: 0.5rem;
}
.widget-title > label {
font-weight: bold;
}
.widget-title > button {
border-radius: 16px;
padding: 0.5rem;
}
/* DND Widget */
.widget-dnd {
margin: 0.5rem;
}
.widget-dnd > label {
font-weight: bold;
}
.widget-dnd > switch {
border-radius: 16px;
}
.widget-dnd > switch slider {
border-radius: 16px;
padding: 0.25rem;
}
/* Mpris widget */
.widget-mpris .widget-mpris-player {
border-radius: 16px;
margin: 0.5rem;
padding: 0.5rem;
}
.widget-mpris .widget-mpris-player .widget-mpris-album-art {
border-radius: 16px;
}
.widget-mpris .widget-mpris-player .widget-mpris-title {
font-weight: bold;
}
.widget-mpris .widget-mpris-player .widget-mpris-subtitle {
font-weight: normal;
}
.widget-mpris .widget-mpris-player > box > button {
border: 1px solid transparent;
border-radius: 16px;
padding: 0.25rem;
}
'';
};
hypridle = {
enable = true;
settings = {
general = {
before_sleep_cmd = "loginctl lock-session";
lock_cmd = "pidof ${lockscreen} || ${lockscreen}";
# unlock_cmd = "loginctl unlock-session";
};
listener = [
{
timeout = 600;
on-timeout = "pidof ${lockscreen} || ${lockscreen}";
}
{
timeout = 601;
on-timeout = getExe pkgs.niri + " msg action power-off-monitors";
}
];
};
};
};
programs.fuzzel = {
enable = true;
settings = {
main = {
terminal = terminal + " -e";
fields = "filename,name,generic,keywords,categories,exec";
dpi-aware = false;
width = 20;
horizontal-pad = 12;
vertical-pad = 12;
show-actions = true;
match-mode = "fuzzy";
icon-theme = config.dconf.settings."org/gnome/desktop/interface".icon-theme;
};
border = mkDefault {
width = 3;
radius = 12;
};
};
};
xdg.configFile = {
niri = {
target = "niri/config.kdl";
text = let
arrows = {
left = "Left";
down = "Down";
up = "Up";
right = "Right";
};
homerow-arrows = {
left = "n";
down = "e";
up = "i";
right = "o";
};
letters = {
first = "Q";
second = "W";
third = "F";
fourth = "P";
fifth = "B";
sixth = "J";
seventh = "L";
eighth = "U";
ninth = "Y";
};
numbers = {
first = "1";
second = "2";
third = "3";
fourth = "4";
fifth = "5";
sixth = "6";
seventh = "7";
eighth = "8";
ninth = "9";
};
genArrowNavigation = keys: ''
Mod+${keys.left} { focus-column-left; }
Mod+${keys.down} { focus-window-or-workspace-down; }
Mod+${keys.up} { focus-window-or-workspace-up; }
Mod+${keys.right} { focus-column-right; }
Mod+Ctrl+${keys.left} { move-column-left; }
Mod+Ctrl+${keys.down} { move-window-down-or-to-workspace-down; }
Mod+Ctrl+${keys.up} { move-window-up-or-to-workspace-up; }
Mod+Ctrl+${keys.right} { move-column-right; }
Mod+Shift+${keys.left} { focus-monitor-left; }
Mod+Shift+${keys.down} { focus-monitor-down; }
Mod+Shift+${keys.up} { focus-monitor-up; }
Mod+Shift+${keys.right} { focus-monitor-right; }
Mod+Shift+Ctrl+${keys.left} { move-column-to-monitor-left; }
Mod+Shift+Ctrl+${keys.down} { move-column-to-monitor-down; }
Mod+Shift+Ctrl+${keys.up} { move-column-to-monitor-up; }
Mod+Shift+Ctrl+${keys.right} { move-column-to-monitor-right; }
'';
genWorkspacesNavigation = keys: ''
Mod+${keys.first} { focus-workspace 1; }
Mod+${keys.second} { focus-workspace 2; }
Mod+${keys.third} { focus-workspace 3; }
Mod+${keys.fourth} { focus-workspace 4; }
Mod+${keys.fifth} { focus-workspace 5; }
Mod+${keys.sixth} { focus-workspace 6; }
Mod+${keys.seventh} { focus-workspace 7; }
Mod+${keys.eighth} { focus-workspace 8; }
Mod+${keys.ninth} { focus-workspace 9; }
Mod+Ctrl+Shift+${keys.first} { move-column-to-workspace 1; }
Mod+Ctrl+Shift+${keys.second} { move-column-to-workspace 2; }
Mod+Ctrl+Shift+${keys.third} { move-column-to-workspace 3; }
Mod+Ctrl+Shift+${keys.fourth} { move-column-to-workspace 4; }
Mod+Ctrl+Shift+${keys.fifth} { move-column-to-workspace 5; }
Mod+Ctrl+Shift+${keys.sixth} { move-column-to-workspace 6; }
Mod+Ctrl+Shift+${keys.seventh} { move-column-to-workspace 7; }
Mod+Ctrl+Shift+${keys.eighth} { move-column-to-workspace 8; }
Mod+Ctrl+Shift+${keys.ninth} { move-column-to-workspace 9; }
'';
in ''
environment {
DISPLAY ":123"
QT_QPA_PLATFORM "wayland"
QT_QPA_PLATFORMTHEME "gtk3"
GDK_BACKEND "wayland"
MOZ_ENABLE_WAYLAND "1"
MOZ_WEBRENDER "1"
XDG_SESSION_TYPE "wayland"
CLUTTER_BACKEND "wayland"
SDL_VIDEODRIVER "wayland"
}
input {
keyboard {
xkb {
layout "us,ua"
${
if (hostName == "dunamis" || hostName == "legion")
then "// variant \"colemak_dh_ortho,\""
else "variant \"colemak_dh_ortho,\""
}
}
repeat-delay 200
repeat-rate 50
track-layout "global"
}
touchpad {
// off
tap
// dwt
// dwtp
natural-scroll
accel-speed 0.2
accel-profile "flat"
// scroll-method "two-finger"
// disabled-on-external-mouse
}
mouse {
// off
// natural-scroll
accel-speed 0.0
accel-profile "flat"
// scroll-method "no-scroll"
}
warp-mouse-to-focus
// focus-follows-mouse
}
output "eDP-1" {
// off
scale 1.2
transform "normal"
// position x=1920 y=0
}
output "Samsung Electric Company S24R65x H4TMA03291" {
position x=0 y=0
variable-refresh-rate
}
output "Philips Consumer Electronics Company 27M2N5500 UK02418033254" {
mode "2560x1440@${
if hostName == "legion"
then "144.001"
else "180.000"
}"
variable-refresh-rate
position x=0 y=0
scale 1.33
}
output "PNP(AOC) 27V2G5 0x0000026C" {
position x=1920 y=0
mode "1920x1080@74.973"
variable-refresh-rate
}
cursor {
xcursor-theme "${cursor.name}"
xcursor-size ${toString cursor.size}
}
layout {
gaps 6
center-focused-column "never" // "on-overflow"
preset-column-widths {
proportion 0.33333
proportion 0.66667
}
// default-column-width { proportion 0.9; }
default-column-width { proportion 0.5; }
tab-indicator {
active-color "#${colors.base04}"
inactive-color "#${colors.base03}"
corner-radius 4
gap 6
gaps-between-tabs 3
length total-proportion=0.3
place-within-column
position "left"
width 6
}
focus-ring {
// off
width 3
active-gradient from="#${colors.base0D}" to="#${colors.base0F}" angle=40 relative-to="workspace-view"
inactive-color "#${colors.base03}"
}
struts {
left 24
right 24
}
}
prefer-no-csd
hotkey-overlay {
skip-at-startup
}
window-rule {
geometry-corner-radius 12
clip-to-geometry true
}
window-rule {
match is-window-cast-target=true
focus-ring {
width 3
active-color "#${colors.base0F}"
inactive-color "#${colors.base03}"
}
border {
width 3
active-color "#${colors.base0F}"
inactive-color "#${colors.base03}"
}
shadow {
on
color "#${colors.base0F}"
inactive-color "#${colors.base03}"
}
}
screenshot-path "${xdgPics}/screenshots/screenshot-%Y-%m-%d-%H-%M-%S.png"
animations {
slowdown 0.8
}
window-rule {
match title="Картинка в картинці"
match title="Picture-in-Picture"
open-floating true
}
window-rule {
match app-id="org.wezfurlong.wezterm"
match app-id="com.mitchellh.ghostty"
default-column-width { proportion 1.0; }
}
window-rule {
match app-id="re.sonny.Junction"
open-floating true
open-focused true
}
window-rule {
match app-id="com.mitchellh.ghostty"
draw-border-with-background false
}
window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
match app-id=r#"^Bitwarden$"#
match app-id="org.telegram.desktop"
match app-id="org.signal.Signal"
match app-id="WebCord"
// block-out-from "screen-capture"
block-out-from "screencast"
}
binds {
Mod+Shift+Slash { show-hotkey-overlay; }
Mod+Tab { focus-workspace-previous; }
Mod+C { center-column; }
Mod+M { maximize-column; }
Mod+H { set-column-width "50%"; }
Mod+T { set-column-width "33%"; }
Mod+Shift+T { set-column-width "67%"; }
Mod+V { toggle-column-tabbed-display; }
Mod+G { switch-focus-between-floating-and-tiling; }
Mod+Ctrl+Comma { consume-or-expel-window-left; }
Mod+Ctrl+Period { consume-or-expel-window-right; }
Mod+Ctrl+Q { close-window; }
Mod+Ctrl+M { fullscreen-window; }
Mod+Ctrl+G { toggle-window-floating; }
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
Mod+Comma { set-column-width "-10%"; }
Mod+Period { set-column-width "+10%"; }
Mod+Shift+Comma { set-window-height "-10%"; }
Mod+Shift+Period { set-window-height "+10%"; }
Mod+Escape { switch-layout "next"; }
Mod+Return repeat=false { spawn "${terminal}"; }
Mod+Space repeat=false { spawn "${launcher}"; }
Mod+Ctrl+L repeat=false { spawn "${lockscreen}"; }
Mod+Ctrl+B repeat=false { spawn "${browser}"; }
Mod+Ctrl+V repeat=false { spawn "copyq" "toggle"; }
Mod+Ctrl+Shift+BracketLeft { quit; }
Mod+Ctrl+Shift+BracketRight { power-off-monitors; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Shift+Print { screenshot-window; }
// Caps_Lock { spawn "swayosd-client" "--caps-lock"; }
// XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%+"; }
// XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%-"; }
// XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
// XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn "swayosd-client" "--output-volume" "raise"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "swayosd-client" "--output-volume" "lower"; }
XF86AudioMute allow-when-locked=true { spawn "swayosd-client" "--output-volume" "mute-toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn "swayosd-client" "--input-volume" "mute-toggle"; }
XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause"; }
XF86AudioPause allow-when-locked=true { spawn "playerctl" "pause"; }
XF86AudioPrev allow-when-locked=true { spawn "playerctl" "previous"; }
XF86AudioNext allow-when-locked=true { spawn "playerctl" "next"; }
XF86ScreenSaver allow-when-locked=true { spawn "${lockscreen}"; }
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "5%+"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-"; }
Alt+XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "5%+" "-d" "${keyboard}::kbd_backlight"; }
Alt+XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-" "-d" "${keyboard}::kbd_backlight"; }
XF86KbdBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "5%+" "-d" "${keyboard}::kbd_backlight"; }
XF86KbdBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-" "-d" "${keyboard}::kbd_backlight"; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Next { focus-workspace-down; }
Mod+Prior { focus-workspace-up; }
Mod+Ctrl+Next { move-column-to-workspace-down; }
Mod+Ctrl+Prior { move-column-to-workspace-up; }
Mod+Shift+Next { move-workspace-down; }
Mod+Shift+Prior { move-workspace-up; }
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
${genArrowNavigation arrows}
${genArrowNavigation homerow-arrows}
${genWorkspacesNavigation letters}
${genWorkspacesNavigation numbers}
}
'';
};
};
programs.waybar = {
enable = true;
systemd = {
enable = true;
target = "graphical-session.target";
};
settings = {
bar-0 = {
# layer = "top";
position = "top";
height = 24;
spacing = 4;
# margin-left = 63;
# margin-right = 63;
reload_style_on_change = true;
modules-left = [
"niri/language"
"niri/workspaces"
"wlr/taskbar"
];
modules-center = ["clock"];
modules-right = [
(ifLaptop "group/laptop")
"wireplumber"
"tray"
"privacy"
(ifLaptop "power-profiles-daemon")
"idle_inhibitor"
"custom/notification"
];
"niri/workspaces" = {
format = "{index}";
format-icons = {
"1" = "";
"2" = "";
"3" = "";
"4" = "";
"5" = "";
"6" = "";
"7" = "";
"8" = "";
"9" = "";
"10" = "";
general = "󰘧";
web = "󰖟";
chat = "󰻞";
code = "󰅩";
uni = "󱆀";
games = "󰺶";
system = "󰢻";
media = "󱜐";
tray = "󱊖";
};
};
"niri/language" = {
format = "{}";
format-en = "🇺🇸";
format-uk = "🇺🇦";
};
"custom/separator" = {
format = "󰝠";
interval = "once";
tooltip = false;
};
"group/laptop" = {
orientation = "inherit";
modules = [
"battery"
"backlight"
];
};
"backlight" = {
format = "{icon} {percent}%";
format-icons = [
"󰃚"
"󰃛"
"󰃜"
"󰃝"
"󰃞"
"󰃟"
"󰃠"
];
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = "󰅶";
deactivated = "󰾪";
};
};
"tray" = {
icon-size = 16;
spacing = 6;
};
"clock" = {
interval = 1;
format = "{:%H:%M:%S}";
tooltip-format = "{:%d.%m.%Y}";
};
battery = {
states = {
good = 95;
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-full = "󱟢 {capacity}%";
format-charging = "󰂄 {capacity}%";
format-plugged = "󰚥 {capacity}%";
format-alt = "{icon} {time}";
format-icons = ["󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"];
};
mpris = {
format = "{player_icon} {dynamic}";
format-paused = "{status_icon} <i>{dynamic}</i>";
playing-len = 30;
playing-paused = 30;
player-icons = {
default = "";
mpv = "🎵";
};
status-icons = {paused = "";};
};
"upower" = {
icon-size = 16;
format = "{percentage}";
hide-if-empty = true;
tooltip = true;
tooltip-spacing = 20;
};
"power-profiles-daemon" = {
format = "{icon}";
tooltip-format = "Power profile: {profile}\nDriver: {driver}";
tooltip = true;
format-icons = {
default = "󱡮";
performance = "󱡮";
balanced = "";
power-saver = "";
};
};
"wireplumber" = {
scroll-step = 3;
format = "{icon} {volume}%";
format-muted = "󰖁";
format-icons = ["󰕿" "󰖀" "󰕾"];
on-click = getExe pkgs.pwvucontrol;
on-click-right = "wpctl set-mute @DEFAULT_SINK@ toggle";
};
"custom/notification" = {
tooltip = false;
format = "{icon}";
format-icons = {
notification = "󱅫";
none = "󰂚";
dnd-notification = "󰂛";
dnd-none = "󰂛";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "swaync-client -t -sw";
on-click-right = "swaync-client -d -sw";
escape = true;
};
"privacy" = {
icon-spacing = 2;
icon-size = 16;
transition-duration = 250;
screenshare = {
type = "screenshare";
tooltip = true;
tooltip-icon-size = 24;
};
audio-in = {
type = "audio-in";
tooltip = true;
tooltip-icon-size = 24;
};
};
"wlr/taskbar" = {
format = "{icon}";
icon-size = 20;
icon-theme = "${config.dconf.settings."org/gnome/desktop/interface".icon-theme}";
tooltip-format = "{title}";
on-click = "activate";
};
};
};
style = ''
@define-color base00 #${colors.base00};
@define-color base01 #${colors.base01};
@define-color base02 #${colors.base02};
@define-color base03 #${colors.base03};
@define-color base04 #${colors.base04};
@define-color base05 #${colors.base05};
@define-color base06 #${colors.base06};
@define-color base07 #${colors.base07};
@define-color base08 #${colors.base08};
@define-color base09 #${colors.base09};
@define-color base0A #${colors.base0A};
@define-color base0B #${colors.base0B};
@define-color base0C #${colors.base0C};
@define-color base0D #${colors.base0D};
@define-color base0E #${colors.base0E};
@define-color base0F #${colors.base0F};
* {
font-family: ${config.stylix.fonts.sansSerif.name}, FontAwesome;
font-weight: 500;
font-size: 100%;
}
window#waybar {
background-color: @base00;
color: @base05;
transition-property: background-color;
transition-duration: 0.5s;
}
.modules-center {
background-color: transparent;
}
.mpris.stopped {
background-color: transparent;
}
.mpris.playing,
.mpris.paused,
.modules-left,
.modules-right {
/* border-top-left-radius: 12px;
border-top-right-radius: 12px;
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
background-color: @base00;
color: @base05; */
margin: 0 0.5em;
}
tooltip {
background: @base01;
border: 1px solid @base0E;
}
tooltip label {
color: @base05;
}
button {
box-shadow: inset 0 -3px transparent;
border-radius: 16px;
}
button:hover {
background: inherit;
box-shadow: inset 0 -3px transparent;
}
#mode {
background-color: rgba(0, 0, 0, 0.2);
box-shadow: inset 0 -3px @base05;
}
#battery,
#backlight,
#workspaces,
#taskbar,
#taskbar button,
#language,
#clock,
#battery,
#backlight,
#wireplumber,
#workspaces button,
#custom-separator {
padding: 0 0.3em;
}
#custom-notification,
#idle_inhibitor,
#power-profiles-daemon,
#privacy,
#privacy-item,
#tray button {
padding: 0 0.4em;
margin: 0 0.2em;
}
#workspaces button.active {
color: @base0D;
}
#taskbar button:hover {
box-shadow: transparent;
}
#taskbar.empty,
window#empty {
background-color: transparent;
}
#battery.critical:not(.charging) {
color: @base09;
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: steps(12);
animation-iteration-count: infinite;
animation-direction: alternate;
}
#power-profiles-daemon.performance {
color: @base0D;
}
#power-profiles-daemon.balanced {
color: @base0B;
}
#power-profiles-daemon.power-saver {
color: @base0A;
}
label:focus {
background-color: #000000;
}
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: @base08;
}
#privacy-item.screenshare {
color: @base0C;
}
#privacy-item.audio-in {
color: @base0E;
}
'';
};
home.packages = with pkgs; [
(ifLaptop brightnessctl)
nautilus
helvum
loupe
papers
junction
celluloid
mission-center
dconf
libnotify
playerctl
wdisplays
pwvucontrol
wl-clipboard-rs
libqalculate
];
gtk = {
enable = true;
iconTheme = {
name =
if config.stylix.polarity == "dark"
then "Papirus-Dark"
else "Papirus-Light";
package =
if (removeSuffix "-light" theme) == "nord"
then pkgs.papirus-nord
else pkgs.papirus-icon-theme;
};
};
qt = {
enable = true;
platformTheme.name = "gtk3";
};
dconf.settings = {
"org/gnome/desktop/wm/preferences" = {
button-layout = "icon:close";
};
"org/gnome/desktop/interface" = {
icon-theme = config.gtk.iconTheme.name;
};
};
xdg = {
mime.enable = true;
mimeApps = {
enable = true;
defaultApplications = let
file_manager = ["org.gnome.Nautilus.desktop"];
image_viewer = ["org.gnome.Loupe.desktop"];
pdf_reader = ["org.gnome.Papers.desktop"];
video_player = ["io.github.celluloid_player.Celluloid.desktop"];
web_browser = ["re.sonny.Junction.desktop"];
in {
"application/pdf" = pdf_reader;
"image/jpeg" = image_viewer;
"image/png" = image_viewer;
"inode/directory" = file_manager;
"text/html" = web_browser;
"video/mp4" = video_player;
"video/mpeg" = video_player;
"video/x-matroska" = video_player;
"video/x-mpeg" = video_player;
"x-scheme-handler/about" = web_browser;
"x-scheme-handler/http" = web_browser;
"x-scheme-handler/https" = web_browser;
"x-scheme-handler/unknown" = web_browser;
};
};
};
systemd.user = {
settings.Manager.DefaultEnvironment = {
QT_QPA_PLATFORM = "wayland";
DISPLAY = ":123";
};
targets.tray.Unit.Description = "Home Manager System Tray"; # workaround for udiskie
services = let
mkGraphicalService = config: graphicalService // config;
graphicalService = {
Install.WantedBy = ["niri.service"];
Unit = {
Requisite = ["graphical-session.target"];
PartOf = ["graphical-session.target"];
After = ["graphical-session.target"];
};
Service = {
Restart = "on-failure";
TimeoutStopSec = 10;
RestartSec = 1;
};
};
in {
udiskie = mkGraphicalService {};
waybar = mkGraphicalService {};
network-manager-applet = mkGraphicalService {};
copyq = mkGraphicalService {
Service =
graphicalService.Service
// {
Environment = mkForce "QT_QPA_PLATFORM=wayland";
};
};
xwayland-satellite = mkGraphicalService {
Service =
graphicalService.Service
// {
Type = "simple";
ExecStart = getExe pkgs.xwayland-satellite + " :123";
};
};
wpaperd = mkGraphicalService {
Service =
mkDefault graphicalService.Service;
};
gnome-polkit-agent = mkGraphicalService {
Service =
graphicalService.Service
// {
Type = "simple";
ExecStart = pkgs.polkit_gnome + "/libexec/polkit-gnome-authentication-agent-1";
};
};
};
};
};
}