Est-ce que org.freedesktop.Notifications.CloseNotification (uint id) peut être déclenché et appelé via DBus?

3

ref:
Bouton Fermer sur notify-osd?

Signet:
Can org.freedesktop .Notifications.CloseNotification (uint id) doit ê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 de préciser la notification OSD cible spécifique à annuler, en utilisant org.freedesktop.Notifications.CloseNotification(uint id) . Existe-t-il une méthode d’interface permettant au système de lancer le DBus lorsqu’un événement de notification particulier se produit?

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

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

peut être utilisé à partir du shell si l’argument (uint id) peut être déterminé. La syntaxe de la commande utilise un entier à la place de (uint id) .

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

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

renvoie

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

ou

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

renvoie

... string ":1.340" ...

Avec le recul, la question précédente "Comment le (uint id) est-il trouvé pour une notification?" est rhe torique vu cette réponse précédente à une autre question:
/ 186311/89468 "> lien
fournit des détails pour que l'une des méthodes ci-dessous puisse être utilisée:

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-OSD pop-up 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 :?.???  )

Le "truc" consiste à trouver l'adresse :?.??? DBus.

    
posée george rowell 19.09.2012 - 06:28
la source

3 réponses

1

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 cette 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 fermer une notification? "

Est-ce par implication ou par processus d'élimination que l'énoncé "... indique seulement que l'ID doit être unique, non nul et inférieur à MAXINT ...", trouvé 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 en découle qu'il doit exister une sorte de "handle" d'ID 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 CloseNotification % c_de% a quelque chose à voir avec cela comme démontré avec des tests empiriques ci-dessous. / p>

Citant 9.1.3. org.freedesktop.Notifications.CloseNotification dans son intégralité:

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 l’absence de tableau décrivant le paramètre (UINT32 id) . Tous les autres paramètres pour les méthodes et les signaux sont qualifiés avec de telles tables.

Les tests empiriques montrent que les notifications ne se ferment pas avec la valeur de retour de NotificationClosed (UINT32 id) :

 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\(.*\),)//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\(.*\),)//g'                            )

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

Quelques autres 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\(.*\),)//g'                            )

et même en forçant un ID constant, en définissant Notify à 42 et UINT32 replaces_id à 0, on voit que expire_timeout n’a pas d’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\(.*\),)//g'                            )

La notification ne se ferme pas même si CloseNotification effectue un aller-retour entre les méthodes, comme l'a confirmé

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

dans la sortie

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

Notez également l'échec de notification d'un délai d'expiration de -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

si cela "fonctionne"

notify-send "test" -t -1

ref:
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 soit sortie ?
Comment utiliser 'notify-send' pour remplacer immédiatement une notification existante?

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

    
réponse donnée George Rowell 22.09.2012 - 00:17
la source
0

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

    
réponse donnée dobey 19.09.2012 - 21:38
la source
0

Je sais que je suis un peu en retard, mais j'ai moi-même rencontré ce problème aujourd'hui, et cela peut être utile pour les autres!

Tout d’abord, installez un correctif libnotify-bin prenant 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 expiration du délai, puis ferme la notification une fois la commande terminée (dans ce cas, attendez 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)
    
réponse donnée Teresa e Junior 12.04.2013 - 19:27
la source

Lire d'autres questions sur les étiquettes