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 wl_listener surface_commit;
}; };
struct wlr_scene_subsurface_tree_surface;
struct wlr_scene_subsurface_tree { struct wlr_scene_subsurface_tree {
struct wlr_scene_tree *tree; struct wlr_scene_tree *tree;
// private state // private state
struct wl_list surfaces; struct wl_list surfaces;
struct wlr_scene_subsurface_tree_surface *root;
}; };
/** A scene-graph node displaying a solid-colored rectangle */ /** 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 * 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); const struct wlr_box *clip);
/** /**

View file

@ -328,62 +328,27 @@ struct wlr_scene_subsurface_tree *wlr_scene_subsurface_tree_create(
return NULL; return NULL;
} }
subsurface_tree->root = subsurface_tree_surface;
subsurface_tree->tree = subsurface_tree_surface->tree; subsurface_tree->tree = subsurface_tree_surface->tree;
return subsurface_tree; return subsurface_tree;
} }
static struct wlr_scene_subsurface_tree_surface *get_subsurface_tree_from_node( void wlr_scene_subsurface_tree_set_clip(struct wlr_scene_subsurface_tree *tree,
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,
const struct wlr_box *clip) { const struct wlr_box *clip) {
if (node->type != WLR_SCENE_NODE_TREE) { if (wlr_box_equal(&tree->root->clip, clip)) {
return false; 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) { if (clip) {
tree->clip = *clip; tree->root->clip = *clip;
} else { } else {
tree->clip = (struct wlr_box){0}; tree->root->clip = (struct wlr_box){0};
}
} }
discovered_subsurface_tree = true; // iterate in reverse because children of parent subsurface will appear
subsurface_tree_reconfigure_clip(tree); // 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);
} }
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);
}
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);
} }