gdk: Move XGetEventData() call to GdkEventSource

This function should be called just once across every possible
event translator and GdkFilterFunc that wants to deal with
any cookie event.
This commit is contained in:
Carlos Garnacho 2011-05-18 19:37:34 +02:00
parent 3410b14751
commit 53d77a829a
2 changed files with 30 additions and 44 deletions

View File

@ -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;
}

View File

@ -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;
}