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.
This commit is contained in:
parent
ce12d912dc
commit
e1d5dc0804
|
@ -206,10 +206,30 @@ static void arrange_workspace(struct sway_container *workspace) {
|
||||||
wlr_log(WLR_DEBUG, "Usable area for ws: %dx%d@%d,%d",
|
wlr_log(WLR_DEBUG, "Usable area for ws: %dx%d@%d,%d",
|
||||||
area->width, area->height, area->x, area->y);
|
area->width, area->height, area->x, area->y);
|
||||||
remove_gaps(workspace);
|
remove_gaps(workspace);
|
||||||
|
|
||||||
|
double prev_x = workspace->x;
|
||||||
|
double prev_y = workspace->y;
|
||||||
workspace->width = area->width;
|
workspace->width = area->width;
|
||||||
workspace->height = area->height;
|
workspace->height = area->height;
|
||||||
workspace->x = output->x + area->x;
|
workspace->x = output->x + area->x;
|
||||||
workspace->y = output->y + area->y;
|
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);
|
add_gaps(workspace);
|
||||||
container_set_dirty(workspace);
|
container_set_dirty(workspace);
|
||||||
wlr_log(WLR_DEBUG, "Arranging workspace '%s' at %f, %f", workspace->name,
|
wlr_log(WLR_DEBUG, "Arranging workspace '%s' at %f, %f", workspace->name,
|
||||||
|
|
Loading…
Reference in a new issue