summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2015-05-22 18:30:09 +0200
committerCarlos Garnacho <carlosg@gnome.org>2015-07-10 18:12:44 +0200
commit5462e92c9c7662f377677e1b40de9379b77c91da (patch)
treeb49aaa3567a7862ccbb98d431cf411dd56eafb4f
parenta4b79e1cd33274e20c4febdd15867bfea7c21033 (diff)
downloadclutter-5462e92c9c7662f377677e1b40de9379b77c91da.tar.gz
event: Add pinch/swipe gesture event types and structs
We now have ClutterTouchpadPinchEvent and ClutterTouchpadSwipeEvent, each bringing the necessary info for the specific gesture. Each of these events is accompanied with begin/update/end/cancel event types. These events have been also made to propagate down/up the pointer position, just like scroll and button events do.
-rw-r--r--clutter/clutter-enums.h43
-rw-r--r--clutter/clutter-event.c34
-rw-r--r--clutter/clutter-event.h82
-rw-r--r--clutter/clutter-main.c2
-rw-r--r--doc/reference/clutter-sections.txt3
5 files changed, 164 insertions, 0 deletions
diff --git a/clutter/clutter-enums.h b/clutter/clutter-enums.h
index d2c89744f..a3fc1c21f 100644
--- a/clutter/clutter-enums.h
+++ b/clutter/clutter-enums.h
@@ -757,6 +757,10 @@ typedef enum { /*< flags prefix=CLUTTER_EVENT >*/
* event added in 1.10
* @CLUTTER_TOUCH_CANCEL: A touch event sequence has been canceled;
* event added in 1.10
+ * @CLUTTER_TOUCHPAD_PINCH: A pinch gesture event, the current state is
+ * determined by its phase field; event added in 1.24
+ * @CLUTTER_TOUCHPAD_SWIPE: A swipe gesture event, the current state is
+ * determined by its phase field; event added in 1.24
* @CLUTTER_EVENT_LAST: Marks the end of the #ClutterEventType enumeration;
* added in 1.10
*
@@ -782,6 +786,8 @@ typedef enum { /*< prefix=CLUTTER >*/
CLUTTER_TOUCH_UPDATE,
CLUTTER_TOUCH_END,
CLUTTER_TOUCH_CANCEL,
+ CLUTTER_TOUCHPAD_PINCH,
+ CLUTTER_TOUCHPAD_SWIPE,
CLUTTER_EVENT_LAST /* helper */
} ClutterEventType;
@@ -1402,6 +1408,43 @@ typedef enum {
CLUTTER_GESTURE_TRIGGER_EDGE_BEFORE
} ClutterGestureTriggerEdge;
+/**
+ * ClutterTouchpadGesturePhase:
+ * @CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN: The gesture has begun.
+ * @CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE: The gesture has been updated.
+ * @CLUTTER_TOUCHPAD_GESTURE_PHASE_END: The gesture was finished, changes
+ * should be permanently applied.
+ * @CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL: The gesture was cancelled, all
+ * changes should be undone.
+ *
+ * The phase of a touchpad gesture event. All gestures are guaranteed to
+ * begin with an event of type %CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN,
+ * followed by a number of %CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE (possibly 0).
+ *
+ * A finished gesture may have 2 possible outcomes, an event with phase
+ * %CLUTTER_TOUCHPAD_GESTURE_PHASE_END will be emitted when the gesture is
+ * considered successful, this should be used as the hint to perform any
+ * permanent changes.
+
+ * Cancelled gestures may be so for a variety of reasons, due to hardware,
+ * or due to the gesture recognition layers hinting the gesture did not
+ * finish resolutely (eg. a 3rd finger being added during a pinch gesture).
+ * In these cases, the last event with report the phase
+ * %CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL, this should be used as a hint
+ * to undo any visible/permanent changes that were done throughout the
+ * progress of the gesture.
+ *
+ * See also #ClutterTouchpadPinchEvent and #ClutterTouchpadPinchEvent.
+ *
+ * Since: 1.24
+ */
+typedef enum {
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN,
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_END,
+ CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL
+} ClutterTouchpadGesturePhase;
+
G_END_DECLS
#endif /* __CLUTTER_ENUMS_H__ */
diff --git a/clutter/clutter-event.c b/clutter/clutter-event.c
index 26d561153..3170b9d4c 100644
--- a/clutter/clutter-event.c
+++ b/clutter/clutter-event.c
@@ -436,6 +436,16 @@ clutter_event_get_position (const ClutterEvent *event,
case CLUTTER_SCROLL:
clutter_point_init (position, event->scroll.x, event->scroll.y);
break;
+
+ case CLUTTER_TOUCHPAD_PINCH:
+ clutter_point_init (position, event->touchpad_pinch.x,
+ event->touchpad_pinch.y);
+ break;
+
+ case CLUTTER_TOUCHPAD_SWIPE:
+ clutter_point_init (position, event->touchpad_swipe.x,
+ event->touchpad_swipe.y);
+ break;
}
}
@@ -498,6 +508,16 @@ clutter_event_set_coords (ClutterEvent *event,
event->scroll.x = x;
event->scroll.y = y;
break;
+
+ case CLUTTER_TOUCHPAD_PINCH:
+ event->touchpad_pinch.x = x;
+ event->touchpad_pinch.y = y;
+ break;
+
+ case CLUTTER_TOUCHPAD_SWIPE:
+ event->touchpad_swipe.x = x;
+ event->touchpad_swipe.y = y;
+ break;
}
}
@@ -1097,6 +1117,11 @@ clutter_event_set_device (ClutterEvent *event,
case CLUTTER_KEY_RELEASE:
event->key.device = device;
break;
+
+ case CLUTTER_TOUCHPAD_PINCH:
+ case CLUTTER_TOUCHPAD_SWIPE:
+ /* Rely on priv data for these */
+ break;
}
}
@@ -1171,6 +1196,11 @@ clutter_event_get_device (const ClutterEvent *event)
case CLUTTER_KEY_RELEASE:
device = event->key.device;
break;
+
+ case CLUTTER_TOUCHPAD_PINCH:
+ case CLUTTER_TOUCHPAD_SWIPE:
+ /* Rely on priv data for these */
+ break;
}
return device;
@@ -1608,6 +1638,10 @@ clutter_event_get_axes (const ClutterEvent *event,
case CLUTTER_MOTION:
retval = event->motion.axes;
break;
+
+ case CLUTTER_TOUCHPAD_PINCH:
+ case CLUTTER_TOUCHPAD_SWIPE:
+ break;
}
if (retval != NULL)
diff --git a/clutter/clutter-event.h b/clutter/clutter-event.h
index 5df8dff9b..e33b5c850 100644
--- a/clutter/clutter-event.h
+++ b/clutter/clutter-event.h
@@ -115,6 +115,8 @@ typedef struct _ClutterScrollEvent ClutterScrollEvent;
typedef struct _ClutterStageStateEvent ClutterStageStateEvent;
typedef struct _ClutterCrossingEvent ClutterCrossingEvent;
typedef struct _ClutterTouchEvent ClutterTouchEvent;
+typedef struct _ClutterTouchpadPinchEvent ClutterTouchpadPinchEvent;
+typedef struct _ClutterTouchpadSwipeEvent ClutterTouchpadSwipeEvent;
/**
* ClutterAnyEvent:
@@ -385,6 +387,84 @@ struct _ClutterTouchEvent
};
/**
+ * ClutterTouchpadPinchEvent:
+ * @type: event type
+ * @time: event time
+ * @flags: event flags
+ * @stage: event source stage
+ * @source: event source actor (unused)
+ * @phase: the current phase of the gesture
+ * @x: the X coordinate of the pointer, relative to the stage
+ * @y: the Y coordinate of the pointer, relative to the stage
+ * @dx: movement delta of the pinch focal point in the X axis
+ * @dy: movement delta of the pinch focal point in the Y axis
+ * @angle_delta: angle delta in degrees, clockwise rotations are
+ * represented by positive deltas
+ * @scale: the current scale
+ *
+ * Used for touchpad pinch gesture events. The current state of the
+ * gesture will be determined by the @phase field.
+ *
+ * Each event with phase %CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN
+ * will report a @scale of 1.0, all later phases in the gesture
+ * report the current scale relative to the initial 1.0 value
+ * (eg. 0.5 being half the size, 2.0 twice as big).
+ *
+ * Since: 1.24
+ */
+struct _ClutterTouchpadPinchEvent
+{
+ ClutterEventType type;
+ guint32 time;
+ ClutterEventFlags flags;
+ ClutterStage *stage;
+ ClutterActor *source;
+
+ ClutterTouchpadGesturePhase phase;
+ gfloat x;
+ gfloat y;
+ gfloat dx;
+ gfloat dy;
+ gfloat angle_delta;
+ gfloat scale;
+};
+
+/**
+ * ClutterTouchpadSwipeEvent
+ * @type: event type
+ * @time: event time
+ * @flags: event flags
+ * @stage: event source stage
+ * @source: event source actor (unused)
+ * @phase: the current phase of the gesture
+ * @n_fingers: the number of fingers triggering the swipe
+ * @x: the X coordinate of the pointer, relative to the stage
+ * @y: the Y coordinate of the pointer, relative to the stage
+ * @dx: movement delta of the pinch focal point in the X axis
+ * @dy: movement delta of the pinch focal point in the Y axis
+ *
+ * Used for touchpad swipe gesture events. The current state of the
+ * gesture will be determined by the @phase field.
+ *
+ * Since: 1.24
+ */
+struct _ClutterTouchpadSwipeEvent
+{
+ ClutterEventType type;
+ guint32 time;
+ ClutterEventFlags flags;
+ ClutterStage *stage;
+ ClutterActor *source;
+
+ ClutterTouchpadGesturePhase phase;
+ guint n_fingers;
+ gfloat x;
+ gfloat y;
+ gfloat dx;
+ gfloat dy;
+};
+
+/**
* ClutterEvent:
*
* Generic event wrapper.
@@ -404,6 +484,8 @@ union _ClutterEvent
ClutterStageStateEvent stage_state;
ClutterCrossingEvent crossing;
ClutterTouchEvent touch;
+ ClutterTouchpadPinchEvent touchpad_pinch;
+ ClutterTouchpadSwipeEvent touchpad_swipe;
};
/**
diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
index 5fc12c93d..3d2130c68 100644
--- a/clutter/clutter-main.c
+++ b/clutter/clutter-main.c
@@ -2290,6 +2290,8 @@ _clutter_process_event_details (ClutterActor *stage,
case CLUTTER_BUTTON_PRESS:
case CLUTTER_BUTTON_RELEASE:
case CLUTTER_SCROLL:
+ case CLUTTER_TOUCHPAD_PINCH:
+ case CLUTTER_TOUCHPAD_SWIPE:
{
ClutterActor *actor;
gfloat x, y;
diff --git a/doc/reference/clutter-sections.txt b/doc/reference/clutter-sections.txt
index 3880923c8..ccca66b5b 100644
--- a/doc/reference/clutter-sections.txt
+++ b/doc/reference/clutter-sections.txt
@@ -1105,6 +1105,9 @@ ClutterStageStateEvent
ClutterCrossingEvent
ClutterTouchEvent
ClutterEventSequence
+ClutterTouchpadPinchEvent
+ClutterTouchpadSwipeEvent
+ClutterTouchpadGesturePhase
clutter_event_new
clutter_event_copy
clutter_event_free