]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Don’t fix floating coordinates when reassigning (fixes flickering)
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 14 Sep 2011 21:58:51 +0000 (22:58 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 14 Sep 2011 21:58:51 +0000 (22:58 +0100)
This fixes flickering when moving floating windows between different monitors.

include/con.h
src/cmdparse.y
src/con.c
src/floating.c

index e029fd54b124ebb7b057690cafbf9f1a7d4ec237..155bb7d8433989e5bafecf9ff6b85cd3d054dcc4 100644 (file)
@@ -138,13 +138,20 @@ void con_toggle_fullscreen(Con *con, int fullscreen_mode);
  * Moves the given container to the currently focused container on the given
  * workspace.
  *
+ * The fix_coordinates flag will translate the current coordinates (offset from
+ * the monitor position basically) to appropriate coordinates on the
+ * destination workspace.
+ * Not enabling this behaviour comes in handy when this function gets called by
+ * floating_maybe_reassign_ws, which will only "move" a floating window when it
+ * *already* changed its coordinates to a different output.
+ *
  * 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, bool dont_warp);
+void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool dont_warp);
 
 /**
  * Returns the orientation of the given container (for stacked containers,
index 021b0b83f26be663f2c2183b77b82da0fb266706..9ea82efd68c5f8e6a77a4998831b8a8b1a116213 100644 (file)
@@ -699,7 +699,7 @@ move:
 
         TAILQ_FOREACH(current, &owindows, owindows) {
             printf("matching: %p / %s\n", current->con, current->con->name);
-            con_move_to_workspace(current->con, ws, false);
+            con_move_to_workspace(current->con, ws, true, false);
         }
 
         tree_render();
index cd7c2ce08cc6a82813820436f0deb28e76bb8b86..d5b05642bf8af22a9fa1f0192ec470469ac7d05a 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -553,13 +553,20 @@ update_netwm_state:
  * Moves the given container to the currently focused container on the given
  * workspace.
  *
+ * The fix_coordinates flag will translate the current coordinates (offset from
+ * the monitor position basically) to appropriate coordinates on the
+ * destination workspace.
+ * Not enabling this behaviour comes in handy when this function gets called by
+ * floating_maybe_reassign_ws, which will only "move" a floating window when it
+ * *already* changed its coordinates to a different output.
+ *
  * 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, bool dont_warp) {
+void con_move_to_workspace(Con *con, Con *workspace, bool fix_coordinates, bool dont_warp) {
     if (con->type == CT_WORKSPACE) {
         DLOG("Moving workspaces is not yet implemented.\n");
         return;
@@ -608,7 +615,7 @@ void con_move_to_workspace(Con *con, Con *workspace, bool dont_warp) {
         workspace_is_visible(workspace)) {
         workspace_show(workspace->name);
 
-        if (con->type == CT_FLOATING_CON) {
+        if (fix_coordinates && 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 */
@@ -616,7 +623,7 @@ void con_move_to_workspace(Con *con, Con *workspace, bool dont_warp) {
             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;
-        }
+        } else DLOG("Not fixing coordinates, fix_coordinates flag = %d\n", fix_coordinates);
 
         /* Don’t warp if told so (when dragging floating windows with the
          * mouse for example) */
index 9f5655c71322cde3eccf5e63f3c6de6ccb960782..0266dfa2d5438921fcc6f39d8910d226b44292c1 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, true);
+    con_move_to_workspace(con, ws, false, true);
     con_focus(con_descend_focused(con));
     return true;
 }