[Sugar-devel] [PATCH v2 sugar-toolkit] set window icon
Sascha Silbe
sascha-pgp at silbe.org
Sun Sep 19 08:55:57 EDT 2010
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-pgp at silbe.org>
---
src/sugar/activity/activity.py | 47 ++++++++++++++++++++++++++++++++-------
1 files changed, 38 insertions(+), 9 deletions(-)
v1 was Reviewed-by: James Cameron <quozl at laptop.org>
v1->v2: Rebased on current mainline/master
diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py
index 0bda2ea..238716f 100644
--- a/src/sugar/activity/activity.py
+++ b/src/sugar/activity/activity.py
@@ -70,13 +70,15 @@ from telepathy.interfaces import CHANNEL, \
from telepathy.constants import CONNECTION_HANDLE_TYPE_CONTACT
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
@@ -327,20 +329,24 @@ class Activity(Window, gtk.Container):
warn_if_none=False)
self._set_up_sharing(mesh_instance, share_scope)
- if handle.object_id is None and create_jobject:
- logging.debug('Creating a jobject.')
- self._jobject = self._initialize_journal_object()
- self.set_title(self._jobject.metadata['title'])
-
- def _initialize_journal_object(self):
- title = _('%s Activity') % get_bundle_name()
-
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')
+ icon_pixbuf = self._get_icon_pixbuf(icon_color)
+ gtk.window_set_default_icon(icon_pixbuf)
+ self.set_icon(icon_pixbuf)
+
+ if handle.object_id is None and create_jobject:
+ logging.debug('Creating a jobject.')
+ self._jobject = self._initialize_journal_object(icon_color)
+ self.set_title(self._jobject.metadata['title'])
+
+ def _initialize_journal_object(self, icon_color):
+ title = _('%s Activity') % get_bundle_name()
+
jobject = datastore.create()
jobject.metadata['title'] = title
jobject.metadata['title_set_by_user'] = '0'
@@ -402,6 +408,29 @@ class Activity(Window, gtk.Container):
self._set_up_sharing(mesh_instance, SCOPE_PRIVATE)
wait_loop.quit()
+ 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: (a2b8518..) t/set-window-icon (depends on: upstream/master)
More information about the Sugar-devel
mailing list