aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Primak <vyivel@eclair.cafe>2023-06-07 09:05:30 +0300
committerSimon Ser <contact@emersion.fr>2023-06-08 20:03:18 +0200
commit63f3802e0f490302771f837f5e77fc93a3f11132 (patch)
tree35fb7d30c2b88e2003cc4642109f84ca54be428d
parent24a479a50195988dbf622c6b7fe1f2263fd981b1 (diff)
subcompositor: set role_data with wlr_surface_set_role()
-rw-r--r--types/wlr_subcompositor.c81
1 files changed, 36 insertions, 45 deletions
diff --git a/types/wlr_subcompositor.c b/types/wlr_subcompositor.c
index b16fc17f..248b7d17 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 = {