Bugfix: Do not move focus if a container is moved across outputs

fixes 

This makes the moving behavior more consistent. If you want to focus the
workspace you are moving to, just chain the keybinding in your config
file:

    bindsym $mod+Shift+1 move workspace 1; workspace 1
This commit is contained in:
Sebastian Rachuj
2013-02-09 20:23:01 +01:00
committed by Michael Stapelberg
parent d36e2a70bf
commit b565bfca13
4 changed files with 14 additions and 62 deletions

@ -762,14 +762,9 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool
con_focus(old_focus);
}
/* 8: when moving to a visible workspace on a different output, we keep the
* con focused. Otherwise, we leave the focus on the current workspace as we
* dont want to focus invisible workspaces */
if (source_output != dest_output &&
workspace_is_visible(workspace) &&
!con_is_internal(workspace)) {
DLOG("Moved to a different output, focusing target\n");
} else {
/* 8: when moving to another workspace, we leave the focus on the current
* workspace. (see also #809) */
/* Descend focus stack in case focus_next is a workspace which can
* occur if we move to the same workspace. Also show current workspace
* to ensure it is focused. */
@ -779,7 +774,6 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool
* Otherwise we would give focus to some window on different workspace. */
if (source_ws == current_ws)
con_focus(con_descend_focused(focus_next));
}
/* If anything within the container is associated with a startup sequence,
* delete it so child windows won't be created on the old workspace. */

@ -1,46 +0,0 @@
#!perl
# vim:ts=4:sw=4:expandtab
#
# Please read the following documents before working on tests:
# • http://build.i3wm.org/docs/testsuite.html
# (or docs/testsuite)
#
# • http://build.i3wm.org/docs/lib-i3test.html
# (alternatively: perldoc ./testcases/lib/i3test.pm)
#
# • http://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)
#
# Regression test: Verify that focus is correct after moving a floating window
# to a workspace on a different visible output.
# Bug still in: 4.3-83-ge89a25f
use i3test i3_autostart => 0;
# Ensure the pointer is at (0, 0) so that we really start on the first
# (the left) workspace.
$x->root->warp_pointer(0, 0);
my $config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
fake-outputs 1024x768+0+0,1024x768+1024+0
EOT
my $pid = launch_with_config($config);
my $left_ws = fresh_workspace(output => 0);
open_window;
my $right_ws = fresh_workspace(output => 1);
open_window;
my $right_float = open_floating_window;
cmd "move workspace $left_ws";
is($x->input_focus, $right_float->id, 'floating window still focused');
exit_gracefully($pid);
done_testing;

@ -41,6 +41,7 @@ my $win = open_window;
is_num_children($left, 1, 'one container on left workspace');
cmd 'move container to output right';
cmd 'focus output right';
is_num_children($left, 0, 'no containers on left workspace');
is_num_children($right, 1, 'one container on right workspace');

@ -75,16 +75,19 @@ my ($nodes, $focus) = get_ws_content('1');
is($nodes->[0]->{window}, $win1->id, 'window 1 on workspace 1');
cmd 'move workspace next';
cmd '[id="' . $win1->id . '"] focus';
($nodes, $focus) = get_ws_content('2');
is($nodes->[1]->{window}, $win1->id, 'window 1 on workspace 2 after moving');
cmd 'move workspace prev';
cmd '[id="' . $win1->id . '"] focus';
($nodes, $focus) = get_ws_content('1');
is($nodes->[0]->{window}, $win1->id, 'window 1 on workspace 1');
cmd 'move workspace next_on_output';
cmd '[id="' . $win1->id . '"] focus';
($nodes, $focus) = get_ws_content('5');
is($nodes->[1]->{window}, $win1->id, 'window 1 on workspace 5 after moving');