{ config, lib, pkgs, util, ... }: # Waybar: a top status bar reading system state at a glance. let waybarModulesFor = position: map (module: module.name) ( lib.sort (a: b: a.order < b.order) ( lib.filter (module: module.position == position) registeredWaybarModules ) ); registeredWaybarModules = lib.mapAttrsToList ( name: module: module // { inherit name; } ) hostWaybarModules; hostWaybarModules = lib.attrByPath [ config.networking.hostName ] { } config.registry.waybar; registeredWaybarModuleSettings = lib.mapAttrs (_name: module: module.settings) hostWaybarModules; in { options.modules.desktop.session.waybar.enable = lib.mkEnableOption "the Waybar status bar"; config = lib.mkIf config.modules.desktop.session.waybar.enable { # A symbols font backs the module glyphs, so pango falls back to it for the # codepoints Stylix's monospace font does not carry. fonts.packages = [ pkgs.nerd-fonts.symbols-only ]; home-manager.users.${config.user.name}.programs.waybar = { enable = true; # A user service bound to graphical-session.target, which uwsm activates, # so the bar comes up with the session and no compositor exec-once. systemd.enable = true; settings.mainBar = lib.mkMerge [ { layer = "top"; position = "top"; height = 30; spacing = 8; margin-right = 8; modules-left = waybarModulesFor "left"; modules-center = waybarModulesFor "center"; modules-right = waybarModulesFor "right"; } registeredWaybarModuleSettings ]; }; registry.waybar.${config.networking.hostName} = { 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 = "{}"; }; }; }; battery = { order = 70; settings = { format = "{icon} {capacity}%"; format-charging = "${util.glyph "f0e7"} {capacity}%"; format-icons = [ (util.glyph "f244") (util.glyph "f243") (util.glyph "f242") (util.glyph "f241") (util.glyph "f240") ]; states = { warning = 20; critical = 10; }; }; }; }; }; }