web-dev-qa-db-fra.com

Gnome Shell JS - Écoutez le signal DBus sur une interface pour n'importe quel chemin

J'essaie d'écrire une extension qui écoute un signal DBus, mais je ne connais pas le chemin à l'avance. En fait, il existe plusieurs chemins (uniques pour chaque application qui implémente l'interface). Il semble qu'il n'y ait aucun moyen de déterminer le chemin à l'avance (c'est-à-dire au démarrage de l'application), donc je reste à l'écoute du signal qui est émis lorsque j'envoie une certaine commande DBus. Ce que je recherche vraiment, c'est l'équivalent GJS de la Python à this question. Malheureusement, les différents proxys DBus n'autorisent pas null ou undefined comme valeurs pour le chemin d'accès comme la bibliothèque Python le fait. J'ai également essayé d'utiliser imports.dbus.session.watch_signal qui reçoit tous les signaux émis mais ne me donne aucun moyen de rattacher l'expéditeur à un signal spécifique.

3
nemec

Je ne suis pas familier avec GJS (ça vaut vraiment la peine d'être étudié) cependant, s'il y a une interface de ligne de commande GJS alors dbus-monitor peut suivre le d-bus par n'importe quel attribut de message.

Citant 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'"

et

   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.

et entre guillemets D-Bus: API de bus de messages: fonction 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.

Notez que l'expéditeur est identifié dans la sortie de ce qui suit

Le problème de trop de sortie de

         dbus-monitor "type='signal'"

tel que

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

peut être élagué par ou avec des combinaisons de:

  • dbus-monitor --profile "type='signal'"
  • dbus-monitor "type='signal'" | grep '...some pattern...'
  • dbus-monitor "type='signal', interface='...'" ou une autre clé au lieu de l'interface

etc.

La dernière variante pourrait être la plus applicable pour trouver un signal sur le d-bus "that implements the interface".

Signet:
Gnome Shell JS - Écoutez le signal DBus sur une interface pour n'importe quel chemin

2
george rowell

Vieille question, mais elle m'a aidé à trouver: Gio.DBusSignalCallback

0
s4mdf0o1