Como limpar notificações enviadas por script de shell

Oct 12 2020

Em meu script, estou enviando uma notificação ao usuário e solicitando que ele insira alguns dados. Depois disso, quero limpar a notificação enviada anteriormente. A notificação deve permanecer na bandeja até que o usuário insira os dados.

Atualmente estou usando notify-send, mas só foi possível limpar por tempo limite.

O que eu quero é algo assim:

send-notification --title="Hey, enter some data pls" --id=999
prompt-to-enter-data
delete-notification --id=999

Estou usando o linux Mint 20. Com canela DE (v4.6.6).

notify-osd não está instalado.

Respostas

2 KamilMaciorowski Oct 13 2020 at 16:36

É possível, mas não com notify-send. Você precisa falar com o serviço de notificações da área de trabalho com uma ferramenta menos especializada, como gdbus. Isso permitirá que você chame vários métodos de um shell.

Uma alternativa é dbus-send, mas não (pelo menos por enquanto) suporta o varianttipo necessário para o org.freedesktop.Notifications.Notifymétodo. Nós vamos nos manter gdbus.

Verifique man 1 gdbus. Inclui um exemplo que envia uma notificação:

gdbus call --session \
            --dest org.freedesktop.Notifications \
            --object-path /org/freedesktop/Notifications \
            --method org.freedesktop.Notifications.Notify \
            my_app_name \
            42 \
            gtk-dialog-info \
            "The Summary" \
            "Here's the body of the notification" \
            [] \
            {} \
            5000

Isso deve imprimir (uint32 42,)onde 42está o ID da notificação. Na verdade, o exemplo especifica 42explicitamente, o que significa que se já houver uma notificação com este ID exato, ela será substituída. Para criar uma nova notificação, especifique 0. Um ID codificado (como 999na sua pergunta) é possível, mas e se o ID já for obtido por alguma notificação não relacionada e possivelmente importante? Por esse motivo 0, especifique , capture a saída, isole o novo ID e use-o com org.freedesktop.Notifications.CloseNotification.

Links Úteis:

  • org.freedesktop.Notifications.Notify
  • org.freedesktop.Notifications.CloseNotification
  • nomes de ícones padrão

Script de exemplo:

#!/bin/sh

tty="$(tty)" id="$(gdbus call --session \
                 --dest org.freedesktop.Notifications \
                 --object-path /org/freedesktop/Notifications \
                 --method org.freedesktop.Notifications.Notify \
                 my_script \
                 0 \
                 utilities-terminal \
                 "Response required" \
                 "Script awaiting input ($tty)." \ [] \ {} \ 0 )" id="${id##* }"
id="${id%,)}" printf 'Type here: ' read foo >/dev/null gdbus call --session \ --dest org.freedesktop.Notifications \ --object-path /org/freedesktop/Notifications \ --method org.freedesktop.Notifications.CloseNotification \ "$id"