+
+static void
+ivi_layout_add_to_hidden_layer(struct ivi_surface *surf,
+ struct ivi_output *ivi_output)
+{
+ struct weston_desktop_surface *dsurf = surf->dsurface;
+ struct weston_view *ev = surf->view;
+ struct ivi_compositor *ivi = surf->ivi;
+ const char *app_id = weston_desktop_surface_get_app_id(dsurf);
+
+ /*
+ * If the view isn't mapped, we put it onto the hidden layer so it will
+ * start receiving frame events, and will be able to act on our
+ * configure event.
+ */
+ if (!weston_view_is_mapped(ev)) {
+ ev->is_mapped = true;
+ ev->surface->is_mapped = true;
+
+ weston_desktop_surface_set_maximized(dsurf, true);
+ weston_desktop_surface_set_size(dsurf,
+ ivi_output->area.width,
+ ivi_output->area.height);
+
+ weston_log("Setting app_id %s, role %s, set to maximized (%dx%d)\n",
+ app_id, ivi_layout_get_surface_role_name(surf),
+ ivi_output->area.width, ivi_output->area.height);
+
+ surf->hidden_layer_output = ivi_output;
+ weston_view_set_output(ev, ivi_output->output);
+ weston_layer_entry_insert(&ivi->hidden.view_list, &ev->layer_link);
+ weston_log("Placed app_id %s, type %s in hidden layer on output %s\n",
+ app_id, ivi_layout_get_surface_role_name(surf),
+ ivi_output->output->name);
+
+ weston_compositor_schedule_repaint(ivi->compositor);
+ return;
+ }
+
+ /* we might have another output to activate */
+ if (surf->hidden_layer_output &&
+ surf->hidden_layer_output != ivi_output) {
+ weston_layer_entry_remove(&ev->layer_link);
+ weston_view_geometry_dirty(ev);
+ weston_surface_damage(ev->surface);
+
+ if (ivi_output->area.width != surf->hidden_layer_output->area.width ||
+ ivi_output->area.height != surf->hidden_layer_output->area.height) {
+ weston_desktop_surface_set_maximized(dsurf, true);
+ weston_desktop_surface_set_size(dsurf,
+ ivi_output->area.width,
+ ivi_output->area.height);
+ }
+
+ weston_log("Setting app_id %s, role %s, set to maximized (%dx%d)\n",
+ app_id, ivi_layout_get_surface_role_name(surf),
+ ivi_output->area.width, ivi_output->area.height);
+
+ surf->hidden_layer_output = ivi_output;
+ weston_view_set_output(ev, ivi_output->output);
+ weston_layer_entry_insert(&ivi->hidden.view_list, &ev->layer_link);
+ weston_log("Placed app_id %s, type %s in hidden layer on output %s\n",
+ app_id, ivi_layout_get_surface_role_name(surf),
+ ivi_output->output->name);
+ }
+
+ weston_compositor_schedule_repaint(ivi->compositor);
+}
+
+void
+ivi_layout_remote_committed(struct ivi_surface *surf)
+{
+ struct weston_desktop_surface *dsurf = surf->dsurface;
+ struct weston_geometry geom = weston_desktop_surface_get_geometry(dsurf);
+ struct ivi_policy *policy = surf->ivi->policy;
+ struct ivi_output *output;
+ const char *app_id = weston_desktop_surface_get_app_id(dsurf);
+
+ assert(surf->role == IVI_SURFACE_ROLE_REMOTE);
+
+ output = surf->remote.output;
+
+ if (policy && policy->api.surface_activate_by_default &&
+ !policy->api.surface_activate_by_default(surf, surf->ivi))
+ return;
+
+ /* we can only activate it again by using the protocol, but
+ * additionally the output is not reset when
+ * ivi_layout_activate_complete() terminates so we use the
+ * current active surface to avoid hitting this again and again
+ * */
+ if (surf->mapped && output->active == surf)
+ return;
+
+ if (!surf->ivi->activate_by_default &&
+ !ivi_surf_in_hidden_layer(surf->ivi, surf)) {
+ weston_log("Refusing to activate surface role %d, "
+ "app_id %s\n", surf->role, app_id);
+
+ if (!weston_desktop_surface_get_maximized(dsurf) ||
+ geom.width != output->area.width ||
+ geom.height != output->area.height) {
+ ivi_layout_add_to_hidden_layer(surf, output);
+ }
+
+ return;
+ }
+
+ if (!weston_desktop_surface_get_maximized(dsurf) ||
+ geom.width != output->area.width ||
+ geom.height != output->area.height)
+ return;
+
+ ivi_layout_activate_complete(output, surf);
+}
+