Como uso o 'notificar-enviar' para substituir imediatamente uma notificação existente?

23

Quando uso notify-sendpara mostrar uma notificação na área de trabalho e depois a uso novamente para mostrar uma notificação diferente, notei que a segunda só aparece depois que a primeira desaparece.

Existe uma maneira de notify-sendsubstituir imediatamente uma notificação existente por outra diferente?

ish
fonte

Respostas:

16

Você pode, mas deve usar um libnotify corrigido para fazer isso

notify-sendnão tem a capacidade de substituir as notificações existentes antes que elas expirem (ou desapareçam). Este é um bug conhecido . No entanto, um comentarista do relatório de bug postou um patch para corrigi-lo.

Instalando o libnotify-bin corrigido do PPA

Eu criei uma versão corrigida do pacote libnotify-bin que permite substituições no meu PPA. Atualmente, é apenas para o Ubuntu 12.04, mas se você precisar dele para qualquer outra versão atualmente suportada, poste um comentário e tentarei o meu melhor para disponibilizá-lo.

Para instalar, abra um terminal e:

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

Como usar os recursos de substituição

O patch notify-sendinclui dois novos comutadores, -p(ou --print-id ) e -r(ou --replace-id ). O --helpdescreve-os como:

  -p, --print-id Imprime o ID da notificação.
  -r, --replace-id = REPLACE_ID O ID da notificação a ser substituída.
  • Com -p, cada notify-sendum retornará um ID N (número / número inteiro).
  • A emissão de outro notify-sendcom -r Nsubstituirá a notificação anterior imediatamente .
  • Por exemplo, para o bash, você pode salvar o ID notify-send -p ...com:

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

    e substitua-o por:

    notify-send -r $NID "MESSAGE-2"
  • Você pode usar recursivamente -p e -r em um script, desde que a variável -r seja inicializada em 0 no início.

  • Aqui está um script simples que mostra notificações contando de 0 a 100 em intervalos de meio segundo:

    #! / bin / bash 
    NID = 0
    para i em {0..100..10}    Faz       NID = $ (notificar-enviar -p -r $ NID $ i)       sono 0.5    feito
ish
fonte
Eu recebo 404 para ppa.launchpad.net/izx/askubuntu/ubuntu/dists/trusty/main/… . Este repositório está desatualizado?
vp_arth
1
Você pode usar o meu script python que funciona como notificar-send: github.com/phuhl/notify-send.py
user3637541
11

Você pode usar a dica "síncrona" para criar uma notificação de "confirmação" que substituirá as notificações de confirmação anteriores. Por exemplo:

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

A dica "x-canonical-private-synchronous" é especificada neste documento . Para especificar uma dica, use -h type:name:value. O tipo aqui é string, name is x-canonical-private-synchronouse parece que o valor pode ser o que você quiser.

Portanto, se sua primeira notificação for criada com essa dica e a segunda também, a segunda substituirá imediatamente a primeira. (Veja Animações e durações na documentação, na coluna "bolhas de confirmação".)

Mark L
fonte
string:x-canonical-private-synchronous:anythingEra exatamente o que eu precisava. Obrigado por esta resposta. Também para vincular à documentação
avk 30/06
Não funciona com o GNOME ....
Johannes Lemonde
1
Obviamente, isso funciona apenas no ubuntu.
bschlueter 18/03
10

X-ref:
como forçar uma nova notificação no notify-osd a aparecer sem esperar pela saída anterior?

sem patches você pode simplesmente fazer

#!/bin/bash

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

Marcador:
Como uso o 'notificar-enviar' para substituir imediatamente uma notificação existente?


Envia um erro notify-osd (2592): Operação não permitida. O que isso significa?

Isso pode significar que os privilégios são inadequados, exigindo:

sudo killall notify-osd
George Rowell
fonte
Envia um erro notify-osd(2592): Operation not permitted. O que isso significa?
VedVals
5

Eu criei um script python simples que funciona quase da mesma forma que o envio de notificação, mas tem suporte para --replaces-id.

notify-send.py

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

Um script python para enviar notificações da área de trabalho a partir do shell.

Sobre

O Libnotify faz parte de muitos scripts no mundo Linux. Ele utiliza muitos dos recursos especificados da Especificação de notificações da área de trabalho e os torna acessíveis para shell-scripts. No entanto, não permite substituir uma notificação existente pelo replaces-id. Este é um bug conhecido desde 2008 e possui um patch desde 2012. O patch ainda não está disponível no momento (2018).

Esse script python utiliza o pacote notify2 e expõe a funcionalidade ao shell.

Diferenças entre notify-send.py e notify-send

  • Em notify-send.py -h shows ajuda em vez de ser o parâmetro para dicas. Para dicas, use --hint.
  • Em notify-send.py -r IDe notify-send.py --replaces-id ID existe. Para substituir uma chamada de notificaçãonotify-send.py pelo ID retornado pela notificação a ser substituída.
  • notify-send.py retorna o ID da notificação recém-criada.
  • notify-send.py --replaces-process NAMEexiste. Toda notificação criada com o mesmo NAME substituirá todas as notificações anteriores pelo mesmo NAME. Se chamado com esse parâmetro notify-send.pypode bloquear, é melhor chamar com um final &.

Instalação

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

notificar-enviar [.py] como usuário root

Para exibir notificações, mesmo que libnotify ou

notify-send.py

é usado a partir do usuário root, esses dois scripts são úteis.

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

Com notify-send.shassim:

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

Veja também

Também dê uma olhada no meu daemon de notificação inspirado em Dunst , mas com várias melhorias, incluindo a possibilidade de um plano de fundo transparente e um centro de notificações que armazena notificações.

user3637541
fonte
Esta solução funcionou para mim no ubuntu 18.10. Nenhuma das outras soluções parecia funcionar também.
precisa