diff --git a/src/util.c b/src/util.c index 735e932..7204b58 100644 --- a/src/util.c +++ b/src/util.c @@ -313,6 +313,23 @@ bool wm_is_treenode_keyroot(TreeNode *node) return wm_treenode_lmd(node) != wm_treenode_lmd(node->parent); } +PtrArray wm_treenode_all_keyroots(TreeNode *node) +{ + assert(node); + + PtrArray ret = wm_ptrarray_new(); + PtrArray postorder = wm_postorder_traversal(node); + + for (size_t i = 0; i < postorder.size; i++) { + TreeNode *node = ((TreeNode**)postorder.ptrs)[i]; + if (wm_is_treenode_keyroot(node)) + wm_ptrarray_push(&ret, node); + } + + wm_ptrarray_free(&postorder); + return ret; +} + void wm_treenode_print(TreeNode *node) { char *str = wm_treenode_to_str(node); diff --git a/src/util.h b/src/util.h index c764ac6..ec6b521 100644 --- a/src/util.h +++ b/src/util.h @@ -106,6 +106,7 @@ TreeNode* wm_treenode_lmd(TreeNode *node); PtrArray wm_treenode_all_lmds(TreeNode *node); PtrArray wm_postorder_traversal(TreeNode *tree); bool wm_is_treenode_keyroot(TreeNode *node); +PtrArray wm_treenode_all_keyroots(TreeNode *node); ClientArray wm_clientarray_new(); void wm_clientarray_push(ClientArray *arr, Client node);