#!/usr/bin/env python import gtk import dbus, dbus.service from dbus.mainloop.glib import DBusGMainLoop import optparse interface = 'org.compiz_fusion.deskmenu' service = 'org.compiz_fusion.deskmenu' class DeskMenu(gtk.Menu): def __init__(self): gtk.Menu.__init__(self) item = gtk.ImageMenuItem('Foo') item.connect('activate', self.reload_activate) item.props.image = gtk.image_new_from_stock('gtk-refresh', gtk.ICON_SIZE_MENU) self.append(item) item = gtk.ImageMenuItem('Bar') item.connect('activate', self.reload_activate) item.props.image = gtk.image_new_from_stock('gtk-stop', gtk.ICON_SIZE_MENU) self.append(item) item = gtk.ImageMenuItem(stock_id=gtk.STOCK_QUIT) item.connect('activate', self.quit_activate) self.append(item) def quit_activate(self, widget): gtk.main_quit() def show_menu(self): self.show_all() self.popup(None, None, None, 0, 0) def reload_activate(self, widget): pass class DeskMenuObject(dbus.service.Object): @dbus.service.method(interface, in_signature='', out_signature='') def show(self): menu.show_menu() parser = optparse.OptionParser() parser.add_option('--launched-by-dbus', action='store_true', dest='dbus_launch', help='internal use') options, args = parser.parse_args() DBusGMainLoop(set_as_default=True) session_bus = dbus.SessionBus() if options.dbus_launch: # make menu name = dbus.service.BusName(service, session_bus) menu = DeskMenu() deskmenu = DeskMenuObject(session_bus, '/org/compiz_fusion/deskmenu/menu') gtk.main() else: # show it obj = session_bus.get_object(interface, '/org/compiz_fusion/deskmenu/menu') deskmenu = dbus.Interface(obj, interface) deskmenu.show()