diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2012-10-19 13:33:31 -0400 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2012-12-13 10:51:38 -0500 |
commit | 9dc4c5ce73b61d4900ab293ec076c96f067a77dd (patch) | |
tree | 06a44e52292ce1b41b80e65244487e5548a0c273 /gdk | |
parent | 444a92d6d833c0254d554e64e393bfc823d3555f (diff) | |
download | gtk+-9dc4c5ce73b61d4900ab293ec076c96f067a77dd.tar.gz |
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
Diffstat (limited to 'gdk')
-rw-r--r-- | 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 cfbfe6fc0e..a0fba5f64e 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 * |