From c2129d07ca5530ea4e2f28d960aabe6420eb46b3 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Sat, 1 Nov 2008 11:55:16 +0000 Subject: [PATCH] Bug 558278 - Crash when calling a callback set by 2008-11-01 Tor Lillqvist Bug 558278 - Crash when calling a callback set by gdk_add_client_message_filter() * gdk/win32/gdkevents-win32.c (apply_event_filters): Rename from apply_filters() so that it is clear that this function is for GdkEventFilters only. (print_event): Print more information for GDK_CLIENT_EVENT events. (gdk_event_translate): When handling client filters, don't use apply_event_filters(). Use similar code as in the X11 backend, although not exactly, as the parameter list and return value semantics of gdk_event_translate() is different. svn path=/trunk/; revision=21748 --- ChangeLog | 16 +++++++++++ gdk/win32/gdkevents-win32.c | 55 +++++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 507400388d..03a119152e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-11-01 Tor Lillqvist + + Bug 558278 - Crash when calling a callback set by + gdk_add_client_message_filter() + + * gdk/win32/gdkevents-win32.c (apply_event_filters): Rename from + apply_filters() so that it is clear that this function is for + GdkEventFilters only. + + (print_event): Print more information for GDK_CLIENT_EVENT events. + + (gdk_event_translate): When handling client filters, don't use + apply_event_filters(). Use similar code as in the X11 backend, + although not exactly, as the parameter list and return value + semantics of gdk_event_translate() is different. + 2008-11-01 Matthias Clasen Bug 409435 – GtkStatusIcon enhancements: DnD, scroll events, diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index df8405db88..686e0fe527 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -1070,6 +1070,16 @@ print_event (GdkEvent *event) event->configure.x, event->configure.y, event->configure.width, event->configure.height); break; + case GDK_CLIENT_EVENT: + g_print ("%s %d %ld %ld %ld %ld %ld", + gdk_atom_name (event->client.message_type), + event->client.data_format, + event->client.data.l[0], + event->client.data.l[1], + event->client.data.l[2], + event->client.data.l[3], + event->client.data.l[4]); + break; case GDK_SCROLL: g_print ("(%.4g,%.4g) (%.4g,%.4g) %s ", event->scroll.x, event->scroll.y, @@ -1213,9 +1223,9 @@ fill_key_event_string (GdkEvent *event) } static GdkFilterReturn -apply_filters (GdkWindow *window, - MSG *msg, - GList *filters) +apply_event_filters (GdkWindow *window, + MSG *msg, + GList *filters) { GdkFilterReturn result = GDK_FILTER_CONTINUE; GdkEvent *event; @@ -2276,7 +2286,7 @@ gdk_event_translate (MSG *msg, { /* Apply global filters */ - GdkFilterReturn result = apply_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, @@ -2335,7 +2345,7 @@ gdk_event_translate (MSG *msg, { /* Apply per-window filters */ - GdkFilterReturn result = apply_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) { @@ -2348,9 +2358,15 @@ gdk_event_translate (MSG *msg, { GList *tmp_list; GdkFilterReturn result = GDK_FILTER_CONTINUE; + GList *node; GDK_NOTE (EVENTS, g_print (" client_message")); + event = gdk_event_new (GDK_NOTHING); + ((GdkEventPrivate *)event)->flags |= GDK_EVENT_PENDING; + + node = _gdk_event_queue_append (_gdk_display, event); + tmp_list = client_filters; while (tmp_list) { @@ -2360,38 +2376,41 @@ gdk_event_translate (MSG *msg, if (filter->type == GDK_POINTER_TO_ATOM (msg->wParam)) { - GList *filter_list = g_list_append (NULL, filter); - GDK_NOTE (EVENTS, g_print (" (match)")); - result = apply_filters (window, msg, filter_list); - - g_list_free (filter_list); + result = (*filter->function) (msg, event, filter->data); if (result != GDK_FILTER_CONTINUE) break; } } - if (result == GDK_FILTER_REMOVE || result == GDK_FILTER_TRANSLATE) + switch (result) { + case GDK_FILTER_REMOVE: + _gdk_event_queue_remove_link (_gdk_display, node); + g_list_free_1 (node); + gdk_event_free (event); return_val = TRUE; goto done; - } - else - { + + case GDK_FILTER_TRANSLATE: + ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING; + GDK_NOTE (EVENTS, print_event (event)); + return_val = TRUE; + goto done; + + case GDK_FILTER_CONTINUE: /* Send unknown client messages on to Gtk for it to use */ - event = gdk_event_new (GDK_CLIENT_EVENT); + event->client.type = GDK_CLIENT_EVENT; event->client.window = window; event->client.message_type = GDK_POINTER_TO_ATOM (msg->wParam); event->client.data_format = 32; event->client.data.l[0] = msg->lParam; for (i = 1; i < 5; i++) event->client.data.l[i] = 0; - - append_event (event); - + GDK_NOTE (EVENTS, print_event (event)); return_val = TRUE; goto done; }