]> git.sur5r.net Git - i3/i3/commitdiff
Merge branch 'master' into next
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 24 Aug 2011 21:00:12 +0000 (23:00 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 24 Aug 2011 21:00:12 +0000 (23:00 +0200)
include/con.h
src/cmdparse.y
src/con.c
src/floating.c

index 7d828408a4dd166948c75d35edcc01b6a21bf30a..d8bad7dea25df9964fce6d04bdc3372a87ed437d 100644 (file)
@@ -131,10 +131,14 @@ void con_toggle_fullscreen(Con *con, int fullscreen_mode);
 /**
  * Moves the given container to the currently focused container on the given
  * workspace.
+ *
+ * The dont_warp flag disables pointer warping and will be set when this
+ * function is called while dragging a floating window.
+ *
  * TODO: is there a better place for this function?
  *
  */
-void con_move_to_workspace(Con *con, Con *workspace);
+void con_move_to_workspace(Con *con, Con *workspace, bool dont_warp);
 
 /**
  * Returns the orientation of the given container (for stacked containers,
index ed8bd0733996c196594072eab5ed9e5d498ae179..ab9672c080c71da7ad2dccd2d4df86d880155c06 100644 (file)
@@ -700,7 +700,7 @@ move:
 
         TAILQ_FOREACH(current, &owindows, owindows) {
             printf("matching: %p / %s\n", current->con, current->con->name);
-            con_move_to_workspace(current->con, ws);
+            con_move_to_workspace(current->con, ws, false);
         }
 
         tree_render();
index bf94d460fb5f0980d9f32bee90a41ecb82ccaa0f..a115ad7b80d58e457ebfa1a2ff92f940d56ec6a0 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -540,10 +540,14 @@ update_netwm_state:
 /*
  * Moves the given container to the currently focused container on the given
  * workspace.
+ *
+ * The dont_warp flag disables pointer warping and will be set when this
+ * function is called while dragging a floating window.
+ *
  * TODO: is there a better place for this function?
  *
  */
-void con_move_to_workspace(Con *con, Con *workspace) {
+void con_move_to_workspace(Con *con, Con *workspace, bool dont_warp) {
     if (con->type == CT_WORKSPACE) {
         DLOG("Moving workspaces is not yet implemented.\n");
         return;
@@ -592,9 +596,19 @@ void con_move_to_workspace(Con *con, Con *workspace) {
         workspace_is_visible(workspace)) {
         workspace_show(workspace->name);
 
-        /* Unset warp_to if target con is floating.  Otherwise, set warp_to to
-         * current target container. */
-        if (con->type == CT_FLOATING_CON)
+        if (con->type == CT_FLOATING_CON) {
+            DLOG("Floating window, fixing coordinates\n");
+            /* Take the relative coordinates of the current output, then add them
+             * to the coordinate space of the correct output */
+            uint32_t rel_x = (con->rect.x - source_output->rect.x);
+            uint32_t rel_y = (con->rect.y - source_output->rect.y);
+            con->rect.x = dest_output->rect.x + rel_x;
+            con->rect.y = dest_output->rect.y + rel_y;
+        }
+
+        /* Don’t warp if told so (when dragging floating windows with the
+         * mouse for example) */
+        if (dont_warp)
             x_set_warp_to(NULL);
         else
             x_set_warp_to(&(con->rect));
@@ -613,7 +627,7 @@ void con_move_to_workspace(Con *con, Con *workspace) {
 
     /* 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). */
-    con_focus(con);
+    con_focus(con_descend_focused(con));
 
     /* 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
index f2b8608fc3d69c1c8b622945b91838a78a2414d1..4c4b954cfe4ee92780dee2d95ef3dd6b06c28ef6 100644 (file)
@@ -286,7 +286,7 @@ bool floating_maybe_reassign_ws(Con *con) {
     Con *content = output_get_content(output->con);
     Con *ws = TAILQ_FIRST(&(content->focus_head));
     DLOG("Moving con %p / %s to workspace %p / %s\n", con, con->name, ws, ws->name);
-    con_move_to_workspace(con, ws);
+    con_move_to_workspace(con, ws, true);
     con_focus(con_descend_focused(con));
     return true;
 }