update ws_treenode_remove_node, add printing util function

This commit is contained in:
Akos Horvath 2023-09-29 21:51:04 +02:00
parent f8bd395e50
commit 3e5f29057f
2 changed files with 72 additions and 11 deletions

View File

@ -2,6 +2,7 @@
#include "wm.h"
#include <json-c/json_object.h>
#include <json-c/json_tokener.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@ -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");
assert(node);
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);
wm_nodearray_remove(&parent->children, index);
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)

View File

@ -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);