From c0d4d7217b56a0535e5828a8ce592dca7102e116 Mon Sep 17 00:00:00 2001 From: Kirill Primak Date: Fri, 22 Nov 2024 20:37:39 +0300 Subject: [PATCH] Add missing destroy events on automatically destroyed objects --- include/wlr/types/wlr_drm_lease_v1.h | 2 ++ include/wlr/types/wlr_pointer_constraints_v1.h | 2 ++ include/wlr/types/wlr_transient_seat_v1.h | 2 ++ include/wlr/types/wlr_xdg_system_bell_v1.h | 1 + include/wlr/xwayland/xwayland.h | 1 + types/wlr_drm_lease_v1.c | 3 +++ types/wlr_pointer_constraints_v1.c | 3 +++ types/wlr_transient_seat_v1.c | 3 ++- types/wlr_xdg_system_bell_v1.c | 2 ++ xwayland/xwayland.c | 3 +++ 10 files changed, 21 insertions(+), 1 deletion(-) diff --git a/include/wlr/types/wlr_drm_lease_v1.h b/include/wlr/types/wlr_drm_lease_v1.h index 05e381249..752f6efa7 100644 --- a/include/wlr/types/wlr_drm_lease_v1.h +++ b/include/wlr/types/wlr_drm_lease_v1.h @@ -20,6 +20,8 @@ struct wlr_drm_lease_v1_manager { struct wl_display *display; struct { + struct wl_signal destroy; + /** * Upon receiving this signal, call * wlr_drm_lease_device_v1_grant_lease_request() to grant a lease of the diff --git a/include/wlr/types/wlr_pointer_constraints_v1.h b/include/wlr/types/wlr_pointer_constraints_v1.h index e0f588065..4c541d879 100644 --- a/include/wlr/types/wlr_pointer_constraints_v1.h +++ b/include/wlr/types/wlr_pointer_constraints_v1.h @@ -78,6 +78,8 @@ struct wlr_pointer_constraints_v1 { struct wl_list constraints; // wlr_pointer_constraint_v1.link struct { + struct wl_signal destroy; + /** * Called when a new pointer constraint is created. * diff --git a/include/wlr/types/wlr_transient_seat_v1.h b/include/wlr/types/wlr_transient_seat_v1.h index 9aafed3b4..d996016bf 100644 --- a/include/wlr/types/wlr_transient_seat_v1.h +++ b/include/wlr/types/wlr_transient_seat_v1.h @@ -26,6 +26,8 @@ struct wlr_transient_seat_manager_v1 { struct wl_global *global; struct { + struct wl_signal destroy; + /** * Upon receiving this signal, call * wlr_transient_seat_v1_ready() to pass a newly created seat diff --git a/include/wlr/types/wlr_xdg_system_bell_v1.h b/include/wlr/types/wlr_xdg_system_bell_v1.h index 8cb592d14..c58bcbbc5 100644 --- a/include/wlr/types/wlr_xdg_system_bell_v1.h +++ b/include/wlr/types/wlr_xdg_system_bell_v1.h @@ -15,6 +15,7 @@ struct wlr_xdg_system_bell_v1 { struct wl_global *global; struct { + struct wl_signal destroy; struct wl_signal ring; // struct wlr_xdg_system_bell_v1_ring_event } events; diff --git a/include/wlr/xwayland/xwayland.h b/include/wlr/xwayland/xwayland.h index dbd881fda..fcfa5be75 100644 --- a/include/wlr/xwayland/xwayland.h +++ b/include/wlr/xwayland/xwayland.h @@ -51,6 +51,7 @@ struct wlr_xwayland { struct wlr_seat *seat; struct { + struct wl_signal destroy; struct wl_signal ready; struct wl_signal new_surface; // struct wlr_xwayland_surface struct wl_signal remove_startup_info; // struct wlr_xwayland_remove_startup_info_event diff --git a/types/wlr_drm_lease_v1.c b/types/wlr_drm_lease_v1.c index d3c9ba1ff..52010ea0d 100644 --- a/types/wlr_drm_lease_v1.c +++ b/types/wlr_drm_lease_v1.c @@ -682,6 +682,8 @@ static void handle_display_destroy(struct wl_listener *listener, void *data) { display_destroy); wlr_log(WLR_DEBUG, "Destroying wlr_drm_lease_v1_manager"); + wl_signal_emit_mutable(&manager->events.destroy, NULL); + struct wlr_drm_lease_device_v1 *device, *tmp; wl_list_for_each_safe(device, tmp, &manager->devices, link) { drm_lease_device_v1_destroy(device); @@ -718,6 +720,7 @@ struct wlr_drm_lease_v1_manager *wlr_drm_lease_v1_manager_create( manager->display_destroy.notify = handle_display_destroy; wl_display_add_destroy_listener(display, &manager->display_destroy); + wl_signal_init(&manager->events.destroy); wl_signal_init(&manager->events.request); return manager; diff --git a/types/wlr_pointer_constraints_v1.c b/types/wlr_pointer_constraints_v1.c index 078037293..4560c273b 100644 --- a/types/wlr_pointer_constraints_v1.c +++ b/types/wlr_pointer_constraints_v1.c @@ -322,6 +322,7 @@ static void pointer_constraints_bind(struct wl_client *client, void *data, static void handle_display_destroy(struct wl_listener *listener, void *data) { struct wlr_pointer_constraints_v1 *pointer_constraints = wl_container_of(listener, pointer_constraints, display_destroy); + wl_signal_emit_mutable(&pointer_constraints->events.destroy, NULL); wl_list_remove(&pointer_constraints->display_destroy.link); wl_global_destroy(pointer_constraints->global); free(pointer_constraints); @@ -345,6 +346,8 @@ struct wlr_pointer_constraints_v1 *wlr_pointer_constraints_v1_create( pointer_constraints->global = wl_global; wl_list_init(&pointer_constraints->constraints); + + wl_signal_init(&pointer_constraints->events.destroy); wl_signal_init(&pointer_constraints->events.new_constraint); pointer_constraints->display_destroy.notify = handle_display_destroy; diff --git a/types/wlr_transient_seat_v1.c b/types/wlr_transient_seat_v1.c index 379ce0a37..717b36dc0 100644 --- a/types/wlr_transient_seat_v1.c +++ b/types/wlr_transient_seat_v1.c @@ -114,7 +114,7 @@ static const struct ext_transient_seat_manager_v1_interface manager_impl = { static void handle_display_destroy(struct wl_listener *listener, void *data) { struct wlr_transient_seat_manager_v1 *manager = wl_container_of(listener, manager, display_destroy); - + wl_signal_emit_mutable(&manager->events.destroy, NULL); wl_list_remove(&manager->display_destroy.link); wl_global_destroy(manager->global); free(manager); @@ -154,6 +154,7 @@ struct wlr_transient_seat_manager_v1 *wlr_transient_seat_manager_v1_create( manager->display_destroy.notify = handle_display_destroy; wl_display_add_destroy_listener(display, &manager->display_destroy); + wl_signal_init(&manager->events.destroy); wl_signal_init(&manager->events.create_seat); return manager; diff --git a/types/wlr_xdg_system_bell_v1.c b/types/wlr_xdg_system_bell_v1.c index d1ad7b002..8a8850540 100644 --- a/types/wlr_xdg_system_bell_v1.c +++ b/types/wlr_xdg_system_bell_v1.c @@ -51,6 +51,7 @@ static void bell_bind(struct wl_client *client, void *data, static void handle_display_destroy(struct wl_listener *listener, void *data) { struct wlr_xdg_system_bell_v1 *bell = wl_container_of(listener, bell, display_destroy); + wl_signal_emit_mutable(&bell->events.destroy, NULL); wl_list_remove(&bell->display_destroy.link); wl_global_destroy(bell->global); free(bell); @@ -75,6 +76,7 @@ struct wlr_xdg_system_bell_v1 *wlr_xdg_system_bell_v1_create(struct wl_display * bell->display_destroy.notify = handle_display_destroy; wl_display_add_destroy_listener(display, &bell->display_destroy); + wl_signal_init(&bell->events.destroy); wl_signal_init(&bell->events.ring); return bell; diff --git a/xwayland/xwayland.c b/xwayland/xwayland.c index 23c21b438..7fbc33ce1 100644 --- a/xwayland/xwayland.c +++ b/xwayland/xwayland.c @@ -79,6 +79,8 @@ void wlr_xwayland_destroy(struct wlr_xwayland *xwayland) { return; } + wl_signal_emit_mutable(&xwayland->events.destroy, NULL); + wl_list_remove(&xwayland->server_destroy.link); wl_list_remove(&xwayland->server_start.link); wl_list_remove(&xwayland->server_ready.link); @@ -105,6 +107,7 @@ struct wlr_xwayland *wlr_xwayland_create_with_server(struct wl_display *wl_displ xwayland->wl_display = wl_display; xwayland->compositor = compositor; + wl_signal_init(&xwayland->events.destroy); wl_signal_init(&xwayland->events.new_surface); wl_signal_init(&xwayland->events.ready); wl_signal_init(&xwayland->events.remove_startup_info);