layout: Add the ability to deactivate fullscreen surfaces
[src/agl-compositor.git] / src / layout.c
index 8c8b4be..4b8a691 100644 (file)
@@ -170,6 +170,12 @@ ivi_layout_init(struct ivi_compositor *ivi, struct ivi_output *output)
                        if (parse_activation_area(t, output) < 0)
                                weston_log("Invalid activation-area \"%s\" for output %s\n",
                                           t, output->name);
+               } else {
+                       weston_log("WARNING: activation-area detected in ini file, "
+                                       "but agl_shell override detected!\n");
+                       if (parse_activation_area(t, output) < 0)
+                               weston_log("Invalid activation-area \"%s\" for output %s\n",
+                                          t, output->name);
                }
        }
        free(t);
@@ -319,7 +325,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;
                }
        }
@@ -575,9 +581,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 ||
@@ -605,7 +614,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);
+                               }
                        }
                }
 
@@ -716,6 +730,7 @@ ivi_layout_fullscreen_committed(struct ivi_surface *surface)
                           ivi_layout_get_surface_role_name(surface),
                           output->name);
 
+               weston_compositor_schedule_repaint(ivi->compositor);
        }
 }
 
@@ -960,6 +975,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)
 {
@@ -1013,6 +1054,11 @@ 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;
+       }
+
        /* do not 're'-activate surfaces that are split or active */
        if (surf == output->active ||
            ivi_layout_surface_is_split_or_fullscreen(surf)) {
@@ -1163,7 +1209,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);
@@ -1174,5 +1221,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);
 }