aboutsummaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
authorTudor Brindus <me@tbrindus.ca>2020-10-24 02:00:46 -0400
committerTudor Brindus <me@tbrindus.ca>2020-12-20 00:58:42 -0500
commit971aa90ccca33084238cf6025e51fe3205c714b5 (patch)
tree663cff9b1faf16402b2399c0ebddb67e273cb2a9 /sway/commands
parentd54c8e885b8bfc6b9922c575d77a5fbe2ac8a60a (diff)
commands/move: don't flatten on move; reap empty former parent instead
Some comparisons of current Sway versus i3 behavior: 1) T[T[T[app]]] + move left * Sway: T[app] * i3: T[T[app]] 2) H[V[H[V[app]]]] + move left * Sway: H[app] * i3: H[V[app]] After this commit, Sway behavior matches i3. The intermediate states are now: T[T[T[app]]] -> T[T[app T[]]] -> T[T[app]] H[V[H[V[app]]]] -> H[V[app H[V[]]]] -> H[V[app]]
Diffstat (limited to 'sway/commands')
-rw-r--r--sway/commands/move.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/sway/commands/move.c b/sway/commands/move.c
index 204596c0..247c45fe 100644
--- a/sway/commands/move.c
+++ b/sway/commands/move.c
@@ -309,16 +309,6 @@ static bool container_move_in_direction(struct sway_container *container,
return false;
}
- // If container is in a split container by itself, move out of the split
- if (container->parent) {
- struct sway_container *old_parent = container->parent;
- struct sway_container *new_parent =
- container_flatten(container->parent);
- if (new_parent != old_parent) {
- return true;
- }
- }
-
// Look for a suitable *container* sibling or parent.
// The below loop stops once we hit the workspace because current->parent
// is NULL for the topmost containers in a workspace.
@@ -721,12 +711,20 @@ static struct cmd_results *cmd_move_in_direction(
return cmd_results_new(CMD_SUCCESS, NULL);
}
struct sway_workspace *old_ws = container->workspace;
+ struct sway_container *old_parent = container->parent;
if (!container_move_in_direction(container, direction)) {
// Container didn't move
return cmd_results_new(CMD_SUCCESS, NULL);
}
+ // clean-up, destroying parents if the container was the last child
+ if (old_parent) {
+ container_reap_empty(old_parent);
+ } else if (old_ws) {
+ workspace_consider_destroy(old_ws);
+ }
+
struct sway_workspace *new_ws = container->workspace;
if (root->fullscreen_global) {