Limpando / modificando notificações anteriores da libnotify?

6

Eu escrevi um script que gera notificações como esta:

notify-send -i audio-card "Transferring audio playback to speakers." \
    "Audio playback has been transferred to the analog output speaker system."

Existe alguma maneira de limpar ou substituir essas notificações da linha de comando ou do Python? Essencialmente, eu tenho um script que alterna entre dois coletores do PulseAudio e gostaria de limpar as notificações anteriores desse tipo para substituí-las pelo texto atualizado se o usuário alternar rapidamente.

    
por Naftuli Kay 10.05.2013 / 21:58

2 respostas

6

Na CLI, você pode exibir e fechar um pop-up de notificação via gdbus / qdbus .
Veja como fazer isso com gdbus :

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20

isto produzirá algo como:

(uint32 72,)

72 sendo a notificação ID . Agora que você conhece o ID , é possível fechar a janela pop-up com:

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification 72 

Agora, se você precisar do ID mais tarde, basta gravá-lo em um arquivo quando chamar Notify :

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20  | sed 's/[^ ]* //; s/,.//' > /tmp/last_id

e consiga-o de lá quando quiser fechar o pop-up:

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification $(cat /tmp/last_id)

P.S. Estou no Gnome 3 e as notificações enviadas via notify-send , pynotify , libnotify etc duram apenas 5 segundos, independentemente da opção time (esse é o comportamento padrão no Gnome 3, não me pergunte por quê). Além disso, eles não se acumulam: o Gnome exibe apenas uma notificação por vez. Então não posso testar com várias janelas pop-up, mas deve funcionar.

    
por 11.05.2013 / 04:38
3

Use o método update e chame o método show novamente:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pynotify
import time

pynotify.init("Basic")

n = pynotify.Notification("Title1", "body1", "dialog-warning")
n.show()

time.sleep(1)

n.update("Title2", "body2", "dialog-warning")
n.show()

Atualização:

Existe o método close mas ... não funciona de todo. Aparentemente, não só para mim:

Eu pensei que isso pode ser causado pelo erro nas ligações, então eu criei este programa C ++:

#include <libnotify/notify.h>
#include <unistd.h>

int main(int argc, char **argv) {

    GError *error = NULL;
    notify_init("basic");

    NotifyNotification *example;
    example = notify_notification_new("Ttile1", "Body1", NULL);

    notify_notification_show(example, &error);
    usleep(1000000);

    notify_notification_update(example, "Ttile2", "Body2", NULL);
    notify_notification_show(example, &error);

    usleep(1000000);
    notify_notification_close(example, &error);
}

E compilou com:

g++ test.cpp -o test $(pkg-config --libs --cflags libnotify)

Não funcionou tão bem. Parece que tem algo aqui.

Em seguida, tentei usar o pickle module para salvar a referência. Ele também não funciona. Você não pode armazenar referência a eles.

Então, a única coisa em que consigo pensar é dividir seu script em dois: daemon e cliente. Após a execução, o cliente deve se comunicar com o daemon que está sendo executado o tempo todo em segundo plano com referência à instância de notificação.

    
por 10.05.2013 / 22:24