summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--layer_shell_v1.c27
-rw-r--r--subsurface_tree.c14
-rw-r--r--surface.c2
-rw-r--r--wlr_scene.c54
-rw-r--r--xdg_shell.c16
5 files changed, 65 insertions, 48 deletions
diff --git a/layer_shell_v1.c b/layer_shell_v1.c
index 1c2b6e4..eb0bc76 100644
--- a/layer_shell_v1.c
+++ b/layer_shell_v1.c
@@ -18,21 +18,21 @@ static void scene_layer_surface_handle_layer_surface_destroy(
struct wl_listener *listener, void *data) {
struct wlr_scene_layer_surface_v1 *scene_layer_surface =
wl_container_of(listener, scene_layer_surface, layer_surface_destroy);
- wlr_scene_node_destroy(scene_layer_surface->node);
+ wlr_scene_node_destroy(&scene_layer_surface->tree->node);
}
static void scene_layer_surface_handle_layer_surface_map(
struct wl_listener *listener, void *data) {
struct wlr_scene_layer_surface_v1 *scene_layer_surface =
wl_container_of(listener, scene_layer_surface, layer_surface_map);
- wlr_scene_node_set_enabled(scene_layer_surface->node, true);
+ wlr_scene_node_set_enabled(&scene_layer_surface->tree->node, true);
}
static void scene_layer_surface_handle_layer_surface_unmap(
struct wl_listener *listener, void *data) {
struct wlr_scene_layer_surface_v1 *scene_layer_surface =
wl_container_of(listener, scene_layer_surface, layer_surface_unmap);
- wlr_scene_node_set_enabled(scene_layer_surface->node, false);
+ wlr_scene_node_set_enabled(&scene_layer_surface->tree->node, false);
}
static void layer_surface_exclusive_zone(
@@ -122,7 +122,7 @@ void wlr_scene_layer_surface_v1_configure(
box.y = bounds.y + bounds.height/2 - box.height/2;
}
- wlr_scene_node_set_position(scene_layer_surface->node, box.x, box.y);
+ wlr_scene_node_set_position(&scene_layer_surface->tree->node, box.x, box.y);
wlr_layer_surface_v1_configure(layer_surface, box.width, box.height);
if (state->exclusive_zone > 0) {
@@ -131,7 +131,7 @@ void wlr_scene_layer_surface_v1_configure(
}
struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create(
- struct wlr_scene_node *parent,
+ struct wlr_scene_tree *parent,
struct wlr_layer_surface_v1 *layer_surface) {
struct wlr_scene_layer_surface_v1 *scene_layer_surface =
calloc(1, sizeof(*scene_layer_surface));
@@ -141,24 +141,23 @@ struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create(
scene_layer_surface->layer_surface = layer_surface;
- struct wlr_scene_tree *tree = wlr_scene_tree_create(parent);
- if (tree == NULL) {
+ scene_layer_surface->tree = wlr_scene_tree_create(parent);
+ if (scene_layer_surface->tree == NULL) {
free(scene_layer_surface);
return NULL;
}
- scene_layer_surface->node = &tree->node;
- struct wlr_scene_node *surface_node = wlr_scene_subsurface_tree_create(
- scene_layer_surface->node, layer_surface->surface);
- if (surface_node == NULL) {
- wlr_scene_node_destroy(scene_layer_surface->node);
+ struct wlr_scene_tree *surface_tree = wlr_scene_subsurface_tree_create(
+ scene_layer_surface->tree, layer_surface->surface);
+ if (surface_tree == NULL) {
+ wlr_scene_node_destroy(&scene_layer_surface->tree->node);
free(scene_layer_surface);
return NULL;
}
scene_layer_surface->tree_destroy.notify =
scene_layer_surface_handle_tree_destroy;
- wl_signal_add(&scene_layer_surface->node->events.destroy,
+ wl_signal_add(&scene_layer_surface->tree->node.events.destroy,
&scene_layer_surface->tree_destroy);
scene_layer_surface->layer_surface_destroy.notify =
@@ -176,7 +175,7 @@ struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create(
wl_signal_add(&layer_surface->events.unmap,
&scene_layer_surface->layer_surface_unmap);
- wlr_scene_node_set_enabled(scene_layer_surface->node,
+ wlr_scene_node_set_enabled(&scene_layer_surface->tree->node,
layer_surface->mapped);
return scene_layer_surface;
diff --git a/subsurface_tree.c b/subsurface_tree.c
index 1cb2977..35420ab 100644
--- a/subsurface_tree.c
+++ b/subsurface_tree.c
@@ -148,13 +148,13 @@ static const struct wlr_addon_interface subsurface_tree_addon_impl = {
};
static struct wlr_scene_subsurface_tree *scene_surface_tree_create(
- struct wlr_scene_node *parent, struct wlr_surface *surface);
+ struct wlr_scene_tree *parent, struct wlr_surface *surface);
static bool subsurface_tree_create_subsurface(
struct wlr_scene_subsurface_tree *parent,
struct wlr_subsurface *subsurface) {
struct wlr_scene_subsurface_tree *child = scene_surface_tree_create(
- &parent->tree->node, subsurface->surface);
+ parent->tree, subsurface->surface);
if (child == NULL) {
return false;
}
@@ -188,7 +188,7 @@ static void subsurface_tree_handle_surface_new_subsurface(
}
static struct wlr_scene_subsurface_tree *scene_surface_tree_create(
- struct wlr_scene_node *parent, struct wlr_surface *surface) {
+ struct wlr_scene_tree *parent, struct wlr_surface *surface) {
struct wlr_scene_subsurface_tree *subsurface_tree =
calloc(1, sizeof(*subsurface_tree));
if (subsurface_tree == NULL) {
@@ -201,7 +201,7 @@ static struct wlr_scene_subsurface_tree *scene_surface_tree_create(
}
subsurface_tree->scene_surface =
- wlr_scene_surface_create(&subsurface_tree->tree->node, surface);
+ wlr_scene_surface_create(subsurface_tree->tree, surface);
if (subsurface_tree->scene_surface == NULL) {
goto error_scene_surface;
}
@@ -248,12 +248,12 @@ error_surface_tree:
return NULL;
}
-struct wlr_scene_node *wlr_scene_subsurface_tree_create(
- struct wlr_scene_node *parent, struct wlr_surface *surface) {
+struct wlr_scene_tree *wlr_scene_subsurface_tree_create(
+ struct wlr_scene_tree *parent, struct wlr_surface *surface) {
struct wlr_scene_subsurface_tree *subsurface_tree =
scene_surface_tree_create(parent, surface);
if (subsurface_tree == NULL) {
return NULL;
}
- return &subsurface_tree->tree->node;
+ return subsurface_tree->tree;
}
diff --git a/surface.c b/surface.c
index e6a8b6b..d3a0b03 100644
--- a/surface.c
+++ b/surface.c
@@ -135,7 +135,7 @@ struct wlr_scene_surface *wlr_scene_surface_from_buffer(
return surface;
}
-struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_node *parent,
+struct wlr_scene_surface *wlr_scene_surface_create(struct wlr_scene_tree *parent,
struct wlr_surface *wlr_surface) {
struct wlr_scene_surface *surface = calloc(1, sizeof(*surface));
if (surface == NULL) {
diff --git a/wlr_scene.c b/wlr_scene.c
index 410fbe3..e60ff5d 100644
--- a/wlr_scene.c
+++ b/wlr_scene.c
@@ -17,6 +17,11 @@
#define HIGHLIGHT_DAMAGE_FADEOUT_TIME 250
+static struct wlr_scene_tree *scene_tree_from_node(struct wlr_scene_node *node) {
+ assert(node->type == WLR_SCENE_NODE_TREE);
+ return (struct wlr_scene_tree *)node;
+}
+
static struct wlr_scene_rect *scene_rect_from_node(
struct wlr_scene_node *node) {
assert(node->type == WLR_SCENE_NODE_RECT);
@@ -30,10 +35,17 @@ struct wlr_scene_buffer *wlr_scene_buffer_from_node(
}
struct wlr_scene *scene_node_get_root(struct wlr_scene_node *node) {
- while (node->parent != NULL) {
- node = node->parent;
+ struct wlr_scene_tree *tree;
+ if (node->type == WLR_SCENE_NODE_TREE) {
+ tree = scene_tree_from_node(node);
+ } else {
+ tree = node->parent;
+ }
+
+ while (tree->node.parent != NULL) {
+ tree = tree->node.parent;
}
- return (struct wlr_scene *)node;
+ return (struct wlr_scene *)tree;
}
static void scene_node_state_init(struct wlr_scene_node_state *state) {
@@ -48,7 +60,7 @@ static void scene_node_state_finish(struct wlr_scene_node_state *state) {
}
static void scene_node_init(struct wlr_scene_node *node,
- enum wlr_scene_node_type type, struct wlr_scene_node *parent) {
+ enum wlr_scene_node_type type, struct wlr_scene_tree *parent) {
memset(node, 0, sizeof(*node));
node->type = type;
node->parent = parent;
@@ -56,7 +68,7 @@ static void scene_node_init(struct wlr_scene_node *node,
wl_signal_init(&node->events.destroy);
if (parent != NULL) {
- wl_list_insert(parent->state.children.prev, &node->state.link);
+ wl_list_insert(parent->node.state.children.prev, &node->state.link);
}
wlr_addon_set_init(&node->addons);
@@ -136,7 +148,7 @@ void wlr_scene_node_destroy(struct wlr_scene_node *node) {
}
static void scene_tree_init(struct wlr_scene_tree *tree,
- struct wlr_scene_node *parent) {
+ struct wlr_scene_tree *parent) {
memset(tree, 0, sizeof(*tree));
scene_node_init(&tree->node, WLR_SCENE_NODE_TREE, parent);
}
@@ -172,7 +184,7 @@ struct wlr_scene *wlr_scene_create(void) {
return scene;
}
-struct wlr_scene_tree *wlr_scene_tree_create(struct wlr_scene_node *parent) {
+struct wlr_scene_tree *wlr_scene_tree_create(struct wlr_scene_tree *parent) {
assert(parent);
struct wlr_scene_tree *tree = calloc(1, sizeof(struct wlr_scene_tree));
@@ -251,7 +263,7 @@ static void scene_node_update_outputs(struct wlr_scene_node *node) {
_scene_node_update_outputs(node, lx, ly, scene);
}
-struct wlr_scene_rect *wlr_scene_rect_create(struct wlr_scene_node *parent,
+struct wlr_scene_rect *wlr_scene_rect_create(struct wlr_scene_tree *parent,
int width, int height, const float color[static 4]) {
struct wlr_scene_rect *scene_rect =
calloc(1, sizeof(struct wlr_scene_rect));
@@ -290,7 +302,7 @@ void wlr_scene_rect_set_color(struct wlr_scene_rect *rect, const float color[sta
scene_node_damage_whole(&rect->node);
}
-struct wlr_scene_buffer *wlr_scene_buffer_create(struct wlr_scene_node *parent,
+struct wlr_scene_buffer *wlr_scene_buffer_create(struct wlr_scene_tree *parent,
struct wlr_buffer *buffer) {
struct wlr_scene_buffer *scene_buffer = calloc(1, sizeof(*scene_buffer));
if (scene_buffer == NULL) {
@@ -615,7 +627,7 @@ void wlr_scene_node_place_below(struct wlr_scene_node *node,
void wlr_scene_node_raise_to_top(struct wlr_scene_node *node) {
struct wlr_scene_node *current_top = wl_container_of(
- node->parent->state.children.prev, current_top, state.link);
+ node->parent->node.state.children.prev, current_top, state.link);
if (node == current_top) {
return;
}
@@ -624,7 +636,7 @@ void wlr_scene_node_raise_to_top(struct wlr_scene_node *node) {
void wlr_scene_node_lower_to_bottom(struct wlr_scene_node *node) {
struct wlr_scene_node *current_bottom = wl_container_of(
- node->parent->state.children.next, current_bottom, state.link);
+ node->parent->node.state.children.next, current_bottom, state.link);
if (node == current_bottom) {
return;
}
@@ -632,7 +644,7 @@ void wlr_scene_node_lower_to_bottom(struct wlr_scene_node *node) {
}
void wlr_scene_node_reparent(struct wlr_scene_node *node,
- struct wlr_scene_node *new_parent) {
+ struct wlr_scene_tree *new_parent) {
assert(new_parent != NULL);
if (node->parent == new_parent) {
@@ -640,16 +652,16 @@ void wlr_scene_node_reparent(struct wlr_scene_node *node,
}
/* Ensure that a node cannot become its own ancestor */
- for (struct wlr_scene_node *ancestor = new_parent; ancestor != NULL;
- ancestor = ancestor->parent) {
- assert(ancestor != node);
+ for (struct wlr_scene_tree *ancestor = new_parent; ancestor != NULL;
+ ancestor = ancestor->node.parent) {
+ assert(&ancestor->node != node);
}
scene_node_damage_whole(node);
wl_list_remove(&node->state.link);
node->parent = new_parent;
- wl_list_insert(new_parent->state.children.prev, &node->state.link);
+ wl_list_insert(new_parent->node.state.children.prev, &node->state.link);
scene_node_damage_whole(node);
@@ -658,13 +670,19 @@ void wlr_scene_node_reparent(struct wlr_scene_node *node,
bool wlr_scene_node_coords(struct wlr_scene_node *node,
int *lx_ptr, int *ly_ptr) {
+ assert(node);
+
int lx = 0, ly = 0;
bool enabled = true;
- while (node != NULL) {
+ while (true) {
lx += node->state.x;
ly += node->state.y;
enabled = enabled && node->state.enabled;
- node = node->parent;
+ if (node->parent == NULL) {
+ break;
+ }
+
+ node = &node->parent->node;
}
*lx_ptr = lx;
diff --git a/xdg_shell.c b/xdg_shell.c
index 909719d..1688348 100644
--- a/xdg_shell.c
+++ b/xdg_shell.c
@@ -5,7 +5,7 @@
struct wlr_scene_xdg_surface {
struct wlr_scene_tree *tree;
struct wlr_xdg_surface *xdg_surface;
- struct wlr_scene_node *surface_node;
+ struct wlr_scene_tree *surface_tree;
struct wl_listener tree_destroy;
struct wl_listener xdg_surface_destroy;
@@ -54,7 +54,7 @@ static void scene_xdg_surface_update_position(
struct wlr_box geo = {0};
wlr_xdg_surface_get_geometry(xdg_surface, &geo);
- wlr_scene_node_set_position(scene_xdg_surface->surface_node,
+ wlr_scene_node_set_position(&scene_xdg_surface->surface_tree->node,
-geo.x, -geo.y);
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
@@ -71,8 +71,8 @@ static void scene_xdg_surface_handle_xdg_surface_commit(struct wl_listener *list
scene_xdg_surface_update_position(scene_xdg_surface);
}
-struct wlr_scene_node *wlr_scene_xdg_surface_create(
- struct wlr_scene_node *parent, struct wlr_xdg_surface *xdg_surface) {
+struct wlr_scene_tree *wlr_scene_xdg_surface_create(
+ struct wlr_scene_tree *parent, struct wlr_xdg_surface *xdg_surface) {
struct wlr_scene_xdg_surface *scene_xdg_surface =
calloc(1, sizeof(*scene_xdg_surface));
if (scene_xdg_surface == NULL) {
@@ -87,9 +87,9 @@ struct wlr_scene_node *wlr_scene_xdg_surface_create(
return NULL;
}
- scene_xdg_surface->surface_node = wlr_scene_subsurface_tree_create(
- &scene_xdg_surface->tree->node, xdg_surface->surface);
- if (scene_xdg_surface->surface_node == NULL) {
+ scene_xdg_surface->surface_tree = wlr_scene_subsurface_tree_create(
+ scene_xdg_surface->tree, xdg_surface->surface);
+ if (scene_xdg_surface->surface_tree == NULL) {
wlr_scene_node_destroy(&scene_xdg_surface->tree->node);
free(scene_xdg_surface);
return NULL;
@@ -120,5 +120,5 @@ struct wlr_scene_node *wlr_scene_xdg_surface_create(
wlr_scene_node_set_enabled(&scene_xdg_surface->tree->node, xdg_surface->mapped);
scene_xdg_surface_update_position(scene_xdg_surface);
- return &scene_xdg_surface->tree->node;
+ return scene_xdg_surface->tree;
}