Add a Waybar module to the desktop group, enabled through the aggregator, showing workspaces with per-application icons plus a clock, MPRIS media controls, audio, network, battery, and a do-not-disturb toggle. The do-not-disturb widget drives mako's dnd mode and degrades gracefully until the notifications module lands. Module glyphs are Nerd Font codepoints decoded through JSON, backed by a system symbols font. Add a PipeWire audio server so the bar's volume widget has a running sink to read and drive.
2.6 KiB
spec, blocked-by
| spec | blocked-by |
|---|---|
| hyprland-desktop | 0021-desktop-group-and-hyprland-session |
What to build
A Waybar status bar that reads system state at a glance.
Add a Waybar module to the desktop group, enabled through the aggregator, showing workspaces with per-application icons plus a clock, battery, network, audio, MPRIS media controls, and a do-not-disturb toggle. No overview/exposé plugin: the workspace indicators are sufficient. The do-not-disturb toggle and media controls live in the bar rather than in a separate notification center.
Acceptance criteria
- A Waybar module exists in the desktop group and is enabled by the aggregator.
- The bar shows workspaces with per-application icons, a clock, battery, network, audio, MPRIS media controls, and a do-not-disturb toggle.
- No overview/exposé plugin is used.
- neogaia builds green under
nix flake check.
Implementation Notes
-
Audio server added beyond the plan. The task asked only for the bar's audio widget, but nothing in the epic provisions an audio server, and a
wireplumberwidget over a machine with no running sink is inert. A smallmodules/desktop/audio.nixtherefore enables PipeWire (with the ALSA and PulseAudio compatibility shims and rtkit) under its ownmodules.desktop.audio.enable, wired into the aggregator at default priority like every other piece. It is a distinct concern that could equally live in its own task, so it is flagged here and in the PR for the operator to split out or keep. -
Do-not-disturb depends on mako, which lands later. The
custom/dndwidget shells out tomakoctl, whose daemon arrives with the notifications task (0025). The status script pins mako's store path and degrades to "notifications on" whenever no daemon answers, so the widget is inert rather than broken before 0025 and reflects real state the moment mako runs. -
Glyphs decoded, not pasted. Nerd-font module icons are Private-Use-Area codepoints that do not survive an editor paste, so a
g = code: builtins.fromJSON ''"\u${code}"''helper decodes each one to real bytes.nerd-fonts.symbols-onlyis installed system-wide as the pango fallback for those codepoints, since Stylix's monospace font does not carry them. -
Bar launch. The bar runs as a home-manager systemd user service bound to
graphical-session.target, which uwsm activates, so it comes up with the session without a compositorexec-once. -
Runtime checks deferred to the machine.
nix flake checkproves the config evaluates and the host builds, but the rendered bar, the MPRIS widget, and the audio widget can only be exercised in a live Wayland session on neogaia.