diff options
author | 2020-04-29 17:41:58 +0300 | |
---|---|---|
committer | 2020-05-18 13:01:48 +0300 | |
commit | 2349f210e12b783f6a314b9331035ecd066707c7 (patch) | |
tree | 29548b4a2b9357754d18b8323f00dbf22459a538 | |
parent | 9bd3961d1b80271b436b2fe487bbc3de25286a7d (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.c | 12 | ||||
-rw-r--r-- | src/ivi-compositor.h | 6 | ||||
-rw-r--r-- | src/layout.c | 92 | ||||
-rw-r--r-- | src/shell.c | 10 |
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); |