fix(sharednd): address review — stop/start race, onExit cleanup, no busy loop off niri

- Debounce stop transitions by 1 s (host update tick): a stop/start pair
  from switching casts collapses into no transition, so the async
  `dnd-set off` can no longer race the `dnd-status` query and drop
  ownership mid-share. Also stops DND flapping.
- Add onExit: if the plugin owns DND when disabled/reloaded, turn it off
  via a detached runAsync (survives VM teardown).
- Gate detection on NIRI_SOCKET + commandExists("niri") instead of an
  unconditional retry loop: on other compositors (or niri installed but
  not running) the service now spawns nothing. If NIRI_SOCKET is set but
  the binary is missing from PATH, warn once.
- Make the stream retry loop self-terminating (parent gone or niri
  socket removed): hard host exits skip process-group cleanup and were
  leaking orphaned loops that respawned `niri msg` every 3 s across
  sessions (observed 11 such orphans over 4 days).
- Bump version to 1.1.0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wioletowa
2026-07-14 18:30:29 +03:00
co-authored by Claude Fable 5
parent 704fa538b0
commit 5e9027da1a
4 changed files with 80 additions and 32 deletions
+1 -1
View File
@@ -5,5 +5,5 @@
"settings.always_off_after.label": "Always disable DND after sharing",
"settings.always_off_after.description": "Turn Do Not Disturb off when sharing ends even if it was already enabled before sharing started. When off, DND is only disabled if this plugin enabled it.",
"notify.no_niri_title": "ShareDND: niri not found",
"notify.no_niri_body": "Screen sharing detection uses niri IPC (niri msg). The plugin will keep retrying, but it only works under niri."
"notify.no_niri_body": "This looks like a niri session (NIRI_SOCKET is set), but the niri binary is not in PATH, so screen sharing cannot be detected."
}