+ivi_layout_popup_committed(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+ struct ivi_policy *policy = ivi->policy;
+
+ struct weston_desktop_surface *dsurface = surface->dsurface;
+ struct weston_surface *wsurface =
+ weston_desktop_surface_get_surface(dsurface);
+ const char *app_id = weston_desktop_surface_get_app_id(dsurface);
+
+ struct ivi_output *output = surface->popup.output;
+ struct weston_output *woutput = output->output;
+
+ struct weston_view *view = surface->view;
+
+ if (policy && policy->api.surface_activate_by_default &&
+ !policy->api.surface_activate_by_default(surface, surface->ivi) &&
+ !surface->activated_by_default)
+ return;
+
+ if (surface->view->is_mapped)
+ return;
+
+ assert(surface->role == IVI_SURFACE_ROLE_POPUP);
+
+ weston_view_set_output(view, woutput);
+ weston_view_set_position(view, surface->popup.x, surface->popup.y);
+
+ /* only clip the pop-up dialog window if we have a valid
+ * width and height being passed on. Users might not want to have one
+ * set-up so only enfore it is really passed on. */
+ if (surface->popup.bb.width > 0 && surface->popup.bb.height > 0)
+ weston_view_set_mask(view, surface->popup.bb.x, surface->popup.bb.y,
+ surface->popup.bb.width, surface->popup.bb.height);
+
+ 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;
+
+ shell_advertise_app_state(ivi, app_id,
+ NULL, AGL_SHELL_DESKTOP_APP_STATE_ACTIVATED);
+
+ weston_log("Activation completed for app_id %s, role %s, output %s\n",
+ app_id, ivi_layout_get_surface_role_name(surface), output->name);
+}
+
+static void
+ivi_layout_popup_re_add(struct ivi_surface *surface)
+{
+ assert(surface->role == IVI_SURFACE_ROLE_POPUP);
+ 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->activated_by_default)
+ surface->activated_by_default = true;
+
+ ivi_layout_popup_committed(surface);
+}
+
+static bool
+ivi_layout_surface_is_split_or_fullscreen(struct ivi_surface *surf)
+{
+ struct ivi_compositor *ivi = surf->ivi;
+ struct ivi_surface *is;
+
+ if (surf->role != IVI_SURFACE_ROLE_SPLIT_H &&
+ surf->role != IVI_SURFACE_ROLE_SPLIT_V &&
+ surf->role != IVI_SURFACE_ROLE_FULLSCREEN)
+ return false;
+
+ /* reset the activate by default in order to (still) allow the surface
+ * to be activaved using the request */
+ if (!surf->activated_by_default)
+ surf->activated_by_default = true;
+
+ wl_list_for_each(is, &ivi->surfaces, link)
+ if (is == surf)
+ return true;
+
+ return false;
+}
+
+void
+ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf)