From 66983f0d24b71a2798018873f5c509def40f0e0e Mon Sep 17 00:00:00 2001 From: Morgan Collett Date: Tue, 3 Jul 2007 14:22:30 +0200 Subject: [PATCH 1/3] sugar/presence/activity.py: make Activity.leave call the PS Needed to make buddy-left work --- sugar/presence/activity.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sugar/presence/activity.py b/sugar/presence/activity.py index 3681f917..2df8793d 100644 --- a/sugar/presence/activity.py +++ b/sugar/presence/activity.py @@ -166,6 +166,17 @@ class Activity(gobject.GObject): (bus_name, connection, channels) = self._activity.GetChannels() return bus_name, connection, channels + def _leave_cb(self): + # XXX Is this the right thing to do? + self.emit("joined", False, "left activity") + + def _leave_error_cb(self, err): + # XXX We are closing down anyway + pass + def leave(self): + """Leave this shared activity""" # FIXME self._joined = False + self._activity.Leave(reply_handler=self._leave_cb, + error_handler=self._leave_error_cb) From bbbea6167dbc5e34fb3cff4653e269fcc18ab937 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Wed, 11 Jul 2007 11:02:43 +0200 Subject: [PATCH 2/3] gtk.gdk.pixbuf.get_from_drawable can return None in many occasions (patch from Reinier Heeres). --- sugar/activity/activity.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sugar/activity/activity.py b/sugar/activity/activity.py index 32027035..d63b66e5 100644 --- a/sugar/activity/activity.py +++ b/sugar/activity/activity.py @@ -312,6 +312,8 @@ class Activity(Window, gtk.Container): def _get_preview(self): preview_pixbuf = self.get_canvas_screenshot() + if preview_pixbuf is None: + return None preview_pixbuf = preview_pixbuf.scale_simple(units.grid_to_pixels(4), units.grid_to_pixels(3), gtk.gdk.INTERP_BILINEAR) From bb71cd61cff6a577e3ccd3179f38bbc71a567b0f Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Wed, 11 Jul 2007 11:39:40 +0200 Subject: [PATCH 3/3] #1888 Fix opening items from the clipboard. --- NEWS | 1 + shell/view/clipboardmenu.py | 68 ++++++++++++++++-------------------- sugar/datastore/datastore.py | 34 ++++++++++++++++++ 3 files changed, 66 insertions(+), 37 deletions(-) diff --git a/NEWS b/NEWS index beabf43e..191795ca 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,4 @@ +* #1888 Fix opening items from the clipboard. (tomeu) * #1984 Fix removing items from the clipboard. (tomeu) Snapshot b83a9ec27d diff --git a/shell/view/clipboardmenu.py b/shell/view/clipboardmenu.py index cd154d9a..2eff3f09 100644 --- a/shell/view/clipboardmenu.py +++ b/shell/view/clipboardmenu.py @@ -27,8 +27,6 @@ from sugar.graphics.palette import Palette from sugar.graphics.canvasicon import CanvasIcon from sugar.graphics import color from sugar.graphics import style -from sugar.activity import activityfactory -from sugar.activity.bundle import Bundle from sugar.clipboard import clipboardservice from sugar.datastore import datastore from sugar.objects import mime @@ -118,44 +116,43 @@ class ClipboardMenu(Palette): if self._percent < 100: return - # Get the file path - cb_service = clipboardservice.get_instance() - obj = cb_service.get_object(self._object_id) - formats = obj['FORMATS'] - if len(formats) == 0: - logging.warning('ClipboardMenu._open_item_activate_cb: Object without data.') - return + jobject = self._copy_to_journal() + # TODO: we cannot simply call resume() right now because we would lock + # the shell as we are sharing the same loop as the shell service. + #jobject.resume() + + # TODO: take this out when we fix the mess that is the shell/shellservice. + from shell.model import bundleregistry + from sugar.activity.bundle import Bundle + from sugar.activity import activityfactory + if jobject.is_bundle(): + bundle = Bundle(jobject.file_path) + if not bundle.is_installed(): + bundle.install() - if not self._activity and \ - not formats[0] == 'application/vnd.olpc-x-sugar': - logging.warning('ClipboardMenu._open_item_activate_cb: Object without activity.') - return - - uri = cb_service.get_object_data(self._object_id, formats[0])['DATA'] - if not uri.startswith('file://'): - return - - (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(uri) - - # FIXME: would be better to check for format.onDisk - try: - path_exists = os.path.exists(path) - except TypeError: - path_exists = False - - if path_exists: - if self._activity: - activityfactory.create_with_uri(self._activity, uri) - else: - self._install_xo(path) + activityfactory.create(bundle.get_service_name()) else: - logging.debug("Clipboard item file path %s didn't exist" % path) + service_name = None + if jobject.metadata.has_key('activity') and jobject.metadata['activity']: + service_name = self.metadata['activity'] + elif jobject.metadata.has_key('mime_type') and jobject.metadata['mime_type']: + mime_type = jobject.metadata['mime_type'] + for bundle in bundleregistry.get_registry(): + if bundle.get_mime_types() and mime_type in bundle.get_mime_types(): + service_name = bundle.get_service_name() + break + if service_name: + activityfactory.create_with_object_id(service_name, + jobject.object_id) def _remove_item_activate_cb(self, menu_item): cb_service = clipboardservice.get_instance() cb_service.delete_object(self._object_id) def _journal_item_activate_cb(self, menu_item): + self._copy_to_journal() + + def _copy_to_journal(self): cb_service = clipboardservice.get_instance() obj = cb_service.get_object(self._object_id) @@ -185,9 +182,6 @@ class ClipboardMenu(Palette): jobject.metadata['mime_type'] = mime_type jobject.file_path = file_path datastore.write(jobject) - - def _install_xo(self, path): - bundle = Bundle(path) - if not bundle.is_installed(): - bundle.install() + + return jobject diff --git a/sugar/datastore/datastore.py b/sugar/datastore/datastore.py index 26ea49ea..45af947a 100644 --- a/sugar/datastore/datastore.py +++ b/sugar/datastore/datastore.py @@ -20,6 +20,9 @@ import logging import gobject from sugar.datastore import dbus_helpers +from sugar import activity +from sugar.activity.bundle import Bundle +from sugar.activity import activityfactory class DSMetadata(gobject.GObject): __gsignals__ = { @@ -85,6 +88,37 @@ class DSObject: file_path = property(get_file_path, set_file_path) + def get_activities(self): + activities = [] + + if self.metadata['activity']: + activity_info = activity.get_registry().get_activity(self.metadata['activity']) + activities.append(activity_info) + + mime_type = self.metadata['mime_type'] + if mime_type: + activities_info = activity.get_registry().get_activities_for_type(mime_type) + for activity_info in activities_info: + if activity_info.service_name != self.metadata['activity']: + activities.append(activity_info) + + return activities + + def is_bundle(self): + return self.metadata['mime_type'] == 'application/vnd.olpc-x-sugar' + + def resume(self): + if self.is_bundle(): + bundle = Bundle(self.file_path) + if not bundle.is_installed(): + bundle.install() + + activityfactory.create(bundle.get_service_name()) + else: + activity_info = self.get_activities()[0] + activityfactory.create_with_object_id(activity_info.service_name, + self.object_id) + def get(object_id): logging.debug('datastore.get') metadata = dbus_helpers.get_properties(object_id)