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 c41bd320be
commit 86e9309808
2 changed files with 15 additions and 0 deletions

View File

@ -35,6 +35,7 @@ struct wlr_scene_node_state {
struct wl_list children; // wlr_scene_node_state.link struct wl_list children; // wlr_scene_node_state.link
bool enabled;
int x, y; // relative to parent int x, y; // relative to parent
}; };
@ -68,6 +69,11 @@ struct wlr_scene_surface {
* Immediately destroy the scene-graph node. * Immediately destroy the scene-graph node.
*/ */
void wlr_scene_node_destroy(struct wlr_scene_node *node); void wlr_scene_node_destroy(struct wlr_scene_node *node);
/**
* Enable or disable this node. If a node is disabled, all of its children are
* implicitly disabled as well.
*/
void wlr_scene_node_set_enabled(struct wlr_scene_node *node, bool enabled);
/** /**
* Set the position of the node relative to its parent. * Set the position of the node relative to its parent.
*/ */

View File

@ -21,6 +21,7 @@ static struct wlr_scene_surface *scene_surface_from_node(
static void scene_node_state_init(struct wlr_scene_node_state *state) { static void scene_node_state_init(struct wlr_scene_node_state *state) {
wl_list_init(&state->children); wl_list_init(&state->children);
wl_list_init(&state->link); wl_list_init(&state->link);
state->enabled = true;
} }
static void scene_node_state_finish(struct wlr_scene_node_state *state) { static void scene_node_state_finish(struct wlr_scene_node_state *state) {
@ -108,6 +109,10 @@ struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_node *parent
return scene_surface; return scene_surface;
} }
void wlr_scene_node_set_enabled(struct wlr_scene_node *node, bool enabled) {
node->state.enabled = enabled;
}
void wlr_scene_node_set_position(struct wlr_scene_node *node, int x, int y) { void wlr_scene_node_set_position(struct wlr_scene_node *node, int x, int y) {
node->state.x = x; node->state.x = x;
node->state.y = y; node->state.y = y;
@ -132,6 +137,10 @@ void wlr_scene_node_place_below(struct wlr_scene_node *node,
static void scene_node_for_each_surface(struct wlr_scene_node *node, static void scene_node_for_each_surface(struct wlr_scene_node *node,
int lx, int ly, wlr_surface_iterator_func_t user_iterator, int lx, int ly, wlr_surface_iterator_func_t user_iterator,
void *user_data) { void *user_data) {
if (!node->state.enabled) {
return;
}
lx += node->state.x; lx += node->state.x;
ly += node->state.y; ly += node->state.y;