web-dev-qa-db-fra.com

Org.freedesktop.Notifications.CloseNotification (uint id) peut-il être déclenché et appelé via DBus?

réf:
bouton Fermer sur notify-osd?

Signet:
org.freedesktop.Notifications.CloseNotification (uint id) peut-il être déclenché et appelé via DBus?

Actuellement, ce script

dbus-monitor "interface='org.freedesktop.Notifications'" |             \
grep --line-buffered "member=Notify"                     |             \
sed -u -e  's/.*/killall notify-osd/g'                   |             \
bash

va tuer toutes les notifications en attente.

Il serait préférable d'affiner la notification OSD cible spécifique à annuler, en utilisant org.freedesktop.Notifications.CloseNotification(uint id). Existe-t-il une méthode d'interface qui peut mettre cela (dans?) Le DBus à déclencher lorsqu'un événement de notification particulier se produit?

La méthode devra obtenir le PID de notification à utiliser comme argument pour CloseNotification(uint id). Alternativement,

  qdbus    org.freedesktop.Notifications                \
          /org/freedesktop/Notifications                \
           org.freedesktop.Notifications.CloseNotification(uint id)

pourrait être utilisé à partir du Shell, si l'argument (uint id) pouvait être déterminé. La syntaxe de commande réelle utiliserait un entier à la place de (uint id).

Peut-être une meilleure question à poser en premier pourrait être "Comment l'adresse DBus d'une notification est-elle trouvée?".
Aucun de ces éléments ne l'identifie correctement:

gdbus monitor --session --dest org.freedesktop.Notifications

retour

The name org.freedesktop.Notifications is owned by :1.130
...

ou

dbus-monitor "interface='org.freedesktop.Notifications'"

retour

... string ":1.340" ...

Rétrospectivement, la question précédente "Comment trouve-t-on le (uint id) Pour une notification?" Est théorique étant donné cette réponse précédente à une autre question:
https://askubuntu.com/a/186311/89468
fournit des détails afin que les deux méthodes ci-dessous puissent être utilisées:

gdbus call --session --dest org.freedesktop.DBus                                   \
             --object-path /                                                       \
                   --method org.freedesktop.DBus.GetConnectionUnixProcessID :1.16

retour:

(uint32 8957,)

ou

qdbus --literal --session  org.freedesktop.DBus                                  \
                          /                                                      \
                           org.freedesktop.DBus.GetConnectionUnixProcessID :1.16

retour:

8957

Le graffit de notification pop-up OSD serait alors vaincu avec:

  qdbus    org.freedesktop.Notifications                             \
          /org/freedesktop/Notifications                             \
           org.freedesktop.Notifications.CloseNotification           \
  $(qdbus --literal --session                                        \
           org.freedesktop.DBus                                      \
          /                                                          \
           org.freedesktop.DBus.GetConnectionUnixProcessID :?.???  )

L'astuce consiste à trouver l'adresse DBus :?.???.

3
george rowell

Comment savez-vous ce que (UINT32 id) Est ou n'est pas?

Étant donné l'énoncé You ... need a way to get that ID ... Dans ce réponse et les observations empiriques suivantes, le titre de la question devrait peut-être être remplacé par "Comment gdbus ... -m org.freedesktop.Notifications.CloseNotification ... Peut-il clôturer une notification?"

Est-ce par implication ou par processus d'élimination que la déclaration "... elle indique uniquement que l'ID doit être unique, non nul et inférieur à MAXINT ...", que l'on trouve dans la description de 9.1. 2. org.freedesktop.Notifications.Notify , s'applique également au paramètre CloseNotification(UINT32 id)? Le UINT32 Par processus d'élimination est le seul facteur commun en tant que type d'attribut dans la documentation et il y a une implication qu'il doit y avoir une sorte d'ID "handle" commun mais ...

Les détails de la valeur renvoyée de Notify et de son paramètre UINT32 replaces_id Sont assez explicites mais il n'est pas clair que le (UINT32 id) De CloseNotification a quelque chose à voir avec cela comme démontré par des tests empiriques ci-dessous.

Citation 9.1.3. Org.freedesktop.Notifications.CloseNotification au total:

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.

Cela ne caractérise ni n'explique la signification de (UINT32 id).

Une omission flagrante est le manque d'une table pour décrire le paramètre NotificationClosed (UINT32 id). Tous les autres paramètres des méthodes et des signaux sont qualifiés avec de tels tableaux.

Les tests empiriques montrent que les notifications ne se ferment pas en utilisant la valeur de retour de Notify:

 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'                            )

ou

 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'                            )

La notification ne se ferme pas, ce qui serait le cas si (UINT32 id) Identifié avec la valeur renvoyée Notify.

Quelques tests supplémentaires:

 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'                            )

et même en contraignant un ID constant, en définissant UINT32 replaces_id à 42 et expire_timeout à 0, on constate que CloseNotification n'a aucune 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'                            )

La notification ne se ferme pas même si le 42 effectue l'aller-retour à travers les méthodes comme confirmé par

dbus-monitor "interface='org.freedesktop.Notifications'"

dans la sortie

 méthode appel expéditeur =: 1.332 -> dest = org.freedesktop.Notifications serial = 3 path =/org/freedesktop/Notifications; interface = org.freedesktop.Notifications; membre = Notify 
 string "" 
 uint32 42
 chaîne "" 
 chaîne "sigma-ry" 
 chaîne "corpus" 
 tableau 
 
 tableau 
 
 int32 0 
 méthode appel expéditeur =: 1.333 -> dest = org.freedesktop.Notifications serial = 3 path =/org/freedesktop/Notifications; interface = org.freedesktop.Notifications; membre = CloseNotification 
 uint32 42

Notez également l'échec de notification d'un délai d'attente -1 (la documentation est contradictoire ):

  gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 42 "" "sigma-ry" "corpus" [] {}   -1

bien que cela "fonctionne"

notify-send "test" -t -1

réf:
Quel est le nom du programme qui affiche les notifications? (contradictions du document)
Comment forcer une nouvelle notification dans notify-osd à apparaître sans attendre que la précédente se termine?
Comment utiliser "notifier-envoyer" pour remplacer immédiatement une notification existante?

Signet:
org.freedesktop.Notifications.CloseNotification (uint id) peut-il être déclenché et appelé via DBus?

1
George Rowell

Je sais que je suis un peu en retard, mais j'ai moi-même fait face à ce problème aujourd'hui, et cela peut être utile à d'autres!

Tout d'abord, installez un libnotify-bin Corrigé qui prend en charge l'option -p Pour imprimer l'ID de notification:

Sudo apt-add-repository ppa:izx/askubuntu
Sudo apt-get update
Sudo apt-get install libnotify-bin

Maintenant, un exemple de script qui envoie une notification sans délai, puis ferme la notification une fois qu'une certaine commande est terminée (dans ce cas, il suffit de dormir 5 secondes):

notify-send 'Message...' -i dialog-information \
    -t 0 -h int:transient:1 \
    -p >/tmp/notification_id

sleep 5

qdbus org.freedesktop.Notifications \
     /org/freedesktop/Notifications \
      org.freedesktop.Notifications.CloseNotification \
    $(cat /tmp/notification_id)
0
Teresa e Junior

La méthode CloseNotification est définie comme une méthode D-Bus par la spécification . Cependant, il indique uniquement que l'ID doit être unique, différent de zéro et inférieur à MAXINT. Il ne nécessite pas que l'ID soit le PID du processus appelant. Vous auriez besoin d'un moyen pour obtenir cet ID avant de pouvoir appeler la méthode avec succès.

0
dobey