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?