diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h index f2773c6b..cec54a0b 100644 --- a/include/wlr/types/wlr_scene.h +++ b/include/wlr/types/wlr_scene.h @@ -118,6 +118,12 @@ void wlr_scene_node_place_below(struct wlr_scene_node *node, */ void wlr_scene_node_reparent(struct wlr_scene_node *node, struct wlr_scene_node *new_parent); +/** + * Get the node's layout-local coordinates. + * + * True is returned if the node and all of its ancestors are enabled. + */ +bool wlr_scene_node_coords(struct wlr_scene_node *node, int *lx, int *ly); /** * Call `iterator` on each surface in the scene-graph, with the surface's * position in layout coordinates. The function is called from root to leaves diff --git a/types/wlr_scene.c b/types/wlr_scene.c index 4498c5f0..d38baf75 100644 --- a/types/wlr_scene.c +++ b/types/wlr_scene.c @@ -193,6 +193,22 @@ void wlr_scene_node_reparent(struct wlr_scene_node *node, wl_list_insert(new_parent->state.children.prev, &node->state.link); } +bool wlr_scene_node_coords(struct wlr_scene_node *node, + int *lx_ptr, int *ly_ptr) { + int lx = 0, ly = 0; + bool enabled = true; + while (node != NULL) { + lx += node->state.x; + ly += node->state.y; + enabled = enabled && node->state.enabled; + node = node->parent; + } + + *lx_ptr = lx; + *ly_ptr = ly; + return enabled; +} + static void scene_node_for_each_surface(struct wlr_scene_node *node, int lx, int ly, wlr_surface_iterator_func_t user_iterator, void *user_data) {