ivi-compositor: Add support for multiple app_ids 79/28379/3
authorMarius Vlad <marius.vlad@collabora.com>
Wed, 11 Jan 2023 15:23:37 +0000 (17:23 +0200)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Sun, 29 Jan 2023 22:26:50 +0000 (22:26 +0000)
Verify if more than one app_id is being passed in the agl-shell-app-id
to allow more than one appid being placed to that output.

Bug-AGL: SPEC-4666
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I79dc77564ffca41148832af597b6836d7d28f686

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

index 9e71552..617f1b5 100644 (file)
@@ -113,19 +113,19 @@ static void
 ivi_output_configure_app_id(struct ivi_output *ivi_output)
 {
        if (ivi_output->config) {
-               if (ivi_output->app_id != NULL)
+               if (ivi_output->app_ids != NULL)
                        return;
 
                weston_config_section_get_string(ivi_output->config,
                                                 "agl-shell-app-id",
-                                                &ivi_output->app_id,
+                                                &ivi_output->app_ids,
                                                 NULL);
 
-               if (ivi_output->app_id == NULL)
+               if (ivi_output->app_ids == NULL)
                        return;
 
                weston_log("Will place app_id %s on output %s\n",
-                               ivi_output->app_id, ivi_output->name);
+                               ivi_output->app_ids, ivi_output->name);
        }
 }
 
index 6a72e2a..0ccbb52 100644 (file)
@@ -179,7 +179,7 @@ struct ivi_output {
        size_t add_len;
        struct weston_head *add[8];
 
-       char *app_id;
+       char *app_ids;
        enum ivi_output_type type;
 };
 
index f2fc6cc..028ff4a 100644 (file)
@@ -315,6 +315,25 @@ ivi_layout_activate_complete(struct ivi_output *output,
        shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_ACTIVATED);
 }
 
+static bool
+ivi_layout_find_output_with_app_id(const char *app_id, struct ivi_output *output)
+{
+       char *cur;
+       size_t app_id_len;
+
+       cur = output->app_ids;
+       app_id_len = strlen(app_id);
+
+       while ((cur = strstr(cur, app_id))) {
+               if ((cur[app_id_len] == ',' || cur[app_id_len] == '\0') &&
+                   (cur == output->app_ids || cur[-1] == ','))
+                       return true;
+               cur++;
+       }
+
+       return false;
+}
+
 struct ivi_output *
 ivi_layout_find_with_app_id(const char *app_id, struct ivi_compositor *ivi)
 {
@@ -324,13 +343,12 @@ ivi_layout_find_with_app_id(const char *app_id, struct ivi_compositor *ivi)
                return NULL;
 
        wl_list_for_each(out, &ivi->outputs, link) {
-               if (!out->app_id)
+               if (!out->app_ids)
                        continue;
 
-               if (!strcmp(app_id, out->app_id))
+               if (ivi_layout_find_output_with_app_id(app_id, out))
                        return out;
        }
-
        return NULL;
 }
 
@@ -924,6 +942,9 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)
                struct ivi_output *remote_output =
                        ivi_layout_find_with_app_id(app_id, ivi);
 
+               weston_log("Changed activation for app_id %s, type %s, on output %s\n", app_id,
+                               ivi_layout_get_surface_role_name(surf), output->output->name);
+
                /* if already active on a remote output do not
                 * attempt to activate it again */
                if (remote_output && remote_output->active == surf)