From 16433ce06c083de8c725b8dc906f47c1333e3b33 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 15 Jan 2010 16:40:29 -0500 Subject: [PATCH] allow multiple escaped _'s in a menu label, and allow a real _ to come later in the label (Fixes bug #4355). --- openbox/menu.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/openbox/menu.c b/openbox/menu.c index 6dd6d07..634a0d9 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -218,6 +218,7 @@ static gunichar parse_shortcut(const gchar *label, gboolean allow_shortcut, *strippedlabel = NULL; } else { gchar *i; + gboolean escape; *strippedlabel = g_strdup(label); @@ -225,20 +226,33 @@ static gunichar parse_shortcut(const gchar *label, gboolean allow_shortcut, have to just use the first valid character */ - i = strchr(*strippedlabel, '_'); + /* allow __ to escape an underscore */ + i = *strippedlabel; + do { + escape = FALSE; + i = strchr(i, '_'); + if (i && *(i+1) == '_') { + gchar *j; + + /* remove the escape '_' from the string */ + for (j = i; *j != '\0'; ++j) + *j = *(j+1); + + ++i; + escape = TRUE; + } + } while (escape); + if (allow_shortcut && i != NULL) { /* there is an underscore in the string */ /* you have to use a printable ascii character for shortcuts don't allow space either, so you can have like "a _ b" */ - if (VALID_SHORTCUT(*(i+1)) || *(i+1) == '_') { - /* Allow you to escape the first _ by putting __ */ - if (*(i+1) != '_') { - shortcut = g_unichar_tolower(g_utf8_get_char(i+1)); - *position = i - *strippedlabel; - *always_show = TRUE; - } + if (VALID_SHORTCUT(*(i+1))) { + shortcut = g_unichar_tolower(g_utf8_get_char(i+1)); + *position = i - *strippedlabel; + *always_show = TRUE; /* remove the '_' from the string */ for (; *i != '\0'; ++i) -- 1.9.1