[gtk/wip/carlosg/for-master: 2/5] gtkscrolledwindow: Do not eagerly claim touch press event




commit 7d5accc69f713c6df4255fff803e37ef34d232d0
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Sep 25 17:47:26 2020 +0200

    gtkscrolledwindow: Do not eagerly claim touch press event
    
    Claiming early makes the contents unable to react to the touch press
    event. Do this on GtkGestureDrag::update past a threshold, so the
    child widget(s) can claim before the scrolledwindow does.
    
    Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3125

 gtk/gtkscrolledwindow.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
---
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 7b38c36812..23196edb94 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -29,6 +29,7 @@
 #include "gtkadjustment.h"
 #include "gtkadjustmentprivate.h"
 #include "gtkbuildable.h"
+#include "gtkdragsource.h"
 #include "gtkeventcontrollermotion.h"
 #include "gtkeventcontrollerscroll.h"
 #include "gtkeventcontrollerprivate.h"
@@ -901,7 +902,6 @@ scrolled_window_drag_begin_cb (GtkScrolledWindow *scrolled_window,
                                GtkGesture        *gesture)
 {
   GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
-  GtkEventSequenceState state;
   GdkEventSequence *sequence;
   GtkWidget *event_widget;
 
@@ -914,11 +914,7 @@ scrolled_window_drag_begin_cb (GtkScrolledWindow *scrolled_window,
 
   if (event_widget == priv->vscrollbar || event_widget == priv->hscrollbar ||
       (!may_hscroll (scrolled_window) && !may_vscroll (scrolled_window)))
-    state = GTK_EVENT_SEQUENCE_DENIED;
-  else
-    state = GTK_EVENT_SEQUENCE_CLAIMED;
-
-  gtk_gesture_set_sequence_state (gesture, sequence, state);
+    gtk_gesture_set_sequence_state (gesture, sequence, GTK_EVENT_SEQUENCE_DENIED);
 }
 
 static void
@@ -950,7 +946,12 @@ scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
   GtkAdjustment *vadjustment;
   double dx, dy;
 
+  if (!gtk_drag_check_threshold (GTK_WIDGET (scrolled_window),
+                                 0, 0, offset_x, offset_y))
+    return;
+
   gtk_scrolled_window_invalidate_overshoot (scrolled_window);
+  gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
 
   hadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar));
   if (hadjustment && may_hscroll (scrolled_window))


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