From 99fc7d3463eaff8030463ca4ac438607f47f4077 Mon Sep 17 00:00:00 2001 From: Luc Menut <lmenut@mageia.org> Date: Mon, 2 Mar 2015 01:17:28 +0100 Subject: [PATCH] Revert "Make gdk_event_apply_filters safe against changes in filter list" This reverts commit ee95f3d7259c0859ce41189b781b4339b4cd64aa. --- gdk/gdkinternals.h | 6 ----- gdk/gdkwindow.c | 30 ++++++++--------------- gdk/quartz/gdkevents-quartz.c | 55 +++++++++++++------------------------------ gdk/win32/gdkevents-win32.c | 37 +++++++---------------------- gdk/x11/gdkevents-x11.c | 37 +++++++---------------------- 5 files changed, 43 insertions(+), 122 deletions(-) diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 97a1daa..0bd803f 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -59,15 +59,9 @@ struct _GdkColorInfo guint ref_count; }; -typedef enum { - GDK_EVENT_FILTER_REMOVED = 1 << 0 -} GdkEventFilterFlags; - struct _GdkEventFilter { GdkFilterFunc function; gpointer data; - GdkEventFilterFlags flags; - guint ref_count; }; struct _GdkClientFilter { diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 29c878f..45fee34 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -2545,18 +2545,13 @@ gdk_window_add_filter (GdkWindow *window, { filter = (GdkEventFilter *)tmp_list->data; if ((filter->function == function) && (filter->data == data)) - { - filter->ref_count++; - return; - } + return; tmp_list = tmp_list->next; } filter = g_new (GdkEventFilter, 1); filter->function = function; filter->data = data; - filter->ref_count = 1; - filter->flags = 0; if (private) private->filters = g_list_append (private->filters, filter); @@ -2598,21 +2593,16 @@ gdk_window_remove_filter (GdkWindow *window, tmp_list = tmp_list->next; if ((filter->function == function) && (filter->data == data)) - { - filter->flags |= GDK_EVENT_FILTER_REMOVED; - filter->ref_count--; - if (filter->ref_count != 0) - return; - - if (private) - private->filters = g_list_remove_link (private->filters, node); - else - _gdk_default_filters = g_list_remove_link (_gdk_default_filters, node); - g_list_free_1 (node); - g_free (filter); + { + if (private) + private->filters = g_list_remove_link (private->filters, node); + else + _gdk_default_filters = g_list_remove_link (_gdk_default_filters, node); + g_list_free_1 (node); + g_free (filter); - return; - } + return; + } } } diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index f199298..9e57edd 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -253,42 +253,21 @@ append_event (GdkEvent *event, static gint gdk_event_apply_filters (NSEvent *nsevent, GdkEvent *event, - GList **filters) + GList *filters) { GList *tmp_list; GdkFilterReturn result; - tmp_list = *filters; + tmp_list = filters; while (tmp_list) { GdkEventFilter *filter = (GdkEventFilter*) tmp_list->data; - GList *node; - - if ((filter->flags & GDK_EVENT_FILTER_REMOVED) != 0) - { - tmp_list = tmp_list->next; - continue; - } - - filter->ref_count++; - result = filter->function (nsevent, event, filter->data); - - /* get the next node after running the function since the - function may add or remove a next node */ - node = tmp_list; + tmp_list = tmp_list->next; - - filter->ref_count--; - if (filter->ref_count == 0) - { - *filters = g_list_remove_link (*filters, node); - g_list_free_1 (node); - g_free (filter); - } - - if (result != GDK_FILTER_CONTINUE) - return result; + result = filter->function (nsevent, event, filter->data); + if (result != GDK_FILTER_CONTINUE) + return result; } return GDK_FILTER_CONTINUE; @@ -1340,7 +1319,7 @@ gdk_event_translate (GdkEvent *event, /* Apply global filters */ GdkFilterReturn result; - result = gdk_event_apply_filters (nsevent, event, &_gdk_default_filters); + result = gdk_event_apply_filters (nsevent, event, _gdk_default_filters); if (result != GDK_FILTER_CONTINUE) { return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE; @@ -1411,19 +1390,19 @@ gdk_event_translate (GdkEvent *event, GdkFilterReturn result; if (filter_private->filters) - { - g_object_ref (window); + { + g_object_ref (window); - result = gdk_event_apply_filters (nsevent, event, &filter_private->filters); + result = gdk_event_apply_filters (nsevent, event, filter_private->filters); - g_object_unref (window); + g_object_unref (window); - if (result != GDK_FILTER_CONTINUE) - { - return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE; - goto done; - } - } + if (result != GDK_FILTER_CONTINUE) + { + return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE; + goto done; + } + } } /* If the app is not active leave the event to AppKit so the window gets diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index c853e1e..8b345cb 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -1069,7 +1069,7 @@ fill_key_event_string (GdkEvent *event) static GdkFilterReturn apply_event_filters (GdkWindow *window, MSG *msg, - GList **filters) + GList *filters) { GdkFilterReturn result = GDK_FILTER_CONTINUE; GdkEvent *event; @@ -1087,36 +1087,15 @@ apply_event_filters (GdkWindow *window, */ node = _gdk_event_queue_append (_gdk_display, event); - tmp_list = *filters; + tmp_list = filters; while (tmp_list) { GdkEventFilter *filter = (GdkEventFilter *) tmp_list->data; - GList *node; - - if ((filter->flags & GDK_EVENT_FILTER_REMOVED) != 0) - { - tmp_list = tmp_list->next; - continue; - } - - filter->ref_count++; - result = filter->function (msg, event, filter->data); - - /* get the next node after running the function since the - function may add or remove a next node */ - node = tmp_list; + tmp_list = tmp_list->next; - - filter->ref_count--; - if (filter->ref_count == 0) - { - *filters = g_list_remove_link (*filters, node); - g_list_free_1 (node); - g_free (filter); - } - - if (result != GDK_FILTER_CONTINUE) - break; + result = filter->function (msg, event, filter->data); + if (result != GDK_FILTER_CONTINUE) + break; } if (result == GDK_FILTER_CONTINUE || result == GDK_FILTER_REMOVE) @@ -2096,7 +2075,7 @@ gdk_event_translate (MSG *msg, { /* Apply global filters */ - GdkFilterReturn result = apply_event_filters (NULL, msg, &_gdk_default_filters); + GdkFilterReturn result = apply_event_filters (NULL, msg, _gdk_default_filters); /* If result is GDK_FILTER_CONTINUE, we continue as if nothing * happened. If it is GDK_FILTER_REMOVE or GDK_FILTER_TRANSLATE, @@ -2142,7 +2121,7 @@ gdk_event_translate (MSG *msg, { /* Apply per-window filters */ - GdkFilterReturn result = apply_event_filters (window, msg, &((GdkWindowObject *) window)->filters); + GdkFilterReturn result = apply_event_filters (window, msg, ((GdkWindowObject *) window)->filters); if (result == GDK_FILTER_REMOVE || result == GDK_FILTER_TRANSLATE) { diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index 8de98c5..b96e9f5 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -96,7 +96,7 @@ struct _GdkEventTypeX11 static gint gdk_event_apply_filters (XEvent *xevent, GdkEvent *event, - GList **filters); + GList *filters); static gboolean gdk_event_translate (GdkDisplay *display, GdkEvent *event, XEvent *xevent, @@ -341,42 +341,21 @@ gdk_event_get_graphics_expose (GdkWindow *window) static gint gdk_event_apply_filters (XEvent *xevent, GdkEvent *event, - GList **filters) + GList *filters) { GList *tmp_list; GdkFilterReturn result; - tmp_list = *filters; + tmp_list = filters; while (tmp_list) { GdkEventFilter *filter = (GdkEventFilter*) tmp_list->data; - GList *node; - if ((filter->flags & GDK_EVENT_FILTER_REMOVED) != 0) - { - tmp_list = tmp_list->next; - continue; - } - - filter->ref_count++; - result = filter->function (xevent, event, filter->data); - - /* get the next node after running the function since the - function may add or remove a next node */ - node = tmp_list; tmp_list = tmp_list->next; - - filter->ref_count--; - if (filter->ref_count == 0) - { - *filters = g_list_remove_link (*filters, node); - g_list_free_1 (node); - g_free (filter); - } - - if (result != GDK_FILTER_CONTINUE) - return result; + result = filter->function (xevent, event, filter->data); + if (result != GDK_FILTER_CONTINUE) + return result; } return GDK_FILTER_CONTINUE; @@ -965,7 +944,7 @@ gdk_event_translate (GdkDisplay *display, /* Apply global filters */ GdkFilterReturn result; result = gdk_event_apply_filters (xevent, event, - &_gdk_default_filters); + _gdk_default_filters); if (result != GDK_FILTER_CONTINUE) { @@ -1071,7 +1050,7 @@ gdk_event_translate (GdkDisplay *display, g_object_ref (filter_window); result = gdk_event_apply_filters (xevent, event, - &filter_private->filters); + filter_private->filters); g_object_unref (filter_window); -- 2.3.1