diff options
Diffstat (limited to 'shell/view/frame/ClipboardBox.py')
-rw-r--r-- | shell/view/frame/ClipboardBox.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/shell/view/frame/ClipboardBox.py b/shell/view/frame/ClipboardBox.py new file mode 100644 index 0000000..9eae973 --- /dev/null +++ b/shell/view/frame/ClipboardBox.py @@ -0,0 +1,61 @@ +import logging +import dbus +import hippo + +from sugar.graphics import style +from view.ClipboardIcon import ClipboardIcon + +class ClipboardBox(hippo.CanvasBox): + + _CLIPBOARD_SERVICE = "org.laptop.Clipboard" + _CLIPBOARD_OBJECT_PATH = "/org/laptop/Clipboard" + + def __init__(self, shell, menu_shell): + hippo.CanvasBox.__init__(self) + self._shell = shell + self._menu_shell = menu_shell + self._icons = {} + + bus = dbus.SessionBus() + bus.add_signal_receiver(self.name_owner_changed_cb, + signal_name="NameOwnerChanged", + dbus_interface="org.freedesktop.DBus") + # Try to register to ClipboardService, if we fail, we'll try later. + try: + self._connect_clipboard_signals() + except dbus.DBusException, exception: + pass + + def _connect_clipboard_signals(self): + bus = dbus.SessionBus() + proxy_obj = bus.get_object(self._CLIPBOARD_SERVICE, self._CLIPBOARD_OBJECT_PATH) + iface = dbus.Interface(proxy_obj, self._CLIPBOARD_SERVICE) + iface.connect_to_signal('object_added', self.object_added_callback) + iface.connect_to_signal('object_deleted', self.object_deleted_callback) + iface.connect_to_signal('object_state_updated', self.object_state_updated_callback) + + def name_owner_changed_cb(self, name, old, new): + if name != self._CLIPBOARD_SERVICE: + return + if (not old and not len(old)) and (new and len(new)): + # ClipboardService started up + self._connect_clipboard_signals() + + def object_added_callback(self, mimeType, fileName): + icon = ClipboardIcon(self._menu_shell, fileName) + style.apply_stylesheet(icon, 'frame.BuddyIcon') + self.append(icon) + self._icons[fileName] = icon + + logging.debug('ClipboardBox: ' + fileName + ' was added.') + + def object_deleted_callback(self, fileName): + icon = self._icons[fileName] + self.remove(icon) + self._icons.remove(icon) + logging.debug('ClipboardBox: ' + fileName + ' was deleted.') + + def object_state_updated_callback(self, fileName, percent): + icon = self._icons[fileName] + icon.set_percent(percent) + logging.debug('ClipboardBox: ' + fileName + ' state was updated.') |