Come cancellare la notifica inviata dallo script di shell

Oct 12 2020

Nel mio script invio una notifica all'utente e gli chiedo di inserire alcuni dati. Dopodiché desidero cancellare la notifica inviata in precedenza. La notifica dovrebbe rimanere nel vassoio finché l'utente non inserisce i dati.

Attualmente sto usando notify-send, ma potrebbe essere cancellato solo per timeout.

Quello che voglio è qualcosa del genere:

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

Sto usando linux Mint 20. Con cinnamon DE (v4.6.6).

notify-osd non è installato.

Risposte

2 KamilMaciorowski Oct 13 2020 at 16:36

È possibile, ma non con notify-send. Devi parlare al tuo servizio di notifiche desktop con uno strumento meno specializzato, come gdbus. Ti permetterà di chiamare vari metodi da una shell.

Un'alternativa è dbus-send, ma (almeno per ora) non supporta il varianttipo richiesto dal org.freedesktop.Notifications.Notifymetodo. Ci atterremo a gdbus.

Controlla man 1 gdbus. Include un esempio che invia una notifica:

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

Dovrebbe stampare (uint32 42,)dove si 42trova l'ID di notifica. In effetti l'esempio specifica 42esplicitamente, il che significa che se esiste già una notifica con questo ID esatto, verrà sostituita. Per creare una nuova notifica specificare 0. È possibile un ID hardcoded (come 999nella tua domanda), ma cosa succede se l'ID è già preso da qualche notifica non correlata, forse importante? Per questo motivo specificare 0, acquisire l'output, isolare il nuovo ID e utilizzarlo con org.freedesktop.Notifications.CloseNotification.

Link utili:

  • org.freedesktop.Notifications.Notify
  • org.freedesktop.Notifications.CloseNotification
  • nomi di icone standard

Script di esempio:

#!/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"