shell/layout: Add implementation for the width param 55/29655/3
authorMarius Vlad <marius.vlad@collabora.com>
Fri, 9 Feb 2024 10:11:14 +0000 (12:11 +0200)
committerMarius Vlad <marius.vlad@collabora.com>
Thu, 22 Feb 2024 13:51:33 +0000 (13:51 +0000)
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

src/ivi-compositor.h
src/layout.c
src/shell.c

index 9f3cc47..90ec4d9 100644 (file)
@@ -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
index 95d3e54..7a2c9ac 100644 (file)
@@ -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);
 }
 
index a44dddf..eb29316 100644 (file)
@@ -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