Как программно закрыть окно notify-send?

Вопрос или проблема

У меня есть bash-скрипт, который открывает окно с помощью notify-send. Я хотел бы закрыть это окно, когда скрипт завершится, но не могу найти ничего, что нужно kill.

Этот вопрос является дубликатом https://askubuntu.com/questions/639754/is-it-possible-to-cancel-or-clear-a-notification-created-by-using-notify-send , но ни один из ответов мне не подходит. В принятом ответе говорится, что нужно убить процесс под названием notify-osd, но у меня нет ничего такого. Примечательно, что этот вопрос был задан десять лет назад.

Мой скрипт выглядит так:

notify-send -u critical -i ~/.icons/my-icon.png "$titletext" "$helptext"
helppid=$!
…
kill $helppid

(Настройка срочности критична, чтобы окно Помощи оставалось открытым, пока его явно не закроют.)

Проблема в том, что $! не возвращает значение. ps -ef | grep -i notify ничего не показывает, связанного с моим скриптом.

Я нашел обходной путь, используя функцию print-id в notify-send (описанную в https://askubuntu.com/a/161852 ):

print-id=$(notify-send -p -u critical -i ~/.icons/my-icon.png "$titletext" "$helptext")
notify-send -r $print-id -u low ~/.icons/my-icon.png "$titletext" Finished

Может ли кто-нибудь описать лучший способ закрыть диалоговое окно помощи? Я прочитал рекомендации по yad и рассматриваю возможность установить и оценить его.

Ваш обходной путь звучит как идеальное решение. Как это часто бывает,
archlinux
предоставляет больше информации о том, как работают уведомления; сейчас они обычно
реализуются на рабочем столе с помощью dbus.

dbus — это фоновый сервис, который позволяет инструментам заявлять, что они готовы
предоставить какую-либо функцию под известным именем, таким как
“org.freedesktop.Notifications” для всплывающих уведомлений. Когда приложение,
например, notify-send, хочет показать уведомление, оно отправляет сообщение через
dbus на известное имя функции, и слушающий инструмент выполняет
ожидаемое действие, отправляя обратно id уведомления для последующего использования.

Вот почему notify-send может завершиться почти мгновенно, и вы не видите
нового запущенного процесса; обычно инструмент, предоставляющий функцию, имеет тенденцию
работать всё время как демон или как часть какого-то большего кода на рабочем столе.
dbus также может быть настроен для запуска инструмента “по требованию”, если он не
уже слушает сообщения.

Таким образом, самый чистый способ снять уведомление — это использовать тот же
API и использовать notify-send для обновления предыдущего уведомления с новым
статусом. Это не требует от вас знания того, какой инструмент предоставляет всплывающее окно, если таковой имеется,
поэтому это наиболее перспективный подход.

Ответ или решение

Как программист в сфере ИТ, вы сталкиваетесь с проблемой управления уведомлениями, созданными с помощью инструмента notify-send в базовой оболочке. Возникает вопрос о том, как программно завершить уведомление или окно, сформированное этой утилитой, особенно когда процесс, связанный с уведомлением, не появляется в списке активных процессов. Исследуем эту задачу и определим оптимальное решение.

Проблема

Вы создаете критическое уведомление с помощью bash-скрипта и хотите завершить его после выполнения скрипта. Однако notify-send не запускает отдельный процесс, что делает невозможным использование простого kill для его завершения. Стандартный подход с использованием kill $! здесь не срабатывает.

Решение

Ваш обходной путь с использованием функции print-id в notify-send — хороший подход. Он включает:

  1. Создание уведомления с опцией -p для получения ID уведомления:

    print-id=$(notify-send -p -u critical -i ~/.icons/my-icon.png "$titletext" "$helptext")
  2. Использование этого ID для обновления или отмены существующего уведомления:

    notify-send -r $print-id -u low ~/.icons/my-icon.png "$titletext" "Finished"

Объяснение

Система нотификаций теперь чаще всего реализуется через D-Bus. Это фоновый сервис, который позволяет приложениям взаимодействовать друг с другом. notify-send через D-Bus отправляет сообщение на адрес "org.freedesktop.Notifications". Инструмент, обеспечивающий работу этой функции, прослушивает такие сообщения и генерирует уведомления, возвращая ID уведомления для дальнейшего использования.

Таким образом, лучшее решение — использовать тот же API для обновления или отмены уведомления. Это делает ваш скрипт более устойчивым к изменениям в ПО, обеспечивающем работу нотификаций, и избавляет от необходимости знать, какой именно инструмент создает всплывающие окна.

Альтернативы

Можно рассмотреть использование других инструментов, например, yad, который предоставляет более гибкие возможности для работы с уведомлениями и диалоговыми окнами.

Заключение

Использование print-id в notify-send и последующее обновление уведомления через D-Bus — наиболее эффективный способ отмены уведомления. Это решение соответствует современным подходам и обеспечивает надежное взаимодействие с системой уведомлений.

Для дальнейшего изучения возможностей D-Bus вы можете обратиться к документации по Arch Linux, что даст более глубокое понимание внутренней архитектуры работы уведомлений в современных окружениях рабочего стола.

Оцените материал
Добавить комментарий

Капча загружается...