From 1901c34e819deedc7ef66dae08f8cada2754db0e Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Thu, 4 Jul 2024 12:40:44 -0400 Subject: [PATCH] wlr_scene: Introduce struct wlr_scene_subsurface_tree --- include/wlr/types/wlr_scene.h | 6 +++++- types/scene/drag_icon.c | 4 ++-- types/scene/layer_shell_v1.c | 2 +- types/scene/subsurface_tree.c | 32 +++++++++++++++++++++++--------- types/scene/xdg_shell.c | 4 ++-- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h index a8fc21595..85587a380 100644 --- a/include/wlr/types/wlr_scene.h +++ b/include/wlr/types/wlr_scene.h @@ -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); /** diff --git a/types/scene/drag_icon.c b/types/scene/drag_icon.c index 84b202c3d..91c5866ec 100644 --- a/types/scene/drag_icon.c +++ b/types/scene/drag_icon.c @@ -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); } diff --git a/types/scene/layer_shell_v1.c b/types/scene/layer_shell_v1.c index 4ae736ddf..bf34256eb 100644 --- a/types/scene/layer_shell_v1.c +++ b/types/scene/layer_shell_v1.c @@ -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); diff --git a/types/scene/subsurface_tree.c b/types/scene/subsurface_tree.c index c4a5a1d54..c165ece87 100644 --- a/types/scene/subsurface_tree.c +++ b/types/scene/subsurface_tree.c @@ -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( diff --git a/types/scene/xdg_shell.c b/types/scene/xdg_shell.c index ed792633d..f9668f933 100644 --- a/types/scene/xdg_shell.c +++ b/types/scene/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_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) {