web-dev-qa-db-fra.com

Comment obtenir un proxy pour un objet DBus qui n'est pas bien connu?

J'essaie d'utiliser dbus pour réagir à un signal particulier (l'utilisateur clique sur un menu d'indicateur sur le panneau supérieur de l'unité). En utilisant dbus-monitor, j'ai trouvé le signal pertinent auquel j'aimerais réagir:

sender=:1.96 -> dest=:1.232 serial=2091 path=/org/ayatana/NotificationItem/myapp/Menu; interface=com.canonical.dbusmenu; member=AboutToShowGroup
array [
   int32 9
]

Ensuite, mon plan était de faire ce qui suit avec python:

dbus_proxy = bus.get_object ("BUS.NAME", "PATH")
interface = dbus.Interface (proxy, "INTERFACE")
interface.connect_to_signal ("SIGNAL", my_function)

def my_function:
    # react 

Afin de comprendre dbus, j'ai utilisé les deux articles suivants: le tutoriel dbus-python et Comment lire la sortie dbus-monitor?

Cependant, je suis un peu confus quant aux valeurs que je devrais utiliser pour le nom du bus, le chemin, l'interface et le signal dans mon code. J'ai essayé de fouiller dans qdbus afin de trouver les valeurs correctes, mais je n'arrive pas à trouver ce que je cherche. Je pense que j'ai été rejeté parce que get_object nécessite un nom "bien connu", mais je n'ai que les identifiants numériques uniques pour l'expéditeur, dest.

Tout coup de pouce dans la bonne direction serait grandement apprécié.

3
jwigley

La fonction add_signal_receiver peut être utilisée sans spécifier de nom de bus. Cela peut être utile pour capturer des signaux lorsque le nom du bus, l'interface ou le nom du signal spécifique est inconnu.

session_bus = dbus.SessionBus()

session_bus.add_signal_receiver(self.do_something,
                                signal_name=None,
                                dbus_interface=None,
                                bus_name=None, 
                                path=None)

Le code ci-dessus appelle la méthode do_something chaque fois qu'un signal est reçu sur le bus de session.

Dans ma question initiale, j'ai déclaré que je voulais répondre à "AboutToShowGroup". Cependant, après une inspection plus approfondie de l'interface "com.canonical.dbusmenu", j'ai réalisé qu'il s'agissait en fait d'une méthode et non d'un signal. J'ai depuis choisi un autre signal pour réagir.

1
jwigley