aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2020-05-06 16:16:45 +0200
committerSimon Ser <contact@emersion.fr>2021-08-26 21:12:28 +0200
commit86e9309808ae147dff0ac3884148d53b2c3edf2b (patch)
tree3da92be39e007648b2aca38a4d9cb8dee09c2a50
parentc41bd320be0862648188bf4cb3700203c41fb70b (diff)
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.
-rw-r--r--include/wlr/types/wlr_scene.h6
-rw-r--r--types/wlr_scene.c9
2 files changed, 15 insertions, 0 deletions
diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h
index 953b1b87..b5690575 100644
--- a/include/wlr/types/wlr_scene.h
+++ b/include/wlr/types/wlr_scene.h
@@ -35,6 +35,7 @@ struct wlr_scene_node_state {
struct wl_list children; // wlr_scene_node_state.link
+ bool enabled;
int x, y; // relative to parent
};
@@ -69,6 +70,11 @@ struct wlr_scene_surface {
*/
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.
*/
void wlr_scene_node_set_position(struct wlr_scene_node *node, int x, int y);
diff --git a/types/wlr_scene.c b/types/wlr_scene.c
index 7b1690e9..453a960c 100644
--- a/types/wlr_scene.c
+++ b/types/wlr_scene.c
@@ -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) {
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) {
@@ -108,6 +109,10 @@ struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_node *parent
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) {
node->state.x = x;
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,
int lx, int ly, wlr_surface_iterator_func_t user_iterator,
void *user_data) {
+ if (!node->state.enabled) {
+ return;
+ }
+
lx += node->state.x;
ly += node->state.y;