From 1d9a2abc05d7022a31c807bbc5a0f5f793b31e61 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 24 Aug 2011 22:54:10 +0200 Subject: [PATCH 1/3] Bugfix: Fix coordinates when moving a floating window to a different output --- src/con.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/con.c b/src/con.c index bf94d460..a67fa2c3 100644 --- a/src/con.c +++ b/src/con.c @@ -592,6 +592,16 @@ void con_move_to_workspace(Con *con, Con *workspace) { workspace_is_visible(workspace)) { workspace_show(workspace->name); + 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; + } + /* Unset warp_to if target con is floating. Otherwise, set warp_to to * current target container. */ if (con->type == CT_FLOATING_CON) From cd2d7ef484654b63aeff65591d55a9980e64c39e Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 24 Aug 2011 22:54:48 +0200 Subject: [PATCH 2/3] Bugfix: Correctly keep focus when moving non-leaf windows --- src/con.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/con.c b/src/con.c index a67fa2c3..497cb1d3 100644 --- a/src/con.c +++ b/src/con.c @@ -623,7 +623,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 From 698d97cd02e3b50e0e62add0bf82b2404bba40ef Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 24 Aug 2011 22:59:46 +0200 Subject: [PATCH 3/3] Bugfix: Correctly warp floating windows when using the 'move' command --- include/con.h | 6 +++++- src/cmdparse.y | 2 +- src/con.c | 12 ++++++++---- src/floating.c | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/con.h b/include/con.h index 7d828408..d8bad7de 100644 --- a/include/con.h +++ b/include/con.h @@ -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, diff --git a/src/cmdparse.y b/src/cmdparse.y index c9e9fc7c..021b0b83 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); + con_move_to_workspace(current->con, ws, false); } tree_render(); diff --git a/src/con.c b/src/con.c index 497cb1d3..a115ad7b 100644 --- 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; @@ -602,9 +606,9 @@ void con_move_to_workspace(Con *con, Con *workspace) { con->rect.y = dest_output->rect.y + rel_y; } - /* Unset warp_to if target con is floating. Otherwise, set warp_to to - * current target container. */ - if (con->type == CT_FLOATING_CON) + /* 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)); diff --git a/src/floating.c b/src/floating.c index a5ce1841..8718ee01 100644 --- a/src/floating.c +++ b/src/floating.c @@ -282,7 +282,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; }