layout, desktop: Implement the pop-up role
[src/agl-compositor.git] / src / layout.c
index b5bafe3..ff30def 100644 (file)
  */
 
 #include "ivi-compositor.h"
+#include "policy.h"
 
 #include <assert.h>
 #include <string.h>
 
-#include <libweston-6/compositor.h>
-#include <libweston-6/libweston-desktop.h>
+#include <libweston/libweston.h>
+#include <libweston-desktop/libweston-desktop.h>
 
 #define AGL_COMP_DEBUG
 
@@ -242,12 +243,20 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
        output = surf->desktop.pending_output;
        if (!output) {
                struct ivi_output *ivi_bg_output;
+               struct ivi_policy *policy = surf->ivi->policy;
+
+               if (policy && policy->api.surface_activate_by_default)
+                       if (policy->api.surface_activate_by_default(surf, surf->ivi))
+                               goto skip_config_check;
 
-               /* FIXME: This should be changed to determine if the policy
-                * database allows that to happen */
                if (!surf->ivi->quirks.activate_apps_by_default)
                        return;
 
+skip_config_check:
+               /* we can only activate it again by using the protocol */
+               if (surf->activated_by_default)
+                       return;
+
                ivi_bg_output = ivi_layout_find_bg_output(surf->ivi);
 
                /* use the output of the bg to activate the app on start-up by
@@ -255,8 +264,10 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
                if (surf->view && ivi_bg_output) {
                        const char *app_id =
                                weston_desktop_surface_get_app_id(dsurf);
-                       if (app_id && ivi_bg_output)
+                       if (app_id && ivi_bg_output) {
                                ivi_layout_activate(ivi_bg_output, app_id);
+                               surf->activated_by_default = true;
+                       }
                }
 
                return;
@@ -270,6 +281,44 @@ ivi_layout_desktop_committed(struct ivi_surface *surf)
        ivi_layout_activate_complete(output, surf);
 }
 
+void
+ivi_layout_popup_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->popup.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("geom x %d, y %d, width %d, height %d\n", geom.x, geom.y,
+                       geom.width, geom.height);
+
+       assert(surface->role == IVI_SURFACE_ROLE_POPUP);
+
+       weston_view_set_output(view, woutput);
+       if (surface->popup.x || surface->popup.y)
+               weston_view_set_position(view, surface->popup.x, surface->popup.y);
+       else
+               weston_view_set_position(view, geom.x, geom.y);
+       weston_layer_entry_insert(&ivi->popup.view_list, &view->layer_link);
+
+       weston_view_update_transform(view);
+       weston_view_schedule_repaint(view);
+
+       wsurface->is_mapped = true;
+       surface->view->is_mapped = true;
+}
+
 void
 ivi_layout_panel_committed(struct ivi_surface *surface)
 {
@@ -345,10 +394,17 @@ ivi_layout_activate(struct ivi_output *output, const char *app_id)
        struct weston_desktop_surface *dsurf;
        struct weston_view *view;
        struct weston_geometry geom;
+       struct ivi_policy *policy = output->ivi->policy;
 
        surf = ivi_find_app(ivi, app_id);
        if (!surf)
                return;
+
+       if (policy && policy->api.surface_activate &&
+           !policy->api.surface_activate(surf, surf->ivi)) {
+               return;
+       }
+
 #ifdef AGL_COMP_DEBUG
        weston_log("Found app_id %s\n", app_id);
 #endif