desktop/idle_inhibit: remove event listeners on destroy

This fixes a crash in wlroots listener checks. See #8509.
This commit is contained in:
Ferdinand Bachmann 2025-02-18 01:52:57 +01:00
parent eb043295bc
commit 86bbedcce3
2 changed files with 12 additions and 0 deletions

View file

@ -13,6 +13,7 @@ enum sway_idle_inhibit_mode {
struct sway_idle_inhibit_manager_v1 { struct sway_idle_inhibit_manager_v1 {
struct wlr_idle_inhibit_manager_v1 *wlr_manager; struct wlr_idle_inhibit_manager_v1 *wlr_manager;
struct wl_listener new_idle_inhibitor_v1; struct wl_listener new_idle_inhibitor_v1;
struct wl_listener manager_destroy;
struct wl_list inhibitors; struct wl_list inhibitors;
}; };

View file

@ -44,6 +44,14 @@ void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) {
sway_idle_inhibit_v1_check_active(); sway_idle_inhibit_v1_check_active();
} }
void handle_manager_destroy(struct wl_listener *listener, void *data) {
struct sway_idle_inhibit_manager_v1 *manager =
wl_container_of(listener, manager, manager_destroy);
wl_list_remove(&manager->manager_destroy.link);
wl_list_remove(&manager->new_idle_inhibitor_v1.link);
}
void sway_idle_inhibit_v1_user_inhibitor_register(struct sway_view *view, void sway_idle_inhibit_v1_user_inhibitor_register(struct sway_view *view,
enum sway_idle_inhibit_mode mode) { enum sway_idle_inhibit_mode mode) {
struct sway_idle_inhibit_manager_v1 *manager = &server.idle_inhibit_manager_v1; struct sway_idle_inhibit_manager_v1 *manager = &server.idle_inhibit_manager_v1;
@ -153,6 +161,9 @@ bool sway_idle_inhibit_manager_v1_init(void) {
wl_signal_add(&manager->wlr_manager->events.new_inhibitor, wl_signal_add(&manager->wlr_manager->events.new_inhibitor,
&manager->new_idle_inhibitor_v1); &manager->new_idle_inhibitor_v1);
manager->new_idle_inhibitor_v1.notify = handle_idle_inhibitor_v1; manager->new_idle_inhibitor_v1.notify = handle_idle_inhibitor_v1;
wl_signal_add(&manager->wlr_manager->events.destroy,
&manager->manager_destroy);
manager->manager_destroy.notify = handle_manager_destroy;
wl_list_init(&manager->inhibitors); wl_list_init(&manager->inhibitors);
return true; return true;