ref:
Close button on notify-osd?
Bookmark:
Can org.freedesktop.Notifications.CloseNotification(uint id) be triggered and invoked via DBus?
Currently, this script
dbus-monitor "interface='org.freedesktop.Notifications'" | \
grep --line-buffered "member=Notify" | \
sed -u -e 's/.*/killall notify-osd/g' | \
bash
will kill all pending notifications.
It would be better to finesse the specific target OSD notification to cancel, by using org.freedesktop.Notifications.CloseNotification(uint id)
. Is there an interface method that can put this on (in?) the DBus to fire when a particular notify event occurs?
The method will need to get the notify PID to use as the argument for CloseNotification(uint id)
. Alternatively,
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification(uint id)
could be used from the shell, if the (uint id)
argument could be determined. The actual command syntax would use an integer in place of (uint id)
.
Perhaps a better question to ask first might be "How is a notification's DBus address found?".
Neither of these identify it correctly:
gdbus monitor --session --dest org.freedesktop.Notifications
returns
The name org.freedesktop.Notifications is owned by :1.130
...
or
dbus-monitor "interface='org.freedesktop.Notifications'"
returns
... string ":1.340" ...
In hindsight, the previous question "How is the (uint id)
for a notification found?"is rhe torical given this previous answer to another question:
https://askubuntu.com/a/186311/89468
provides details so either method below can be used:
gdbus call --session --dest org.freedesktop.DBus \
--object-path / \
--method org.freedesktop.DBus.GetConnectionUnixProcessID :1.16
returning:
(uint32 8957,)
or
qdbus --literal --session org.freedesktop.DBus \
/ \
org.freedesktop.DBus.GetConnectionUnixProcessID :1.16
returning:
8957
The pop-up notify-OSD graffit would be then defeated with:
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification \
$(qdbus --literal --session \
org.freedesktop.DBus \
/ \
org.freedesktop.DBus.GetConnectionUnixProcessID :?.??? )
The "trick" is to find the :?.???
DBus address.
Best Answer
How do you know what
(UINT32 id)
is or is not?Given the statement
You ... need a way to get that ID ...
in this answer and the following empirical observations perhaps the title of the question should be changed to "How cangdbus ... -m org.freedesktop.Notifications.CloseNotification ...
close a notification?"Is it by implication or process of elimination that the statement "... it only states that the ID is to be unique, non-zero, and less than MAXINT ...", found in the description of 9.1.2. org.freedesktop.Notifications.Notify, also applies to the
CloseNotification
parameter(UINT32 id)
? TheUINT32
by process of elimination is the only common factor as an attribute type in the documentation and there is the implication that there must be some sort of common ID "handle" but ...The details of the returned value of
Notify
and its parameterUINT32 replaces_id
are quite explicit but it is not clear thatCloseNotification
's(UINT32 id)
has anything to do with that as demonstrated with empirical testing below.Quoting 9.1.3. org.freedesktop.Notifications.CloseNotification in toto:
This does not characterize or explain the meaning of
(UINT32 id)
.A glaring omission is the lack of a table to describe the
NotificationClosed (UINT32 id)
parameter. All the other parameters for methods and signals are qualified with such tables.Empirical tests show notifications do not close using
Notify
's return value:or
The notification does not close which would be the case if
(UINT32 id)
identified with the returned value ofNotify
.Some more tests:
and even coercing a constant ID, by setting
UINT32 replaces_id
to 42 andexpire_timeout
to 0, it is seen thatCloseNotification
has no influenceThe notification does not close even though the
42
makes the round trip throughout the methods as confirmed byin the output
Also note the notification failure of a -1 timeout (documentation is contradictory):
though this "works"
ref:
What is the name of the program that displays the notifications? (document contradictions)
How to force a new Notification in notify-osd to show up without waiting for the earlier one to exit?
How do I use 'notify-send' to immediately replace an existing notification?
Bookmark:
Can org.freedesktop.Notifications.CloseNotification(uint id) be triggered and invoked via DBus?