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?
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 15);do
i=$((i +1))
zenity --info --title="Test Multiple Notifications"--text "$(date +%Y%m%d-%H%M%S): Notification number $i"&
pids+="$! "done
sleep 5for 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"&
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ń.
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.
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.
zenity
ma 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.zenity
, trzeba użyć--notification
opcji wraz z--listen
.W rzeczywistości jest to możliwe przy użyciu powiadomienia-wysyłania:
Ustawiając
transient
wskazówkę, kiedy powiadomienie wygaśnie lub zostanie odrzucone, nie pozostanie w pasku powiadomień.źródło
Może nie jest to najlepsza opcja, ale oto alternatywa: możesz po prostu zabić
notify-osd
proces i uruchomić go ponownie. Następnie opublikuj swoje powiadomienie.źródło
notify-osd
, ale zamiast tegoxfce4-notifyd
bardziej szczegółowo/usr/lib/x86_64-linux-gnu/xfce4/notifyd/xfce4-notifyd
. Mogłem to zrobićpkill xfce4-notifyd
i zabiłoby to istniejące powiadomienie. Przy następnym uruchomieniu powiadomienia-send, ponownie utworzył proces xfce4-notifyd, więc wydawał się bezpieczny.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 dzwonig_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.
źródło