5

Я устанавливаю уведомление с notify-send в сценарии. Единственная проблема заключается в том, что когда скрипт вызывается несколько раз, все уведомления добавляются в стек уведомлений и вызываются только одно за другим.

Есть ли способ очистить все уведомления на экране и отобразить новое?

4 ответа4

12

На самом деле это возможно с помощью уведомления-отправки:

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

Устанавливая transient подсказку, когда уведомление истекает или отклоняется, оно не задерживается в панели уведомлений.

4

К сожалению, вы не можете очистить или "отклонить" notify-osd. Возможно, вам повезет больше, если вы используете Zenity ; у него больше опций, чем у уведомления-отправки.

Вы можете использовать опцию --timeout чтобы отклонить уведомление через некоторое количество секунд.

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

Вы также можете сохранить список идентификаторов процессов (в переменной или файле среды) предыдущих уведомлений и отправить им сигнал HUP чтобы очистить их перед отображением нового уведомления.

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" &

Или убейте все процессы zenity перед отображением нового уведомления:

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

Или убейте определенные процессы zenity перед отображением нового уведомления:

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" &
3

Возможно, не лучший вариант, но вот альтернатива: вы можете просто убить процесс notify-osd и перезапустить его. Затем опубликуйте свое уведомление.

pkill notify-osd
/usr/lib/x86_64-linux-gnu/notify-osd &
notify-send "Hello!"
1

К сожалению, это не представляется возможным с уведомлениями, установленными notify-send . Взгляните на исходный код notify-send.c - он создает уведомление, устанавливает его параметры, но нигде не сохраняет ссылки на него. Вместо этого, он называет g_object_unref который, как я понимаю , из здесь, фактически исключает возможность внешнего взаимодействия с сообщением. Таким образом, чтобы иметь расширенные возможности управления уведомлениями, вам нужно использовать инструмент, отличный от notify-send (возможно, пользовательское приложение).


Возможным грубым взломом для достижения вашей цели будет сценарий с использованием инструментов xautomation . Вы можете использовать их, чтобы найти кнопки "закрыть" во всех всплывающих уведомлениях и имитировать щелчок мышью на каждом из них. Но это не так просто и, конечно, не изящное решение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .