fix client removal edge case
This commit is contained in:
21
src/util.c
21
src/util.c
@@ -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];
|
||||
}
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user