From 0ce62a755e6cca9827e10d18130d10225dc96daf Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 1 Jun 2010 21:34:47 +0200 Subject: [PATCH] "Re-parent" floating clients whose old_parent is being closed (makes t/27 pass) --- src/tree.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/tree.c b/src/tree.c index 5a3a7613..7b31ea6b 100644 --- a/src/tree.c +++ b/src/tree.c @@ -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;