[Xfce4-commits] [apps/xfdashboard] 02/03: Add emblem effect

noreply at xfce.org noreply at xfce.org
Mon Apr 20 20:25:40 CEST 2015


This is an automated email from the git hooks/post-receive script.

nomad pushed a commit to branch master
in repository apps/xfdashboard.

commit a082e804317358d7f49e56a0b7f8e1587ffb68eb
Author: Stephan Haller <nomad at froevel.de>
Date:   Mon Apr 20 20:23:52 2015 +0200

    Add emblem effect
    
    This new emblem effect allows an icon to drawn over an actor as an effect. Implement this as an effect allows multiples icon (emblem) to be drawn over an actor and it can be defined by a theme via an effect XML file.
---
 xfdashboard/Makefile.am     |    2 +
 xfdashboard/actor.c         |    5 +-
 xfdashboard/button.c        |   12 +-
 xfdashboard/emblem-effect.c |  700 +++++++++++++++++++++++++++++++++++++++++++
 xfdashboard/emblem-effect.h |   82 +++++
 xfdashboard/image-content.c |   86 ++++--
 xfdashboard/image-content.h |   18 +-
 xfdashboard/live-window.c   |    4 +-
 xfdashboard/view.c          |    4 +-
 xfdashboard/windows-view.c  |    4 +-
 10 files changed, 872 insertions(+), 45 deletions(-)

diff --git a/xfdashboard/Makefile.am b/xfdashboard/Makefile.am
index 56de0c5..d3d15a8 100644
--- a/xfdashboard/Makefile.am
+++ b/xfdashboard/Makefile.am
@@ -36,6 +36,7 @@ xfdashboard_headers = \
 	drag-action.h \
 	drop-action.h \
 	dynamic-table-layout.h \
+	emblem-effect.h \
 	fill-box-layout.h \
 	focusable.h \
 	focus-manager.h \
@@ -97,6 +98,7 @@ xfdashboard_SOURCES = \
 	drag-action.c \
 	drop-action.c \
 	dynamic-table-layout.c \
+	emblem-effect.c \
 	fill-box-layout.c \
 	focusable.c \
 	focus-manager.c \
diff --git a/xfdashboard/actor.c b/xfdashboard/actor.c
index 32b4844..8ef453b 100644
--- a/xfdashboard/actor.c
+++ b/xfdashboard/actor.c
@@ -203,6 +203,7 @@ static void _xfdashboard_actor_update_effects(XfdashboardActor *self, const gcha
 	g_return_if_fail(XFDASHBOARD_IS_ACTOR(self));
 
 	priv=self->priv;
+	effectIDs=NULL;
 	effectsList=NULL;
 
 	/* Get theme effect instance which is needed to create effect objects.
@@ -215,7 +216,7 @@ static void _xfdashboard_actor_update_effects(XfdashboardActor *self, const gcha
 	g_object_ref(themeEffects);
 
 	/* Get array of effect ID to create */
-	effectIDs=xfdashboard_split_string(inEffects, " \t\r\n");
+	if(inEffects) effectIDs=xfdashboard_split_string(inEffects, " \t\r\n");
 
 	/* Remove all effects from actor */
 	clutter_actor_clear_effects(CLUTTER_ACTOR(self));
@@ -224,7 +225,7 @@ static void _xfdashboard_actor_update_effects(XfdashboardActor *self, const gcha
 	 * build result string with new list of effect IDs
 	 */
 	iter=effectIDs;
-	while(*iter)
+	while(iter && *iter)
 	{
 		ClutterEffect			*effect;
 
diff --git a/xfdashboard/button.c b/xfdashboard/button.c
index 5b514fe..df69ba6 100644
--- a/xfdashboard/button.c
+++ b/xfdashboard/button.c
@@ -656,11 +656,11 @@ static void _xfdashboard_button_on_mapped_changed(XfdashboardButton *self,
 		priv->iconNameLoaded==FALSE &&
 		priv->iconName)
 	{
-		ClutterImage	*image;
+		ClutterContent			*image;
 
 		/* Set icon image */
 		image=xfdashboard_image_content_new_for_icon_name(priv->iconName, priv->iconSize);
-		clutter_actor_set_content(priv->actorIcon, CLUTTER_CONTENT(image));
+		clutter_actor_set_content(priv->actorIcon, image);
 		g_object_unref(image);
 
 		priv->iconNameLoaded=TRUE;
@@ -1604,7 +1604,7 @@ const gchar* xfdashboard_button_get_icon(XfdashboardButton *self)
 void xfdashboard_button_set_icon(XfdashboardButton *self, const gchar *inIconName)
 {
 	XfdashboardButtonPrivate	*priv;
-	ClutterImage				*image;
+	ClutterContent				*image;
 
 	g_return_if_fail(XFDASHBOARD_IS_BUTTON(self));
 	g_return_if_fail(inIconName);
@@ -1630,7 +1630,7 @@ void xfdashboard_button_set_icon(XfdashboardButton *self, const gchar *inIconNam
 		{
 			/* Actor is mapped so we cannot defer loading and setting image */
 			image=xfdashboard_image_content_new_for_icon_name(priv->iconName, priv->iconSize);
-			clutter_actor_set_content(priv->actorIcon, CLUTTER_CONTENT(image));
+			clutter_actor_set_content(priv->actorIcon, image);
 			g_object_unref(image);
 
 			priv->iconNameLoaded=TRUE;
@@ -1708,10 +1708,10 @@ void xfdashboard_button_set_icon_size(XfdashboardButton *self, gint inSize)
 
 		if(priv->iconName)
 		{
-			ClutterImage		*image;
+			ClutterContent		*image;
 
 			image=xfdashboard_image_content_new_for_icon_name(priv->iconName, priv->iconSize);
-			clutter_actor_set_content(priv->actorIcon, CLUTTER_CONTENT(image));
+			clutter_actor_set_content(priv->actorIcon, image);
 			g_object_unref(image);
 		}
 
diff --git a/xfdashboard/emblem-effect.c b/xfdashboard/emblem-effect.c
new file mode 100644
index 0000000..4f3cdae
--- /dev/null
+++ b/xfdashboard/emblem-effect.c
@@ -0,0 +1,700 @@
+/*
+ * emblem-effect: Draws an emblem on top of an actor
+ * 
+ * Copyright 2012-2015 Stephan Haller <nomad at froevel.de>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ * 
+ * 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define COGL_ENABLE_EXPERIMENTAL_API
+#define CLUTTER_ENABLE_EXPERIMENTAL_API
+
+#include "emblem-effect.h"
+
+#include <glib/gi18n-lib.h>
+#include <math.h>
+#include <cogl/cogl.h>
+
+#include "image-content.h"
+#include "enums.h"
+
+/* Define this class in GObject system */
+G_DEFINE_TYPE(XfdashboardEmblemEffect,
+				xfdashboard_emblem_effect,
+				CLUTTER_TYPE_EFFECT)
+
+/* Private structure - access only by public API if needed */
+#define XFDASHBOARD_EMBLEM_EFFECT_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE((obj), XFDASHBOARD_TYPE_EMBLEM_EFFECT, XfdashboardEmblemEffectPrivate))
+
+struct _XfdashboardEmblemEffectPrivate
+{
+	/* Properties related */
+	gchar						*iconName;
+	gint						iconSize;
+	gfloat						xAlign;
+	gfloat						yAlign;
+	ClutterGravity				gravity;
+
+	/* Instance related */
+	ClutterContent				*icon;
+	guint						loadSuccessSignalID;
+	guint						loadFailedSignalID;
+
+	CoglPipeline				*pipeline;
+};
+
+/* Properties */
+enum
+{
+	PROP_0,
+
+	PROP_ICON_NAME,
+	PROP_ICON_SIZE,
+	PROP_X_ALIGN,
+	PROP_Y_ALIGN,
+	PROP_GRAVITY,
+
+	PROP_LAST
+};
+
+static GParamSpec* XfdashboardEmblemEffectProperties[PROP_LAST]={ 0, };
+
+/* IMPLEMENTATION: Private variables and methods */
+static CoglPipeline		*_xfdashboard_emblem_effect_base_pipeline=NULL;
+
+/* Icon image was loaded */
+static void _xfdashboard_emblem_effect_on_load_finished(XfdashboardEmblemEffect *self, gpointer inUserData)
+{
+	XfdashboardEmblemEffectPrivate		*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self));
+
+	priv=self->priv;
+
+	/* Disconnect signal handlers */
+	if(priv->loadSuccessSignalID)
+	{
+		g_signal_handler_disconnect(priv->icon, priv->loadSuccessSignalID);
+		priv->loadSuccessSignalID=0;
+	}
+
+	if(priv->loadFailedSignalID)
+	{
+		g_signal_handler_disconnect(priv->icon, priv->loadFailedSignalID);
+		priv->loadFailedSignalID=0;
+	}
+
+	/* Set image at pipeline */
+	cogl_pipeline_set_layer_texture(priv->pipeline,
+									0,
+									clutter_image_get_texture(CLUTTER_IMAGE(priv->icon)));
+
+	/* Invalidate effect to get it redrawn */
+	clutter_effect_queue_repaint(CLUTTER_EFFECT(self));
+}
+
+/* IMPLEMENTATION: ClutterEffect */
+
+/* Draw effect after actor was drawn */
+static void _xfdashboard_emblem_effect_paint(ClutterEffect *inEffect, ClutterEffectPaintFlags inFlags)
+{
+	XfdashboardEmblemEffect					*self;
+	XfdashboardEmblemEffectPrivate			*priv;
+	ClutterActor							*target;
+	gfloat									actorWidth;
+	gfloat									actorHeight;
+	ClutterActorBox							actorBox;
+	ClutterActorBox							rectangleBox;
+	XfdashboardImageContentLoadingState		loadingState;
+	gfloat									textureWidth;
+	gfloat									textureHeight;
+	ClutterActorBox							textureCoordBox;
+	gfloat									offset;
+	gfloat									oversize;
+
+	g_return_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(inEffect));
+
+	self=XFDASHBOARD_EMBLEM_EFFECT(inEffect);
+	priv=self->priv;
+
+	/* Chain to the next item in the paint sequence */
+	target=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(self));
+	clutter_actor_continue_paint(target);
+
+	/* If no icon name is set do not apply this effect */
+	if(!priv->iconName) return;
+
+	/* Load image if not done yet */
+	if(!priv->icon)
+	{
+		/* Get image from cache */
+		priv->icon=xfdashboard_image_content_new_for_icon_name(priv->iconName, priv->iconSize);
+
+		/* Ensure image is being loaded */
+		loadingState=xfdashboard_image_content_get_state(XFDASHBOARD_IMAGE_CONTENT(priv->icon));
+		if(loadingState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_NONE ||
+			loadingState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADING)
+		{
+			/* Connect signals just because we need to wait for image being loaded */
+			priv->loadSuccessSignalID=g_signal_connect_swapped(priv->icon,
+																"loaded",
+																G_CALLBACK(_xfdashboard_emblem_effect_on_load_finished),
+																self);
+			priv->loadFailedSignalID=g_signal_connect_swapped(priv->icon,
+																"loading-failed",
+																G_CALLBACK(_xfdashboard_emblem_effect_on_load_finished),
+																self);
+
+			/* If image is not being loaded currently enforce loading now */
+			if(loadingState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_NONE)
+			{
+				xfdashboard_image_content_force_load(XFDASHBOARD_IMAGE_CONTENT(priv->icon));
+			}
+		}
+			else
+			{
+				/* Image is already loaded so set image at pipeline */
+				cogl_pipeline_set_layer_texture(priv->pipeline,
+												0,
+												clutter_image_get_texture(CLUTTER_IMAGE(priv->icon)));
+			}
+	}
+
+	/* Get actor size */
+	clutter_actor_get_content_box(target, &actorBox);
+	actorWidth=actorBox.x2-actorBox.x1;
+	actorHeight=actorBox.y2-actorBox.y1;
+
+	/* Get texture size */
+	clutter_content_get_preferred_size(CLUTTER_CONTENT(priv->icon), &textureWidth, &textureHeight);
+	clutter_actor_box_init(&textureCoordBox, 0.0f, 0.0f, 1.0f, 1.0f);
+
+	/* Get boundary in X axis depending on gravity and scaled width */
+	offset=(priv->xAlign*actorWidth);
+	switch(priv->gravity)
+	{
+		/* Align to left boundary.
+		 * This is also the default if gravity is none or undefined.
+		 */
+		default:
+		case CLUTTER_GRAVITY_NONE:
+		case CLUTTER_GRAVITY_WEST:
+		case CLUTTER_GRAVITY_NORTH_WEST:
+		case CLUTTER_GRAVITY_SOUTH_WEST:
+			break;
+
+		/* Align to center of X axis */
+		case CLUTTER_GRAVITY_CENTER:
+		case CLUTTER_GRAVITY_NORTH:
+		case CLUTTER_GRAVITY_SOUTH:
+			offset-=(textureWidth/2.0f);
+			break;
+
+		/* Align to right boundary */
+		case CLUTTER_GRAVITY_EAST:
+		case CLUTTER_GRAVITY_NORTH_EAST:
+		case CLUTTER_GRAVITY_SOUTH_EAST:
+			offset-=textureWidth;
+			break;
+	}
+
+	/* Set boundary in X axis */
+	rectangleBox.x1=actorBox.x1+offset;
+	rectangleBox.x2=rectangleBox.x1+textureWidth;
+
+	/* Clip texture in X axis if it does not fit into allocation */
+	if(rectangleBox.x1<actorBox.x1)
+	{
+		oversize=actorBox.x1-rectangleBox.x1;
+		textureCoordBox.x1=oversize/textureWidth;
+		rectangleBox.x1=actorBox.x1;
+	}
+
+	if(rectangleBox.x2>actorBox.x2)
+	{
+		oversize=rectangleBox.x2-actorBox.x2;
+		textureCoordBox.x2=1.0f-(oversize/textureWidth);
+		rectangleBox.x2=actorBox.x2;
+	}
+
+	/* Get boundary in Y axis depending on gravity and scaled width */
+	offset=(priv->yAlign*actorHeight);
+	switch(priv->gravity)
+	{
+		/* Align to upper boundary.
+		 * This is also the default if gravity is none or undefined.
+		 */
+		default:
+		case CLUTTER_GRAVITY_NONE:
+		case CLUTTER_GRAVITY_NORTH:
+		case CLUTTER_GRAVITY_NORTH_WEST:
+		case CLUTTER_GRAVITY_NORTH_EAST:
+			break;
+
+		/* Align to center of Y axis */
+		case CLUTTER_GRAVITY_CENTER:
+		case CLUTTER_GRAVITY_WEST:
+		case CLUTTER_GRAVITY_EAST:
+			offset-=(textureHeight/2.0f);
+			break;
+
+		/* Align to lower boundary */
+		case CLUTTER_GRAVITY_SOUTH:
+		case CLUTTER_GRAVITY_SOUTH_WEST:
+		case CLUTTER_GRAVITY_SOUTH_EAST:
+			offset-=textureHeight;
+			break;
+	}
+
+	/* Set boundary in Y axis */
+	rectangleBox.y1=actorBox.y1+offset;
+	rectangleBox.y2=rectangleBox.y1+textureHeight;
+
+	/* Clip texture in Y axis if it does not fit into allocation */
+	if(rectangleBox.y1<actorBox.y1)
+	{
+		oversize=actorBox.y1-rectangleBox.y1;
+		textureCoordBox.y1=oversize/textureHeight;
+		rectangleBox.y1=actorBox.y1;
+	}
+
+	if(rectangleBox.y2>actorBox.y2)
+	{
+		oversize=rectangleBox.y2-actorBox.y2;
+		textureCoordBox.y2=1.0f-(oversize/textureHeight);
+		rectangleBox.y2=actorBox.y2;
+	}
+
+	/* Draw icon if image was loaded */
+	loadingState=xfdashboard_image_content_get_state(XFDASHBOARD_IMAGE_CONTENT(priv->icon));
+	if(loadingState!=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_SUCCESSFULLY &&
+		loadingState!=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_FAILED)
+	{
+		g_debug("Emblem image '%s' is still being loaded at %s",
+				priv->iconName,
+				G_OBJECT_TYPE_NAME(inEffect));
+		return;
+	}
+
+	cogl_push_source(priv->pipeline);
+	cogl_rectangle_with_texture_coords(rectangleBox.x1, rectangleBox.y1,
+										rectangleBox.x2, rectangleBox.y2,
+										textureCoordBox.x1, textureCoordBox.y1,
+										textureCoordBox.x2, textureCoordBox.y2);
+	cogl_pop_source();
+}
+
+/* IMPLEMENTATION: GObject */
+
+/* Dispose this object */
+static void _xfdashboard_emblem_effect_dispose(GObject *inObject)
+{
+	/* Release allocated variables */
+	XfdashboardEmblemEffect			*self=XFDASHBOARD_EMBLEM_EFFECT(inObject);
+	XfdashboardEmblemEffectPrivate	*priv=self->priv;
+
+	if(priv->pipeline)
+	{
+		cogl_object_unref(priv->pipeline);
+		priv->pipeline=NULL;
+	}
+
+	if(priv->icon)
+	{
+		/* Disconnect any connected signal handler */
+		if(priv->loadSuccessSignalID)
+		{
+			g_signal_handler_disconnect(priv->icon, priv->loadSuccessSignalID);
+			priv->loadSuccessSignalID=0;
+		}
+
+		if(priv->loadFailedSignalID)
+		{
+			g_signal_handler_disconnect(priv->icon, priv->loadFailedSignalID);
+			priv->loadFailedSignalID=0;
+		}
+
+		/* Release image itself */
+		g_object_unref(priv->icon);
+		priv->icon=NULL;
+	}
+
+	if(priv->iconName)
+	{
+		g_free(priv->iconName);
+		priv->iconName=NULL;
+	}
+
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_emblem_effect_parent_class)->dispose(inObject);
+}
+
+/* Set/get properties */
+static void _xfdashboard_emblem_effect_set_property(GObject *inObject,
+														guint inPropID,
+														const GValue *inValue,
+														GParamSpec *inSpec)
+{
+	XfdashboardEmblemEffect			*self=XFDASHBOARD_EMBLEM_EFFECT(inObject);
+
+	switch(inPropID)
+	{
+		case PROP_ICON_NAME:
+			xfdashboard_emblem_effect_set_icon_name(self, g_value_get_string(inValue));
+			break;
+
+		case PROP_ICON_SIZE:
+			xfdashboard_emblem_effect_set_icon_size(self, g_value_get_int(inValue));
+			break;
+
+		case PROP_X_ALIGN:
+			xfdashboard_emblem_effect_set_x_align(self, g_value_get_float(inValue));
+			break;
+
+		case PROP_Y_ALIGN:
+			xfdashboard_emblem_effect_set_y_align(self, g_value_get_float(inValue));
+			break;
+
+		case PROP_GRAVITY:
+			xfdashboard_emblem_effect_set_gravity(self, g_value_get_enum(inValue));
+			break;
+
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec);
+			break;
+	}
+}
+
+static void _xfdashboard_emblem_effect_get_property(GObject *inObject,
+														guint inPropID,
+														GValue *outValue,
+														GParamSpec *inSpec)
+{
+	XfdashboardEmblemEffect			*self=XFDASHBOARD_EMBLEM_EFFECT(inObject);
+	XfdashboardEmblemEffectPrivate		*priv=self->priv;
+
+	switch(inPropID)
+	{
+		case PROP_ICON_NAME:
+			g_value_set_string(outValue, priv->iconName);
+			break;
+
+		case PROP_ICON_SIZE:
+			g_value_set_int(outValue, priv->iconSize);
+			break;
+
+		case PROP_X_ALIGN:
+			g_value_set_float(outValue, priv->xAlign);
+			break;
+
+		case PROP_Y_ALIGN:
+			g_value_set_float(outValue, priv->yAlign);
+			break;
+
+		case PROP_GRAVITY:
+			g_value_set_enum(outValue, priv->gravity);
+			break;
+
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec);
+			break;
+	}
+}
+
+/* Class initialization
+ * Override functions in parent classes and define properties
+ * and signals
+ */
+static void xfdashboard_emblem_effect_class_init(XfdashboardEmblemEffectClass *klass)
+{
+	ClutterEffectClass				*effectClass=CLUTTER_EFFECT_CLASS(klass);
+	GObjectClass					*gobjectClass=G_OBJECT_CLASS(klass);
+
+	/* Override functions */
+	gobjectClass->dispose=_xfdashboard_emblem_effect_dispose;
+	gobjectClass->set_property=_xfdashboard_emblem_effect_set_property;
+	gobjectClass->get_property=_xfdashboard_emblem_effect_get_property;
+
+	effectClass->paint=_xfdashboard_emblem_effect_paint;
+
+	/* Set up private structure */
+	g_type_class_add_private(klass, sizeof(XfdashboardEmblemEffectPrivate));
+
+	/* Define properties */
+	XfdashboardEmblemEffectProperties[PROP_ICON_NAME]=
+		g_param_spec_string("icon-name",
+							_("Icon name"),
+							_("Themed icon name or file name of icon"),
+							N_(""),
+							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	XfdashboardEmblemEffectProperties[PROP_ICON_SIZE]=
+		g_param_spec_int("icon-size",
+							_("Icon size"),
+							_("Size of icon"),
+							1, G_MAXINT,
+							16,
+							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	XfdashboardEmblemEffectProperties[PROP_X_ALIGN]=
+		g_param_spec_float("x-align",
+							_("X align"),
+							_("The alignment of emblem on the X axis within the allocation in normalized coordinate between 0 and 1"),
+							0.0f, 1.0f,
+							0.0f,
+							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	XfdashboardEmblemEffectProperties[PROP_Y_ALIGN]=
+		g_param_spec_float("y-align",
+							_("Y align"),
+							_("The alignment of emblem on the Y axis within the allocation in normalized coordinate between 0 and 1"),
+							0.0f, 1.0f,
+							0.0f,
+							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	XfdashboardEmblemEffectProperties[PROP_GRAVITY]=
+		g_param_spec_enum("gravity",
+							_("Gravity"),
+							_("The anchor point of emblem"),
+							CLUTTER_TYPE_GRAVITY,
+							CLUTTER_GRAVITY_NONE,
+							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	g_object_class_install_properties(gobjectClass, PROP_LAST, XfdashboardEmblemEffectProperties);
+}
+
+/* Object initialization
+ * Create private structure and set up default values
+ */
+static void xfdashboard_emblem_effect_init(XfdashboardEmblemEffect *self)
+{
+	XfdashboardEmblemEffectPrivate	*priv;
+
+	priv=self->priv=XFDASHBOARD_EMBLEM_EFFECT_GET_PRIVATE(self);
+
+	/* Set up default values */
+	priv->iconName=NULL;
+	priv->iconSize=16.0f;
+	priv->xAlign=0.0f;
+	priv->yAlign=0.0f;
+	priv->gravity=CLUTTER_GRAVITY_NONE;
+	priv->icon=NULL;
+	priv->loadSuccessSignalID=0;
+	priv->loadFailedSignalID=0;
+
+	/* Set up pipeline */
+	if(G_UNLIKELY(!_xfdashboard_emblem_effect_base_pipeline))
+    {
+		CoglContext					*context;
+
+		/* Get context to create base pipeline */
+		context=clutter_backend_get_cogl_context(clutter_get_default_backend());
+
+		/* Create base pipeline */
+		_xfdashboard_emblem_effect_base_pipeline=cogl_pipeline_new(context);
+		cogl_pipeline_set_layer_null_texture(_xfdashboard_emblem_effect_base_pipeline,
+												0, /* layer number */
+												COGL_TEXTURE_TYPE_2D);
+	}
+
+	priv->pipeline=cogl_pipeline_copy(_xfdashboard_emblem_effect_base_pipeline);
+}
+
+/* IMPLEMENTATION: Public API */
+
+/* Create new actor */
+ClutterEffect* xfdashboard_emblem_effect_new(void)
+{
+	return(g_object_new(XFDASHBOARD_TYPE_EMBLEM_EFFECT, NULL));
+}
+
+/* Get/set icon name of emblem to draw */
+const gchar* xfdashboard_emblem_effect_get_icon_name(XfdashboardEmblemEffect *self)
+{
+	g_return_val_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self), NULL);
+
+	return(self->priv->iconName);
+}
+
+void xfdashboard_emblem_effect_set_icon_name(XfdashboardEmblemEffect *self, const gchar *inIconName)
+{
+	XfdashboardEmblemEffectPrivate	*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self));
+	g_return_if_fail(inIconName);
+
+	priv=self->priv;
+
+	/* Set value if changed */
+	if(priv->icon || g_strcmp0(priv->iconName, inIconName)!=0)
+	{
+		/* Set value */
+		if(priv->iconName) g_free(priv->iconName);
+		priv->iconName=g_strdup(inIconName);
+
+		/* Dispose any icon image loaded */
+		if(priv->icon)
+		{
+			g_object_unref(priv->icon);
+			priv->icon=NULL;
+		}
+
+		/* Invalidate effect to get it redrawn */
+		clutter_effect_queue_repaint(CLUTTER_EFFECT(self));
+
+		/* Notify about property change */
+		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardEmblemEffectProperties[PROP_ICON_NAME]);
+	}
+}
+
+/* Get/set icon size of emblem to draw */
+gint xfdashboard_emblem_effect_get_icon_size(XfdashboardEmblemEffect *self)
+{
+	g_return_val_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self), 0);
+
+	return(self->priv->iconSize);
+}
+
+void xfdashboard_emblem_effect_set_icon_size(XfdashboardEmblemEffect *self, const gint inSize)
+{
+	XfdashboardEmblemEffectPrivate	*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self));
+	g_return_if_fail(inSize>0);
+
+	priv=self->priv;
+
+	/* Set value if changed */
+	if(priv->iconSize!=inSize)
+	{
+		/* Set value */
+		priv->iconSize=inSize;
+
+		/* Dispose any icon image loaded */
+		if(priv->icon)
+		{
+			g_object_unref(priv->icon);
+			priv->icon=NULL;
+		}
+
+		/* Invalidate effect to get it redrawn */
+		clutter_effect_queue_repaint(CLUTTER_EFFECT(self));
+
+		/* Notify about property change */
+		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardEmblemEffectProperties[PROP_ICON_SIZE]);
+	}
+}
+
+/* Get/set x align of emblem */
+gfloat xfdashboard_emblem_effect_get_x_align(XfdashboardEmblemEffect *self)
+{
+	g_return_val_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self), 0.0f);
+
+	return(self->priv->xAlign);
+}
+
+void xfdashboard_emblem_effect_set_x_align(XfdashboardEmblemEffect *self, const gfloat inAlign)
+{
+	XfdashboardEmblemEffectPrivate		*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self));
+	g_return_if_fail(inAlign>=0.0f && inAlign<=1.0f);
+
+	priv=self->priv;
+
+	/* Set value if changed */
+	if(priv->xAlign!=inAlign)
+	{
+		/* Set value */
+		priv->xAlign=inAlign;
+
+		/* Invalidate effect to get it redrawn */
+		clutter_effect_queue_repaint(CLUTTER_EFFECT(self));
+
+		/* Notify about property change */
+		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardEmblemEffectProperties[PROP_X_ALIGN]);
+	}
+}
+
+/* Get/set y align of emblem */
+gfloat xfdashboard_emblem_effect_get_y_align(XfdashboardEmblemEffect *self)
+{
+	g_return_val_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self), 0.0f);
+
+	return(self->priv->xAlign);
+}
+
+void xfdashboard_emblem_effect_set_y_align(XfdashboardEmblemEffect *self, const gfloat inAlign)
+{
+	XfdashboardEmblemEffectPrivate		*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self));
+	g_return_if_fail(inAlign>=0.0f && inAlign<=1.0f);
+
+	priv=self->priv;
+
+	/* Set value if changed */
+	if(priv->yAlign!=inAlign)
+	{
+		/* Set value */
+		priv->yAlign=inAlign;
+
+		/* Invalidate effect to get it redrawn */
+		clutter_effect_queue_repaint(CLUTTER_EFFECT(self));
+
+		/* Notify about property change */
+		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardEmblemEffectProperties[PROP_Y_ALIGN]);
+	}
+}
+
+/* Get/set gravity (anchor point) of emblem */
+ClutterGravity xfdashboard_emblem_effect_get_gravity(XfdashboardEmblemEffect *self)
+{
+	g_return_val_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self), CLUTTER_GRAVITY_NONE);
+
+	return(self->priv->gravity);
+}
+
+void xfdashboard_emblem_effect_set_gravity(XfdashboardEmblemEffect *self, const ClutterGravity inGravity)
+{
+	XfdashboardEmblemEffectPrivate		*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_EMBLEM_EFFECT(self));
+	g_return_if_fail(inGravity>=CLUTTER_GRAVITY_NONE);
+	g_return_if_fail(inGravity<=CLUTTER_GRAVITY_CENTER);
+
+	priv=self->priv;
+
+	/* Set value if changed */
+	if(priv->gravity!=inGravity)
+	{
+		/* Set value */
+		priv->gravity=inGravity;
+
+		/* Invalidate effect to get it redrawn */
+		clutter_effect_queue_repaint(CLUTTER_EFFECT(self));
+
+		/* Notify about property change */
+		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardEmblemEffectProperties[PROP_GRAVITY]);
+	}
+}
diff --git a/xfdashboard/emblem-effect.h b/xfdashboard/emblem-effect.h
new file mode 100644
index 0000000..745589f
--- /dev/null
+++ b/xfdashboard/emblem-effect.h
@@ -0,0 +1,82 @@
+/*
+ * emblem-effect: Draws an emblem on top of an actor
+ * 
+ * Copyright 2012-2015 Stephan Haller <nomad at froevel.de>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ * 
+ * 
+ */
+
+#ifndef __XFDASHBOARD_EMBLEM_EFFECT__
+#define __XFDASHBOARD_EMBLEM_EFFECT__
+
+#include <clutter/clutter.h>
+
+#include "types.h"
+
+G_BEGIN_DECLS
+
+#define XFDASHBOARD_TYPE_EMBLEM_EFFECT				(xfdashboard_emblem_effect_get_type())
+#define XFDASHBOARD_EMBLEM_EFFECT(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), XFDASHBOARD_TYPE_EMBLEM_EFFECT, XfdashboardEmblemEffect))
+#define XFDASHBOARD_IS_EMBLEM_EFFECT(obj)			(G_TYPE_CHECK_INSTANCE_TYPE((obj), XFDASHBOARD_TYPE_EMBLEM_EFFECT))
+#define XFDASHBOARD_EMBLEM_EFFECT_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST((klass), XFDASHBOARD_TYPE_EMBLEM_EFFECT, XfdashboardEmblemEffectClass))
+#define XFDASHBOARD_IS_EMBLEM_EFFECT_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), XFDASHBOARD_TYPE_EMBLEM_EFFECT))
+#define XFDASHBOARD_EMBLEM_EFFECT_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS((obj), XFDASHBOARD_TYPE_EMBLEM_EFFECT, XfdashboardEmblemEffectClass))
+
+typedef struct _XfdashboardEmblemEffect			XfdashboardEmblemEffect;
+typedef struct _XfdashboardEmblemEffectClass		XfdashboardEmblemEffectClass;
+typedef struct _XfdashboardEmblemEffectPrivate		XfdashboardEmblemEffectPrivate;
+
+struct _XfdashboardEmblemEffect
+{
+	/* Parent instance */
+	ClutterEffect						parent_instance;
+
+	/* Private structure */
+	XfdashboardEmblemEffectPrivate		*priv;
+};
+
+struct _XfdashboardEmblemEffectClass
+{
+	/*< private >*/
+	/* Parent class */
+	ClutterEffectClass					parent_class;
+};
+
+/* Public API */
+GType xfdashboard_emblem_effect_get_type(void) G_GNUC_CONST;
+
+ClutterEffect* xfdashboard_emblem_effect_new(void);
+
+const gchar* xfdashboard_emblem_effect_get_icon_name(XfdashboardEmblemEffect *self);
+void xfdashboard_emblem_effect_set_icon_name(XfdashboardEmblemEffect *self, const gchar *inIconName);
+
+gint xfdashboard_emblem_effect_get_icon_size(XfdashboardEmblemEffect *self);
+void xfdashboard_emblem_effect_set_icon_size(XfdashboardEmblemEffect *self, const gint inSize);
+
+gfloat xfdashboard_emblem_effect_get_x_align(XfdashboardEmblemEffect *self);
+void xfdashboard_emblem_effect_set_x_align(XfdashboardEmblemEffect *self, const gfloat inAlign);
+
+gfloat xfdashboard_emblem_effect_get_y_align(XfdashboardEmblemEffect *self);
+void xfdashboard_emblem_effect_set_y_align(XfdashboardEmblemEffect *self, const gfloat inAlign);
+
+ClutterGravity xfdashboard_emblem_effect_get_gravity(XfdashboardEmblemEffect *self);
+void xfdashboard_emblem_effect_set_gravity(XfdashboardEmblemEffect *self, const ClutterGravity inGravity);
+
+G_END_DECLS
+
+#endif	/* __XFDASHBOARD_EMBLEM_EFFECT__ */
diff --git a/xfdashboard/image-content.c b/xfdashboard/image-content.c
index 68c8504..b301e78 100644
--- a/xfdashboard/image-content.c
+++ b/xfdashboard/image-content.c
@@ -60,19 +60,18 @@ typedef enum /*< skip,prefix=XFDASHBOARD_IMAGE_TYPE >*/
 struct _XfdashboardImageContentPrivate
 {
 	/* Properties related */
-	gchar					*key;
+	gchar							*key;
 
 	/* Instance related */
-	XfdashboardImageType	type;
-	gboolean				isLoaded;
-	gboolean				successfulLoaded;
-	GtkIconTheme			*iconTheme;
-	gchar					*iconName;
-	GIcon					*gicon;
-	gint					iconSize;
-
-	guint					contentAttachedSignalID;
-	guint					iconThemeChangedSignalID;
+	XfdashboardImageType			type;
+	XfdashboardImageContentLoadingState	loadState;
+	GtkIconTheme					*iconTheme;
+	gchar							*iconName;
+	GIcon							*gicon;
+	gint							iconSize;
+
+	guint							contentAttachedSignalID;
+	guint							iconThemeChangedSignalID;
 };
 
 /* Properties */
@@ -252,7 +251,7 @@ static void _xfdashboard_image_content_loading_async_callback(GObject *inSource,
 	GdkPixbuf							*pixbuf;
 	GError								*error=NULL;
 
-	priv->successfulLoaded=TRUE;
+	priv->loadState=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_SUCCESSFULLY;
 
 	/* Get pixbuf loaded */
 	pixbuf=gdk_pixbuf_new_from_stream_finish(inResult, &error);
@@ -278,7 +277,7 @@ static void _xfdashboard_image_content_loading_async_callback(GObject *inSource,
 
 			/* Set failed state and empty image */
 			_xfdashboard_image_content_set_empty_image(self);
-			priv->successfulLoaded=FALSE;
+			priv->loadState=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_FAILED;
 		}
 	}
 		else
@@ -294,14 +293,14 @@ static void _xfdashboard_image_content_loading_async_callback(GObject *inSource,
 
 			/* Set failed state and empty image */
 			_xfdashboard_image_content_set_empty_image(self);
-			priv->successfulLoaded=FALSE;
+			priv->loadState=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_FAILED;
 		}
 
 	/* Release allocated resources */
 	if(pixbuf) g_object_unref(pixbuf);
 
 	/* Emit "loaded" signal if loading was successful ... */
-	if(priv->successfulLoaded)
+	if(priv->loadState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_SUCCESSFULLY)
 	{
 		g_signal_emit(self, XfdashboardImageContentSignals[SIGNAL_LOADED], 0);
 		g_debug("Successfully loaded image for key '%s' asynchronously", priv->key ? priv->key : "<nil>");
@@ -841,7 +840,8 @@ static void _xfdashboard_image_content_on_icon_theme_changed(XfdashboardImageCon
 	priv=self->priv;
 
 	/* If icon has not been loaded yet then there is no need to do it now */
-	if(!priv->isLoaded) return;
+	if(priv->loadState!=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_SUCCESSFULLY &&
+		priv->loadState!=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_FAILED) return;
 
 	/* Set empty image - just for the case loading failed at any point */
 	_xfdashboard_image_content_set_empty_image(self);
@@ -953,13 +953,17 @@ static void _xfdashboard_image_content_on_attached(ClutterContent *inContent,
 	self=XFDASHBOARD_IMAGE_CONTENT(inContent);
 	priv=self->priv;
 
+	/* If image is being loaded then do nothing */
+	if(priv->loadState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADING) return;
+
 	/* Check if image was already loaded then emit signal
 	 * appropiate for last load status.
 	 */
-	if(priv->isLoaded)
+	if(priv->loadState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_SUCCESSFULLY ||
+		priv->loadState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_FAILED)
 	{
 		/* Emit "loaded" signal if loading was successful ... */
-		if(priv->successfulLoaded)
+		if(priv->loadState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_SUCCESSFULLY)
 		{
 			g_signal_emit(self, XfdashboardImageContentSignals[SIGNAL_LOADED], 0);
 		}
@@ -972,8 +976,8 @@ static void _xfdashboard_image_content_on_attached(ClutterContent *inContent,
 		return;
 	}
 
-	/* Mark image loaded regardless if loading will succeed or fail */
-	priv->isLoaded=TRUE;
+	/* Mark image being loaded */
+	priv->loadState=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADING;
 
 	/* Also disconnect signal handler as it should not be called anymore */
 	g_signal_handler_disconnect(self, priv->contentAttachedSignalID);
@@ -1137,8 +1141,7 @@ void xfdashboard_image_content_init(XfdashboardImageContent *self)
 	priv->iconName=NULL;
 	priv->gicon=NULL;
 	priv->iconSize=0;
-	priv->isLoaded=FALSE;
-	priv->successfulLoaded=FALSE;
+	priv->loadState=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_NONE;
 	priv->iconTheme=gtk_icon_theme_get_default();
 
 	/* Connect to "attached" signal of ClutterContent to get notified
@@ -1167,7 +1170,7 @@ void xfdashboard_image_content_init(XfdashboardImageContent *self)
  * In all cases a valid ClutterImage object is returned must be unreffed with
  * g_object_unref().
  */
-ClutterImage* xfdashboard_image_content_new_for_icon_name(const gchar *inIconName, gint inSize)
+ClutterContent* xfdashboard_image_content_new_for_icon_name(const gchar *inIconName, gint inSize)
 {
 	ClutterImage		*image;
 	gchar				*key;
@@ -1195,7 +1198,7 @@ ClutterImage* xfdashboard_image_content_new_for_icon_name(const gchar *inIconNam
 	g_free(key);
 
 	/* Return ClutterImage */
-	return(image);
+	return(CLUTTER_CONTENT(image));
 }
 
 /* Create new instance or use cached one for GIcon object.
@@ -1204,7 +1207,7 @@ ClutterImage* xfdashboard_image_content_new_for_icon_name(const gchar *inIconNam
  * In all cases a valid ClutterImage object is returned must be unreffed with
  * g_object_unref().
  */
-ClutterImage* xfdashboard_image_content_new_for_gicon(GIcon *inIcon, gint inSize)
+ClutterContent* xfdashboard_image_content_new_for_gicon(GIcon *inIcon, gint inSize)
 {
 	ClutterImage		*image;
 	gchar				*key;
@@ -1232,7 +1235,7 @@ ClutterImage* xfdashboard_image_content_new_for_gicon(GIcon *inIcon, gint inSize
 	g_free(key);
 
 	/* Return ClutterImage */
-	return(image);
+	return(CLUTTER_CONTENT(image));
 }
 
 /* Create a new instance for GdkPixbuf object.
@@ -1242,7 +1245,7 @@ ClutterImage* xfdashboard_image_content_new_for_gicon(GIcon *inIcon, gint inSize
  * The return ClutterImage object (if not NULL) must be unreffed with
  * g_object_unref().
  */
-ClutterImage* xfdashboard_image_content_new_for_pixbuf(GdkPixbuf *inPixbuf)
+ClutterContent* xfdashboard_image_content_new_for_pixbuf(GdkPixbuf *inPixbuf)
 {
 	ClutterContent		*image;
 	GError				*error;
@@ -1277,7 +1280,7 @@ ClutterImage* xfdashboard_image_content_new_for_pixbuf(GdkPixbuf *inPixbuf)
 	}
 
 	/* Return ClutterImage */
-	return(CLUTTER_IMAGE(image));
+	return(CLUTTER_CONTENT(image));
 }
 
 /* Get size of image as specified when creating this object instance */
@@ -1302,3 +1305,30 @@ void xfdashboard_image_content_get_real_size(XfdashboardImageContent *self, gint
 	if(outWidth) *outWidth=floor(w);
 	if(outHeight) *outHeight=floor(h);
 }
+
+/* Get loading state of image */
+XfdashboardImageContentLoadingState xfdashboard_image_content_get_state(XfdashboardImageContent *self)
+{
+	g_return_val_if_fail(XFDASHBOARD_IS_IMAGE_CONTENT(self), XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_NONE);
+
+	return(self->priv->loadState);
+}
+
+/* Force loading image if not available */
+void xfdashboard_image_content_force_load(XfdashboardImageContent *self)
+{
+	XfdashboardImageContentPrivate		*priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_IMAGE_CONTENT(self));
+
+	priv=self->priv;
+
+	/* If loading state is none then image was not loaded yet and is also
+	 * not being loaded currently. So enforce loading now.
+	 */
+	if(priv->loadState==XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_NONE)
+	{
+		g_message("Need to enforce loading '%s'", priv->iconName);
+		_xfdashboard_image_content_on_attached(CLUTTER_CONTENT(self), NULL, NULL);
+	}
+}
diff --git a/xfdashboard/image-content.h b/xfdashboard/image-content.h
index 4fa83c0..50551f4 100644
--- a/xfdashboard/image-content.h
+++ b/xfdashboard/image-content.h
@@ -62,15 +62,27 @@ struct _XfdashboardImageContentClass
 };
 
 /* Public API */
+typedef enum /*< prefix=XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE >*/
+{
+	XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_NONE=0,
+	XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADING,
+	XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_SUCCESSFULLY,
+	XFDASHBOARD_IMAGE_CONTENT_LOADING_STATE_LOADED_FAILED
+} XfdashboardImageContentLoadingState;
+
 GType xfdashboard_image_content_get_type(void) G_GNUC_CONST;
 
-ClutterImage* xfdashboard_image_content_new_for_icon_name(const gchar *inIconName, gint inSize);
-ClutterImage* xfdashboard_image_content_new_for_gicon(GIcon *inIcon, gint inSize);
-ClutterImage* xfdashboard_image_content_new_for_pixbuf(GdkPixbuf *inPixbuf);
+ClutterContent* xfdashboard_image_content_new_for_icon_name(const gchar *inIconName, gint inSize);
+ClutterContent* xfdashboard_image_content_new_for_gicon(GIcon *inIcon, gint inSize);
+ClutterContent* xfdashboard_image_content_new_for_pixbuf(GdkPixbuf *inPixbuf);
 
 gint xfdashboard_image_content_get_size(XfdashboardImageContent *self);
 void xfdashboard_image_content_get_real_size(XfdashboardImageContent *self, gint *outWidth, gint *outHeight);
 
+XfdashboardImageContentLoadingState xfdashboard_image_content_get_state(XfdashboardImageContent *self);
+
+void xfdashboard_image_content_force_load(XfdashboardImageContent *self);
+
 G_END_DECLS
 
 #endif	/* __XFDASHBOARD_IMAGE_CONTENT__ */
diff --git a/xfdashboard/live-window.c b/xfdashboard/live-window.c
index 51ed74f..296f2da 100644
--- a/xfdashboard/live-window.c
+++ b/xfdashboard/live-window.c
@@ -212,7 +212,7 @@ static void _xfdashboard_live_window_on_icon_changed(XfdashboardLiveWindow *self
 														gpointer inUserData)
 {
 	XfdashboardLiveWindowPrivate	*priv;
-	ClutterImage					*icon;
+	ClutterContent					*icon;
 
 	g_return_if_fail(XFDASHBOARD_IS_LIVE_WINDOW(self));
 	g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(inWindow));
@@ -224,7 +224,7 @@ static void _xfdashboard_live_window_on_icon_changed(XfdashboardLiveWindow *self
 
 	/* Set new icon in title actor */
 	icon=xfdashboard_image_content_new_for_pixbuf(xfdashboard_window_tracker_window_get_icon(inWindow));
-	xfdashboard_button_set_icon_image(XFDASHBOARD_BUTTON(priv->actorTitle), icon);
+	xfdashboard_button_set_icon_image(XFDASHBOARD_BUTTON(priv->actorTitle), CLUTTER_IMAGE(icon));
 	g_object_unref(icon);
 }
 
diff --git a/xfdashboard/view.c b/xfdashboard/view.c
index cb0d69a..b98122f 100644
--- a/xfdashboard/view.c
+++ b/xfdashboard/view.c
@@ -54,7 +54,7 @@ struct _XfdashboardViewPrivate
 	gchar					*viewName;
 
 	gchar					*viewIcon;
-	ClutterImage			*viewIconImage;
+	ClutterContent			*viewIconImage;
 
 	XfdashboardFitMode		fitMode;
 
@@ -659,7 +659,7 @@ void xfdashboard_view_set_icon(XfdashboardView *self, const gchar *inIcon)
 
 		/* Notify about property change */
 		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardViewProperties[PROP_VIEW_ICON]);
-		g_signal_emit(self, XfdashboardViewSignals[SIGNAL_ICON_CHANGED], 0, priv->viewIconImage);
+		g_signal_emit(self, XfdashboardViewSignals[SIGNAL_ICON_CHANGED], 0, CLUTTER_IMAGE(priv->viewIconImage));
 	}
 }
 
diff --git a/xfdashboard/windows-view.c b/xfdashboard/windows-view.c
index e3ee315..4feaafe 100644
--- a/xfdashboard/windows-view.c
+++ b/xfdashboard/windows-view.c
@@ -607,7 +607,7 @@ static void _xfdashboard_windows_view_on_drag_begin(ClutterDragAction *inAction,
 	ClutterActor					*dragHandle;
 	ClutterStage					*stage;
 	GdkPixbuf						*windowIcon;
-	ClutterImage					*image;
+	ClutterContent					*image;
 	XfdashboardLiveWindow			*liveWindow;
 
 	g_return_if_fail(CLUTTER_IS_DRAG_ACTION(inAction));
@@ -629,7 +629,7 @@ static void _xfdashboard_windows_view_on_drag_begin(ClutterDragAction *inAction,
 	dragHandle=xfdashboard_background_new();
 	clutter_actor_set_position(dragHandle, inStageX, inStageY);
 	clutter_actor_set_size(dragHandle, DEFAULT_DRAG_HANDLE_SIZE, DEFAULT_DRAG_HANDLE_SIZE);
-	xfdashboard_background_set_image(XFDASHBOARD_BACKGROUND(dragHandle), image);
+	xfdashboard_background_set_image(XFDASHBOARD_BACKGROUND(dragHandle), CLUTTER_IMAGE(image));
 	clutter_actor_add_child(CLUTTER_ACTOR(stage), dragHandle);
 
 	clutter_drag_action_set_drag_handle(inAction, dragHandle);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list