layout: Activate by default xdg surface that do not have an app_id set 33/25233/1 9.99.4 jellyfish/9.99.4 jellyfish_9.99.4
authorMarius Vlad <marius.vlad@collabora.com>
Wed, 9 Sep 2020 16:48:47 +0000 (19:48 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Thu, 10 Sep 2020 16:35:55 +0000 (19:35 +0300)
The following is necessary in case the app_id is set-up at a later point
in time, and it is intended as a work-around for WAM/chromium68 clients
that specify the app_id after the initial surface commit. Note that
activation will not work, in case the application will never set-up an
app_id because we can't identify which app_id to switch to.

The activation phase is needed to inform the client of the window
dimensions, and it is mandated by the XDG-shell protocol.

Bug-AGL: SPEC-3544

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I49a7270dcb68e525fc9d85db2cd189a50c02502f

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

index 79b2255..6969a7d 100644 (file)
@@ -333,6 +333,9 @@ ivi_layout_init(struct ivi_compositor *ivi, struct ivi_output *output);
 void
 ivi_layout_activate(struct ivi_output *output, const char *app_id);
 
+void
+ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf);
+
 void
 ivi_layout_desktop_committed(struct ivi_surface *surf);
 
index b7f9d4a..dd7e75f 100644 (file)
@@ -334,6 +334,18 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
                                        ivi_layout_get_surface_role_name(surf));
                                ivi_layout_activate(r_output, app_id);
                                surf->activated_by_default = true;
+                       } else if (!app_id) {
+                               /*
+                                * applications not setting an app_id, or
+                                * setting an app_id but at a later point in
+                                * time, might fall-back here so give them a
+                                * chance to receive the configure event and
+                                * act upon it
+                                */
+                               weston_log("Surface no app_id, role %s activating by default\n",
+                                       ivi_layout_get_surface_role_name(surf));
+                               ivi_layout_activate_by_surf(r_output, surf);
+                               surf->activated_by_default = true;
                        }
                }
 
@@ -639,16 +651,19 @@ ivi_layout_surface_is_split_or_fullscreen(struct ivi_surface *surf)
 }
 
 void
-ivi_layout_activate(struct ivi_output *output, const char *app_id)
+ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)
 {
        struct ivi_compositor *ivi = output->ivi;
-       struct ivi_surface *surf;
        struct weston_desktop_surface *dsurf;
        struct weston_view *view;
        struct weston_geometry geom;
        struct ivi_policy *policy = output->ivi->policy;
 
-       surf = ivi_find_app(ivi, app_id);
+       dsurf = surf->dsurface;
+       view = surf->view;
+
+       const char *app_id = weston_desktop_surface_get_app_id(dsurf);
+
        if (!surf)
                return;
 
@@ -683,8 +698,6 @@ ivi_layout_activate(struct ivi_output *output, const char *app_id)
        }
 
 
-       dsurf = surf->dsurface;
-       view = surf->view;
        geom = weston_desktop_surface_get_geometry(dsurf);
 
        if (surf->role == IVI_SURFACE_ROLE_DESKTOP)
@@ -723,6 +736,19 @@ ivi_layout_activate(struct ivi_output *output, const char *app_id)
        }
 }
 
+void
+ivi_layout_activate(struct ivi_output *output, const char *app_id)
+{
+       struct ivi_surface *surf;
+       struct ivi_compositor *ivi = output->ivi;
+
+       surf = ivi_find_app(ivi, app_id);
+       if (!surf)
+               return;
+
+       ivi_layout_activate_by_surf(output, surf);
+}
+
 struct ivi_output *
 ivi_layout_get_output_from_surface(struct ivi_surface *surf)
 {