Когда я использую notify-send
, чтобы показать уведомление на рабочем столе, а затем снова использую его, чтобы показать другое уведомление, я заметил, что второе показывает только после , первое исчезло.
Есть ли способ заставить notify-send
немедленно заменить существующее уведомление другим?
notify-send
не имеет возможности заменить существующие уведомления, прежде чем они испытали таймаут (или исчезли). Это - известная ошибка. Однако комментатор на отчете об ошибках отправил патч для фиксации его.
Я создал исправленную версию пакета libnotify-мусорного-ведра, который позволяет замены в моем PPA. В настоящее время это для Ubuntu 12.04 только, но если Вам нужен он для какой-либо другой в настоящее время поддерживаемой версии, добавьте комментарий, и я буду стараться изо всех сил делать это доступным.
Для установки откройте терминал и:
sudo apt-add-repository ppa:izx/askubuntu sudo apt-get update sudo apt-get install libnotify-bin
Исправленный notify-send
включает два новых переключателя, -p
(или - идентификатор печати), и -r
(или - идентификатор замены). --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
сразу заменит предыдущее уведомление.Например, для удара, можно сохранить идентификатор от notify-send -p ...
с:
NID=$(notify-send -p "MESSAGE-1")
и затем замените его:
notify-send -r $NID "MESSAGE-2"
Можно рекурсивно использовать и-p и-r в сценарии, пока-r переменная инициализируется к 0 вначале.
Вот простой сценарий, который показывает уведомления, рассчитывающие от 0 до 100 в полувторых интервалах:
#!/bin/bash
NID=0
for i in {0..100..10} do NID=$(notify-send -p -r $NID $i) sleep 0.5 done
без патчей можно просто сделать
#!/bin/bash
for i in {0..100..10}
do
killall notify-osd
notify-send "testing" $i
sleep 1
done
Закладка:
Как я использую, 'уведомляют - отправляют' для непосредственной замены существующего уведомления?
Отправляет ошибка уведомляют-osd (2592): Операция, не разрешенная. Что это означает?
Это может означать, что полномочия являются несоответствующим требованием:
sudo killall notify-osd
Я создал простой сценарий Python, который работает почти то же, как уведомляют - отправляют, но имеет поддержку --replaces-id
.
сеть: https://github.com/phuhl/notify-send.py
Сценарий Python для отправки настольных уведомлений от оболочки.
Libnotify является частью многих сценариев в мире Linux. Это использует многие указанные функции Настольной Спецификации Уведомлений и делает их доступными для сценариев оболочки. Это однако не позволяет заменять существующее уведомление replaces-id
. Это - известная ошибка с 2008 и имеет патч с 2012. Патч все еще не является восходящим хотя (2018).
Этот сценарий Python использует notify2 пакет и выставляет функциональность оболочке.
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.
Для отображения уведомлений, даже если 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, но с несколькими улучшениями, включая возможность прозрачного фона и центр уведомления, который хранит уведомления.
Вы можете использовать «синхронную» подсказку, чтобы создать «подтверждающее» уведомление, которое заменит предыдущие подтверждающие уведомления. Например:
notify-send "Message" -h string:x-canonical-private-synchronous:anything
Подсказка «x-canonical-private-synchronous» указана в этого документа . Чтобы указать подсказку, используйте -h type:name:value
. Тип здесь - string
, имя - x-canonical-private-synchronous
, и кажется, что значение может быть любым, что вы хотите.
Таким образом, если ваше первое уведомление создано с помощью этой подсказки и , второе тоже будет, второе немедленно заменит первое. (См. Анимации и длительности в документации, в столбце «пузыри подтверждения».)