[Xfce4-commits] [apps/xfdashboard] 01/01: Fix not showing tooltip on same actor again when re-entering, e.g. after drag-n-drop

noreply at xfce.org noreply at xfce.org
Mon Jun 8 22:54:27 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 714cb1f09a51b366c7af87c23d74ed726fad5fc9
Author: Stephan Haller <nomad at froevel.de>
Date:   Mon Jun 8 22:53:55 2015 +0200

    Fix not showing tooltip on same actor again when re-entering, e.g. after drag-n-drop
---
 xfdashboard/tooltip-action.c |  137 ++++++++++++++++++++++++++++++------------
 1 file changed, 98 insertions(+), 39 deletions(-)

diff --git a/xfdashboard/tooltip-action.c b/xfdashboard/tooltip-action.c
index 310a3b3..41f3e99 100644
--- a/xfdashboard/tooltip-action.c
+++ b/xfdashboard/tooltip-action.c
@@ -54,6 +54,7 @@ struct _XfdashboardTooltipActionPrivate
 	guint			motionID;
 	guint			leaveID;
 	guint			timeoutSourceID;
+	guint			captureEventID;
 
 	gboolean		isVisible;
 };
@@ -83,6 +84,84 @@ static guint XfdashboardTooltipActionSignals[SIGNAL_LAST]={ 0, };
 /* IMPLEMENTATION: Private variables and methods */
 static ClutterActor		*_xfdashboard_tooltip_last_event_actor=NULL;
 
+/* Pointer left actor with tooltip */
+static gboolean _xfdashboard_tooltip_action_on_leave_event(XfdashboardTooltipAction *self,
+															ClutterEvent *inEvent,
+															gpointer inUserData)
+{
+	XfdashboardTooltipActionPrivate		*priv;
+	ClutterActor						*actor;
+	ClutterActor						*stage;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_TOOLTIP_ACTION(self), CLUTTER_EVENT_PROPAGATE);
+	g_return_val_if_fail(CLUTTER_IS_ACTOR(inUserData), CLUTTER_EVENT_PROPAGATE);
+
+	priv=self->priv;
+	actor=CLUTTER_ACTOR(inUserData);
+
+	/* Remove any timeout source we have added for this actor */
+	if(priv->timeoutSourceID!=0)
+	{
+		g_source_remove(priv->timeoutSourceID);
+		priv->timeoutSourceID=0;
+	}
+
+	/* Clear last actor we remembered if it is pointing to this actor */
+	if(_xfdashboard_tooltip_last_event_actor==actor)
+	{
+		_xfdashboard_tooltip_last_event_actor=NULL;
+	}
+
+	/* Hide tooltip now */
+	stage=clutter_actor_get_stage(actor);
+	if(stage && XFDASHBOARD_IS_STAGE(stage))
+	{
+		/* Remove any 'capture-event' signal handler at stage*/
+		if(priv->captureEventID)
+		{
+			g_signal_handler_disconnect(stage, priv->captureEventID);
+			priv->captureEventID=0;
+		}
+
+		g_signal_emit_by_name(stage, "hide-tooltip", self, NULL);
+		priv->isVisible=FALSE;
+	}
+
+	return(CLUTTER_EVENT_PROPAGATE);
+}
+
+/* An event after a tooltip was shown so check if tooltip should be hidden again */
+static gboolean _xfdashboard_tooltip_action_on_captured_event_after_tooltip(XfdashboardTooltipAction *self,
+																			ClutterEvent *inEvent,
+																			gpointer inUserData)
+{
+	gboolean		doHide;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_TOOLTIP_ACTION(self), G_SOURCE_REMOVE);
+	g_return_val_if_fail(XFDASHBOARD_IS_STAGE(inUserData), CLUTTER_EVENT_PROPAGATE);
+
+	/* Check if tooltip should be hidden depending on event type */
+	switch(clutter_event_type(inEvent))
+	{
+		case CLUTTER_NOTHING:
+		case CLUTTER_MOTION:
+			doHide=FALSE;
+			break;
+
+		default:
+			doHide=TRUE;
+			break;
+	}
+
+	/* Hide tooltip if requested */
+	if(doHide)
+	{
+		_xfdashboard_tooltip_action_on_leave_event(self, inEvent, inUserData);
+	}
+
+	return(CLUTTER_EVENT_PROPAGATE);
+}
+
 /* Timeout for tooltip has been reached */
 static gboolean _xfdashboard_tooltip_action_on_timeout(gpointer inUserData)
 {
@@ -117,6 +196,12 @@ static gboolean _xfdashboard_tooltip_action_on_timeout(gpointer inUserData)
 		/* Show tooltip */
 		g_signal_emit_by_name(stage, "show-tooltip", self, NULL);
 		priv->isVisible=TRUE;
+
+		/* Capture next events to check if tooltip should be hidden again */
+		priv->captureEventID=g_signal_connect_swapped(stage,
+														"captured-event",
+														G_CALLBACK(_xfdashboard_tooltip_action_on_captured_event_after_tooltip),
+														self);
 	}
 
 	/* Remove source */
@@ -165,45 +250,6 @@ static gboolean _xfdashboard_tooltip_action_on_motion_event(XfdashboardTooltipAc
 	return(CLUTTER_EVENT_PROPAGATE);
 }
 
-/* Pointer left actor with tooltip */
-static gboolean _xfdashboard_tooltip_action_on_leave_event(XfdashboardTooltipAction *self,
-															ClutterEvent *inEvent,
-															gpointer inUserData)
-{
-	XfdashboardTooltipActionPrivate		*priv;
-	ClutterActor						*actor;
-	ClutterActor						*stage;
-
-	g_return_val_if_fail(XFDASHBOARD_IS_TOOLTIP_ACTION(self), CLUTTER_EVENT_PROPAGATE);
-	g_return_val_if_fail(CLUTTER_IS_ACTOR(inUserData), CLUTTER_EVENT_PROPAGATE);
-
-	priv=self->priv;
-	actor=CLUTTER_ACTOR(inUserData);
-
-	/* Remove any timeout source we have added for this actor */
-	if(priv->timeoutSourceID!=0)
-	{
-		g_source_remove(priv->timeoutSourceID);
-		priv->timeoutSourceID=0;
-	}
-
-	/* Clear last actor we remembered if it is pointing to this actor */
-	if(_xfdashboard_tooltip_last_event_actor==actor)
-	{
-		_xfdashboard_tooltip_last_event_actor=NULL;
-	}
-
-	/* Hide tooltip now */
-	stage=clutter_actor_get_stage(actor);
-	if(stage && XFDASHBOARD_IS_STAGE(stage))
-	{
-		g_signal_emit_by_name(stage, "hide-tooltip", self, NULL);
-		priv->isVisible=FALSE;
-	}
-
-	return(CLUTTER_EVENT_PROPAGATE);
-}
-
 /* IMPLEMENTATION: ClutterActorMeta */
 
 /* Called when attaching and detaching a ClutterActorMeta instance to a ClutterActor */
@@ -222,6 +268,12 @@ static void _xfdashboard_tooltip_action_set_actor(ClutterActorMeta *inActorMeta,
 	oldActor=clutter_actor_meta_get_actor(inActorMeta);
 
 	/* Disconnect signals and remove sources */
+	if(priv->captureEventID)
+	{
+		if(oldActor!=NULL) g_signal_handler_disconnect(oldActor, priv->captureEventID);
+		priv->captureEventID=0;
+	}
+
 	if(priv->motionID!=0)
 	{
 		if(oldActor!=NULL) g_signal_handler_disconnect(oldActor, priv->motionID);
@@ -274,6 +326,12 @@ static void _xfdashboard_tooltip_action_dispose(GObject *inObject)
 	actor=clutter_actor_meta_get_actor(CLUTTER_ACTOR_META(inObject));
 
 	/* Release allocated resources */
+	if(priv->captureEventID)
+	{
+		if(actor!=NULL) g_signal_handler_disconnect(actor, priv->captureEventID);
+		priv->captureEventID=0;
+	}
+
 	if(priv->motionID!=0)
 	{
 		if(actor!=NULL) g_signal_handler_disconnect(actor, priv->motionID);
@@ -398,6 +456,7 @@ static void xfdashboard_tooltip_action_init(XfdashboardTooltipAction *self)
 	priv->motionID=0;
 	priv->leaveID=0;
 	priv->timeoutSourceID=0;
+	priv->captureEventID=0;
 }
 
 /* IMPLEMENTATION: Public API */

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


More information about the Xfce4-commits mailing list