]> git.sur5r.net Git - i3/i3/commitdiff
_con_move_to_con: don't change focus when moving to active workspace 3200/head
authorOrestis Floros <orestisf1993@gmail.com>
Sun, 25 Mar 2018 01:45:19 +0000 (04:45 +0300)
committerOrestis Floros <orestisf1993@gmail.com>
Wed, 28 Mar 2018 12:10:11 +0000 (15:10 +0300)
Seems to be the intention, indicated by this comment (con.c:1307-1309):
    /* For split containers, we use the currently focused container within it.
     * This allows setting marks on, e.g., tabbed containers which will move
     * con to a new tab behind the focused tab. */

Related to #3085.

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

index 3861f04678df769b74cbc807ff3ce3ddc33e3918..d8c30dcf98492b8ed1707a2e9891b4b5a5ebd3a2 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -1209,12 +1209,19 @@ static bool _con_move_to_con(Con *con, Con *target, bool behind_focused, bool fi
         /* We need to save the focused workspace on the output in case the
          * new workspace is hidden and it's necessary to immediately switch
          * back to the originally-focused workspace. */
-        Con *old_focus = TAILQ_FIRST(&(output_get_content(dest_output)->focus_head));
+        Con *old_focus_ws = TAILQ_FIRST(&(output_get_content(dest_output)->focus_head));
+        Con *old_focus = focused;
         con_activate(con_descend_focused(con));
 
         /* Restore focus if the output's focused workspace has changed. */
-        if (con_get_workspace(focused) != old_focus)
+        if (con_get_workspace(focused) != old_focus_ws) {
             con_focus(old_focus);
+        }
+
+        /* Restore focus to the currently focused container. */
+        if (old_focus_ws == current_ws && old_focus->type != CT_WORKSPACE) {
+            con_activate(old_focus);
+        }
     }
 
     /* 7: when moving to another workspace, we leave the focus on the current
index c76dfd035d213360ef727663b3e98ff49fba6db4..571c01cfa49e7f19f98f0da23adc31aea8b8b10c 100644 (file)
@@ -101,6 +101,12 @@ void output_push_sticky_windows(Con *to_focus) {
                 if (con_is_sticky(current)) {
                     bool ignore_focus = (to_focus == NULL) || (current != to_focus->parent);
                     con_move_to_workspace(current, visible_ws, true, false, ignore_focus);
+                    if (!ignore_focus) {
+                        Con *current_ws = con_get_workspace(focused);
+                        con_activate(con_descend_focused(current));
+                        /* Pushing sticky windows shouldn't change the focused workspace. */
+                        con_activate(con_descend_focused(current_ws));
+                    }
                 }
             }
         }
index 71f19ded7e907fc73af0623e63d7bdc88f0375f0..217cc8441ba412f012e0828056686292c2d15072 100644 (file)
@@ -141,4 +141,39 @@ 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');
 
+######################################################################
+# Moving containers to another workspace puts them on the top of the
+# focus stack but behind the focused container.
+######################################################################
+
+for my $new_workspace (0 .. 1) {
+    fresh_workspace;
+    $windows[2] = open_window;
+    $windows[1] = open_window;
+    fresh_workspace if $new_workspace;
+    $windows[3] = open_window;
+    $windows[0] = open_window;
+    cmd 'mark target';
+
+    cmd '[id=' . $windows[2]->id . '] move to mark target';
+    cmd '[id=' . $windows[1]->id . '] move to mark target';
+    confirm_focus('\'move to mark\' focus order' . ($new_workspace ? ' when moving containers from other workspace' : ''));
+}
+
+######################################################################
+# Same but with workspace commands.
+######################################################################
+
+fresh_workspace;
+$windows[2] = open_window;
+$windows[1] = open_window;
+$ws = fresh_workspace;
+$windows[3] = open_window;
+$windows[0] = open_window;
+cmd 'mark target';
+
+cmd '[id=' . $windows[2]->id . '] move to workspace ' . $ws;
+cmd '[id=' . $windows[1]->id . '] move to workspace ' . $ws;
+confirm_focus('\'move to workspace\' focus order when moving containers from other workspace');
+
 done_testing;