Bugfix: correctly restore workspaces regardless of where “type” is (Thanks dsargrad)

fixes #1395
This commit is contained in:
Michael Stapelberg 2015-01-31 22:40:55 +01:00
parent f13fa1e37a
commit 55b5f491a4
2 changed files with 67 additions and 2 deletions

View 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);

View 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;