[gtk+] gesture: Ensure late gestures handling the sequence get the group state



commit c773859c997bd89dafa1a57d3ba9d819ae0d5ca5
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jun 1 21:44:55 2014 +0200

    gesture: Ensure late gestures handling the sequence get the group state
    
    It might happen that a gesture claims a sequence before any other gesture
    in its group even handled a single event from that sequence. In that case,
    ensure the state is set accordingly right when the sequence is handled in
    those.
    
    The "group" gesture testcase has been updated to observe this behavior.

 gtk/gtkgesture.c         |   30 ++++++++++++++++++++++++++++++
 testsuite/gtk/gestures.c |    2 +-
 2 files changed, 31 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkgesture.c b/gtk/gtkgesture.c
index 5ba3fe9..c752629 100644
--- a/gtk/gtkgesture.c
+++ b/gtk/gtkgesture.c
@@ -158,6 +158,8 @@ static guint signals[N_SIGNALS] = { 0 };
 
 #define BUTTONS_MASK (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)
 
+GList * _gtk_gesture_get_group_link (GtkGesture *gesture);
+
 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkGesture, gtk_gesture, GTK_TYPE_EVENT_CONTROLLER)
 
 static void
@@ -369,6 +371,29 @@ _update_widget_coordinates (GtkGesture *gesture,
   data->widget_y = y;
 }
 
+static GtkEventSequenceState
+gtk_gesture_get_group_state (GtkGesture       *gesture,
+                             GdkEventSequence *sequence)
+{
+  GtkEventSequenceState state = GTK_EVENT_SEQUENCE_NONE;
+  GList *group_elem;
+
+  group_elem = g_list_first (_gtk_gesture_get_group_link (gesture));
+
+  for (; group_elem; group_elem = group_elem->next)
+    {
+      if (group_elem->data == gesture)
+        continue;
+      if (!gtk_gesture_handles_sequence (group_elem->data, sequence))
+        continue;
+
+      state = gtk_gesture_get_sequence_state (group_elem->data, sequence);
+      break;
+    }
+
+  return state;
+}
+
 static gboolean
 _gtk_gesture_update_point (GtkGesture     *gesture,
                            const GdkEvent *event,
@@ -416,6 +441,8 @@ _gtk_gesture_update_point (GtkGesture     *gesture,
                                           NULL, (gpointer *) &data);
   if (!existed)
     {
+      GtkEventSequenceState group_state;
+
       if (!add)
         return FALSE;
 
@@ -427,6 +454,9 @@ _gtk_gesture_update_point (GtkGesture     *gesture,
 
       data = g_new0 (PointData, 1);
       g_hash_table_insert (priv->points, sequence, data);
+
+      group_state = gtk_gesture_get_group_state (gesture, sequence);
+      gtk_gesture_set_sequence_state (gesture, sequence, group_state);
     }
 
   if (data->event)
diff --git a/testsuite/gtk/gestures.c b/testsuite/gtk/gestures.c
index e946ef2..0bf3d02 100644
--- a/testsuite/gtk/gestures.c
+++ b/testsuite/gtk/gestures.c
@@ -497,8 +497,8 @@ test_group (void)
                    "b1 state denied, "
                    "a1 state denied, "
                    "c3 state claimed, "
+                   "c2 state claimed, "
                    "target c2");
-  /* FIXME: why no "c2 state claimed" ? */
 
   g_string_free (str, TRUE);
 


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