diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 3360485a..c9f8e6cb 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -489,7 +489,7 @@ void handle_button(xcb_button_press_event_t *event) { size_t namelen = 0; const char *utf8_name = cur_ws->canonical_name; for (const char *walk = utf8_name; *walk != '\0'; walk++) { - if (*walk == '"') + if (*walk == '"' || *walk == '\\') num_quotes++; /* While we’re looping through the name anyway, we can save one * strlen(). */ @@ -503,7 +503,7 @@ void handle_button(xcb_button_press_event_t *event) { for (inpos = 0, outpos = strlen("workspace \""); inpos < namelen; inpos++, outpos++) { - if (utf8_name[inpos] == '"') { + if (utf8_name[inpos] == '"' || utf8_name[inpos] == '\\') { buffer[outpos] = '\\'; outpos++; } diff --git a/src/commands_parser.c b/src/commands_parser.c index f325a048..fa4c2360 100644 --- a/src/commands_parser.c +++ b/src/commands_parser.c @@ -216,8 +216,9 @@ char *parse_string(const char **walk, bool as_word) { if (**walk == '"') { beginning++; (*walk)++; - while (**walk != '\0' && (**walk != '"' || *(*walk - 1) == '\\')) - (*walk)++; + for (; **walk != '\0' && **walk != '"'; (*walk)++) + if (**walk == '\\' && *(*walk + 1) != '\0') + (*walk)++; } else { if (!as_word) { /* For a string (starting with 's'), the delimiters are @@ -248,10 +249,10 @@ char *parse_string(const char **walk, bool as_word) { for (inpos = 0, outpos = 0; inpos < (*walk - beginning); inpos++, outpos++) { - /* We only handle escaped double quotes to not break - * backwards compatibility with people using \w in - * regular expressions etc. */ - if (beginning[inpos] == '\\' && beginning[inpos + 1] == '"') + /* We only handle escaped double quotes and backslashes to not break + * backwards compatibility with people using \w in regular expressions + * etc. */ + if (beginning[inpos] == '\\' && (beginning[inpos + 1] == '"' || beginning[inpos + 1] == '\\')) inpos++; str[outpos] = beginning[inpos]; }