From 689004ff211d4c20ad0b802af14add6a9a761362 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Fri, 29 Dec 2017 19:00:51 +0100 Subject: rootston seat: implement part of roots_seat_destroy ... and have it listen to seat destroy notifier --- rootston/seat.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'rootston') diff --git a/rootston/seat.c b/rootston/seat.c index c2c7e3ea..b0bb87e8 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -220,6 +220,27 @@ static void roots_seat_init_cursor(struct roots_seat *seat) { seat->cursor->request_set_cursor.notify = handle_request_set_cursor; } +static void seat_view_destroy(struct roots_seat_view *seat_view); + +void roots_seat_destroy(struct roots_seat *seat) { + struct roots_seat_view *view, *nview; + + // TODO: probably more to be freed here + + wl_list_for_each_safe(view, nview, &seat->views, link) { + seat_view_destroy(view); + } + // Can be called from seat_destroy handler, so don't destroy seat +} + +static void roots_seat_handle_seat_destroy(struct wl_listener *listener, + void *data) { + struct roots_seat *seat = + wl_container_of(listener, seat, seat_destroy); + + roots_seat_destroy(seat); +} + struct roots_seat *roots_seat_create(struct roots_input *input, char *name) { struct roots_seat *seat = calloc(1, sizeof(struct roots_seat)); if (!seat) { @@ -254,11 +275,10 @@ struct roots_seat *roots_seat_create(struct roots_input *input, char *name) { wl_list_insert(&input->seats, &seat->link); - return seat; -} + seat->seat_destroy.notify = roots_seat_handle_seat_destroy; + wl_signal_add(&seat->seat->events.destroy, &seat->seat_destroy); -void roots_seat_destroy(struct roots_seat *seat) { - // TODO + return seat; } static void seat_add_keyboard(struct roots_seat *seat, -- cgit v1.2.3 From a477e5d302120805f1d6341c60d218ab9f77fc27 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Fri, 29 Dec 2017 20:32:01 +0100 Subject: roots_seat_destroy: also destroy seat in public function Rework the functions a bit so that the handler does the bulk of the work except for destroying the seat itself, and the main public function just explicitely calls the handler and destroys the seat --- rootston/seat.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'rootston') diff --git a/rootston/seat.c b/rootston/seat.c index b0bb87e8..2728ca96 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -222,23 +222,23 @@ static void roots_seat_init_cursor(struct roots_seat *seat) { static void seat_view_destroy(struct roots_seat_view *seat_view); -void roots_seat_destroy(struct roots_seat *seat) { - struct roots_seat_view *view, *nview; +static void roots_seat_handle_seat_destroy(struct wl_listener *listener, + void *data) { + struct roots_seat *seat = + wl_container_of(listener, seat, seat_destroy); // TODO: probably more to be freed here + wl_list_remove(&seat->seat_destroy.link); + struct roots_seat_view *view, *nview; wl_list_for_each_safe(view, nview, &seat->views, link) { seat_view_destroy(view); } - // Can be called from seat_destroy handler, so don't destroy seat } -static void roots_seat_handle_seat_destroy(struct wl_listener *listener, - void *data) { - struct roots_seat *seat = - wl_container_of(listener, seat, seat_destroy); - - roots_seat_destroy(seat); +void roots_seat_destroy(struct roots_seat *seat) { + roots_seat_handle_seat_destroy(&seat->seat_destroy, seat->seat); + wlr_seat_destroy(seat->seat); } struct roots_seat *roots_seat_create(struct roots_input *input, char *name) { -- cgit v1.2.3