mirror of
https://github.com/swaywm/sway.git
synced 2024-12-28 16:06:37 +01:00
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:
parent
105bf23998
commit
92891fb1ed
3 changed files with 25 additions and 3 deletions
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue