[clutter] gesture-action: Add clutter_gesture_action_get_last_event()



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]