From 23ed18f3557fa6c964447f454e7974bab0c79a6b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 27 Oct 2014 18:24:57 +0530 Subject: [PATCH] Start work on DBUS menu exporter for Unity --- src/calibre/gui2/sni.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/sni.py b/src/calibre/gui2/sni.py index 6426a64031..c8a3db91dc 100644 --- a/src/calibre/gui2/sni.py +++ b/src/calibre/gui2/sni.py @@ -167,6 +167,7 @@ class StatusNotifierItem(QObject): def setContextMenu(self, menu): self.context_menu = menu + self.dbus.publish_new_menu() def geometry(self): return QRect() @@ -185,6 +186,20 @@ class StatusNotifierItem(QObject): def icon(self): return self._icon +class DBusMenu(Object): + + IFACE = 'com.canonical.dbusmenu' + + def __init__(self, notifier, object_path, **kw): + self.notifier = notifier + bus = kw.get('bus') + if bus is None: + bus = kw['bus'] = dbus.SessionBus() + Object.__init__(self, bus, object_path) + + def publish_new_menu(self): + pass + class StatusNotifierItemAPI(Object): 'See http://www.notmart.org/misc/statusnotifieritem/statusnotifieritem.html' @@ -195,7 +210,7 @@ class StatusNotifierItemAPI(Object): self.notifier = notifier bus = kw.get('bus') if bus is None: - bus = dbus.SessionBus() + bus = kw['bus'] = dbus.SessionBus() self.name = '%s-%s-%s' % (self.IFACE, os.getpid(), kw.get('num', 1)) self.dbus_name = BusName(self.name, bus=bus, do_not_queue=True) self.app_id = kw.get('app_id', QApplication.instance().applicationName()) or 'unknown_application' @@ -203,10 +218,14 @@ class StatusNotifierItemAPI(Object): self.title = kw.get('title', self.app_id) self.icon_serialization = qicon_to_sni_image_list(notifier.icon()) Object.__init__(self, bus, '/' + self.IFACE.split('.')[-1]) + self.dbus_menu = DBusMenu(notifier, '/StatusItemMenu', **kw) for name, val in vars(self.__class__).iteritems(): if getattr(val, '_dbus_is_signal', False): getattr(notifier, name).connect(getattr(self, name)) + def publish_new_menu(self): + self.dbus_menu.publish_new_menu() + @dbus_property(IFACE, signature='s') def IconName(self): return '' @@ -255,6 +274,10 @@ class StatusNotifierItemAPI(Object): def Status(self): return 'Active' if self.notifier.isVisible() else 'Passive' + @dbus_property(IFACE, signature='o') + def Menu(self): + return dbus.ObjectPath(self.dbus_menu._object_path) + @dbus_property(IFACE, signature='i') def WindowId(self): return 0 @@ -267,6 +290,11 @@ class StatusNotifierItemAPI(Object): def Activate(self, x, y): self.notifier.activated.emit() + @dbus_method(IFACE, in_signature='u', out_signature='') + def XAyatanaSecondaryActivate(self, timestamp): + # This is called when the user middle clicks the icon in Unity + self.notifier.activated.emit() + @dbus_method(IFACE, in_signature='ii', out_signature='') def SecondaryActivate(self, x, y): self.notifier.activated.emit()