aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/specs/2026-09-15-notification-daemon-design.md
AgeCommit message (Collapse)AuthorFilesLines
11 hoursdocs: fix the expire_timeout direction in the spec and planDanilo M.1-10/+13
The freedesktop spec says -1 means the server decides and 0 means never; the spec and plan had them reversed, which the shipped code inherited and the live handover test caught. Corrected to match the spec, libnotify's -1 default and dunst.
12 hoursdocs: separate a notification's balloon and drawer lifetimesDanilo M.1-24/+57
The freedesktop expire_timeout is the notification's lifetime, and --wait and -b clients block until the daemon closes it. So the daemon emits NotificationClosed at expiry and frees the client, but keeps the entry in the live queue: the drawer lists it until it is dismissed or evicted, inert because its client is gone. History holds only what was dismissed or evicted. The reserved space is therefore scrollable, since the live queue can hold 20 at once, and a row past its expiry is read-only.
12 hoursdocs: add the notification daemon designDanilo M.1-0/+276
The second of the two specs the status registry named. A Go daemon owns org.freedesktop.Notifications and holds the state; quickshell renders it. The daemon and notifyctl live in a separate repo, the balloon shell and the drawer's notification centre live here. Rendering is split because quickshell has no generic D-Bus module, so something outside QML has to own the bus name. Files are the interface in the direction the renderers read, the same convention the registry set, and notifyctl is the one surface back. DND suppression lives in the balloon shell, not the daemon: the drawer's reserved space lists every live notification including the suppressed ones, because a list the user opened is not an interruption. This supersedes the registry spec's assumption that the daemon would read dnd.