return con_descend_focused(output_get_content(con->parent->parent));
}
- /* try to focus the next container on the same level as this one */
- next = TAILQ_NEXT(con, focused);
-
- /* if that was not possible, go up to its parent */
- if (next == TAILQ_END(&(parent->nodes_head)))
- next = con->parent;
+ /* if 'con' is not the first entry in the focus stack, use the first one as
+ * it’s currently focused already */
+ Con *first = TAILQ_FIRST(&(con->parent->focus_head));
+ if (first != con) {
+ DLOG("Using first entry %p\n", first);
+ next = first;
+ } else {
+ /* try to focus the next container on the same level as this one or fall
+ * back to its parent */
+ if (!(next = TAILQ_NEXT(con, focused)))
+ next = con->parent;
+ }
/* now go down the focus stack as far as
* possible, excluding the current container */
# Check if the focus is correctly restored after closing windows.
#
use i3test;
+use X11::XCB qw(:all);
use List::Util qw(first);
+my $x = X11::XCB::Connection->new;
+
my $i3 = i3("/tmp/nestedcons");
my $tmp = fresh_workspace;
my $tr = first { $_->{id} eq $right } @{$nodes->[0]->{nodes}};
is($tr->{focused}, 1, 'top right container really has focus');
+##############################################################
+# check if focus is correct after closing an unfocused window
+##############################################################
+
+$tmp = fresh_workspace;
+
+ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
+
+$first = open_empty_con($i3);
+$middle = open_empty_con($i3);
+# XXX: the $right empty con will be filled with the x11 window we are creating afterwards
+$right = open_empty_con($i3);
+my $win = open_standard_window($x, '#00ff00');
+
+cmd qq|[con_id="$middle"] focus|;
+$win->destroy;
+
+sleep 0.25;
+
+is(get_focused($tmp), $middle, 'middle container focused');
+
##############################################################
# and now for something completely different:
# check if the pointer position is relevant when restoring focus