shell: Added missing layer fini calls 36/27436/1
authorMarius Vlad <marius.vlad@collabora.com>
Tue, 3 May 2022 15:04:14 +0000 (18:04 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Tue, 3 May 2022 15:17:26 +0000 (18:17 +0300)
Newer libweston version introduced additional API to determine if we are
missing out proper destruction paths.

Bug-AGL: SPEC-4351
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I135ca463992244ae91512854c7da7004de48f72e

src/desktop.c
src/ivi-compositor.h
src/shell.c

index 28ef52b..bc1e33f 100644 (file)
@@ -449,8 +449,10 @@ ivi_shell_destroy(struct wl_listener *listener, void *data)
        struct ivi_compositor *ivi = container_of(listener,
                                struct ivi_compositor, destroy_listener);
 
-       weston_desktop_destroy(ivi->desktop);
+       ivi_shell_finalize(ivi);
        ivi_compositor_destroy_pending_surfaces(ivi);
+
+       weston_desktop_destroy(ivi->desktop);
        wl_list_remove(&listener->link);
 }
 
index 9aadd62..3d853e2 100644 (file)
@@ -437,4 +437,7 @@ ivi_layout_find_bg_output(struct ivi_compositor *ivi);
 void
 ivi_compositor_destroy_pending_surfaces(struct ivi_compositor *ivi);
 
+void
+ivi_shell_finalize(struct ivi_compositor *ivi);
+
 #endif
index 6ec444a..efcb102 100644 (file)
 static void
 create_black_surface_view(struct ivi_output *output);
 
+static struct ivi_surface *
+get_ivi_shell_surface(struct weston_surface *wsurface)
+{
+       if (weston_surface_is_desktop_surface(wsurface)) {
+               struct weston_desktop_surface *dsurface =
+                       weston_surface_get_desktop_surface(wsurface);
+               return weston_desktop_surface_get_user_data(dsurface);
+       }
+
+       return NULL;
+}
+
 void
 agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi,
                                           struct ivi_surface *surface)
@@ -744,6 +756,65 @@ ivi_shell_init(struct ivi_compositor *ivi)
        return 0;
 }
 
+
+static void
+ivi_surf_destroy(struct ivi_surface *surf)
+{
+       struct weston_surface *wsurface = surf->view->surface;
+
+       if (weston_surface_is_mapped(wsurface)) {
+               weston_desktop_surface_unlink_view(surf->view);
+               weston_view_destroy(surf->view);
+       }
+
+       wl_list_remove(&surf->link);
+       free(surf);
+}
+
+static void
+ivi_shell_destroy_views_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 ivi_surface *ivi_surf =
+                       get_ivi_shell_surface(view->surface);
+               if (ivi_surf)
+                       ivi_surf_destroy(ivi_surf);
+       }
+}
+
+static void
+ivi_shell_destroy_views_on_fullscreen_layer(struct ivi_compositor *ivi)
+{
+       struct ivi_output *ivi_output;
+
+       wl_list_for_each(ivi_output, &ivi->outputs, link)
+               weston_surface_destroy(ivi_output->fullscreen_view.fs->view->surface);
+}
+
+void
+ivi_shell_finalize(struct ivi_compositor *ivi)
+{
+       ivi_shell_destroy_views_on_layer(&ivi->hidden);
+       weston_layer_fini(&ivi->hidden);
+
+       ivi_shell_destroy_views_on_layer(&ivi->background);
+       weston_layer_fini(&ivi->background);
+
+       ivi_shell_destroy_views_on_layer(&ivi->normal);
+       weston_layer_fini(&ivi->normal);
+
+       ivi_shell_destroy_views_on_layer(&ivi->panel);
+       weston_layer_fini(&ivi->panel);
+
+       ivi_shell_destroy_views_on_layer(&ivi->popup);
+       weston_layer_fini(&ivi->popup);
+
+       ivi_shell_destroy_views_on_fullscreen_layer(ivi);
+       weston_layer_fini(&ivi->fullscreen);
+}
+
 static void
 ivi_shell_advertise_xdg_surfaces(struct ivi_compositor *ivi, struct wl_resource *resource)
 {