From: Carlos Garnacho Date: Tue, 9 Aug 2022 16:49:35 +0000 (+0200) Subject: gtkwindow: Use pointer-oriented function to deal with crossing events X-Git-Tag: archive/raspbian/4.8.3+ds-2+rpi1~3^2~20^2~4^2~7^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=54465adff23c5155ed52580beabf50b2a03dff22;p=gtk4.git gtkwindow: Use pointer-oriented function to deal with crossing events Commit adba0b97 fixed missed pointer crossings by using a helper function that was already present and looked like did everything that was needed. However this function was oriented to keyboard focus and it also did update the related widget state. Doing these changes on pointer-based crossing was misuse, and could cause weird interactions with keyboard focus management. Fix this by using gtkmain.c gtk_synthesize_crossing_event() that is in fact oriented to pointers. Fixes: adba0b97 (gtkwindow: Synthesize pointer crossing events on state changes) Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/5094 --- diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index f17fb095f5..726ee2e9ac 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1110,7 +1110,7 @@ translate_coordinates (double event_x, return TRUE; } -static void +void gtk_synthesize_crossing_events (GtkRoot *toplevel, GtkCrossingType crossing_type, GtkWidget *old_target, diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h index 3495e07efc..7869347cad 100644 --- a/gtk/gtkprivate.h +++ b/gtk/gtkprivate.h @@ -152,6 +152,15 @@ char * _gtk_elide_underscores (const char *original); void setlocale_initialization (void); +void gtk_synthesize_crossing_events (GtkRoot *toplevel, + GtkCrossingType crossing_type, + GtkWidget *old_target, + GtkWidget *new_target, + double surface_x, + double surface_y, + GdkCrossingMode mode, + GdkDrop *drop); + G_END_DECLS #endif /* __GTK_PRIVATE_H__ */ diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 7d7c4a312b..6fcdcf23cf 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -6462,7 +6462,12 @@ gtk_window_update_pointer_focus_on_state_change (GtkWindow *window, old_target = g_object_ref (focus->target); gtk_pointer_focus_repick_target (focus); - synthesize_focus_change_events (window, old_target, focus->target, GTK_CROSSING_POINTER); + gtk_synthesize_crossing_events (GTK_ROOT (window), + GTK_CROSSING_POINTER, + old_target, focus->target, + focus->x, focus->y, + GDK_CROSSING_NORMAL, + NULL); g_object_unref (old_target); }