Как я могу временно отфильтровать определенные уведомления-пузыри, поступающие из определенных источников?

12

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

Другими словами, я ищу приложение (или API), которое позволяет мне видеть список «зарегистрированных» приложений, использующих службу уведомлений, и переключать их как включенные / отключенные. Или что-то, что позволяет мне создавать одно или несколько регулярных выражений, которые можно использовать для сопоставления имени-источника-источника или содержимого-уведомления-пузыря, и, если совпадение происходит, для блокировки уведомления.

отметка
источник
1
В отличие от уведомлений Gnome-Shell приложение On Ubuntu не регистрируется в службе уведомлений. Он использует libnotify для уведомления, который жестко запрограммирован в приложениях. Вы можете попробовать отключить уведомление от предпочтения приложения, если оно имеет предпочтение уведомления (например, gwibber, evolution, thunderbird и т. Д.).
Хуршид Алам
@orschiro Это не дубликат (недавно опубликованного) вопроса, на который вы ссылались - этот вопрос касается возможности программной фильтрации только определенных видов уведомлений, позволяя другим проходить через них. Другой вопрос касается именно отключения всех уведомлений.
Марк
О, ты прав. Я пропустил это на первый взгляд. Спасибо!
Орширо

Ответы:

2

Возможно, вы сможете отфильтровать это на уровне d-bus, но это выглядит как большая работа. Сначала посмотрите этот пост, чтобы понять, как работает OSD

Запустите dbus-monitor перед тем, как отправить команду «уведомить-отправить» на отдельной консоли.

отправитель вызова метода =: 1.2450 -> dest = org.freedesktop.DBus serial = 5 путь = / org / freedesktop / DBus; Интерфейс = org.freedesktop.DBus; Член = GetNameOwner
   строка "org.freedesktop.Notifications"
отправитель вызова метода =: 1.2450 -> dest =: 1.41 serial = 6 path = / org / freedesktop / Notifications; Интерфейс = org.freedesktop.Notifications; Член = GetServerInformation
метод return sender =: 1.41 -> dest =: 1.2450 reply_serial = 6
   строка "notify-osd"
   строка "Canonical Ltd"
   строка "1.0"
   строка "1.1"
отправитель вызова метода =: 1.2450 -> dest =: 1.41 serial = 7 path = / org / freedesktop / Notifications; Интерфейс = org.freedesktop.Notifications; член = Уведомить
   строка "уведомить-отправить"
   uint32 0
   строка "/usr/share/pixmaps/debian-logo.png"
   строка "Мой заголовок"
   строка "Некоторое текстовое тело"
   массив [
   ]
   массив [
      запись в диктанте (
         строка "срочность"
         вариант байт 1
      )
   ]
   int32 -1

notify-osd живет на dbus

dpkg -L notify-osd
/usr/share/dbus-1/services/org.freedesktop.Notifications.service

но нет никаких дополнительных ограничений для этого сервиса в /etc/dbus-1/system.d

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

ppetraki
источник
2

... но, похоже, много работы ...

Это не так уж плохо, по крайней мере, для грубого общего решения.

Вот копия деталей из моего ответа на прошлогодний пост (сентябрь 2012) в

Как отключить уведомление от сетевого менеджера .

dbus-monitor "interface='org.freedesktop.Notifications'"                \
| grep --line-buffered  'string "NetworkManager"'                       \
| sed -u -e  's/.*/killall notify-osd/g'                                \
| bash

Замените string "NetworkManager"на нужное RE для определения блокировки.

Чтобы получить представление о том, какое совпадение с шаблоном RE искать, выполните
dbus-monitor "interface='org.freedesktop.Notifications'"
команду : и посмотрите на вывод, пока появляются уведомления.

то есть. для удаления notify-sendсообщений также используйте эту grepстроку:

| grep --line-buffered  'string "NetworkManager"\|string "notify-send"'  \

Оговорка :
killall notify-osdэто недискриминационная и полностью удаляет стек уведомление всех ожидающих сообщений Независимо от того , NetworkManagerили notify-sendявляется уведомительным агентом.

«Честное» решение должно учитывать возможные условия гонки, когда между определением необходимости очистки уведомления и последующим выполнением этого поступает другое уведомление, которое должно всплыть и не быть очищенным с остальными.

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

Это немного ручной трудоемкой работы!

В идеале прямое использование dbus

method void org.freedesktop.Notifications.CloseNotification(uint id)     [1]

к конкретным целям только желаемых уведомлений, к сожалению, не очевидно ... однако ...

Другой ответ
Может ли org.freedesktop.Notifications.CloseNotification (uint id) быть запущен и вызван через DBus?
показывает, как использовать [1], по крайней мере, с notify-send, но, к сожалению, не для произвольных уведомлений aps. хотя некоторые апс. иметь пользовательские интерфейсы для управления всплывающими уведомлениями.

перекрестные ссылки:

тролль ля ля ля
источник