[clutter] event: Add ClutterTouchEvent



commit d15b828cc5749772a46bee07277aa1694c67a1fd
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Mon Mar 19 13:47:19 2012 +0000

    event: Add ClutterTouchEvent
    
    The ClutterTouchEvent structure contains the data relative to a touch
    event.

 clutter/clutter-enums.h |   18 ++++++++-
 clutter/clutter-event.c |   97 +++++++++++++++++++++++++++++++++++++++++++++++
 clutter/clutter-event.h |   55 ++++++++++++++++++++++++++
 clutter/clutter-main.c  |    9 ++++
 clutter/clutter.symbols |    1 +
 5 files changed, 179 insertions(+), 1 deletions(-)
---
diff --git a/clutter/clutter-enums.h b/clutter/clutter-enums.h
index 3942627..8c71c02 100644
--- a/clutter/clutter-enums.h
+++ b/clutter/clutter-enums.h
@@ -703,6 +703,16 @@ typedef enum { /*< flags prefix=CLUTTER_EVENT >*/
  * @CLUTTER_DESTROY_NOTIFY: Destroy notification event
  * @CLUTTER_CLIENT_MESSAGE: Client message event
  * @CLUTTER_DELETE: Stage delete event
+ * @CLUTTER_TOUCH_BEGIN: A new touch event sequence has started;
+ *   event added in 1.10
+ * @CLUTTER_TOUCH_UPDATE: A touch event sequence has been updated;
+ *   event added in 1.10
+ * @CLUTTER_TOUCH_END: A touch event sequence has finished;
+ *   event added in 1.10
+ * @CLUTTER_TOUCH_CANCEL: A touch event sequence has been canceled;
+ *   event added in 1.10
+ * @CLUTTER_EVENT_LAST: Marks the end of the #ClutterEventType enumeration;
+ *   added in 1.10
  *
  * Types of events.
  *
@@ -721,7 +731,13 @@ typedef enum { /*< prefix=CLUTTER >*/
   CLUTTER_STAGE_STATE,
   CLUTTER_DESTROY_NOTIFY,
   CLUTTER_CLIENT_MESSAGE,
-  CLUTTER_DELETE
+  CLUTTER_DELETE,
+  CLUTTER_TOUCH_BEGIN,
+  CLUTTER_TOUCH_UPDATE,
+  CLUTTER_TOUCH_END,
+  CLUTTER_TOUCH_CANCEL,
+
+  CLUTTER_EVENT_LAST            /* helper */
 } ClutterEventType;
 
 /**
diff --git a/clutter/clutter-event.c b/clutter/clutter-event.c
index da87ee4..1e2d251 100644
--- a/clutter/clutter-event.c
+++ b/clutter/clutter-event.c
@@ -185,6 +185,12 @@ clutter_event_get_state (const ClutterEvent *event)
     case CLUTTER_BUTTON_RELEASE:
       return event->button.modifier_state;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      return event->touch.modifier_state;
+
     case CLUTTER_MOTION:
       return event->motion.modifier_state;
 
@@ -229,6 +235,13 @@ clutter_event_set_state (ClutterEvent        *event,
       event->motion.modifier_state = state;
       break;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      event->touch.modifier_state = state;
+      break;
+
     case CLUTTER_SCROLL:
       event->scroll.modifier_state = state;
       break;
@@ -268,6 +281,7 @@ clutter_event_get_coords (const ClutterEvent *event,
     case CLUTTER_DESTROY_NOTIFY:
     case CLUTTER_CLIENT_MESSAGE:
     case CLUTTER_DELETE:
+    case CLUTTER_EVENT_LAST:
       break;
 
     case CLUTTER_ENTER:
@@ -287,6 +301,14 @@ clutter_event_get_coords (const ClutterEvent *event,
       event_y = event->motion.y;
       break;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      event_x = event->touch.x;
+      event_y = event->touch.y;
+      break;
+
     case CLUTTER_SCROLL:
       event_x = event->scroll.x;
       event_y = event->scroll.y;
@@ -326,6 +348,7 @@ clutter_event_set_coords (ClutterEvent *event,
     case CLUTTER_DESTROY_NOTIFY:
     case CLUTTER_CLIENT_MESSAGE:
     case CLUTTER_DELETE:
+    case CLUTTER_EVENT_LAST:
       break;
 
     case CLUTTER_ENTER:
@@ -345,6 +368,14 @@ clutter_event_set_coords (ClutterEvent *event,
       event->motion.y = y;
       break;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      event->touch.x = x;
+      event->touch.y = y;
+      break;
+
     case CLUTTER_SCROLL:
       event->scroll.x = x;
       event->scroll.y = y;
@@ -813,6 +844,32 @@ clutter_event_set_key_unicode (ClutterEvent *event,
 }
 
 /**
+ * clutter_event_get_event_sequence:
+ * @event: a #ClutterEvent of type %CLUTTER_TOUCH_BEGIN,
+ *   %CLUTTER_TOUCH_UPDATE, %CLUTTER_TOUCH_END, or
+ *   %CLUTTER_TOUCH_CANCEL
+ *
+ * Retrieves the #ClutterEventSequence of @event.
+ *
+ * Return value: (transfer none): the event sequence, or %NULL
+ *
+ * Since: 1.10
+ */
+ClutterEventSequence *
+clutter_event_get_event_sequence (const ClutterEvent *event)
+{
+  g_return_val_if_fail (event != NULL, NULL);
+
+  if (event->type == CLUTTER_TOUCH_BEGIN ||
+      event->type == CLUTTER_TOUCH_UPDATE ||
+      event->type == CLUTTER_TOUCH_END ||
+      event->type == CLUTTER_TOUCH_CANCEL)
+    return event->touch.sequence;
+
+  return NULL;
+}
+
+/**
  * clutter_event_get_device_id:
  * @event: a clutter event 
  *
@@ -890,6 +947,7 @@ clutter_event_set_device (ClutterEvent       *event,
     case CLUTTER_DESTROY_NOTIFY:
     case CLUTTER_CLIENT_MESSAGE:
     case CLUTTER_DELETE:
+    case CLUTTER_EVENT_LAST:
       break;
 
     case CLUTTER_ENTER:
@@ -910,6 +968,13 @@ clutter_event_set_device (ClutterEvent       *event,
       event->scroll.device = device;
       break;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      event->touch.device = device;
+      break;
+
     case CLUTTER_KEY_PRESS:
     case CLUTTER_KEY_RELEASE:
       event->key.device = device;
@@ -954,6 +1019,7 @@ clutter_event_get_device (const ClutterEvent *event)
     case CLUTTER_DESTROY_NOTIFY:
     case CLUTTER_CLIENT_MESSAGE:
     case CLUTTER_DELETE:
+    case CLUTTER_EVENT_LAST:
       break;
 
     case CLUTTER_ENTER:
@@ -974,6 +1040,13 @@ clutter_event_get_device (const ClutterEvent *event)
       device = event->scroll.device;
       break;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      device = event->touch.device;
+      break;
+
     case CLUTTER_KEY_PRESS:
     case CLUTTER_KEY_RELEASE:
       device = event->key.device;
@@ -1068,6 +1141,15 @@ clutter_event_copy (const ClutterEvent *event)
                                            sizeof (gdouble) * n_axes);
       break;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      if (event->touch.axes != NULL)
+        new_event->touch.axes = g_memdup (event->motion.axes,
+                                          sizeof (gdouble) * n_axes);
+      break;
+
     default:
       break;
     }
@@ -1108,6 +1190,13 @@ clutter_event_free (ClutterEvent *event)
           g_free (event->scroll.axes);
           break;
 
+        case CLUTTER_TOUCH_BEGIN:
+        case CLUTTER_TOUCH_UPDATE:
+        case CLUTTER_TOUCH_END:
+        case CLUTTER_TOUCH_CANCEL:
+          g_free (event->touch.axes);
+          break;
+
         default:
           break;
         }
@@ -1372,6 +1461,7 @@ clutter_event_get_axes (const ClutterEvent *event,
     case CLUTTER_LEAVE:
     case CLUTTER_KEY_PRESS:
     case CLUTTER_KEY_RELEASE:
+    case CLUTTER_EVENT_LAST:
       break;
 
     case CLUTTER_SCROLL:
@@ -1383,6 +1473,13 @@ clutter_event_get_axes (const ClutterEvent *event,
       retval = event->button.axes;
       break;
 
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_UPDATE:
+    case CLUTTER_TOUCH_END:
+    case CLUTTER_TOUCH_CANCEL:
+      retval = event->touch.axes;
+      break;
+
     case CLUTTER_MOTION:
       retval = event->motion.axes;
       break;
diff --git a/clutter/clutter-event.h b/clutter/clutter-event.h
index 208041f..cf8d1a2 100644
--- a/clutter/clutter-event.h
+++ b/clutter/clutter-event.h
@@ -113,6 +113,9 @@ typedef struct _ClutterMotionEvent      ClutterMotionEvent;
 typedef struct _ClutterScrollEvent      ClutterScrollEvent;
 typedef struct _ClutterStageStateEvent  ClutterStageStateEvent;
 typedef struct _ClutterCrossingEvent    ClutterCrossingEvent;
+typedef struct _ClutterTouchEvent       ClutterTouchEvent;
+
+typedef struct _ClutterEventSequence    ClutterEventSequence;
 
 /**
  * ClutterAnyEvent:
@@ -330,6 +333,54 @@ struct _ClutterStageStateEvent
 };
 
 /**
+ * ClutterTouchEvent:
+ * @type: event type
+ * @time: event time
+ * @flags: event flags
+ * @stage: event source stage
+ * @source: event source actor (unused)
+ * @x: the X coordinate of the pointer, relative to the stage
+ * @y: the Y coordinate of the pointer, relative to the stage
+ * @axes: @x and @y, translated to the axes of @device, or %NULL
+ * @state: (type ClutterModifierType): a bit-mask representing the state
+ *   of modifier keys (e.g. Control, Shift, and Alt) and the pointer
+ *   buttons. See #ClutterModifierType
+ * @sequence: the event sequence that this event belongs to
+ * @device: the device that originated the event
+ *
+ * Used for touch events.
+ *
+ * The @type field will be one of %CLUTTER_TOUCH_BEGIN, %CLUTTER_TOUCH_END,
+ * %CLUTTER_TOUCH_UPDATE, or %CLUTTER_TOUCH_CANCEL.
+ *
+ * Touch events are grouped into sequences; each touch sequence will begin
+ * with a %CLUTTER_TOUCH_BEGIN event, progress with %CLUTTER_TOUCH_UPDATE
+ * events, and end either with a %CLUTTER_TOUCH_END event or with a
+ * %CLUTTER_TOUCH_CANCEL event.
+ *
+ * With multi-touch capable devices there can be multiple event sequence
+ * running at the same time.
+ *
+ * Since: 1.10
+ */
+struct _ClutterTouchEvent
+{
+  ClutterEventType type;
+  guint32 time;
+  ClutterEventFlags flags;
+  ClutterStage *stage;
+  ClutterActor *source;
+
+  gfloat x;
+  gfloat y;
+  guint state;
+  ClutterEventSequence *sequence;
+  ClutterModifierType modifier_state;
+  gdouble *axes;
+  ClutterInputDevice *device;
+};
+
+/**
  * ClutterEvent:
  *
  * Generic event wrapper.
@@ -348,6 +399,7 @@ union _ClutterEvent
   ClutterScrollEvent scroll;
   ClutterStageStateEvent stage_state;
   ClutterCrossingEvent crossing;
+  ClutterTouchEvent touch;
 };
 
 GType clutter_event_get_type (void) G_GNUC_CONST;
@@ -429,6 +481,9 @@ void                    clutter_event_get_scroll_delta          (const ClutterEv
                                                                  gdouble                *dx,
                                                                  gdouble                *dy);
 
+CLUTTER_AVAILABLE_IN_1_10
+ClutterEventSequence *  clutter_event_get_event_sequence        (const ClutterEvent     *event);
+
 guint32                 clutter_keysym_to_unicode               (guint                   keyval);
 CLUTTER_AVAILABLE_IN_1_10
 guint                   clutter_unicode_to_keysym               (guint32                 wc);
diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
index 76cc3dc..a365195 100644
--- a/clutter/clutter-main.c
+++ b/clutter/clutter-main.c
@@ -2611,6 +2611,12 @@ _clutter_process_event_details (ClutterActor        *stage,
           break;
         }
 
+      case CLUTTER_TOUCH_BEGIN:
+      case CLUTTER_TOUCH_UPDATE:
+      case CLUTTER_TOUCH_END:
+      case CLUTTER_TOUCH_CANCEL:
+        break;
+
       case CLUTTER_STAGE_STATE:
         /* fullscreen / focus - forward to stage */
         event->any.source = stage;
@@ -2619,6 +2625,9 @@ _clutter_process_event_details (ClutterActor        *stage,
 
       case CLUTTER_CLIENT_MESSAGE:
         break;
+
+      case CLUTTER_EVENT_LAST:
+        break;
     }
 }
 
diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols
index f6374ea..6da9a4b 100644
--- a/clutter/clutter.symbols
+++ b/clutter/clutter.symbols
@@ -622,6 +622,7 @@ clutter_event_get_coords
 clutter_event_get_device
 clutter_event_get_device_id
 clutter_event_get_device_type
+clutter_event_get_event_sequence
 clutter_event_get_flags
 clutter_event_free
 clutter_event_get



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]