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.