Split up code into individual modules

This commit is contained in:
Kovid Goyal 2014-10-27 18:41:52 +05:30
parent e0e0fb83bb
commit 4cff896ed4
3 changed files with 77 additions and 41 deletions

View File

@ -0,0 +1,27 @@
#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import (unicode_literals, division, absolute_import,
print_function)
__license__ = 'GPL v3'
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
import dbus
from calibre.utils.dbus_service import Object
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

View File

@ -6,39 +6,22 @@ from __future__ import (unicode_literals, division, absolute_import,
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
import os, sys, array, socket # Implement the StatusNotifierItem spec for creating a system tray icon in
# modern linux desktop environments. See
# http://www.notmart.org/misc/statusnotifieritem/index.html#introduction
# This is not an actual standard, but is apparently used by GNOME, KDE and
# Unity, which makes it necessary enough to implement.
import os
import dbus import dbus
from PyQt5.Qt import ( from PyQt5.Qt import (
QApplication, QObject, pyqtSignal, Qt, QPoint, QRect, QMenu, QImage, QSize, QIcon) QApplication, QObject, pyqtSignal, Qt, QPoint, QRect, QMenu, QIcon)
from calibre.gui2.dbus_export.menu import DBusMenu
from calibre.gui2.dbus_export.utils import log, qicon_to_sni_image_list
from calibre.utils.dbus_service import Object, method as dbus_method, BusName, dbus_property, signal as dbus_signal from calibre.utils.dbus_service import Object, method as dbus_method, BusName, dbus_property, signal as dbus_signal
def log(*args, **kw):
kw['file'] = sys.stderr
print('StatusNotifier:', *args, **kw)
kw['file'].flush()
def qicon_to_sni_image_list(qicon):
'See http://www.notmart.org/misc/statusnotifieritem/icons.html'
ans = dbus.Array(signature='(iiay)')
if not qicon.isNull():
sizes = qicon.availableSizes() or (QSize(x, x) for x in (32, 64, 128, 256))
tc = b'L' if array.array(b'I').itemsize < 4 else b'I'
for size in sizes:
# Convert to DBUS struct of width, height, and image data in ARGB32
# in network endianness
i = qicon.pixmap(size).toImage().convertToFormat(QImage.Format_ARGB32)
w, h = i.width(), i.height()
data = i.constBits().asstring(4 * w * h)
if socket.htonl(1) != 1:
# Host endianness != Network Endiannes
data = array.array(tc, i.constBits().asstring(4 * i.width() * i.height()))
data.byteswap()
data = data.tostring()
ans.append((w, h, dbus.ByteArray(data)))
return ans
class Factory(QObject): class Factory(QObject):
'See http://www.notmart.org/misc/statusnotifieritem/statusnotifierwatcher.html' 'See http://www.notmart.org/misc/statusnotifieritem/statusnotifierwatcher.html'
@ -186,20 +169,6 @@ class StatusNotifierItem(QObject):
def icon(self): def icon(self):
return self._icon 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): class StatusNotifierItemAPI(Object):
'See http://www.notmart.org/misc/statusnotifieritem/statusnotifieritem.html' 'See http://www.notmart.org/misc/statusnotifieritem/statusnotifieritem.html'

View File

@ -0,0 +1,40 @@
#!/usr/bin/env python
# vim:fileencoding=utf-8
from __future__ import (unicode_literals, division, absolute_import,
print_function)
__license__ = 'GPL v3'
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
import sys, array, socket
import dbus
from PyQt5.Qt import QSize, QImage
def log(*args, **kw):
kw['file'] = sys.stderr
print('StatusNotifier:', *args, **kw)
kw['file'].flush()
def qicon_to_sni_image_list(qicon):
'See http://www.notmart.org/misc/statusnotifieritem/icons.html'
ans = dbus.Array(signature='(iiay)')
if not qicon.isNull():
sizes = qicon.availableSizes() or (QSize(x, x) for x in (32, 64, 128, 256))
tc = b'L' if array.array(b'I').itemsize < 4 else b'I'
for size in sizes:
# Convert to DBUS struct of width, height, and image data in ARGB32
# in network endianness
i = qicon.pixmap(size).toImage().convertToFormat(QImage.Format_ARGB32)
w, h = i.width(), i.height()
data = i.constBits().asstring(4 * w * h)
if socket.htonl(1) != 1:
# Host endianness != Network Endiannes
data = array.array(tc, i.constBits().asstring(4 * i.width() * i.height()))
data.byteswap()
data = data.tostring()
ans.append((w, h, dbus.ByteArray(data)))
return ans