commands/move: unwrap workspace container on move to new workspace

If moving e.g. `T[app app]` into a new workspace with `workspace_layout
tabbed`, then post-move the tree in that workspace will be `T[T[app
app]]`. This still happens with horizontal or vertical workspace layout,
but is less visible since those containers have no decorations.

Fixes #5426.
This commit is contained in:
Tudor Brindus 2020-07-01 01:08:04 -04:00 committed by Brian Ashworth
parent 105bf23998
commit 92891fb1ed
3 changed files with 25 additions and 3 deletions

View file

@ -105,6 +105,9 @@ struct sway_container *workspace_find_container(struct sway_workspace *ws,
*/ */
struct sway_container *workspace_wrap_children(struct sway_workspace *ws); struct sway_container *workspace_wrap_children(struct sway_workspace *ws);
void workspace_unwrap_children(struct sway_workspace *ws,
struct sway_container *wrap);
void workspace_detach(struct sway_workspace *workspace); void workspace_detach(struct sway_workspace *workspace);
void workspace_add_tiling(struct sway_workspace *workspace, void workspace_add_tiling(struct sway_workspace *workspace,

View file

@ -208,9 +208,13 @@ static void container_move_to_workspace(struct sway_container *container,
} }
} else { } else {
container_detach(container); container_detach(container);
if (workspace_is_empty(workspace) && container->children) {
workspace_unwrap_children(workspace, container);
} else {
container->width = container->height = 0; container->width = container->height = 0;
container->width_fraction = container->height_fraction = 0; container->width_fraction = container->height_fraction = 0;
workspace_add_tiling(workspace, container); workspace_add_tiling(workspace, container);
}
container_update_representation(container); container_update_representation(container);
} }
if (container->view) { if (container->view) {

View file

@ -641,6 +641,21 @@ struct sway_container *workspace_wrap_children(struct sway_workspace *ws) {
return middle; return middle;
} }
void workspace_unwrap_children(struct sway_workspace *ws,
struct sway_container *wrap) {
if (!sway_assert(workspace_is_empty(ws),
"target workspace must be empty")) {
return;
}
ws->layout = wrap->layout;
while (wrap->children->length) {
struct sway_container *child = wrap->children->items[0];
container_detach(child);
workspace_add_tiling(ws, child);
}
}
void workspace_detach(struct sway_workspace *workspace) { void workspace_detach(struct sway_workspace *workspace) {
struct sway_output *output = workspace->output; struct sway_output *output = workspace->output;
int index = list_find(output->workspaces, workspace); int index = list_find(output->workspaces, workspace);