From: Michael Stapelberg Date: Sat, 31 Jan 2015 21:40:55 +0000 (+0100) Subject: Bugfix: correctly restore workspaces regardless of where “type” is (Thanks dsargrad) X-Git-Tag: 4.9~15^2^2 X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=commitdiff_plain;h=55b5f491a469ccf47c7fdc66f3f0df86ef2e1f64 Bugfix: correctly restore workspaces regardless of where “type” is (Thanks dsargrad) fixes #1395 --- diff --git a/src/load_layout.c b/src/load_layout.c index 6fcd02df..5a66828d 100644 --- a/src/load_layout.c +++ b/src/load_layout.c @@ -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); diff --git a/testcases/t/234-layout-restore-output.t b/testcases/t/234-layout-restore-output.t index b75f4be5..d407289a 100644 --- a/testcases/t/234-layout-restore-output.t +++ b/testcases/t/234-layout-restore-output.t @@ -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;