X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fdesktop.c;h=0f1da18bb1c0d8f07b94301668df93f110e2b398;hb=76fa1b83638310c23bf3ca952e4479499b8ecb43;hp=c5981a7c46eacee6413fc8237450ef745ccccd02;hpb=bb79d12c92fa6e860319c4c730d4c5c9e23932a2;p=src%2Fagl-compositor.git diff --git a/src/desktop.c b/src/desktop.c index c5981a7..0f1da18 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -223,7 +223,10 @@ desktop_surface_added(struct weston_desktop_surface *dsurface, void *userdata) if (output && ivi->shell_client.ready) { struct ivi_output *ivi_output = to_ivi_output(output); - desktop_surface_added_configure(surface, ivi_output); + if (active_output) + desktop_surface_added_configure(surface, active_output); + else + desktop_surface_added_configure(surface, ivi_output); } /* * We delay creating "normal" desktop surfaces until later, to @@ -239,13 +242,14 @@ desktop_surface_added(struct weston_desktop_surface *dsurface, void *userdata) } static bool -desktop_surface_check_last_remote_surfaces(struct ivi_compositor *ivi, enum ivi_surface_role role) +desktop_surface_check_last_surfaces(struct ivi_output *ivi_output, enum ivi_surface_role role) { int count = 0; struct ivi_surface *surf; - wl_list_for_each(surf, &ivi->surfaces, link) - if (surf->role == role) + wl_list_for_each(surf, &ivi_output->ivi->surfaces, link) + if (surf->role == role && + surf->current_completed_output == ivi_output) count++; return (count == 1); @@ -285,8 +289,9 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) * 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)) + if ((output == NULL && (surface->role == IVI_SURFACE_ROLE_NONE || + surface->role == IVI_SURFACE_ROLE_DESKTOP)) || + output->output == NULL) goto skip_output_asignment; assert(output != NULL); @@ -324,12 +329,10 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) /* 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 (desktop_surface_check_last_surfaces(output, IVI_SURFACE_ROLE_REMOTE) || + desktop_surface_check_last_surfaces(output, IVI_SURFACE_ROLE_DESKTOP)) if (!output->background) - insert_black_surface(output); + insert_black_curtain(output); if (weston_surface_is_mapped(wsurface)) { @@ -364,9 +367,12 @@ skip_output_asignment: weston_log("Removed surface %p, app_id %s, role %s\n", surface, app_id, ivi_layout_get_surface_role_name(surface)); - if (app_id && output) + if (app_id && output && output->output) { shell_advertise_app_state(output->ivi, app_id, NULL, AGL_SHELL_DESKTOP_APP_STATE_DESTROYED); + if (output->ivi->shell_client.ready) + shell_send_app_state(output->ivi, app_id, AGL_SHELL_APP_STATE_TERMINATED); + } wl_list_remove(&surface->link); @@ -394,6 +400,11 @@ desktop_committed(struct weston_desktop_surface *dsurface, wl_list_init(&surface->link); ivi_check_pending_desktop_surface(surface); surface->checked_pending = true; + + /* we'll do it now at commit time, because we might not have an + * appid by the time we've created the weston_desktop_surface + * */ + shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_STARTED); } if (!surface->advertised_on_launch &&