From ce85a5c603da3f98957853cbe49baee03666f9bb Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 10 Feb 2017 14:18:28 +0900 Subject: [PATCH] Fix screen_connector_watcher_evas_add_by_rid bug This API was designed for other viewer but implementation was for main viewer Change-Id: I1292fb070d5a1c298e0bc8750ae864ee9407cda5 Signed-off-by: Hyunho Kang (cherry picked from commit 7dcac60b2b98387af463681e012998be9278ef64) --- .../include/screen_connector_watcher.h | 1 + .../src/screen_connector_watcher.c | 9 ++++++ .../include/screen_connector_watcher_evas.h | 30 +++++++++++++++++++- .../src/screen_connector_watcher_evas.c | 33 ++++++++-------------- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index b1cfed7..223b850 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -44,6 +44,7 @@ int screen_connector_watcher_update(const char *appid); char *screen_connector_watcher_get_appid(screen_connector_watcher_h h); int screen_connector_watcher_get_pid(screen_connector_watcher_h h); int screen_connector_watcher_get_resource_id(screen_connector_watcher_h h); +int screen_connector_watcher_set_resource_id(screen_connector_watcher_h h, int rid); struct tizen_remote_surface *screen_connector_watcher_get_trs(screen_connector_watcher_h h); screen_connector_watcher_h screen_connector_watcher_create_handle(char *id, int pid, screen_connector_watcher_ops *ops, void *data); void screen_connector_watcher_redirect_surface(screen_connector_watcher_h watcher_h); diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index fb76e57..dfec938 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -330,6 +330,15 @@ EXPORT_API int screen_connector_watcher_get_resource_id(screen_connector_watcher return h->resource_id; } +EXPORT_API int screen_connector_watcher_set_resource_id(screen_connector_watcher_h h, int rid) +{ + if (h == NULL) + return -1; + + h->resource_id = rid; + return 0; +} + EXPORT_API struct tizen_remote_surface *screen_connector_watcher_get_trs(screen_connector_watcher_h h) { if (h == NULL) diff --git a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h index 117fea5..3e429cb 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -65,8 +65,36 @@ int screen_connector_watcher_evas_freeze_visibility(Evas_Object *obj, visibility int screen_connector_watcher_evas_thaw_visibility(Evas_Object *obj); int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj); int screen_connector_watcher_evas_send_touch_cancel(Evas_Object *obj); + +/** + * @brief Add screen connector watcher by rid. + * @details Using this API, viewer can watch screen which already watched by other viewer.\n + * @since_tizen 3.0 + * @param[in] obj screen image object + * @param[out] pid screen provider pid + * @return 0 if success, negative value(<0) if fail + * + * @remark + * This API is only for main viewer. \n + * Sub viewer can not get provider's information like provider's pid by screen image object. + * @see screen_connector_watcher_evas_add_by_rid() +*/ int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid); -int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data); + +/** + * @brief Add screen connector watcher by rid. + * @details Using this API, viewer can watch screen which already watched by other viewer.\n + * @since_tizen 3.0 + * @param[in] ops screen watcher evas callback handler function + * @param[in] res_id screen provider rid + * @param[in] data user-supplied data for watcher handler + * @return @c Not null on success + * + * @remark + * This API is only for sub viewer. \n + * Sub viewer can not get provider's information like provider's pid by screen image object. +*/ +screen_connector_watcher_evas_h screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data); int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id); /** diff --git a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c index 59cf9a0..c44a18b 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -693,14 +693,12 @@ EXPORT_API int screen_connector_watcher_evas_send_touch_cancel(Evas_Object *obj) return 0; } -EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, int res_id, void *data) +EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add_by_rid(screen_connector_watcher_evas_ops *ops, + int res_id, void *data) { - GHashTableIter iter; - gpointer key, value; screen_connector_watcher_evas_h watcher_evas_h; - screen_connector_watcher_evas_h cur_h = NULL; screen_connector_watcher_evas_ops *evas_ops; - char *appid = NULL; + char rid_str[32]; int pid = 0; screen_connector_watcher_ops watcher_ops; @@ -708,35 +706,28 @@ EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher watcher_ops.missing_cb = __watcher_missing_cb; watcher_ops.update_cb = __watcher_update_cb; - g_hash_table_iter_init(&iter, __watcher_tbl); - while (g_hash_table_iter_next(&iter, &key, &value)) { - cur_h = (screen_connector_watcher_evas_h)value; - if (screen_connector_watcher_get_resource_id(cur_h->watcher_h) == res_id) { - appid = screen_connector_watcher_get_appid(cur_h->watcher_h); - pid = screen_connector_watcher_get_pid(cur_h->watcher_h); - break; - } - } - evas_ops = (screen_connector_watcher_evas_ops *)calloc(1, sizeof(screen_connector_watcher_evas_ops)); if (evas_ops == NULL) { LOGE("evas_ops calloc fail"); - return -1; + return NULL; } + snprintf(rid_str, sizeof(rid_str), "%d", res_id); memcpy(evas_ops, ops, sizeof(screen_connector_watcher_evas_ops)); watcher_evas_h = (screen_connector_watcher_evas_h)calloc(1, sizeof(struct _screen_connector_watcher_evas_h)); if (watcher_evas_h == NULL) { LOGE("handle calloc fail"); free(evas_ops); - return -1; + return NULL; } + watcher_evas_h->img_type = -1; watcher_evas_h->ops = evas_ops; watcher_evas_h->data = data; - watcher_evas_h->watcher_h = screen_connector_watcher_create_handle(appid, pid, &watcher_ops, watcher_evas_h); + watcher_evas_h->watcher_h = screen_connector_watcher_create_handle(rid_str, pid, &watcher_ops, watcher_evas_h); + screen_connector_watcher_set_resource_id(watcher_evas_h->watcher_h, res_id); screen_connector_watcher_redirect_surface(watcher_evas_h->watcher_h); - return 0; + return watcher_evas_h; } EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id) @@ -745,7 +736,7 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); if (!watcher_evas_h) { - LOGE("unknown object. not widget object"); + LOGE("unknown object."); return -1; } *resource_id = screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); @@ -760,7 +751,7 @@ EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); if (!watcher_evas_h) { - LOGE("unknown object. not widget object"); + LOGE("unknown object."); return -1; } -- 2.7.4