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
This commit is contained in:
Carlos Garnacho 2022-08-09 18:49:35 +02:00
parent 25c3616a79
commit 54465adff2
3 changed files with 16 additions and 2 deletions

View File

@ -1110,7 +1110,7 @@ translate_coordinates (double event_x,
return TRUE; return TRUE;
} }
static void void
gtk_synthesize_crossing_events (GtkRoot *toplevel, gtk_synthesize_crossing_events (GtkRoot *toplevel,
GtkCrossingType crossing_type, GtkCrossingType crossing_type,
GtkWidget *old_target, GtkWidget *old_target,

View File

@ -152,6 +152,15 @@ char * _gtk_elide_underscores (const char *original);
void setlocale_initialization (void); 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 G_END_DECLS
#endif /* __GTK_PRIVATE_H__ */ #endif /* __GTK_PRIVATE_H__ */

View File

@ -6462,7 +6462,12 @@ gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
old_target = g_object_ref (focus->target); old_target = g_object_ref (focus->target);
gtk_pointer_focus_repick_target (focus); 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); g_object_unref (old_target);
} }