When making floating cons tiling, re-insert next to the next focused *tiling* con (Thanks mseed)

Fixes: #337 and #350
This commit is contained in:
Michael Stapelberg 2011-03-14 23:50:29 +01:00
parent 76e978bfb3
commit b484ed5f9d
3 changed files with 38 additions and 1 deletions

View File

@ -167,6 +167,16 @@ Con *con_get_next(Con *con, char way, orientation_t orientation);
*/ */
Con *con_descend_focused(Con *con); 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 * 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 * be added to the original Rect to get the final position (obviously the

View File

@ -694,6 +694,32 @@ Con *con_descend_focused(Con *con) {
return next; 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 * 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 * be added to the original Rect to get the final position (obviously the

View File

@ -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 /* 3: re-attach to the parent of the currently focused con on the workspace
* this floating con was on */ * 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 /* if there is no other container on this workspace, focused will be the
* workspace itself */ * workspace itself */
if (focused->type == CT_WORKSPACE) if (focused->type == CT_WORKSPACE)