[clutter] gesture-action: Add clutter_gesture_action_get_last_event()
- From: Emanuele Aina <emaaa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter] gesture-action: Add clutter_gesture_action_get_last_event()
- Date: Fri, 19 Oct 2012 12:21:10 +0000 (UTC)
commit ccdbd362345d2224b3edaa60879a6ed55235da1f
Author: Emanuele Aina <emanuele aina collabora com>
Date: Mon Oct 8 17:44:13 2012 +0200
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 1ca6734..b4ca6d0 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);
@@ -221,6 +223,12 @@ gesture_get_threshold (ClutterGestureAction *action)
}
static void
+gesture_point_unset (GesturePoint *point)
+{
+ clutter_event_free (point->last_event);
+}
+
+static void
cancel_gesture (ClutterGestureAction *action)
{
ClutterGestureActionPrivate *priv = action->priv;
@@ -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;
}
@@ -956,6 +972,32 @@ clutter_gesture_action_get_device (ClutterGestureAction *action,
}
/**
+ * 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 2a18a30..2b39039 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 1378745..0f5f6c7 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 c3c701c..4c771c9 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 642a39d..a887582 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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]