From 5899f40aea09ad4d8bc8ed159ecbfa7c97c64bf5 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 18 Aug 2009 02:09:40 +0200 Subject: [PATCH] GdkEventSource: Enable window filters. commented out code has been removed in the event translators. --- gdk/x11/gdkdevicemanager-core.c | 46 +----------------- gdk/x11/gdkdisplay-x11.c | 29 +---------- gdk/x11/gdkeventsource.c | 85 ++++++++++++++++++++++++++++++--- gdk/x11/gdkeventtranslator.c | 21 -------- gdk/x11/gdkeventtranslator.h | 3 -- 5 files changed, 81 insertions(+), 103 deletions(-) diff --git a/gdk/x11/gdkdevicemanager-core.c b/gdk/x11/gdkdevicemanager-core.c index 4775a835c4..b70f75aad0 100644 --- a/gdk/x11/gdkdevicemanager-core.c +++ b/gdk/x11/gdkdevicemanager-core.c @@ -311,7 +311,7 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator, XEvent *xevent) { GdkDeviceManagerCore *device_manager; - GdkWindow *window, *filter_window; + GdkWindow *window; GdkWindowObject *window_private; GdkWindowImplX11 *window_impl = NULL; gboolean return_val; @@ -326,29 +326,11 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator, window_private = NULL; event->any.window = NULL; - /* Run default filters */ -#if 0 - if (_gdk_default_filters) - { - /* Apply global filters */ - GdkFilterReturn result; - result = gdk_event_apply_filters (xevent, event, - _gdk_default_filters); - - if (result != GDK_FILTER_CONTINUE) - { - return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE; - goto done; - } - } -#endif - /* Find the GdkWindow that this event relates to. * Basically this means substructure events * are reported same as structure events */ window = gdk_event_translator_get_event_window (translator, display, xevent); - filter_window = gdk_event_translator_get_filter_window (translator, display, xevent); window_private = (GdkWindowObject *) window; if (window) @@ -368,7 +350,7 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator, case KeyPress: case KeyRelease: xwindow = GDK_WINDOW_XID (window); - xevent->xany.window = xwindow; + xevent->xany.window = xwindow break; default: return FALSE; @@ -390,30 +372,6 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator, goto done; } } -#if 0 - else if (filter_window) - { - /* Apply per-window filters */ - GdkWindowObject *filter_private = (GdkWindowObject *) filter_window; - GdkFilterReturn result; - - if (filter_private->filters) - { - g_object_ref (filter_window); - - result = gdk_event_apply_filters (xevent, event, - filter_private->filters); - - g_object_unref (filter_window); - - if (result != GDK_FILTER_CONTINUE) - { - return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE; - goto done; - } - } - } -#endif if (window && (xevent->type == MotionNotify || diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index d59209ea5b..fbfae73eaf 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -323,7 +323,7 @@ gdk_display_x11_translate_event (GdkEventTranslator *translator, GdkEvent *event, XEvent *xevent) { - GdkWindow *window, *filter_window; + GdkWindow *window; GdkWindowObject *window_private; GdkWindowImplX11 *window_impl = NULL; GdkScreen *screen = NULL; @@ -333,14 +333,11 @@ gdk_display_x11_translate_event (GdkEventTranslator *translator, gboolean return_val; Window xwindow = None; - /* FIXME: default filters */ - /* Find the GdkWindow that this event relates to. * Basically this means substructure events * are reported same as structure events */ window = gdk_event_translator_get_event_window (translator, display, xevent); - filter_window = gdk_event_translator_get_filter_window (translator, display, xevent); window_private = (GdkWindowObject *) window; if (window) @@ -365,30 +362,6 @@ gdk_display_x11_translate_event (GdkEventTranslator *translator, goto done; } } -#if 0 - else if (filter_window) - { - /* Apply per-window filters */ - GdkWindowObject *filter_private = (GdkWindowObject *) filter_window; - GdkFilterReturn result; - - if (filter_private->filters) - { - g_object_ref (filter_window); - - result = gdk_event_apply_filters (xevent, event, - filter_private->filters); - - g_object_unref (filter_window); - - if (result != GDK_FILTER_CONTINUE) - { - return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE; - goto done; - } - } - } -#endif /* FIXME: if window is NULL, xwindow should still have something meaningful here? */ if (xwindow != None && diff --git a/gdk/x11/gdkeventsource.c b/gdk/x11/gdkeventsource.c index eac2f4b7e2..b7adf4c70c 100644 --- a/gdk/x11/gdkeventsource.c +++ b/gdk/x11/gdkeventsource.c @@ -47,6 +47,44 @@ static GSourceFuncs event_funcs = { static GList *event_sources = NULL; +static gint +gdk_event_apply_filters (XEvent *xevent, + GdkEvent *event, + GList *filters) +{ + GList *tmp_list; + GdkFilterReturn result; + + tmp_list = filters; + + while (tmp_list) + { + GdkEventFilter *filter = (GdkEventFilter*) tmp_list->data; + + tmp_list = tmp_list->next; + result = filter->function (xevent, event, filter->data); + + if (result != GDK_FILTER_CONTINUE) + return result; + } + + return GDK_FILTER_CONTINUE; +} + +static GdkWindow * +gdk_event_source_get_filter_window (GdkEventSource *event_source, + XEvent *xevent) +{ + GdkWindow *window; + + window = gdk_window_lookup_for_display (event_source->display, + xevent->xany.window); + + if (window && !GDK_IS_WINDOW (window)) + window = NULL; + + return window; +} static GdkEvent * gdk_event_source_translate_event (GdkEventSource *event_source, @@ -54,6 +92,46 @@ gdk_event_source_translate_event (GdkEventSource *event_source, { GdkEvent *event = NULL; GList *list = event_source->translators; + GdkFilterReturn result; + GdkWindow *filter_window; + + /* Run default filters */ + if (_gdk_default_filters) + { + /* Apply global filters */ + + result = gdk_event_apply_filters (xevent, event, + _gdk_default_filters); + + if (result == GDK_FILTER_REMOVE) + return NULL; + else if (result == GDK_FILTER_TRANSLATE) + return event; + } + + filter_window = gdk_event_source_get_filter_window (event_source, xevent); + + if (filter_window) + { + /* Apply per-window filters */ + GdkWindowObject *filter_private = (GdkWindowObject *) filter_window; + GdkFilterReturn result; + + if (filter_private->filters) + { + g_object_ref (filter_window); + + result = gdk_event_apply_filters (xevent, event, + filter_private->filters); + + g_object_unref (filter_window); + + if (result == GDK_FILTER_REMOVE) + return NULL; + else if (result == GDK_FILTER_TRANSLATE) + return event; + } + } while (list && !event) { @@ -205,13 +283,6 @@ gdk_event_source_new (GdkDisplay *display) event_sources = g_list_prepend (event_sources, source); -#if 0 - gdk_display_add_client_message_filter (display, - gdk_atom_intern_static_string ("WM_PROTOCOLS"), - gdk_wm_protocols_filter, - NULL); -#endif - return source; } diff --git a/gdk/x11/gdkeventtranslator.c b/gdk/x11/gdkeventtranslator.c index 39b3c8dfff..66f45dd21a 100644 --- a/gdk/x11/gdkeventtranslator.c +++ b/gdk/x11/gdkeventtranslator.c @@ -141,24 +141,3 @@ gdk_event_translator_get_event_window (GdkEventTranslator *translator, return get_gdk_window (display, xwindow); } - -GdkWindow * -gdk_event_translator_get_filter_window (GdkEventTranslator *translator, - GdkDisplay *display, - XEvent *xevent) -{ - GdkEventTranslatorIface *iface; - Window xwindow = None; - - g_return_val_if_fail (GDK_IS_EVENT_TRANSLATOR (translator), NULL); - - iface = GDK_EVENT_TRANSLATOR_GET_IFACE (translator); - - if (iface->get_filter_window) - xwindow = (iface->get_filter_window) (translator, xevent); - - if (xwindow == None) - xwindow = xevent->xany.window; - - return get_gdk_window (display, xwindow); -} diff --git a/gdk/x11/gdkeventtranslator.h b/gdk/x11/gdkeventtranslator.h index 4ec6cfcced..a3efe566c9 100644 --- a/gdk/x11/gdkeventtranslator.h +++ b/gdk/x11/gdkeventtranslator.h @@ -59,9 +59,6 @@ GdkEvent * gdk_event_translator_translate (GdkEventTranslator *translator, GdkWindow * gdk_event_translator_get_event_window (GdkEventTranslator *translator, GdkDisplay *display, XEvent *xevent); -GdkWindow * gdk_event_translator_get_filter_window (GdkEventTranslator *translator, - GdkDisplay *display, - XEvent *xevent); G_END_DECLS