- wl_list_for_each(surface, &ivi->surfaces, link) {
- struct weston_desktop_surface *dsurface = surface->dsurface;
- struct weston_surface *wsurface =
- weston_desktop_surface_get_surface(dsurface);
- struct weston_geometry geom;
- struct weston_view *view;
-
- /*
- * TODO: Hoist view into ivi_struct. It doesn't need ot be part
- * of the tagged union.
- */
- switch (surface->role) {
- case IVI_SURFACE_ROLE_DESKTOP:
- view = surface->desktop.view;
- break;
- case IVI_SURFACE_ROLE_BACKGROUND:
- view = surface->bg.view;
- break;
- case IVI_SURFACE_ROLE_PANEL:
- view = surface->panel.view;
- break;
- default:
- continue;
+ struct pending_remote *remote = zalloc(sizeof(*remote));
+
+ remote->app_id = zalloc(sizeof(char) * (len_app_id + 1));
+ memcpy(remote->app_id, app_id, len_app_id);
+
+ remote->ioutput = ioutput;
+
+ wl_list_insert(&ivi->remote_pending_apps, &remote->link);
+}
+
+
+static void
+ivi_remove_pending_desktop_surface_split(struct pending_split *split)
+{
+ free(split->app_id);
+ wl_list_remove(&split->link);
+ free(split);
+}
+
+static void
+ivi_remove_pending_desktop_surface_fullscreen(struct pending_fullscreen *fs)
+{
+ free(fs->app_id);
+ wl_list_remove(&fs->link);
+ free(fs);
+}
+
+static void
+ivi_remove_pending_desktop_surface_popup(struct pending_popup *p_popup)
+{
+ free(p_popup->app_id);
+ wl_list_remove(&p_popup->link);
+ free(p_popup);
+}
+
+static void
+ivi_remove_pending_desktop_surface_remote(struct pending_remote *remote)
+{
+ free(remote->app_id);
+ wl_list_remove(&remote->link);
+ free(remote);
+}
+
+static bool
+ivi_check_pending_desktop_surface_popup(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+ struct pending_popup *p_popup, *next_p_popup;
+ const char *_app_id =
+ weston_desktop_surface_get_app_id(surface->dsurface);
+
+ if (wl_list_empty(&ivi->popup_pending_apps) || !_app_id)
+ return false;
+
+ wl_list_for_each_safe(p_popup, next_p_popup,
+ &ivi->popup_pending_apps, link) {
+ if (!strcmp(_app_id, p_popup->app_id)) {
+ surface->popup.output = p_popup->ioutput;
+ surface->popup.x = p_popup->x;
+ surface->popup.y = p_popup->y;
+
+ surface->popup.bb.x = p_popup->bb.x;
+ surface->popup.bb.y = p_popup->bb.y;
+ surface->popup.bb.width = p_popup->bb.width;
+ surface->popup.bb.height = p_popup->bb.height;
+
+ ivi_remove_pending_desktop_surface_popup(p_popup);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool
+ivi_check_pending_desktop_surface_split(struct ivi_surface *surface)
+{
+ struct pending_split *split_surf, *next_split_surf;
+ struct ivi_compositor *ivi = surface->ivi;
+ const char *_app_id =
+ weston_desktop_surface_get_app_id(surface->dsurface);
+
+ if (wl_list_empty(&ivi->split_pending_apps) || !_app_id)
+ return false;
+
+ wl_list_for_each_safe(split_surf, next_split_surf,
+ &ivi->split_pending_apps, link) {
+ if (!strcmp(_app_id, split_surf->app_id)) {
+ surface->split.output = split_surf->ioutput;
+ surface->split.orientation = split_surf->orientation;
+ ivi_remove_pending_desktop_surface_split(split_surf);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool
+ivi_check_pending_desktop_surface_fullscreen(struct ivi_surface *surface)
+{
+ struct pending_fullscreen *fs_surf, *next_fs_surf;
+ struct ivi_compositor *ivi = surface->ivi;
+ const char *_app_id =
+ weston_desktop_surface_get_app_id(surface->dsurface);
+
+ if (wl_list_empty(&ivi->fullscreen_pending_apps) || !_app_id)
+ return false;
+
+ wl_list_for_each_safe(fs_surf, next_fs_surf,
+ &ivi->fullscreen_pending_apps, link) {
+ if (!strcmp(_app_id, fs_surf->app_id)) {
+ surface->fullscreen.output = fs_surf->ioutput;
+ ivi_remove_pending_desktop_surface_fullscreen(fs_surf);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static bool
+ivi_check_pending_desktop_surface_remote(struct ivi_surface *surface)
+{
+ struct pending_remote *remote_surf, *next_remote_surf;
+ struct ivi_compositor *ivi = surface->ivi;
+ const char *_app_id =
+ weston_desktop_surface_get_app_id(surface->dsurface);
+
+ if (wl_list_empty(&ivi->remote_pending_apps) || !_app_id)
+ return false;
+
+ wl_list_for_each_safe(remote_surf, next_remote_surf,
+ &ivi->remote_pending_apps, link) {
+ if (!strcmp(_app_id, remote_surf->app_id)) {
+ surface->remote.output = remote_surf->ioutput;
+ ivi_remove_pending_desktop_surface_remote(remote_surf);
+ return true;