commit 92c82e6952394b714d7818deb1d46d616a39dfc0
parent e51ecf71aa0afdcce4c9768f0a614222ee79cee2
Author: Ferdinand Bachmann <ferdinand.bachmann@yrlf.at>
Date: Tue, 18 Feb 2025 01:52:57 +0100
desktop/idle_inhibit: remove event listeners on destroy
This fixes a crash in wlroots listener checks. See #8509.
Diffstat:
2 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/include/sway/desktop/idle_inhibit_v1.h b/include/sway/desktop/idle_inhibit_v1.h
@@ -13,6 +13,7 @@ enum sway_idle_inhibit_mode {
struct sway_idle_inhibit_manager_v1 {
struct wlr_idle_inhibit_manager_v1 *wlr_manager;
struct wl_listener new_idle_inhibitor_v1;
+ struct wl_listener manager_destroy;
struct wl_list inhibitors;
};
diff --git a/sway/desktop/idle_inhibit_v1.c b/sway/desktop/idle_inhibit_v1.c
@@ -45,6 +45,14 @@ void handle_idle_inhibitor_v1(struct wl_listener *listener, void *data) {
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,
enum sway_idle_inhibit_mode mode) {
struct sway_idle_inhibit_manager_v1 *manager = &server.idle_inhibit_manager_v1;
@@ -177,6 +185,9 @@ bool sway_idle_inhibit_manager_v1_init(void) {
wl_signal_add(&manager->wlr_manager->events.new_inhibitor,
&manager->new_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);
return true;