]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: correctly restore workspaces regardless of where “type” is (Thanks dsargrad)
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 31 Jan 2015 21:40:55 +0000 (22:40 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 31 Jan 2015 21:42:47 +0000 (22:42 +0100)
fixes #1395

src/load_layout.c
testcases/t/234-layout-restore-output.t

index 6fcd02df99d1972fe432ed6e7a91ab51141b2362..5a66828d26eaab0233a5d3e7c6006a947b52dd97 100644 (file)
@@ -427,9 +427,20 @@ static int json_double(void *ctx, double val) {
 }
 
 static json_content_t content_result;
+static int content_level;
+
+static int json_determine_content_deeper(void *ctx) {
+    content_level++;
+    return 1;
+}
+
+static int json_determine_content_shallower(void *ctx) {
+    content_level--;
+    return 1;
+}
 
 static int json_determine_content_string(void *ctx, const unsigned char *val, size_t len) {
-    if (strcasecmp(last_key, "type") != 0)
+    if (strcasecmp(last_key, "type") != 0 || content_level > 1)
         return 1;
 
     DLOG("string = %.*s, last_key = %s\n", (int)len, val, last_key);
@@ -465,11 +476,16 @@ json_content_t json_determine_content(const char *filename) {
     // We default to JSON_CONTENT_CON because it is legal to not include
     // “"type": "con"” in the JSON files for better readability.
     content_result = JSON_CONTENT_CON;
+    content_level = 0;
     yajl_gen g;
     yajl_handle hand;
     static yajl_callbacks callbacks = {
         .yajl_string = json_determine_content_string,
         .yajl_map_key = json_key,
+        .yajl_start_array = json_determine_content_deeper,
+        .yajl_start_map = json_determine_content_deeper,
+        .yajl_end_map = json_determine_content_shallower,
+        .yajl_end_array = json_determine_content_shallower,
     };
     g = yajl_gen_alloc(NULL);
     hand = yajl_alloc(&callbacks, NULL, (void *)g);
index b75f4be5e585bbedf6d20fbd6a2c33c208f27671..d407289aea8f61e060b642a05e65f624e65219eb 100644 (file)
@@ -180,7 +180,56 @@ $fh->flush;
 cmd "append_layout $filename";
 
 ok(workspace_exists('4'), 'workspace "4" exists now');
-my $ws = get_ws("4");
+$ws = get_ws("4");
 is($ws->{num}, 4, 'workspace number is 4');
 
+################################################################################
+# Append a workspace with a numeric name, with the “type” property at the end
+# of the JSON blurb (which is valid and sometimes happens).
+################################################################################
+
+ok(!workspace_exists('5'), 'workspace "5" does not exist yet');
+
+($fh, $filename) = tempfile(UNLINK => 1);
+print $fh <<'EOT';
+// vim:ts=4:sw=4:et
+{
+    // workspace with 1 children
+    "border": "pixel",
+    "floating": "auto_off",
+    "layout": "splith",
+    "percent": null,
+    "name": "5",
+    "nodes": [
+        {
+            "border": "pixel",
+            "floating": "auto_off",
+            "geometry": {
+               "height": 268,
+               "width": 484,
+               "x": 0,
+               "y": 0
+            },
+            "name": "vals@w00t: ~",
+            "percent": 1,
+            "swallows": [
+               {
+               // "class": "^URxvt$",
+               // "instance": "^urxvt$",
+               // "title": "^vals\\@w00t\\:\\ \\~$"
+               }
+            ],
+            "type": "con"
+        }
+    ],
+    "type": "workspace"
+}
+EOT
+$fh->flush;
+cmd "append_layout $filename";
+
+ok(workspace_exists('5'), 'workspace "5" exists now');
+$ws = get_ws("5");
+is($ws->{num}, 5, 'workspace number is 5');
+
 done_testing;