Come faccio a utilizzare "notifica-invio" per sostituire immediatamente una notifica esistente?


23

Quando utilizzo notify-sendper mostrare una notifica sul desktop e quindi la utilizzo nuovamente per mostrare una notifica diversa, ho notato che la seconda viene visualizzata solo dopo che la prima è scomparsa.

C'è un modo per notify-sendsostituire immediatamente una notifica esistente con una diversa?

Risposte:


16

Puoi, ma devi usare un libnotify con patch per farlo

notify-sendnon è in grado di sostituire le notifiche esistenti prima che siano scadute (o scomparse). Questo è un bug noto . Tuttavia, un commentatore sulla segnalazione di bug ha pubblicato una patch per risolverlo.

Installazione del libnotify-bin con patch da PPA

Ho creato una versione con patch del pacchetto libnotify-bin che consente sostituzioni nel mio PPA. Attualmente è solo per Ubuntu 12.04, ma se ne hai bisogno per qualsiasi altra versione attualmente supportata, pubblica un commento e farò del mio meglio per renderlo disponibile.

Per installare, aprire un terminale e:

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

Come utilizzare le funzionalità di sostituzione

Il patch notify-sendinclude due nuovi switch, -p(o --print-id ) e -r(o --replace-id ). Le --helpdescrive come:

  -p, --print-id Stampa l'ID di notifica.
  -r, --replace-id = REPLACE_ID L'ID della notifica da sostituire.
  • Con -p, ognuno notify-sendrestituirà un ID N (numero / intero).
  • Emettere un altro notify-sendcon -r Nsostituirà immediatamente la notifica precedente .
  • Ad esempio, per bash, è possibile salvare l'ID notify-send -p ...con:

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

    e quindi sostituirlo con:

    notify-send -r $NID "MESSAGE-2"
  • È possibile utilizzare ricorsivamente -p e -r in uno script, purché la variabile -r sia inizializzata su 0 all'inizio.

  • Ecco un semplice script che mostra le notifiche che contano da 0 a 100 a intervalli di mezzo secondo:

    #! / bin / bash 
    NID = 0
    per me in {0..100..10}    fare       NID = $ (notifica-invio -p -r $ NID $ i)       dormire 0,5    fatto

Ottengo 404 per ppa.launchpad.net/izx/askubuntu/ubuntu/dists/trusty/main/… . Questo repository è obsoleto?
vp_arth,

1
Puoi usare il mio script Python che funziona come
Notify

11

È possibile utilizzare il suggerimento "sincrono" per creare una notifica di "conferma" che sostituirà le notifiche di conferma precedenti. Per esempio:

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

Il suggerimento "x-canonical-private-sincrono" è specificato in questo documento . Per specificare un suggerimento, utilizzare -h type:name:value. Il tipo qui è string, name is x-canonical-private-synchronous, e sembra che il valore possa essere quello che vuoi.

Quindi se la tua prima notifica viene creata con quel suggerimento e anche la seconda, la seconda sostituirà immediatamente la prima. (Vedi Animazioni e Durate nella documentazione, nella colonna per "bolle di conferma".)


string:x-canonical-private-synchronous:anythingera esattamente quello di cui avevo bisogno. Grazie per questa risposta Anche per il collegamento alla documentazione
avk

Non funziona con GNOME ....
Johannes Lemonde,

1
Questo in qualche modo ovviamente funziona solo su Ubuntu.
bschlueter,

10

X-ref:
come forzare la visualizzazione di una nuova notifica in notification-osd senza attendere la chiusura di quella precedente?

senza patch puoi semplicemente farlo

#!/bin/bash

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

Segnalibro:
come si usa "notifica-invia" per sostituire immediatamente una notifica esistente?


Invia un errore notification-osd (2592): operazione non consentita. Cosa significa?

Può significare che i privilegi sono inadeguati e richiedono:

sudo killall notify-osd

Invia un errore notify-osd(2592): Operation not permitted. Cosa significa?
VedVals,

5

Ho creato un semplice script Python che funziona quasi allo stesso modo di notifica-invio ma ha il supporto per --replaces-id.

notify-send.py

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

Uno script Python per l'invio di notifiche desktop dalla shell.

Di

Libnotify fa parte di molti script nel mondo Linux. Utilizza molte delle funzionalità specificate della specifica delle notifiche desktop e le rende accessibili agli script di shell. Essa non è tuttavia consente di sostituire una notifica esistente con il replaces-id. Si tratta di un bug noto dal 2008 e ha una patch dal 2012. Tuttavia, la patch non è ancora a monte (2018).

Questo script python utilizza il pacchetto notify2 ed espone la funzionalità alla shell.

Differenze tra Notify-send.py e Notify-Send

  • In notify-send.py -h shows help invece di essere il parametro per i suggerimenti. Per suggerimenti usare --hint.
  • In notify-send.py -r IDed notify-send.py --replaces-id ID esiste. Per sostituire una chiamata di notifica notify-send.py con l'ID che è stato restituito dalla notifica da sostituire.
  • notify-send.py restituisce l'ID della notifica appena creata.
  • notify-send.py --replaces-process NAMEesiste. Ogni notifica che viene creata con lo stesso NAME sostituirà ogni notifica precedente con lo stesso NAME. Se chiamato con questo parametro notify-send.pypotrebbe bloccarsi, meglio essere chiamato con un trailing &.

Installazione

Richiede python3.

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

uso

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

notification-send [.py] come utente root

Per visualizzare le notifiche, anche se libnotify o

notify-send.py

viene utilizzato dall'utente root questi due script sono utili.

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

In notify-send.shquesto modo:

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

Guarda anche

Dai anche un'occhiata al mio demone delle notifiche ispirato a Dunst , ma con diversi miglioramenti, tra cui la possibilità di uno sfondo trasparente e un centro di notifica che memorizza le notifiche.


Questa soluzione ha funzionato per me su Ubuntu 18.10. Nessuna delle altre soluzioni sembrava funzionare altrettanto bene.
Dreamcat4,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.