aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLibravatar Ronan Pigott <rpigott@berkeley.edu>2020-11-01 23:43:07 -0700
committerLibravatar Tudor Brindus <me@tbrindus.ca>2020-12-20 00:58:42 -0500
commit8eb0c54693e44e7c6126ce35045e34ad0f4d4607 (patch)
treef70faa5d8d809591909881e992323d5439d7f21d /include
parentcommands/move: rework container_move_in_direction (diff)
downloadsway-8eb0c54693e44e7c6126ce35045e34ad0f4d4607.tar.gz
sway-8eb0c54693e44e7c6126ce35045e34ad0f4d4607.tar.zst
sway-8eb0c54693e44e7c6126ce35045e34ad0f4d4607.zip
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 'include')
-rw-r--r--include/sway/tree/container.h13
-rw-r--r--include/sway/tree/workspace.h15
2 files changed, 28 insertions, 0 deletions
diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h
index c9290108..7e9df59f 100644
--- a/include/sway/tree/container.h
+++ b/include/sway/tree/container.h
@@ -374,4 +374,17 @@ bool container_is_sticky(struct sway_container *con);
374 374
375bool container_is_sticky_or_child(struct sway_container *con); 375bool container_is_sticky_or_child(struct sway_container *con);
376 376
377/**
378 * This will destroy pairs of redundant H/V splits
379 * e.g. H[V[H[app app]] app] -> H[app app app]
380 * The middle "V[H[" are eliminated by a call to container_squash
381 * on the V[ con. It's grandchildren are added to it's parent.
382 *
383 * This function is roughly equivalent to i3's tree_flatten here:
384 * https://github.com/i3/i3/blob/1f0c628cde40cf87371481041b7197344e0417c6/src/tree.c#L651
385 *
386 * Returns the number of new containers added to the parent
387 */
388int container_squash(struct sway_container *con);
389
377#endif 390#endif
diff --git a/include/sway/tree/workspace.h b/include/sway/tree/workspace.h
index 3c9f93ed..fdd92f64 100644
--- a/include/sway/tree/workspace.h
+++ b/include/sway/tree/workspace.h
@@ -116,6 +116,13 @@ struct sway_container *workspace_add_tiling(struct sway_workspace *workspace,
116void workspace_add_floating(struct sway_workspace *workspace, 116void workspace_add_floating(struct sway_workspace *workspace,
117 struct sway_container *con); 117 struct sway_container *con);
118 118
119/**
120 * Adds a tiling container to the workspace without considering
121 * the workspace_layout, so the con will not be split.
122 */
123void workspace_insert_tiling_direct(struct sway_workspace *workspace,
124 struct sway_container *con, int index);
125
119struct sway_container *workspace_insert_tiling(struct sway_workspace *workspace, 126struct sway_container *workspace_insert_tiling(struct sway_workspace *workspace,
120 struct sway_container *con, int index); 127 struct sway_container *con, int index);
121 128
@@ -134,4 +141,12 @@ size_t workspace_num_tiling_views(struct sway_workspace *ws);
134 141
135size_t workspace_num_sticky_containers(struct sway_workspace *ws); 142size_t workspace_num_sticky_containers(struct sway_workspace *ws);
136 143
144/**
145 * workspace_squash is container_flatten in the reverse
146 * direction. Instead of eliminating redundant splits that are
147 * parents of the target container, it eliminates pairs of
148 * redundant H/V splits that are children of the workspace.
149 */
150void workspace_squash(struct sway_workspace *workspace);
151
137#endif 152#endif