From 69624449254cc38c9bacb81e7caba4d54bd180d2 Mon Sep 17 00:00:00 2001 From: Arecsu Date: Sun, 9 Aug 2026 20:10:08 -0300 Subject: [PATCH] gtk4-prep: restore motion events to widgets with motion controllers The GTK3 bridge for GtkEventControllerMotion only added the enter/leave event masks to the widget, not the pointer-motion mask. GTK3 event controllers don't request input events from GDK themselves (the motion controller's event mask is 0), so widgets with a motion controller never received motion events over event-box-based child widgets -- e.g. the thumbnail hover handlers, which re-show the block overlay after its timeout, so the culling overlay did not reappear on mouse move (fixes #21782). Restore the pointer-motion mask as 5.6 did. The other controller helpers were audited: scroll controllers request their own mask, and click/drag gestures land on drawing-area/event-box widgets that request button events by default. Related: #21782 #15920 #20433 --- src/gui/gtk.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gui/gtk.c b/src/gui/gtk.c index e302eb1555c..cbb13e1334b 100644 --- a/src/gui/gtk.c +++ b/src/gui/gtk.c @@ -4911,7 +4911,19 @@ GtkEventController *(dt_gui_connect_motion)(GtkWidget *widget, dt_gui_add_controller(widget, controller); // GTK4 gtk_widget_add_controller(widget, GTK_EVENT_CONTROLLER(controller)); - gtk_widget_add_events(widget, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); // still needed for now by _main_do_event_keymap + /* GTK3: event controllers don't request input events from GDK -- the + * motion controller's event mask is 0 -- so the widget must keep its own + * event mask or it never receives enter/leave/motion events at all. The + * pointer-motion mask is what makes the "motion" signal fire: without + * it, motion over a child window goes to the parent layout instead and + * hover-triggered updates (e.g. the thumbnail block overlays re-showing + * after their timeout) stop working (see #21782). + * The enter/leave masks are also still needed by _main_do_event_keymap. + * GTK4 migration: delete this call -- GTK4 delivers all input events + * to every widget automatically. */ + gtk_widget_add_events(widget, + GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK + | GDK_POINTER_MOTION_MASK); if(motion) g_signal_connect(controller, "motion", G_CALLBACK(motion), data); if(enter) g_signal_connect(controller, "enter", G_CALLBACK(enter), data);