[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