src/: Use agl-shell-app-id to set-up views on a different output 58/24658/3
authorMarius Vlad <marius.vlad@collabora.com>
Mon, 1 Jun 2020 15:31:22 +0000 (18:31 +0300)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Mon, 15 Jun 2020 10:08:32 +0000 (10:08 +0000)
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

src/ivi-compositor.h
src/layout.c
src/main.c

index b506ce1..bc3a81d 100644 (file)
@@ -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 {
index a142609..57992ca 100644 (file)
@@ -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),
index cad8a42..2bbb800 100644 (file)
@@ -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;
 }