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 = { };