]> git.sur5r.net Git - i3/i3/commitdiff
"Re-parent" floating clients whose old_parent is being closed (makes t/27 pass)
authorMichael Stapelberg <michael@stapelberg.de>
Tue, 1 Jun 2010 19:34:47 +0000 (21:34 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 1 Jun 2010 19:36:02 +0000 (21:36 +0200)
src/tree.c

index 5a3a761368c540056797fc09120358097d71d6ee..7b31ea6bd34456c9c85c1168ff92c6544c4b25c0 100644 (file)
@@ -105,12 +105,34 @@ Con *tree_open_con(Con *con) {
     return new;
 }
 
+/*
+ * vanishing is the container that is about to be closed (so any floating
+ * client which has old_parent == vanishing needs to be "re-parented").
+ *
+ */
+static void fix_floating_parent(Con *con, Con *vanishing) {
+    Con *child;
+
+    if (con->old_parent == vanishing) {
+        LOG("Fixing vanishing old_parent (%p) of container %p to be %p\n",
+                vanishing, con, vanishing->parent);
+        con->old_parent = vanishing->parent;
+    }
+
+    TAILQ_FOREACH(child, &(con->floating_head), floating_windows)
+        fix_floating_parent(child, vanishing);
+
+    TAILQ_FOREACH(child, &(con->nodes_head), nodes)
+        fix_floating_parent(child, vanishing);
+}
+
 /*
  * Closes the given container including all children
  *
  */
 void tree_close(Con *con, bool kill_window) {
-    /* TODO: check floating clients and adjust old_parent if necessary */
+    /* check floating clients and adjust old_parent if necessary */
+    fix_floating_parent(croot, con);
 
     /* Get the container which is next focused */
     Con *next;