From 08c0e07f6c79b02905f240e37478684d7e8d4a15 Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Wed, 13 May 2026 18:06:01 +0200 Subject: [PATCH] Fix clean shutdown: remove pointer listeners, reset signal handlers On SIGINT/SIGTERM: - signalfd handler sets terminate flag and exits the event loop - After loop exit, remove wlroots pointer listeners to prevent assertion failure in wlr_pointer_finish - Reset SIGTERM/SIGINT/SIGHUP to SIG_DFL after signalfd takes over to prevent the old handleExitSig from competing --- src/backend/wayland/wl_backend.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 4cf0713..f2683db 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -2854,6 +2854,10 @@ wl_event_loop_run(void) NULL); if (wl_state.sigfd_source) { wwarning("wl_backend: signalfd installed for SIGTERM/SIGINT/SIGHUP"); + /* Disable the old signal handlers — signalfd owns these now */ + signal(SIGTERM, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGHUP, SIG_DFL); } else { wwarning("wl_backend: wl_event_loop_add_fd failed; falling back to pipe"); close(wl_state.sigfd); @@ -2953,6 +2957,14 @@ wl_event_loop_run(void) } wwarning("wl_backend: event loop exited"); + + /* Remove pointer listeners before wlroots destroys the pointer device */ + if (wl_state.pointer_dev) { + wl_list_remove(&wl_state.real_pointer_motion_abs_listener.link); + wl_list_remove(&wl_state.real_pointer_button_listener.link); + wl_list_remove(&wl_state.real_pointer_frame_listener.link); + wl_list_remove(&wl_state.real_pointer_axis_listener.link); + } } static void