]> git.sur5r.net Git - i3/i3/commitdiff
Ensure config variables match on longest-length (#2306)
authorKyle Kneitinger <kylejkneitinger@gmail.com>
Tue, 26 Apr 2016 07:20:42 +0000 (00:20 -0700)
committerMichael Stapelberg <stapelberg@users.noreply.github.com>
Tue, 26 Apr 2016 07:20:42 +0000 (08:20 +0100)
fixes #2235

src/config_parser.c
testcases/t/183-config-variables.t

index e97a37e1dce4a7ddce1bc6f8ed0cf89165480ef0..5ee69e8d170388c830c6347aa7881dd7a8dcd217 100644 (file)
@@ -879,9 +879,23 @@ bool parse_file(const char *f, bool use_nagbar) {
                 v_value++;
 
             struct Variable *new = scalloc(1, sizeof(struct Variable));
+            struct Variable *test = NULL, *loc = NULL;
             new->key = sstrdup(v_key);
             new->value = sstrdup(v_value);
-            SLIST_INSERT_HEAD(&variables, new, variables);
+            /* ensure that the correct variable is matched in case of one being
+             * the prefix of another */
+            SLIST_FOREACH(test, &variables, variables) {
+                if (strlen(new->key) >= strlen(test->key))
+                    break;
+                loc = test;
+            }
+
+            if (loc == NULL) {
+                SLIST_INSERT_HEAD(&variables, new, variables);
+            } else {
+                SLIST_INSERT_AFTER(loc, new, variables);
+            }
+
             DLOG("Got new variable %s = %s\n", v_key, v_value);
             continue;
         }
index 8fbbff70b00c74e17a607d2bd72335fcd2bccbf2..65f166794dce4534736e70d1a76e4ebad5b22875 100644 (file)
@@ -79,6 +79,22 @@ EOT
 
 is(launch_get_border($config), 'none', 'no border');
 
+#####################################################################
+# test that longest matching variable name is substituted
+#####################################################################
+
+$config = <<'EOT';
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+set $var normal title
+set $vartest special title
+set $vart mundane title
+for_window [title="$vartest"] border none
+EOT
+
+is(launch_get_border($config), 'none', 'no border');
+
 
 
 done_testing;