From 831d1b21b5e786d2e5e804ca5a6a2a2b1dfacd1e Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Wed, 29 Apr 2020 17:41:58 +0300 Subject: [PATCH] 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 Change-Id: Idf4ed55533c46925638a466e9713465d710b6845 --- src/desktop.c | 12 +++++++ src/ivi-compositor.h | 6 ++++ src/layout.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/shell.c | 10 +++++- 4 files changed, 119 insertions(+), 1 deletion(-) 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 @@ -320,6 +320,12 @@ ivi_layout_panel_committed(struct ivi_surface *surface); 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); diff --git a/src/layout.c b/src/layout.c index 60197b0..f5beb9f 100644 --- a/src/layout.c +++ b/src/layout.c @@ -284,6 +284,98 @@ skip_config_check: ivi_layout_activate_complete(output, surf); } +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) { 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); -- 2.16.6