gtk: Check implicit grab status before sending crossing events

As we now refrain from sending the crossing events if there's an
implicit grab, those events must be sent on button release when
the implicit grab is broken.
This commit is contained in:
Carlos Garnacho 2017-05-25 01:57:22 +02:00
parent f5fde52d61
commit 0d7fe2ec09
3 changed files with 27 additions and 3 deletions

View File

@ -1507,9 +1507,13 @@ handle_pointing_event (GdkEvent *event)
old_target = update_pointer_focus_state (toplevel, event, target);
if (event->type == GDK_MOTION_NOTIFY || event->type == GDK_ENTER_NOTIFY)
{
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)
{
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:

View File

@ -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,

View File

@ -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,