wl_list_insert(&ivi->surfaces, &surface->link);
}
+static void
+ivi_set_desktop_surface_remote(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+ assert(surface->role == IVI_SURFACE_ROLE_NONE);
+
+ /* remote type are the same as desktop just that client can tell
+ * the compositor to start on another output */
+ surface->role = IVI_SURFACE_ROLE_REMOTE;
+ wl_list_insert(&ivi->surfaces, &surface->link);
+}
+
+
static void
ivi_set_desktop_surface_split(struct ivi_surface *surface)
{
const char *app_id, uint32_t orientation)
{
struct ivi_compositor *ivi = ioutput->ivi;
+ struct ivi_surface *surf;
size_t len_app_id = strlen(app_id);
+ struct pending_split *split;
if (orientation != AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_VERTICAL &&
orientation != AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_HORIZONTAL)
return;
- struct pending_split *split = zalloc(sizeof(*split));
+ /* more than one is un-supported, do note we need to do
+ * conversion for surface roles instead of using the protocol ones */
+ wl_list_for_each(surf, &ivi->surfaces, link)
+ if (surf->role == IVI_SURFACE_ROLE_SPLIT_V ||
+ surf->role == IVI_SURFACE_ROLE_SPLIT_H)
+ return;
+ split = zalloc(sizeof(*split));
split->app_id = zalloc(sizeof(char) * (len_app_id + 1));
memcpy(split->app_id, app_id, len_app_id);
wl_list_insert(&ivi->split_pending_apps, &split->link);
}
+static void
+ivi_set_pending_desktop_surface_remote(struct ivi_output *ioutput,
+ const char *app_id)
+{
+ struct ivi_compositor *ivi = ioutput->ivi;
+ size_t len_app_id = strlen(app_id);
+
+ 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(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)
{
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))
+ 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;
+ }
+ }
+
+ return false;
+}
+
+
void
ivi_check_pending_desktop_surface(struct ivi_surface *surface)
{
return;
}
- /* if we end up here means we have a regular desktop app */
+ ret = ivi_check_pending_desktop_surface_remote(surface);
+ if (ret) {
+ ivi_set_desktop_surface_remote(surface);
+ return;
+ }
+
+ /* if we end up here means we have a regular desktop app and
+ * try to activate it */
ivi_set_desktop_surface(surface);
+ ivi_layout_desktop_committed(surface);
}
void
wl_list_for_each_safe(surface, tmp, &ivi->pending_surfaces, link) {
wl_list_remove(&surface->link);
-
- if (ivi_check_pending_desktop_surface_popup(surface)) {
- ivi_set_desktop_surface_popup(surface);
- } else {
- ivi_set_desktop_surface(surface);
- ivi_layout_desktop_committed(surface);
- }
+ ivi_check_pending_desktop_surface(surface);
}
}
case AGL_SHELL_DESKTOP_APP_ROLE_SPLIT_HORIZONTAL:
ivi_set_pending_desktop_surface_split(output, app_id, role);
break;
+ case AGL_SHELL_DESKTOP_APP_ROLE_REMOTE:
+ ivi_set_pending_desktop_surface_remote(output, app_id);
+ break;
default:
break;
}