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


23

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

Чи є спосіб notify-sendнегайно замінити наявне повідомлення іншим?

Відповіді:


16

Ви можете, але ви повинні використовувати виправлену 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(або - замінити ідентифікатор ). --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 / bash 
    NID = 0
    для i в {0..100..10}    робити       NID = $ (сповістити-надіслати -p -r $ NID $ i)       сон 0,5    зроблено

Я отримую 404 за ppa.launchpad.net/izx/askubuntu/ubuntu/dists/trusty/main/… . Це сховище застаріле?
vp_arth

1
Ви можете використовувати мій сценарій python, який працює як notify-send: github.com/phuhl/notify-send.py
user3637541

11

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

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

Підказка "x-canonical-private-synchronous" вказана в цьому документі . Щоб вказати підказку, використовуйте -h type:name:value. Тип тут є string, ім'я є x-canonical-private-synchronous, і здається, що значення може бути будь-яким, що ви хочете.

Отже, якщо ваше перше повідомлення буде створене з таким натяком, а друге також, друге негайно замінить перше. (Див. Анімації та тривалості в документації, у стовпці для "бульбашок підтвердження".)


string:x-canonical-private-synchronous:anythingбуло саме те, що мені було потрібно. Дякую за цю відповідь. Також для посилання на документацію
avk

Це не працює з GNOME ....
Йоганнес Лемонде,

1
Це дещо очевидно працює лише на ubuntu.
bschlueter

10

X-ref:
Як змусити нове Повідомлення в noti-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

Надсилає помилку notify-osd(2592): Operation not permitted. Що це означає?
VedVals

5

Я створив простий скрипт 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існує. Кожне сповіщення, створене тим самим NAME, замінить усі сповіщення перед ним тим самим 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.

notify-send [.py] як користувач root

Для відображення сповіщень, навіть якщо libnotify або

notify-send.py

використовується з кореневим користувачем ці два сценарії корисні.

#!/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 "$@" &

Дивись також

Також погляньте на мій демон-сповіщення натхненний Данстом , але з кількома вдосконаленнями, включаючи можливість прозорого фону та центру сповіщень, який зберігає сповіщення.


Це рішення працювало для мене на ubuntu 18.10. Жодне з інших рішень, здається, також не працює.
Dreamcat4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.