Как использовать «уведомление-отправку» для немедленной замены существующего уведомления?

17

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

Есть ли способ получить notify-send , чтобы немедленно заменить существующее уведомление другим?

    
задан ish 10.07.2012 в 07:54
источник

3 ответа

13

Вы можете, но вы должны использовать исправленную libnotify для этого

notify-send не имеет возможности заменять существующие уведомления до истечения срока их (или исчезновения). Это известная ошибка . Тем не менее, комментатор отчета об ошибке опубликовал исправление для исправления он.

Установка исправленного libnotify-bin из PPA

Я создал исправленную версию пакета libnotify-bin , который позволяет заменять мои PPA. В настоящее время это только для Ubuntu 12.04, но если вам это нужно для любой другой версии, поддерживаемой в настоящее время, отправьте комментарий, и я постараюсь сделать все возможное.

Чтобы установить, откройте терминал и:

sudo apt-add-repository ppa:izx/askubuntu
sudo apt-get update
sudo apt-get install libnotify-bin

Как использовать возможности замены

Патч notify-send содержит два новых ключа: -p (или - print-id ) и -r (или - replace-id ). --help описывает их как:

  -p, --print-id                    Print the notification ID.
  -r, --replace-id=REPLACE_ID       The ID of the notification to replace.
  • С -p каждый notify-send вернет идентификатор N (число / целое число).
  • Выдача другого notify-send с -r N заменит предыдущее уведомление немедленно .
  • Например, для bash вы можете сохранить идентификатор из notify-send -p ... с помощью:

    NID=$(notify-send -p "MESSAGE-1")
    

    , а затем замените его на:

    notify-send -r $NID "MESSAGE-2"
    
  • Вы можете рекурсивно использовать как -p , так и -r в сценарии, если инициализирована переменная -r до нуля в начале.

  • Вот простой скрипт, который показывает уведомления с 0 по 100 с интервалом в полсекунды:

    #!/bin/bash
    NID=0
    for i in {0..100..10}    do       NID=$(notify-send -p -r $NID $i)       sleep 0.5    done
ответ дан ish 10.07.2012 в 07:54
источник
10

X-ref:
Как заставить новое уведомление в notify-osd появиться, не дожидаясь выхода более раннего?

без патчей вы можете просто сделать

#!/bin/bash

for i in {0..100..10}
    do
          killall notify-osd
          notify-send "testing" $i
          sleep 1
    done

Закладка:
Как мне использовать 'notify-send' для немедленной замены существующего уведомления?

Отправляет сообщение об ошибке-osd (2592): операция не разрешена. Что это значит?

Это может означать, что привилегии неадекватны:

sudo killall notify-osd
    
ответ дан george rowell 19.09.2012 в 05:37
6

Вы можете использовать «синхронный» намек, чтобы создать уведомление о подтверждении, которое заменит предыдущие уведомления о подтверждении. Например:

notify-send "Message" -h string:x-canonical-private-synchronous:anything

«x-canonical-private-synchronous» подсказка указана в этом документе . Чтобы указать подсказку, используйте -h type:name:value . Тип здесь string , имя x-canonical-private-synchronous , и кажется, что значение может быть любым, что вы хотите.

Итак, если ваше первое уведомление создано с этим подсказкой и , второе будет также, второе немедленно заменит первое. (См. Анимация и длительность в документации в столбце «Буферы подтверждения».)

    
ответ дан Mark L 12.01.2017 в 21:14