]> git.sur5r.net Git - i3/i3/commitdiff
_con_move_to_con: focus_next isn't always con_next_focused(con) 3204/head
authorOrestis Floros <orestisf1993@gmail.com>
Sun, 25 Mar 2018 19:29:00 +0000 (22:29 +0300)
committerOrestis Floros <orestisf1993@gmail.com>
Sun, 25 Mar 2018 21:09:26 +0000 (00:09 +0300)
con_next_focused uses con's parent. But since con can be inside an
unfocused container this means that one of it's siblings could become
focused in the current workspace.

src/con.c
testcases/t/294-focus-order.t

index 8953f0ed0ea0f18e271866942beeb7a786548cf6..3861f04678df769b74cbc807ff3ce3ddc33e3918 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -1140,7 +1140,13 @@ static bool _con_move_to_con(Con *con, Con *target, bool behind_focused, bool fi
 
     /* 1: save the container which is going to be focused after the current
      * container is moved away */
-    Con *focus_next = con_next_focused(con);
+    Con *focus_next = NULL;
+    if (!ignore_focus && source_ws == current_ws) {
+        focus_next = con_descend_focused(source_ws);
+        if (focus_next == con || con_has_parent(focus_next, con)) {
+            focus_next = con_next_focused(con);
+        }
+    }
 
     /* 2: we go up one level, but only when target is a normal container */
     if (target->type != CT_WORKSPACE) {
@@ -1223,7 +1229,7 @@ static bool _con_move_to_con(Con *con, Con *target, bool behind_focused, bool fi
 
     /* Set focus only if con was on current workspace before moving.
      * Otherwise we would give focus to some window on different workspace. */
-    if (!ignore_focus && source_ws == current_ws)
+    if (focus_next)
         con_activate(con_descend_focused(focus_next));
 
     /* 8. If anything within the container is associated with a startup sequence,
index 0f11624134eda4f77aca53e729e6b2211885f5ab..71f19ded7e907fc73af0623e63d7bdc88f0375f0 100644 (file)
@@ -27,6 +27,7 @@ sub kill_and_confirm_focus {
 }
 
 my @windows;
+my $ws;
 
 sub focus_windows {
     for (my $i = $#windows; $i >= 0; $i--) {
@@ -122,4 +123,22 @@ $windows[0] = open_window;
 cmd '[id=' . $windows[3]->id . '] move right';
 confirm_focus('split-v + unfocused move');
 
+######################################################################
+# Test that moving an unfocused container from inside a split
+# container to another workspace doesn't focus sibling.
+######################################################################
+
+$ws = fresh_workspace;
+$windows[0] = open_window;
+$windows[1] = open_window;
+cmd 'split v';
+open_window;
+cmd 'mark a';
+
+cmd '[id=' . $windows[0]->id . '] focus';
+cmd '[con_mark=a] move to workspace ' . get_unused_workspace;
+
+is(@{get_ws_content($ws)}, 2, 'Sanity check: marked window moved');
+confirm_focus('Move unfocused window from split container');
+
 done_testing;