diff options
-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); |