aboutsummaryrefslogtreecommitdiff
path: root/sway/tree/layout.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree/layout.c')
-rw-r--r--sway/tree/layout.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/sway/tree/layout.c b/sway/tree/layout.c
index 2f4ae667..7bbeb4b1 100644
--- a/sway/tree/layout.c
+++ b/sway/tree/layout.c
@@ -142,11 +142,26 @@ struct sway_container *container_remove_child(struct sway_container *child) {
}
struct sway_container *parent = child->parent;
- for (int i = 0; i < parent->children->length; ++i) {
- if (parent->children->items[i] == child) {
- list_del(parent->children, i);
- break;
+ if (!child->is_floating) {
+ for (int i = 0; i < parent->children->length; ++i) {
+ if (parent->children->items[i] == child) {
+ list_del(parent->children, i);
+ break;
+ }
+ }
+ } else {
+ if (!sway_assert(parent->type == C_WORKSPACE && child->type == C_VIEW,
+ "Found floating non-view and/or in non-workspace")) {
+ return parent;
+ }
+ struct sway_workspace *ws = parent->sway_workspace;
+ for (int i = 0; i < ws->floating->length; ++i) {
+ if (ws->floating->items[i] == child) {
+ list_del(ws->floating, i);
+ break;
+ }
}
+ child->is_floating = false;
}
child->parent = NULL;
container_notify_subtree_changed(parent);
@@ -154,6 +169,26 @@ struct sway_container *container_remove_child(struct sway_container *child) {
return parent;
}
+void container_add_floating(struct sway_container *workspace,
+ struct sway_container *child) {
+ if (!sway_assert(workspace->type == C_WORKSPACE && child->type == C_VIEW,
+ "Attempted to float non-view and/or in non-workspace")) {
+ return;
+ }
+ if (!sway_assert(!child->parent,
+ "child already has a parent (invalid call)")) {
+ return;
+ }
+ if (!sway_assert(!child->is_floating,
+ "child is already floating (invalid state)")) {
+ return;
+ }
+ struct sway_workspace *ws = workspace->sway_workspace;
+ list_add(ws->floating, child);
+ child->parent = workspace;
+ child->is_floating = true;
+}
+
void container_move_to(struct sway_container *container,
struct sway_container *destination) {
if (container == destination