]> git.sur5r.net Git - i3/i3/blobdiff - src/load_layout.c
Remove yajl major version conditionals
[i3/i3] / src / load_layout.c
index d0772aa398ab47a1ae2363bacf4a33dd6da3c1d7..4ba62bd25f791fa714cda5834d0f7bb42a52e699 100644 (file)
@@ -73,6 +73,17 @@ static int json_end_map(void *ctx) {
             json_node->layout = L_SPLITH;
         }
 
+        /* Sanity check: swallow criteria don’t make any sense on a split
+         * container. */
+        if (con_is_split(json_node) > 0 && !TAILQ_EMPTY(&(json_node->swallow_head))) {
+            DLOG("sanity check: removing swallows specification from split container\n");
+            while (!TAILQ_EMPTY(&(json_node->swallow_head))) {
+                Match *match = TAILQ_FIRST(&(json_node->swallow_head));
+                TAILQ_REMOVE(&(json_node->swallow_head), match, matches);
+                match_free(match);
+            }
+        }
+
         LOG("attaching\n");
         con_attach(json_node, json_node->parent, true);
         LOG("Creating window\n");
@@ -90,7 +101,12 @@ static int json_end_map(void *ctx) {
 
 static int json_end_array(void *ctx) {
     LOG("end of array\n");
-    parsing_swallows = false;
+    if (!parsing_swallows && !parsing_focus) {
+        con_fix_percent(json_node);
+    }
+    if (parsing_swallows) {
+        parsing_swallows = false;
+    }
     if (parsing_focus) {
         /* Clear the list of focus mappings */
         struct focus_mapping *mapping;
@@ -117,11 +133,7 @@ static int json_end_array(void *ctx) {
     return 1;
 }
 
-#if YAJL_MAJOR < 2
-static int json_key(void *ctx, const unsigned char *val, unsigned int len) {
-#else
 static int json_key(void *ctx, const unsigned char *val, size_t len) {
-#endif
     LOG("key: %.*s\n", (int)len, val);
     FREE(last_key);
     last_key = scalloc((len+1) * sizeof(char));
@@ -144,11 +156,7 @@ static int json_key(void *ctx, const unsigned char *val, size_t len) {
     return 1;
 }
 
-#if YAJL_MAJOR >= 2
 static int json_string(void *ctx, const unsigned char *val, size_t len) {
-#else
-static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
-#endif
     LOG("string: %.*s for key %s\n", (int)len, val, last_key);
     if (parsing_swallows) {
         char *sval;
@@ -291,13 +299,8 @@ static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
     return 1;
 }
 
-#if YAJL_MAJOR >= 2
 static int json_int(void *ctx, long long val) {
     LOG("int %lld for key %s\n", val, last_key);
-#else
-static int json_int(void *ctx, long val) {
-    LOG("int %ld for key %s\n", val, last_key);
-#endif
     /* For backwards compatibility with i3 < 4.8 */
     if (strcasecmp(last_key, "type") == 0)
         json_node->type = val;
@@ -379,8 +382,7 @@ static int json_double(void *ctx, double val) {
     return 1;
 }
 
-void tree_append_json(const char *filename) {
-    /* TODO: percent of other windows are not correctly fixed at the moment */
+void tree_append_json(Con *con, const char *filename, char **errormsg) {
     FILE *f;
     if ((f = fopen(filename, "r")) == NULL) {
         LOG("Cannot open file \"%s\"\n", filename);
@@ -402,7 +404,7 @@ void tree_append_json(const char *filename) {
     LOG("read %d bytes\n", n);
     yajl_gen g;
     yajl_handle hand;
-    yajl_callbacks callbacks = {
+    static yajl_callbacks callbacks = {
         .yajl_boolean = json_bool,
         .yajl_integer = json_int,
         .yajl_double = json_double,
@@ -412,19 +414,14 @@ void tree_append_json(const char *filename) {
         .yajl_end_map = json_end_map,
         .yajl_end_array = json_end_array,
     };
-#if YAJL_MAJOR >= 2
     g = yajl_gen_alloc(NULL);
     hand = yajl_alloc(&callbacks, NULL, (void*)g);
-#else
-    g = yajl_gen_alloc(NULL, NULL);
-    hand = yajl_alloc(&callbacks, NULL, NULL, (void*)g);
-#endif
     /* Allowing comments allows for more user-friendly layout files. */
     yajl_config(hand, yajl_allow_comments, true);
     /* Allow multiple values, i.e. multiple nodes to attach */
     yajl_config(hand, yajl_allow_multiple_values, true);
     yajl_status stat;
-    json_node = focused;
+    json_node = con;
     to_focus = NULL;
     parsing_swallows = false;
     parsing_rect = false;
@@ -437,20 +434,18 @@ 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
-         * percentages, otherwise i3 will crash immediately when rendering the
-         * next time. */
-        con_fix_percent(focused);
     }
 
+    /* In case not all containers were restored, we need to fix the
+     * percentages, otherwise i3 will crash immediately when rendering the
+     * next time. */
+    con_fix_percent(con);
+
     setlocale(LC_NUMERIC, "");
-#if YAJL_MAJOR >= 2
     yajl_complete_parse(hand);
-#else
-    yajl_parse_complete(hand);
-#endif
 
     fclose(f);
     if (to_focus)