X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Flayout.c;h=a06b1e5cec482081a2bc71edea2999343cf46a21;hb=754636273ffc6b872d6fb194009c857e76e7cec1;hp=082c36ed7175a48bfb350d2c3ec506d2fd3d3ce7;hpb=ffdbb335ee72a5b5cba198800c5537b89d7755a0;p=src%2Fagl-compositor.git diff --git a/src/layout.c b/src/layout.c index 082c36e..a06b1e5 100644 --- a/src/layout.c +++ b/src/layout.c @@ -48,6 +48,7 @@ static const char *ivi_roles_as_string[] = { [IVI_SURFACE_ROLE_SPLIT_V] = "SPLIT_V", [IVI_SURFACE_ROLE_FULLSCREEN] = "FULLSCREEN", [IVI_SURFACE_ROLE_REMOTE] = "REMOTE", + [IVI_SURFACE_ROLE_TILE] = "SPLIT", }; bool @@ -284,6 +285,14 @@ ivi_layout_activate_complete(struct ivi_output *output, woutput->x + output->area.x, woutput->y + output->area.y); + /* reset any previous orientation */ + if (surf->orientation != AGL_SHELL_TILE_ORIENTATION_NONE && + !surf->sticky) { + weston_log("%s() resetting itself to none orientation\n", __func__); + surf->orientation = AGL_SHELL_TILE_ORIENTATION_NONE; + weston_desktop_surface_set_orientation(surf->dsurface, + surf->orientation); + } view->is_mapped = true; surf->mapped = true; view->surface->is_mapped = true; @@ -309,7 +318,9 @@ ivi_layout_activate_complete(struct ivi_output *output, if (output->active) { /* keep the background surface mapped at all times */ - if (output->active->role != IVI_SURFACE_ROLE_BACKGROUND) { + if (output->active->role != IVI_SURFACE_ROLE_BACKGROUND && + !output->active->sticky) { + output->active->view->is_mapped = false; output->active->view->surface->is_mapped = false; @@ -325,7 +336,7 @@ ivi_layout_activate_complete(struct ivi_output *output, * we're trying to complete activation with means we're * operating on the same app_id so do update previous_active as * it will overwrite it with the same value */ - if (!strcmp(c_app_id, app_id)) { + if (app_id && !strcmp(c_app_id, app_id)) { update_previous = false; } } @@ -581,9 +592,12 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) return; } - if (!surf->ivi->activate_by_default) { - weston_log("Refusing to activate surface role %d, app_id %s\n", - surf->role, app_id); + if (!surf->ivi->activate_by_default && + (!surf->xwayland.is_set && !is_shell_surface_xwayland(surf))) { + weston_log("Refusing to activate surface role %d, app_id %s, type %s\n", + surf->role, app_id, + is_shell_surface_xwayland(surf) ? + "xwayland" : "regular"); if (!weston_desktop_surface_get_maximized(dsurf) || geom.width != r_output->area.width || @@ -611,7 +625,12 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) */ weston_log("Surface no app_id, role %s activating by default\n", ivi_layout_get_surface_role_name(surf)); - ivi_layout_activate_by_surf(r_output, surf); + if (surf->xwayland.is_set || is_shell_surface_xwayland(surf)) { + ivi_layout_activate_by_surf(r_output, surf); + ivi_layout_activate_complete(r_output, surf); + } else { + ivi_layout_activate_by_surf(r_output, surf); + } } } @@ -722,6 +741,7 @@ ivi_layout_fullscreen_committed(struct ivi_surface *surface) ivi_layout_get_surface_role_name(surface), output->name); + weston_compositor_schedule_repaint(ivi->compositor); } } @@ -966,6 +986,32 @@ ivi_layout_popup_re_add(struct ivi_surface *surface) ivi_layout_popup_committed(surface); } +static void +ivi_layout_fullscreen_re_add(struct ivi_surface *surface) +{ + assert(surface->role == IVI_SURFACE_ROLE_FULLSCREEN); + struct weston_view *view = surface->view; + + if (weston_view_is_mapped(view)) { + struct weston_desktop_surface *dsurface = surface->dsurface; + struct weston_surface *wsurface = + weston_desktop_surface_get_surface(dsurface); + + weston_layer_entry_remove(&view->layer_link); + + wsurface->is_mapped = false; + view->is_mapped = false; + } + + /* reset the activate by default in order to (still) allow the surface + * to be activaved using the request */ + if (!surface->mapped) + surface->mapped = true; + + surface->state = NORMAL; + ivi_layout_fullscreen_committed(surface); +} + static bool ivi_layout_surface_is_split_or_fullscreen(struct ivi_surface *surf) { @@ -989,6 +1035,59 @@ ivi_layout_surface_is_split_or_fullscreen(struct ivi_surface *surf) return false; } +void +ivi_layout_reset_split_surfaces(struct ivi_compositor *ivi) +{ + struct ivi_surface *ivisurf; + struct ivi_surface *found_ivi_surf = NULL; + bool found_split_surface = false; + struct ivi_output *output = NULL; + + wl_list_for_each(ivisurf, &ivi->surfaces, link) { + if (ivisurf->orientation != AGL_SHELL_TILE_ORIENTATION_NONE) { + found_ivi_surf = ivisurf; + found_split_surface = true; + break; + } + } + + if (!found_split_surface) + return; + + output = found_ivi_surf->current_completed_output; + + if (found_ivi_surf->sticky) + return; + + if (output->previous_active && output->background != output->previous_active) { + struct weston_view *ev = output->previous_active->view; + struct weston_output *woutput = output->output; + + if (!weston_view_is_mapped(ev)) + weston_view_update_transform(ev); + else + weston_layer_entry_remove(&ev->layer_link); + + ev->is_mapped = true; + ev->surface->is_mapped = true; + output->previous_active->mapped = true; + + weston_view_set_output(ev, woutput); + + weston_layer_entry_insert(&ivi->normal.view_list, &ev->layer_link); + + _ivi_set_shell_surface_split(output->previous_active, NULL, 0, + AGL_SHELL_TILE_ORIENTATION_NONE, false, false); + + if (output->active == ivisurf) { + output->active = output->previous_active; + } + } + + _ivi_set_shell_surface_split(ivisurf, NULL, 0, + AGL_SHELL_TILE_ORIENTATION_NONE, false, false); +} + void ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf) { @@ -1019,14 +1118,40 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf) return; } + if (surf->role == IVI_SURFACE_ROLE_FULLSCREEN) { + ivi_layout_fullscreen_re_add(surf); + return; + } +#if 0 + /* reset tile to desktop to allow to resize correctly */ + if (surf->role == IVI_SURFACE_ROLE_TILE && output->active == surf) { + weston_log("%s() resetting tile role!\n", __func__); + surf->role = IVI_SURFACE_ROLE_DESKTOP; + } +#endif + /* do not 're'-activate surfaces that are split or active */ - if (surf == output->active || - ivi_layout_surface_is_split_or_fullscreen(surf)) { + if (surf == output->active) { weston_log("Application %s is already active on output %s\n", app_id, output->output->name); return; } + if (surf->sticky && surf->role == IVI_SURFACE_ROLE_TILE && output->active == surf) { + weston_log("Application %s is already active on output %s (split role)\n", + app_id, output->output->name); + return; + } + + if (ivi_layout_surface_is_split_or_fullscreen(surf)) { + weston_log("Application %s is fullscreen or split on output %s\n", + app_id, output->output->name); + return; + } + + // destroy any split types to allow correct re-activation + ivi_layout_reset_split_surfaces(surf->ivi); + if (surf->role == IVI_SURFACE_ROLE_REMOTE) { struct ivi_output *remote_output = ivi_layout_find_with_app_id(app_id, ivi); @@ -1054,7 +1179,8 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf) /* the background surface is already "maximized" so we don't need to * add to the hidden layer */ - if (surf->role == IVI_SURFACE_ROLE_BACKGROUND) { + if (surf->role == IVI_SURFACE_ROLE_BACKGROUND && + output->active->role != IVI_SURFACE_ROLE_TILE) { ivi_layout_activate_complete(output, surf); return; } @@ -1109,8 +1235,13 @@ ivi_layout_get_output_from_surface(struct ivi_surface *surf) case IVI_SURFACE_ROLE_REMOTE: ivi_output = surf->remote.output; break; + case IVI_SURFACE_ROLE_TILE: + ivi_output = surf->current_completed_output; + break; case IVI_SURFACE_ROLE_NONE: default: + if (surf->view->output) + return to_ivi_output(surf->view->output); break; } @@ -1169,7 +1300,8 @@ ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id) weston_desktop_surface_get_app_id(dsurface); ivi_layout_activate(ivi_output, previous_active_app_id); } - } else if (surf->role == IVI_SURFACE_ROLE_POPUP) { + } else if (surf->role == IVI_SURFACE_ROLE_POPUP || + surf->role == IVI_SURFACE_ROLE_FULLSCREEN) { struct weston_view *view = surf->view; weston_view_unmap(view); @@ -1180,5 +1312,5 @@ ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id) weston_surface_damage(view->surface); } - shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_DEACTIVATED); + shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_DEACTIVATED); }