]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Correctly move floating windows to invisible workspaces cross-output (Thanks...
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 28 Sep 2012 22:02:41 +0000 (00:02 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 28 Sep 2012 22:02:41 +0000 (00:02 +0200)
src/con.c
src/x.c

index f5ccfcddbed5b541566c12e80eb59cb7bfa9c404..0f7a5cbb4937d30fb4f85ec4a84c2897b2d761b3 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -666,13 +666,20 @@ void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool
     con->percent = 0.0;
     con_fix_percent(next);
 
-    /* 7: focus the con on the target workspace (the X focus is only updated by
-     * calling tree_render(), so for the "real" focus this is a no-op).
+    /* 7: focus the con on the target workspace, but only within that
+     * workspace, that is, don’t move focus away if the target workspace is
+     * invisible.
      * We don’t focus the con for i3 pseudo workspaces like __i3_scratch and
      * we don’t focus when there is a fullscreen con on that workspace. */
     if ((workspace->name[0] != '_' || workspace->name[1] != '_') &&
-        con_get_fullscreen_con(workspace, CF_OUTPUT) == NULL)
+        con_get_fullscreen_con(workspace, CF_OUTPUT) == NULL) {
+        /* We need to save focus on workspace level and restore it afterwards.
+         * Otherwise, we might focus a different workspace without actually
+         * switching workspaces. */
+        Con *old_focus = TAILQ_FIRST(&(output_get_content(dest_output)->focus_head));
         con_focus(con_descend_focused(con));
+        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
diff --git a/src/x.c b/src/x.c
index 7cb28c1abc984a85ac7fc8ed152bd59299d0605d..a3f42b6a9daa80dacbab7015d61d0f052b024613 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -792,7 +792,7 @@ static void x_push_node_unmaps(Con *con) {
         }
 
         cookie = xcb_unmap_window(conn, con->frame);
-        DLOG("unmapping container (serial %d)\n", cookie.sequence);
+        DLOG("unmapping container %p / %s (serial %d)\n", con, con->name, cookie.sequence);
         /* we need to increase ignore_unmap for this container (if it
          * contains a window) and for every window "under" this one which
          * contains a window */