Skip to content

Commit

Permalink
Don't show prompts inside the message handler to prevent recursion
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
danakj committed Oct 6, 2011
1 parent a23954e commit 303cbe7
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
19 changes: 17 additions & 2 deletions openbox/debug.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
}
}
2 changes: 2 additions & 0 deletions openbox/debug.h
Expand Up @@ -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
3 changes: 3 additions & 0 deletions openbox/event.c
Expand Up @@ -736,6 +736,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;
Expand Down

0 comments on commit 303cbe7

Please sign in to comment.