]> git.sur5r.net Git - i3/i3/commitdiff
return parse errors via IPC for append_layout
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 4 Jan 2014 20:39:13 +0000 (21:39 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 4 Jan 2014 20:39:13 +0000 (21:39 +0100)
include/load_layout.h
src/commands.c
src/load_layout.c
src/tree.c

index 2458736f8e671d7ad1c4047a01d048607c5f2d3b..0a5328fafc31f601b12a2d032b089bcf96979ea0 100644 (file)
@@ -10,4 +10,4 @@
  */
 #pragma once
 
-void tree_append_json(const char *filename);
+void tree_append_json(const char *filename, char **errormsg);
index d8eff106f59e318894d5bac80308751ad6c9d901..7ad3aba013d0c7cbe9900ea4cf8b50af99ad4dab 100644 (file)
@@ -869,7 +869,18 @@ void cmd_nop(I3_CMD, char *comment) {
 void cmd_append_layout(I3_CMD, char *path) {
     LOG("Appending layout \"%s\"\n", path);
     Con *parent = focused;
-    tree_append_json(path);
+    char *errormsg = NULL;
+    tree_append_json(path, &errormsg);
+    if (errormsg != NULL) {
+        yerror(errormsg);
+        free(errormsg);
+        /* Note that we continue executing since tree_append_json() has
+         * side-effects — user-provided layouts can be partly valid, partly
+         * invalid, leading to half of the placeholder containers being
+         * created. */
+    } else {
+        ysuccess(true);
+    }
 
     // XXX: This is a bit of a kludge. Theoretically, render_con(parent,
     // false); should be enough, but when sending 'workspace 4; append_layout
@@ -882,8 +893,6 @@ void cmd_append_layout(I3_CMD, char *path) {
     restore_open_placeholder_windows(parent);
 
     cmd_output->needs_tree_render = true;
-    // XXX: default reply for now, make this a better reply
-    ysuccess(true);
 }
 
 /*
index fe21ee81d4f6578885f38c6c38fd33ea6f393d2b..c95bc99fd550688ec4f1e9389cbd83a3c69dddf5 100644 (file)
@@ -384,7 +384,7 @@ static int json_double(void *ctx, double val) {
     return 1;
 }
 
-void tree_append_json(const char *filename) {
+void tree_append_json(const char *filename, char **errormsg) {
     FILE *f;
     if ((f = fopen(filename, "r")) == NULL) {
         LOG("Cannot open file \"%s\"\n", filename);
@@ -441,6 +441,8 @@ void tree_append_json(const char *filename) {
     {
         unsigned char *str = yajl_get_error(hand, 1, (const unsigned char*)buf, n);
         ELOG("JSON parsing error: %s\n", str);
+        if (errormsg != NULL)
+            *errormsg = sstrdup((const char*)str);
         yajl_free_error(hand, str);
 
         /* In case not all containers were restored, we need to fix the
index 836183ec114439aa2b5c6cac9092abd3b095dd4d..046d0b4c18caec263fd41f84ae70380c7e5ced55 100644 (file)
@@ -84,7 +84,7 @@ bool tree_restore(const char *path, xcb_get_geometry_reply_t *geometry) {
     };
     focused = croot;
 
-    tree_append_json(globbed);
+    tree_append_json(globbed, NULL);
 
     printf("appended tree, using new root\n");
     croot = TAILQ_FIRST(&(croot->nodes_head));