diff --git a/src/tree.c b/src/tree.c index 8681a3b9..7a5fb9f0 100644 --- a/src/tree.c +++ b/src/tree.c @@ -356,6 +356,10 @@ void tree_split(Con *con, orientation_t orientation) { con->layout = (orientation == HORIZ) ? L_SPLITH : L_SPLITV; return; } + else if (con->type == CT_FLOATING_CON) { + DLOG("Floating containers can't be split.\n"); + return; + } Con *parent = con->parent; @@ -396,9 +400,15 @@ void tree_split(Con *con, orientation_t orientation) { * */ bool level_up(void) { + /* Skip over floating containers and go directly to the grandparent + * (which should always be a workspace) */ + if (focused->parent->type == CT_FLOATING_CON) { + con_focus(focused->parent->parent); + return true; + } + /* We can focus up to the workspace, but not any higher in the tree */ if ((focused->parent->type != CT_CON && - focused->parent->type != CT_FLOATING_CON && focused->parent->type != CT_WORKSPACE) || focused->type == CT_WORKSPACE) { ELOG("'focus parent': Focus is already on the workspace, cannot go higher than that.\n"); @@ -416,9 +426,21 @@ bool level_down(void) { /* Go down the focus stack of the current node */ Con *next = TAILQ_FIRST(&(focused->focus_head)); if (next == TAILQ_END(&(focused->focus_head))) { - printf("cannot go down\n"); + DLOG("cannot go down\n"); return false; } + else if (next->type == CT_FLOATING_CON) { + /* Floating cons shouldn't be directly focused; try immediately + * going to the grandchild of the focused con. */ + Con *child = TAILQ_FIRST(&(next->focus_head)); + if (child == TAILQ_END(&(next->focus_head))) { + DLOG("cannot go down\n"); + return false; + } + else + next = TAILQ_FIRST(&(next->focus_head)); + } + con_focus(next); return true; } diff --git a/testcases/t/135-floating-focus.t b/testcases/t/135-floating-focus.t index f38a1472..f23dabae 100644 --- a/testcases/t/135-floating-focus.t +++ b/testcases/t/135-floating-focus.t @@ -197,4 +197,23 @@ cmd 'focus right'; is($x->input_focus, $second->id, 'focus on second container'); +############################################################################# +# 7: verify that focusing the parent of a window inside a floating con goes +# up to the grandparent (workspace) and that focusing child from the ws +# goes back down to the child of the floating con +############################################################################# + +$tmp = fresh_workspace; + +my $tiled = open_window; +my $floating = open_floating_window; +is($x->input_focus, $floating->id, 'floating window focused'); + +cmd 'focus parent'; + +is(get_ws($tmp)->{focused}, 1, 'workspace is focused'); +cmd 'focus child'; + +is($x->input_focus, $floating->id, 'floating window focused'); + done_testing;