[gtk+/xi2: 1202/1239] GdkWindow: Block slave devices' events if window has not selected them.



commit 457dcfadb2c1e264c95edf878d5eac01a37c91b1
Author: Carlos Garnacho <carlos gnome org>
Date:   Sun Sep 20 16:57:40 2009 +0200

    GdkWindow: Block slave devices' events if window has not selected them.

 gdk/gdkwindow.c |   31 ++++++++++++++++++++++++++-----
 1 files changed, 26 insertions(+), 5 deletions(-)
---
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 5a0936f..693c510 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -9273,6 +9273,18 @@ _gdk_synthesize_crossing_events (GdkDisplay                 *display,
   if (a == b)
     return; /* No crossings generated between src and dest */
 
+  if (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_MASTER)
+    {
+      if (a && gdk_window_get_device_events (src, device) == 0)
+        a = NULL;
+
+      if (b && gdk_window_get_device_events (dest, device) == 0)
+        b = NULL;
+    }
+
+  if (!a && !b)
+    return;
+
   c = find_common_ancestor (a, b);
 
   non_linear |= (c != a) && (c != b);
@@ -9962,11 +9974,16 @@ proxy_pointer_event (GdkDisplay                 *display,
 
       event_win = get_event_window (display,
                                     device,
-				    pointer_window,
-				    source_event->type,
-				    state,
-				    &evmask,
-				    serial);
+                                    pointer_window,
+                                    source_event->type,
+                                    state,
+                                    &evmask,
+                                    serial);
+
+      if (event_win &&
+          gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_MASTER &&
+          gdk_window_get_device_events (event_win, device) == 0)
+        return TRUE;
 
       is_hint = FALSE;
 
@@ -10085,6 +10102,10 @@ proxy_button_event (GdkEvent *source_event,
   if (event_win == NULL || display->ignore_core_events)
     return TRUE;
 
+  if (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_MASTER &&
+      gdk_window_get_device_events (event_win, device) == 0)
+    return TRUE;
+
   event = _gdk_make_event (event_win, type, source_event, FALSE);
 
   switch (type)



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