shell: Do not set none role for applications w/o appid
[src/agl-compositor.git] / src / shell.c
index f874fd0..dc857fc 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)
@@ -613,9 +625,9 @@ ivi_check_pending_desktop_surface_remote(struct ivi_surface *surface)
 
        return false;
 }
-
-bool
-ivi_check_pending_surface(struct ivi_surface *surface)
+void
+ivi_check_pending_surface_desktop(struct ivi_surface *surface,
+                                 enum ivi_surface_role *role)
 {
        struct ivi_compositor *ivi = surface->ivi;
        struct wl_list *role_pending_list;
@@ -626,39 +638,40 @@ ivi_check_pending_surface(struct ivi_surface *surface)
        const char *app_id =
                weston_desktop_surface_get_app_id(surface->dsurface);
 
-       if (!app_id)
-               return false;
-
        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)) {
-                       return true;
+                       *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)) {
-                       return true;
+                       *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)) {
-                       return true;
+                       *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)) {
-                       return true;
+                       *role = IVI_SURFACE_ROLE_REMOTE;
+                       return;
                }
        }
 
        /* else, we are a regular desktop surface */
-       return false;
+       *role = IVI_SURFACE_ROLE_DESKTOP;
 }
 
 
@@ -738,6 +751,53 @@ 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);
+       }
+}
+
+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);
+}
+
 static void
 ivi_shell_advertise_xdg_surfaces(struct ivi_compositor *ivi, struct wl_resource *resource)
 {
@@ -1332,14 +1392,6 @@ bind_agl_shell(struct wl_client *client,
                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");