summaryrefslogtreecommitdiff
path: root/gtk/gtkgesture.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2014-09-29 15:35:20 +0200
committerCarlos Garnacho <carlosg@gnome.org>2014-09-29 16:20:54 +0200
commit3985d69735d74c66522054e1ded1fd3473d862f8 (patch)
treed94b54081aebe0ba1cf4f05af8c45afad921daad /gtk/gtkgesture.c
parent30149dabcf21693c2a29c5c3d669b4a006062e1e (diff)
downloadgtk+-3985d69735d74c66522054e1ded1fd3473d862f8.tar.gz
gesture: Document pitfalls on foreign gesture state changes
Add some docs/example about the possible event handling ordering issues that may appear on GtkGesture::begin between multiple gesture groups. Mostly relevant for state changes.
Diffstat (limited to 'gtk/gtkgesture.c')
-rw-r--r--gtk/gtkgesture.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/gtk/gtkgesture.c b/gtk/gtkgesture.c
index fb913aa260..cfdd3d0699 100644
--- a/gtk/gtkgesture.c
+++ b/gtk/gtkgesture.c
@@ -904,6 +904,37 @@ gtk_gesture_get_sequence_state (GtkGesture *gesture,
* * None → Claimed
* * None → Claimed → Denied
*
+ * Note: Due to event handling ordering, it may be unsafe to
+ * set the state on another gesture within a #GtkGesture::begin
+ * signal handler, as the callback might be executed before
+ * the other gesture knows about the sequence. A safe way to
+ * perform this could be:
+ *
+ * |[
+ * static void
+ * first_gesture_begin_cb (GtkGesture *first_gesture,
+ * GdkEventSequence *sequence,
+ * gpointer user_data)
+ * {
+ * gtk_gesture_set_sequence_state (first_gesture, sequence, GTK_EVENT_SEQUENCE_ACCEPTED);
+ * gtk_gesture_set_sequence_state (second_gesture, sequence, GTK_EVENT_SEQUENCE_DENIED);
+ * }
+ *
+ * static void
+ * second_gesture_begin_cb (GtkGesture *second_gesture,
+ * GdkEventSequence *sequence,
+ * gpointer user_data)
+ * {
+ * if (gtk_gesture_get_sequence_state (first_gesture, sequence) == GTK_EVENT_SEQUENCE_ACCEPTED)
+ * gtk_gesture_set_sequence_state (second_gesture, sequence, GTK_EVENT_SEQUENCE_DENIED);
+ * }
+ * ]|
+ *
+ * If both gestures are in the same group, just set the state on
+ * the gesture emitting the event, the sequence will be already
+ * be initialized to the group's global state when the second
+ * gesture processes the event.
+ *
* Returns: %TRUE if @sequence is handled by @gesture,
* and the state is changed successfully
*