diff --git a/include/con.h b/include/con.h index 8ffa7ce2..1dd65a6e 100644 --- a/include/con.h +++ b/include/con.h @@ -167,6 +167,16 @@ Con *con_get_next(Con *con, char way, orientation_t orientation); */ Con *con_descend_focused(Con *con); +/** + * Returns the focused con inside this client, descending the tree as far as + * possible. This comes in handy when attaching a con to a workspace at the + * currently focused position, for example. + * + * Works like con_descend_focused but considers only tiling cons. + * + */ +Con *con_descend_tiling_focused(Con *con); + /** * Returns a "relative" Rect which contains the amount of pixels that need to * be added to the original Rect to get the final position (obviously the diff --git a/src/con.c b/src/con.c index 0ed4436a..04db250b 100644 --- a/src/con.c +++ b/src/con.c @@ -694,6 +694,32 @@ Con *con_descend_focused(Con *con) { return next; } +/* + * Returns the focused con inside this client, descending the tree as far as + * possible. This comes in handy when attaching a con to a workspace at the + * currently focused position, for example. + * + * Works like con_descend_focused but considers only tiling cons. + * + */ +Con *con_descend_tiling_focused(Con *con) { + Con *next = con; + Con *before; + Con *child; + do { + before = next; + TAILQ_FOREACH(child, &(next->focus_head), focused) { + if (child->type == CT_FLOATING_CON) + continue; + + next = child; + break; + } + } while (before != next); + return next; +} + + /* * Returns a "relative" Rect which contains the amount of pixels that need to * be added to the original Rect to get the final position (obviously the diff --git a/src/floating.c b/src/floating.c index fe878f75..ef500bf6 100644 --- a/src/floating.c +++ b/src/floating.c @@ -175,7 +175,8 @@ void floating_disable(Con *con, bool automatic) { /* 3: re-attach to the parent of the currently focused con on the workspace * this floating con was on */ - Con *focused = con_descend_focused(con_get_workspace(con)); + Con *focused = con_descend_tiling_focused(con_get_workspace(con)); + /* if there is no other container on this workspace, focused will be the * workspace itself */ if (focused->type == CT_WORKSPACE)