aboutsummaryrefslogtreecommitdiff
path: root/examples/multi-pointer.c
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2017-10-31 15:02:41 +0100
committeremersion <contact@emersion.fr>2017-10-31 15:02:41 +0100
commit6b6895168b46e8d5a8c231f083962172dc942e32 (patch)
tree02bf596ddd710a31e0d9c5b2ff98367f0396e6cf /examples/multi-pointer.c
parent7dc716a2bbfd765171fff24257affb2b1eeb24f7 (diff)
Fix segfaults on exit in examples/mutli-pointer
Diffstat (limited to 'examples/multi-pointer.c')
-rw-r--r--examples/multi-pointer.c20
1 files 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);