Merge pull request #2980 from orestisf1993/issue-1160-pr
Use con_descend_focused for workspaces in _tree_next
This commit is contained in:
commit
c207921949
17
src/tree.c
17
src/tree.c
|
@ -560,21 +560,10 @@ static bool _tree_next(Con *con, char way, orientation_t orientation, bool wrap)
|
||||||
if (!workspace)
|
if (!workspace)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
workspace_show(workspace);
|
Con *focus = con_descend_tiling_focused(workspace);
|
||||||
|
if (focus == workspace) {
|
||||||
/* If a workspace has an active fullscreen container, one of its
|
|
||||||
* children should always be focused. The above workspace_show()
|
|
||||||
* should be adequate for that, so return. */
|
|
||||||
if (con_get_fullscreen_con(workspace, CF_OUTPUT))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
Con *focus = con_descend_direction(workspace, direction);
|
|
||||||
|
|
||||||
/* special case: if there was no tiling con to focus and the workspace
|
|
||||||
* has a floating con in the focus stack, focus the top of the focus
|
|
||||||
* stack (which may be floating) */
|
|
||||||
if (focus == workspace)
|
|
||||||
focus = con_descend_focused(workspace);
|
focus = con_descend_focused(workspace);
|
||||||
|
}
|
||||||
|
|
||||||
if (focus) {
|
if (focus) {
|
||||||
con_focus(focus);
|
con_focus(focus);
|
||||||
|
|
|
@ -92,7 +92,7 @@ reset_focus $s3_ws;
|
||||||
|
|
||||||
cmd "workspace $s2_ws";
|
cmd "workspace $s2_ws";
|
||||||
cmd 'focus right';
|
cmd 'focus right';
|
||||||
is($x->input_focus, $sixth->id, 'sixth window focused');
|
is($x->input_focus, $seventh->id, 'seventh window focused');
|
||||||
reset_focus $s3_ws;
|
reset_focus $s3_ws;
|
||||||
|
|
||||||
cmd "workspace $s2_ws";
|
cmd "workspace $s2_ws";
|
||||||
|
@ -110,6 +110,8 @@ is($x->input_focus, $third->id, 'third window focused');
|
||||||
cmd 'focus parent';
|
cmd 'focus parent';
|
||||||
cmd 'focus parent';
|
cmd 'focus parent';
|
||||||
cmd 'split v';
|
cmd 'split v';
|
||||||
|
# Focus second or else $first gets to the top of the focus stack.
|
||||||
|
cmd '[id=' . $second->id . '] focus';
|
||||||
reset_focus $s0_ws;
|
reset_focus $s0_ws;
|
||||||
|
|
||||||
cmd "workspace $s3_ws";
|
cmd "workspace $s3_ws";
|
||||||
|
@ -137,4 +139,96 @@ cmd "workspace $s2_ws";
|
||||||
cmd 'focus up';
|
cmd 'focus up';
|
||||||
is($x->input_focus, $second->id, 'second window focused');
|
is($x->input_focus, $second->id, 'second window focused');
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
# Test that focus (left|down|right|up), when focusing across
|
||||||
|
# outputs, doesn't focus the next window in the given direction but
|
||||||
|
# the most focused window of the container in the given direction.
|
||||||
|
# In the following layout:
|
||||||
|
# [ WS1*[ ] WS2[ H[ A B* ] ] ]
|
||||||
|
# (where the asterisk denotes the focused container within its
|
||||||
|
# parent) moving right from WS1 should focus B which is focused
|
||||||
|
# inside WS2, not A which is the next window on the right of WS1.
|
||||||
|
# See issue #1160.
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
kill_all_windows;
|
||||||
|
|
||||||
|
sync_with_i3;
|
||||||
|
$x->root->warp_pointer(1025, 0); # Second screen.
|
||||||
|
sync_with_i3;
|
||||||
|
$s1_ws = fresh_workspace;
|
||||||
|
$first = open_window;
|
||||||
|
$second = open_window;
|
||||||
|
|
||||||
|
sync_with_i3;
|
||||||
|
$x->root->warp_pointer(0, 0); # First screen.
|
||||||
|
sync_with_i3;
|
||||||
|
$s0_ws = fresh_workspace;
|
||||||
|
open_window;
|
||||||
|
$third = open_window;
|
||||||
|
|
||||||
|
cmd 'focus right';
|
||||||
|
is($x->input_focus, $second->id, 'second window (rightmost) focused');
|
||||||
|
cmd 'focus left';
|
||||||
|
is($x->input_focus, $first->id, 'first window focused');
|
||||||
|
cmd 'focus left';
|
||||||
|
is($x->input_focus, $third->id, 'third window focused');
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
# Similar but with a tabbed layout.
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
cmd 'layout tabbed';
|
||||||
|
$fourth = open_window;
|
||||||
|
cmd 'focus left';
|
||||||
|
is($x->input_focus, $third->id, 'third window (tabbed) focused');
|
||||||
|
cmd "workspace $s1_ws";
|
||||||
|
cmd 'focus left';
|
||||||
|
is($x->input_focus, $third->id, 'third window (tabbed) focused');
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
# Similar but with a stacked layout on the bottom screen.
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
sync_with_i3;
|
||||||
|
$x->root->warp_pointer(0, 769); # Third screen.
|
||||||
|
sync_with_i3;
|
||||||
|
$s2_ws = fresh_workspace;
|
||||||
|
cmd 'layout stacked';
|
||||||
|
$fifth = open_window;
|
||||||
|
$sixth = open_window;
|
||||||
|
|
||||||
|
cmd "workspace $s0_ws";
|
||||||
|
cmd 'focus down';
|
||||||
|
is($x->input_focus, $sixth->id, 'sixth window (stacked) focused');
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
# Similar but with a more complex layout.
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
sync_with_i3;
|
||||||
|
$x->root->warp_pointer(1025, 769); # Fourth screen.
|
||||||
|
sync_with_i3;
|
||||||
|
$s3_ws = fresh_workspace;
|
||||||
|
open_window;
|
||||||
|
open_window;
|
||||||
|
cmd 'split v';
|
||||||
|
open_window;
|
||||||
|
open_window;
|
||||||
|
cmd 'split h';
|
||||||
|
my $nested = open_window;
|
||||||
|
open_window;
|
||||||
|
cmd 'focus left';
|
||||||
|
is($x->input_focus, $nested->id, 'nested window focused');
|
||||||
|
|
||||||
|
cmd "workspace $s1_ws";
|
||||||
|
cmd 'focus down';
|
||||||
|
is($x->input_focus, $nested->id, 'nested window focused from workspace above');
|
||||||
|
|
||||||
|
cmd "workspace $s2_ws";
|
||||||
|
cmd 'focus right';
|
||||||
|
is($x->input_focus, $nested->id, 'nested window focused from workspace on the left');
|
||||||
|
|
||||||
done_testing;
|
done_testing;
|
||||||
|
|
Loading…
Reference in New Issue