]> git.sur5r.net Git - i3/i3/commitdiff
Allow escaping backslashes
authorshdown <shdownnine@gmail.com>
Wed, 25 Mar 2015 18:30:38 +0000 (21:30 +0300)
committershdown <shdownnine@gmail.com>
Wed, 25 Mar 2015 18:32:46 +0000 (21:32 +0300)
Fixes #1577.

i3bar/src/xcb.c
src/commands_parser.c

index 3360485a477368133cf16ebb3b2fb3a62d89c473..c9f8e6cb35e81ac7e3bf9e7fd1c68c9684d4547a 100644 (file)
@@ -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++;
         }
index f325a048afc6ebf6859ee81347fafd7c8dc4de28..fa4c2360101513e4796490c9720ff9b63533915f 100644 (file)
@@ -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];
     }