Como obter um proxy para o objeto DBus que não é bem conhecido?

3

Estou me esforçando para usar o dbus para reagir a um sinal específico (o usuário clica em um menu appindicator no painel superior da unidade). A partir do uso do dbus-monitor, encontrei o sinal relevante para o qual gostaria de reagir:

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

Então meu plano era fazer o seguinte com 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 

Para entender o dbus, tenho usado os dois artigos a seguir:   o tutorial do dbus-python e   Como ler a saída dbus-monitor?

No entanto, estou um pouco confuso sobre quais valores devo usar para o nome do barramento, caminho, interface e sinal no meu código. Eu tentei bisbilhotar no qdbus para descobrir os valores corretos, mas não consigo encontrar o que estou procurando. Acho que fui jogado fora porque get_object requer um nome "conhecido", mas tudo que eu tenho são os identificadores numéricos exclusivos para o remetente, dest.

Qualquer cutucada na direção certa seria muito apreciada.

    
por jwigley 15.05.2012 / 08:07

1 resposta

1

A função add_signal_receiver pode ser usada sem especificando um nome de barramento. Isso pode ser útil para capturar sinais quando o nome do barramento, a interface ou o nome do sinal específico é desconhecido.

session_bus = dbus.SessionBus()

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

O código acima chama o método do_something toda vez que um sinal é recebido no barramento da sessão.

Na minha pergunta original, afirmei que queria responder a "AboutToShowGroup". No entanto, após uma inspeção mais detalhada da interface 'com.canon.dbusmenu', percebi que é de fato um método e não um sinal. Eu escolhi desde então outro sinal para reagir.

    
por jwigley 17.05.2012 / 03:49