From ebd1840802a11f1f0b668064f4ba3c014c47c045 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 21 Oct 2019 17:09:17 +0200 Subject: [PATCH 1/2] scrollcontroller: Set scroll event mask on scroll controller This ensures adding the controller to a widget will end up with the expected event masks in the widget default window. --- gtk/gtkeventcontrollerscroll.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtk/gtkeventcontrollerscroll.c b/gtk/gtkeventcontrollerscroll.c index 91831f404f..9e90b54dd7 100644 --- a/gtk/gtkeventcontrollerscroll.c +++ b/gtk/gtkeventcontrollerscroll.c @@ -455,6 +455,9 @@ gtk_event_controller_scroll_init (GtkEventControllerScroll *scroll) { scroll->scroll_history = g_array_new (FALSE, FALSE, sizeof (ScrollHistoryElem)); + gtk_event_controller_set_event_mask (GTK_EVENT_CONTROLLER (scroll), + GDK_SCROLL_MASK | + GDK_SMOOTH_SCROLL_MASK); } /** From c9a1adf2ccf7df5211b3c768f1361de1942e1a7b Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 21 Oct 2019 17:10:30 +0200 Subject: [PATCH 2/2] gtkwidget: Forward unhandled scroll events through controllers Do just like button/motion/touch do, let the scroll events go first through the event handler, and fallback on the current event controllers afterwards. Fixes handling of bubbled scroll events in the scroll controller. --- gtk/gtkwidget.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 2848d757b5..65b168eb47 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -673,6 +673,8 @@ static gboolean _gtk_widget_run_controllers (GtkWidget *widget, static void gtk_widget_dispatch_child_properties_changed (GtkWidget *object, guint n_pspecs, GParamSpec **pspecs); +static gboolean gtk_widget_real_scroll_event (GtkWidget *widget, + GdkEventScroll *event); static gboolean gtk_widget_real_button_event (GtkWidget *widget, GdkEventButton *event); static gboolean gtk_widget_real_motion_event (GtkWidget *widget, @@ -1061,6 +1063,7 @@ gtk_widget_class_init (GtkWidgetClass *klass) klass->move_focus = gtk_widget_real_move_focus; klass->keynav_failed = gtk_widget_real_keynav_failed; klass->event = NULL; + klass->scroll_event = gtk_widget_real_scroll_event; klass->button_press_event = gtk_widget_real_button_event; klass->button_release_event = gtk_widget_real_button_event; klass->motion_notify_event = gtk_widget_real_motion_event; @@ -7186,6 +7189,14 @@ gtk_widget_draw (GtkWidget *widget, cairo_restore (cr); } +static gboolean +gtk_widget_real_scroll_event (GtkWidget *widget, + GdkEventScroll *event) +{ + return _gtk_widget_run_controllers (widget, (GdkEvent *) event, + GTK_PHASE_BUBBLE); +} + static gboolean gtk_widget_real_button_event (GtkWidget *widget, GdkEventButton *event)