diff --git a/src/con.c b/src/con.c index f90d569f..ded8d7bf 100644 --- a/src/con.c +++ b/src/con.c @@ -810,7 +810,7 @@ Con *con_get_next(Con *con, char way, orientation_t orientation) { */ Con *con_descend_focused(Con *con) { Con *next = con; - while (!TAILQ_EMPTY(&(next->focus_head))) + while (next != focused && !TAILQ_EMPTY(&(next->focus_head))) next = TAILQ_FIRST(&(next->focus_head)); return next; } @@ -827,6 +827,8 @@ Con *con_descend_tiling_focused(Con *con) { Con *next = con; Con *before; Con *child; + if (next == focused) + return next; do { before = next; TAILQ_FOREACH(child, &(next->focus_head), focused) { @@ -836,7 +838,7 @@ Con *con_descend_tiling_focused(Con *con) { next = child; break; } - } while (before != next); + } while (before != next && next != focused); return next; } diff --git a/testcases/t/186-regress-assign-focus-parent.t b/testcases/t/186-regress-assign-focus-parent.t new file mode 100644 index 00000000..6f2e584f --- /dev/null +++ b/testcases/t/186-regress-assign-focus-parent.t @@ -0,0 +1,51 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Regression test: New windows were not opened in the correct place if they +# matched an assignment. +# Wrong behaviour manifested itself up to (including) commit +# f78caf8c5815ae7a66de9e4b734546fd740cc19d +# +use i3test i3_autostart => 0; + +my $config = < "testcase"); + +my $nodes = get_ws_content('targetws'); +is(scalar @$nodes, 1, 'precisely one window'); + +open_window(name => "testcase"); + +$nodes = get_ws_content('targetws'); +is(scalar @$nodes, 2, 'precisely two windows'); + +cmd 'split v'; + +open_window(name => "testcase"); + +$nodes = get_ws_content('targetws'); +is(scalar @$nodes, 2, 'still two windows'); + +# focus parent. the new window should now be opened right next to the last one. +cmd 'focus parent'; + +open_window(name => "testcase"); + +$nodes = get_ws_content('targetws'); +is(scalar @$nodes, 3, 'new window opened next to last one'); + +exit_gracefully($pid); + +done_testing;