diff options
author | Ronan Pigott <[email protected]> | 2020-11-01 23:43:07 -0700 |
---|---|---|
committer | Tudor Brindus <[email protected]> | 2020-12-20 00:58:42 -0500 |
commit | 8eb0c54693e44e7c6126ce35045e34ad0f4d4607 (patch) | |
tree | f70faa5d8d809591909881e992323d5439d7f21d /sway/tree/workspace.c | |
parent | e95c299f0a724b7290a56f3ef81c9f9565bc9231 (diff) |
introduce workspace_squash
workspace_squash is container_flatten in the reverse
direction. Instead of eliminating redundant splits that are
parents of the target container, it eliminates pairs of
redundant H/V splits that are children of the workspace.
Splits are redundant if a con and its grandchild have the
same layout, and the immediate child has the opposite split.
For example, layouts are transformed like:
H[V[H[app1 app2]] app3] -> H[app1 app2 app3]
i3 uses this operation to simplify the tree after moving
heavily nested containers to a higher level in the tree via
an orthogonal move.
Diffstat (limited to 'sway/tree/workspace.c')
-rw-r--r-- | sway/tree/workspace.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index e40792ae..62549434 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -714,14 +714,8 @@ void workspace_add_floating(struct sway_workspace *workspace, node_set_dirty(&con->node); } -struct sway_container *workspace_insert_tiling(struct sway_workspace *workspace, +void workspace_insert_tiling_direct(struct sway_workspace *workspace, struct sway_container *con, int index) { - if (con->workspace) { - container_detach(con); - } - if (config->default_layout != L_NONE) { - con = container_split(con, config->default_layout); - } list_insert(workspace->tiling, index, con); con->workspace = workspace; container_for_each_child(con, set_workspace, NULL); @@ -729,6 +723,17 @@ struct sway_container *workspace_insert_tiling(struct sway_workspace *workspace, workspace_update_representation(workspace); node_set_dirty(&workspace->node); node_set_dirty(&con->node); +} + +struct sway_container *workspace_insert_tiling(struct sway_workspace *workspace, + struct sway_container *con, int index) { + if (con->workspace) { + container_detach(con); + } + if (config->default_layout != L_NONE) { + con = container_split(con, config->default_layout); + } + workspace_insert_tiling_direct(workspace, con, index); return con; } @@ -846,3 +851,10 @@ size_t workspace_num_sticky_containers(struct sway_workspace *ws) { workspace_for_each_container(ws, count_sticky_containers, &count); return count; } + +void workspace_squash(struct sway_workspace *workspace) { + for (int i = 0; i < workspace->tiling->length; i++) { + struct sway_container *child = workspace->tiling->items[i]; + i += container_squash(child); + } +} |