aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2020-04-29 17:41:58 +0300
committerMarius Vlad <marius.vlad@collabora.com>2020-05-18 13:01:48 +0300
commit2349f210e12b783f6a314b9331035ecd066707c7 (patch)
tree29548b4a2b9357754d18b8323f00dbf22459a538
parent9bd3961d1b80271b436b2fe487bbc3de25286a7d (diff)
layout: Allow to commit the fullscreen and split surface roles
Now that we have the ability to discern between fullscreend and split roles, use specific functions when doing the commit to further customize them. Bug-AGL: SPEC-3334 Signed-off-by: Marius Vlad <marius.vlad@collabora.com> Change-Id: Idf4ed55533c46925638a466e9713465d710b6845
-rw-r--r--src/desktop.c12
-rw-r--r--src/ivi-compositor.h6
-rw-r--r--src/layout.c92
-rw-r--r--src/shell.c10
4 files changed, 119 insertions, 1 deletions
diff --git a/src/desktop.c b/src/desktop.c
index 3624a8c..2649193 100644
--- a/src/desktop.c
+++ b/src/desktop.c
@@ -117,6 +117,11 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata)
output = surface->desktop.last_output;
else if (surface->role == IVI_SURFACE_ROLE_POPUP)
output = surface->popup.output;
+ else if (surface->role == IVI_SURFACE_ROLE_SPLIT_H ||
+ surface->role == IVI_SURFACE_ROLE_SPLIT_V)
+ output = surface->split.output;
+ else if (surface->role == IVI_SURFACE_ROLE_FS)
+ output = surface->fs.output;
else
return;
@@ -161,6 +166,13 @@ desktop_committed(struct weston_desktop_surface *dsurface,
case IVI_SURFACE_ROLE_POPUP:
ivi_layout_popup_committed(surface);
break;
+ case IVI_SURFACE_ROLE_FS:
+ ivi_layout_fs_committed(surface);
+ break;
+ case IVI_SURFACE_ROLE_SPLIT_H:
+ case IVI_SURFACE_ROLE_SPLIT_V:
+ ivi_layout_split_committed(surface);
+ break;
case IVI_SURFACE_ROLE_NONE:
case IVI_SURFACE_ROLE_BACKGROUND:
default: /* fall through */
diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h
index c0e41e6..7cd1253 100644
--- a/src/ivi-compositor.h
+++ b/src/ivi-compositor.h
@@ -321,6 +321,12 @@ void
ivi_layout_popup_committed(struct ivi_surface *surface);
void
+ivi_layout_fs_committed(struct ivi_surface *surface);
+
+void
+ivi_layout_split_committed(struct ivi_surface *surface);
+
+void
ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id);
#endif
diff --git a/src/layout.c b/src/layout.c
index 60197b0..02bedc9 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -285,6 +285,98 @@ skip_config_check:
}
void
+ivi_layout_fs_committed(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+
+ struct weston_desktop_surface *dsurface = surface->dsurface;
+ struct weston_surface *wsurface =
+ weston_desktop_surface_get_surface(dsurface);
+
+ struct ivi_output *output = surface->split.output;
+ struct weston_output *woutput = output->output;
+
+ struct weston_view *view = surface->view;
+ struct weston_geometry geom;
+
+ if (surface->view->is_mapped)
+ return;
+
+ geom = weston_desktop_surface_get_geometry(dsurface);
+ weston_log("(fs) geom x %d, y %d, width %d, height %d\n", geom.x, geom.y,
+ geom.width, geom.height);
+
+ assert(surface->role == IVI_SURFACE_ROLE_FS);
+
+ weston_desktop_surface_set_fullscreen(dsurface, true);
+
+ weston_view_set_output(view, woutput);
+ weston_view_set_position(view, woutput->x, woutput->y);
+ weston_layer_entry_insert(&ivi->fullscreen.view_list, &view->layer_link);
+
+ weston_view_update_transform(view);
+ weston_view_damage_below(view);
+
+ wsurface->is_mapped = true;
+ surface->view->is_mapped = true;
+}
+
+void
+ivi_layout_split_committed(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+
+ struct weston_desktop_surface *dsurface = surface->dsurface;
+ struct weston_surface *wsurface =
+ weston_desktop_surface_get_surface(dsurface);
+
+ struct ivi_output *output = surface->split.output;
+ struct weston_output *woutput = output->output;
+
+ struct weston_view *view = surface->view;
+ struct weston_geometry geom;
+ int x;
+ int y;
+
+ x = woutput->x;
+ y = woutput->y;
+
+ if (surface->view->is_mapped)
+ 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);
+
+ switch (surface->role) {
+ case IVI_SURFACE_ROLE_SPLIT_V:
+ x += woutput->width - geom.width;
+ output->area.width -= geom.width;
+ break;
+ case IVI_SURFACE_ROLE_SPLIT_H:
+ output->area.y += geom.height;
+ output->area.height -= geom.height;
+ break;
+ default:
+ abort();
+ }
+
+ weston_view_set_position(view, x, y);
+ weston_layer_entry_insert(&ivi->normal.view_list, &view->layer_link);
+
+ weston_view_update_transform(view);
+ weston_view_damage_below(view);
+
+ wsurface->is_mapped = true;
+ surface->view->is_mapped = true;
+}
+
+void
ivi_layout_popup_committed(struct ivi_surface *surface)
{
struct ivi_compositor *ivi = surface->ivi;
diff --git a/src/shell.c b/src/shell.c
index f184c63..cb70691 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -140,14 +140,22 @@ ivi_set_pending_desktop_surface_split(struct ivi_output *ioutput,
const char *app_id, uint32_t orientation)
{
struct ivi_compositor *ivi = ioutput->ivi;
+ struct ivi_surface *surf;
size_t len_app_id = strlen(app_id);
+ struct pending_split *split;
if (orientation != AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_VERTICAL &&
orientation != AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_HORIZONTAL)
return;
- struct pending_split *split = zalloc(sizeof(*split));
+ /* more than one is un-supported, do note we need to do
+ * conversion for surface roles instead of using the protocol ones */
+ wl_list_for_each(surf, &ivi->surfaces, link)
+ if (surf->role == IVI_SURFACE_ROLE_SPLIT_V ||
+ surf->role == IVI_SURFACE_ROLE_SPLIT_H)
+ return;
+ split = zalloc(sizeof(*split));
split->app_id = zalloc(sizeof(char) * (len_app_id + 1));
memcpy(split->app_id, app_id, len_app_id);