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

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

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

23
задан 12 July 2012 в 00:29

4 ответа

Вы можете, но необходимо использовать исправленный libnotify, чтобы сделать так

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

Установка исправленного libnotify-мусорного-ведра от PPA

Я создал исправленную версию пакета 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
16
ответ дан 12 July 2012 в 00:29

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

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

#!/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
10
ответ дан 12 July 2012 в 00:29

Я создал простой сценарий Python, который работает почти то же, как уведомляют - отправляют, но имеет поддержку --replaces-id.

уведомить-send.py

сеть: https://github.com/phuhl/notify-send.py

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

О нас

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

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

Различия между уведомляют-send.py и уведомляют - отправляют

  • В 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, но с несколькими улучшениями, включая возможность прозрачного фона и центр уведомления, который хранит уведомления.

5
ответ дан 12 July 2012 в 00:29

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

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

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

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

0
ответ дан 12 July 2012 в 00:29

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

Похожие вопросы: