diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2020-04-29 17:41:58 +0300 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2020-06-08 17:26:36 +0300 |
commit | 831d1b21b5e786d2e5e804ca5a6a2a2b1dfacd1e (patch) | |
tree | 8d1892a1fd7bf073b12516ed0f9b332b12762739 | |
parent | a2d066f067e01ce8ff56abdcd98d22fd1af51e85 (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 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); |