summaryrefslogtreecommitdiffstats
path: root/src/layout.c
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2024-02-12 14:13:05 +0200
committerMarius Vlad <marius.vlad@collabora.com>2024-02-22 13:51:33 +0000
commit16d8d1af63ea1bbdaa9223cbf3e01cb6698f1eb0 (patch)
tree2c357979374654ec85be7aeee9f4da597ccc7487 /src/layout.c
parent3d6199ee18b4807a82c4181d829052029d1ba350 (diff)
layout: Added sticky implementation for split windows
This continues implementing the sticky window functionality to be able to keep a window, set as sticky, always displayed while having the ability to activate/switch to other windows. This could be useful in a handful of sitauations like keeping the nav application on, while activing other windows. Bug-AGL: SPEC-4839 Signed-off-by: Marius Vlad <marius.vlad@collabora.com> Change-Id: I94c835c0d8f9f7e334e4c75389d78bd267b71a87
Diffstat (limited to 'src/layout.c')
-rw-r--r--src/layout.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/layout.c b/src/layout.c
index 7a2c9ac..a2cf48c 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -286,7 +286,8 @@ ivi_layout_activate_complete(struct ivi_output *output,
woutput->y + output->area.y);
/* reset any previous orientation */
- if (surf->orientation != AGL_SHELL_TILE_ORIENTATION_NONE) {
+ if (surf->orientation != AGL_SHELL_TILE_ORIENTATION_NONE &&
+ !surf->sticky) {
weston_log("%s() resetting itself to none orientation\n", __func__);
surf->orientation = AGL_SHELL_TILE_ORIENTATION_NONE;
weston_desktop_surface_set_orientation(surf->dsurface,
@@ -317,7 +318,9 @@ ivi_layout_activate_complete(struct ivi_output *output,
if (output->active) {
/* keep the background surface mapped at all times */
- if (output->active->role != IVI_SURFACE_ROLE_BACKGROUND) {
+ if (output->active->role != IVI_SURFACE_ROLE_BACKGROUND &&
+ !output->active->sticky) {
+
output->active->view->is_mapped = false;
output->active->view->surface->is_mapped = false;
@@ -1036,11 +1039,13 @@ void
ivi_layout_reset_split_surfaces(struct ivi_compositor *ivi)
{
struct ivi_surface *ivisurf;
+ struct ivi_surface *found_ivi_surf = NULL;
bool found_split_surface = false;
struct ivi_output *output = NULL;
wl_list_for_each(ivisurf, &ivi->surfaces, link) {
if (ivisurf->orientation != AGL_SHELL_TILE_ORIENTATION_NONE) {
+ found_ivi_surf = ivisurf;
found_split_surface = true;
break;
}
@@ -1049,7 +1054,11 @@ ivi_layout_reset_split_surfaces(struct ivi_compositor *ivi)
if (!found_split_surface)
return;
- output = ivisurf->current_completed_output;
+ output = found_ivi_surf->current_completed_output;
+
+ if (found_ivi_surf->sticky)
+ return;
+
if (output->previous_active && output->background != output->previous_active) {
struct weston_view *ev = output->previous_active->view;
struct weston_output *woutput = output->output;
@@ -1068,7 +1077,7 @@ ivi_layout_reset_split_surfaces(struct ivi_compositor *ivi)
weston_layer_entry_insert(&ivi->normal.view_list, &ev->layer_link);
_ivi_set_shell_surface_split(output->previous_active, NULL, 0,
- AGL_SHELL_TILE_ORIENTATION_NONE, false);
+ AGL_SHELL_TILE_ORIENTATION_NONE, false, false);
if (output->active == ivisurf) {
output->active = output->previous_active;
@@ -1076,7 +1085,7 @@ ivi_layout_reset_split_surfaces(struct ivi_compositor *ivi)
}
_ivi_set_shell_surface_split(ivisurf, NULL, 0,
- AGL_SHELL_TILE_ORIENTATION_NONE, false);
+ AGL_SHELL_TILE_ORIENTATION_NONE, false, false);
}
void
@@ -1128,6 +1137,12 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)
return;
}
+ if (surf->sticky && surf->role == IVI_SURFACE_ROLE_TILE) {
+ weston_log("Application %s is already active on output %s (split role)\n",
+ app_id, output->output->name);
+ return;
+ }
+
if (ivi_layout_surface_is_split_or_fullscreen(surf)) {
weston_log("Application %s is fullscreen or split on output %s\n",
app_id, output->output->name);