fix client removal edge case

This commit is contained in:
2023-08-10 12:02:43 +02:00
parent ce2fb27ccb
commit 57cfbe4496
2 changed files with 21 additions and 1 deletions

View File

@@ -73,6 +73,16 @@ void wm_treenode_split_space(TreeNode *node, Rect *ret1, Rect *ret2)
}
}
void wm_treenode_recalculate_space(TreeNode *node)
{
assert(node);
assert(node->children.size == 2);
wm_treenode_split_space(node, &node->children.nodes[0]->pos,
&node->children.nodes[1]->pos);
}
void wm_node_type_to_str(NodeType type, char *buf, size_t bufsize)
{
switch (type) {
@@ -237,9 +247,18 @@ TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client)
assert(client->ws->tree->children.size == 2);
wm_treenode_split_space(client->ws->tree, &client->ws->tree->children.nodes[0]->pos,
&client->ws->tree->children.nodes[1]->pos);
} else
} else {
sibling_node->parent = node->parent;
*node = *sibling_node;
for (size_t i = 0; i < node->children.size; i++) {
node->children.nodes[i]->parent = node;
}
wm_treenode_recalculate_space(node->parent);
wm_treenode_recalculate_space(node);
}
assert(client->ws->tree->children.size >= 1);
return node->children.nodes[0];
}

View File

@@ -66,6 +66,7 @@ TreeNode* wm_treenode_new(NodeType type, TreeNode *parent);
void wm_treenode_free(TreeNode *node);
bool wm_treenode_is_empty(TreeNode *node);
void wm_treenode_split_space(TreeNode *node, Rect *ret1, Rect *ret2);
void wm_treenode_recalculate_space(TreeNode *node);
TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client);
void wm_treenode_remove_node(TreeNode *root, unsigned int node_id);
int wm_get_node_index(TreeNode *parent, unsigned int node_id);