diff --git a/configs/nixos/modules/desktop/session/mako.nix b/configs/nixos/modules/desktop/session/mako.nix
index 88c777b..5c9448d 100644
--- a/configs/nixos/modules/desktop/session/mako.nix
+++ b/configs/nixos/modules/desktop/session/mako.nix
@@ -54,6 +54,11 @@ in
registry.waybar.${config.networking.hostName}."custom/dnd" = {
order = 80;
+ style = ''
+ #custom-dnd {
+ margin-right: 8px;
+ }
+ '';
settings = {
return-type = "json";
exec = "${dndStatus}";
diff --git a/configs/nixos/modules/desktop/session/waybar.nix b/configs/nixos/modules/desktop/session/waybar.nix
index b88f8e9..9fef276 100644
--- a/configs/nixos/modules/desktop/session/waybar.nix
+++ b/configs/nixos/modules/desktop/session/waybar.nix
@@ -6,47 +6,20 @@
}:
# Waybar: a top status bar reading system state at a glance.
let
+ registeredWaybarStyles = lib.concatStringsSep "\n" (
+ lib.filter (style: style != "") (lib.mapAttrsToList (_name: module: module.style) hostWaybarModules)
+ );
+
+ hostWaybarModules = lib.attrByPath [ config.networking.hostName ] { } config.registry.waybar;
+
waybarModulesFor =
position:
map (module: module.name) (
lib.sort (a: b: a.order < b.order) (
- lib.filter (module: module.position == position) (staticWaybarModules ++ registeredWaybarModules)
+ lib.filter (module: module.position == position) registeredWaybarModules
)
);
- staticWaybarModules = [
- {
- name = "hyprland/workspaces";
- position = "left";
- order = 10;
- }
- {
- name = "clock";
- position = "center";
- order = 10;
- }
- {
- name = "mpris";
- position = "right";
- order = 30;
- }
- {
- name = "wireplumber";
- position = "right";
- order = 40;
- }
- {
- name = "custom/network";
- position = "right";
- order = 60;
- }
- {
- name = "battery";
- position = "right";
- order = 70;
- }
- ];
-
registeredWaybarModules = lib.mapAttrsToList (
name: module:
module
@@ -55,14 +28,12 @@ let
}
) hostWaybarModules;
- hostWaybarModules = lib.attrByPath [ config.networking.hostName ] { } config.registry.waybar;
+ registeredWaybarModuleSettings = lib.mapAttrs (_name: module: module.settings) hostWaybarModules;
# A Nerd Font Private-Use-Area codepoint as a literal character, decoded
# through JSON so the glyph survives as bytes rather than an editor paste.
g = code: builtins.fromJSON ''"\u${code}"'';
- registeredWaybarModuleSettings = lib.mapAttrs (_name: module: module.settings) hostWaybarModules;
-
networkStatus = pkgs.writeShellScript "waybar-network-status" ''
active=$(
${lib.getExe' pkgs.networkmanager "nmcli"} -t -f DEVICE,TYPE,STATE,CONNECTION device status \
@@ -114,11 +85,8 @@ in
.modules-right {
margin-right: 8px;
}
-
- #custom-dnd {
- margin-right: 8px;
- }
- '';
+ ''
+ + registeredWaybarStyles;
settings.mainBar = lib.mkMerge [
{
@@ -131,72 +99,93 @@ in
modules-center = waybarModulesFor "center";
modules-right = waybarModulesFor "right";
- # Per-application icons for the windows on each workspace, mapped from
- # window class with a neutral glyph for anything unlisted.
- "hyprland/workspaces" = {
- on-click = "activate";
- format = "{id} {windows}";
- format-window-separator = " ";
- window-rewrite-default = g "f2d0";
- window-rewrite = lib.mapAttrs' (
- _name: windowIcon: lib.nameValuePair "class<${windowIcon.class}>" (g windowIcon.icon)
- ) (lib.attrByPath [ config.networking.hostName ] { } config.registry.window-icon);
- };
-
- clock = {
- format = "{:%a %d %b %H:%M}";
- tooltip-format = "{calendar}";
- calendar = {
- mode = "month";
- # Underline the current day so it stands out in the grid.
- format.today = "{}";
- };
- };
-
- mpris = {
- format = "${g "f001"} {title}";
- format-paused = "${g "f04c"} {title}";
- max-length = 40;
- on-click = "play-pause";
- on-scroll-up = "next";
- on-scroll-down = "previous";
- };
-
- wireplumber = {
- format = "{icon} {volume}%";
- format-muted = "${g "f026"} muted";
- format-icons = [
- (g "f026")
- (g "f027")
- (g "f028")
- ];
- on-click = "${lib.getExe' pkgs.wireplumber "wpctl"} set-mute @DEFAULT_AUDIO_SINK@ toggle";
- };
-
- "custom/network" = {
- return-type = "json";
- exec = "${networkStatus}";
- interval = 5;
- };
-
- battery = {
- format = "{icon} {capacity}%";
- format-charging = "${g "f0e7"} {capacity}%";
- format-icons = [
- (g "f244")
- (g "f243")
- (g "f242")
- (g "f241")
- (g "f240")
- ];
- states = {
- warning = 20;
- critical = 10;
- };
- };
}
registeredWaybarModuleSettings
];
};
+
+ registry.waybar.${config.networking.hostName} = {
+ "hyprland/workspaces" = {
+ position = "left";
+ order = 10;
+ settings = {
+ on-click = "activate";
+ format = "{id} {windows}";
+ format-window-separator = " ";
+ window-rewrite-default = g "f2d0";
+ window-rewrite = lib.mapAttrs' (
+ _name: windowIcon: lib.nameValuePair "class<${windowIcon.class}>" (g windowIcon.icon)
+ ) (lib.attrByPath [ config.networking.hostName ] { } config.registry.window-icon);
+ };
+ };
+
+ clock = {
+ position = "center";
+ order = 10;
+ settings = {
+ format = "{:%a %d %b %H:%M}";
+ tooltip-format = "{calendar}";
+ calendar = {
+ mode = "month";
+ # Underline the current day so it stands out in the grid.
+ format.today = "{}";
+ };
+ };
+ };
+
+ mpris = {
+ order = 30;
+ settings = {
+ format = "${g "f001"} {title}";
+ format-paused = "${g "f04c"} {title}";
+ max-length = 40;
+ on-click = "play-pause";
+ on-scroll-up = "next";
+ on-scroll-down = "previous";
+ };
+ };
+
+ wireplumber = {
+ order = 40;
+ settings = {
+ format = "{icon} {volume}%";
+ format-muted = "${g "f026"} muted";
+ format-icons = [
+ (g "f026")
+ (g "f027")
+ (g "f028")
+ ];
+ on-click = "${lib.getExe' pkgs.wireplumber "wpctl"} set-mute @DEFAULT_AUDIO_SINK@ toggle";
+ };
+ };
+
+ "custom/network" = {
+ order = 60;
+ settings = {
+ return-type = "json";
+ exec = "${networkStatus}";
+ interval = 5;
+ };
+ };
+
+ battery = {
+ order = 70;
+ settings = {
+ format = "{icon} {capacity}%";
+ format-charging = "${g "f0e7"} {capacity}%";
+ format-icons = [
+ (g "f244")
+ (g "f243")
+ (g "f242")
+ (g "f241")
+ (g "f240")
+ ];
+ states = {
+ warning = 20;
+ critical = 10;
+ };
+ };
+ };
+ };
};
}
diff --git a/configs/nixos/registry/waybar.nix b/configs/nixos/registry/waybar.nix
index 413f63b..3a6beed 100644
--- a/configs/nixos/registry/waybar.nix
+++ b/configs/nixos/registry/waybar.nix
@@ -19,6 +19,12 @@
description = "Sorts the module within its Waybar section.";
};
+ style = lib.mkOption {
+ type = lib.types.lines;
+ default = "";
+ description = "Adds CSS for the Waybar module.";
+ };
+
settings = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = { };