summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2023-04-13 11:58:19 +0300
committerMarius Vlad <marius.vlad@collabora.com>2023-04-27 23:18:38 +0300
commit456f3fed4ff45bbaf7f60c78ffb0ae0289002dfe (patch)
tree94d5830f10478c3259d1efa488caae957f73ed20
parent4a1684308bd6a17c5b112d30e672c40fd348fef3 (diff)
layout: Split remote from desktop role
Though there's no difference between the desktop and remote role this would simplify handling, and with it we remove the implicit activation of surfaces, which wasn't addressed when we switched to activate-by-default=false by default. Bug-AGL: SPEC-4673, SPEC-4759, SPEC-4529, SPEC-4756 Signed-off-by: Marius Vlad <marius.vlad@collabora.com> Change-Id: Ia5e57155ed26c53958e0e9590be04f91c5de1c28
-rw-r--r--src/desktop.c4
-rw-r--r--src/ivi-compositor.h2
-rw-r--r--src/layout.c86
-rw-r--r--src/shell.c2
4 files changed, 60 insertions, 34 deletions
diff --git a/src/desktop.c b/src/desktop.c
index eb0dc8a..361c5b4 100644
--- a/src/desktop.c
+++ b/src/desktop.c
@@ -426,9 +426,11 @@ desktop_committed(struct weston_desktop_surface *dsurface,
switch (surface->role) {
case IVI_SURFACE_ROLE_DESKTOP:
- case IVI_SURFACE_ROLE_REMOTE:
ivi_layout_desktop_committed(surface);
break;
+ case IVI_SURFACE_ROLE_REMOTE:
+ ivi_layout_remote_committed(surface);
+ break;
case IVI_SURFACE_ROLE_POPUP:
ivi_layout_popup_committed(surface);
break;
diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h
index f755e67..49d38de 100644
--- a/src/ivi-compositor.h
+++ b/src/ivi-compositor.h
@@ -416,6 +416,8 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)
void
ivi_layout_desktop_committed(struct ivi_surface *surf);
+void
+ivi_layout_remote_committed(struct ivi_surface *surf);
void
ivi_layout_popup_committed(struct ivi_surface *surface);
diff --git a/src/layout.c b/src/layout.c
index 9981ebb..a5e3b36 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -49,6 +49,9 @@ static const char *ivi_roles_as_string[] = {
[IVI_SURFACE_ROLE_REMOTE] = "REMOTE",
};
+bool
+ivi_surf_in_hidden_layer(struct ivi_compositor *ivi, struct ivi_surface *surface);
+
const char *
ivi_layout_get_surface_role_name(struct ivi_surface *surf)
{
@@ -452,6 +455,53 @@ ivi_layout_add_to_hidden_layer(struct ivi_surface *surf,
}
void
+ivi_layout_remote_committed(struct ivi_surface *surf)
+{
+ struct weston_desktop_surface *dsurf = surf->dsurface;
+ 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_REMOTE);
+
+ output = surf->remote.output;
+
+ if (policy && policy->api.surface_activate_by_default &&
+ !policy->api.surface_activate_by_default(surf, surf->ivi))
+ return;
+
+ /* we can only activate it again by using the protocol, but
+ * additionally the output is not reset when
+ * ivi_layout_activate_complete() terminates so we use the
+ * current active surface to avoid hitting this again and again
+ * */
+ if (surf->mapped && output->active == surf)
+ return;
+
+ if (!surf->ivi->activate_by_default &&
+ !ivi_surf_in_hidden_layer(surf->ivi, surf)) {
+ weston_log("Refusing to activate surface role %d, "
+ "app_id %s\n", surf->role, app_id);
+
+ if (!weston_desktop_surface_get_maximized(dsurf) ||
+ geom.width != output->area.width ||
+ geom.height != output->area.height) {
+ ivi_layout_add_to_hidden_layer(surf, output);
+ }
+
+ return;
+ }
+
+ if (!weston_desktop_surface_get_maximized(dsurf) ||
+ geom.width != output->area.width ||
+ geom.height != output->area.height)
+ return;
+
+ ivi_layout_activate_complete(output, surf);
+}
+
+void
ivi_layout_desktop_committed(struct ivi_surface *surf)
{
struct weston_desktop_surface *dsurf = surf->dsurface;
@@ -460,8 +510,7 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
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);
+ assert(surf->role == IVI_SURFACE_ROLE_DESKTOP);
/*
* we can't make use here of the ivi_layout_get_output_from_surface()
@@ -470,12 +519,9 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
* with 'mapped' at this point to avoid tripping over
* to a surface that continuously updates its content
*/
- if (surf->role == IVI_SURFACE_ROLE_DESKTOP)
- output = surf->desktop.pending_output;
- else
- output = surf->remote.output;
+ output = surf->desktop.pending_output;
- if (surf->role == IVI_SURFACE_ROLE_DESKTOP && !output) {
+ if (!output) {
struct ivi_output *r_output;
if (policy && policy->api.surface_activate_by_default &&
@@ -546,30 +592,6 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
return;
}
- if (surf->role == IVI_SURFACE_ROLE_REMOTE && output) {
- if (policy && policy->api.surface_activate_by_default &&
- !policy->api.surface_activate_by_default(surf, surf->ivi))
- return;
-
- /* we can only activate it again by using the protocol, but
- * additionally the output is not reset when
- * ivi_layout_activate_complete() terminates so we use the
- * current active surface to avoid hitting this again and again
- * */
- if (surf->mapped && output->active == surf)
- return;
-
- if (app_id) {
- weston_log("Surface with app_id %s, role %s activating "
- "by default on output %s\n",
- weston_desktop_surface_get_app_id(surf->dsurface),
- ivi_layout_get_surface_role_name(surf),
- output->output->name);
- ivi_layout_activate(output, app_id);
- }
- return;
- }
-
if (!weston_desktop_surface_get_maximized(dsurf) ||
geom.width != output->area.width ||
geom.height != output->area.height)
@@ -807,7 +829,7 @@ ivi_compute_popup_position(const struct weston_output *output, struct weston_vie
}
-static bool
+bool
ivi_surf_in_hidden_layer(struct ivi_compositor *ivi, struct ivi_surface *surface)
{
struct weston_view *ev;
diff --git a/src/shell.c b/src/shell.c
index c3459e7..c18017b 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -706,7 +706,7 @@ ivi_check_pending_desktop_surface(struct ivi_surface *surface)
ret = ivi_check_pending_desktop_surface_remote(surface);
if (ret) {
ivi_set_desktop_surface_remote(surface);
- ivi_layout_desktop_committed(surface);
+ ivi_layout_remote_committed(surface);
return;
}