all repos — openbox @ 303cbe76dc2dc273cd7e68a5eaf96c2af3b5d7ab

openbox fork - make it a bit more like ryudo

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.
Dana Jansens danakj@orodu.net
commit

303cbe76dc2dc273cd7e68a5eaf96c2af3b5d7ab

parent

a23954ec17c17259f75e0f4e647975bbf4ede058

3 files changed, 22 insertions(+), 2 deletions(-)

jump to
M openbox/debug.copenbox/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 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 @@ va_start(vl, 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; + } +}
M openbox/debug.hopenbox/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
M openbox/event.copenbox/event.c

@@ -736,6 +736,9 @@ if (prompt && !used)

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;