3

I'm endeavouring to use dbus to react to a particular signal (user clicks on an appindicator menu on the unity top panel). From using dbus-monitor, I've found the relevant signal that I'd like to react to:

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

Then my plan was to do the following with 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 

In order to understand dbus, I've been using the following two articles: the dbus-python tutorial and How to read dbus-monitor output?

However, I'm a bit confused as to what values I should be using for bus name, path, interface and signal in my code. I've tried poking around in qdbus in order to work out the correct values, but I can't seem to find what I'm looking for. I think I've been thrown off because get_object requires a "well-known" name, but all I've got is the numerical unique identifiers for sender, dest.

Any nudge in the right direction would be greatly appreciated.

2
  • This should typically be fairly easy, but it seems that DBus objects are created dynamically for their indicators. Reference Transmission with an indicator enabled in D-Feet to see. The real problem here is how to bus.get_object for your "myapp" bus name.
    – Jjed
    May 16, 2012 at 5:24
  • Thanks for recommending d-feet. It's a highly useful tool for viewing available signals and methods. Through it, I realised 'AbouttoShowGroup' is actually a method, not a signal. This was something I over-looked in the dbus-monitor output.
    – jwigley
    May 17, 2012 at 1:52

1 Answer 1

1

The add_signal_receiver function can be used without specifying a bus name. This can be useful for capturing signals when the bus name, interface or specific signal name is unknown.

session_bus = dbus.SessionBus()

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

The above code calls the do_something method every time a signal is received on the session bus.

In my original question, I stated I wanted to respond to 'AboutToShowGroup'. However, after closer inspection of the 'com.canonical.dbusmenu' interface, I realised it is in fact a method and not a signal. I have since chosen another signal to react to.

4
  • 1
    What signal did you use to determine that the user has clicked on your AppIndicator icon?
    – Mendhak
    May 19, 2012 at 14:01
  • I could not find any signals that seemed relevant for clicking on the AppIndicator icon. Instead, I re-thought my design approach and decided I wouldn't react to the menu being opened, but instead to other system events that would require my app to act.
    – jwigley
    May 21, 2012 at 3:09
  • 1
    Shah, while there is still no 'proper' solution for determining when a user has clicked on an AppIndicator icon. Sampo555 has come up with a workaround, reacting to the Unity Panel Service dbus.
    – jwigley
    Sep 5, 2012 at 23:24
  • Thanks, interesting read. I gave up on it as well and moved to a different approach, but if I revisit this area it will be a good point to start experimenting.
    – Mendhak
    Sep 10, 2012 at 22:34

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .