[gtk/wip/carlosg/sequence-accepted-in-group] gtkgesture: Apply gesture group state after setting up sequence




commit 53df32e6cf1e2a7cbec8dd8d3b3acd4ddae2b9bf
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon May 17 23:34:44 2021 +0200

    gtkgesture: Apply gesture group state after setting up sequence
    
    When a new sequence is added to a GtkGesture, its state is looked
    in other gestures in the same group, and made to match in this
    gesture. This however happened a bit too early, before the
    gesture touchpoint was fully set up. As this may result in signal
    emission and whatnot, it's a good idea to make it happen with a
    fully set up touchpoint.
    
    Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3946

 gtk/gtkgesture.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtkgesture.c b/gtk/gtkgesture.c
index c345eb98e5..ea1b5b8cf8 100644
--- a/gtk/gtkgesture.c
+++ b/gtk/gtkgesture.c
@@ -477,8 +477,6 @@ _gtk_gesture_update_point (GtkGesture     *gesture,
                                           NULL, (gpointer *) &data);
   if (!existed)
     {
-      GtkEventSequenceState group_state;
-
       if (!add)
         return FALSE;
 
@@ -490,9 +488,6 @@ _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)
@@ -504,13 +499,24 @@ _gtk_gesture_update_point (GtkGesture     *gesture,
   data->widget_x = x + data->accum_dx;
   data->widget_y = y + data->accum_dy;
 
-  /* Deny the sequence right away if the expected
-   * number of points is exceeded, so this sequence
-   * can be tracked with gtk_gesture_handles_sequence().
-   */
-  if (!existed && _gtk_gesture_get_n_physical_points (gesture, FALSE) > priv->n_points)
-    gtk_gesture_set_sequence_state (gesture, sequence,
-                                    GTK_EVENT_SEQUENCE_DENIED);
+  if (!existed)
+    {
+      GtkEventSequenceState state;
+
+      /* Deny the sequence right away if the expected
+       * number of points is exceeded, so this sequence
+       * can be tracked with gtk_gesture_handles_sequence().
+       *
+       * Otherwise, make the sequence inherit the same state
+       * from other gestures in the same group.
+       */
+      if (_gtk_gesture_get_n_physical_points (gesture, FALSE) > priv->n_points)
+        state = GTK_EVENT_SEQUENCE_DENIED;
+      else
+        state = gtk_gesture_get_group_state (gesture, sequence);
+
+      gtk_gesture_set_sequence_state (gesture, sequence, state);
+    }
 
   return TRUE;
 }


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