From e71a817fff286c93b29a8cc59fa5c4bf2ff13fb4 Mon Sep 17 00:00:00 2001 From: Sergio Costas Date: Sat, 4 Jan 2025 12:15:40 +0100 Subject: [PATCH] gtk3: Fix enter and leave signals in EventControllerMotion The Gtk.EventMotionController implementation in Gtk3 doesn't emit the enter or leave signals when the mouse cursor enters or leaves the associated widget. After doing several tests, I discovered that the gtk_event_controller_handle_event() method never receives any of the events from the Gtk core, although they are generated inside the core and enter-notify-event and leave-notify-event signals are correctly emited. This patch fixes it by adding the missing gtk_widget_real_XXXXX_event handlers for enter and leave event notifications. Fix #7225 --- gtk/gtkwidget.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 23401a44e8..a565e58b7d 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -683,6 +683,8 @@ static gboolean gtk_widget_real_button_event (GtkWidget GdkEventButton *event); static gboolean gtk_widget_real_motion_event (GtkWidget *widget, GdkEventMotion *event); +static gboolean gtk_widget_real_crossing_event (GtkWidget *widget, + GdkEventCrossing *event); static gboolean gtk_widget_real_key_press_event (GtkWidget *widget, GdkEventKey *event); static gboolean gtk_widget_real_key_release_event (GtkWidget *widget, @@ -1076,8 +1078,8 @@ gtk_widget_class_init (GtkWidgetClass *klass) klass->destroy_event = NULL; klass->key_press_event = gtk_widget_real_key_press_event; klass->key_release_event = gtk_widget_real_key_release_event; - klass->enter_notify_event = NULL; - klass->leave_notify_event = NULL; + klass->enter_notify_event = gtk_widget_real_crossing_event; + klass->leave_notify_event = gtk_widget_real_crossing_event; klass->configure_event = NULL; klass->focus_in_event = gtk_widget_real_focus_in_event; klass->focus_out_event = gtk_widget_real_focus_out_event; @@ -7217,6 +7219,14 @@ gtk_widget_real_motion_event (GtkWidget *widget, GTK_PHASE_BUBBLE); } +static gboolean +gtk_widget_real_crossing_event (GtkWidget *widget, + GdkEventCrossing *event) +{ + return _gtk_widget_run_controllers (widget, (GdkEvent *) event, + GTK_PHASE_BUBBLE); +} + static gboolean gtk_widget_real_key_press_event (GtkWidget *widget, GdkEventKey *event)