diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2024-02-09 12:11:14 +0200 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2024-02-22 13:51:33 +0000 |
commit | 3d6199ee18b4807a82c4181d829052029d1ba350 (patch) | |
tree | c0e818f45735fdb8ff83aefc00aa97cff54d03ba | |
parent | 70a2d75e8e35d94bf2b1aef430ac7ed8cd3d96bc (diff) |
shell/layout: Add implementation for the width param
This adds support for passing by the width argument such that users can
specify the width dimensions of the split window. Given that we might
another previous active window we also need to split that accordingly
depending on the orientation.
Bug-AGL: SPEC-4839
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I39239c1af0358eaa671146d0f36a3a334e945067
-rw-r--r-- | src/ivi-compositor.h | 3 | ||||
-rw-r--r-- | src/layout.c | 4 | ||||
-rw-r--r-- | src/shell.c | 67 |
3 files changed, 53 insertions, 21 deletions
diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h index 9f3cc47..90ec4d9 100644 --- a/src/ivi-compositor.h +++ b/src/ivi-compositor.h @@ -242,6 +242,7 @@ struct pending_app { struct pending_app_tile { struct pending_app base; uint32_t orientation; + uint32_t width; }; struct ivi_desktop_surface { @@ -543,6 +544,6 @@ ivi_layout_reset_split_surfaces(struct ivi_compositor *ivi); void _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *output, - uint32_t orientation, bool to_activate); + uint32_t orientation, uint32_t width, bool to_activate); #endif diff --git a/src/layout.c b/src/layout.c index 95d3e54..7a2c9ac 100644 --- a/src/layout.c +++ b/src/layout.c @@ -1067,7 +1067,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, + _ivi_set_shell_surface_split(output->previous_active, NULL, 0, AGL_SHELL_TILE_ORIENTATION_NONE, false); if (output->active == ivisurf) { @@ -1075,7 +1075,7 @@ ivi_layout_reset_split_surfaces(struct ivi_compositor *ivi) } } - _ivi_set_shell_surface_split(ivisurf, NULL, + _ivi_set_shell_surface_split(ivisurf, NULL, 0, AGL_SHELL_TILE_ORIENTATION_NONE, false); } diff --git a/src/shell.c b/src/shell.c index a44dddf..eb29316 100644 --- a/src/shell.c +++ b/src/shell.c @@ -651,8 +651,18 @@ ivi_check_pending_desktop_surface(struct ivi_surface *surface) // handle the currently active surface if (papp->ioutput->active) { + int width_prev_app = 0; + + if (papp_tile->width > 0) { + if (papp_tile->orientation == AGL_SHELL_TILE_ORIENTATION_TOP || + papp_tile->orientation == AGL_SHELL_TILE_ORIENTATION_BOTTOM) + width_prev_app = papp->ioutput->area.height - papp_tile->width; + else + width_prev_app = papp->ioutput->area.width - papp_tile->width; + } _ivi_set_shell_surface_split(papp->ioutput->active, NULL, - reverse_orientation(papp_tile->orientation), false); + reverse_orientation(papp_tile->orientation), + width_prev_app, false); } surface->role = IVI_SURFACE_ROLE_TILE; @@ -660,7 +670,7 @@ ivi_check_pending_desktop_surface(struct ivi_surface *surface) wl_list_insert(&surface->ivi->surfaces, &surface->link); _ivi_set_shell_surface_split(surface, papp->ioutput, - papp_tile->orientation, true); + papp_tile->orientation, papp_tile->width, true); /* remove it from pending */ wl_list_remove(&papp->link); @@ -1790,13 +1800,13 @@ reverse_orientation(uint32_t orientation) void _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *ioutput, - uint32_t orientation, bool to_activate) + uint32_t orientation, uint32_t width, bool to_activate) { struct ivi_compositor *ivi = surface->ivi; struct weston_geometry geom = {}; struct ivi_output *output = NULL; - int width, height; + int new_width, new_height; int x, y; geom = weston_desktop_surface_get_geometry(surface->dsurface); @@ -1805,19 +1815,32 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou if (!output) output = ioutput; - width = output->area.width; - height = output->area.height; - + // if we don't supply a width we automatically default to doing a half + // split, each window taking half of the current output switch (orientation) { case AGL_SHELL_TILE_ORIENTATION_LEFT: case AGL_SHELL_TILE_ORIENTATION_RIGHT: - width /= 2; + if (width == 0) { + new_width = output->area.width / 2; + new_height = output->area.height; + } else { + new_width = width; + new_height = output->area.height; + } break; case AGL_SHELL_TILE_ORIENTATION_TOP: case AGL_SHELL_TILE_ORIENTATION_BOTTOM: - height /= 2; + if (width == 0) { + new_width = output->area.width; + new_height = output->area.height / 2; + } else { + new_width = output->area.width; + new_height = width; + } break; case AGL_SHELL_TILE_ORIENTATION_NONE: + new_width = output->area.width; + new_height = output->area.height; break; default: /* nothing */ @@ -1829,9 +1852,10 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou y = output->area.y - geom.y; if (orientation == AGL_SHELL_TILE_ORIENTATION_RIGHT) - x += width; + x += output->area.width - new_width; else if (orientation == AGL_SHELL_TILE_ORIENTATION_BOTTOM) - y += height; + y += output->area.height - new_height; + if (to_activate) { struct weston_view *ev = surface->view; @@ -1868,15 +1892,11 @@ _ivi_set_shell_surface_split(struct ivi_surface *surface, struct ivi_output *iou } weston_view_set_position(surface->view, x, y); - weston_desktop_surface_set_size(surface->dsurface, width, height); + weston_desktop_surface_set_size(surface->dsurface, new_width, new_height); weston_desktop_surface_set_orientation(surface->dsurface, orientation); surface->orientation = orientation; weston_compositor_schedule_repaint(ivi->compositor); - - weston_log("%s() Setting to x=%d, y=%d, width=%d, height=%d, orientation=%d\n", - __func__, x, y, width, height, orientation); - } static int @@ -1923,6 +1943,7 @@ void shell_set_app_split(struct wl_client *client, struct wl_resource *res, if (output->previous_active && output->background != output->previous_active) { struct weston_view *ev = output->previous_active->view; + int width_prev_app = 0; if (!weston_view_is_mapped(ev)) weston_view_update_transform(ev); @@ -1937,8 +1958,18 @@ void shell_set_app_split(struct wl_client *client, struct wl_resource *res, weston_layer_entry_insert(&ivi->normal.view_list, &ev->layer_link); + /* a 0 width means we have no explicit width set-up */ + if (width > 0) { + if (orientation == AGL_SHELL_TILE_ORIENTATION_TOP || + orientation == AGL_SHELL_TILE_ORIENTATION_BOTTOM) + width_prev_app = output->area.height - width; + else + width_prev_app = output->area.width - width; + } + _ivi_set_shell_surface_split(output->previous_active, NULL, - reverse_orientation(orientation), false); + reverse_orientation(orientation), + width_prev_app, false); if (orientation == AGL_SHELL_TILE_ORIENTATION_NONE && output->active == surf) { @@ -1946,7 +1977,7 @@ void shell_set_app_split(struct wl_client *client, struct wl_resource *res, } } - _ivi_set_shell_surface_split(surf, NULL, orientation, false); + _ivi_set_shell_surface_split(surf, NULL, orientation, width, false); } static void |