feat(theme-sync): persistent switch notification so slow switches read as progress

The "Applying theme — rebuilding…" toast used the default timeout, so it
vanished seconds into a multi-minute home-manager switch — leaving the
user with no signal and the impression the selection failed. Now it's
persistent (timeout 0) and all theme notifications share a synchronous
tag, so swaync REPLACES it in place with "Theme applied ✓" (or a critical
failure toast that persists) when the rebuild finishes.

notify() grew persistent/urgency/summary params. Honest indeterminate
feedback — HM exposes no percentage, so no fake progress bar.

Verified: py_compile clean; the full apply→switch→notify path runs end to
end (dummy NOMARCHY_REBUILD). The in-place replacement is visible only in
a real swaync session.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-06-13 15:52:41 +01:00
parent 20df0d8a60
commit 084b2a0500
3 changed files with 31 additions and 26 deletions

View File

@@ -309,12 +309,11 @@ close · `SUPER+1..9` workspaces · `Print` region screenshot.
screen, tuigreet/MOTD text, and the `distroId` question (it changes
`DEFAULT_HOSTNAME` and upstream `isNixos` checks — needs a test pass;
nixos-* CLI names stay regardless)
- **Theme-switch feedback:** a switch runs `home-manager switch` (seconds
to minutes), and today the only signal is the notify-send toast
("Applying theme — rebuilding…"). Add a visible progress indicator so a
slow switch never reads as a failed selection — e.g. a spinner/progress
widget from `nomarchy-theme-sync` (it already brackets the rebuild) or a
Waybar/swaync element while the switch runs.
- **Theme-switch feedback:** ✓ the "rebuilding…" notification is now
persistent (timeout 0) and replaced in place by "applied ✓" / failure
via a synchronous tag, so a multi-minute switch never reads as a failed
selection. (An honest indeterminate indicator — HM gives no % — a
literal progress widget would be cosmetic; revisit only if wanted.)
- **Icon themes:** add `icon` to `theme-state.json`, have Stylix/GTK and
rofi (`show-icons`) consume it, and ensure the chosen icon theme is
pulled into the closure per active theme (a dark/light pair, e.g.