feat: swayosd on-screen display for volume/brightness/mute

The media keys called wpctl/brightnessctl directly with no visual
feedback — changing volume showed nothing on screen. Now they drive
swayosd-client, which performs the action AND shows a themed OSD.

- modules/home/osd.nix: services.swayosd, style.css generated from the
  palette (base bg, accent progress/border); nomarchy.osd.enable.
- hyprland media binds → swayosd-client (--output-volume raise/lower/
  mute-toggle, --input-volume mute-toggle, --brightness raise/lower).
- modules/nixos: services.udev.packages = [ swayosd ] installs the
  backlight rule (chgrp video + g+w) so brightness works for video-group
  users without root (the installer/live user is in video).

swaync is unaffected (it was already running — this was purely the
missing OSD). Verified: flake check green, swayosd.service bound to
graphical-session.target, hyprland config verifies, swayosd in the live
ISO closure. On-screen rendering needs a real session to confirm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-06-13 16:04:55 +01:00
parent 084b2a0500
commit 520c878bb3
6 changed files with 76 additions and 11 deletions

View File

@@ -189,6 +189,11 @@ in
# Don't let boot entries fill the ESP over the years.
boot.loader.systemd-boot.configurationLimit = lib.mkDefault 10;
# Backlight udev rule (chgrp video + g+w on /sys/class/backlight) so
# the desktop's swayosd brightness control works for video-group
# users without root. Harmless baseline even if the OSD is disabled.
services.udev.packages = [ pkgs.swayosd ];
# ── Nix itself ───────────────────────────────────────────────────
nix = {
settings = {