diff --git a/types/wlr_subcompositor.c b/types/wlr_subcompositor.c index b16fc17f9..248b7d17f 100644 --- a/types/wlr_subcompositor.c +++ b/types/wlr_subcompositor.c @@ -292,49 +292,6 @@ void subsurface_handle_parent_commit(struct wlr_subsurface *subsurface) { } } -static struct wlr_subsurface *subsurface_create(struct wlr_surface *surface, - struct wlr_surface *parent, uint32_t version, uint32_t id) { - struct wl_client *client = wl_resource_get_client(surface->resource); - - struct wlr_subsurface *subsurface = - calloc(1, sizeof(struct wlr_subsurface)); - if (!subsurface) { - wl_client_post_no_memory(client); - return NULL; - } - subsurface->synchronized = true; - subsurface->surface = surface; - subsurface->resource = - wl_resource_create(client, &wl_subsurface_interface, version, id); - if (subsurface->resource == NULL) { - free(subsurface); - wl_client_post_no_memory(client); - return NULL; - } - wl_resource_set_implementation(subsurface->resource, - &subsurface_implementation, subsurface, subsurface_resource_destroy); - - wl_signal_init(&subsurface->events.destroy); - - wl_signal_add(&surface->events.client_commit, - &subsurface->surface_client_commit); - subsurface->surface_client_commit.notify = - subsurface_handle_surface_client_commit; - - // link parent - subsurface->parent = parent; - wl_signal_add(&parent->events.destroy, &subsurface->parent_destroy); - subsurface->parent_destroy.notify = subsurface_handle_parent_destroy; - - wl_list_init(&subsurface->current.link); - wl_list_insert(parent->pending.subsurfaces_above.prev, - &subsurface->pending.link); - - surface->role_data = subsurface; - - return subsurface; -} - struct wlr_subsurface *wlr_subsurface_try_from_wlr_surface(struct wlr_surface *surface) { if (surface->role != &subsurface_role) { return NULL; @@ -354,8 +311,15 @@ static void subcompositor_handle_get_subsurface(struct wl_client *client, struct wlr_surface *surface = wlr_surface_from_resource(surface_resource); struct wlr_surface *parent = wlr_surface_from_resource(parent_resource); - if (!wlr_surface_set_role(surface, &subsurface_role, NULL, + struct wlr_subsurface *subsurface = calloc(1, sizeof(struct wlr_subsurface)); + if (!subsurface) { + wl_client_post_no_memory(client); + return; + } + + if (!wlr_surface_set_role(surface, &subsurface_role, subsurface, resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE)) { + free(subsurface); return; } @@ -364,10 +328,37 @@ static void subcompositor_handle_get_subsurface(struct wl_client *client, WL_SUBCOMPOSITOR_ERROR_BAD_PARENT, "wl_subsurface@%" PRIu32 " cannot be a parent of itself or its ancestor", id); + free(subsurface); return; } - subsurface_create(surface, parent, wl_resource_get_version(resource), id); + subsurface->synchronized = true; + subsurface->surface = surface; + subsurface->resource = wl_resource_create(client, &wl_subsurface_interface, + wl_resource_get_version(resource), id); + if (subsurface->resource == NULL) { + free(subsurface); + wl_client_post_no_memory(client); + return; + } + wl_resource_set_implementation(subsurface->resource, + &subsurface_implementation, subsurface, subsurface_resource_destroy); + + wl_signal_init(&subsurface->events.destroy); + + wl_signal_add(&surface->events.client_commit, + &subsurface->surface_client_commit); + subsurface->surface_client_commit.notify = + subsurface_handle_surface_client_commit; + + // link parent + subsurface->parent = parent; + wl_signal_add(&parent->events.destroy, &subsurface->parent_destroy); + subsurface->parent_destroy.notify = subsurface_handle_parent_destroy; + + wl_list_init(&subsurface->current.link); + wl_list_insert(parent->pending.subsurfaces_above.prev, + &subsurface->pending.link); } static const struct wl_subcompositor_interface subcompositor_impl = {