compositor: introduce wlr_surface_destroy_role_object()

This commit is contained in:
Kirill Primak 2022-11-02 23:44:30 +03:00
parent 1243a855d4
commit 756260ac05
2 changed files with 20 additions and 2 deletions

View file

@ -76,6 +76,7 @@ struct wlr_surface_role {
void (*commit)(struct wlr_surface *surface); void (*commit)(struct wlr_surface *surface);
void (*precommit)(struct wlr_surface *surface, void (*precommit)(struct wlr_surface *surface,
const struct wlr_surface_state *state); const struct wlr_surface_state *state);
void (*destroy)(struct wlr_surface *surface);
}; };
struct wlr_surface_output { struct wlr_surface_output {
@ -192,6 +193,11 @@ bool wlr_surface_set_role(struct wlr_surface *surface,
const struct wlr_surface_role *role, void *role_data, const struct wlr_surface_role *role, void *role_data,
struct wl_resource *error_resource, uint32_t error_code); struct wl_resource *error_resource, uint32_t error_code);
/**
* Destroy the role object for this surface. This doesn't reset the role.
*/
void wlr_surface_destroy_role_object(struct wlr_surface *surface);
/** /**
* Whether or not this surface currently has an attached buffer. A surface has * Whether or not this surface currently has an attached buffer. A surface has
* an attached buffer when it commits with a non-null buffer in its pending * an attached buffer when it commits with a non-null buffer in its pending

View file

@ -622,6 +622,8 @@ static void surface_handle_resource_destroy(struct wl_resource *resource) {
surface_output_destroy(surface_output); surface_output_destroy(surface_output);
} }
wlr_surface_destroy_role_object(surface);
wl_signal_emit_mutable(&surface->events.destroy, surface); wl_signal_emit_mutable(&surface->events.destroy, surface);
wlr_addon_set_finish(&surface->addons); wlr_addon_set_finish(&surface->addons);
@ -732,6 +734,16 @@ bool wlr_surface_set_role(struct wlr_surface *surface,
return true; return true;
} }
void wlr_surface_destroy_role_object(struct wlr_surface *surface) {
if (surface->role_data == NULL) {
return;
}
if (surface->role->destroy != NULL) {
surface->role->destroy(surface);
}
surface->role_data = NULL;
}
uint32_t wlr_surface_lock_pending(struct wlr_surface *surface) { uint32_t wlr_surface_lock_pending(struct wlr_surface *surface) {
surface->pending.cached_state_locks++; surface->pending.cached_state_locks++;
return surface->pending.seq; return surface->pending.seq;