diff --git a/kiosk-shell/kiosk-shell.c b/kiosk-shell/kiosk-shell.c index 45e83536..5995baea 100644 --- a/kiosk-shell/kiosk-shell.c +++ b/kiosk-shell/kiosk-shell.c @@ -1095,6 +1095,21 @@ kiosk_shell_handle_seat_created(struct wl_listener *listener, void *data) kiosk_shell_seat_create(shell, seat); } +static void +kiosk_shell_destroy_surfaces_on_layer(struct weston_layer *layer) +{ + struct weston_view *view, *view_next; + + wl_list_for_each_safe(view, view_next, &layer->view_list.link, layer_link.link) { + struct kiosk_shell_surface *shsurf = + get_kiosk_shell_surface(view->surface); + assert(shsurf); + kiosk_shell_surface_destroy(shsurf); + } + + weston_layer_fini(layer); +} + static void kiosk_shell_destroy(struct wl_listener *listener, void *data) { @@ -1114,16 +1129,19 @@ kiosk_shell_destroy(struct wl_listener *listener, void *data) kiosk_shell_output_destroy(shoutput); } + /* bg layer doesn't contain a weston_desktop_surface, and + * kiosk_shell_output_destroy() takes care of destroying it, we're just + * doing a weston_layer_fini() here as there might be multiple bg views */ + weston_layer_fini(&shell->background_layer); + kiosk_shell_destroy_surfaces_on_layer(&shell->normal_layer); + kiosk_shell_destroy_surfaces_on_layer(&shell->inactive_layer); + wl_list_for_each_safe(shseat, shseat_next, &shell->seat_list, link) { kiosk_shell_seat_destroy(shseat); } weston_desktop_destroy(shell->desktop); - weston_layer_fini(&shell->background_layer); - weston_layer_fini(&shell->normal_layer); - weston_layer_fini(&shell->inactive_layer); - free(shell); }