diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index 3a520c1bc9..f8d5e70424 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -1007,43 +1007,27 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, gboolean return_val = TRUE; GdkWindow *window; XIEvent *ev; - Display *dpy; - dpy = GDK_DISPLAY_XDISPLAY (display); device_manager = (GdkX11DeviceManagerXI2 *) translator; cookie = &xevent->xcookie; if (xevent->type != GenericEvent) return gdk_x11_device_manager_xi2_translate_core_event (translator, display, event, xevent); - - if (!XGetEventData (dpy, cookie)) + else if (cookie->extension != device_manager->opcode) return FALSE; - if (cookie->type != GenericEvent || - cookie->extension != device_manager->opcode) - { - XFreeEventData (dpy, cookie); - return FALSE; - } - ev = (XIEvent *) cookie->data; window = get_event_window (translator, ev); if (window && GDK_WINDOW_DESTROYED (window)) - { - XFreeEventData (dpy, cookie); - return FALSE; - } + return FALSE; if (ev->evtype == XI_Motion || ev->evtype == XI_ButtonRelease) { if (_gdk_x11_moveresize_handle_event (xevent)) - { - XFreeEventData (dpy, cookie); - return FALSE; - } + return FALSE; } switch (ev->evtype) @@ -1325,8 +1309,6 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator, event->any.type = GDK_NOTHING; } - XFreeEventData (dpy, cookie); - return return_val; } diff --git a/gdk/x11/gdkeventsource.c b/gdk/x11/gdkeventsource.c index ec18202adf..cb6d1f274a 100644 --- a/gdk/x11/gdkeventsource.c +++ b/gdk/x11/gdkeventsource.c @@ -152,8 +152,17 @@ gdk_event_source_translate_event (GdkEventSource *event_source, { GdkEvent *event = gdk_event_new (GDK_NOTHING); GList *list = event_source->translators; - GdkFilterReturn result; + GdkFilterReturn result = GDK_FILTER_CONTINUE; GdkWindow *filter_window; + Display *dpy; + + dpy = GDK_DISPLAY_XDISPLAY (event_source->display); + + /* Get cookie data here so it's available + * to every event translator and event filter. + */ + if (xevent->type == GenericEvent) + XGetEventData (dpy, &xevent->xcookie); filter_window = gdk_event_source_get_filter_window (event_source, xevent); if (filter_window) @@ -163,38 +172,30 @@ gdk_event_source_translate_event (GdkEventSource *event_source, if (_gdk_default_filters) { /* Apply global filters */ - result = gdk_event_apply_filters (xevent, event, NULL); + } + + if (result == GDK_FILTER_CONTINUE && + filter_window && filter_window->filters) + { + /* Apply per-window filters */ + result = gdk_event_apply_filters (xevent, event, filter_window); + } + + if (result != GDK_FILTER_CONTINUE) + { + if (xevent->type == GenericEvent) + XFreeEventData (dpy, &xevent->xcookie); if (result == GDK_FILTER_REMOVE) { gdk_event_free (event); return NULL; } - else if (result == GDK_FILTER_TRANSLATE) + else /* GDK_FILTER_TRANSLATE */ return event; } - if (filter_window) - { - /* Apply per-window filters */ - GdkFilterReturn result; - - if (filter_window->filters) - { - result = gdk_event_apply_filters (xevent, event, - filter_window); - - if (result == GDK_FILTER_REMOVE) - { - gdk_event_free (event); - return NULL; - } - else if (result == GDK_FILTER_TRANSLATE) - return event; - } - } - gdk_event_free (event); event = NULL; @@ -217,6 +218,9 @@ gdk_event_source_translate_event (GdkEventSource *event_source, handle_focus_change (&event->crossing); } + if (xevent->type == GenericEvent) + XFreeEventData (dpy, &xevent->xcookie); + return event; }