Jak użyć funkcji „powiadom-wyślij”, aby natychmiast zastąpić istniejące powiadomienie?

23

Kiedy używam, notify-sendaby wyświetlić powiadomienie na pulpicie, a następnie użyć go ponownie, aby pokazać inne powiadomienie, zauważyłem, że drugie pokazuje się dopiero po zniknięciu pierwszego.

Czy istnieje sposób na notify-sendnatychmiastowe zastąpienie istniejącego powiadomienia innym?

ish
źródło

Odpowiedzi:

16

Możesz, ale musisz użyć łatki libnotify, aby to zrobić

notify-sendnie ma możliwości zastąpienia istniejących powiadomień przed upłynięciem limitu czasu (lub zniknięciem). To znany błąd . Jednak komentator raportu o błędzie opublikował łatkę, aby to naprawić.

Instalowanie łatanego libnotify-bin z PPA

Utworzyłem łataną wersję pakietu libnotify-bin , która umożliwia zastępowanie w moim PPA. Obecnie jest to tylko Ubuntu 12.04, ale jeśli potrzebujesz go do innej obecnie obsługiwanej wersji, napisz komentarz, a ja postaram się go udostępnić.

Aby zainstalować, otwórz terminal i:

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

Jak korzystać z możliwości wymiany

Naprawione notify-sendzawiera nowe przełączniki -p(lub --print-id ) i -r(lub --replace-id ). --helpOpisuje je jako:

  -p, --print-id Wydrukuj identyfikator powiadomienia.
  -r, --replace-id = REPLACE_ID Identyfikator powiadomienia do zastąpienia.
  • Z -p, każdy notify-sendzwróci ID N (liczba / liczba całkowita).
  • Wydając kolejny notify-sendz -r Nzastąpi poprzednie zgłoszenie natychmiast .
  • Na przykład, dla bash, możesz zapisać identyfikator za notify-send -p ...pomocą:

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

    a następnie zamień na:

    notify-send -r $NID "MESSAGE-2"
  • W skrypcie można rekurencyjnie używać zarówno -p, jak i -r , o ile zmienna -r jest na początku inicjalizowana na 0.

  • Oto prosty skrypt, który pokazuje powiadomienia liczące od 0 do 100 w odstępach półsekundowych:

    #! / bin / bash 
    NID = 0
    dla i w {0..100..10}    robić       NID = $ (powiadom-wyślij -p -r $ NID $ i)       spać 0,5    gotowy
ish
źródło
Dostaję 404 za ppa.launchpad.net/izx/askubuntu/ubuntu/dists/trusty/main/… . Czy to repozytorium jest nieaktualne?
vp_arth
1
Możesz użyć mojego skryptu Pythona, który działa jak powiadomienie-wysyłanie: github.com/phuhl/notify-send.py
user3637541
11

Możesz użyć wskazówki „synchronicznej”, aby utworzyć powiadomienie „potwierdzające”, które zastąpi poprzednie powiadomienia potwierdzające. Na przykład:

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

Wskazówka „x-kanoniczna-prywatna-synchroniczna” podana jest w tym dokumencie . Aby określić podpowiedź, użyj -h type:name:value. Wpisz tutaj string, nazwa to x-canonical-private-synchronousi wydaje się, że wartość może być dowolna.

Więc jeśli twoje pierwsze powiadomienie zostanie utworzone z tą wskazówką, a drugie też, to drugie natychmiast zastąpi pierwsze. (Zobacz Animacje i czasy trwania w dokumentacji, w kolumnie dla „bąbelków potwierdzających”).

Mark L.
źródło
string:x-canonical-private-synchronous:anythingbyło dokładnie tym, czego potrzebowałem. Dziękuję za tę odpowiedź. Również za linkowanie do dokumentacji
avk
Nie działa z GNOME ....
Johannes Lemonde,
1
To oczywiście działa tylko na Ubuntu.
bschlueter
10

X-ref:
Jak wymusić pojawienie się nowego powiadomienia w powiadomieniu-osd bez oczekiwania na zakończenie wcześniejszego?

bez łatek możesz po prostu zrobić

#!/bin/bash

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

Zakładka:
Jak użyć „powiadom-wyślij”, aby natychmiast zastąpić istniejące powiadomienie?


Wysyła błąd powiadomienie-osd (2592): Operacja niedozwolona. Co to znaczy?

Może to oznaczać, że przywileje są nieodpowiednie i wymagają:

sudo killall notify-osd
George Rowell
źródło
Wysyła błąd notify-osd(2592): Operation not permitted. Co to znaczy?
VedVals,
5

Stworzyłem prosty skrypt Pythona, który działa prawie tak samo jak powiadomienie-wysyłanie, ale obsługuje --replaces-id.

powiadomienie-wyślij.py

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

Skrypt Pythona do wysyłania powiadomień na pulpicie z powłoki.

O

Libnotify jest częścią wielu skryptów w świecie Linuksa. Wykorzystuje wiele określonych funkcji specyfikacji powiadomień na pulpicie i udostępnia je skryptom powłoki. To nie nie jednak pozwolić, aby zastąpić istniejący powiadomienia z replaces-id. Jest to znany bug od 2008 roku i ma łatę od 2012. Łatka nie jest jeszcze choć Upstream (2018).

Ten skrypt Pythona wykorzystuje pakiet powiadomień2 i udostępnia funkcjonalność powłoce.

Różnice między powiadomieniem-wysłaniem.py i powiadomieniem-wysłaniem

  • W notify-send.py -h programach pomoc zamiast być parametrem podpowiedzi. Użyj podpowiedzi --hint.
  • W notify-send.py -r IDi notify-send.py --replaces-id ID istnieje. Aby zastąpić powiadomienie połączeniem notify-send.py z identyfikatorem zwróconym przez powiadomienie, które ma zostać zastąpione.
  • notify-send.py zwraca identyfikator nowo utworzonego powiadomienia.
  • notify-send.py --replaces-process NAMEistnieje. Każde powiadomienie, które zostanie utworzone przy użyciu tego samego NAZWY, zastąpi każde wcześniejsze powiadomienie tym samym NAZWĄ. Jeśli zostanie wywołany za pomocą tego parametru, notify-send.pymoże zostać zablokowany, najlepiej wywołać go za pomocą znaku końca &.

Instalacja

Wymaga python3.

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

Stosowanie

$ 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.

powiadom-wyślij [.py] jako użytkownik root

Aby wyświetlać powiadomienia, nawet jeśli libnotify lub

notify-send.py

jest używany przez użytkownika root, te dwa skrypty są pomocne.

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

W notify-send.shten sposób:

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

Zobacz też

Spójrz także na mojego demona powiadomień zainspirowanego przez Dunsta , ale z kilkoma ulepszeniami, w tym możliwością przezroczystego tła i centrum powiadomień, które przechowuje powiadomienia.

użytkownik3637541
źródło
To rozwiązanie działało dla mnie na Ubuntu 18.10. Żadne z pozostałych rozwiązań również nie działało.
Dreamcat4