From d4238c778a199ad88ebe8540904d98f81f110621 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 7 Jan 2012 18:50:00 +0000 Subject: [PATCH] Bugfix: Open new windows in the correct place when assignments match (+test) (Thanks Don) --- src/con.c | 6 ++- testcases/t/186-regress-assign-focus-parent.t | 51 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 testcases/t/186-regress-assign-focus-parent.t diff --git a/src/con.c b/src/con.c index bf22be84..c901c18d 100644 --- a/src/con.c +++ b/src/con.c @@ -808,7 +808,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; } @@ -825,6 +825,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) { @@ -834,7 +836,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;