Respect grab event mask for crossing events

In the case of a non-owner_events grab, use grab->event_mask rather
than the window even mask to decide whether to deliver the event
or not.
This commit is contained in:
Alexander Larsson 2009-09-15 14:39:04 +02:00
parent 142d59904b
commit 0ecd87fb78

View File

@ -9234,21 +9234,27 @@ send_crossing_event (GdkDisplay *display,
gulong serial)
{
GdkEvent *event;
guint32 event_mask;
guint32 window_event_mask, type_event_mask;
GdkPointerGrabInfo *grab;
GdkWindowImplIface *impl_iface;
grab = _gdk_display_has_pointer_grab (display, serial);
if (grab != NULL &&
!grab->owner_events &&
(GdkWindow *)window != grab->window)
return;
!grab->owner_events)
{
/* !owner_event => only report events wrt grab window, ignore rest */
if ((GdkWindow *)window != grab->window)
return;
window_event_mask = grab->event_mask;
}
else
window_event_mask = window->event_mask;
if (type == GDK_LEAVE_NOTIFY)
event_mask = GDK_LEAVE_NOTIFY_MASK;
type_event_mask = GDK_LEAVE_NOTIFY_MASK;
else
event_mask = GDK_ENTER_NOTIFY_MASK;
type_event_mask = GDK_ENTER_NOTIFY_MASK;
if (window->extension_events != 0)
{
@ -9257,7 +9263,7 @@ send_crossing_event (GdkDisplay *display,
type == GDK_ENTER_NOTIFY);
}
if (window->event_mask & event_mask)
if (window_event_mask & type_event_mask)
{
event = _gdk_make_event ((GdkWindow *)window, type, event_in_queue, TRUE);
event->crossing.time = time_;