mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-17 06:46:39 -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 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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue