/** * clutter_event_get_angle: * @source: a #ClutterEvent * @target: a #ClutterEvent * * Retrieves the angle relative from @source to @target. * * The direction of the angle is from the position X axis towards * the positive Y axis. * * Return value: the angle between two #ClutterEvent * * Since: 1.12 */ double clutter_event_get_angle (const ClutterEvent *source, const ClutterEvent *target) { ClutterPoint p0, p1; float x_distance, y_distance; double angle; clutter_event_get_position (source, &p0); clutter_event_get_position (target, &p1); if (clutter_point_equals (&p0, &p1)) return 0; clutter_point_distance (&p0, &p1, &x_distance, &y_distance); angle = atan2 (x_distance, y_distance); /* invert the angle, and shift it by 90 degrees */ angle = (2.0 * G_PI) - angle; angle += G_PI / 2.0; /* keep the angle within the [ 0, 360 ] interval */ angle = fmod (angle, 2.0 * G_PI); return angle; }
/** * clutter_event_get_distance: * @source: a #ClutterEvent * @target: a #ClutterEvent * * Retrieves the distance between two events, a @source and a @target. * * Return value: the distance between two #ClutterEvent * * Since: 1.12 */ float clutter_event_get_distance (const ClutterEvent *source, const ClutterEvent *target) { ClutterPoint p0, p1; clutter_event_get_position (source, &p0); clutter_event_get_position (source, &p1); return clutter_point_distance (&p0, &p1, NULL, NULL); }
/** * clutter_event_get_coords: * @event: a #ClutterEvent * @x: (out): return location for the X coordinate, or %NULL * @y: (out): return location for the Y coordinate, or %NULL * * Retrieves the coordinates of @event and puts them into @x and @y. * * Since: 0.4 */ void clutter_event_get_coords (const ClutterEvent *event, gfloat *x, gfloat *y) { ClutterPoint coords; g_return_if_fail (event != NULL); clutter_event_get_position (event, &coords); if (x != NULL) *x = coords.x; if (y != NULL) *y = coords.y; }
/* Pointer was moved over actor with tooltip */ static gboolean _xfdashboard_tooltip_action_on_motion_event(XfdashboardTooltipAction *self, ClutterEvent *inEvent, gpointer inUserData) { XfdashboardTooltipActionPrivate *priv; ClutterActor *actor; guint tooltipTimeout; 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); tooltipTimeout=0; /* Do nothing if tooltip is already visible */ if(priv->isVisible) return(CLUTTER_EVENT_PROPAGATE); /* Remove any timeout source we have added for this actor */ if(priv->timeoutSourceID!=0) { g_source_remove(priv->timeoutSourceID); priv->timeoutSourceID=0; } /* Remember position and actor */ clutter_event_get_position(inEvent, &priv->lastPosition); _xfdashboard_tooltip_last_event_actor=actor; /* Set up new timeout source */ #if GTK_CHECK_VERSION(3, 14 ,0) /* Since GTK+ version 3.10 the setting "gtk-tooltip-timeout" is * not supported anymore and ignored by GTK+ derived application. * So we should also. We set the timeout statically to the default * duration which GTK+ is also using. * This also prevents warning about forthcoming deprecation of this * setting printed to console. */ tooltipTimeout=DEFAULT_TOOLTIP_TIMEOUT; #else /* Get configured duration when a tooltip should be shown from * GTK+ settings. */ g_object_get(gtk_settings_get_default(), "gtk-tooltip-timeout", &tooltipTimeout, NULL); #endif priv->timeoutSourceID=clutter_threads_add_timeout(tooltipTimeout, (GSourceFunc)_xfdashboard_tooltip_action_on_timeout, self); /* Capture next events to check if tooltip should be hidden again */ stage=clutter_actor_get_stage(actor); if(stage && XFDASHBOARD_IS_STAGE(stage)) { g_warn_if_fail((priv->captureSignalID==0 && priv->captureSignalActor==NULL) || (priv->captureSignalID!=0 && priv->captureSignalActor==stage)); if((priv->captureSignalID==0 && priv->captureSignalActor==NULL) || (priv->captureSignalID && priv->captureSignalActor!=stage)) { if(priv->captureSignalActor) g_signal_handler_disconnect(priv->captureSignalActor, priv->captureSignalID); priv->captureSignalActor=NULL; priv->captureSignalID=0; priv->captureSignalActor=stage; priv->captureSignalID=g_signal_connect_swapped(stage, "captured-event", G_CALLBACK(_xfdashboard_tooltip_action_on_captured_event_after_tooltip), self); } } return(CLUTTER_EVENT_PROPAGATE); }