GdkEventSource: Enable window filters.
commented out code has been removed in the event translators.
This commit is contained in:
@@ -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 ||
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user