Set the window icon to the activity icon for improved look-and-feel when using non-Sugar ways of switching windows (e.g. by enabling the metacity key bindings).
Tested on XO-1.5 running Debian Squeeze. Setting the icon takes << 0.1s (0.058s, 0.026s, 0.021s). Signed-off-by: Sascha Silbe <sascha-...@silbe.org> --- src/sugar/activity/activity.py | 36 ++++++++++++++++++++++++++++++++---- 1 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py index 0e2ecc5..1b1503c 100644 --- a/src/sugar/activity/activity.py +++ b/src/sugar/activity/activity.py @@ -61,13 +61,15 @@ import dbus.service import cjson from sugar import util +from sugar.bundle.activitybundle import ActivityBundle from sugar.presence import presenceservice from sugar.activity.activityservice import ActivityService from sugar.activity.namingalert import NamingAlert from sugar.graphics import style from sugar.graphics.window import Window from sugar.graphics.alert import Alert -from sugar.graphics.icon import Icon +from sugar.graphics.icon import Icon, get_surface +from sugar.graphics.xocolor import XoColor from sugar.datastore import datastore from sugar.session import XSMPClient from sugar import wm @@ -331,6 +333,8 @@ class Activity(Window, gtk.Container): else: logging.debug('Unknown share scope %r', share_scope) + client = gconf.client_get_default() + icon_color = client.get_string('/desktop/sugar/user/color') if handle.object_id is None and create_jobject: logging.debug('Creating a jobject.') self._jobject = datastore.create() @@ -345,9 +349,6 @@ class Activity(Window, gtk.Container): self._jobject.metadata['share-scope'] = SCOPE_PRIVATE if self.shared_activity is not None: icon_color = self.shared_activity.props.color - else: - client = gconf.client_get_default() - icon_color = client.get_string('/desktop/sugar/user/color') self._jobject.metadata['icon-color'] = icon_color self._jobject.file_path = '' @@ -355,6 +356,33 @@ class Activity(Window, gtk.Container): # https://dev.laptop.org/ticket/3071 datastore.write(self._jobject) + icon_pixbuf = self._get_icon_pixbuf(icon_color) + gtk.window_set_default_icon(icon_pixbuf) + self.set_icon(icon_pixbuf) + + def _get_icon_pixbuf(self, icon_color): + """Return colored activity icon as a Pixbuf.""" + bundle = ActivityBundle(get_bundle_path()) + xo_color = XoColor(icon_color) + # FIXME: without background_color there's garbage in the output + surface = get_surface(file_name=bundle.get_icon(), + fill_color=xo_color.get_fill_color(), + stroke_color=xo_color.get_stroke_color(), + background_color=style.COLOR_WHITE.get_gdk_color()) + width, height = surface.get_width(), surface.get_height() + colormap = gtk.gdk.colormap_get_system() + pixmap = gtk.gdk.Pixmap(self.window, width, height, + colormap.get_visual().depth) + pixmap.set_colormap(colormap) + cr = pixmap.cairo_create() + cr.set_source_surface(surface, 0, 0) + cr.paint() + pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, + colormap.get_visual().bits_per_rgb, width, height) + pixbuf = pixbuf.get_from_drawable(pixmap, colormap, 0, 0, 0, 0, + width, height) + return pixbuf + def get_active(self): return self._active -- tg: (29aa609..) t/set-window-icon (depends on: upstream/master) _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel