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