diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index c484b49f24..c5f601d843 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1508,8 +1508,12 @@ handle_pointing_event (GdkEvent *event) if (event->type == GDK_MOTION_NOTIFY || event->type == GDK_ENTER_NOTIFY) { - gtk_synthesize_crossing_events (toplevel, old_target, target, - event, GDK_CROSSING_NORMAL); + if (!gtk_window_lookup_pointer_focus_implicit_grab (toplevel, device, + sequence)) + { + gtk_synthesize_crossing_events (toplevel, old_target, target, + event, GDK_CROSSING_NORMAL); + } gtk_window_maybe_update_cursor (toplevel, NULL, device); } @@ -1532,7 +1536,13 @@ handle_pointing_event (GdkEvent *event) target : NULL); if (event->type == GDK_BUTTON_RELEASE) - gtk_window_maybe_update_cursor (toplevel, NULL, device); + { + old_target = target; + target = _gtk_toplevel_pick (toplevel, x, y, NULL, NULL); + gtk_synthesize_crossing_events (toplevel, old_target, target, event, + GDK_CROSSING_UNGRAB); + gtk_window_maybe_update_cursor (toplevel, NULL, device); + } break; case GDK_SCROLL: case GDK_TOUCHPAD_PINCH: diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 1f7e3d84d3..03046731cb 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -11327,6 +11327,17 @@ gtk_window_lookup_effective_pointer_focus_widget (GtkWindow *window, return focus ? gtk_pointer_focus_get_effective_target (focus) : NULL; } +GtkWidget * +gtk_window_lookup_pointer_focus_implicit_grab (GtkWindow *window, + GdkDevice *device, + GdkEventSequence *sequence) +{ + GtkPointerFocus *focus; + + focus = gtk_window_lookup_pointer_focus (window, device, sequence); + return focus ? gtk_pointer_focus_get_implicit_grab (focus) : NULL; +} + void gtk_window_update_pointer_focus (GtkWindow *window, GdkDevice *device, diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h index 1d97de7a1a..94b5aee958 100644 --- a/gtk/gtkwindowprivate.h +++ b/gtk/gtkwindowprivate.h @@ -146,6 +146,9 @@ GtkWidget * gtk_window_lookup_pointer_focus_widget (GtkWindow *windo GtkWidget * gtk_window_lookup_effective_pointer_focus_widget (GtkWindow *window, GdkDevice *device, GdkEventSequence *sequence); +GtkWidget * gtk_window_lookup_pointer_focus_implicit_grab (GtkWindow *window, + GdkDevice *device, + GdkEventSequence *sequence); void gtk_window_update_pointer_focus (GtkWindow *window, GdkDevice *device,