diff options
author | 2024-02-12 14:13:05 +0200 | |
---|---|---|
committer | 2024-02-22 13:51:33 +0000 | |
commit | 16d8d1af63ea1bbdaa9223cbf3e01cb6698f1eb0 (patch) | |
tree | 2c357979374654ec85be7aeee9f4da597ccc7487 /src/layout.c | |
parent | 3d6199ee18b4807a82c4181d829052029d1ba350 (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.c | 25 |
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); |