Как я могу использовать "уведомить-отправить", чтобы немедленно заменить существующее уведомление?
Когда я использую 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
.