diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2011-05-18 21:24:57 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2011-05-18 22:34:33 +0200 |
commit | 55cc9f33399dab8b52ee071bab609680b66c4325 (patch) | |
tree | 88adc515815eb9d0dad159b3c83e0c7f322e2939 /gdk/x11/gdkeventsource.c | |
parent | 53d77a829aa82163aaf81e12d9b1366fb407cc22 (diff) | |
download | gtk+-55cc9f33399dab8b52ee071bab609680b66c4325.tar.gz |
gdk: Add _gdk_x11_event_translator_get_window()
This method can be implemented by event translators so they
return the right window from XGenericEventCookie events, as
ev->xany.window isn't meaningful for these.
GdkEventSource now also uses this to find out the right window
filters to apply.
Diffstat (limited to 'gdk/x11/gdkeventsource.c')
-rw-r--r-- | gdk/x11/gdkeventsource.c | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/gdk/x11/gdkeventsource.c b/gdk/x11/gdkeventsource.c index cb6d1f274a..2c25c85db6 100644 --- a/gdk/x11/gdkeventsource.c +++ b/gdk/x11/gdkeventsource.c @@ -97,11 +97,30 @@ gdk_event_apply_filters (XEvent *xevent, } static GdkWindow * -gdk_event_source_get_filter_window (GdkEventSource *event_source, - XEvent *xevent) +gdk_event_source_get_filter_window (GdkEventSource *event_source, + XEvent *xevent, + GdkEventTranslator **event_translator) { + GList *list = event_source->translators; GdkWindow *window; + *event_translator = NULL; + + while (list) + { + GdkEventTranslator *translator = list->data; + + list = list->next; + window = _gdk_x11_event_translator_get_window (translator, + event_source->display, + xevent); + if (window) + { + *event_translator = translator; + return window; + } + } + window = gdk_x11_window_lookup_for_display (event_source->display, xevent->xany.window); @@ -151,8 +170,8 @@ gdk_event_source_translate_event (GdkEventSource *event_source, XEvent *xevent) { GdkEvent *event = gdk_event_new (GDK_NOTHING); - GList *list = event_source->translators; GdkFilterReturn result = GDK_FILTER_CONTINUE; + GdkEventTranslator *event_translator; GdkWindow *filter_window; Display *dpy; @@ -164,7 +183,8 @@ gdk_event_source_translate_event (GdkEventSource *event_source, if (xevent->type == GenericEvent) XGetEventData (dpy, &xevent->xcookie); - filter_window = gdk_event_source_get_filter_window (event_source, xevent); + filter_window = gdk_event_source_get_filter_window (event_source, xevent, + &event_translator); if (filter_window) event->any.window = g_object_ref (filter_window); @@ -199,15 +219,27 @@ gdk_event_source_translate_event (GdkEventSource *event_source, gdk_event_free (event); event = NULL; - while (list && !event) + if (event_translator) { - GdkEventTranslator *translator = list->data; - - list = list->next; - event = _gdk_x11_event_translator_translate (translator, + /* Event translator was gotten before in get_filter_window() */ + event = _gdk_x11_event_translator_translate (event_translator, event_source->display, xevent); } + else + { + GList *list = event_source->translators; + + while (list && !event) + { + GdkEventTranslator *translator = list->data; + + list = list->next; + event = _gdk_x11_event_translator_translate (translator, + event_source->display, + xevent); + } + } if (event && (event->type == GDK_ENTER_NOTIFY || |