diff --git a/types/scene/subsurface_tree.c b/types/scene/subsurface_tree.c index 494d07e13..840f70e6d 100644 --- a/types/scene/subsurface_tree.c +++ b/types/scene/subsurface_tree.c @@ -22,11 +22,10 @@ struct wlr_scene_subsurface_tree_surface { struct wl_listener surface_map; struct wl_listener surface_unmap; struct wl_listener surface_new_subsurface; + struct wl_listener scene_destroy; struct wlr_scene_subsurface_tree_surface *parent; // NULL for the top-level surface - struct wlr_addon scene_addon; - struct wlr_box clip; struct wl_list link; @@ -37,9 +36,9 @@ struct wlr_scene_subsurface_tree_surface { struct wl_listener subsurface_destroy; }; -static void subsurface_tree_addon_destroy(struct wlr_addon *addon) { +static void subsurface_tree_handle_scene_destroy(struct wl_listener *listener, void *data) { struct wlr_scene_subsurface_tree_surface *subsurface_tree = - wl_container_of(addon, subsurface_tree, scene_addon); + wl_container_of(listener, subsurface_tree, scene_destroy); // tree and scene_surface will be cleaned up by scene_node_finish if (subsurface_tree->parent) { wlr_addon_finish(&subsurface_tree->surface_addon); @@ -47,12 +46,12 @@ static void subsurface_tree_addon_destroy(struct wlr_addon *addon) { } else { free(subsurface_tree->subsurface_tree); } - wlr_addon_finish(&subsurface_tree->scene_addon); wl_list_remove(&subsurface_tree->surface_destroy.link); wl_list_remove(&subsurface_tree->surface_commit.link); wl_list_remove(&subsurface_tree->surface_map.link); wl_list_remove(&subsurface_tree->surface_unmap.link); wl_list_remove(&subsurface_tree->surface_new_subsurface.link); + wl_list_remove(&subsurface_tree->scene_destroy.link); wl_list_remove(&subsurface_tree->link); free(subsurface_tree); } @@ -236,11 +235,6 @@ static void subsurface_tree_handle_surface_new_subsurface( } } -static const struct wlr_addon_interface subsurface_tree_addon_impl = { - .name = "wlr_scene_subsurface_tree_surface", - .destroy = subsurface_tree_addon_destroy, -}; - 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) { @@ -281,8 +275,8 @@ static struct wlr_scene_subsurface_tree_surface *scene_surface_tree_create_surfa wl_list_insert(&tree->surfaces, &subsurface_tree->link); subsurface_tree_reconfigure(subsurface_tree); - wlr_addon_init(&subsurface_tree->scene_addon, &subsurface_tree->tree->node.addons, - NULL, &subsurface_tree_addon_impl); + subsurface_tree->scene_destroy.notify = subsurface_tree_handle_scene_destroy; + wl_signal_add(&subsurface_tree->tree->node.events.destroy, &subsurface_tree->scene_destroy); subsurface_tree->surface_destroy.notify = subsurface_tree_handle_surface_destroy; wl_signal_add(&surface->events.destroy, &subsurface_tree->surface_destroy);