scene: add wlr_scene_node_toggle

This allows compositors to easily enable or disable a scene-graph node.
This can be used to show/hide a surface when the xdg_surface is
mapped/unmapped.
This commit is contained in:
Simon Ser 2020-05-06 16:16:45 +02:00
parent f686fbd0c6
commit 7e9ad9a67b
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
2 changed files with 17 additions and 0 deletions

View file

@ -32,6 +32,7 @@ struct wlr_scene_node_state {
struct wl_list children; // wlr_scene_node_state.link
bool enabled;
int x, y;
};
@ -66,6 +67,12 @@ void wlr_scene_node_destroy(struct wlr_scene_node *node);
* Atomically apply pending changes for this node and all of its children.
*/
void wlr_scene_node_commit(struct wlr_scene_node *node);
/**
* Enable or disable this node. If a node is disabled, all of its children are
* implicitly disabled as well. This state is double-buffered, see
* wlr_scene_node_commit.
*/
void wlr_scene_node_toggle(struct wlr_scene_node *node, bool enabled);
/**
* Set the position of the node relative to its parent. This state is
* double-buffered, see wlr_scene_node_commit.

View file

@ -21,6 +21,7 @@ static struct wlr_scene_surface *scene_node_get_surface(
static void scene_node_state_init(struct wlr_scene_node_state *state) {
wl_list_init(&state->children);
wl_list_init(&state->link);
state->enabled = true;
}
static void scene_node_state_finish(struct wlr_scene_node_state *state) {
@ -118,6 +119,7 @@ struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_node *parent
static void scene_node_state_move(struct wlr_scene_node_state *dst,
const struct wlr_scene_node_state *src) {
dst->enabled = src->enabled;
dst->x = src->x;
dst->y = src->y;
}
@ -136,6 +138,10 @@ void wlr_scene_node_commit(struct wlr_scene_node *node) {
}
}
void wlr_scene_node_toggle(struct wlr_scene_node *node, bool enabled) {
node->pending.enabled = enabled;
}
void wlr_scene_node_move(struct wlr_scene_node *node, int x, int y) {
node->pending.x = x;
node->pending.y = y;
@ -172,6 +178,10 @@ static void surface_iterator(struct wlr_surface *surface,
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) {
if (!node->current.enabled) {
return;
}
lx += node->current.x;
ly += node->current.y;