Jak usunąć balonik z basha

5

Ustawiam powiadomienie notify-sendw skrypcie. Jedynym problemem jest to, że gdy skrypt jest wywoływany kilka razy, wszystkie powiadomienia są dodawane do stosu powiadomień i wywoływane tylko jeden po drugim.

Czy istnieje sposób na usunięcie wszystkich powiadomień na ekranie i wyświetlenie nowego?

Stefan
źródło

Odpowiedzi:

4

Niestety, nie można wyczyścić lub „odrzucić” notify-osdpowiadomień. Zamiast tego możesz mieć lepsze szczęście dzięki Zenity ; ma więcej opcji niż powiadomienie-wysyłanie .

Możesz użyć --timeoutopcji odrzucenia powiadomienia po upływie pewnej liczby sekund.

zenity --info --timeout=5 --title="Test Notification" --text "$(date +%Y%m%d-%H%M%S): My notification"

Możesz także zachować listę identyfikatorów procesów (w zmiennej środowiskowej lub pliku) poprzednich powiadomień i wysłać im HUPsygnał, aby usunąć je przed wyświetleniem nowego powiadomienia.

i=0
pids=
for x in $(seq 1 5); do
    i=$((i + 1))
    zenity --info --title="Test Multiple Notifications" --text "$(date +%Y%m%d-%H%M%S): Notification number $i" &
    pids+="$! "
done
sleep 5
for p in $pids; do kill -HUP $p >/dev/null 2>&1; done
i=$((i + 1))
zenity --info --timeout=2 --title="Test Multiple Notifications" --text "$(date +%Y%m%d-%H%M%S): Notification number $i" &

Lub zabij wszystkie zenityprocesy przed wyświetleniem nowego powiadomienia:

killall zenity
zenity --info --title="Test Notifications" --text "$(date +%Y%m%d-%H%M%S): My notification" &

Lub zabij niektóre zenityprocesy przed wyświetleniem nowego powiadomienia:

ps ho pid,args | grep -i 'zenity.\+--title=test notifications' | sed -e 's/^ *\([0-9]\+\).*$/\1/'
zenity --info --title="Test Notifications" --text "$(date +%Y%m%d-%H%M%S): My notification" &
Dan Cruz
źródło
Byłoby niesprawiedliwe, gdybym to zanegował, ale wyraźnie się mylisz . Jeśli chodzi o powiadomienia, zenityma znacznie gorszy zestaw opcji niż notify-send. I w żaden sposób nie rozwiązuje problemu, ponieważ nie daje również kontroli nad już wysłanymi powiadomieniami.
jankes
@jankes: Przepraszam, początkowo odpowiedziałem na komórkę i nie mogłem naprawdę rozwinąć mojej odpowiedzi. Zmieniłem moją odpowiedź na rozwinięcie.
Dan Cruz
Prezentowane są okna informacyjne , a nie powiadomienia . mogą być używane jako forma substytutu, ale mają zupełnie inny charakter. Aby utworzyć powiadomienia o zenity, trzeba użyć --notificationopcji wraz z --listen.
jankes
@ DanCruz Działa, ale dostaję ten błąd: „** (zenity: 8624): OSTRZEŻENIE **: Błąd pobierania adresu magistrali dostępności: org.freedesktop.DBus.Error.ServiceUnknown: Nazwa org.a11y.Bus nie została podana przez dowolne pliki .service Gtk-Message: GtkDialog zmapowany bez przejściowego rodzica.
Dr.jacky
13

W rzeczywistości jest to możliwe przy użyciu powiadomienia-wysyłania:

notify-send --hint int:transient:1 "Title" "Body"

Ustawiając transientwskazówkę, kiedy powiadomienie wygaśnie lub zostanie odrzucone, nie pozostanie w pasku powiadomień.

Ziyan
źródło
4

Może nie jest to najlepsza opcja, ale oto alternatywa: możesz po prostu zabić notify-osdproces i uruchomić go ponownie. Następnie opublikuj swoje powiadomienie.

pkill notify-osd
/usr/lib/x86_64-linux-gnu/notify-osd &
notify-send "Hello!"
Valeriu Paloş
źródło
Dla mnie, używając XFCE, proces nie został nazwany notify-osd, ale zamiast tego xfce4-notifydbardziej szczegółowo /usr/lib/x86_64-linux-gnu/xfce4/notifyd/xfce4-notifyd. Mogłem to zrobić pkill xfce4-notifydi zabiłoby to istniejące powiadomienie. Przy następnym uruchomieniu powiadomienia-send, ponownie utworzył proces xfce4-notifyd, więc wydawał się bezpieczny.
Scott
1

Niestety nie wydaje się to wykonalne z powiadomieniami ustawionymi przez notify-send. Zapoznaj się z kodem źródłowym notify-send.c - tworzy powiadomienie, ustawia jego parametry, ale nie przechowuje w nim żadnych odniesień do niego. Zamiast tego dzwoni g_object_unref, co, jak rozumiem z tego , skutecznie usuwa możliwość zewnętrznej interakcji z wiadomością. Aby mieć zaawansowane możliwości zarządzania powiadomieniami, musisz użyć innego narzędzia niż notify-send(prawdopodobnie niestandardowa aplikacja).


Możliwym hackiem do osiągnięcia celu będzie skrypt korzystający z narzędzi xautomation . Państwo mogli wykorzystywać je do zlokalizowania „Zamknij” przycisków na wszystkich powiadomień pop-upy i zasymulować kliknięcie myszą na każdy z nich. Ale to nie jest takie łatwe, a na pewno nie jest fajne rozwiązanie.

jankesi
źródło