mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-14 08:22:25 -04:00
wlr_scene: wlr_scene_subsurface_tree_set_clip takes struct wlr_scene_subsurface_tree
This commit is contained in:
parent
3a997b7454
commit
9be258994d
2 changed files with 16 additions and 49 deletions
|
|
@ -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);
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue