From e1d5dc08048d8b0ef739302ee58bdc8642b44f13 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 22 Aug 2018 17:46:12 +1000 Subject: [PATCH] Translate floating containers when a workspace is moved When a workspace is moved to another output, or the output it's on changes its global layout position, the floating containers on that workspace should be translated by the same amount as the workspace. This keeps the floating containers in the same position relative to the workspace. A check is done to make sure the floating container's center point isn't being moved off screen. If it is, it is centered within the workspace. Fixes part of #2500. --- sway/tree/arrange.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sway/tree/arrange.c b/sway/tree/arrange.c index cf4a5d9a7..a4b058f37 100644 --- a/sway/tree/arrange.c +++ b/sway/tree/arrange.c @@ -206,10 +206,30 @@ static void arrange_workspace(struct sway_container *workspace) { wlr_log(WLR_DEBUG, "Usable area for ws: %dx%d@%d,%d", area->width, area->height, area->x, area->y); remove_gaps(workspace); + + double prev_x = workspace->x; + double prev_y = workspace->y; workspace->width = area->width; workspace->height = area->height; workspace->x = output->x + area->x; workspace->y = output->y + area->y; + + // Adjust any floating containers + double diff_x = workspace->x - prev_x; + double diff_y = workspace->y - prev_y; + for (int i = 0; i < workspace->sway_workspace->floating->length; ++i) { + struct sway_container *floater = + workspace->sway_workspace->floating->items[i]; + container_floating_translate(floater, diff_x, diff_y); + double center_x = floater->x + floater->width / 2; + double center_y = floater->y + floater->height / 2; + struct wlr_box workspace_box; + container_get_box(workspace, &workspace_box); + if (!wlr_box_contains_point(&workspace_box, center_x, center_y)) { + container_floating_move_to_center(floater); + } + } + add_gaps(workspace); container_set_dirty(workspace); wlr_log(WLR_DEBUG, "Arranging workspace '%s' at %f, %f", workspace->name,