From ccdbd362345d2224b3edaa60879a6ed55235da1f Mon Sep 17 00:00:00 2001 From: Emanuele Aina Date: Mon, 8 Oct 2012 17:44:13 +0200 Subject: [PATCH] gesture-action: Add clutter_gesture_action_get_last_event() Export the last event received for each touch point in its entirety, instead of duplicating ClutterEvent accessors one at a time. examples/pan-action.c has been updated to show the type of the event that's causing the panning. https://bugzilla.gnome.org/show_bug.cgi?id=685737 --- clutter/clutter-gesture-action.c | 42 ++++++++++++++++++++++ clutter/clutter-gesture-action.h | 4 +++ clutter/clutter.symbols | 1 + doc/reference/clutter/clutter-sections.txt | 1 + examples/pan-action.c | 13 +++++-- 5 files changed, 59 insertions(+), 2 deletions(-) diff --git a/clutter/clutter-gesture-action.c b/clutter/clutter-gesture-action.c index 1ca67345c..b4ca6d0c7 100644 --- a/clutter/clutter-gesture-action.c +++ b/clutter/clutter-gesture-action.c @@ -103,6 +103,7 @@ typedef struct { ClutterInputDevice *device; ClutterEventSequence *sequence; + ClutterEvent *last_event; gfloat press_x, press_y; gint64 last_motion_time; @@ -153,6 +154,7 @@ gesture_register_point (ClutterGestureAction *action, ClutterEvent *event) g_array_set_size (priv->points, priv->points->len + 1); point = &g_array_index (priv->points, GesturePoint, priv->points->len - 1); + point->last_event = clutter_event_copy (event); point->device = clutter_event_get_device (event); clutter_event_get_coords (event, &point->press_x, &point->press_y); @@ -220,6 +222,12 @@ gesture_get_threshold (ClutterGestureAction *action) return threshold; } +static void +gesture_point_unset (GesturePoint *point) +{ + clutter_event_free (point->last_event); +} + static void cancel_gesture (ClutterGestureAction *action) { @@ -331,6 +339,9 @@ stage_captured_event_cb (ClutterActor *stage, return CLUTTER_EVENT_PROPAGATE; } + clutter_event_free (point->last_event); + point->last_event = clutter_event_copy (event); + point->last_delta_x = motion_x - point->last_motion_x; point->last_delta_y = motion_y - point->last_motion_y; point->last_motion_x = motion_x; @@ -364,6 +375,9 @@ stage_captured_event_cb (ClutterActor *stage, { clutter_event_get_coords (event, &point->release_x, &point->release_y); + clutter_event_free (point->last_event); + point->last_event = clutter_event_copy (event); + if (priv->in_gesture && ((priv->points->len - 1) < priv->requested_nb_points)) { @@ -618,6 +632,8 @@ clutter_gesture_action_init (ClutterGestureAction *self) ClutterGestureActionPrivate); self->priv->points = g_array_sized_new (FALSE, TRUE, sizeof (GesturePoint), 3); + g_array_set_clear_func (self->priv->points, (GDestroyNotify) gesture_point_unset); + self->priv->requested_nb_points = 1; self->priv->edge = CLUTTER_GESTURE_TRIGGER_EDGE_AFTER; } @@ -955,6 +971,32 @@ clutter_gesture_action_get_device (ClutterGestureAction *action, return g_array_index (action->priv->points, GesturePoint, point).device; } +/** + * clutter_gesture_action_get_last_event: + * @action: a #ClutterGestureAction + * @point: index of a point currently active + * + * Retrieves a reference to the last #ClutterEvent for a touch point. Call + * clutter_event_copy() if you need to store the reference somewhere. + * + * Return value: (transfer none): the last #ClutterEvent for a touch point. + * + * Since: 1.14 + */ +const ClutterEvent * +clutter_gesture_action_get_last_event (ClutterGestureAction *action, + guint point) +{ + GesturePoint *gesture_point; + + g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL); + g_return_val_if_fail (action->priv->points->len > point, NULL); + + gesture_point = &g_array_index (action->priv->points, GesturePoint, point); + + return gesture_point->last_event; +} + /** * clutter_gesture_action_cancel: * @action: a #ClutterGestureAction diff --git a/clutter/clutter-gesture-action.h b/clutter/clutter-gesture-action.h index 2a18a304a..2b39039ae 100644 --- a/clutter/clutter-gesture-action.h +++ b/clutter/clutter-gesture-action.h @@ -142,6 +142,10 @@ CLUTTER_AVAILABLE_IN_1_12 ClutterInputDevice * clutter_gesture_action_get_device (ClutterGestureAction *action, guint point); +CLUTTER_AVAILABLE_IN_1_14 +const ClutterEvent * clutter_gesture_action_get_last_event (ClutterGestureAction *action, + guint point); + CLUTTER_AVAILABLE_IN_1_12 void clutter_gesture_action_cancel (ClutterGestureAction *action); diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols index 1378745fc..0f5f6c7b0 100644 --- a/clutter/clutter.symbols +++ b/clutter/clutter.symbols @@ -735,6 +735,7 @@ clutter_geometry_intersects clutter_geometry_union clutter_gesture_action_cancel clutter_gesture_action_get_device +clutter_gesture_action_get_last_event clutter_gesture_action_get_motion_coords clutter_gesture_action_get_motion_delta clutter_gesture_action_get_n_current_points diff --git a/doc/reference/clutter/clutter-sections.txt b/doc/reference/clutter/clutter-sections.txt index c3c701c0e..4c771c951 100644 --- a/doc/reference/clutter/clutter-sections.txt +++ b/doc/reference/clutter/clutter-sections.txt @@ -2940,6 +2940,7 @@ clutter_snap_constraint_get_type ClutterGestureAction ClutterGestureActionClass clutter_gesture_action_new +clutter_gesture_action_get_last_event clutter_gesture_action_get_press_coords clutter_gesture_action_get_motion_coords clutter_gesture_action_get_motion_delta diff --git a/examples/pan-action.c b/examples/pan-action.c index 642a39df0..a8875824a 100644 --- a/examples/pan-action.c +++ b/examples/pan-action.c @@ -42,13 +42,22 @@ on_pan (ClutterPanAction *action, gpointer *user_data) { gfloat delta_x, delta_y; + const ClutterEvent *event = NULL; if (is_interpolated) clutter_pan_action_get_interpolated_delta (action, &delta_x, &delta_y); else - clutter_gesture_action_get_motion_delta (CLUTTER_GESTURE_ACTION (action), 0, &delta_x, &delta_y); + { + clutter_gesture_action_get_motion_delta (CLUTTER_GESTURE_ACTION (action), 0, &delta_x, &delta_y); + event = clutter_gesture_action_get_last_event (CLUTTER_GESTURE_ACTION (action), 0); + } - g_print ("panning dx:%.2f dy:%.2f\n", delta_x, delta_y); + g_print ("[%s] panning dx:%.2f dy:%.2f\n", + event == NULL ? "INTERPOLATED" : + event->type == CLUTTER_MOTION ? "MOTION" : + event->type == CLUTTER_TOUCH_UPDATE ? "TOUCH UPDATE" : + "?", + delta_x, delta_y); return TRUE; }