Очистка / изменение предыдущих уведомлений libnotify?

Я написал сценарий, который генерирует такие уведомления:

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

Есть ли способ очистить или заменить эти уведомления из командной строки или из Python? По сути, у меня есть сценарий, который переключает между двумя приемниками PulseAudio, и я хотел бы удалить предыдущие уведомления этого типа, чтобы заменить их обновленным текстом, если пользователь быстро переключится.

  • Как установить переменную прокси-сервера HTTP для заданий cron?
  • Как проверить статус скрипта оболочки bash при выполнении из сценария Python?
  • csvkit Разрешение отклонено
  • Изменение оболочки по умолчанию на Python
  • Рубиновая альтернатива ткани
  • Archlinux собственно PKGBUILD: исполняемая ошибка Python
  • Сценарий highlight_focus для выделения текущего экрана не работает
  • Как сделать отступ Kate с пробелами в файлах Python, но использовать вкладки для текстовых файлов и других файлов?
  • 2 Solutions collect form web for “Очистка / изменение предыдущих уведомлений libnotify?”

    Из CLI вы можете отображать и закрывать всплывающее уведомление через gdbus / qdbus .
    Вот как это сделать с 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 

    это выведет что-то вроде:

     (uint32 72,) 

    72ID уведомления. Теперь, когда вы знаете ID вы можете закрыть всплывающее окно с помощью:

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

    Теперь, если вам нужен ID позже, просто напишите его в файл при вызове 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 

    и получить его оттуда, когда вы хотите закрыть всплывающее окно:

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

    PS Я нахожусь в Gnome 3 и уведомления, отправленные через pynotify notify-send , pynotify , libnotify т. Д., Только последние 5 секунд, независимо от параметра time (это поведение по умолчанию в Gnome 3, не спрашивайте меня почему). Кроме того, они не складываются: Gnome отображает только одно уведомление за раз. Поэтому я не могу тестировать несколько всплывающих окон, но он должен работать.

    Используйте метод update метод show call снова:

     #!/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() 

    Обновить:

    Существует close метод, но … он не работает вообще. Видимо, не только для меня:

    Я думал, что это может быть вызвано ошибкой в ​​привязках, поэтому я создал эту программу на 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); } 

    И скомпилировал его с помощью:

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

    Это не сработало. Похоже, здесь что-то прослушивается.

    Затем я попытался использовать модуль pickle для сохранения ссылки – он тоже не работает. Вы не можете хранить ссылки на них.

    Поэтому единственное, что я могу придумать, – это разделить ваш скрипт на два: демон и клиент. После запуска клиент должен связаться с демоном, который все время работал в фоновом режиме со ссылкой на экземпляр уведомления.

    Linux и Unix - лучшая ОС в мире.