wlr_scene: Introduce struct wlr_scene_subsurface_tree

This commit is contained in:
Alexander Orzechowski 2024-07-04 12:40:44 -04:00
parent a093049ec6
commit 1901c34e81
5 changed files with 33 additions and 15 deletions

View file

@ -131,6 +131,10 @@ struct wlr_scene_surface {
struct wl_listener surface_commit;
};
struct wlr_scene_subsurface_tree {
struct wlr_scene_tree *tree;
};
/** A scene-graph node displaying a solid-colored rectangle */
struct wlr_scene_rect {
struct wlr_scene_node node;
@ -547,7 +551,7 @@ void wlr_scene_output_layout_add_output(struct wlr_scene_output_layout *sol,
* Add a node displaying a surface and all of its sub-surfaces to the
* scene-graph.
*/
struct wlr_scene_tree *wlr_scene_subsurface_tree_create(
struct wlr_scene_subsurface_tree *wlr_scene_subsurface_tree_create(
struct wlr_scene_tree *parent, struct wlr_surface *surface);
/**

View file

@ -5,7 +5,7 @@
struct wlr_scene_drag_icon {
struct wlr_scene_tree *tree;
struct wlr_scene_tree *surface_tree;
struct wlr_scene_subsurface_tree *surface_tree;
struct wlr_drag_icon *drag_icon;
struct wl_listener tree_destroy;
@ -17,7 +17,7 @@ static void drag_icon_handle_surface_commit(struct wl_listener *listener, void *
struct wlr_scene_drag_icon *icon =
wl_container_of(listener, icon, drag_icon_surface_commit);
struct wlr_surface *surface = icon->drag_icon->surface;
struct wlr_scene_node *node = &icon->surface_tree->node;
struct wlr_scene_node *node = &icon->surface_tree->tree->node;
wlr_scene_node_set_position(node,
node->x + surface->current.dx, node->y + surface->current.dy);
}

View file

@ -142,7 +142,7 @@ struct wlr_scene_layer_surface_v1 *wlr_scene_layer_surface_v1_create(
return NULL;
}
struct wlr_scene_tree *surface_tree = wlr_scene_subsurface_tree_create(
struct wlr_scene_subsurface_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);

View file

@ -15,6 +15,7 @@ struct wlr_scene_subsurface_tree_surface {
struct wlr_scene_tree *tree;
struct wlr_surface *surface;
struct wlr_scene_surface *scene_surface;
struct wlr_scene_subsurface_tree *subsurface_tree;
struct wl_listener surface_destroy;
struct wl_listener surface_commit;
@ -42,6 +43,8 @@ static void subsurface_tree_addon_destroy(struct wlr_addon *addon) {
if (subsurface_tree->parent) {
wlr_addon_finish(&subsurface_tree->surface_addon);
wl_list_remove(&subsurface_tree->subsurface_destroy.link);
} else {
free(subsurface_tree->subsurface_tree);
}
wlr_addon_finish(&subsurface_tree->scene_addon);
wl_list_remove(&subsurface_tree->surface_destroy.link);
@ -197,14 +200,15 @@ static const struct wlr_addon_interface subsurface_tree_surface_addon_impl = {
.destroy = subsurface_tree_surface_addon_destroy,
};
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create(
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create_surface(
struct wlr_scene_subsurface_tree *tree,
struct wlr_scene_tree *parent, struct wlr_surface *surface);
static bool subsurface_tree_create_subsurface(
struct wlr_scene_subsurface_tree_surface *parent,
struct wlr_subsurface *subsurface) {
struct wlr_scene_subsurface_tree_surface *child = scene_surface_tree_create(
parent->tree, subsurface->surface);
struct wlr_scene_subsurface_tree_surface *child = scene_surface_tree_create_surface(
parent->subsurface_tree, parent->tree, subsurface->surface);
if (child == NULL) {
return false;
}
@ -235,7 +239,8 @@ static const struct wlr_addon_interface subsurface_tree_addon_impl = {
.destroy = subsurface_tree_addon_destroy,
};
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create(
static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create_surface(
struct wlr_scene_subsurface_tree *tree,
struct wlr_scene_tree *parent, struct wlr_surface *surface) {
struct wlr_scene_subsurface_tree_surface *subsurface_tree =
calloc(1, sizeof(*subsurface_tree));
@ -243,6 +248,7 @@ static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create(
return NULL;
}
subsurface_tree->subsurface_tree = tree;
subsurface_tree->tree = wlr_scene_tree_create(parent);
if (subsurface_tree->tree == NULL) {
goto error_surface_tree;
@ -303,14 +309,22 @@ error_surface_tree:
return NULL;
}
struct wlr_scene_tree *wlr_scene_subsurface_tree_create(
struct wlr_scene_subsurface_tree *wlr_scene_subsurface_tree_create(
struct wlr_scene_tree *parent, struct wlr_surface *surface) {
struct wlr_scene_subsurface_tree_surface *subsurface_tree =
scene_surface_tree_create(parent, surface);
if (subsurface_tree == NULL) {
struct wlr_scene_subsurface_tree *subsurface_tree = calloc(1, sizeof(*subsurface_tree));
if (!subsurface_tree) {
return NULL;
}
return subsurface_tree->tree;
struct wlr_scene_subsurface_tree_surface *subsurface_tree_surface =
scene_surface_tree_create_surface(subsurface_tree, parent, surface);
if (subsurface_tree_surface == NULL) {
free(subsurface_tree);
return NULL;
}
subsurface_tree->tree = subsurface_tree_surface->tree;
return subsurface_tree;
}
static struct wlr_scene_subsurface_tree_surface *get_subsurface_tree_from_node(

View file

@ -5,7 +5,7 @@
struct wlr_scene_xdg_surface {
struct wlr_scene_tree *tree;
struct wlr_xdg_surface *xdg_surface;
struct wlr_scene_tree *surface_tree;
struct wlr_scene_subsurface_tree *surface_tree;
struct wl_listener tree_destroy;
struct wl_listener xdg_surface_destroy;
@ -36,7 +36,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_tree->node,
wlr_scene_node_set_position(&scene_xdg_surface->surface_tree->tree->node,
-geo.x, -geo.y);
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {