shell/layout: Add implementation for the width param
[src/agl-compositor.git] / src / layout.c
index 4b8a691..7a2c9ac 100644 (file)
@@ -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,13 @@ 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) {
+               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;
@@ -1024,6 +1032,53 @@ 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;
+       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_split_surface = true;
+                       break;
+               }
+       }
+
+       if (!found_split_surface)
+               return;
+
+       output = ivisurf->current_completed_output;
+       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);
+
+               if (output->active == ivisurf) {
+                       output->active = output->previous_active;
+               }
+       }
+
+       _ivi_set_shell_surface_split(ivisurf, NULL, 0,
+                                    AGL_SHELL_TILE_ORIENTATION_NONE, false);
+}
+
 void
 ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)
 {
@@ -1058,15 +1113,30 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)
                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 (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);
@@ -1149,8 +1219,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;
        }