Comment utiliser «notifier-envoyer» pour remplacer immédiatement une notification existante?

23

Lorsque j'utilise notify-sendpour afficher une notification sur le bureau, puis que je l'utilise à nouveau pour afficher une notification différente, j'ai remarqué que la seconde ne s'affiche que lorsque la première a disparu.

Existe-t-il un moyen de notify-sendremplacer immédiatement une notification existante par une autre?

ish
la source

Réponses:

16

Vous pouvez, mais vous devez utiliser un libnotify patché pour le faire

notify-sendn'a pas la capacité de remplacer les notifications existantes avant leur expiration (ou leur disparition). Il s'agit d'un bug connu . Cependant, un intervenant sur le rapport de bogue a publié un correctif pour le corriger.

Installation de la libnotify-bin corrigée de PPA

J'ai créé une version corrigée du paquet libnotify-bin qui permet les remplacements dans mon PPA. Actuellement, c'est uniquement pour Ubuntu 12.04, mais si vous en avez besoin pour toute autre version actuellement prise en charge, veuillez poster un commentaire et je ferai de mon mieux pour le rendre disponible.

Pour installer, ouvrez un terminal et:

sudo apt-add-repository ppa: izx / askubuntu
mise à jour sudo apt-get
sudo apt-get install libnotify-bin

Comment utiliser les capacités de remplacement

Le patch notify-sendinclut deux nouveaux commutateurs, -p(ou --print-id ) et -r(ou --replace-id ). Le les --helpdécrit comme:

  -p, --print-id Imprime l'ID de notification.
  -r, --replace-id = REPLACE_ID L'ID de la notification à remplacer.
  • Avec -p, chacun notify-sendrenverra un ID N (nombre / entier).
  • En émettre un autre notify-sendavec -r Nremplacera immédiatement la notification précédente .
  • Par exemple, pour bash, vous pouvez enregistrer l'ID à partir notify-send -p ...de:

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

    puis remplacez-le par:

    notify-send -r $NID "MESSAGE-2"
  • Vous pouvez récursivement utiliser à la fois -p et -r dans un script, tant que la variable -r est initialisée à 0 au début.

  • Voici un script simple qui montre les notifications comptant de 0 à 100 à intervalles d'une demi-seconde:

    #! / bin / bash 
    NID = 0
    pour i dans {0..100..10}    faire       NID = $ (notify-send -p -r $ NID $ i)       dormir 0,5    terminé
ish
la source
J'obtiens 404 pour ppa.launchpad.net/izx/askubuntu/ubuntu/dists/trusty/main/… . Ce référentiel est-il obsolète?
vp_arth
1
Vous pouvez utiliser mon script python qui fonctionne comme notify-send: github.com/phuhl/notify-send.py
user3637541
11

Vous pouvez utiliser le conseil "synchrone" pour créer une notification de "confirmation" qui remplacera les notifications de confirmation précédentes. Par exemple:

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

L'astuce "x-canonical-private-synchronous" est spécifiée dans ce document . Pour spécifier un indice, utilisez -h type:name:value. Le type ici est string, le nom est x-canonical-private-synchronous, et il semble que la valeur puisse être celle que vous voulez.

Donc, si votre première notification est créée avec cet indice et la seconde l'est également, la seconde remplacera immédiatement la première. (Voir Animations et Durées dans la documentation, dans la colonne "bulles de confirmation".)

Mark L
la source
string:x-canonical-private-synchronous:anythingétait exactement ce dont j'avais besoin. Merci pour cette réponse. Aussi pour un lien vers la documentation
avk
Cela ne fonctionne pas avec GNOME ....
Johannes Lemonde
1
Cela ne fonctionne évidemment que sur Ubuntu.
bschlueter
10

X-ref:
Comment forcer une nouvelle notification dans notify-osd à apparaître sans attendre que la précédente se termine?

sans patchs, vous pouvez simplement faire

#!/bin/bash

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

Signet:
Comment utiliser «notifier-envoyer» pour remplacer immédiatement une notification existante?


Envoie une erreur notify-osd (2592): opération non autorisée. Qu'est-ce que ça veut dire?

Cela peut signifier que les privilèges sont inadéquats nécessitant:

sudo killall notify-osd
George Rowell
la source
Envoie une erreur notify-osd(2592): Operation not permitted. Qu'est-ce que ça veut dire?
VedVals
5

J'ai créé un simple script python qui fonctionne presque de la même manière que notify-send mais qui prend en charge --replaces-id.

notify-send.py

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

Un script python pour envoyer des notifications de bureau à partir du shell.

Sur

Libnotify fait partie de nombreux scripts dans le monde Linux. Il utilise bon nombre des fonctionnalités spécifiées de la spécification des notifications de bureau et les rend accessibles aux scripts shell. Il ne permet cependant pas de remplacer une notification existante par le replaces-id. Il s'agit d'un bug connu depuis 2008 et qui a un correctif depuis 2012. Le correctif n'est toujours pas en amont (2018).

Ce script python utilise le package notify2 et expose la fonctionnalité au shell.

Différences entre notify-send.py et notify-send

  • Dans notify-send.py -h affiche l'aide au lieu d'être le paramètre des indices. Pour des conseils, utilisez --hint.
  • En notify-send.py -r IDet notify-send.py --replaces-id ID existe. Afin de remplacer un appel de notification notify-send.py par l'ID renvoyé par la notification à remplacer.
  • notify-send.py renvoie l'ID de la notification nouvellement créée.
  • notify-send.py --replaces-process NAMEexiste. Chaque notification créée avec le même NOM remplacera chaque notification précédente par le même NAME. S'il est appelé avec ce paramètre, il notify-send.pypeut être bloqué, il vaut mieux être appelé avec une fin &.

Installation

Nécessite python3.

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

Usage

$ 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] en tant qu'utilisateur root

Pour afficher des notifications, même si libnotify ou

notify-send.py

est utilisé par l'utilisateur root ces deux scripts sont utiles.

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

Avec notify-send.shcomme ça:

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

Voir également

Jetez également un œil à mon démon de notification inspiré de Dunst , mais avec plusieurs améliorations, y compris la possibilité d'un arrière-plan transparent et d'un centre de notification qui stocke les notifications.

user3637541
la source
Cette solution a fonctionné pour moi sur Ubuntu 18.10. Aucune des autres solutions ne semblait fonctionner aussi bien.
Dreamcat4