O org.freedesktop.Notifications.CloseNotification (uint id) pode ser acionado e invocado via DBus?

3

ref:
Botão Fechar no notify-osd?

Bookmark:
Pode org.freedesktop .Notifications.CloseNotification (uint id) pode ser acionado e invocado via DBus?

Atualmente, este script

dbus-monitor "interface='org.freedesktop.Notifications'" |             \
grep --line-buffered "member=Notify"                     |             \
sed -u -e  's/.*/killall notify-osd/g'                   |             \
bash

irá matar todas as notificações pendentes.

Seria melhor refinar a notificação de OSD de destino específica para cancelar, usando org.freedesktop.Notifications.CloseNotification(uint id) . Existe um método de interface que pode colocar isso (in?) No DBus para disparar quando ocorre um evento de notificação em particular?

O método precisará obter o PID de notificação para usar como argumento para CloseNotification(uint id) . Alternativamente,

  qdbus    org.freedesktop.Notifications                \
          /org/freedesktop/Notifications                \
           org.freedesktop.Notifications.CloseNotification(uint id)

poderia ser usado a partir do shell, se o argumento (uint id) pudesse ser determinado. A sintaxe real do comando usaria um inteiro no lugar de (uint id) .

Talvez uma pergunta melhor a ser feita primeiro seja "Como o endereço DBus de uma notificação é encontrado?". Nenhum deles identifica corretamente:

gdbus monitor --session --dest org.freedesktop.Notifications

retorna

The name org.freedesktop.Notifications is owned by :1.130
...

ou

dbus-monitor "interface='org.freedesktop.Notifications'"

retorna

... string ":1.340" ...

Em retrospectiva, a pergunta anterior "Como é encontrada a (uint id) para uma notificação?" é histórica, dada a resposta anterior a outra pergunta: link
fornece detalhes para que qualquer método abaixo possa ser usado:

gdbus call --session --dest org.freedesktop.DBus                                   \
             --object-path /                                                       \
                   --method org.freedesktop.DBus.GetConnectionUnixProcessID :1.16

retornando:

(uint32 8957,)

ou

qdbus --literal --session  org.freedesktop.DBus                                  \
                          /                                                      \
                           org.freedesktop.DBus.GetConnectionUnixProcessID :1.16

retornando:

8957

O graffit pop-up notify-OSD seria então derrotado com:

  qdbus    org.freedesktop.Notifications                             \
          /org/freedesktop/Notifications                             \
           org.freedesktop.Notifications.CloseNotification           \
  $(qdbus --literal --session                                        \
           org.freedesktop.DBus                                      \
          /                                                          \
           org.freedesktop.DBus.GetConnectionUnixProcessID :?.???  )

O "truque" é encontrar o endereço :?.??? DBus.

    
por george rowell 19.09.2012 / 06:28

3 respostas

1

Como você sabe o que (UINT32 id) é ou não é?

Considerando a declaração You ... need a way to get that ID ... nesta resposta e as seguintes observações empíricas, talvez o título da pergunta deva ser alterado para " Como gdbus ... -m org.freedesktop.Notifications.CloseNotification ... pode fechar uma notificação? "

É por implicação ou processo de eliminação que a declaração "... apenas declara que o ID deve ser único, diferente de zero e menor que MAXINT ...", encontrado na descrição de 9.1.2. org.freedesktop.Notifications.Notify , também se aplica ao parâmetro CloseNotification (UINT32 id) ? O UINT32 pelo processo de eliminação é o único fator comum como um tipo de atributo na documentação e há a implicação de que deve haver algum tipo de ID comum "handle", mas ...

Os detalhes do valor retornado de Notify e seu parâmetro UINT32 replaces_id são bastante explícitos, mas não está claro se CloseNotification ' (UINT32 id) tem alguma coisa a ver com isso, conforme demonstrado com testes empíricos abaixo. / p>

Citando 9.1.3. org.freedesktop.Notifications.CloseNotification in toto:

9.1.3. org.freedesktop.Notifications.CloseNotification

void org.freedesktop.Notifications.CloseNotification (UINT32 id);

Causes a notification to be forcefully closed and removed from the user's view.
It can be used, for example, in the event that what the notification pertains to
is no longer relevant, or to cancel a notification with no expiration time.

The NotificationClosed signal is emitted by this method.

If the notification no longer exists, an empty D-BUS Error message is sent back.

Isso não caracteriza nem explica o significado de (UINT32 id) .

Uma omissão evidente é a falta de uma tabela para descrever o parâmetro NotificationClosed (UINT32 id) . Todos os outros parâmetros para métodos e sinais são qualificados com essas tabelas.

Testes empíricos mostram que as notificações não são fechadas usando o valor de retorno de Notify :

 qdbus  org.freedesktop.Notifications                           \
       /org/freedesktop/Notifications                           \
        org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
     -d org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
     -m org.freedesktop.Notifications.Notify                    \
                     "" 0 "" "sigma-ry" "corpus" [] {} 200      \
 | sed -e 's/(uint32\(.*\),)//g'                            )

ou

 qdbus  org.freedesktop.Notifications                           \
       /org/freedesktop/Notifications                           \
        org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 5 "" "sigma-ry" "corpus" [] {}  20      \
 | sed -e 's/(uint32\(.*\),)//g'                            )

A notificação não é encerrada, o que seria o caso se (UINT32 id) fosse identificado com o valor retornado de Notify .

Mais alguns testes:

 gdbus call --session                                           \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 0 "" "sigma-ry" "corpus" [] {}     0    \
 | sed -e 's/(uint32\(.*\),)//g'                            )

e até mesmo coagindo uma ID constante, definindo UINT32 replaces_id a 42 e expire_timeout a 0, é visto que CloseNotification não tem influência

 gdbus call --session                                           \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 42 "" "sigma-ry" "corpus" [] {}    0    \
 | sed -e 's/(uint32\(.*\),)//g'                            )

A notificação não é encerrada, embora o 42 faça a ida e volta pelos métodos confirmados por

dbus-monitor "interface='org.freedesktop.Notifications'"

na saída

method call sender=:1.332 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify
   string ""
   uint32 42
   string ""
   string "sigma-ry"
   string "corpus"
   array [
   ]
   array [
   ]
   int32 0
method call sender=:1.333 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=CloseNotification
   uint32 42

Observe também a falha na notificação de um tempo limite -1 (a documentação é contraditório ):

  gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 42 "" "sigma-ry" "corpus" [] {}   -1

embora isso "funcione"

notify-send "test" -t -1

ref:
Qual é o nome do programa que exibe as notificações? (contradições do documento)
Como forçar uma nova Notificação em notificar-osd a aparecer sem esperar que a anterior saia ?
Como uso 'notify-send' para substituir imediatamente uma notificação existente?

Bookmark:
O org.freedesktop.Notifications.CloseNotification (uint id) pode ser acionado e chamado pelo DBus?

    
por George Rowell 22.09.2012 / 00:17
0

O método CloseNotification é definido como um método D-Bus pelo especificação . No entanto, ele apenas afirma que o ID deve ser exclusivo, diferente de zero e menor que MAXINT. Não requer que o ID seja o PID do processo de chamada. Você precisaria de uma maneira de obter esse ID antes de poder chamar o método com êxito.

    
por dobey 19.09.2012 / 21:38
0

Eu sei que estou um pouco atrasado, mas hoje enfrentei esse problema e isso pode ser útil para os outros!

Primeiro, instale um libnotify-bin corrigido que suporte a opção -p para imprimir o ID de notificação:

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

Agora, um script de exemplo que envia uma notificação sem tempo limite e, em seguida, fecha a notificação depois que um determinado comando é concluído (neste caso, apenas durma 5 segundos):

notify-send 'Message...' -i dialog-information \
    -t 0 -h int:transient:1 \
    -p >/tmp/notification_id

sleep 5

qdbus org.freedesktop.Notifications \
     /org/freedesktop/Notifications \
      org.freedesktop.Notifications.CloseNotification \
    $(cat /tmp/notification_id)
    
por Teresa e Junior 12.04.2013 / 19:27