fix: guard wl_list_remove in input destroy handlers against double-remove during wl_display_close
This commit is contained in:
parent
1c6c9d6e66
commit
6a9b509d77
|
|
@ -17,16 +17,16 @@ void handle_pointer_button(struct wl_listener *listener, void *data);
|
|||
void handle_pointer_frame(struct wl_listener *listener, void *data);
|
||||
void handle_pointer_axis(struct wl_listener *listener, void *data);
|
||||
|
||||
#define INPUT_LISTENER_REMOVE(l) \
|
||||
do { if ((l).link.next) { wl_list_remove(&(l).link); wl_list_init(&(l).link); } } while (0)
|
||||
|
||||
static void
|
||||
handle_keyboard_destroy(struct wl_listener *listener, void *data)
|
||||
{
|
||||
(void)listener; (void)data;
|
||||
wl_list_remove(&wl_state.real_keyboard_key_listener.link);
|
||||
wl_list_remove(&wl_state.real_keyboard_modifiers_listener.link);
|
||||
wl_list_remove(&wl_state.real_keyboard_destroy_listener.link);
|
||||
wl_list_init(&wl_state.real_keyboard_key_listener.link);
|
||||
wl_list_init(&wl_state.real_keyboard_modifiers_listener.link);
|
||||
wl_list_init(&wl_state.real_keyboard_destroy_listener.link);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_keyboard_key_listener);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_keyboard_modifiers_listener);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_keyboard_destroy_listener);
|
||||
wl_state.real_keyboard_dev = NULL;
|
||||
wl_state.keyboard_dev = NULL;
|
||||
}
|
||||
|
|
@ -35,18 +35,12 @@ static void
|
|||
handle_pointer_destroy(struct wl_listener *listener, void *data)
|
||||
{
|
||||
(void)listener; (void)data;
|
||||
wl_list_remove(&wl_state.pointer_motion_listener.link);
|
||||
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);
|
||||
wl_list_remove(&wl_state.real_pointer_destroy_listener.link);
|
||||
wl_list_init(&wl_state.pointer_motion_listener.link);
|
||||
wl_list_init(&wl_state.real_pointer_motion_abs_listener.link);
|
||||
wl_list_init(&wl_state.real_pointer_button_listener.link);
|
||||
wl_list_init(&wl_state.real_pointer_frame_listener.link);
|
||||
wl_list_init(&wl_state.real_pointer_axis_listener.link);
|
||||
wl_list_init(&wl_state.real_pointer_destroy_listener.link);
|
||||
INPUT_LISTENER_REMOVE(wl_state.pointer_motion_listener);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_pointer_motion_abs_listener);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_pointer_button_listener);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_pointer_frame_listener);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_pointer_axis_listener);
|
||||
INPUT_LISTENER_REMOVE(wl_state.real_pointer_destroy_listener);
|
||||
wl_state.real_pointer_dev = NULL;
|
||||
wl_state.pointer_dev = NULL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue