diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2020-06-01 18:31:22 +0300 |
---|---|---|
committer | Jan-Simon Moeller <jsmoeller@linuxfoundation.org> | 2020-06-15 10:08:32 +0000 |
commit | 8df7681a823e5e6f7ead5150abf65dd84d05aecd (patch) | |
tree | 3ff88fdab7364e080050b942aca1e9ded0ea6dcd | |
parent | f235042e4cd88197ade414795382ba227f924332 (diff) |
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 <marius.vlad@collabora.com>
Change-Id: Ic38ca0aaf05ce8f1c4993341c9d767acfd25eb43
-rw-r--r-- | src/ivi-compositor.h | 2 | ||||
-rw-r--r-- | src/layout.c | 37 | ||||
-rw-r--r-- | src/main.c | 16 |
3 files changed, 46 insertions, 9 deletions
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 @@ -256,6 +256,23 @@ ivi_layout_activate_complete(struct ivi_output *output, } 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) { struct ivi_output *out; @@ -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), @@ -46,6 +46,7 @@ #include <libweston/windowed-output-api.h> #include <libweston/config-parser.h> #include <libweston/weston-log.h> +#include <weston/weston.h> #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; } |