aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/move.c64
1 files changed, 12 insertions, 52 deletions
diff --git a/sway/commands/move.c b/sway/commands/move.c
index 849a18ad..fc2f1cc1 100644
--- a/sway/commands/move.c
+++ b/sway/commands/move.c
@@ -259,50 +259,24 @@ static void container_move_to_container(struct sway_container *container,
* In other words, rejigger it. */
static void workspace_rejigger(struct sway_workspace *ws,
struct sway_container *child, enum movement_direction move_dir) {
+ if (!child->parent && ws->tiling->length == 1) {
+ ws->layout =
+ move_dir == MOVE_LEFT || move_dir == MOVE_RIGHT ? L_HORIZ : L_VERT;
+ workspace_update_representation(ws);
+ return;
+ }
container_detach(child);
- workspace_wrap_children(ws);
+ struct sway_container *new_parent = workspace_wrap_children(ws);
int index = move_dir == MOVE_LEFT || move_dir == MOVE_UP ? 0 : 1;
workspace_insert_tiling(ws, child, index);
+ container_flatten(new_parent);
ws->layout =
move_dir == MOVE_LEFT || move_dir == MOVE_RIGHT ? L_HORIZ : L_VERT;
workspace_update_representation(ws);
child->width = child->height = 0;
}
-static void move_out_of_tabs_stacks(struct sway_container *container,
- struct sway_container *current, enum movement_direction move_dir,
- int offs) {
- enum sway_container_layout layout = move_dir ==
- MOVE_LEFT || move_dir == MOVE_RIGHT ? L_HORIZ : L_VERT;
- list_t *siblings = container_get_siblings(container);
- if (container == current && siblings->length == 1) {
- wlr_log(WLR_DEBUG, "Changing layout of parent");
- if (container->parent) {
- container->parent->layout = layout;
- container_update_representation(container);
- } else {
- container->workspace->layout = layout;
- workspace_update_representation(container->workspace);
- }
- return;
- }
-
- wlr_log(WLR_DEBUG, "Moving out of tab/stack into a split");
- if (current->parent) {
- struct sway_container *new_parent =
- container_split(current->parent, layout);
- container_insert_child(new_parent, container, offs < 0 ? 0 : 1);
- container_reap_empty(new_parent);
- container_flatten(new_parent);
- } else {
- // Changing a workspace
- struct sway_workspace *workspace = container->workspace;
- workspace_split(workspace, layout);
- workspace_insert_tiling(workspace, container, offs < 0 ? 0 : 1);
- }
-}
-
// Returns true if moved
static bool container_move_in_direction(struct sway_container *container,
enum movement_direction move_dir) {
@@ -334,7 +308,6 @@ static bool container_move_in_direction(struct sway_container *container,
int offs = move_dir == MOVE_LEFT || move_dir == MOVE_UP ? -1 : 1;
while (current) {
- struct sway_container *parent = current->parent;
list_t *siblings = container_get_siblings(current);
enum sway_container_layout layout = container_parent_layout(current);
int index = list_find(siblings, current);
@@ -343,15 +316,8 @@ static bool container_move_in_direction(struct sway_container *container,
if (is_parallel(layout, move_dir)) {
if (desired == -1 || desired == siblings->length) {
if (current->parent == container->parent) {
- if (!(parent && parent->is_fullscreen) &&
- (layout == L_TABBED || layout == L_STACKED)) {
- move_out_of_tabs_stacks(container, current,
- move_dir, offs);
- return true;
- } else {
- current = current->parent;
- continue;
- }
+ current = current->parent;
+ continue;
} else {
// Special case
if (current->parent) {
@@ -369,10 +335,6 @@ static bool container_move_in_direction(struct sway_container *container,
siblings->items[desired], move_dir);
return true;
}
- } else if (!(parent && parent->is_fullscreen) &&
- (layout == L_TABBED || layout == L_STACKED)) {
- move_out_of_tabs_stacks(container, current, move_dir, offs);
- return true;
}
current = current->parent;
@@ -388,10 +350,8 @@ static bool container_move_in_direction(struct sway_container *container,
// Maybe rejigger the workspace
struct sway_workspace *ws = container->workspace;
if (!is_parallel(ws->layout, move_dir)) {
- if (ws->tiling->length >= 2) {
- workspace_rejigger(ws, container, move_dir);
- return true;
- }
+ workspace_rejigger(ws, container, move_dir);
+ return true;
} else if (ws->layout == L_TABBED || ws->layout == L_STACKED) {
workspace_rejigger(ws, container, move_dir);
return true;