scrolledwindow: Stop kinetic scrolling on begin
authorJosé Expósito <jose.exposito89@gmail.com>
Wed, 23 Jun 2021 06:09:35 +0000 (08:09 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Wed, 26 Jan 2022 21:49:53 +0000 (22:49 +0100)
Stop kinetic scrolling when a scroll begin signal is sent during the
event capture phase.

Part-of: <!3454>

gtk/gtkscrolledwindow.c

index 372afe4a957404c5024cae724f9207487848672c..49be97080c37c04723bfb905207a0126bdd9359b 100644 (file)
@@ -1350,6 +1350,19 @@ scroll_controller_scroll_begin (GtkEventControllerScroll *scroll,
   priv->smooth_scroll = TRUE;
 }
 
+static void
+stop_kinetic_scrolling_cb (GtkEventControllerScroll *scroll,
+                           GtkScrolledWindow        *scrolled_window)
+{
+  GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
+
+  if (priv->hscrolling)
+    gtk_kinetic_scrolling_stop (priv->hscrolling);
+
+  if (priv->vscrolling)
+    gtk_kinetic_scrolling_stop (priv->vscrolling);
+}
+
 static void
 scrolled_window_scroll (GtkScrolledWindow        *scrolled_window,
                         double                    delta_x,
@@ -2115,6 +2128,8 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
   controller = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES |
                                                 GTK_EVENT_CONTROLLER_SCROLL_KINETIC);
   gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
+  g_signal_connect (controller, "scroll-begin",
+                    G_CALLBACK (stop_kinetic_scrolling_cb), scrolled_window);
   g_signal_connect (controller, "scroll",
                     G_CALLBACK (captured_scroll_cb), scrolled_window);
   g_signal_connect (controller, "decelerate",