| Age | Commit message (Collapse) | Author | Files | Lines |
|
A notification is untrusted input. Inline <img> now renders only for
local sources; an http(s) source is removed before the RichText body is
shown, so a remote sender cannot make the shell fetch a URL. The row and
the balloon share the one sanitizer in the Notify singleton.
|
|
The daemon now publishes an image path; the balloon shows it below the
text, scaled to the balloon width with a 240px cap. A daemon without the
field leaves it hidden, so the renderer and the daemon can ship in
either order.
|
|
Each row shows when the notification appeared ("Sep 15 14:32", from created), sits on its own rounded card with space between rows instead of reading as one list, and uses the balloon's 16/18/16 sizing rather than 13/11. The close target grows to a 32px hit area in the row and the balloon, since a 20px box was hard to hit.
|
|
Mirror the balloon's right-click close-all on the drawer row: the spec says
the gestures are identical in both forms, and a right-click on a row
previously did nothing. The right-button branch precedes the live guard so it
behaves the same on history rows.
Stop importing the Status singleton into the notification shell. Referencing
it instantiated it, and its onPresentationChanged writes status.dnd and runs
breaktimer.sh, so a read-only consumer was writing state and shelling out on
every presentation toggle, and doubled the dndBeforePresentation race. Notify
now reads "/run/user/<uid>/status.dnd" directly through a FileView, the same
convention as the notifyd files; a missing file means off.
AGENTS.md named Drawer.qml as the drawer's reserved space; it is
desktop/NotificationList.qml.
|
|
The daemon is a separate process and the files are the interface; suppression
lives in the balloon shell so the drawer can list what DND held back; and the
drawer flag is what stops a notification appearing as both a balloon and a
row.
|
|
The renderer passes the action labels and keys as arguments, so the picker
parses no JSON; a chosen label maps to its key and runs notifyctl action.
|
|
Deriving the window's visible from column.implicitHeight deadlocked it:
a hidden window stops polishing, Column computes implicitHeight during
polish, so once the column was empty the window never re-mapped and no
later balloon could show, including at startup where the queue arrives
asynchronously after the window is already hidden. The binding now reads
Notify.queue membership, which a property binding re-evaluates whether or
not the window is mapped, so a later notification re-maps it. Expired
entries left in the queue keep a zero-height window mapped, which is
harmless.
|
|
The Repeater model was a fresh filter of Notify.queue on every 250ms tick
because the filter read now, so Qt Quick recreated every balloon delegate
four times a second, reloading icons and resetting hover. Model is now
Notify.queue itself, and each balloon drops itself at expiry through its
own visible binding, driven by the shared tick.
Removing required from the balloon's properties is part of the same fix: a
required property makes QML create the delegate in its own context, where
modelData and index are undefined, so notification: modelData silently
arrived undefined once a live queue item was actually drawn.
|
|
Reads the daemon's queue through the Notify singleton and draws a balloon
per live notification, bottom-right of DP-1 over conky. Suppression is here,
not in the daemon: dnd withholds low and normal, snooze withholds all, and
the drawer still lists them.
|