From: Michael Stapelberg Date: Wed, 14 Sep 2011 21:58:51 +0000 (+0100) Subject: Bugfix: Don’t fix floating coordinates when reassigning (fixes flickering) X-Git-Tag: 4.1~160^2^2~1 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6b541d382b89de18104202e5820f466725d77576;p=i3%2Fi3 Bugfix: Don’t fix floating coordinates when reassigning (fixes flickering) This fixes flickering when moving floating windows between different monitors. --- diff --git a/include/con.h b/include/con.h index e029fd54..155bb7d8 100644 --- a/include/con.h +++ b/include/con.h @@ -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, diff --git a/src/cmdparse.y b/src/cmdparse.y index 021b0b83..9ea82efd 100644 --- a/src/cmdparse.y +++ b/src/cmdparse.y @@ -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(); diff --git a/src/con.c b/src/con.c index cd7c2ce0..d5b05642 100644 --- 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) */ diff --git a/src/floating.c b/src/floating.c index 9f5655c7..0266dfa2 100644 --- a/src/floating.c +++ b/src/floating.c @@ -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; }