From 0ecd87fb78dfc6ef299971472f675402f737c19c Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 15 Sep 2009 14:39:04 +0200 Subject: [PATCH] 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. --- gdk/gdkwindow.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 4194993d7c..500bf6524d 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -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_;