summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2024-02-09 12:11:14 +0200
committerMarius Vlad <marius.vlad@collabora.com>2024-02-22 13:51:33 +0000
commit3d6199ee18b4807a82c4181d829052029d1ba350 (patch)
treec0e818f45735fdb8ff83aefc00aa97cff54d03ba
parent70a2d75e8e35d94bf2b1aef430ac7ed8cd3d96bc (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.h3
-rw-r--r--src/layout.c4
-rw-r--r--src/shell.c67
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