if (!p_remote)
return;
- wl_list_insert(&ivi->remote_pending_apps, &remote->link);
+ wl_list_insert(&ivi->remote_pending_apps, &p_remote->link);
}
const char *app_id =
weston_desktop_surface_get_app_id(surface->dsurface);
- if (!app_id) {
- *role = IVI_SURFACE_ROLE_NONE;
- return;
- }
-
role_pending_list = &ivi->popup_pending_apps;
wl_list_for_each(p_popup, role_pending_list, link) {
- if (!strcmp(app_id, p_popup->app_id)) {
+ if (app_id && !strcmp(app_id, p_popup->app_id)) {
*role = IVI_SURFACE_ROLE_POPUP;
return;
}
role_pending_list = &ivi->split_pending_apps;
wl_list_for_each(p_split, role_pending_list, link) {
- if (!strcmp(app_id, p_split->app_id)) {
+ if (app_id && !strcmp(app_id, p_split->app_id)) {
*role = IVI_SURFACE_ROLE_SPLIT_V;
return;
}
role_pending_list = &ivi->fullscreen_pending_apps;
wl_list_for_each(p_fullscreen, role_pending_list, link) {
- if (!strcmp(app_id, p_fullscreen->app_id)) {
+ if (app_id && !strcmp(app_id, p_fullscreen->app_id)) {
*role = IVI_SURFACE_ROLE_FULLSCREEN;
return;
}
role_pending_list = &ivi->remote_pending_apps;
wl_list_for_each(p_remote, role_pending_list, link) {
- if (!strcmp(app_id, p_remote->app_id)) {
+ if (app_id && !strcmp(app_id, p_remote->app_id)) {
*role = IVI_SURFACE_ROLE_REMOTE;
return;
}
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);
+ }
+}
+
+void
+ivi_shell_finalize(struct ivi_compositor *ivi)
+{
+ struct ivi_output *output;
+
+ 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);
+
+ wl_list_for_each(output, &ivi->outputs, link) {
+ if (output->fullscreen_view.fs->view) {
+ weston_surface_destroy(output->fullscreen_view.fs->view->surface);
+ output->fullscreen_view.fs->view = NULL;
+ }
+ }
+ weston_layer_fini(&ivi->fullscreen);
+}
+
static void
ivi_shell_advertise_xdg_surfaces(struct ivi_compositor *ivi, struct wl_resource *resource)
{
return;
}
-#if 0
- if (ivi->shell_client.client != client) {
- wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
- "client not authorized to use agl_shell");
- return;
- }
-#endif
-
if (ivi->shell_client.resource) {
wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
"agl_shell has already been bound");