¿Puede org.freedesktop.Notifications.CloseNotification (uint id) desencadenarse e invocarse a través de DBus?

3

ref:
Botón Cerrar en notify-osd?

Marcador:
Can org.freedesktop .Notifications.CloseNotification (uint id) se desencadena y se invoca a través de DBus?

Actualmente, este script

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

matará todas las notificaciones pendientes.

Sería mejor definir la notificación de OSD objetivo específico para cancelar, utilizando org.freedesktop.Notifications.CloseNotification(uint id) . ¿Existe un método de interfaz que pueda poner esto en (¿en?) El DBus para disparar cuando ocurre un evento de notificación en particular?

El método necesitará obtener el PID de notificación para usar como argumento para CloseNotification(uint id) . Alternativamente,

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

podría usarse desde el shell, si se pudiera determinar el argumento (uint id) . La sintaxis del comando real usaría un entero en lugar de (uint id) .

Quizás una pregunta mejor que hacer primero podría ser "¿Cómo se encuentra la dirección de DBus de una notificación?".

Ninguno de estos lo identifica correctamente:

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

regresa

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

o

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

regresa

... string ":1.340" ...

En retrospectiva, la pregunta anterior "¿Cómo se encuentra el (uint id) de una notificación?" es histórica dada la respuesta anterior a otra pregunta: enlace
proporciona detalles para que cualquiera de los siguientes métodos se pueda usar:

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

regreso:

(uint32 8957,)

o

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

regreso:

8957

El graffiti pop-up notify-OSD sería derrotado con:

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

El "truco" es encontrar la dirección :?.??? DBus.

    
pregunta george rowell 19.09.2012 - 04:28

3 respuestas

1

¿Cómo sabes qué (UINT32 id) es o no es?

Dada la afirmación You ... need a way to get that ID ... en esta respuesta y las siguientes observaciones empíricas tal vez el título de la pregunta debería cambiarse a " ¿Cómo puede gdbus ... -m org.freedesktop.Notifications.CloseNotification ... cerrar una notificación? "

Es por implicación o proceso de eliminación que la afirmación "... solo indica que la ID debe ser única, distinta de cero y menor que MAXINT ...", que se encuentra en la descripción de 9.1.2. org.freedesktop.Notifications.Notify , también se aplica al CloseNotification parameter (UINT32 id) ? El UINT32 por proceso de eliminación es el único factor común como un tipo de atributo en la documentación y existe la implicación de que debe haber algún tipo de identificador de ID común, pero ...

Los detalles del valor devuelto de Notify y su parámetro UINT32 replaces_id son bastante explícitos, pero no está claro que CloseNotification 's (UINT32 id) tenga algo que ver con eso, como se demuestra con las pruebas empíricas a continuación.

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.

Esto no caracteriza ni explica el significado de (UINT32 id) .

Una omisión evidente es la falta de una tabla para describir el parámetro NotificationClosed (UINT32 id) . Todos los otros parámetros para métodos y señales están calificados con dichas tablas.

Las pruebas empíricas muestran que las notificaciones no se cierran con el 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'                            )

o

 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'                            )

La notificación no se cierra, que sería el caso si (UINT32 id) se identifica con el valor devuelto de Notify .

Algunas pruebas más:

 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 incluso forzando una identificación constante, estableciendo UINT32 replaces_id a 42 y expire_timeout a 0, se ve que CloseNotification no tiene influencia

 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'                            )

La notificación no se cierra a pesar de que 42 realiza el viaje de ida y vuelta a través de los métodos confirmado por

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

en la salida

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

También tenga en cuenta el error de notificación de un tiempo de espera -1 (la documentación es contradictorio ):

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

aunque esto "funciona"

notify-send "test" -t -1

ref:
¿Cuál es el nombre del programa que muestra las notificaciones? (contradicciones del documento)
Cómo forzar una notificación nueva en notify-osd para que aparezca sin esperar a que la anterior salga ?
¿Cómo uso 'notify-send' para reemplazar inmediatamente una notificación existente?

Marcador:
¿Puede org.freedesktop.Notifications.CloseNotification (uint id) activarse e invocarse a través de DBus?

    
respondido por el George Rowell 21.09.2012 - 22:17
0

El método CloseNotification se define como un método D-Bus por especificación . Sin embargo, solo establece que la ID debe ser única, distinta de cero y menor que MAXINT. No requiere que la ID sea el PID del proceso de llamada. Necesitaría una forma de obtener esa identificación antes de poder llamar al método con éxito.

    
respondido por el dobey 19.09.2012 - 19:38
0

Sé que llegué un poco tarde, pero este día me enfrenté a este problema, ¡y esto puede ser útil para otros!

Primero, instale un parche libnotify-bin que admita la opción -p para imprimir el ID de notificación:

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

Ahora es un script de ejemplo que envía una notificación sin tiempo de espera y luego cierra la notificación después de que se haya terminado un determinado comando (en este caso, solo duerma 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)
    
respondido por el Teresa e Junior 12.04.2013 - 17:27