X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fshell.c;h=ac41e1fa28213aa10cd5605ca8484d27e175e8da;hb=9aa06a04b36d5d962f3b1cc8b6a541f8e73f6278;hp=c132ae528f28c7fb45caeb78f0ee28ae11bcb0c8;hpb=edbfbad7344c4de62cbf5a4a5c8935afa50d8b4a;p=src%2Fagl-compositor.git diff --git a/src/shell.c b/src/shell.c index c132ae5..ac41e1f 100644 --- a/src/shell.c +++ b/src/shell.c @@ -45,9 +45,6 @@ static void create_black_surface_view(struct ivi_output *output); -static void -insert_black_surface(struct ivi_output *output); - void ivi_set_desktop_surface(struct ivi_surface *surface) { @@ -86,6 +83,30 @@ ivi_set_desktop_surface_fullscreen(struct ivi_surface *surface) wl_list_insert(&ivi->surfaces, &surface->link); } +static void +ivi_set_desktop_surface_remote(struct ivi_surface *surface) +{ + struct ivi_compositor *ivi = surface->ivi; + struct weston_view *view; + struct ivi_output *output = surface->remote.output; + + assert(surface->role == IVI_SURFACE_ROLE_NONE); + + /* remote type are the same as desktop just that client can tell + * the compositor to start on another output */ + surface->role = IVI_SURFACE_ROLE_REMOTE; + + /* if thew black surface view is mapped on the mean we need + * to remove it in order to start showing the 'remote' surface + * just being added */ + view = output->fullscreen_view.fs->view; + if (view->is_mapped || view->surface->is_mapped) + remove_black_surface(output); + + wl_list_insert(&ivi->surfaces, &surface->link); +} + + static void ivi_set_desktop_surface_split(struct ivi_surface *surface) { @@ -140,14 +161,22 @@ ivi_set_pending_desktop_surface_split(struct ivi_output *ioutput, const char *app_id, uint32_t orientation) { struct ivi_compositor *ivi = ioutput->ivi; + struct ivi_surface *surf; size_t len_app_id = strlen(app_id); + struct pending_split *split; if (orientation != AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_VERTICAL && orientation != AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_HORIZONTAL) return; - struct pending_split *split = zalloc(sizeof(*split)); + /* more than one is un-supported, do note we need to do + * conversion for surface roles instead of using the protocol ones */ + wl_list_for_each(surf, &ivi->surfaces, link) + if (surf->role == IVI_SURFACE_ROLE_SPLIT_V || + surf->role == IVI_SURFACE_ROLE_SPLIT_H) + return; + split = zalloc(sizeof(*split)); split->app_id = zalloc(sizeof(char) * (len_app_id + 1)); memcpy(split->app_id, app_id, len_app_id); @@ -157,6 +186,24 @@ ivi_set_pending_desktop_surface_split(struct ivi_output *ioutput, wl_list_insert(&ivi->split_pending_apps, &split->link); } +void +ivi_set_pending_desktop_surface_remote(struct ivi_output *ioutput, + const char *app_id) +{ + struct ivi_compositor *ivi = ioutput->ivi; + size_t len_app_id = strlen(app_id); + + struct pending_remote *remote = zalloc(sizeof(*remote)); + + remote->app_id = zalloc(sizeof(char) * (len_app_id + 1)); + memcpy(remote->app_id, app_id, len_app_id); + + remote->ioutput = ioutput; + + wl_list_insert(&ivi->remote_pending_apps, &remote->link); +} + + static void ivi_remove_pending_desktop_surface_split(struct pending_split *split) { @@ -181,6 +228,14 @@ ivi_remove_pending_desktop_surface_popup(struct pending_popup *p_popup) free(p_popup); } +static void +ivi_remove_pending_desktop_surface_remote(struct pending_remote *remote) +{ + free(remote->app_id); + wl_list_remove(&remote->link); + free(remote); +} + static bool ivi_check_pending_desktop_surface_popup(struct ivi_surface *surface) { @@ -253,6 +308,30 @@ ivi_check_pending_desktop_surface_fullscreen(struct ivi_surface *surface) return false; } +static bool +ivi_check_pending_desktop_surface_remote(struct ivi_surface *surface) +{ + struct pending_remote *remote_surf, *next_remote_surf; + struct ivi_compositor *ivi = surface->ivi; + const char *_app_id = + weston_desktop_surface_get_app_id(surface->dsurface); + + if (wl_list_empty(&ivi->remote_pending_apps)) + return false; + + wl_list_for_each_safe(remote_surf, next_remote_surf, + &ivi->remote_pending_apps, link) { + if (!strcmp(_app_id, remote_surf->app_id)) { + surface->remote.output = remote_surf->ioutput; + ivi_remove_pending_desktop_surface_remote(remote_surf); + return true; + } + } + + return false; +} + + void ivi_check_pending_desktop_surface(struct ivi_surface *surface) { @@ -276,8 +355,16 @@ ivi_check_pending_desktop_surface(struct ivi_surface *surface) return; } - /* if we end up here means we have a regular desktop app */ + ret = ivi_check_pending_desktop_surface_remote(surface); + if (ret) { + ivi_set_desktop_surface_remote(surface); + return; + } + + /* if we end up here means we have a regular desktop app and + * try to activate it */ ivi_set_desktop_surface(surface); + ivi_layout_desktop_committed(surface); } void @@ -469,11 +556,19 @@ create_black_surface_view(struct ivi_output *output) &output->fullscreen_view.fs_destroy); } -static void +void remove_black_surface(struct ivi_output *output) { - struct weston_view *view = output->fullscreen_view.fs->view; + struct weston_view *view; + + if (!output && + !output->fullscreen_view.fs && + !output->fullscreen_view.fs->view) { + weston_log("Output %s doesn't have a surface installed!\n", output->name); + return; + } + view = output->fullscreen_view.fs->view; assert(view->is_mapped == true || view->surface->is_mapped == true); @@ -486,11 +581,19 @@ remove_black_surface(struct ivi_output *output) weston_output_damage(output->output); } -static void +void insert_black_surface(struct ivi_output *output) { - struct weston_view *view = output->fullscreen_view.fs->view; + struct weston_view *view; + + if (!output && + !output->fullscreen_view.fs && + !output->fullscreen_view.fs->view) { + weston_log("Output %s doesn't have a surface installed!\n", output->name); + return; + } + view = output->fullscreen_view.fs->view; if (view->is_mapped || view->surface->is_mapped) return; @@ -519,19 +622,14 @@ shell_ready(struct wl_client *client, struct wl_resource *shell_res) ivi->shell_client.ready = true; wl_list_for_each(output, &ivi->outputs, link) { - remove_black_surface(output); + if (output->background) + remove_black_surface(output); ivi_layout_init(ivi, output); } wl_list_for_each_safe(surface, tmp, &ivi->pending_surfaces, link) { wl_list_remove(&surface->link); - - if (ivi_check_pending_desktop_surface_popup(surface)) { - ivi_set_desktop_surface_popup(surface); - } else { - ivi_set_desktop_surface(surface); - ivi_layout_desktop_committed(surface); - } + ivi_check_pending_desktop_surface(surface); } } @@ -763,6 +861,9 @@ shell_desktop_set_app_property(struct wl_client *client, case AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_HORIZONTAL: ivi_set_pending_desktop_surface_split(output, app_id, role); break; + case AGL_SHELL_DESKTOP_APP_ROLE_REMOTE: + ivi_set_pending_desktop_surface_remote(output, app_id); + break; default: break; }