Can org.freedesktop.Notifications.CloseNotification(uint id) be triggered and invoked via DBus?
Solution 1:
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 can gdbus ... -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)
? The UINT32
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 parameter UINT32 replaces_id
are quite explicit but it is not clear that CloseNotification
'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:
9.1.3. org.freedesktop.Notifications.CloseNotification
void org.freedesktop.Notifications.CloseNotification (UINT32 id);
Causes a notification to be forcefully closed and removed from the user's view.
It can be used, for example, in the event that what the notification pertains to
is no longer relevant, or to cancel a notification with no expiration time.
The NotificationClosed signal is emitted by this method.
If the notification no longer exists, an empty D-BUS Error message is sent back.
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:
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 0 "" "sigma-ry" "corpus" [] {} 200 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
or
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 5 "" "sigma-ry" "corpus" [] {} 20 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
The notification does not close which would be the case if (UINT32 id)
identified with the returned value of Notify
.
Some more tests:
gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 0 "" "sigma-ry" "corpus" [] {} 0 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
and even coercing a constant ID, by setting UINT32 replaces_id
to 42 and expire_timeout
to 0, it is seen that CloseNotification
has no influence
gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 42 "" "sigma-ry" "corpus" [] {} 0 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
The notification does not close even though the 42
makes the round trip throughout the methods as confirmed by
dbus-monitor "interface='org.freedesktop.Notifications'"
in the output
method call sender=:1.332 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify string "" uint32 42 string "" string "sigma-ry" string "corpus" array [ ] array [ ] int32 0 method call sender=:1.333 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=CloseNotification uint32 42
Also note the notification failure of a -1 timeout (documentation is contradictory):
gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 42 "" "sigma-ry" "corpus" [] {} -1
though this "works"
notify-send "test" -t -1
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?