Bugfix: Re-attach windows in correct order when switching layout (Thanks fernandotcl)
This commit is contained in:
parent
d0de3f403d
commit
3bab222aa7
|
@ -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
|
||||||
|
|
28
src/con.c
28
src/con.c
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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\"}");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue