[gtk+] xi2: Abort early if we don't have a proper GDK window



commit 9dc4c5ce73b61d4900ab293ec076c96f067a77dd
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Fri Oct 19 13:33:31 2012 -0400

    xi2: Abort early if we don't have a proper GDK window
    
    This can happen in mutter or other applications that use GDK filters
    but don't actually create GDK windows for everything they get events
    for.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=689401

 gdk/x11/gdkdevicemanager-xi2.c |   23 ++++++++++++++++++-----
 1 files changed, 18 insertions(+), 5 deletions(-)
---
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index cfbfe6f..a0fba5f 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -917,12 +917,14 @@ is_parent_of (GdkWindow *parent,
   return FALSE;
 }
 
-static GdkWindow *
+static gboolean
 get_event_window (GdkEventTranslator *translator,
-                  XIEvent            *ev)
+                  XIEvent            *ev,
+                  GdkWindow         **window_p)
 {
   GdkDisplay *display;
   GdkWindow *window = NULL;
+  gboolean should_have_window = TRUE;
 
   display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (translator));
 
@@ -976,9 +978,17 @@ get_event_window (GdkEventTranslator *translator,
         window = gdk_x11_window_lookup_for_display (display, xev->event);
       }
       break;
+    default:
+      should_have_window = FALSE;
+      break;
     }
 
-  return window;
+  *window_p = window;
+
+  if (should_have_window && !window)
+    return FALSE;
+
+  return TRUE;
 }
 
 static gboolean
@@ -1122,7 +1132,8 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
   if (!ev)
     return FALSE;
 
-  window = get_event_window (translator, ev);
+  if (!get_event_window (translator, ev, &window))
+    return FALSE;
 
   if (window && GDK_WINDOW_DESTROYED (window))
     return FALSE;
@@ -1650,6 +1661,7 @@ gdk_x11_device_manager_xi2_get_window (GdkEventTranslator *translator,
 {
   GdkX11DeviceManagerXI2 *device_manager;
   XIEvent *ev;
+  GdkWindow *window = NULL;
 
   device_manager = (GdkX11DeviceManagerXI2 *) translator;
 
@@ -1659,7 +1671,8 @@ gdk_x11_device_manager_xi2_get_window (GdkEventTranslator *translator,
 
   ev = (XIEvent *) xevent->xcookie.data;
 
-  return get_event_window (translator, ev);
+  get_event_window (translator, ev, &window);
+  return window;
 }
 
 GdkDevice *



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