aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2020-09-09 19:48:47 +0300
committerMarius Vlad <marius.vlad@collabora.com>2020-09-10 19:35:55 +0300
commit0056122343c782902457802bb1ef6bde7c14d3c9 (patch)
treed0189ad8518e5e9620615b86899e538c72efd011
parent8769c76e59ec448bc081f4e89f68622e7185f884 (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.h3
-rw-r--r--src/layout.c36
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)
{