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
This commit is contained in:
parent
8922525d3c
commit
08c0e07f6c
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue