From d4708c9e0c9869b44bb337deeb2b1105ad0a2067 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 6 Oct 2011 10:03:52 -0400 Subject: [PATCH] Don't show prompts inside the message handler to prevent recursion Showing prompts causes messages to be created which causes the glib message handler to abort(). Save the messages and show them when done all other processing for the current event. --- openbox/debug.c | 19 +++++++++++++++++-- openbox/debug.h | 2 ++ openbox/event.c | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/openbox/debug.c b/openbox/debug.c index 358b090b..ad083b17 100644 --- a/openbox/debug.c +++ b/openbox/debug.c @@ -38,6 +38,8 @@ static guint rr_handler_id = 0; static guint obt_handler_id = 0; static guint ob_handler_id = 0; static guint ob_handler_prompt_id = 0; +static GList *prompt_queue = NULL; +static gboolean allow_prompts = TRUE; static void log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data); @@ -134,8 +136,8 @@ static void log_handler(const gchar *log_domain, GLogLevelFlags log_level, static void prompt_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer data) { - if (ob_state() == OB_STATE_RUNNING) - prompt_show_message(message, "Openbox", _("Close")); + if (ob_state() == OB_STATE_RUNNING && allow_prompts) + prompt_queue = g_list_prepend(prompt_queue, g_strdup(message)); else log_handler(log_domain, log_level, message, data); } @@ -184,3 +186,16 @@ void ob_debug_type(ObDebugType type, const gchar *a, ...) log_argv(type, a, vl); va_end(vl); } + +void ob_debug_show_prompts(void) +{ + if (prompt_queue) { + allow_prompts = FALSE; /* avoid recursive prompts */ + while (prompt_queue) { + prompt_show_message(prompt_queue->data, "Openbox", _("Close")); + g_free(prompt_queue->data); + prompt_queue = g_list_delete_link(prompt_queue, prompt_queue); + } + allow_prompts = TRUE; + } +} diff --git a/openbox/debug.h b/openbox/debug.h index a24e66ea..13c55988 100644 --- a/openbox/debug.h +++ b/openbox/debug.h @@ -38,4 +38,6 @@ void ob_debug_type(ObDebugType type, const gchar *a, ...); void ob_debug_enable(ObDebugType type, gboolean enable); +void ob_debug_show_prompts(void); + #endif diff --git a/openbox/event.c b/openbox/event.c index f9911eb9..5e6c4049 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -737,6 +737,9 @@ static void event_process(const XEvent *ec, gpointer data) used = event_handle_prompt(prompt, e); } + /* show any debug prompts that are queued */ + ob_debug_show_prompts(); + /* if something happens and it's not from an XEvent, then we don't know the time, so clear it here until the next event is handled */ event_curtime = event_sourcetime = CurrentTime; -- 2.34.1