desktop: Fix destruction of applications that fallback to the desktop role
[src/agl-compositor.git] / src / shell.c
index 5561898..4886a0a 100644 (file)
@@ -264,7 +264,7 @@ ivi_check_pending_desktop_surface_popup(struct ivi_surface *surface)
        const char *_app_id =
                        weston_desktop_surface_get_app_id(surface->dsurface);
 
-       if (wl_list_empty(&ivi->popup_pending_apps))
+       if (wl_list_empty(&ivi->popup_pending_apps) || !_app_id)
                return false;
 
        wl_list_for_each_safe(p_popup, next_p_popup,
@@ -295,7 +295,7 @@ ivi_check_pending_desktop_surface_split(struct ivi_surface *surface)
        const char *_app_id =
                        weston_desktop_surface_get_app_id(surface->dsurface);
 
-       if (wl_list_empty(&ivi->split_pending_apps))
+       if (wl_list_empty(&ivi->split_pending_apps) || !_app_id)
                return false;
 
        wl_list_for_each_safe(split_surf, next_split_surf,
@@ -319,7 +319,7 @@ ivi_check_pending_desktop_surface_fullscreen(struct ivi_surface *surface)
        const char *_app_id =
                        weston_desktop_surface_get_app_id(surface->dsurface);
 
-       if (wl_list_empty(&ivi->fullscreen_pending_apps))
+       if (wl_list_empty(&ivi->fullscreen_pending_apps) || !_app_id)
                return false;
 
        wl_list_for_each_safe(fs_surf, next_fs_surf,
@@ -342,7 +342,7 @@ ivi_check_pending_desktop_surface_remote(struct ivi_surface *surface)
        const char *_app_id =
                weston_desktop_surface_get_app_id(surface->dsurface);
 
-       if (wl_list_empty(&ivi->remote_pending_apps))
+       if (wl_list_empty(&ivi->remote_pending_apps) || !_app_id)
                return false;
 
        wl_list_for_each_safe(remote_surf, next_remote_surf,
@@ -949,6 +949,17 @@ bind_agl_shell(struct wl_client *client,
 {
        struct ivi_compositor *ivi = data;
        struct wl_resource *resource;
+       struct ivi_policy *policy;
+       void *interface;
+
+       policy = ivi->policy;
+       interface = (void *) &agl_shell_interface;
+       if (policy && policy->api.shell_bind_interface &&
+           !policy->api.shell_bind_interface(client, interface)) {
+               wl_client_post_implementation_error(client,
+                                      "client not authorized to use agl_shell");
+               return;
+       }
 
        resource = wl_resource_create(client, &agl_shell_interface,
                                      1, id);
@@ -991,8 +1002,20 @@ bind_agl_shell_desktop(struct wl_client *client,
 {
        struct ivi_compositor *ivi = data;
        struct wl_resource *resource;
-       struct desktop_client *dclient = zalloc(sizeof(*dclient));
+       struct ivi_policy *policy;
+       struct desktop_client *dclient;
+       void *interface;
+
+       policy = ivi->policy;
+       interface  = (void *) &agl_shell_desktop_interface;
+       if (policy && policy->api.shell_bind_interface &&
+           !policy->api.shell_bind_interface(client, interface)) {
+               wl_client_post_implementation_error(client,
+                               "client not authorized to use agl_shell_desktop");
+               return;
+       }
 
+       dclient = zalloc(sizeof(*dclient));
        if (!dclient) {
                wl_client_post_no_memory(client);
                return;