diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2020-09-09 19:48:47 +0300 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2020-09-10 19:35:55 +0300 |
commit | 0056122343c782902457802bb1ef6bde7c14d3c9 (patch) | |
tree | d0189ad8518e5e9620615b86899e538c72efd011 | |
parent | 8769c76e59ec448bc081f4e89f68622e7185f884 (diff) |
layout: Activate by default xdg surface that do not have an app_id setjellyfish_9.99.4jellyfish/9.99.49.99.4
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
-rw-r--r-- | src/ivi-compositor.h | 3 | ||||
-rw-r--r-- | src/layout.c | 36 |
2 files changed, 34 insertions, 5 deletions
diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h index 79b2255..6969a7d 100644 --- a/src/ivi-compositor.h +++ b/src/ivi-compositor.h @@ -334,6 +334,9 @@ 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); void diff --git a/src/layout.c b/src/layout.c index b7f9d4a..dd7e75f 100644 --- a/src/layout.c +++ b/src/layout.c @@ -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) { |