[gtk+] Respect grab event mask for crossing events



commit 0ecd87fb78dfc6ef299971472f675402f737c19c
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Sep 15 14:39:04 2009 +0200

    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 files changed, 13 insertions(+), 7 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 4194993..500bf65 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_;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]