mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-12-23 02:19:49 +01:00
subcompositor: set role_data with wlr_surface_set_role()
This commit is contained in:
parent
24a479a501
commit
63f3802e0f
1 changed files with 36 additions and 45 deletions
|
@ -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 = {
|
||||
|
|
Loading…
Reference in a new issue