Destroy wlr_surface with wlr_renderer

This commit is contained in:
emersion 2018-04-26 00:11:36 +01:00
parent d47713ac0f
commit 449f06556a
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
6 changed files with 33 additions and 12 deletions

View file

@ -32,10 +32,13 @@ static const struct wl_region_interface region_impl = {
.subtract = region_subtract,
};
static void destroy_region(struct wl_resource *resource) {
static void region_handle_resource_destroy(struct wl_resource *resource) {
pixman_region32_t *reg = wlr_region_from_resource(resource);
pixman_region32_fini(reg);
free(reg);
// Set by wlr_compositor
wl_list_remove(wl_resource_get_link(resource));
}
struct wl_resource *wlr_region_create(struct wl_client *client, uint32_t id) {
@ -53,7 +56,7 @@ struct wl_resource *wlr_region_create(struct wl_client *client, uint32_t id) {
return NULL;
}
wl_resource_set_implementation(region_resource, &region_impl, region,
destroy_region);
region_handle_resource_destroy);
return region_resource;
}

View file

@ -622,7 +622,7 @@ void wlr_subsurface_destroy(struct wlr_subsurface *subsurface) {
free(subsurface);
}
static void destroy_surface(struct wl_resource *resource) {
static void surface_handle_resource_destroy(struct wl_resource *resource) {
struct wlr_surface *surface = wlr_surface_from_resource(resource);
wlr_signal_emit_safe(&surface->events.destroy, surface);
@ -634,6 +634,13 @@ static void destroy_surface(struct wl_resource *resource) {
free(surface);
}
static void surface_handle_renderer_destroy(struct wl_listener *listener,
void *data) {
struct wlr_surface *surface =
wl_container_of(listener, surface, renderer_destroy);
wl_resource_destroy(surface->resource);
}
struct wlr_surface *wlr_surface_create(struct wl_resource *res,
struct wlr_renderer *renderer) {
struct wlr_surface *surface = calloc(1, sizeof(struct wlr_surface));
@ -654,7 +661,11 @@ struct wlr_surface *wlr_surface_create(struct wl_resource *res,
wl_list_init(&surface->subsurfaces);
wl_list_init(&surface->subsurface_pending_list);
wl_resource_set_implementation(res, &surface_interface,
surface, destroy_surface);
surface, surface_handle_resource_destroy);
wl_signal_add(&renderer->events.destroy, &surface->renderer_destroy);
surface->renderer_destroy.notify = surface_handle_renderer_destroy;
return surface;
}