Bugfix: Re-attach windows in correct order when switching layout (Thanks fernandotcl)

This commit is contained in:
Michael Stapelberg 2010-11-28 01:51:16 +01:00
parent d0de3f403d
commit 3bab222aa7
4 changed files with 25 additions and 15 deletions

View File

@ -86,8 +86,12 @@ int con_num_children(Con *con);
* a container or when inserting a new container at a specific place in the * a container or when inserting a new container at a specific place in the
* tree. * tree.
* *
* ignore_focus is to just insert the Con at the end (useful when creating a
* new split container *around* some containers, that is, detaching and
* attaching them in order without wanting to mess with the focus in between).
*
*/ */
void con_attach(Con *con, Con *parent); void con_attach(Con *con, Con *parent, bool ignore_focus);
/** /**
* Detaches the given container from its current parent * Detaches the given container from its current parent

View File

@ -57,7 +57,7 @@ Con *con_new(Con *parent) {
TAILQ_INIT(&(new->swallow_head)); TAILQ_INIT(&(new->swallow_head));
if (parent != NULL) if (parent != NULL)
con_attach(new, parent); con_attach(new, parent, false);
return new; return new;
} }
@ -67,8 +67,12 @@ Con *con_new(Con *parent) {
* a container or when inserting a new container at a specific place in the * a container or when inserting a new container at a specific place in the
* tree. * tree.
* *
* ignore_focus is to just insert the Con at the end (useful when creating a
* new split container *around* some containers, that is, detaching and
* attaching them in order without wanting to mess with the focus in between).
*
*/ */
void con_attach(Con *con, Con *parent) { void con_attach(Con *con, Con *parent, bool ignore_focus) {
con->parent = parent; con->parent = parent;
Con *loop; Con *loop;
Con *current = NULL; Con *current = NULL;
@ -102,12 +106,14 @@ void con_attach(Con *con, Con *parent) {
goto add_to_focus_head; goto add_to_focus_head;
} }
/* Get the first tiling container in focus stack */ if (!ignore_focus) {
TAILQ_FOREACH(loop, &(parent->focus_head), focused) { /* Get the first tiling container in focus stack */
if (loop->type == CT_FLOATING_CON) TAILQ_FOREACH(loop, &(parent->focus_head), focused) {
continue; if (loop->type == CT_FLOATING_CON)
current = loop; continue;
break; current = loop;
break;
}
} }
/* Insert the container after the tiling container, if found */ /* Insert the container after the tiling container, if found */
@ -428,7 +434,7 @@ void con_move_to_workspace(Con *con, Con *workspace) {
DLOG("Re-attaching container to %p / %s\n", next, next->name); DLOG("Re-attaching container to %p / %s\n", next, next->name);
/* 4: re-attach the con to the parent of this focused container */ /* 4: re-attach the con to the parent of this focused container */
con_detach(con); con_detach(con);
con_attach(con, next); con_attach(con, next, false);
/* 5: keep focus on the current workspace */ /* 5: keep focus on the current workspace */
con_focus(focus_next); con_focus(focus_next);
@ -577,12 +583,12 @@ void con_set_layout(Con *con, int layout) {
while (!TAILQ_EMPTY(&(con->nodes_head))) { while (!TAILQ_EMPTY(&(con->nodes_head))) {
child = TAILQ_FIRST(&(con->nodes_head)); child = TAILQ_FIRST(&(con->nodes_head));
con_detach(child); con_detach(child);
con_attach(child, new); con_attach(child, new, true);
} }
/* 4: attach the new split container to the workspace */ /* 4: attach the new split container to the workspace */
DLOG("Attaching new split to ws\n"); DLOG("Attaching new split to ws\n");
con_attach(new, con); con_attach(new, con, false);
if (old_focused) if (old_focused)
con_focus(old_focused); con_focus(old_focused);

View File

@ -86,7 +86,7 @@ void tree_init() {
ws->num = c; ws->num = c;
asprintf(&(ws->name), "%d", c); asprintf(&(ws->name), "%d", c);
c++; c++;
con_attach(ws, oc); con_attach(ws, oc, false);
asprintf(&name, "[i3 con] workspace %s", ws->name); asprintf(&name, "[i3 con] workspace %s", ws->name);
x_set_name(ws, name); x_set_name(ws, name);
@ -269,7 +269,7 @@ void tree_split(Con *con, orientation_t orientation) {
new->orientation = orientation; new->orientation = orientation;
/* 3: add it as a child to the new Con */ /* 3: add it as a child to the new Con */
con_attach(con, new); con_attach(con, new, false);
} }
/* /*

View File

@ -59,7 +59,7 @@ Con *workspace_get(const char *num) {
else workspace->num = parsed_num; else workspace->num = parsed_num;
LOG("num = %d\n", workspace->num); LOG("num = %d\n", workspace->num);
workspace->orientation = HORIZ; workspace->orientation = HORIZ;
con_attach(workspace, output); con_attach(workspace, output, false);
ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"init\"}"); ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"init\"}");
} }