Effacer / modifier les notifications libnotify précédentes?

J'ai écrit un script qui génère des notifications comme ceci:

notify-send -i audio-card "Transferring audio playback to speakers." \ "Audio playback has been transferred to the analog output speaker system." 

Existe-t-il un moyen d'effacer ou de replace ces notifications à partir de la command line ou de Python? Essentiellement, j'ai un script qui bascule entre deux éviers PulseAudio et j'aimerais effacer les notifications précédentes de ce type pour les replace par le text mis à jour si l'user bascule rapidement.

Depuis CLI, vous pouvez afficher et fermer une gdbus notification via gdbus / qdbus .
Voici comment faire avec gdbus :

 gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20 

cela produira quelque chose comme:

 (uint32 72,) 

72 étant l' ID notification. Maintenant que vous connaissez l' ID vous pouvez fermer la window pop-up avec:

 gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification 72 

Maintenant, si vous avez besoin de l' ID plus tard, il suffit de l'écrire dans un file lorsque vous appelez Notify :

 gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20 | sed 's/[^ ]* //; s/,.//' > /tmp/last_id 

et l'get à partir de là quand vous voulez fermer la window pop-up:

 gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification $(cat /tmp/last_id) 

PS Je suis sur Gnome 3 et les notifications envoyées via notify-send , pynotify , libnotify etc ne durent que 5 secondes quelle que soit l'option time (c'est le comportement par défaut de Gnome 3, ne me requestz pas pourquoi). En outre, ils ne s'emstacknt pas: Gnome affiche seulement une notification à la fois. Donc, je ne peux pas tester avec plusieurs windows pop-up, mais cela devrait fonctionner.

Utilisez la méthode de update et appelez à nouveau la méthode:

 #!/usr/bin/python # -*- coding: utf-8 -*- import pynotify import time pynotify.init("Basic") n = pynotify.Notification("Title1", "body1", "dialog-warning") n.show() time.sleep(1) n.update("Title2", "body2", "dialog-warning") n.show() 

Mettre à jour:

Il y a close méthode close mais … ça ne marche pas du tout. Apparemment, pas seulement pour moi:

Je pensais que cela pouvait être causé par l'erreur dans les bindings donc j'ai créé ce programme C ++:

 #include <libnotify/notify.h> #include <unistd.h> int main(int argc, char **argv) { GError *error = NULL; notify_init("basic"); NotifyNotification *example; example = notify_notification_new("Ttile1", "Body1", NULL); notify_notification_show(example, &error); usleep(1000000); notify_notification_update(example, "Ttile2", "Body2", NULL); notify_notification_show(example, &error); usleep(1000000); notify_notification_close(example, &error); } 

Et compilé avec:

 g++ test.cpp -o test $(pkg-config --libs --cflags libnotify) 

Ça n'a pas marché aussi bien. On dirait qu'il y a quelque chose de bug ici.

Ensuite, j'ai essayé d'utiliser le module pickle pour save la reference – cela ne fonctionne pas aussi bien. Vous ne pouvez pas stocker de reference à ces derniers.

Donc, la seule chose à laquelle je peux penser est de split votre script en deux: le démon et le client. Après l'exécution, le client doit communiquer avec le démon qui s'exécute tout le time en arrière-plan en reference à l'instance de notification.