wlr_scene: wlr_scene_subsurface_tree_set_clip takes struct wlr_scene_subsurface_tree

This commit is contained in:
Alexander Orzechowski 2024-07-04 13:13:52 -04:00
parent 3a997b7454
commit 9be258994d
2 changed files with 16 additions and 49 deletions

View file

@ -131,12 +131,14 @@ struct wlr_scene_surface {
struct wl_listener surface_commit;
};
struct wlr_scene_subsurface_tree_surface;
struct wlr_scene_subsurface_tree {
struct wlr_scene_tree *tree;
// private state
struct wl_list surfaces;
struct wlr_scene_subsurface_tree_surface *root;
};
/** A scene-graph node displaying a solid-colored rectangle */
@ -565,7 +567,7 @@ struct wlr_scene_subsurface_tree *wlr_scene_subsurface_tree_create(
*
* A NULL or empty clip will disable clipping
*/
void wlr_scene_subsurface_tree_set_clip(struct wlr_scene_node *node,
void wlr_scene_subsurface_tree_set_clip(struct wlr_scene_subsurface_tree *tree,
const struct wlr_box *clip);
/**

View file

@ -328,62 +328,27 @@ struct wlr_scene_subsurface_tree *wlr_scene_subsurface_tree_create(
return NULL;
}
subsurface_tree->root = subsurface_tree_surface;
subsurface_tree->tree = subsurface_tree_surface->tree;
return subsurface_tree;
}
static struct wlr_scene_subsurface_tree_surface *get_subsurface_tree_from_node(
struct wlr_scene_node *node) {
struct wlr_addon *addon = wlr_addon_find(&node->addons, NULL, &subsurface_tree_addon_impl);
if (!addon) {
return NULL;
}
struct wlr_scene_subsurface_tree_surface *tree =
wl_container_of(addon, tree, scene_addon);
return tree;
}
static bool subsurface_tree_set_clip(struct wlr_scene_node *node,
void wlr_scene_subsurface_tree_set_clip(struct wlr_scene_subsurface_tree *tree,
const struct wlr_box *clip) {
if (node->type != WLR_SCENE_NODE_TREE) {
return false;
if (wlr_box_equal(&tree->root->clip, clip)) {
return;
}
bool discovered_subsurface_tree = false;
struct wlr_scene_subsurface_tree_surface *tree = get_subsurface_tree_from_node(node);
if (tree) {
if (tree->parent == NULL) {
if (wlr_box_equal(&tree->clip, clip)) {
return true;
}
if (clip) {
tree->clip = *clip;
} else {
tree->clip = (struct wlr_box){0};
}
}
discovered_subsurface_tree = true;
subsurface_tree_reconfigure_clip(tree);
if (clip) {
tree->root->clip = *clip;
} else {
tree->root->clip = (struct wlr_box){0};
}
struct wlr_scene_tree *scene_tree = wlr_scene_tree_from_node(node);
struct wlr_scene_node *child;
wl_list_for_each(child, &scene_tree->children, link) {
discovered_subsurface_tree |= subsurface_tree_set_clip(child, clip);
// iterate in reverse because children of parent subsurface will appear
// earlier in the list.
struct wlr_scene_subsurface_tree_surface *surface;
wl_list_for_each_reverse(surface, &tree->surfaces, link) {
subsurface_tree_reconfigure_clip(surface);
}
return discovered_subsurface_tree;
}
void wlr_scene_subsurface_tree_set_clip(struct wlr_scene_node *node,
const struct wlr_box *clip) {
#ifndef NDEBUG
bool found =
#endif
subsurface_tree_set_clip(node, clip);
assert(found);
}