From 37106aa84b18d74e556acf6ab1a03ebaa385136a Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Sun, 25 Mar 2018 14:25:20 +0300 Subject: [PATCH] Prefer fullscreen floating containers when on directional focus Fixes #3201 --- src/tree.c | 13 ++++-- ...regress-focus-behind-fullscreen-floating.t | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 testcases/t/296-regress-focus-behind-fullscreen-floating.t diff --git a/src/tree.c b/src/tree.c index 6c6a614e..96766b6a 100644 --- a/src/tree.c +++ b/src/tree.c @@ -567,9 +567,16 @@ static bool _tree_next(Con *con, char way, orientation_t orientation, bool wrap) if (!workspace) return false; - Con *focus = con_descend_tiling_focused(workspace); - if (focus == workspace) { - focus = con_descend_focused(workspace); + /* Use descend_focused first to give higher priority to floating or + * tiling fullscreen containers. */ + Con *focus = con_descend_focused(workspace); + if (focus->fullscreen_mode == CF_NONE) { + Con *focus_tiling = con_descend_tiling_focused(workspace); + /* If descend_tiling returned a workspace then focus is either a + * floating container or the same workspace. */ + if (focus_tiling != workspace) { + focus = focus_tiling; + } } workspace_show(workspace); diff --git a/testcases/t/296-regress-focus-behind-fullscreen-floating.t b/testcases/t/296-regress-focus-behind-fullscreen-floating.t new file mode 100644 index 00000000..0867f082 --- /dev/null +++ b/testcases/t/296-regress-focus-behind-fullscreen-floating.t @@ -0,0 +1,40 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Please read the following documents before working on tests: +# • https://build.i3wm.org/docs/testsuite.html +# (or docs/testsuite) +# +# • https://build.i3wm.org/docs/lib-i3test.html +# (alternatively: perldoc ./testcases/lib/i3test.pm) +# +# • https://build.i3wm.org/docs/ipc.html +# (or docs/ipc) +# +# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf +# (unless you are already familiar with Perl) +# +# Test that directional focus gives focus to floating fullscreen containers when +# switching workspaces. +# Ticket: #3201 +# Bug still in: 4.15-59-gb849fe3e +use i3test i3_config => < 0); +my $ws = fresh_workspace(output => 1); +open_window; +open_floating_window; +cmd 'fullscreen enable'; +my $expected_focus = get_focused($ws); + +cmd 'focus left'; +cmd 'focus right'; + +is (get_focused($ws), $expected_focus, 'floating fullscreen window focused after directional focus'); + +done_testing;