Fix focus order issues when encapsulating workspaces

See new tests for an explanation of the problem.
This commit is contained in:
Orestis Floros
2017-12-13 16:15:01 +02:00
parent dc2363a665
commit cb73fd5e31
4 changed files with 125 additions and 19 deletions

View File

@ -815,9 +815,9 @@ void ws_force_orientation(Con *ws, orientation_t orientation) {
/* 2: copy layout from workspace */
split->layout = ws->layout;
Con *old_focused = TAILQ_FIRST(&(ws->focus_head));
/* 3: move the existing cons of this workspace below the new con */
Con **focus_order = get_focus_order(ws);
DLOG("Moving cons\n");
while (!TAILQ_EMPTY(&(ws->nodes_head))) {
Con *child = TAILQ_FIRST(&(ws->nodes_head));
@ -825,6 +825,9 @@ void ws_force_orientation(Con *ws, orientation_t orientation) {
con_attach(child, split, true);
}
set_focus_order(split, focus_order);
free(focus_order);
/* 4: switch workspace layout */
ws->layout = (orientation == HORIZ) ? L_SPLITH : L_SPLITV;
DLOG("split->layout = %d, ws->layout = %d\n", split->layout, ws->layout);
@ -835,9 +838,6 @@ void ws_force_orientation(Con *ws, orientation_t orientation) {
/* 6: fix the percentages */
con_fix_percent(ws);
if (old_focused)
con_activate(old_focused);
}
/*
@ -892,9 +892,10 @@ Con *workspace_encapsulate(Con *ws) {
new->parent = ws;
new->layout = ws->layout;
Con **focus_order = get_focus_order(ws);
DLOG("Moving children of workspace %p / %s into container %p\n",
ws, ws->name, new);
Con *child;
while (!TAILQ_EMPTY(&(ws->nodes_head))) {
child = TAILQ_FIRST(&(ws->nodes_head));
@ -902,6 +903,9 @@ Con *workspace_encapsulate(Con *ws) {
con_attach(child, new, true);
}
set_focus_order(new, focus_order);
free(focus_order);
con_attach(new, ws, true);
return new;