Wie verwende ich "Benachrichtigung senden", um eine vorhandene Benachrichtigung sofort zu ersetzen?

23

Wenn ich notify-sendeine Benachrichtigung auf dem Desktop anzeige und sie dann erneut verwende, um eine andere Benachrichtigung anzuzeigen, ist mir aufgefallen, dass die zweite Benachrichtigung erst angezeigt wird, nachdem die erste verschwunden ist.

Gibt es eine Möglichkeit, notify-sendeine vorhandene Benachrichtigung sofort durch eine andere zu ersetzen?

ish
quelle

Antworten:

16

Sie können, aber Sie müssen eine gepatchte libnotify verwenden, um dies zu tun

notify-sendkann vorhandene Benachrichtigungen nicht ersetzen, bevor sie abgelaufen sind (oder verschwunden sind). Dies ist ein bekannter Fehler . Ein Kommentator des Fehlerberichts hat jedoch einen Patch veröffentlicht , um diesen Fehler zu beheben.

Installation des gepatchten libnotify-bin von PPA

Ich habe eine gepatchte Version des libnotify-bin- Pakets erstellt, die das Ersetzen in meinem PPA ermöglicht. Momentan ist es nur für Ubuntu 12.04, aber wenn Sie es für ein anderes aktuell unterstütztes Release benötigen, posten Sie bitte einen Kommentar und ich werde mein Bestes geben, um es verfügbar zu machen.

Öffnen Sie zum Installieren ein Terminal und:

sudo apt-add-repository ppa: izx / askubuntu
sudo apt-get update
sudo apt-get installiere libnotify-bin

Verwendung der Ersatzfunktionen

Das Patch notify-sendenthält zwei neue Schalter -p(oder --print-id ) und -r(oder --replace-id ). Das --helpbeschreibt sie als:

  -p, --print-id Gibt die Benachrichtigungs-ID aus.
  -r, --replace-id = REPLACE_ID Die ID der zu ersetzenden Benachrichtigung.
  • Mit -pwird jeweils notify-sendeine ID N (Zahl / Ganzzahl) zurückgegeben.
  • Wenn Sie ein anderes notify-sendmit ausstellen, -r Nwird die vorherige Benachrichtigung sofort ersetzt .
  • Zum Beispiel können Sie für bash die ID von notify-send -p ...mit speichern :

    NID=$(notify-send -p "MESSAGE-1")

    und dann ersetzen durch:

    notify-send -r $NID "MESSAGE-2"
  • Sie können sowohl -p als auch -r in einem Skript rekursiv verwenden , solange die Variable -r zu Beginn auf 0 initialisiert ist.

  • Hier ist ein einfaches Skript, das Benachrichtigungen im Abstand von einer halben Sekunde von 0 bis 100 anzeigt:

    #! / bin / bash 
    NID = 0
    für i in {0..100..10}    machen       NID = $ (benachrichtigen-senden -p -r $ NID $ i)       schlaf 0,5    getan
ish
quelle
Ich bekomme 404 für ppa.launchpad.net/izx/askubuntu/ubuntu/dists/trusty/main/… . Ist dieses Repository veraltet?
vp_arth
1
Sie können mein Python-Skript verwenden, das wie
folgt
11

Sie können den "synchronen" Hinweis verwenden, um eine "Bestätigungsbenachrichtigung" zu erstellen, die frühere Bestätigungsbenachrichtigungen ersetzt. Beispielsweise:

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

Der Hinweis "x-canonical-private-synchronous" wird in diesem Dokument angegeben . Verwenden Sie, um einen Hinweis anzugeben -h type:name:value. Der Typ hier ist string, name ist x-canonical-private-synchronous, und es scheint, dass der Wert beliebig sein kann.

Wenn also Ihre erste Benachrichtigung mit diesem Hinweis erstellt wird und auch die zweite Benachrichtigung , wird die zweite sofort die erste ersetzen. (Siehe Animationen und Dauern in der Dokumentation in der Spalte "Bestätigungsblasen".)

Mark L
quelle
string:x-canonical-private-synchronous:anythingwar genau das, was ich brauchte. Danke für diese Antwort. Auch zum Verlinken auf die Dokumentation
avk 30.06.17
Es funktioniert nicht mit GNOME ....
Johannes Lemonde
1
Dies funktioniert offensichtlich nur auf Ubuntu.
bschlueter
10

X-ref:
Wie kann man eine neue Benachrichtigung in notify-osd erzwingen, ohne darauf zu warten, dass die frühere beendet wird?

auf patches kann man einfach verzichten

#!/bin/bash

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

Lesezeichen:
Wie verwende ich "Benachrichtigung senden", um eine vorhandene Benachrichtigung sofort zu ersetzen?


Sendet einen Fehler. Notify-osd (2592): Vorgang nicht zulässig. Was bedeutet das?

Dies kann bedeuten, dass die Berechtigungen unzureichend sind und Folgendes erfordern:

sudo killall notify-osd
George Rowell
quelle
Sendet einen Fehler notify-osd(2592): Operation not permitted. Was bedeutet das?
VedVals 12.11.12
5

Ich habe ein einfaches Python-Skript erstellt, das fast genauso funktioniert wie notify-send, aber Unterstützung bietet --replaces-id.

notify-send.py

Web: https://github.com/phuhl/notify-send.py

Ein Python-Skript zum Senden von Desktop-Benachrichtigungen über die Shell.

Über

Libnotify ist Teil vieler Skripte in der Linux-Welt. Es nutzt viele der in der Desktop Notifications-Spezifikation angegebenen Funktionen und macht sie für Shell-Skripte zugänglich. Es ist jedoch nicht möglich, eine vorhandene Benachrichtigung durch die zu ersetzen replaces-id. Dies ist ein bekannter Fehler seit 2008 und hat einen Patch seit 2012. Der Patch ist allerdings noch nicht upstream (2018).

Dieses Python-Skript verwendet notify2 Paket und stellt die Funktionalität der Shell zur Verfügung.

Unterschiede zwischen notify-send.py und notify-send

  • In notify-send.py -h shows help ist nicht der Parameter für Hinweise. Für Hinweise verwenden--hint .
  • In notify-send.py -r IDund notify-send.py --replaces-id ID existiert. Um eine Benachrichtigung zu ersetzen, rufen Sie notify-send.py mit der ID an, die von der zu ersetzenden Benachrichtigung zurückgegeben wurde.
  • notify-send.py Gibt die ID der neu erstellten Benachrichtigung zurück.
  • notify-send.py --replaces-process NAMEexistiert. Jede Benachrichtigung, die mit demselben NAMEN erstellt wird, ersetzt jede Benachrichtigung davor mit demselben NAMEN. Wenn der Aufruf mit diesem Parameter notify-send.pyblockiert, ist es am besten, ihn mit einem Trailing aufzurufen &.

Installation

Benötigt python3.

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

Verwendung

$ 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] als root-Benutzer

Um Benachrichtigungen anzuzeigen, auch wenn libnotify oder

notify-send.py

wird vom root-Benutzer verwendet, sind diese beiden Skripte hilfreich.

#!/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

Mit notify-send.shso etwas:

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

Siehe auch

Schauen Sie sich auch meinen Benachrichtigungs-Daemon an, der von Dunst inspiriert ist , aber einige Verbesserungen aufweist, einschließlich der Möglichkeit eines transparenten Hintergrunds und eines Benachrichtigungszentrums, in dem Benachrichtigungen gespeichert werden.

user3637541
quelle
Diese Lösung funktionierte für mich am Ubuntu 18.10. Keine der anderen Lösungen schien so gut zu funktionieren.
Dreamcat4