*/
#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>
+
+#include "agl-shell-desktop-server-protocol.h"
#define AGL_COMP_DEBUG
output->area.x, output->area.y);
}
-static struct ivi_surface *
+struct ivi_surface *
ivi_find_app(struct ivi_compositor *ivi, const char *app_id)
{
struct ivi_surface *surf;
weston_layer_entry_remove(&output->active->view->layer_link);
}
+ output->previous_active = output->active;
output->active = surf;
weston_layer_entry_insert(&ivi->normal.view_list, &view->layer_link);
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
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;
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_damage_below(view);
+
+ wsurface->is_mapped = true;
+ surface->view->is_mapped = true;
+}
+
+static void
+ivi_layout_popup_re_add(struct ivi_surface *surface)
+{
+ assert(surface->role == IVI_SURFACE_ROLE_POPUP);
+ struct weston_view *view = surface->view;
+ struct ivi_compositor *ivi = surface->ivi;
+
+ 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;
+ }
+
+ ivi_layout_popup_committed(surface);
+}
+
void
ivi_layout_panel_committed(struct ivi_surface *surface)
{
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
+
+ if (surf->role == IVI_SURFACE_ROLE_POPUP) {
+ ivi_layout_popup_re_add(surf);
+ return;
+ }
+
if (surf == output->active)
return;
view = surf->view;
geom = weston_desktop_surface_get_geometry(dsurf);
+ surf->desktop.pending_output = output;
if (weston_desktop_surface_get_maximized(dsurf) &&
geom.width == output->area.width &&
geom.height == output->area.height) {
/* force repaint of the entire output */
weston_output_damage(output->output);
}
+}
- surf->desktop.pending_output = output;
+static struct ivi_output *
+ivi_layout_get_output_from_surface(struct ivi_surface *surf)
+{
+ struct ivi_output *ivi_output = NULL;
+
+ switch (surf->role) {
+ case IVI_SURFACE_ROLE_DESKTOP:
+ if (surf->desktop.pending_output)
+ ivi_output = surf->desktop.pending_output;
+ else
+ ivi_output = surf->desktop.last_output;
+ break;
+ case IVI_SURFACE_ROLE_POPUP:
+ ivi_output = surf->popup.output;
+ break;
+ default:
+ case IVI_SURFACE_ROLE_BACKGROUND:
+ case IVI_SURFACE_ROLE_PANEL:
+ case IVI_SURFACE_ROLE_NONE:
+ break;
+ }
+
+ return ivi_output;
+}
+
+void
+ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id)
+{
+ struct ivi_surface *surf;
+ struct ivi_output *ivi_output;
+ struct ivi_policy *policy = ivi->policy;
+
+ surf = ivi_find_app(ivi, app_id);
+ if (!surf)
+ return;
+
+ if (policy && policy->api.surface_deactivate &&
+ !policy->api.surface_deactivate(surf, surf->ivi)) {
+ return;
+ }
+
+ ivi_output = ivi_layout_get_output_from_surface(surf);
+ weston_log("deactiving %s\n", app_id);
+
+ if (surf->role == IVI_SURFACE_ROLE_DESKTOP) {
+ struct ivi_surface *previous_active;
+
+ previous_active = ivi_output->previous_active;
+ if (!previous_active) {
+ /* we don't have a previous active it means we should
+ * display the bg */
+ if (ivi_output->active) {
+ struct weston_view *view;
+
+ view = ivi_output->active->view;
+ view->is_mapped = false;
+ view->surface->is_mapped = false;
+
+ weston_layer_entry_remove(&view->layer_link);
+ weston_output_damage(ivi_output->output);
+ }
+ } else {
+ struct weston_desktop_surface *dsurface;
+ const char *previous_active_app_id;
+
+ dsurface = previous_active->dsurface;
+ previous_active_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) {
+ struct weston_view *view = surf->view;
+
+ weston_layer_entry_remove(&view->layer_link);
+ weston_view_damage_below(view);
+ }
}