update ws_treenode_remove_node, add printing util function
This commit is contained in:
parent
f8bd395e50
commit
3e5f29057f
80
src/util.c
80
src/util.c
@ -2,6 +2,7 @@
|
|||||||
#include "wm.h"
|
#include "wm.h"
|
||||||
#include <json-c/json_object.h>
|
#include <json-c/json_object.h>
|
||||||
#include <json-c/json_tokener.h>
|
#include <json-c/json_tokener.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -156,6 +157,13 @@ char* wm_treenode_to_str(TreeNode *node)
|
|||||||
return ret;
|
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)
|
void wm_tree_to_DOT(TreeNode *root, const char *filename)
|
||||||
{
|
{
|
||||||
DEBUG_PRINT("%s\n", __func__);
|
DEBUG_PRINT("%s\n", __func__);
|
||||||
@ -216,23 +224,73 @@ int wm_get_node_index(TreeNode *parent, unsigned int node_id)
|
|||||||
return -1;
|
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__);
|
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++) {
|
assert(node);
|
||||||
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);
|
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)
|
TreeNode* wm_treenode_split_get_sibling(TreeNode *node)
|
||||||
@ -555,10 +613,12 @@ void wm_ptrarray_free(PtrArray *arr)
|
|||||||
{
|
{
|
||||||
// DEBUG_PRINT("%s\n", __func__);
|
// DEBUG_PRINT("%s\n", __func__);
|
||||||
assert(arr);
|
assert(arr);
|
||||||
|
RETURN_IF_NULL(arr->ptrs);
|
||||||
|
|
||||||
arr->capacity = 0;
|
arr->capacity = 0;
|
||||||
arr->size = 0;
|
arr->size = 0;
|
||||||
free(arr->ptrs);
|
free(arr->ptrs);
|
||||||
|
arr->ptrs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
TreeNode* wm_treenode_ptr_find_focused_client_node(TreeNode *root)
|
TreeNode* wm_treenode_ptr_find_focused_client_node(TreeNode *root)
|
||||||
|
@ -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_recalculate_space(TreeNode *node);
|
||||||
void wm_treenode_swap(TreeNode *root, TreeNode *node1, TreeNode* node2);
|
void wm_treenode_swap(TreeNode *root, TreeNode *node1, TreeNode* node2);
|
||||||
TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client);
|
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);
|
int wm_get_node_index(TreeNode *parent, unsigned int node_id);
|
||||||
void wm_tree_to_DOT(TreeNode *root, const char *filename);
|
void wm_tree_to_DOT(TreeNode *root, const char *filename);
|
||||||
void wm_node_type_to_str(NodeType type, char *buf, size_t bufsize);
|
void wm_node_type_to_str(NodeType type, char *buf, size_t bufsize);
|
||||||
char* wm_treenode_to_str(TreeNode *node);
|
char* wm_treenode_to_str(TreeNode *node);
|
||||||
|
void wm_treenode_print(TreeNode *node);
|
||||||
|
|
||||||
NodeArray wm_nodearray_new();
|
NodeArray wm_nodearray_new();
|
||||||
void wm_nodearray_push(NodeArray *arr, TreeNode *node);
|
void wm_nodearray_push(NodeArray *arr, TreeNode *node);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user