]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: don’t kill parent when currently in tree_close() for a child of this parent
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Nov 2010 19:14:09 +0000 (20:14 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Nov 2010 19:14:09 +0000 (20:14 +0100)
include/tree.h
src/cmdparse.y
src/floating.c
src/handlers.c
src/tree.c
src/workspace.c

index 449f67efc34923ab36fed4b73cc9bde6d377ecb5..f04e9e62b80c328abf6ffc137df391298c436f4f 100644 (file)
@@ -76,7 +76,7 @@ void tree_move(char way, orientation_t orientation);
  * Closes the given container including all children
  *
  */
-void tree_close(Con *con, bool kill_window);
+void tree_close(Con *con, bool kill_window, bool dont_kill_parent);
 
 /**
  * Loads tree from ~/.i3/_restart.json (used for in-place restarts).
index e5c9aa5c9180783d775d3268e2506901feaddd1c..7f9dfd46c2d411d6ccdb0c269e1066507d0d851b 100644 (file)
@@ -382,7 +382,7 @@ kill:
         else {
             TAILQ_FOREACH(current, &owindows, owindows) {
                 printf("matching: %p / %s\n", current->con, current->con->name);
-                tree_close(current->con, true);
+                tree_close(current->con, true, false);
             }
         }
 
index 756102b7afe67fef59660087ad4a7eb6c7462d00..005f2092c48fffd420c5a523975bcb1f6cff4dc7 100644 (file)
@@ -95,7 +95,7 @@ void floating_disable(Con *con, bool automatic) {
     /* 2: kill parent container */
     TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows);
     TAILQ_REMOVE(&(con->parent->parent->focus_head), con->parent, focused);
-    tree_close(con->parent, false);
+    tree_close(con->parent, false, false);
 
     /* 3: re-attach to previous parent */
     con->parent = con->old_parent;
index 72cc68c536ce4349290446410065f4823189cc55..f5324dfe24b33df7fae7a4afd9a55abf6fb9b677 100644 (file)
@@ -436,7 +436,7 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
         return 1;
     }
 
-    tree_close(con, false);
+    tree_close(con, false, false);
     tree_render();
     x_push_changes(croot);
     return 1;
index f7f7a759ff637c4d824e4121b3881c8035a1f1bb..3f8609231192465de125cc47092ae299c9071d2b 100644 (file)
@@ -143,7 +143,7 @@ static void fix_floating_parent(Con *con, Con *vanishing) {
  * Closes the given container including all children
  *
  */
-void tree_close(Con *con, bool kill_window) {
+void tree_close(Con *con, bool kill_window, bool dont_kill_parent) {
     Con *parent = con->parent;
 
     /* check floating clients and adjust old_parent if necessary */
@@ -158,7 +158,8 @@ void tree_close(Con *con, bool kill_window) {
      * in their parent’s nodes_head */
     while (!TAILQ_EMPTY(&(con->nodes_head))) {
         child = TAILQ_FIRST(&(con->nodes_head));
-        tree_close(child, kill_window);
+        DLOG("killing child=%p\n", child);
+        tree_close(child, kill_window, true);
     }
 
     if (con->window != NULL) {
@@ -199,12 +200,13 @@ void tree_close(Con *con, bool kill_window) {
     con_focus(next);
 
     /* check if the parent container is empty now and close it */
-    if (parent->type != CT_WORKSPACE &&
+    if (!dont_kill_parent &&
+        parent->type != CT_WORKSPACE &&
         TAILQ_EMPTY(&(parent->nodes_head))) {
         DLOG("Closing empty parent container\n");
         /* TODO: check if this container would swallow any other client and
          * don’t close it automatically. */
-        tree_close(parent, false);
+        tree_close(parent, false, false);
     }
 }
 
@@ -220,7 +222,7 @@ void tree_close_con() {
     }
 
     /* Kill con */
-    tree_close(focused, true);
+    tree_close(focused, true, false);
 }
 
 /*
@@ -443,6 +445,6 @@ void tree_move(char way, orientation_t orientation) {
 
     if (con_num_children(old_parent) == 0) {
         DLOG("Old container empty after moving. Let's close it\n");
-        tree_close(old_parent, false);
+        tree_close(old_parent, false, false);
     }
 }
index d98c7562aded0a80f8d0b6b6fae80d7f365d7b93..cdea982750e9154acbadd275b95475ba0c1e5910 100644 (file)
@@ -209,7 +209,7 @@ void workspace_show(const char *num) {
         /* check if this workspace is currently visible */
         if (!workspace_is_visible(old)) {
             LOG("Closing old workspace (%p / %s), it is empty\n", old, old->name);
-            tree_close(old, false);
+            tree_close(old, false, false);
         }
     }