+ const char *app_id = NULL;
+
+ struct ivi_output *output = ivi_layout_get_output_from_surface(surface);
+
+ wl_list_remove(&surface->listener_advertise_app.link);
+ surface->listener_advertise_app.notify = NULL;
+
+ app_id = weston_desktop_surface_get_app_id(dsurface);
+
+ /* special corner-case, pending_surfaces which are never activated or
+ * being assigned an output might land here so just remove the surface;
+ *
+ * the DESKTOP role can happen here as well, because we can fall-back
+ * to that when we try to determine the role type. Application that
+ * do not set the app_id will be land here, when destroyed */
+ if (output == NULL && (surface->role == IVI_SURFACE_ROLE_NONE ||
+ surface->role == IVI_SURFACE_ROLE_DESKTOP))
+ goto skip_output_asignment;
+
+ assert(output != NULL);
+
+ /* resize the active surface to the original size */
+ if (surface->role == IVI_SURFACE_ROLE_SPLIT_H ||
+ surface->role == IVI_SURFACE_ROLE_SPLIT_V) {
+ if (output && output->active) {
+ ivi_layout_desktop_resize(output->active, output->area_saved);
+ }
+ /* restore the area back so we can re-use it again if needed */
+ output->area = output->area_saved;
+ }
+
+ /* reset the active surface as well */
+ if (output && output->active && output->active == surface) {
+ output->active->view->is_mapped = false;
+ output->active->view->surface->is_mapped = false;
+
+ weston_layer_entry_remove(&output->active->view->layer_link);
+ output->active = NULL;
+ }
+
+ if (surface->role == IVI_SURFACE_ROLE_REMOTE &&
+ output->type == OUTPUT_REMOTE)
+ ivi_destroy_waltham_destroy(surface);
+
+ /* check if there's a last 'remote' surface and insert a black
+ * surface view if there's no background set for that output
+ */
+ if ((desktop_surface_check_last_remote_surfaces(output->ivi,
+ IVI_SURFACE_ROLE_REMOTE) ||
+ desktop_surface_check_last_remote_surfaces(output->ivi,
+ IVI_SURFACE_ROLE_DESKTOP)) && output->type == OUTPUT_REMOTE)
+ if (!output->background)
+ insert_black_surface(output);