Gnome Shell JS - Ouça o sinal DBus em uma interface para qualquer caminho

3

Estou tentando escrever uma extensão que ouça um sinal DBus, mas não conheço o caminho antes do tempo. Na verdade, existem vários caminhos (exclusivos para cada aplicativo que implementa a interface). Parece não haver nenhuma maneira de determinar o caminho à frente do tempo (ou seja, na inicialização do aplicativo), então fico com a escuta do sinal que é emitido quando envio um determinado comando do DBus. O que eu realmente estou procurando é o equivalente GJS da solução Python para a pergunta . Infelizmente, os vários proxies DBus não permitem null ou undefined como valores para o caminho como a biblioteca Python. Eu também tentei usar imports.dbus.session.watch_signal que recebe todos os sinais que são emitidos, mas não me dá como ligar o remetente a um sinal específico.

    
por nemec 31.07.2012 / 06:51

2 respostas

2

Eu não estou familiarizado com o GJS (definitivamente vale a pena investigar), no entanto, se houver uma interface de linha de comando do GJS, o dbus-monitor poderá rastrear o d-bus por qualquer atributo de mensagem.

Citando man dbus-monitor :

EXAMPLE
       Here  is an example of using dbus-monitor to watch for the gnome typing
       monitor to say things

         dbus-monitor "type='signal',                          \
                       sender='org.gnome.TypingMonitor',       \
                       interface='org.gnome.TypingMonitor'"

e

   In order to get dbus-monitor to see the messages you are interested in,
   you should specify a set of watch expressions as you would expect to be
   passed to the dbus_bus_add_match function.

e citando D-Bus: APIs do barramento de mensagens: função dbus_bus_add_match :

   Possible keys you can match on are type, sender, interface, member,
   path, destination and numbered keys to match message args
   (keys are 'arg0', 'arg1', etc.). Omitting a key from the rule indicates
   a wildcard match. For instance omitting the member from a match rule but
   adding a sender would let all messages from that sender through regardless
   of the member.

Observe que o remetente é identificado na saída do seguinte

O problema de muita saída de

         dbus-monitor "type='signal'"

como

...
signal sender=:1.47 -> dest=(null destination) serial=1679 path=/org/ayatana/bamf/application311805604; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
   string "org.ayatana.bamf.view"
   array [
      dict entry(
         string "Active"
         variant             boolean true
      )
   ]
   array [
   ]
...
signal sender=:1.51 -> dest=com.canonical.Unity.Panel.Service serial=1674 path=/com/canonical/Unity/Panel/Service; interface=com.canonical.Unity.Panel.Service; member=ReSync
   string "libappmenu.so"
...
signal sender=:1.51 -> dest=com.canonical.Unity.Panel.Service serial=1681 path=/com/canonical/Unity/Panel/Service; interface=com.canonical.Unity.Panel.Service; member=ReSync
   string "libdatetime.so"
...

pode ser removido ou combinado com combinações:

  • dbus-monitor --profile "type='signal'"
  • dbus-monitor "type='signal'" | grep '...some pattern...'
  • dbus-monitor "type='signal', interface='...'" ou outra chave em vez de interface

etc.

A última variante pode ser mais aplicável para encontrar um signal no d-bus "that implements the interface" .

Marcador:
Gnome Shell JS - Ouça o sinal DBus em uma interface para qualquer caminho

    
por george rowell 20.09.2012 / 19:55
0

Pergunta antiga, mas me ajudou a encontrar: Gio.DBusSignalCallback

    
por s4mdf0o1 27.11.2015 / 18:03