summaryrefslogtreecommitdiffstats
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-06-08 17:26:36 +0300
commit831d1b21b5e786d2e5e804ca5a6a2a2b1dfacd1e (patch)
tree8d1892a1fd7bf073b12516ed0f9b332b12762739
parenta2d066f067e01ce8ff56abdcd98d22fd1af51e85 (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 2ef6fee..d166626 100644
--- a/src/desktop.c
+++ b/src/desktop.c
@@ -118,6 +118,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_FULLSCREEN)
+ output = surface->fullscreen.output;
else
return;
@@ -185,6 +190,13 @@ desktop_committed(struct weston_desktop_surface *dsurface,
case IVI_SURFACE_ROLE_POPUP:
ivi_layout_popup_committed(surface);
break;
+ case IVI_SURFACE_ROLE_FULLSCREEN:
+ ivi_layout_fullscreen_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 3c547aa..c733ff0 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_fullscreen_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..f5beb9f 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -285,6 +285,98 @@ skip_config_check:
}
void
+ivi_layout_fullscreen_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 df8ea84..687094a 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);