mirror of
https://github.com/swaywm/sway.git
synced 2025-11-04 13:29:52 -05:00
Implement move [left|right|up|down]
The exact semantics of this command are complicated. I'll describe each
test scenario as s-expressions. Everything assumes L_HORIZ if not
specified, but if you rotate everything 90 degrees the same test cases
hold.
```
(container (view a) (view b focus) (view c))
-> move left
(container (view b focus) (view a) (view c))
(container (view a) (view b focus) (view c))
-> move right
(container (view a) (view c) (view b focus))
(container L_VERT (view a))
(container L_HORIZ
(view b) (view c focus))
-> move up
(container L_VERT
(view a) (view c focus))
(container L_HORIZ (view b))
(workspace
(view a) (view b focus) (view c))
-> move up
(workspace [split direction flipped]
(view b focus)
(container (view a) (view c)))
(workspace
(view a) (view b focus) (view c))
-> move down
(workspace [split direction flipped]
(container (view a) (view c))
(view b focus)))
Note: outputs use wlr_output_layout instead of assuming that i+/-1 is
the next output in the move direction.
(root
(output X11-1
(workspace 1))
(output X11-2
(workspace 1 (view a focus) (view b)))))
-> move left
(root
(output X11-1
(workspace 1 (view a focus)))
(output X11-2
(workspace 1 (view b)))))
(root
(output X11-1
(workspace 1
(container (view a) (view b)))
(output X11-2
(workspace 1 (view c focus)))))
-> move left
(root
(output X11-1
(workspace 1
(container (view a) (view b))
(view c focus)))
(output X11-2
(workspace 1)))
```
This commit is contained in:
parent
d77a0119f4
commit
57954a2b24
4 changed files with 306 additions and 45 deletions
|
|
@ -208,7 +208,7 @@ static void container_root_finish(struct sway_container *con) {
|
|||
wlr_log(L_ERROR, "TODO: destroy the root container");
|
||||
}
|
||||
|
||||
static bool container_reap_empty(struct sway_container *con) {
|
||||
bool container_reap_empty(struct sway_container *con) {
|
||||
switch (con->type) {
|
||||
case C_ROOT:
|
||||
case C_OUTPUT:
|
||||
|
|
@ -225,14 +225,6 @@ static bool container_reap_empty(struct sway_container *con) {
|
|||
if (con->children->length == 0) {
|
||||
_container_destroy(con);
|
||||
return true;
|
||||
} else if (con->children->length == 1) {
|
||||
struct sway_container *child = con->children->items[0];
|
||||
if (child->type == C_CONTAINER) {
|
||||
container_remove_child(child);
|
||||
container_replace_child(con, child);
|
||||
_container_destroy(con);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
case C_VIEW:
|
||||
break;
|
||||
|
|
@ -245,6 +237,29 @@ static bool container_reap_empty(struct sway_container *con) {
|
|||
return false;
|
||||
}
|
||||
|
||||
struct sway_container *container_reap_empty_recursive(
|
||||
struct sway_container *con) {
|
||||
while (con) {
|
||||
struct sway_container *next = con->parent;
|
||||
if (!container_reap_empty(con)) {
|
||||
break;
|
||||
}
|
||||
con = next;
|
||||
}
|
||||
return con;
|
||||
}
|
||||
|
||||
struct sway_container *container_flatten(struct sway_container *container) {
|
||||
while (container->type == C_CONTAINER && container->children->length == 1) {
|
||||
struct sway_container *child = container->children->items[0];
|
||||
struct sway_container *parent = container->parent;
|
||||
container_replace_child(container, child);
|
||||
container_destroy(container);
|
||||
container = parent;
|
||||
}
|
||||
return container;
|
||||
}
|
||||
|
||||
struct sway_container *container_destroy(struct sway_container *con) {
|
||||
if (con == NULL) {
|
||||
return NULL;
|
||||
|
|
@ -283,18 +298,7 @@ struct sway_container *container_destroy(struct sway_container *con) {
|
|||
break;
|
||||
}
|
||||
|
||||
struct sway_container *tmp = parent;
|
||||
while (parent) {
|
||||
tmp = parent->parent;
|
||||
|
||||
if (!container_reap_empty(parent)) {
|
||||
break;
|
||||
}
|
||||
|
||||
parent = tmp;
|
||||
}
|
||||
|
||||
return tmp;
|
||||
return container_reap_empty_recursive(parent);
|
||||
}
|
||||
|
||||
static void container_close_func(struct sway_container *container, void *data) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue