GdkEventSource: Enable window filters.

commented out code has been removed in the event translators.
This commit is contained in:
Carlos Garnacho
2009-08-18 02:09:40 +02:00
parent 1c842fca52
commit 5899f40aea
5 changed files with 81 additions and 103 deletions

View File

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

View File

@@ -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 &&

View File

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

View File

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

View File

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