diff --git a/ChangeLog b/ChangeLog index ded01546c7..ff3409c3f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-03-08 Matthias Clasen + + * gdk/x11/gdkasync.c (send_event_handler): Defer the callbacks + to an idle to avoid deadlock with xcb-ified libX11. (#413032, + Sebastian Dröge) + 2007-03-08 Matthias Clasen * gtk/gtknotebook.c (gtk_notebook_real_insert_page): diff --git a/gdk/x11/gdkasync.c b/gdk/x11/gdkasync.c index e360bf1a15..6336660061 100644 --- a/gdk/x11/gdkasync.c +++ b/gdk/x11/gdkasync.c @@ -112,6 +112,18 @@ struct _SetInputFocusState gulong get_input_focus_req; }; +static gboolean +callback_idle (gpointer data) +{ + SendEventState *state = (SendEventState *)data; + + state->callback (state->window, !state->have_error, state->data); + + g_free (state); + + return FALSE; +} + static Bool send_event_handler (Display *dpy, xReply *rep, @@ -147,12 +159,10 @@ send_event_handler (Display *dpy, } if (state->callback) - state->callback (state->window, !state->have_error, state->data); + gdk_threads_add_idle (callback_idle, state); DeqAsyncHandler(state->dpy, &state->async); - g_free (state); - return (rep->generic.type != X_Error); }