X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Flayout.c;h=a06b1e5cec482081a2bc71edea2999343cf46a21;hb=refs%2Fchanges%2F80%2F29680%2F2;hp=b3a73297f9961de1de52066cd10ac16d40b13945;hpb=09fa5536e759792c80341305a536cd59aa801c6d;p=src%2Fagl-compositor.git diff --git a/src/layout.c b/src/layout.c index b3a7329..a06b1e5 100644 --- a/src/layout.c +++ b/src/layout.c @@ -286,7 +286,8 @@ ivi_layout_activate_complete(struct ivi_output *output, woutput->y + output->area.y); /* reset any previous orientation */ - if (surf->orientation != AGL_SHELL_TILE_ORIENTATION_NONE) { + 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, @@ -317,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; @@ -1036,16 +1039,53 @@ 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) { - struct weston_desktop_surface *dsurf = ivisurf->dsurface; - if (ivisurf->orientation != AGL_SHELL_TILE_ORIENTATION_NONE) { - weston_log("%s() resetting apps to none orientation\n", __func__); - ivisurf->orientation = AGL_SHELL_TILE_ORIENTATION_NONE; - weston_desktop_surface_set_orientation(dsurf, ivisurf->orientation); + 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 @@ -1091,14 +1131,24 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf) #endif /* do not 're'-activate surfaces that are split or active */ - if (surf == output->active || - ivi_layout_surface_is_split_or_fullscreen(surf) || - surf->role != IVI_SURFACE_ROLE_DESKTOP) { + 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); @@ -1129,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; }