From: Marius Vlad Date: Mon, 1 Jun 2020 15:31:22 +0000 (+0300) Subject: src/: Use agl-shell-app-id to set-up views on a different output X-Git-Tag: 9.99.1~27 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=8df7681a823e5e6f7ead5150abf65dd84d05aecd;p=src%2Fagl-compositor.git src/: Use agl-shell-app-id to set-up views on a different output This makes it easier to specify the application directly in the configuration file, without the ned to modify the application code. Bug-AGL: SPEC-3280 Signed-off-by: Marius Vlad Change-Id: Ic38ca0aaf05ce8f1c4993341c9d767acfd25eb43 --- diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h index b506ce1..bc3a81d 100644 --- a/src/ivi-compositor.h +++ b/src/ivi-compositor.h @@ -136,6 +136,8 @@ struct ivi_output { /* Temporary: only used during configuration */ size_t add_len; struct weston_head *add[8]; + + char *app_id; }; enum ivi_surface_role { diff --git a/src/layout.c b/src/layout.c index a142609..57992ca 100644 --- a/src/layout.c +++ b/src/layout.c @@ -255,6 +255,23 @@ ivi_layout_activate_complete(struct ivi_output *output, ivi_layout_get_surface_role_name(surf)); } +static struct ivi_output * +ivi_layout_find_app_id(const char *app_id, struct ivi_compositor *ivi) +{ + struct ivi_output *out; + + wl_list_for_each(out, &ivi->outputs, link) { + if (!out->app_id) + continue; + + if (!strcmp(app_id, out->app_id)) + return out; + } + + return NULL; +} + + static struct ivi_output * ivi_layout_find_bg_output(struct ivi_compositor *ivi) { @@ -276,6 +293,7 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) struct weston_geometry geom = weston_desktop_surface_get_geometry(dsurf); struct ivi_policy *policy = surf->ivi->policy; struct ivi_output *output; + const char *app_id = weston_desktop_surface_get_app_id(dsurf); assert(surf->role == IVI_SURFACE_ROLE_DESKTOP || surf->role == IVI_SURFACE_ROLE_REMOTE); @@ -293,7 +311,7 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) output = surf->remote.output; if (surf->role == IVI_SURFACE_ROLE_DESKTOP && !output) { - struct ivi_output *ivi_bg_output; + struct ivi_output *r_output; if (policy && policy->api.surface_activate_by_default && !policy->api.surface_activate_by_default(surf, surf->ivi)) @@ -303,18 +321,21 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) if (surf->activated_by_default) return; - ivi_bg_output = ivi_layout_find_bg_output(surf->ivi); + /* check first if there aren't any outputs being set */ + r_output = ivi_layout_find_app_id(app_id, surf->ivi); + + /* try finding an output with a background and use that */ + if (!r_output) + r_output = ivi_layout_find_bg_output(surf->ivi); /* use the output of the bg to activate the app on start-up by * default */ - if (surf->view && ivi_bg_output) { - const char *app_id = - weston_desktop_surface_get_app_id(dsurf); - if (app_id && ivi_bg_output) { + if (surf->view && r_output) { + if (app_id && r_output) { weston_log("Surface with app_id %s, role %s activating by default\n", weston_desktop_surface_get_app_id(surf->dsurface), ivi_layout_get_surface_role_name(surf)); - ivi_layout_activate(ivi_bg_output, app_id); + ivi_layout_activate(r_output, app_id); surf->activated_by_default = true; } } @@ -323,7 +344,6 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) } if (surf->role == IVI_SURFACE_ROLE_REMOTE && output) { - const char *app_id; if (policy && policy->api.surface_activate_by_default && !policy->api.surface_activate_by_default(surf, surf->ivi)) return; @@ -336,7 +356,6 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) if (surf->activated_by_default && output->active == surf) return; - app_id = weston_desktop_surface_get_app_id(dsurf); if (app_id) { weston_log("Surface with app_id %s, role %s activating by default\n", weston_desktop_surface_get_app_id(surf->dsurface), diff --git a/src/main.c b/src/main.c index cad8a42..2bbb800 100644 --- a/src/main.c +++ b/src/main.c @@ -46,6 +46,7 @@ #include #include #include +#include #include "shared/os-compatibility.h" #include "shared/helpers.h" @@ -85,6 +86,20 @@ to_ivi_output(struct weston_output *o) return output; } +static void +ivi_output_configure_app_id(struct ivi_output *ivi_output) +{ + if (ivi_output->config) { + if (ivi_output->app_id != NULL) + return; + + weston_config_section_get_string(ivi_output->config, + "agl-shell-app-id", + &ivi_output->app_id, + NULL); + } +} + static struct ivi_output * ivi_ensure_output(struct ivi_compositor *ivi, char *name, struct weston_config_section *config) @@ -119,6 +134,7 @@ ivi_ensure_output(struct ivi_compositor *ivi, char *name, &output->output_destroy); wl_list_insert(&ivi->outputs, &output->link); + ivi_output_configure_app_id(output); return output; }