summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2022-11-14 13:27:27 -0500
committerScott Murray <scott.murray@konsulko.com>2022-11-14 13:27:27 -0500
commit0a936136ace7f2f4cc2a11834cde4be86381372f (patch)
treeb8bef565829c85e6b1dc783c290708ec09f6c0bd
parent17f92b23b99d6c34793b6b636dc4d508113f0489 (diff)
layout: Allow background surface roles (to) be activated
While nothing technically prevents the background surface role to be activated, it turns out we don't actually track it so we a) couldn't find it, and b) we attempted to resize it to an incorrect dimension. Another small follow-up commit from 'Add manual activation area configuration option' and with with commit 'agl-shell: Add support for defining an activation area', which introduced the ability to designate a certain area as the activation area. v2: Keep the background surface always mapped We now have more than one active surfaces at the same time, so we can't unmap it as it needs to be always displayed. Bug-AGL: SPEC-4594 Reported-by: Scott Murray <scott.murray@konsulko.com> Signed-off-by: Marius Vlad <marius.vlad@collabora.com> [backported to Needlefish branch] Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: I8373c04c8f75e19a1efa4961c06ad36d7b6031cb
-rw-r--r--src/layout.c24
-rw-r--r--src/shell.c18
2 files changed, 35 insertions, 7 deletions
diff --git a/src/layout.c b/src/layout.c
index 332b4d7..7a1e0e0 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -225,19 +225,24 @@ ivi_layout_activate_complete(struct ivi_output *output,
}
weston_view_set_output(view, woutput);
- weston_view_set_position(view,
- woutput->x + output->area.x,
- woutput->y + output->area.y);
+
+ if (surf->role != IVI_SURFACE_ROLE_BACKGROUND)
+ weston_view_set_position(view,
+ woutput->x + output->area.x,
+ woutput->y + output->area.y);
view->is_mapped = true;
surf->mapped = true;
view->surface->is_mapped = true;
if (output->active) {
- output->active->view->is_mapped = false;
- output->active->view->surface->is_mapped = false;
+ /* keep the background surface mapped at all times */
+ if (output->active->role != IVI_SURFACE_ROLE_BACKGROUND) {
+ output->active->view->is_mapped = false;
+ output->active->view->surface->is_mapped = false;
- weston_layer_entry_remove(&output->active->view->layer_link);
+ weston_layer_entry_remove(&output->active->view->layer_link);
+ }
}
output->previous_active = output->active;
output->active = surf;
@@ -854,6 +859,13 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)
return;
}
+ /* the background surface is already "maximized" so we don't need to
+ * add to the hidden layer */
+ if (surf->role == IVI_SURFACE_ROLE_BACKGROUND) {
+ ivi_layout_activate_complete(output, surf);
+ return;
+ }
+
ivi_layout_add_to_hidden_layer(surf, output);
}
diff --git a/src/shell.c b/src/shell.c
index dc07c26..cbe1252 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -88,6 +88,16 @@ ivi_set_desktop_surface(struct ivi_surface *surface)
}
static void
+ivi_set_background_surface(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+ assert(surface->role == IVI_SURFACE_ROLE_BACKGROUND);
+
+ wl_list_insert(&surface->ivi->surfaces, &surface->link);
+ agl_shell_desktop_advertise_application_id(ivi, surface);
+}
+
+static void
ivi_set_desktop_surface_popup(struct ivi_surface *surface)
{
struct ivi_compositor *ivi = surface->ivi;
@@ -1024,8 +1034,14 @@ shell_ready(struct wl_client *client, struct wl_resource *shell_res)
ivi->shell_client.ready = true;
wl_list_for_each(output, &ivi->outputs, link) {
- if (output->background)
+ if (output->background &&
+ output->background->role == IVI_SURFACE_ROLE_BACKGROUND) {
+ /* track the background surface role as a "regular"
+ * surface so we can activate it */
+ ivi_set_background_surface(output->background);
remove_black_surface(output);
+ }
+
ivi_layout_init(ivi, output);
}