Как я могу использовать "уведомить-отправить", чтобы немедленно заменить существующее уведомление?

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

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

6 ответов

Решение

Вы можете, но вы должны использовать исправленный 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 установить libnotify-bin

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

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

  -p, --print-id Распечатать идентификатор уведомления.
  -r, --replace-id=REPLACE_ID Идентификатор уведомления для замены.
  • С -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.

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

    #! / Bin/ Баш
    NID=0
    для меня в {0..100..10} делать NID=$(уведомление-отправка -p -r $NID $i) спать 0,5 сделанный

Вы можете использовать "синхронную" подсказку для создания "подтверждающего" уведомления, которое заменит предыдущие подтверждающие уведомления. Например:

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

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

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

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

без патчей можно просто обойтись

#!/bin/bash

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

Закладка:
Как я могу использовать "уведомить-отправить", чтобы немедленно заменить существующее уведомление?


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

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

sudo killall notify-osd

Я создал простой скрипт на python, который работает почти так же, как notify-send, но поддерживает --replaces-id,

notify-send.py

Интернет: https://github.com/phuhl/notify-send.py

Скрипт Python для отправки уведомлений на рабочий стол из оболочки.

Около

Libnotify является частью многих скриптов в мире Linux. Он использует многие из указанных функций спецификации уведомлений рабочего стола и делает их доступными для сценариев оболочки. Однако это не позволяет заменить существующее уведомление replaces-id, Это известная ошибка с 2008 года, а с 2012 года - патч. Патч все еще не вышел (2018).

Этот скрипт на python использует пакет notify2 и предоставляет функциональность оболочке.

Различия между notify-send.py и notify-send

  • В notify-send.py -h показывает подсказку вместо того, чтобы быть параметром для подсказок. Для подсказок используйте --hint,
  • В notify-send.py -r ID а также notify-send.py --replaces-id IDсуществует. Для замены звонка уведомления notify-send.pyс идентификатором, который был возвращен в уведомлении для замены.
  • notify-send.py возвращает идентификатор вновь созданного уведомления.
  • notify-send.py --replaces-process NAME существует. Каждое уведомление, созданное с тем же ИМЯ, заменит каждое уведомление перед тем же ИМЯ. Если вызывается с этим параметром notify-send.py может блокировать, лучше всего звонить с трейлингом &,

Монтаж

Требуется python3.

git clone https://github.com/phuhl/notify-send.py
cd notify-send.py
sudo pip install notify2
sudo python setup.py install

использование

$ notify-send.py -h
usage: notify-send.py [-h] [-u LEVEL] [-t TIME] [-a APP_NAME]
                  [-i ICON[,ICON...]] [-c TYPE[,TYPE...]]
                  [--hint TYPE:NAME:VALUE] [-r ID]
                  [--replaces-process NAME]
                  SUMMERY [BODY]

positional arguments:
      SUMMERY
      BODY

optional arguments:
      -h, --help        show this help message and exit
      -u LEVEL, --urgency LEVEL
                        Specifies the urgency level (low, normal, critical).
      -t TIME, --expire-time TIME
                        Specifies the timeout in milliseconds at which to
                        expire the notification.
      -a APP_NAME, --app-name APP_NAME
                        Specifies the app name for the icon
      -i ICON[,ICON...], --icon ICON[,ICON...]
                        Specifies an icon filename or stock icon to display.
      -c TYPE[,TYPE...], --category TYPE[,TYPE...]
                        Specifies the notification category.
      --hint TYPE:NAME:VALUE
                        Specifies basic extra data to pass. Valid typesare
                        int, double, string and byte.
      -r ID, --replaces-id ID
                        Specifies the id of the notification that should be
                        replaced.
     --replaces-process NAME
                        Specifies the name of a process that should take care
                        of replacing notifications for this process.

уведомить-отправить [.py] от имени пользователя root

Для отображения уведомлений, даже если libnotify или

notify-send.py

используется от пользователя root, эти два сценария полезны.

#!/bin/bash
username=<your username here>
if [ "$(id -u)" != "1000" ] ; then
    sudo -u $username DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send.sh "$@"
else
    notify-send.sh "$@"
fi

С notify-send.sh как это:

#!/bin/bash
notify-send.py "$@" &

Смотрите также

Также взгляните на мой демон уведомлений, вдохновленный Dunst, но с несколькими улучшениями, включая возможность прозрачного фона и центра уведомлений, в котором хранятся уведомления.

Использование вызова gdbus (работает в Debian 10)

      #!/bin/bash

last_id='0'

for i in {0..10}; do

    volume=$(( i * 10 ))

    r=$(gdbus call \
        --session \
        --dest org.freedesktop.Notifications \
        --object-path /org/freedesktop/Notifications \
        --method org.freedesktop.Notifications.Notify \
        'Xfce volume control' \
        "$last_id" \
        'audio-volume-medium-symbolic' \
        "Volume $volume%" \
        '' \
        '[]' \
        "{'x-canonical-private-synchronous': <''>, 'transient': <true>, 'value': <$volume>}" \
        2000)

    last_id="${r:8:-2}"

    sleep 0.5

done

С помощью dbus-monitor, этот пост в блоге и этот вопрос

Это рабочий пример ответа Марка Л .:

При использовании этого метода всплывающая подсказка с подтверждением перекрывает верхнюю панель панели. Традиционно всплывающее уведомление , которое появляется ниже верхней панели панели.

Пузырь уведомлений обычно длится несколько секунд, но выше gifпузырь подтверждения немедленно сменяется следующим. Метод заключается в вызове notify-sendкоманда в цикле:

      # Make volume bar using progress bar methods
VolumeBar $CurrVolume
# Ask Ubuntu: https://askubuntu.com/a/871207/307523
notify-send --urgency=critical "tvpowered" \
    -h string:x-canonical-private-synchronous:volume \
    --icon=/usr/share/icons/gnome/48x48/devices/audio-speakers.png \
    "Volume: $CurrVolume $Bar"

В приведенном выше фрагменте кода функция VolumeBarустанавливает переменную $Barс индикатором выполнения на основе значения, переданного в $CurrVolume.

Другие вопросы по тегам