Jak mogę tymczasowo odfiltrować niektóre bąbelki powiadomień pochodzące z określonych źródeł?

12

Mam skonfigurowany system tak, że gdy otrzymuję nową pocztę, na ekranie pojawia się balon powiadomienia. Jest to czasami wygodne, a innym razem rozprasza. Czy bez konieczności odinstalowywania używanej przeze mnie integracji Gmaila, czy istnieje sposób centralnego przełączania, czy określone rodzaje powiadomień będą wyświetlane?

Innymi słowy, szukam aplikacji (lub interfejsu API), która pozwala mi zobaczyć listę „zarejestrowanych” aplikacji korzystających z usługi powiadomień i przełączać je jako włączone / wyłączone. Lub coś, co pozwala mi utworzyć jedno lub więcej wyrażeń regularnych, których można użyć do dopasowania nazwy aplikacji źródłowej lub zawartości bąbelków powiadomień, a jeśli wystąpi dopasowanie, do zablokowania powiadomienia.

znak
źródło
1
W przeciwieństwie do powiadomień Gnome-Shell aplikacja Ubuntu nie rejestruje się w usłudze powiadomień. Używa libnotify do powiadomień, które są zakodowane na stałe w aplikacjach. Możesz spróbować wyłączyć powiadomienia z preferencji aplikacji, jeśli ma ona preferencje powiadomień (takie jak gwibber, ewolucja, thunderbird itp.).
Khurshid Alam,
@orschiro To nie jest duplikat (ostatnio opublikowanego) pytania, o którym mówiłeś - to pytanie dotyczy możliwości programowego filtrowania tylko niektórych rodzajów powiadomień, jednocześnie umożliwiając innym. Drugie pytanie dotyczy w szczególności wyciszenia wszystkich powiadomień.
Mark
Masz rację. Na pierwszy rzut oka tęskniłem. Dziękuję Ci!
orschiro

Odpowiedzi:

2

Możesz filtrować to na poziomie d-bus, ale wygląda to na dużo pracy. Najpierw zapoznaj się z tym postem, aby uzyskać informacje na temat działania systemu OSD

Uruchom dbus-monitor, zanim wyślesz polecenie „powiadom-wyślij” na osobnej konsoli.

wywołanie metody sender =: 1.2450 -> dest = org.freedesktop.DBus serial = 5 ścieżka = / org / freedesktop / DBus; interfejs = org.freedesktop.DBus; member = GetNameOwner
   ciąg „org.freedesktop.Notifications”
wywołanie metody sender =: 1.2450 -> dest =: 1.41 serial = 6 ścieżka = / org / freedesktop / Notifications; interfejs = org.freedesktop.Notifications; member = GetServerInformation
metoda return sender =: 1.41 -> dest =: 1.2450 respond_serial = 6
   ciąg „not-osd”
   ciąg „Canonical Ltd”
   ciąg „1.0”
   ciąg „1.1”
wywołanie metody sender =: 1.2450 -> dest =: 1.41 serial = 7 ścieżka = / org / freedesktop / Notifications; interfejs = org.freedesktop.Notifications; member = Powiadom
   ciąg „powiadom-wyślij”
   uint32 0
   ciąg „/usr/share/pixmaps/debian-logo.png”
   ciąg „My Title”
   ciąg „Some body text”
   tablica [
   ]
   tablica [
      wpis dyktowany (
         ciąg „pilność”
         wariant bajtu 1
      )
   ]
   int32 -1

powiadomienie-osd działa na dbus

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

ale nie ma żadnych dodatkowych ograniczeń dla tej usługi w /etc/dbus-1/system.d

Możesz więc utworzyć plik konfiguracyjny, który może odfiltrowywać zdarzenia powiadomień na podstawie ich źródła i uzyskać kontrolę, której szukasz. To najlepsze, co mogę zrobić bez zagłębiania się w problem i specyfikację dbus. Mam nadzieję, że to pomoże, a to, czego szukasz, powinno być łatwiejsze do skonfigurowania na początek.

ppetraki
źródło
2

... ale to wygląda na dużo pracy ...

Nie jest tak naprawdę źle, przynajmniej dla prymitywnego ogólnego rozwiązania.

Oto kopia szczegółów z mojej odpowiedzi na zeszłoroczny (wrzesień 2012) post w

Jak wyłączyć powiadomienia z menedżera sieci .

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

Zamień string "NetworkManager"na żądany RE, aby określić blokowanie.

Aby dowiedzieć się, jaki wzorzec RE pasuje do wyszukiwania, należy uruchomić:
dbus-monitor "interface='org.freedesktop.Notifications'"
i spójrz na dane wyjściowe, gdy pojawiają się powiadomienia.

to znaczy. aby usunąć notify-sendrównież wiadomości, użyj tego grepwiersza:

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

Zastrzeżenie :
killall notify-osdjest niedyskryminujące i całkowicie czyści stos powiadomień wszelkich oczekujących wiadomości, niezależnie od tego, NetworkManagerczy notify-sendjest to agent powiadamiający.

„Uczciwe” rozwiązanie musi uwzględniać ewentualne warunki wyścigu, gdy pomiędzy określeniem czyszczenia powiadomień a wykonaniem go pojawia się kolejne powiadomienie, które powinno wyskoczyć i nie powinno być usuwane wraz z resztą.

Ponadto, jeśli powiadomienia oczekują, gdy nadejdzie obraźliwe, które ma zostać zablokowane, wszystkie zostaną usunięte. Sytuację tę można przynajmniej rozwiązać, wykonując kopię dbusoczekujących powiadomień, a następnie ponownie żądane powiadomienia notify-sendpo zakończeniu czyszczenia.

To trochę ręcznie pracochłonnej pracy!

W idealnym przypadku bezpośrednie użycie magistrali dbus

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

ukierunkowanie tylko na wybrane powiadomienia, niestety nie jest oczywiste ... jednak ...

Inna odpowiedź
Czy org.freedesktop.Notifications.CloseNotification (uint id) może być wyzwalany i wywoływany przez DBus?
pokazuje, jak używać [1], przynajmniej z notify-send, ale niestety nie do arbitralnego powiadamiania aps. choć niektóre aps. mają niestandardowe interfejsy do kontrolowania wyskakujących powiadomień.

odniesienia:

troll la la la
źródło