compositor: listen to role_resource destroy signal

Call wlr_surface_destroy_role_object() when the role_resource is
destroyed.
This commit is contained in:
Simon Ser 2023-06-23 14:33:26 +02:00
parent 89cb484220
commit 8a5b5e6f28
7 changed files with 20 additions and 45 deletions

View File

@ -199,6 +199,7 @@ struct wlr_surface {
// private state // private state
struct wl_listener renderer_destroy; struct wl_listener renderer_destroy;
struct wl_listener role_resource_destroy;
struct { struct {
int32_t scale; int32_t scale;
@ -246,6 +247,8 @@ bool wlr_surface_set_role(struct wlr_surface *surface, const struct wlr_surface_
/** /**
* Set the role object for this surface. The surface must have a role and * Set the role object for this surface. The surface must have a role and
* no already set role object. * no already set role object.
*
* wlr_surface_destroy_role_object() is called when the resource is destroyed.
*/ */
void wlr_surface_set_role_object(struct wlr_surface *surface, struct wl_resource *role_resource); void wlr_surface_set_role_object(struct wlr_surface *surface, struct wl_resource *role_resource);

View File

@ -648,6 +648,7 @@ static void surface_handle_resource_destroy(struct wl_resource *resource) {
} }
wl_list_remove(&surface->renderer_destroy.link); wl_list_remove(&surface->renderer_destroy.link);
wl_list_remove(&surface->role_resource_destroy.link);
surface_state_finish(&surface->pending); surface_state_finish(&surface->pending);
surface_state_finish(&surface->current); surface_state_finish(&surface->current);
pixman_region32_fini(&surface->buffer_damage); pixman_region32_fini(&surface->buffer_damage);
@ -714,6 +715,8 @@ static struct wlr_surface *surface_create(struct wl_client *client,
wl_list_init(&surface->renderer_destroy.link); wl_list_init(&surface->renderer_destroy.link);
} }
wl_list_init(&surface->role_resource_destroy.link);
return surface; return surface;
} }
@ -790,12 +793,19 @@ bool wlr_surface_set_role(struct wlr_surface *surface, const struct wlr_surface_
return true; return true;
} }
static void surface_handle_role_resource_destroy(struct wl_listener *listener, void *data) {
struct wlr_surface *surface = wl_container_of(listener, surface, role_resource_destroy);
wlr_surface_destroy_role_object(surface);
}
void wlr_surface_set_role_object(struct wlr_surface *surface, struct wl_resource *role_resource) { void wlr_surface_set_role_object(struct wlr_surface *surface, struct wl_resource *role_resource) {
assert(surface->role != NULL); assert(surface->role != NULL);
assert(!surface->role->no_object); assert(!surface->role->no_object);
assert(surface->role_resource == NULL); assert(surface->role_resource == NULL);
assert(role_resource != NULL); assert(role_resource != NULL);
surface->role_resource = role_resource; surface->role_resource = role_resource;
surface->role_resource_destroy.notify = surface_handle_role_resource_destroy;
wl_resource_add_destroy_listener(role_resource, &surface->role_resource_destroy);
} }
void wlr_surface_destroy_role_object(struct wlr_surface *surface) { void wlr_surface_destroy_role_object(struct wlr_surface *surface) {
@ -807,6 +817,8 @@ void wlr_surface_destroy_role_object(struct wlr_surface *surface) {
surface->role->destroy(surface); surface->role->destroy(surface);
} }
surface->role_resource = NULL; surface->role_resource = NULL;
wl_list_remove(&surface->role_resource_destroy.link);
wl_list_init(&surface->role_resource_destroy.link);
} }
uint32_t wlr_surface_lock_pending(struct wlr_surface *surface) { uint32_t wlr_surface_lock_pending(struct wlr_surface *surface) {

View File

@ -175,14 +175,6 @@ struct wlr_input_popup_surface_v2 *wlr_input_popup_surface_v2_try_from_wlr_surfa
return popup_surface_from_resource(surface->role_resource); return popup_surface_from_resource(surface->role_resource);
} }
static void popup_resource_destroy(struct wl_resource *resource) {
struct wlr_input_popup_surface_v2 *popup_surface =
popup_surface_from_resource(resource);
if (popup_surface != NULL) {
wlr_surface_destroy_role_object(popup_surface->surface);
}
}
static void popup_destroy(struct wl_client *client, static void popup_destroy(struct wl_client *client,
struct wl_resource *resource) { struct wl_resource *resource) {
wl_resource_destroy(resource); wl_resource_destroy(resource);
@ -225,7 +217,7 @@ static void im_get_input_popup_surface(struct wl_client *client,
} }
wl_resource_set_implementation(popup_resource, &input_popup_impl, wl_resource_set_implementation(popup_resource, &input_popup_impl,
popup_surface, popup_resource_destroy); popup_surface, NULL);
wlr_surface_set_role_object(surface, popup_resource); wlr_surface_set_role_object(surface, popup_resource);

View File

@ -264,14 +264,6 @@ static const struct zwlr_layer_surface_v1_interface layer_surface_implementation
.set_layer = layer_surface_set_layer, .set_layer = layer_surface_set_layer,
}; };
static void layer_surface_resource_destroy(struct wl_resource *resource) {
struct wlr_layer_surface_v1 *surface =
wlr_layer_surface_v1_from_resource(resource);
if (surface != NULL) {
wlr_surface_destroy_role_object(surface->surface);
}
}
uint32_t wlr_layer_surface_v1_configure(struct wlr_layer_surface_v1 *surface, uint32_t wlr_layer_surface_v1_configure(struct wlr_layer_surface_v1 *surface,
uint32_t width, uint32_t height) { uint32_t width, uint32_t height) {
struct wl_display *display = struct wl_display *display =
@ -443,7 +435,7 @@ static void layer_shell_handle_get_layer_surface(struct wl_client *wl_client,
wlr_log(WLR_DEBUG, "new layer_surface %p (res %p)", wlr_log(WLR_DEBUG, "new layer_surface %p (res %p)",
surface, surface->resource); surface, surface->resource);
wl_resource_set_implementation(surface->resource, wl_resource_set_implementation(surface->resource,
&layer_surface_implementation, surface, layer_surface_resource_destroy); &layer_surface_implementation, surface, NULL);
wlr_surface_set_role_object(wlr_surface, surface->resource); wlr_surface_set_role_object(wlr_surface, surface->resource);
} }

View File

@ -198,14 +198,6 @@ static void lock_surface_handle_output_destroy(struct wl_listener *listener,
wlr_surface_destroy_role_object(lock_surface->surface); wlr_surface_destroy_role_object(lock_surface->surface);
} }
static void lock_surface_resource_destroy(struct wl_resource *resource) {
struct wlr_session_lock_surface_v1 *lock_surface =
lock_surface_from_resource(resource);
if (lock_surface != NULL) {
wlr_surface_destroy_role_object(lock_surface->surface);
}
}
static void lock_handle_get_lock_surface(struct wl_client *client, static void lock_handle_get_lock_surface(struct wl_client *client,
struct wl_resource *lock_resource, uint32_t id, struct wl_resource *lock_resource, uint32_t id,
struct wl_resource *surface_resource, struct wl_resource *surface_resource,
@ -226,8 +218,7 @@ static void lock_handle_get_lock_surface(struct wl_client *client,
// Leave the lock surface resource inert for now, we will set the // Leave the lock surface resource inert for now, we will set the
// user data at the end of this function if everything is successful. // user data at the end of this function if everything is successful.
wl_resource_set_implementation(lock_surface_resource, wl_resource_set_implementation(lock_surface_resource,
&lock_surface_implementation, NULL, &lock_surface_implementation, NULL, NULL);
lock_surface_resource_destroy);
struct wlr_session_lock_v1 *lock = lock_from_resource(lock_resource); struct wlr_session_lock_v1 *lock = lock_from_resource(lock_resource);
if (lock == NULL) { if (lock == NULL) {

View File

@ -37,13 +37,6 @@ static struct wlr_subsurface *subsurface_from_resource(
return wl_resource_get_user_data(resource); return wl_resource_get_user_data(resource);
} }
static void subsurface_resource_destroy(struct wl_resource *resource) {
struct wlr_subsurface *subsurface = subsurface_from_resource(resource);
if (subsurface != NULL) {
wlr_surface_destroy_role_object(subsurface->surface);
}
}
static void subsurface_handle_destroy(struct wl_client *client, static void subsurface_handle_destroy(struct wl_client *client,
struct wl_resource *resource) { struct wl_resource *resource) {
wl_resource_destroy(resource); wl_resource_destroy(resource);
@ -342,7 +335,7 @@ static void subcompositor_handle_get_subsurface(struct wl_client *client,
return; return;
} }
wl_resource_set_implementation(subsurface->resource, wl_resource_set_implementation(subsurface->resource,
&subsurface_implementation, subsurface, subsurface_resource_destroy); &subsurface_implementation, subsurface, NULL);
wlr_surface_set_role_object(surface, subsurface->resource); wlr_surface_set_role_object(surface, subsurface->resource);

View File

@ -91,14 +91,6 @@ static void xwl_surface_handle_surface_destroy(struct wl_listener *listener,
wlr_surface_destroy_role_object(xwl_surface->surface); wlr_surface_destroy_role_object(xwl_surface->surface);
} }
static void xwl_surface_handle_resource_destroy(struct wl_resource *resource) {
struct wlr_xwayland_surface_v1 *xwl_surface =
xwl_surface_from_resource(resource);
if (xwl_surface != NULL) {
wlr_surface_destroy_role_object(xwl_surface->surface);
}
}
static void shell_handle_get_xwayland_surface(struct wl_client *client, static void shell_handle_get_xwayland_surface(struct wl_client *client,
struct wl_resource *shell_resource, uint32_t id, struct wl_resource *shell_resource, uint32_t id,
struct wl_resource *surface_resource) { struct wl_resource *surface_resource) {
@ -129,7 +121,7 @@ static void shell_handle_get_xwayland_surface(struct wl_client *client,
return; return;
} }
wl_resource_set_implementation(xwl_surface->resource, &xwl_surface_impl, wl_resource_set_implementation(xwl_surface->resource, &xwl_surface_impl,
xwl_surface, xwl_surface_handle_resource_destroy); xwl_surface, NULL);
wlr_surface_set_role_object(surface, xwl_surface->resource); wlr_surface_set_role_object(surface, xwl_surface->resource);