EXPORT_API screen_connector_provider_h screen_connector_provider_create(const char *id, struct wl_surface *surface)
{
- struct screen_connector_provider_s *remote;
+ struct screen_connector_provider_s *remote = NULL;
struct wl_display *display;
+ struct wl_event_queue *queue = NULL;
+ struct wl_display *rsm_wrapper = NULL;
if (!__rsm) {
LOGE("__rsm is not ready");
- return NULL;
+ goto out;
+ }
+
+ rsm_wrapper = wl_proxy_create_wrapper(__rsm);
+ if (!rsm_wrapper) {
+ LOGE("failed to create wl display wrapper");
+ goto out;
}
if (!surface || !id) {
LOGE("invalid parameter");
- return NULL;
+ goto out;
}
display = ecore_wl_display_get();
if (!display) {
LOGE("Fail to get");
- return NULL;
+ goto out;
}
+ queue = wl_display_create_queue(display);
+ wl_proxy_set_queue((struct wl_proxy *)rsm_wrapper, queue);
+
remote = (struct screen_connector_provider_s *)malloc(sizeof(struct screen_connector_provider_s));
if (!remote) {
LOGE("out of memory");
- return NULL;
+ goto out;
}
remote->surface = surface;
if (!remote->win) {
LOGE("failed to find win");
free(remote);
- return NULL;
+ remote = NULL;
+ goto out;
}
- remote->rsp = tizen_remote_surface_manager_create_provider(__rsm, surface);
+ remote->rsp = tizen_remote_surface_manager_create_provider((struct tizen_remote_surface_manager *)rsm_wrapper, surface);
if (!remote->rsp) {
LOGE("failed to create provider");
free(remote);
- return NULL;
+ remote = NULL;
+ goto out;
}
remote->id = strdup(id);
if (!remote->id) {
- free(remote);
LOGE("out of memory");
- return NULL;
+ free(remote);
+ remote = NULL;
+ goto out;
}
tizen_remote_surface_provider_add_listener(remote->rsp, &__rsp_listener, remote);
-
- wl_display_roundtrip(display);
+ wl_display_roundtrip_queue(display, queue);
+ wl_proxy_set_queue((struct wl_proxy *)remote->rsp, NULL);
LOGD("surface remote enabled");
+out:
+ if (queue)
+ wl_event_queue_destroy(queue);
+
+ if (rsm_wrapper)
+ wl_proxy_wrapper_destroy(rsm_wrapper);
+
return remote;
}