diff --git a/modules/home/desktop/niri/default.nix b/modules/home/desktop/niri/default.nix
index f0b837b..fa7971f 100644
--- a/modules/home/desktop/niri/default.nix
+++ b/modules/home/desktop/niri/default.nix
@@ -20,10 +20,7 @@
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 = {
@@ -36,255 +33,6 @@ in {
wpaperd.enable = true;
qt.enable = false;
};
- services = {
- copyq.enable = true;
- copyq.package = perSystem.nixpkgs-stable.copyq;
- 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";
@@ -566,10 +314,9 @@ in {
Mod+Escape { switch-layout "next"; }
- Mod+Return repeat=false { spawn "${terminal}"; }
+ Mod+Return repeat=false { spawn "sh" "-c" "$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; }
@@ -639,345 +386,32 @@ in {
'';
};
};
- 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} {dynamic}";
- 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
- ];
+ services = import ./services {inherit pkgs lockscreen getExe perSystem;};
+ programs.fuzzel = import ./programs/fuzzel {inherit config mkDefault;};
+ programs.waybar = import ./programs/waybar {inherit colors config getExe ifLaptop pkgs;};
+ home.packages = with pkgs;
+ [
+ # gui libadwaita apps
+ celluloid # mpv gui in libadwaita
+ helvum # pipewire patchbay in rust
+ junction # app chooser
+ loupe # image viewer and editor in rust
+ mission-center # task manager in rust (partly)
+ nautilus # file manager
+ overskride # bluetooth gui in rust
+ papers # pdf reader in rust
+ pika-backup # borg gui in rust
+ pwvucontrol # pipewire gui in rust
+ wdisplays # wlroots display configurator
+ ]
+ ++ [
+ # misc utils
+ (ifLaptop brightnessctl)
+ dconf
+ libnotify
+ playerctl
+ wl-clipboard-rs # wl-clipboard in rust
+ ];
gtk = {
enable = true;
diff --git a/modules/home/desktop/niri/programs/default.nix b/modules/home/desktop/niri/programs/default.nix
new file mode 100644
index 0000000..d1e742d
--- /dev/null
+++ b/modules/home/desktop/niri/programs/default.nix
@@ -0,0 +1,6 @@
+{
+ imports = [
+ ./fuzzel
+ ./waybar
+ ];
+}
diff --git a/modules/home/desktop/niri/programs/fuzzel/default.nix b/modules/home/desktop/niri/programs/fuzzel/default.nix
new file mode 100644
index 0000000..392d616
--- /dev/null
+++ b/modules/home/desktop/niri/programs/fuzzel/default.nix
@@ -0,0 +1,23 @@
+{
+ config,
+ mkDefault,
+}: {
+ 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;
+ };
+ };
+}
diff --git a/modules/home/desktop/niri/programs/waybar/default.nix b/modules/home/desktop/niri/programs/waybar/default.nix
new file mode 100644
index 0000000..d9eaad0
--- /dev/null
+++ b/modules/home/desktop/niri/programs/waybar/default.nix
@@ -0,0 +1,329 @@
+{
+ colors,
+ config,
+ getExe,
+ ifLaptop,
+ pkgs,
+ ...
+}: {
+ 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} {dynamic}";
+ 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;
+ }
+ '';
+}
diff --git a/modules/home/desktop/niri/services/default.nix b/modules/home/desktop/niri/services/default.nix
new file mode 100644
index 0000000..a43d883
--- /dev/null
+++ b/modules/home/desktop/niri/services/default.nix
@@ -0,0 +1,235 @@
+{
+ getExe,
+ perSystem,
+ pkgs,
+ lockscreen,
+ ...
+}: {
+ copyq.enable = true;
+ copyq.package = perSystem.nixpkgs-stable.copyq;
+ 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";
+ }
+ ];
+ };
+ };
+}