From 3e5f29057f190dc6bb961c3f6ac10e88050a16a6 Mon Sep 17 00:00:00 2001 From: Akos Horvath Date: Fri, 29 Sep 2023 21:51:04 +0200 Subject: [PATCH] update ws_treenode_remove_node, add printing util function --- src/util.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++------- src/util.h | 3 +- 2 files changed, 72 insertions(+), 11 deletions(-) diff --git a/src/util.c b/src/util.c index 76c9452..7e25df8 100644 --- a/src/util.c +++ b/src/util.c @@ -2,6 +2,7 @@ #include "wm.h" #include #include +#include #include #include #include @@ -156,6 +157,13 @@ char* wm_treenode_to_str(TreeNode *node) return ret; } +void wm_treenode_print(TreeNode *node) +{ + char *str = wm_treenode_to_str(node); + DEBUG_PRINT("%s\n", str); + free(str); +} + void wm_tree_to_DOT(TreeNode *root, const char *filename) { DEBUG_PRINT("%s\n", __func__); @@ -216,23 +224,73 @@ int wm_get_node_index(TreeNode *parent, unsigned int node_id) return -1; } -void wm_treenode_remove_node(TreeNode *root, unsigned int node_id) +void wm_treenode_remove_node(Wm *wm, TreeNode *root, TreeNode *node) { DEBUG_PRINT("%s\n", __func__); - assert(root); - PtrArray all_nodes = wm_all_nodes_to_ptrarray(root); + wm_tree_to_DOT(root, "wm_output.dot"); - for (size_t i = 0; i < all_nodes.size; i++) { - TreeNode *node = all_nodes.ptrs[i]; - if (node->id == node_id) { - TreeNode *parent = node->parent; - int index = wm_get_node_index(parent, node_id); - assert(index >= 0); + assert(node); - wm_nodearray_remove(&parent->children, index); + TreeNode *parent = node->parent; + + if (node->parent == NULL) { + node->client = NULL; + return; + } + + for (size_t i = 0; i < parent->children.size; i++) { + if (parent->children.nodes[i]->type == NODE_CLIENT && + parent->children.nodes[i] != node) { + + parent->type = NODE_CLIENT; + parent->client = parent->children.nodes[i]->client; + wm_treenode_free(node); + wm_treenode_free(parent->children.nodes[i]); + wm_nodearray_clear(&parent->children); + return; } } + + DEBUG_PRINT("%s: other_client was NULL!\n", __func__); + + TreeNode *sibling_node = wm_treenode_split_get_sibling(node); + wm_treenode_free(node); + + // wm_nodearray_free(&node->children); + + // TODO + size_t dock_y = 0; + + if (parent->parent == NULL) { + // parent is root node + DEBUG_PRINT("parent is root node!\n"); + sibling_node->parent = NULL; + assert(node->type == NODE_CLIENT); + node->client->ws->tree = sibling_node; + + node->client->ws->tree->pos = (Rect) { + .x = wm->config.border_width, .y = wm->config.border_width + dock_y , + .w = node->client->ws->monitor->info.width - wm->config.border_width*2, + .h = node->client->ws->monitor->info.height - wm->config.border_width*2 - dock_y, + }; + + assert(node->client->ws->tree->children.size == 2); + wm_treenode_split_space(node->client->ws->tree, &node->client->ws->tree->children.nodes[0]->pos, + &node->client->ws->tree->children.nodes[1]->pos); + } else { + sibling_node->parent = parent->parent; + *parent = *sibling_node; + + for (size_t i = 0; i < parent->children.size; i++) { + parent->children.nodes[i]->parent = parent; + } + + wm_treenode_recalculate_space(parent->parent); + wm_treenode_recalculate_space(parent); + } + + assert(node->client->ws->tree->children.size >= 1); } TreeNode* wm_treenode_split_get_sibling(TreeNode *node) @@ -555,10 +613,12 @@ void wm_ptrarray_free(PtrArray *arr) { // DEBUG_PRINT("%s\n", __func__); assert(arr); + RETURN_IF_NULL(arr->ptrs); arr->capacity = 0; arr->size = 0; free(arr->ptrs); + arr->ptrs = NULL; } TreeNode* wm_treenode_ptr_find_focused_client_node(TreeNode *root) diff --git a/src/util.h b/src/util.h index 5d81eae..2acfac5 100644 --- a/src/util.h +++ b/src/util.h @@ -68,11 +68,12 @@ void wm_treenode_split_space(TreeNode *node, Rect *ret1, Rect *ret2); void wm_treenode_recalculate_space(TreeNode *node); void wm_treenode_swap(TreeNode *root, TreeNode *node1, TreeNode* node2); TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client); -void wm_treenode_remove_node(TreeNode *root, unsigned int node_id); +void wm_treenode_remove_node(Wm *wm, TreeNode *root, TreeNode *node); int wm_get_node_index(TreeNode *parent, unsigned int node_id); void wm_tree_to_DOT(TreeNode *root, const char *filename); void wm_node_type_to_str(NodeType type, char *buf, size_t bufsize); char* wm_treenode_to_str(TreeNode *node); +void wm_treenode_print(TreeNode *node); NodeArray wm_nodearray_new(); void wm_nodearray_push(NodeArray *arr, TreeNode *node);