summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkeventsource.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2011-05-18 21:24:57 +0200
committerCarlos Garnacho <carlosg@gnome.org>2011-05-18 22:34:33 +0200
commit55cc9f33399dab8b52ee071bab609680b66c4325 (patch)
tree88adc515815eb9d0dad159b3c83e0c7f322e2939 /gdk/x11/gdkeventsource.c
parent53d77a829aa82163aaf81e12d9b1366fb407cc22 (diff)
downloadgtk+-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.c50
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 ||