[gnome-shell] Add shell_texture_cache_bind_pixbuf_property
- From: Colin Walters <walters src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Add shell_texture_cache_bind_pixbuf_property
- Date: Wed, 19 Aug 2009 03:10:54 +0000 (UTC)
commit 74ea9f930521b21f68502818355daa0f07b9c7fe
Author: Colin Walters <walters verbum org>
Date: Fri Aug 14 04:33:45 2009 -0400
Add shell_texture_cache_bind_pixbuf_property
This utility function is targeted for MetaWindow; we can create
a ClutterTexture which tracks the value of an "icon" property.
src/shell-texture-cache.c | 102 +++++++++++++++++++++++++++++++++++++++++++++
src/shell-texture-cache.h | 4 ++
2 files changed, 106 insertions(+), 0 deletions(-)
---
diff --git a/src/shell-texture-cache.c b/src/shell-texture-cache.c
index 90e1b2e..534d382 100644
--- a/src/shell-texture-cache.c
+++ b/src/shell-texture-cache.c
@@ -770,6 +770,108 @@ out:
g_free (data);
}
+typedef struct {
+ ShellTextureCache *cache;
+ ClutterTexture *texture;
+ GObject *source;
+ guint notify_signal_id;
+ gboolean weakref_active;
+} ShellTextureCachePropertyBind;
+
+static void
+shell_texture_cache_reset_texture (ShellTextureCachePropertyBind *bind, const char *propname)
+{
+ GdkPixbuf *pixbuf;
+ CoglHandle texdata;
+
+ g_object_get (bind->source, propname, &pixbuf, NULL);
+
+ g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf));
+
+ if (pixbuf != NULL)
+ {
+ texdata = pixbuf_to_cogl_handle (pixbuf);
+ g_object_unref (pixbuf);
+
+ clutter_texture_set_cogl_texture (bind->texture, texdata);
+ cogl_handle_unref (texdata);
+
+ clutter_actor_set_opacity (CLUTTER_ACTOR (bind->texture), 255);
+ }
+ else
+ clutter_actor_set_opacity (CLUTTER_ACTOR (bind->texture), 0);
+}
+
+static void
+shell_texture_cache_on_pixbuf_notify (GObject *object,
+ GParamSpec *paramspec,
+ gpointer data)
+{
+ ShellTextureCachePropertyBind *bind = data;
+ shell_texture_cache_reset_texture (bind, paramspec->name);
+}
+
+static void
+shell_texture_cache_bind_weak_notify (gpointer data,
+ GObject *source_location)
+{
+ ShellTextureCachePropertyBind *bind = data;
+ bind->weakref_active = FALSE;
+ g_signal_handler_disconnect (bind->source, bind->notify_signal_id);
+}
+
+static void
+shell_texture_cache_free_bind (gpointer data)
+{
+ ShellTextureCachePropertyBind *bind = data;
+ if (bind->weakref_active)
+ g_object_weak_unref (G_OBJECT(bind->texture), shell_texture_cache_bind_weak_notify, bind);
+ g_free (bind);
+}
+
+/**
+ * shell_texture_cache_bind_pixbuf_property:
+ * @cache:
+ * @object: A #GObject with a property @property_name of type #GdkPixbuf
+ * @property_name: Name of a property
+ *
+ * Create a #ClutterTexture which tracks the #GdkPixbuf value of a GObject property
+ * named by @property_name. Unlike other methods in ShellTextureCache, the underlying
+ * CoglHandle is not shared by default with other invocations to this method.
+ *
+ * If the source object is destroyed, the texture will continue to show the last
+ * value of the property.
+ *
+ * Return value: (transfer none): A new #ClutterActor
+ */
+ClutterActor *
+shell_texture_cache_bind_pixbuf_property (ShellTextureCache *cache,
+ GObject *object,
+ const char *property_name)
+{
+ ClutterTexture *texture;
+ gchar *notify_key;
+ ShellTextureCachePropertyBind *bind;
+
+ texture = CLUTTER_TEXTURE (clutter_texture_new ());
+
+ bind = g_new0 (ShellTextureCachePropertyBind, 1);
+ bind->cache = cache;
+ bind->texture = texture;
+ bind->source = object;
+ g_object_weak_ref (G_OBJECT (texture), shell_texture_cache_bind_weak_notify, bind);
+ bind->weakref_active = TRUE;
+
+ shell_texture_cache_reset_texture (bind, property_name);
+
+ notify_key = g_strdup_printf ("notify::%s", property_name);
+ bind->notify_signal_id = g_signal_connect_data (object, notify_key, G_CALLBACK(shell_texture_cache_on_pixbuf_notify),
+ bind, (GClosureNotify)shell_texture_cache_free_bind, 0);
+ g_free (notify_key);
+
+ return CLUTTER_ACTOR(texture);
+}
+
/**
* shell_texture_cache_load_gicon:
*
diff --git a/src/shell-texture-cache.h b/src/shell-texture-cache.h
index a228fba..a6ab8cb 100644
--- a/src/shell-texture-cache.h
+++ b/src/shell-texture-cache.h
@@ -40,6 +40,10 @@ GType shell_texture_cache_get_type (void) G_GNUC_CONST;
ShellTextureCache* shell_texture_cache_get_default (void);
+ClutterActor *shell_texture_cache_bind_pixbuf_property (ShellTextureCache *cache,
+ GObject *object,
+ const char *property_name);
+
ClutterActor *shell_texture_cache_load_icon_name (ShellTextureCache *cache,
const char *name,
gint size);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]