Como filtrar temporariamente determinados balões de notificação provenientes de fontes específicas?

12

Eu tenho o meu sistema configurado de modo que, quando recebo novas mensagens, um balão de notificação aparece na minha tela. Isso é conveniente às vezes e distrai outras vezes. Sem precisar desinstalar a integração do gmail que estou usando, há uma maneira de alternar centralmente se certos tipos de notificações serão exibidos?

Em outras palavras, estou procurando um aplicativo (ou API) que permita ver uma lista de aplicativos "registrados" que usam o serviço de notificação e alterná-los como habilitados / desabilitados. Ou algo que me permita criar uma ou mais expressões regulares que possam ser usadas para corresponder ao nome do aplicativo de origem ou ao conteúdo do balão de notificação e, se ocorrer uma correspondência, para bloquear a notificação.

Marca
fonte
1
Diferentemente da notificação do Gnome-Shell, o aplicativo On Ubuntu não se registra no serviço de notificação. Ele usa o libnotify para notificação codificada em aplicativos. Você pode tentar desativar a notificação da preferência do aplicativo se ela tiver uma preferência de notificação (como gwibber, evolution, thunderbird etc.).
Khurshid Alam 5/07
@orschiro Esta não é uma duplicata da questão (publicada recentemente) a que você se refere - esta questão é sobre poder filtrar programaticamente apenas certos tipos de notificações, enquanto permite que outras pessoas passem. A outra pergunta é especificamente sobre silenciar todas as notificações.
Mark
Oh, você está certo. Eu perdi isso à primeira vista. Obrigado!
Orschiro

Respostas:

2

Você pode filtrar isso no nível do barramento-d, mas parece muito trabalho. Veja primeiro este post para ter uma ideia de como o osd opera

Inicie o dbus-monitor antes de enviar a execução 'notify-send' em um console separado.

remetente da chamada de método =: 1.2450 -> dest = org.freedesktop.DBus serial = 5 caminho = / org / freedesktop / DBus; interface = org.freedesktop.DBus; member = GetNameOwner
   string "org.freedesktop.Notifications"
remetente de chamada de método =: 1.2450 -> dest =: 1.41 serial = 6 caminho = / org / freedesktop / Notificações; interface = org.freedesktop.Notifications; member = GetServerInformation
método return remetente =: 1.41 -> dest =: 1.2450 reply_serial = 6
   string "notify-osd"
   string "Canonical Ltd"
   string "1.0"
   string "1.1"
remetente de chamada de método =: 1.2450 -> dest =: 1.41 serial = 7 caminho = / org / freedesktop / Notifications; interface = org.freedesktop.Notifications; member = Notificar
   sequência "notificação-envio"
   uint32 0
   string "/usr/share/pixmaps/debian-logo.png"
   string "Meu título"
   string "Algum corpo do texto"
   matriz [
   ]
   matriz [
      entrada de ditado (
         string "urgency"
         byte variante 1
      )
   ]
   int32 -1

notify-osd vive no dbus

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

mas não há restrições adicionais para este serviço no /etc/dbus-1/system.d

Assim, você poderá criar um arquivo de configuração que possa filtrar os eventos de notificação com base na origem e obter o controle que deseja. É o melhor que posso fazer sem me aprofundar no problema e nas especificações do dbus. Espero que isso ajude, o que você procura deve ser mais fácil de configurar para começar.

ppetraki
fonte
2

... mas parece muito trabalho ...

Não é realmente tão ruim, pelo menos para uma solução genérica bruta.

Aqui está uma cópia dos detalhes da minha resposta ao post do ano passado (setembro de 2012) em

Como desativar a notificação do gerenciador de rede .

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

Substitua string "NetworkManager"pelo RE desejado para determinar o bloqueio.

Para ter uma idéia de qual padrão de RE corresponde à procura por execução:
dbus-monitor "interface='org.freedesktop.Notifications'"
e observe a saída enquanto as notificações estão sendo exibidas.

ie para remover notify-sendmensagens também, use esta greplinha:

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

Advertência :
killall notify-osdnão discrimina e limpa completamente a pilha de notificações de quaisquer mensagens pendentes, independentemente de ser NetworkManagerou notify-sendnão o agente notificador.

Uma solução "honesta" precisa levar em consideração possíveis condições de corrida quando, entre a determinação de uma eliminação de notificação, e depois a execução, outra notificação é exibida, que deve aparecer e não ser eliminada com o restante.

Além disso, se as notificações estiverem pendentes quando o infrator a ser bloqueado entrar, todas serão removidas. Essa situação pode pelo menos ser resolvida fazendo uma cópia das dbusnotificações pendentes e, em seguida, reemitindo as desejadas notify-sendapós a limpeza.

Isso é um pouco de trabalho intensivo de mão de obra!

Idealmente, o uso direto de dbus de

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

para segmentar especificamente apenas as notificações desejadas, infelizmente não é óbvio ... no entanto ...

Outra resposta
O org.freedesktop.Notifications.CloseNotification (uint id) pode ser acionado e invocado via DBus?
mostra como usar [1], pelo menos com notify-send, mas infelizmente não para aplicativos de notificação arbitrários. embora alguns aps. possui interfaces personalizadas para controlar as notificações pop-up.

referências cruzadas:

troll la la la
fonte