From 704fa538b06c5270509bf360673fdb090f4d7e42 Mon Sep 17 00:00:00 2001 From: wioletowa Date: Tue, 14 Jul 2026 01:28:53 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20add=20whyoolw/sharednd=20=E2=80=94=20au?= =?UTF-8?q?to=20DND=20while=20screen=20sharing=20(niri)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Headless service that follows niri msg -j event-stream and enables notification Do Not Disturb via the host IPC (notification-dnd-set) while at least one screencast is active, restoring it afterwards. Side effects: spawns a persistent shell retry loop around `niri msg -j event-stream`, runs `niri msg -j casts` / `niri msg version` and `noctalia msg notification-dnd-*` on demand. No network access, no filesystem writes. Co-Authored-By: Claude Fable 5 --- sharednd/README.md | 41 ++++++++++ sharednd/plugin.toml | 39 +++++++++ sharednd/service.luau | 146 ++++++++++++++++++++++++++++++++++ sharednd/thumbnail.webp | Bin 0 -> 35166 bytes sharednd/translations/en.json | 9 +++ 5 files changed, 235 insertions(+) create mode 100644 sharednd/README.md create mode 100644 sharednd/plugin.toml create mode 100644 sharednd/service.luau create mode 100644 sharednd/thumbnail.webp create mode 100644 sharednd/translations/en.json diff --git a/sharednd/README.md b/sharednd/README.md new file mode 100644 index 0000000..5180bf2 --- /dev/null +++ b/sharednd/README.md @@ -0,0 +1,41 @@ +# ShareDND + +Automatic Do Not Disturb while the screen is being shared. + +When the first screencast starts (any app sharing via the portal — Discord, +OBS, browsers, `niri msg action set-dynamic-cast-*`, ...), notification DND is +enabled. When the last screencast stops, notifications come back. + +## How it works + +- A headless service follows `niri msg -j event-stream` and reacts to + `CastsChanged` / `CastStartedOrChanged` / `CastStopped` events — no polling. +- On every cast event it re-queries `niri msg -j casts` as the authoritative + state, so missed or reordered events cannot desync it. The stream is wrapped + in a shell retry loop and resends full state on reconnect. +- DND is toggled through the host IPC (`noctalia msg notification-dnd-set`), + so the usual OSD feedback appears. + +## Ownership rules + +- If DND was **already on** before sharing started, the plugin leaves it on + after sharing ends (it never took ownership). The + "Always disable DND after sharing" setting overrides this. +- If DND was enabled manually *during* sharing while the plugin owned it, it + will still be turned off when sharing ends (the plugin cannot tell the + difference). + +## Settings + +- **Only active streams** — count only casts with `is_active: true`. Off by + default: any open screencast session (even paused or showing nothing) keeps + DND on. +- **Always disable DND after sharing** — force DND off when sharing ends, + regardless of its state before sharing started. + +## Requirements & limitations + +- Requires **niri** (detection is niri IPC; on other compositors the plugin + is inert and shows a warning at startup). +- There is no plugin-disable hook in the host: if you disable the plugin + mid-share while it owns DND, DND stays on — toggle it manually. diff --git a/sharednd/plugin.toml b/sharednd/plugin.toml new file mode 100644 index 0000000..cb70aea --- /dev/null +++ b/sharednd/plugin.toml @@ -0,0 +1,39 @@ +# ShareDND — automatic Do Not Disturb while the screen is being shared. +# +# A headless [[service]] follows `niri msg -j event-stream` and re-queries +# `niri msg -j casts` on every Cast* event. When the first screencast +# appears, notification DND is enabled through the host IPC +# (notification-dnd-set); when the last one disappears, DND is restored. +# If DND was already on before sharing started, the plugin does not take +# ownership and leaves it on afterwards (configurable). +# +# External requirements: niri (screencast events come from niri IPC). + +id = "whyoolw/sharednd" +name = "ShareDND" +version = "1.0.0" +min_noctalia = "5.0.0" +author = "whyoolw" +license = "MIT" +dependencies = ["niri"] +tags = ["notifications", "privacy", "niri"] +icon = "screen-share" +description = "Enables notification Do Not Disturb while the screen is shared (niri screencast) and turns notifications back on when sharing stops. Requires niri." + +[[setting]] +key = "only_active" +type = "bool" +label_key = "settings.only_active.label" +description_key = "settings.only_active.description" +default = false + +[[setting]] +key = "always_off_after" +type = "bool" +label_key = "settings.always_off_after.label" +description_key = "settings.always_off_after.description" +default = false + +[[service]] +id = "service" +entry = "service.luau" diff --git a/sharednd/service.luau b/sharednd/service.luau new file mode 100644 index 0000000..5ce4500 --- /dev/null +++ b/sharednd/service.luau @@ -0,0 +1,146 @@ +-- ShareDND service: watches niri screencasts and toggles notification +-- Do Not Disturb while the screen is being shared. +-- +-- Detection is event-driven: a persistent `niri msg -j event-stream` runs +-- under runStream, wrapped in a shell retry loop because the stream API has +-- no exit notification. Any Cast* event triggers a re-query of +-- `niri msg -j casts`, which is the authoritative state, so no per-event +-- bookkeeping is needed and reconnects re-sync for free (the stream sends +-- the full current state, including CastsChanged, on connect). + +local function cfg(key) + return noctalia.getConfig(key) +end + +-- true while at least one screencast is believed to be running +local sharingActive = false +-- true when this plugin enabled DND (and therefore owns turning it off) +local dndSetByUs = false + +local queryInFlight = false +local queryDirty = false + +local function countCasts(json) + local needle = cfg("only_active") and '"is_active":true' or '"session_id":' + local n = 0 + local pos = 1 + while true do + local s, e = json:find(needle, pos, true) + if not s then + break + end + n = n + 1 + pos = e + 1 + end + return n +end + +local function setDnd(on, cb) + noctalia.runAsync("noctalia msg notification-dnd-set " .. (on and "on" or "off"), function(res) + local ok = res ~= nil and res.exitCode == 0 + if not ok then + noctalia.log("sharednd: notification-dnd-set failed") + end + if cb then + cb(ok) + end + end) +end + +local function onSharingStarted() + noctalia.runAsync("noctalia msg notification-dnd-status", function(res) + if not sharingActive then + return -- sharing already ended while the status query was in flight + end + if res == nil or res.exitCode ~= 0 then + noctalia.log("sharednd: notification-dnd-status failed") + return + end + if (res.stdout or ""):match("^%s*on") then + -- DND was already on (enabled manually) — don't take ownership. + dndSetByUs = false + noctalia.log("sharednd: sharing started, DND already on") + else + setDnd(true, function(ok) + dndSetByUs = ok + if ok then + noctalia.log("sharednd: sharing started, DND enabled") + if not sharingActive then + -- sharing ended while the set was in flight — undo + setDnd(false) + dndSetByUs = false + end + end + end) + end + end) +end + +local function onSharingStopped() + if dndSetByUs or cfg("always_off_after") then + setDnd(false) + noctalia.log("sharednd: sharing stopped, DND disabled") + else + noctalia.log("sharednd: sharing stopped, DND left as-is") + end + dndSetByUs = false +end + +local function applyState(activeCount) + local active = activeCount > 0 + if active == sharingActive then + return + end + sharingActive = active + if active then + onSharingStarted() + else + onSharingStopped() + end +end + +local function queryCasts() + if queryInFlight then + queryDirty = true + return + end + queryInFlight = true + noctalia.runAsync("niri msg -j casts", function(res) + queryInFlight = false + if res ~= nil and res.exitCode == 0 and res.stdout ~= nil then + applyState(countCasts(res.stdout)) + end + if queryDirty then + queryDirty = false + queryCasts() + end + end) +end + +local function onEventLine(line) + -- Matches CastsChanged / CastStartedOrChanged / CastStopped. The casts + -- query is authoritative, so a rare false positive (a window title + -- containing '"Cast') only costs one extra query. + if line:find('"Cast', 1, true) then + queryCasts() + end +end + +-- Boot. The niri check is a user-facing warning only; the stream loop below +-- retries forever anyway, which also covers niri's socket coming up after +-- noctalia during session start. +noctalia.runAsync("niri msg version", function(res) + if res == nil or res.exitCode ~= 0 then + noctalia.notifyError(noctalia.tr("notify.no_niri_title"), noctalia.tr("notify.no_niri_body")) + noctalia.log("sharednd: niri IPC not reachable at startup") + end +end) + +-- The process group is killed on plugin disable, taking the shell loop and +-- the stream down with it. +if not noctalia.runStream("while :; do niri msg -j event-stream 2>/dev/null; sleep 3; done", onEventLine) then + noctalia.log("sharednd: failed to start niri event-stream") +end + +-- Safety net in case the initial CastsChanged is ever missed. +queryCasts() diff --git a/sharednd/thumbnail.webp b/sharednd/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..631489853c05f960052c9bf586e871dc43135402 GIT binary patch literal 35166 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 mnKArLL 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 literal 0 HcmV?d00001 diff --git a/sharednd/translations/en.json b/sharednd/translations/en.json new file mode 100644 index 0000000..30a12c2 --- /dev/null +++ b/sharednd/translations/en.json @@ -0,0 +1,9 @@ +{ + "title": "ShareDND", + "settings.only_active.label": "Only active streams", + "settings.only_active.description": "Count only screencasts that are actively streaming. When off, any open screencast session (even one paused or showing nothing) keeps Do Not Disturb enabled.", + "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." +}