¿Cómo uso 'notificar-enviar' para reemplazar inmediatamente una notificación existente?

23

Cuando uso notify-sendpara mostrar una notificación en el escritorio, y luego la uso nuevamente para mostrar una notificación diferente, he notado que la segunda solo se muestra después de que la primera ha desaparecido.

¿Hay alguna manera de notify-sendreemplazar inmediatamente una notificación existente por otra diferente?

ish
fuente

Respuestas:

16

Puede, pero debe usar un libnotify parcheado para hacerlo

notify-sendno tiene la capacidad de reemplazar las notificaciones existentes antes de que se agote el tiempo de espera (o desaparezca). Este es un error conocido . Sin embargo, un comentarista en el informe de error ha publicado un parche para solucionarlo.

Instalar el parche libnotify-bin de PPA

He creado una versión parcheada del paquete libnotify-bin que permite reemplazos en mi PPA. Actualmente es solo para Ubuntu 12.04, pero si lo necesita para cualquier otra versión actualmente compatible, publique un comentario y haré todo lo posible para que esté disponible.

Para instalar, abra una terminal y:

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

Cómo usar las capacidades de reemplazo

El parche notify-sendincluye dos nuevos modificadores, -p(o --print-id ) y -r(o --replace-id ). Los --helpdescribe como:

  -p, --print-id Imprime la ID de notificación.
  -r, --replace-id = REPLACE_ID El ID de la notificación a reemplazar.
  • Con -p, cada uno notify-senddevolverá una ID N (número / entero).
  • Emitir otro notify-sendcon -r Nreemplazará la notificación previa inmediatamente .
  • Por ejemplo, para bash, puede guardar la ID notify-send -p ...con:

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

    y luego reemplazarlo con:

    notify-send -r $NID "MESSAGE-2"
  • Puede usar recursivamente tanto -p como -r en un script, siempre que la variable -r se inicialice a 0 al principio.

  • Aquí hay un script simple que muestra notificaciones contando de 0 a 100 a intervalos de medio segundo:

    #! / bin / bash 
    NID = 0
    para i en {0..100..10}    hacer       NID = $ (notificar-enviar -p -r $ NID $ i)       dormir 0.5    hecho
ish
fuente
Obtengo 404 para ppa.launchpad.net/izx/askubuntu/ubuntu/dists/trusty/main/… . ¿Este repositorio está desactualizado?
vp_arth
1
Puede usar mi script de Python que funciona como notify
user3637541
11

Puede usar la sugerencia "sincrónica" para crear una notificación de "confirmación" que reemplazará las notificaciones de confirmación anteriores. Por ejemplo:

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

La sugerencia "x-canonical-private-synchronous" se especifica en este documento . Para especificar una pista, use -h type:name:value. El tipo aquí es string, el nombre es x-canonical-private-synchronous, y parece que el valor puede ser lo que quieras.

Entonces, si su primera notificación se crea con esa pista y la segunda también, la segunda reemplazará inmediatamente a la primera. (Consulte Animaciones y duraciones en la documentación, en la columna para "burbujas de confirmación").

Mark L
fuente
string:x-canonical-private-synchronous:anythingEra exactamente lo que necesitaba. Gracias por esta respuesta También para vincular a la documentación
avk
No funciona con GNOME ....
Johannes Lemonde
1
Obviamente, esto solo funciona en ubuntu.
bschlueter
10

X-ref:
¿Cómo forzar que aparezca una nueva notificación en notify-osd sin esperar a que salga la anterior?

sin parches simplemente puedes hacer

#!/bin/bash

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

Marcador:
¿Cómo uso 'notificar-enviar' para reemplazar inmediatamente una notificación existente?


Envía un error notify-osd (2592): Operación no permitida. Qué significa eso?

Puede significar que los privilegios son inadecuados y requieren:

sudo killall notify-osd
george rowell
fuente
Envía un error notify-osd(2592): Operation not permitted. Qué significa eso?
VedVals
5

Creé una secuencia de comandos simple de Python que funciona casi igual que la notificación de envío, pero tiene soporte para --replaces-id.

notify-send.py

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

Un script de Python para enviar notificaciones de escritorio desde el shell.

Acerca de

Libnotify es parte de muchos scripts en el mundo Linux. Utiliza muchas de las características especificadas de la Especificación de notificaciones de escritorio y las hace accesibles a los scripts de shell. Sin embargo, no permite reemplazar una notificación existente con el replaces-id. Este es un error conocido desde 2008 y tiene un parche desde 2012. Sin embargo, el parche aún no está corriente arriba (2018).

Este script de Python utiliza el paquete notify2 y expone la funcionalidad al shell.

Diferencias entre notify-send.py y notify-send

  • En notify-send.py -h muestra ayuda en lugar de ser el parámetro para sugerencias. Para usar pistas--hint .
  • En notify-send.py -r IDy notify-send.py --replaces-id ID existe. Para reemplazar una llamada de notificaciónnotify-send.py con la ID que fue devuelta por la notificación a ser reemplazada.
  • notify-send.py devuelve la ID de la notificación recién creada.
  • notify-send.py --replaces-process NAMEexiste Cada notificación que se crea con el mismo NOMBRE reemplazará cada notificación anterior con el mismo NOMBRE. Si se llama con este parámetro notify-send.pypodría bloquearse, es mejor llamarlo con un final &.

Instalación

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

notifique-envíe [.py] como usuario root

Para mostrar notificaciones, incluso si libnotify o

notify-send.py

se usa desde el usuario root, estos dos scripts son útiles.

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

Con notify-send.shasí:

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

Ver también

También eche un vistazo a mi demonio de notificaciones inspirado en Dunst , pero con varias mejoras, incluida la posibilidad de un fondo transparente y un centro de notificaciones que almacene las notificaciones.

usuario3637541
fuente
Esta solución me funcionó en ubuntu 18.10. Ninguna de las otras soluciones parecía funcionar tan bien.
Dreamcat4