add function to find addresses of client tree nodes

This commit is contained in:
Akos Horvath 2023-05-28 17:25:39 +02:00
parent ca70f08995
commit ea2c1dcfbd
2 changed files with 47 additions and 0 deletions

46
util.c
View File

@ -418,6 +418,52 @@ ret:
return ret;
}
PtrArray wm_treenode_find_client_nodes_ptr(TreeNode *root)
{
assert(root);
PtrArray ret = wm_ptrarray_new();
NodeArray visited = wm_nodearray_new();
wm_nodearray_push(&visited, *root);
PtrArray queue = wm_ptrarray_new();
wm_ptrarray_push(&queue, root);
while (queue.size > 0) {
TreeNode *node;
if (!wm_ptrarray_pop_front(&queue, (void**)&node))
goto ret;
if (node->type == NODE_CLIENT)
wm_ptrarray_push(&ret, node);
for (int i = 0; i < node->children.size; i++) {
TreeNode child_node = node->children.nodes[i];
bool _visited = false;
for (int j = 0; j < visited.size; j++) {
if (visited.nodes[j].children.nodes == child_node.children.nodes) {
_visited = true;
break;
}
}
if (!_visited) {
wm_nodearray_push(&visited, child_node);
wm_ptrarray_push(&queue, &child_node);
}
}
}
ret:
wm_nodearray_free(&visited);
wm_ptrarray_free(&queue);
return ret;
}
ClientArray wm_clientarray_new()
{
ClientArray arr;

1
util.h
View File

@ -82,6 +82,7 @@ bool wm_ptrarray_remove(PtrArray *arr, size_t index);
void wm_ptrarray_free(PtrArray *arr);
TreeNode* wm_treenode_ptr_find_focused_client_node(TreeNode *root);
TreeNode* wm_treenode_ptr_find_client_node(TreeNode *root, Client *client);
PtrArray wm_treenode_find_client_nodes_ptr(TreeNode *root);
ClientArray wm_clientarray_new();
void wm_clientarray_push(ClientArray *arr, Client node);