From 6b6895168b46e8d5a8c231f083962172dc942e32 Mon Sep 17 00:00:00 2001 From: emersion Date: Tue, 31 Oct 2017 15:02:41 +0100 Subject: [PATCH] Fix segfaults on exit in examples/mutli-pointer --- examples/multi-pointer.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/examples/multi-pointer.c b/examples/multi-pointer.c index c69acc5f..e0993987 100644 --- a/examples/multi-pointer.c +++ b/examples/multi-pointer.c @@ -155,17 +155,21 @@ static void handle_input_add(struct compositor_state *state, wl_list_insert(&sample->cursors, &cursor->link); } +static void cursor_destroy(struct sample_cursor *cursor) { + wl_list_remove(&cursor->link); + wl_list_remove(&cursor->cursor_motion.link); + wl_list_remove(&cursor->cursor_motion_absolute.link); + wlr_cursor_destroy(cursor->cursor); + free(cursor); +} + static void handle_input_remove(struct compositor_state *state, struct wlr_input_device *device) { struct sample_state *sample = state->data; struct sample_cursor *cursor; wl_list_for_each(cursor, &sample->cursors, link) { if (cursor->device == device) { - wl_list_remove(&cursor->link); - wl_list_remove(&cursor->cursor_motion.link); - wl_list_remove(&cursor->cursor_motion_absolute.link); - wlr_cursor_destroy(cursor->cursor); - free(cursor); + cursor_destroy(cursor); break; } } @@ -212,9 +216,9 @@ int main(int argc, char *argv[]) { wl_display_run(compositor.display); compositor_fini(&compositor); - struct sample_cursor *cursor; - wl_list_for_each(cursor, &state.cursors, link) { - // TODO + struct sample_cursor *cursor, *tmp_cursor; + wl_list_for_each_safe(cursor, tmp_cursor, &state.cursors, link) { + cursor_destroy(cursor); } wlr_xcursor_theme_destroy(theme);