]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Do not move focus if a container is moved across outputs
authorSebastian Rachuj <rachus@web.de>
Sat, 9 Feb 2013 19:23:01 +0000 (20:23 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 10 Feb 2013 16:38:17 +0000 (17:38 +0100)
fixes #809

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

src/con.c
testcases/t/508-move-workspace-focus.t [deleted file]
testcases/t/512-move-wraps.t
testcases/t/513-move-workspace.t

index 70c7d7f5a6cf8f7d07638f87376e61d9501afb18..c1e4f593e81213e62b116282b2d8404733c1a110 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -762,24 +762,18 @@ 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
-     * don’t 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 {
-        /* 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. */
-        workspace_show(current_ws);
-
-        /* Set focus only if con was on current workspace before moving.
-         * Otherwise we would give focus to some window on different workspace. */
-        if (source_ws == current_ws)
+    /* 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. */
+    workspace_show(current_ws);
+
+    /* Set focus only if con was on current workspace before moving.
+     * 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. */
diff --git a/testcases/t/508-move-workspace-focus.t b/testcases/t/508-move-workspace-focus.t
deleted file mode 100644 (file)
index 7d42ff4..0000000
+++ /dev/null
@@ -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;
index d3952e4e6bd975089a8344134edfe106394bf450..82d5a7ccf6355fec34a45d57fae0362c44e9cede 100644 (file)
@@ -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');
index 96ddfba9f0267bf672455e70654d3080039c1955..17c8de71eb6d143288e7931036dbe116f9c450e1 100644 (file)
@@ -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');