aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2020-05-01 14:31:07 +0300
committerMarius Vlad <marius.vlad@collabora.com>2020-05-18 13:01:48 +0300
commit52769b82974afda0b4bba8b0c98a996cb96cac06 (patch)
tree9a18390ac6e96353a0421be996fba3352b535998
parent2349f210e12b783f6a314b9331035ecd066707c7 (diff)
layout: Resize the active surface when doing the split
This adds an intermediate geometry variable which is used to save and restore to the original available geometry when destroying the split surface. This takes care to inform the client that a new resize is needed when the split surface is destroyed or when the split surface is committed. The width and height of the split surface is derived from the available geometry area size (the available size of the background surface) but this can further adapted to be based on the split window size (that is, it could be specified by the client). This assumption is there to simplify the implementation. Bug-AGL: SPEC-3334 Signed-off-by: Marius Vlad <marius.vlad@collabora.com> Change-Id: Ia484a922a7cbd314db2c878f81cb548458d1c1cd
-rw-r--r--src/desktop.c10
-rw-r--r--src/ivi-compositor.h5
-rw-r--r--src/layout.c62
3 files changed, 71 insertions, 6 deletions
diff --git a/src/desktop.c b/src/desktop.c
index 2649193..211c7e2 100644
--- a/src/desktop.c
+++ b/src/desktop.c
@@ -125,6 +125,16 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata)
else
return;
+ /* resize the active surface to the original size */
+ if (surface->role == IVI_SURFACE_ROLE_SPLIT_H ||
+ surface->role == IVI_SURFACE_ROLE_SPLIT_V) {
+ if (output && output->active) {
+ ivi_layout_desktop_resize(output->active, output->area_saved);
+ }
+ /* restore the area back so we can re-use it again if needed */
+ output->area = output->area_saved;
+ }
+
/* reset the active surface as well */
if (output && output->active && output->active == surface) {
output->active->view->is_mapped = false;
diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h
index 7cd1253..f8f2780 100644
--- a/src/ivi-compositor.h
+++ b/src/ivi-compositor.h
@@ -130,6 +130,7 @@ struct ivi_output {
* In output-coorrdinate space.
*/
struct weston_geometry area;
+ struct weston_geometry area_saved;
struct ivi_surface *active;
struct ivi_surface *previous_active;
@@ -329,4 +330,8 @@ ivi_layout_split_committed(struct ivi_surface *surface);
void
ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id);
+void
+ivi_layout_desktop_resize(struct ivi_surface *surface,
+ struct weston_geometry area);
+
#endif
diff --git a/src/layout.c b/src/layout.c
index 02bedc9..a09010c 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -322,6 +322,26 @@ ivi_layout_fs_committed(struct ivi_surface *surface)
}
void
+ivi_layout_desktop_resize(struct ivi_surface *surface,
+ struct weston_geometry area)
+{
+ struct weston_desktop_surface *dsurf = surface->dsurface;
+ struct weston_view *view = surface->view;
+
+ int x = area.x;
+ int y = area.y;
+ int width = area.width;
+ int height = area.height;
+
+ weston_desktop_surface_set_size(dsurf,
+ width, height);
+
+ weston_view_set_position(view, x, y);
+ weston_view_update_transform(view);
+ weston_view_damage_below(view);
+}
+
+void
ivi_layout_split_committed(struct ivi_surface *surface)
{
struct ivi_compositor *ivi = surface->ivi;
@@ -335,8 +355,9 @@ ivi_layout_split_committed(struct ivi_surface *surface)
struct weston_view *view = surface->view;
struct weston_geometry geom;
- int x;
- int y;
+
+ int x, y;
+ int width, height;
x = woutput->x;
y = woutput->y;
@@ -345,27 +366,56 @@ ivi_layout_split_committed(struct ivi_surface *surface)
return;
geom = weston_desktop_surface_get_geometry(dsurface);
- weston_log("(split) geom x %d, y %d, width %d, height %d\n", geom.x, geom.y,
- geom.width, geom.height);
assert(surface->role == IVI_SURFACE_ROLE_SPLIT_H ||
surface->role == IVI_SURFACE_ROLE_SPLIT_V);
- weston_view_set_output(view, woutput);
+ /* save the previous area in order to recover it back when if this kind
+ * of surface is being destroyed/removed */
+ output->area_saved = output->area;
switch (surface->role) {
case IVI_SURFACE_ROLE_SPLIT_V:
+ if (geom.width == woutput->width &&
+ geom.height == woutput->height)
+ geom.width = (output->area.width / 2);
+
x += woutput->width - geom.width;
output->area.width -= geom.width;
+
+ width = woutput->width - x;
+ height = output->area.height;
+ y = output->area.y;
+
break;
case IVI_SURFACE_ROLE_SPLIT_H:
+ if (geom.width == woutput->width &&
+ geom.height == woutput->height)
+ geom.height = (output->area.height / 2);
+
+ y = output->area.y;
output->area.y += geom.height;
output->area.height -= geom.height;
+
+ width = output->area.width;
+ height = output->area.height;
+
+ x = output->area.x;
+
break;
default:
- abort();
+ assert(!"Invalid split orientation\n");
}
+ weston_desktop_surface_set_size(dsurface,
+ width, height);
+
+ /* resize the active surface first, output->area already contains
+ * correct area to resize to */
+ if (output->active)
+ ivi_layout_desktop_resize(output->active, output->area);
+
+ weston_view_set_output(view, woutput);
weston_view_set_position(view, x, y);
weston_layer_entry_insert(&ivi->normal.view_list, &view->layer_link);