]> git.sur5r.net Git - i3/i3/commitdiff
layout restoring: append at the nearest split container (or workspace) (Thanks chris)
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 18 Apr 2014 18:30:27 +0000 (20:30 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 18 Apr 2014 18:30:27 +0000 (20:30 +0200)
Before this commit, leaf containers (such as terminal emulators) would
get children appended, which is not intended.

fixes #1223

include/load_layout.h
src/commands.c
src/load_layout.c
src/tree.c

index 0a5328fafc31f601b12a2d032b089bcf96979ea0..a598c8c64127e693d758cce463f4e1dd3e14b8a7 100644 (file)
@@ -10,4 +10,4 @@
  */
 #pragma once
 
-void tree_append_json(const char *filename, char **errormsg);
+void tree_append_json(Con *con, const char *filename, char **errormsg);
index 0f4315c1ae3f36bef814eabe3466f12bec7f122c..11d0b24469e38726aa4d57d4a9e3cde90691d864 100644 (file)
@@ -877,8 +877,16 @@ void cmd_nop(I3_CMD, char *comment) {
 void cmd_append_layout(I3_CMD, char *path) {
     LOG("Appending layout \"%s\"\n", path);
     Con *parent = focused;
+    /* We need to append the layout to a split container, since a leaf
+     * container must not have any children (by definition).
+     * Note that we explicitly check for workspaces, since they are okay for
+     * this purpose, but con_accepts_window() returns false for workspaces. */
+    while (parent->type != CT_WORKSPACE && !con_accepts_window(parent))
+        parent = parent->parent;
+    DLOG("Appending to parent=%p instead of focused=%p\n",
+         parent, focused);
     char *errormsg = NULL;
-    tree_append_json(path, &errormsg);
+    tree_append_json(parent, path, &errormsg);
     if (errormsg != NULL) {
         yerror(errormsg);
         free(errormsg);
index 627c1f6eb1bdc46efa79e6c27f5aa4af6d99d51a..cebb1930304fa8affb9376e37ba93008038bcd47 100644 (file)
@@ -395,7 +395,7 @@ static int json_double(void *ctx, double val) {
     return 1;
 }
 
-void tree_append_json(const char *filename, char **errormsg) {
+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);
@@ -439,7 +439,7 @@ void tree_append_json(const char *filename, char **errormsg) {
     /* 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;
@@ -460,7 +460,7 @@ void tree_append_json(const char *filename, char **errormsg) {
     /* 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);
+    con_fix_percent(con);
 
     setlocale(LC_NUMERIC, "");
 #if YAJL_MAJOR >= 2
index 80af522317a543deb0059d22e7534db26e46664c..d4936299b259e97e506cd12d3e9cad2fc3a2757d 100644 (file)
@@ -84,7 +84,7 @@ bool tree_restore(const char *path, xcb_get_geometry_reply_t *geometry) {
     };
     focused = croot;
 
-    tree_append_json(globbed, NULL);
+    tree_append_json(focused, globbed, NULL);
 
     printf("appended tree, using new root\n");
     croot = TAILQ_FIRST(&(croot->nodes_head));