From 22997e40e765466572e97942b1b13c7c37626f03 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Mon, 19 Dec 2016 16:37:05 +0900 Subject: [PATCH 01/16] tizen_remote_surface version up tizen_remote_surface manager version 1 has bug. tizen_remote_surface_release protocol is added. Change-Id: I23e4d6533451b78e2c88e0ab330d2af3485581f4 Signed-off-by: Hyunho Kang --- screen_connector_watcher/src/screen_connector_watcher.c | 3 ++- .../src/screen_connector_watcher_evas.c | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index 02210c6..acf1e07 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -178,7 +178,8 @@ EXPORT_API int screen_connector_watcher_init() EINA_INLIST_FOREACH(globals, global) { if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, - &tizen_remote_surface_manager_interface, 1); + &tizen_remote_surface_manager_interface, + global->version < 2 ? global->version : 2); } } 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 8f36025..3bfebd0 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -43,6 +43,7 @@ struct _screen_connector_watcher_evas_h { bool cancel_touch; Evas_Object *img_tbm; Evas_Object *img_file; + struct wl_buffer *pre_buffer; void *data; }; static Evas_Object *__viewer_win; @@ -313,6 +314,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, watcher_evas_h = (screen_connector_watcher_evas_h)data; appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + if (watcher_evas_h->img_tbm == NULL) { LOGD("first added !!!! %d, %d %s", (watcher_evas_h->img_tbm == NULL), type, appid); @@ -391,6 +393,13 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_native_surface_set(watcher_evas_h->img_tbm, NULL); /* set null to previous object for the tbm type */ } + if (watcher_evas_h->pre_buffer) { + if (tizen_remote_surface_get_version(trs) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) + tizen_remote_surface_release(trs, watcher_evas_h->pre_buffer); + } + watcher_evas_h->pre_buffer = tbm; + + if (is_added) { LOGD("call added !!!! %s", appid); watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, -- 2.7.4 From 4b6bb12caf18806f949d8d1814607de22e536031 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Tue, 20 Dec 2016 14:01:54 +0900 Subject: [PATCH 02/16] Adjust coding style Change-Id: Ia8eae134aac2f04a82e8402f93b194bfbe43b932 Signed-off-by: Hwankyu Jhun --- .../include/screen_connector_provider.h | 6 +- .../src/screen_connector_provider.c | 24 ++-- .../include/screen_connector_watcher.h | 8 +- .../src/screen_connector_watcher.c | 59 +++++----- .../include/screen_connector_watcher_evas.h | 25 ++--- .../src/screen_connector_watcher_evas.c | 123 ++++++++------------- 6 files changed, 109 insertions(+), 136 deletions(-) diff --git a/screen_connector_provider/include/screen_connector_provider.h b/screen_connector_provider/include/screen_connector_provider.h index f937c50..05d20ed 100644 --- a/screen_connector_provider/include/screen_connector_provider.h +++ b/screen_connector_provider/include/screen_connector_provider.h @@ -22,11 +22,11 @@ extern "C" { #endif int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface); -int screen_connector_provider_init(); -int screen_connector_provider_fini(); +int screen_connector_provider_init(void); +int screen_connector_provider_fini(void); #ifdef __cplusplus } #endif -#endif +#endif /* __SCREEN_CONNECTOR_PROVIDER_H__ */ diff --git a/screen_connector_provider/src/screen_connector_provider.c b/screen_connector_provider/src/screen_connector_provider.c index 7834f69..288804b 100644 --- a/screen_connector_provider/src/screen_connector_provider.c +++ b/screen_connector_provider/src/screen_connector_provider.c @@ -1,5 +1,4 @@ /* - * Screen Connector Watcher * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the License); @@ -14,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #include #include #include #include - #include #include #include @@ -28,7 +27,6 @@ #include #include - #include "screen_connector_provider.h" #ifdef LOG_TAG @@ -49,7 +47,6 @@ struct __remote_surface_s { static void __rsp_resource_id_cb(void *data, struct tizen_remote_surface_provider *provider, uint32_t res_id) { - LOGE("add app screen : %d", res_id); aul_screen_connector_add_app_screen(res_id); } @@ -139,16 +136,15 @@ EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl return 0; } -EXPORT_API int screen_connector_provider_init() +EXPORT_API int screen_connector_provider_init(void) { - int ret = 0; struct wl_registry *registry; Ecore_Wl_Global *global; Eina_Inlist *globals; - if (__init_count > 0) { + if (__init_count > 0) return 0; - } + ecore_wl_init(NULL); registry = ecore_wl_registry_get(); @@ -156,14 +152,14 @@ EXPORT_API int screen_connector_provider_init() if (!registry || !globals) { LOGE("could not get registry(%p) or global list(%p)", registry, - globals); + globals); return -1; } EINA_INLIST_FOREACH(globals, global) { if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, - &tizen_remote_surface_manager_interface, 1); + &tizen_remote_surface_manager_interface, 1); } } @@ -173,13 +169,11 @@ EXPORT_API int screen_connector_provider_init() } __init_count++; - return ret; + return 0; } -EXPORT_API int screen_connector_provider_fini() +EXPORT_API int screen_connector_provider_fini(void) { - int ret = 0; - if (__init_count > 1) return 0; @@ -189,5 +183,5 @@ EXPORT_API int screen_connector_provider_fini() ecore_wl_shutdown(); __init_count--; - return ret; + return 0; } diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index 0bfde94..b1cfed7 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -26,7 +26,7 @@ extern "C" { typedef void (*screen_connector_watcher_update_cb)(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data); typedef void (*screen_connector_watcher_missing_cb)(struct tizen_remote_surface *trs, void *data); typedef void (*screen_connector_watcher_change_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); typedef struct _screen_connector_watcher_ops { screen_connector_watcher_update_cb update_cb; @@ -36,8 +36,8 @@ typedef struct _screen_connector_watcher_ops { typedef struct _screen_connector_watcher_h *screen_connector_watcher_h; -int screen_connector_watcher_init(); -int screen_connector_watcher_fini(); +int screen_connector_watcher_init(void); +int screen_connector_watcher_fini(void); screen_connector_watcher_h screen_connector_watcher_add(screen_connector_watcher_ops *ops, char *id, void *data); int screen_connector_watcher_remove(screen_connector_watcher_h h); int screen_connector_watcher_update(const char *appid); @@ -52,4 +52,4 @@ void screen_connector_watcher_redirect_surface(screen_connector_watcher_h watche } #endif -#endif +#endif /* __SCREEN_CONNECTOR_WATCHER_H__ */ diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index acf1e07..c1bcfb1 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -1,5 +1,4 @@ /* - * Screen Connector Watcher * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the License); @@ -14,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #include #include #include - #include #include #include @@ -40,7 +39,7 @@ struct _screen_connector_watcher_h { void (*update_cb)(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data); void (*missing_cb)(struct tizen_remote_surface *trs, void *data); void (*change_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); void *data; struct tizen_remote_surface *surface; int resource_id; @@ -51,7 +50,7 @@ typedef struct _screen_connector_watcher_h *screen_connector_watcher_h; static struct tizen_remote_surface_manager *__rsm; static struct wayland_tbm_client *__tbm_client; static struct wl_tbm *__tbm; -static bool __is_init = false; +static bool __is_init; static GList *__watcher_list; static GList *__pending_watcher_list; static aul_screen_viewer_handler __aul_cbs; @@ -59,6 +58,7 @@ static aul_screen_viewer_handler __aul_cbs; static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time) { screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) watcher_h->update_cb(trs, buffer, time, watcher_h->data); } @@ -66,15 +66,17 @@ static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struc static void __buffer_missing(void *data, struct tizen_remote_surface *trs) { screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) watcher_h->missing_cb(trs, watcher_h->data); } #if 0 static void __buffer_changed(void *data, struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys) + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys) { screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + if (watcher_h) watcher_h->change_cb(trs, type, tbm, img_file_fd, img_file_size, time, keys, watcher_h->data); } @@ -97,35 +99,43 @@ static void __app_removed(const char *appid, const int pid, void *data) EXPORT_API void screen_connector_watcher_redirect_surface(screen_connector_watcher_h watcher_h) { - watcher_h->surface = - tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)watcher_h->resource_id, __tbm); + if (watcher_h == NULL) + return; + + watcher_h->surface = tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)watcher_h->resource_id, __tbm); LOGD("resource_id : %d, (%p)", watcher_h->resource_id, watcher_h->surface); - tizen_remote_surface_add_listener(watcher_h->surface, &__rs_listener, - watcher_h); + tizen_remote_surface_add_listener(watcher_h->surface, &__rs_listener, watcher_h); tizen_remote_surface_redirect(watcher_h->surface); } static screen_connector_watcher_h __create_watcher_handle_info(char *appid) { - screen_connector_watcher_h watcher_h = NULL; + screen_connector_watcher_h watcher_h; + watcher_h = (screen_connector_watcher_h)calloc(1, sizeof(struct _screen_connector_watcher_h)); if (watcher_h == NULL) { LOGE("watcher_h calloc fail"); return NULL; } + watcher_h->appid = strdup(appid); + if (watcher_h->appid == NULL) { + LOGE("out of memory"); + free(watcher_h); + return NULL; + } return watcher_h; } static void __app_added(const char *appid, const int pid, const unsigned int resource_id, void *data) { - LOGD("__app_added pid: %d, resource_id: %d, appid: %s", pid, resource_id, appid); screen_connector_watcher_h watcher_h = NULL; - screen_connector_watcher_h cur_h = NULL; + screen_connector_watcher_h cur_h; GList *watcher_list = __watcher_list; + LOGD("__app_added pid: %d, resource_id: %d, appid: %s", pid, resource_id, appid); for (; watcher_list != NULL; watcher_list = watcher_list->next) { cur_h = (screen_connector_watcher_h)watcher_list->data; if (strcmp(cur_h->appid, appid) == 0) { @@ -151,10 +161,9 @@ static void __app_added(const char *appid, const int pid, const unsigned int res screen_connector_watcher_redirect_surface(watcher_h); else LOGE("bad tbm message received. missing arguments"); - } -EXPORT_API int screen_connector_watcher_init() +EXPORT_API int screen_connector_watcher_init(void) { int ret = 0; struct wl_registry *registry; @@ -171,15 +180,15 @@ EXPORT_API int screen_connector_watcher_init() if (!registry || !globals) { LOGE("could not get registry(%p) or global list(%p)", registry, - globals); + globals); return -1; } EINA_INLIST_FOREACH(globals, global) { if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, - &tizen_remote_surface_manager_interface, - global->version < 2 ? global->version : 2); + &tizen_remote_surface_manager_interface, + global->version < 2 ? global->version : 2); } } @@ -209,7 +218,7 @@ EXPORT_API int screen_connector_watcher_init() return ret; } -EXPORT_API int screen_connector_watcher_fini() +EXPORT_API int screen_connector_watcher_fini(void) { if (!__is_init) return 0; @@ -245,6 +254,9 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_create_handle(cha screen_connector_watcher_h watcher_h = NULL; watcher_h = __create_watcher_handle_info(id); + if (watcher_h == NULL) + return NULL; + watcher_h->update_cb = ops->update_cb; watcher_h->change_cb = ops->change_cb; watcher_h->missing_cb = ops->missing_cb; @@ -256,9 +268,8 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_create_handle(cha EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connector_watcher_ops *ops, char *id, void *data) { - screen_connector_watcher_h watcher_h = NULL; - screen_connector_watcher_h cur_h = NULL; + screen_connector_watcher_h cur_h; GList *watcher_list = __pending_watcher_list; for (; watcher_list != NULL; watcher_list = watcher_list->next) { @@ -290,16 +301,14 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connec EXPORT_API int screen_connector_watcher_remove(screen_connector_watcher_h h) { - int ret = 0; __destroy_watcher_h(h); - return ret; + + return 0; } EXPORT_API int screen_connector_watcher_update(const char *appid) { - int ret = 0; - ret = aul_screen_connector_update_app_screen(appid); - return ret; + return aul_screen_connector_update_app_screen(appid); } EXPORT_API char *screen_connector_watcher_get_appid(screen_connector_watcher_h h) 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 efbe06a..117fea5 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef __SCREEN_CONNECTOR_WATCHER_EVAS_H -#define __SCREEN_CONNECTOR_WATCHER_EVAS_H +#ifndef __SCREEN_CONNECTOR_WATCHER_EVAS_H__ +#define __SCREEN_CONNECTOR_WATCHER_EVAS_H__ #include #include @@ -37,7 +37,7 @@ extern "C" { */ typedef enum { - VISIBILITY_TYPE_UNOBSCURED = 0, + VISIBILITY_TYPE_UNOBSCURED, VISIBILITY_TYPE_PARTIALLY_OBSCURED, VISIBILITY_TYPE_FULLY_OBSCURED, } visibility_type; @@ -47,21 +47,20 @@ typedef void (*screen_connector_watcher_evas_removed_cb)(const char *appid, Evas typedef void (*screen_connector_watcher_evas_updated_cb)(const char *appid, Evas_Object *image, void *data); typedef struct _screen_connector_watcher_evas_ops { - screen_connector_watcher_evas_added_cb added; - screen_connector_watcher_evas_removed_cb removed; - screen_connector_watcher_evas_updated_cb updated; -}screen_connector_watcher_evas_ops; + screen_connector_watcher_evas_added_cb added; + screen_connector_watcher_evas_removed_cb removed; + screen_connector_watcher_evas_updated_cb updated; +} screen_connector_watcher_evas_ops; typedef struct _screen_connector_watcher_evas_h *screen_connector_watcher_evas_h; int screen_connector_watcher_evas_init(Evas_Object *win); -int screen_connector_watcher_evas_fini(); +int screen_connector_watcher_evas_fini(void); screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connector_watcher_evas_ops *ops, char *id, void *data); int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h handle); int screen_connector_watcher_evas_update(const char *appid); - -int screen_connector_watcher_evas_start_visibility_notify(); -int screen_connector_watcher_evas_stop_visibility_notify(); +int screen_connector_watcher_evas_start_visibility_notify(void); +int screen_connector_watcher_evas_stop_visibility_notify(void); int screen_connector_watcher_evas_freeze_visibility(Evas_Object *obj, visibility_type type); int screen_connector_watcher_evas_thaw_visibility(Evas_Object *obj); int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj); @@ -78,6 +77,4 @@ int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id); } #endif -#endif - -/* End of a file */ +#endif /* __SCREEN_CONNECTOR_WATCHER_EVAS_H__ */ 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 3bfebd0..9152610 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -1,5 +1,4 @@ /* - * Screen Connector Watcher Evas * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the License); @@ -19,7 +18,6 @@ #include #include #include - #include #include #include @@ -46,6 +44,7 @@ struct _screen_connector_watcher_evas_h { struct wl_buffer *pre_buffer; void *data; }; + static Evas_Object *__viewer_win; static Ecore_Event_Handler *__visibility_listener; static GHashTable *__watcher_tbl; @@ -60,7 +59,6 @@ static void __destroy_watcher_evas_handle(screen_connector_watcher_evas_h h) EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) { - int ret = 0; __viewer_win = win; __watcher_tbl = g_hash_table_new(g_direct_hash, g_direct_equal); @@ -69,19 +67,15 @@ EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) return -1; } - ret = screen_connector_watcher_init(); - return ret; + return screen_connector_watcher_init(); } -EXPORT_API int screen_connector_watcher_evas_fini() +EXPORT_API int screen_connector_watcher_evas_fini(void) { - int ret = 0; - if (__watcher_tbl) g_hash_table_destroy(__watcher_tbl); - ret = screen_connector_watcher_fini(); - return ret; + return screen_connector_watcher_fini(); } static bool __obj_is_visible(Evas_Object *obj) @@ -100,15 +94,16 @@ static bool __obj_is_visible(Evas_Object *obj) y >= 0 && y < window_h && (rotation == 0 || rotation == 180)) { LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", - x, y, w, h, window_w, window_h, rotation); + x, y, w, h, window_w, window_h, rotation); return true; } else if (x >= 0 && x < window_h && y >= 0 && y < window_w && (rotation == 90 || rotation == 270)) { LOGD("x %d, y %d w %d h %d, window_w %d window_h %d rotation %d", - x, y, w, h, window_w, window_h, rotation); + x, y, w, h, window_w, window_h, rotation); return true; } + return false; } @@ -224,7 +219,6 @@ static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_ evas_device_subclass_get(ev->dev), desc, ev->timestamp); - } static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -260,7 +254,6 @@ static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *even evas_device_subclass_get(ev->dev), desc, ev->timestamp); - } static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -283,7 +276,6 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve evas_device_subclass_get(ev->dev), desc, ev->timestamp); - } static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -297,9 +289,8 @@ static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info } static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, - int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) + int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) { - bool is_added = false; Evas_Native_Surface ns; tbm_surface_h tbm_surface; @@ -316,32 +307,31 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); if (watcher_evas_h->img_tbm == NULL) { - LOGD("first added !!!! %d, %d %s", (watcher_evas_h->img_tbm == NULL), type, appid); watcher_evas_h->img_tbm = evas_object_image_filled_add( - evas_object_evas_get(__viewer_win)); + evas_object_evas_get(__viewer_win)); /* Image alpha set */ evas_object_image_alpha_set(watcher_evas_h->img_tbm, 1); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_DOWN, - __rs_cb_mouse_down, watcher_evas_h); + EVAS_CALLBACK_MOUSE_DOWN, + __rs_cb_mouse_down, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_UP, - __rs_cb_mouse_up, watcher_evas_h); + EVAS_CALLBACK_MOUSE_UP, + __rs_cb_mouse_up, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_MOVE, - __rs_cb_mouse_move, watcher_evas_h); + EVAS_CALLBACK_MOUSE_MOVE, + __rs_cb_mouse_move, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOUSE_WHEEL, - __rs_cb_mouse_wheel, watcher_evas_h); + EVAS_CALLBACK_MOUSE_WHEEL, + __rs_cb_mouse_wheel, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_SHOW, - __rs_cb_show, watcher_evas_h); + EVAS_CALLBACK_SHOW, + __rs_cb_show, watcher_evas_h); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_HIDE, - __rs_cb_hide, watcher_evas_h); + EVAS_CALLBACK_HIDE, + __rs_cb_hide, watcher_evas_h); /* Store watcher_evas_h */ g_hash_table_insert(__watcher_tbl, watcher_evas_h->img_tbm, watcher_evas_h); @@ -350,14 +340,13 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, snprintf(plug_id, sizeof(plug_id), "%s:%d", appid, pid); evas_object_data_set(watcher_evas_h->img_tbm, "___PLUGID", strdup(plug_id)); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOVE, __obj_move_cb, watcher_evas_h); + EVAS_CALLBACK_MOVE, __obj_move_cb, watcher_evas_h); is_added = true; } /* check type of given buffer */ - if (type == 0) {//if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { - + if (type == 0) { /* get tbm surface from buffer */ tbm_surface = wl_buffer_get_user_data(tbm); width = tbm_surface_get_width(tbm_surface); @@ -372,15 +361,9 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_size_set(watcher_evas_h->img_tbm, width, height); evas_object_image_native_surface_set(watcher_evas_h->img_tbm, &ns); /* set native surface */ evas_object_image_pixels_dirty_set(watcher_evas_h->img_tbm, EINA_TRUE); /* set dirty for image updating */ - - //evas_object_del(watcher_evas_h->img_file); /* delete previous object for the image file type */ - - } else if (type == 1) {//} else if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { - - if (!watcher_evas_h->img_file) { - watcher_evas_h->img_file = evas_object_image_filled_add( - evas_object_evas_get(__viewer_win)); - } + } else if (type == 1) { + if (!watcher_evas_h->img_file) + watcher_evas_h->img_file = evas_object_image_filled_add(evas_object_evas_get(__viewer_win)); map = mmap(NULL, img_file_size, PROT_READ, MAP_SHARED, img_file_fd, 0); evas_object_image_memfile_set(watcher_evas_h->img_file, map, img_file_size, format, NULL); @@ -399,7 +382,6 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, } watcher_evas_h->pre_buffer = tbm; - if (is_added) { LOGD("call added !!!! %s", appid); watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, @@ -409,7 +391,6 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, watcher_evas_h->ops->updated(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); } - } static void __watcher_update_cb(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data) @@ -460,7 +441,6 @@ static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) __free_watcher_evas_h(watcher_evas_h); } - EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connector_watcher_evas_ops *ops, char *id, void *data) { screen_connector_watcher_evas_h handle; @@ -492,7 +472,8 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr EXPORT_API int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h handle) { - int ret = 0; + int ret; + ret = screen_connector_watcher_remove(handle->watcher_h); __destroy_watcher_evas_handle(handle); return ret; @@ -500,12 +481,9 @@ EXPORT_API int screen_connector_watcher_evas_remove(screen_connector_watcher_eva EXPORT_API int screen_connector_watcher_evas_update(const char *appid) { - int ret = 0; - ret = screen_connector_watcher_update(appid); - return ret; + return screen_connector_watcher_update(appid); } - static void __send_visibility(gpointer key, gpointer value, gpointer user_data) { screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)value; @@ -535,30 +513,28 @@ static Eina_Bool __visibility_cb(void *data, int type, void *event) Ecore_Wl_Event_Window_Visibility_Change *ev = event; LOGD("visibility change: %d %d", (unsigned int)ev->win, - (unsigned int)ev->fully_obscured); + (unsigned int)ev->fully_obscured); if (!__watcher_tbl) return ECORE_CALLBACK_RENEW; g_hash_table_foreach(__watcher_tbl, __send_visibility, - GINT_TO_POINTER(ev->fully_obscured)); + GINT_TO_POINTER(ev->fully_obscured)); return ECORE_CALLBACK_RENEW; } -EXPORT_API int screen_connector_watcher_evas_start_visibility_notify() +EXPORT_API int screen_connector_watcher_evas_start_visibility_notify(void) { if (__visibility_listener) return 0; - __visibility_listener = ecore_event_handler_add( - ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); + __visibility_listener = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, __visibility_cb, NULL); return 0; } - -EXPORT_API int screen_connector_watcher_evas_stop_visibility_notify() +EXPORT_API int screen_connector_watcher_evas_stop_visibility_notify(void) { if (!__visibility_listener) return 0; @@ -622,19 +598,19 @@ EXPORT_API int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj) evas_object_geometry_get(obj, &x, &y, &w, &h); timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff); tizen_remote_surface_transfer_mouse_event(surface, - TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, - 0, - 1, - w / 2, - h / 2, - 0, - 0, - 0, - 0, - TIZEN_INPUT_DEVICE_CLAS_MOUSE, - TIZEN_INPUT_DEVICE_SUBCLAS_NONE, - "", - timestamp); + TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, + 0, + 1, + w / 2, + h / 2, + 0, + 0, + 0, + 0, + TIZEN_INPUT_DEVICE_CLAS_MOUSE, + TIZEN_INPUT_DEVICE_SUBCLAS_NONE, + "", + timestamp); return 0; } @@ -703,12 +679,12 @@ EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher watcher_evas_h->data = data; watcher_evas_h->watcher_h = screen_connector_watcher_create_handle(appid, pid, &watcher_ops, watcher_evas_h); screen_connector_watcher_redirect_surface(watcher_evas_h->watcher_h); + return 0; } EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *resource_id) { - screen_connector_watcher_evas_h watcher_evas_h; watcher_evas_h = (screen_connector_watcher_evas_h)g_hash_table_lookup(__watcher_tbl, obj); @@ -720,7 +696,6 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso return screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); } - EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) { screen_connector_watcher_evas_h watcher_evas_h; @@ -733,5 +708,3 @@ EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) return screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); } - -/* End of a file */ -- 2.7.4 From ffa0de1e1fa558b8649f868d6fce9ac1bf93e591 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 23 Dec 2016 09:21:19 +0900 Subject: [PATCH 03/16] Fix fail to get object pid Change-Id: I4cfff44f1628e9bd4467d437a446e3445de9c51f Signed-off-by: Hyunho Kang --- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 9152610..e560334 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -705,6 +705,7 @@ EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) LOGE("unknown object. not widget object"); return -1; } + *pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); - return screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + return 0; } -- 2.7.4 From a6feb4b93fb290802d392a5bfd5998fefa2bdff9 Mon Sep 17 00:00:00 2001 From: Semun Lee Date: Wed, 28 Dec 2016 14:01:47 +0900 Subject: [PATCH 04/16] Call visibility update in show,resize callback We need to update initial visibility value for the object when it is shown or resized. If we skip it, the display server sets its own visibility state value for the object as invisible one. Change-Id: I75782a77f1cabadafabf560965e34e634816d702 Signed-off-by: Semun Lee --- .../src/screen_connector_watcher_evas.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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 e560334..9cb94d4 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -136,7 +136,7 @@ static int __set_visibility(screen_connector_watcher_evas_h watcher_evas_h, visi return 0; } -static void __obj_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void __obj_update_visibility(void *data, Evas *e, Evas_Object *obj, void *event_info) { screen_connector_watcher_evas_h watcher_evas_h = (screen_connector_watcher_evas_h)data; @@ -281,6 +281,7 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info) { LOGD("show"); + __obj_update_visibility(data, e, obj, event_info); } static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info) @@ -288,6 +289,12 @@ static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info LOGD("hide"); } +static void __rs_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + LOGD("resize"); + __obj_update_visibility(data, e, obj, event_info); +} + static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) { @@ -332,6 +339,9 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_event_callback_add(watcher_evas_h->img_tbm, EVAS_CALLBACK_HIDE, __rs_cb_hide, watcher_evas_h); + evas_object_event_callback_add(watcher_evas_h->img_tbm, + EVAS_CALLBACK_RESIZE, + __rs_cb_resize, watcher_evas_h); /* Store watcher_evas_h */ g_hash_table_insert(__watcher_tbl, watcher_evas_h->img_tbm, watcher_evas_h); @@ -340,7 +350,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, snprintf(plug_id, sizeof(plug_id), "%s:%d", appid, pid); evas_object_data_set(watcher_evas_h->img_tbm, "___PLUGID", strdup(plug_id)); evas_object_event_callback_add(watcher_evas_h->img_tbm, - EVAS_CALLBACK_MOVE, __obj_move_cb, watcher_evas_h); + EVAS_CALLBACK_MOVE, __obj_update_visibility, watcher_evas_h); is_added = true; } -- 2.7.4 From 3fd02474299527b3b60eda271590a3445d6ac822 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Thu, 5 Jan 2017 22:32:10 +0900 Subject: [PATCH 05/16] Add Null Check logic __watcher_tbl can be already destroyed by screen_connector_watcher_evas_fini call Change-Id: I783c4bcdea20d02ced1910a066d0d1652f0d5d9a Signed-off-by: Hyunho Kang --- .../src/screen_connector_watcher_evas.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 9cb94d4..4cb233e 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -75,6 +75,7 @@ EXPORT_API int screen_connector_watcher_evas_fini(void) if (__watcher_tbl) g_hash_table_destroy(__watcher_tbl); + __watcher_tbl = NULL; return screen_connector_watcher_fini(); } @@ -440,11 +441,13 @@ static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) return; } - g_hash_table_remove(__watcher_tbl, watcher_evas_h->img_tbm); + if (__watcher_tbl != NULL && watcher_evas_h->img_tbm != NULL) { + g_hash_table_remove(__watcher_tbl, watcher_evas_h->img_tbm); - /* Remove data used in accessibility */ - plug_id = evas_object_data_del(watcher_evas_h->img_tbm, "___PLUGID"); - free(plug_id); + /* Remove data used in accessibility */ + plug_id = evas_object_data_del(watcher_evas_h->img_tbm, "___PLUGID"); + free(plug_id); + } appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); -- 2.7.4 From 7d2b2c27ba0d30a951c26802a7412d8c3a563ef0 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 17 Jan 2017 10:00:29 +0900 Subject: [PATCH 06/16] Add tizen remote surface buffer changed callback tizen remote surface version up to 3. Change-Id: I1e4b5fab125903ac7b63c8a1a97314accb576380 Signed-off-by: Hyunho Kang --- screen_connector_watcher/src/screen_connector_watcher.c | 7 ------- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 6 +++--- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index c1bcfb1..9077d76 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -71,7 +71,6 @@ static void __buffer_missing(void *data, struct tizen_remote_surface *trs) watcher_h->missing_cb(trs, watcher_h->data); } -#if 0 static void __buffer_changed(void *data, struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys) { @@ -86,12 +85,6 @@ static const struct tizen_remote_surface_listener __rs_listener = { __buffer_missing, __buffer_changed, }; -#else -static const struct tizen_remote_surface_listener __rs_listener = { - __buffer_updated, - __buffer_missing, -}; -#endif static void __app_removed(const char *appid, const int pid, void *data) { 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 4cb233e..a690fff 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -357,7 +357,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, } /* check type of given buffer */ - if (type == 0) { + if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { /* get tbm surface from buffer */ tbm_surface = wl_buffer_get_user_data(tbm); width = tbm_surface_get_width(tbm_surface); @@ -372,7 +372,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_size_set(watcher_evas_h->img_tbm, width, height); evas_object_image_native_surface_set(watcher_evas_h->img_tbm, &ns); /* set native surface */ evas_object_image_pixels_dirty_set(watcher_evas_h->img_tbm, EINA_TRUE); /* set dirty for image updating */ - } else if (type == 1) { + } else if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { if (!watcher_evas_h->img_file) watcher_evas_h->img_file = evas_object_image_filled_add(evas_object_evas_get(__viewer_win)); @@ -406,7 +406,7 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, static void __watcher_update_cb(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data) { - __watcher_change_cb(trs, 0, buffer, 0, 0, 0, NULL, data); + __watcher_change_cb(trs, TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM, buffer, 0, 0, 0, NULL, data); } static void __free_watcher_evas_h(screen_connector_watcher_evas_h watcher_evas_h) -- 2.7.4 From b615969580f1a1919b47fcb86f7d0ee4ecedc610 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 17 Jan 2017 10:18:14 +0900 Subject: [PATCH 07/16] Release version 1.1.0 Changes: - Add tizen remote surface buffer changed callback Change-Id: I87c2c4d15db825b050fa5545276057f6f4fced7c Signed-off-by: Hyunho Kang --- packaging/libscreen_connector.spec | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packaging/libscreen_connector.spec b/packaging/libscreen_connector.spec index c419aa0..469cdc3 100644 --- a/packaging/libscreen_connector.spec +++ b/packaging/libscreen_connector.spec @@ -1,6 +1,6 @@ Name: libscreen_connector Summary: Library for developing the application -Version: 1.0 +Version: 1.1.0 Release: 1 Group: Applications/Core Applications License: Apache-2.0 @@ -36,7 +36,8 @@ cp %{SOURCE1002} . cp %{SOURCE1003} . %build -%cmake . -DTZ_SYS_SHARE=/usr/share +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%cmake . -DTZ_SYS_SHARE=/usr/share -DMAJORVER=${MAJORVER} -DFULLVER=%{version} make %{?jobs:-j%jobs} %install @@ -140,4 +141,4 @@ Header & package configuration files to support development of the widget viewer %{_libdir}/pkgconfig/screen_connector_watcher_evas.pc -# End of a file \ No newline at end of file +# End of a file -- 2.7.4 From beef22b1e1617335ced16bbcbf67f6d57b74f137 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 24 Jan 2017 11:59:16 +0900 Subject: [PATCH 08/16] Fix tbm buffer and file fd management logic Change-Id: I8bb5c15ea0a247c33e9450698d0529926a1a0f86 Signed-off-by: Hyunho Kang --- .../src/screen_connector_watcher.c | 2 +- .../src/screen_connector_watcher_evas.c | 59 ++++++++++++++++++---- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index 9077d76..a52fee4 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -181,7 +181,7 @@ EXPORT_API int screen_connector_watcher_init(void) if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, &tizen_remote_surface_manager_interface, - global->version < 2 ? global->version : 2); + global->version < 4 ? global->version : 4); } } 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 a690fff..f9774f5 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -41,6 +41,7 @@ struct _screen_connector_watcher_evas_h { bool cancel_touch; Evas_Object *img_tbm; Evas_Object *img_file; + uint32_t img_type; struct wl_buffer *pre_buffer; void *data; }; @@ -55,6 +56,7 @@ static void __destroy_watcher_evas_handle(screen_connector_watcher_evas_h h) return; free(h->ops); free(h); + h = NULL; } EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) @@ -296,6 +298,25 @@ static void __rs_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_in __obj_update_visibility(data, e, obj, event_info); } +static void __clear_img_tbm(screen_connector_watcher_evas_h watcher_evas_h) +{ + if (watcher_evas_h->img_tbm == NULL) + return; + + g_hash_table_remove(__watcher_tbl, watcher_evas_h->img_tbm); + evas_object_del(watcher_evas_h->img_tbm); + watcher_evas_h->img_tbm = NULL; +} + +static void __clear_img_file(screen_connector_watcher_evas_h watcher_evas_h) +{ + if (watcher_evas_h->img_file == NULL) + return; + + evas_object_del(watcher_evas_h->img_file); + watcher_evas_h->img_file = NULL; +} + static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data) { @@ -352,9 +373,11 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_data_set(watcher_evas_h->img_tbm, "___PLUGID", strdup(plug_id)); evas_object_event_callback_add(watcher_evas_h->img_tbm, EVAS_CALLBACK_MOVE, __obj_update_visibility, watcher_evas_h); + } + if (watcher_evas_h->img_type != type) is_added = true; - } + watcher_evas_h->img_type = type; /* check type of given buffer */ if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) { @@ -382,7 +405,6 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_fill_set(watcher_evas_h->img_file, 0, 0, width, height); evas_object_resize(watcher_evas_h->img_file, width, height); munmap(map, img_file_size); - close(img_file_fd); /* close passed fd */ evas_object_image_native_surface_set(watcher_evas_h->img_tbm, NULL); /* set null to previous object for the tbm type */ } @@ -394,14 +416,29 @@ static void __watcher_change_cb(struct tizen_remote_surface *trs, uint32_t type, watcher_evas_h->pre_buffer = tbm; if (is_added) { - LOGD("call added !!!! %s", appid); - watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, - watcher_evas_h->data); + LOGD("call added !!!! %s, type %d", appid, type); + if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { + watcher_evas_h->ops->added(appid, watcher_evas_h->img_file, + watcher_evas_h->data); + __clear_img_tbm(watcher_evas_h); + } else { + watcher_evas_h->ops->added(appid, watcher_evas_h->img_tbm, + watcher_evas_h->data); + __clear_img_file(watcher_evas_h); + } } else { - LOGD("call updated !!!! %s", appid); - watcher_evas_h->ops->updated(appid, watcher_evas_h->img_tbm, - watcher_evas_h->data); + LOGD("call updated !!!! %s, type %d", appid, type); + if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { + watcher_evas_h->ops->updated(appid, watcher_evas_h->img_file, + watcher_evas_h->data); + __clear_img_tbm(watcher_evas_h); + } else { + watcher_evas_h->ops->updated(appid, watcher_evas_h->img_tbm, + watcher_evas_h->data); + __clear_img_file(watcher_evas_h); + } } + close(img_file_fd); /* close passed fd */ } static void __watcher_update_cb(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data) @@ -450,7 +487,10 @@ static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) } appid = screen_connector_watcher_get_appid(watcher_evas_h->watcher_h); - watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); + if (watcher_evas_h->img_tbm != NULL) + watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); + else + watcher_evas_h->ops->removed(appid, watcher_evas_h->img_file, watcher_evas_h->data); __free_watcher_evas_h(watcher_evas_h); } @@ -476,6 +516,7 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr LOGE("handle calloc fail"); return NULL; } + handle->img_type = -1; handle->ops = evas_ops; handle->data = data; handle->watcher_h = screen_connector_watcher_add(&watcher_ops, id, handle); -- 2.7.4 From 970ad693eeccfe1a80f1567bb57cf5626c7ad1c5 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 1 Feb 2017 10:15:58 +0900 Subject: [PATCH 09/16] Release version 1.1.1 Changes: - Fix tbm buffer and file fd management logic Change-Id: I17058cd8dc7016bcf0ae4106f489cd0f04c44965 Signed-off-by: Hyunho Kang --- packaging/libscreen_connector.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libscreen_connector.spec b/packaging/libscreen_connector.spec index 469cdc3..c9cf689 100644 --- a/packaging/libscreen_connector.spec +++ b/packaging/libscreen_connector.spec @@ -1,6 +1,6 @@ Name: libscreen_connector Summary: Library for developing the application -Version: 1.1.0 +Version: 1.1.1 Release: 1 Group: Applications/Core Applications License: Apache-2.0 -- 2.7.4 From 1061dbe786a9b9ae6382a147982a714128898ea2 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 8 Feb 2017 18:13:49 +0900 Subject: [PATCH 10/16] Fix screen_connector_watcher_evas_get_rid bug Change-Id: If3086b6a1984ceb6a1864a57b5fba238ad04ee81 Signed-off-by: Hyunho Kang --- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 f9774f5..baf1839 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -746,8 +746,9 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso LOGE("unknown object. not widget object"); return -1; } + *resource_id = screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); - return screen_connector_watcher_get_resource_id(watcher_evas_h->watcher_h); + return 0; } EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) -- 2.7.4 From 8c03736fdfeab29cc8f29dc157c10b6b944027b2 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 10 Feb 2017 08:46:28 +0900 Subject: [PATCH 11/16] Add an exception handling The tizen_remote_surface_manager_create_surface() API returns a NULL porinter if the resource id is invalid. Change-Id: I5d3b084db876061d4f2a02254e8905db4ff52d68 Signed-off-by: Hwankyu Jhun (cherry picked from commit d88dd0de0d418c42ed4465a2c76de2cef677401b) --- screen_connector_watcher/src/screen_connector_watcher.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index a52fee4..fb76e57 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -96,6 +96,8 @@ EXPORT_API void screen_connector_watcher_redirect_surface(screen_connector_watch return; watcher_h->surface = tizen_remote_surface_manager_create_surface(__rsm, (uint32_t)watcher_h->resource_id, __tbm); + if (watcher_h->surface == NULL) + return; LOGD("resource_id : %d, (%p)", watcher_h->resource_id, watcher_h->surface); tizen_remote_surface_add_listener(watcher_h->surface, &__rs_listener, watcher_h); -- 2.7.4 From 04bced5d05b295b9407d10137e8b514a26f122ff Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 8 Feb 2017 21:36:51 +0900 Subject: [PATCH 12/16] Fix memory leaks Change-Id: Idb56464495739c44b1735fea75d56a1901718d13 Signed-off-by: Hyunho Kang (cherry picked from commit e262f6dbb8bb12f2a537b620a9e90a0929f833b5) --- screen_connector_watcher_evas/src/screen_connector_watcher_evas.c | 2 ++ 1 file changed, 2 insertions(+) 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 baf1839..00657af 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -514,6 +514,7 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr handle = (screen_connector_watcher_evas_h)calloc(1, sizeof(struct _screen_connector_watcher_evas_h)); if (handle == NULL) { LOGE("handle calloc fail"); + free(evas_ops); return NULL; } handle->img_type = -1; @@ -727,6 +728,7 @@ EXPORT_API int screen_connector_watcher_evas_add_by_rid(screen_connector_watcher 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; } watcher_evas_h->ops = evas_ops; -- 2.7.4 From dab76459986184c379ad76b299f542106d8a7143 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 10 Feb 2017 14:47:53 +0900 Subject: [PATCH 13/16] Add error return logic to watcher_evas_get_pid Sub viewer should not get pid using screen image object. Change-Id: I4f12cb2c1f8f96575a81f1e8a5665ff7f52fba09 Signed-off-by: Hyunho Kang (cherry picked from commit 29c85c12a9d6c42860fe64abf485c5beb67b6cdc) --- .../src/screen_connector_watcher_evas.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 00657af..59cf9a0 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -756,13 +756,21 @@ EXPORT_API int screen_connector_watcher_evas_get_rid(Evas_Object *obj, int *reso EXPORT_API int screen_connector_watcher_evas_get_pid(Evas_Object *obj, int *pid) { screen_connector_watcher_evas_h watcher_evas_h; + int watcher_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"); return -1; } - *pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + + watcher_pid = screen_connector_watcher_get_pid(watcher_evas_h->watcher_h); + if (watcher_pid == 0) { + LOGE("Invalid object"); + return -1; + } + + *pid = watcher_pid; return 0; } -- 2.7.4 From ce85a5c603da3f98957853cbe49baee03666f9bb Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 10 Feb 2017 14:18:28 +0900 Subject: [PATCH 14/16] 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 From e5b1e25b77b630123639d59532267d2727d501a2 Mon Sep 17 00:00:00 2001 From: Daehyeon Jung Date: Fri, 13 Jan 2017 19:22:37 +0900 Subject: [PATCH 15/16] Apply tizen remote surface v4, add event filter - Some remote surface enabled applications are need to ignore some input events. - When provider applications set some input event filter, the value will be passed to the watcher application. In this case, watcher applications should check input event filter before send the input events. Change-Id: Ifd065fd2bc9ee467cdcbd7e30131a5a22ab15254 Signed-off-by: Daehyeon Jung --- .../include/screen_connector_provider.h | 21 +++++++- .../src/screen_connector_provider.c | 58 ++++++++++++++++------ .../include/screen_connector_watcher.h | 16 ++++++ .../src/screen_connector_watcher.c | 31 ++++++++++++ .../src/screen_connector_watcher_evas.c | 24 +++++++++ 5 files changed, 135 insertions(+), 15 deletions(-) diff --git a/screen_connector_provider/include/screen_connector_provider.h b/screen_connector_provider/include/screen_connector_provider.h index 05d20ed..a516a59 100644 --- a/screen_connector_provider/include/screen_connector_provider.h +++ b/screen_connector_provider/include/screen_connector_provider.h @@ -16,12 +16,31 @@ #ifndef __SCREEN_CONNECTOR_PROVIDER_H__ #define __SCREEN_CONNECTOR_PROVIDER_H__ -#include +#include +#include #ifdef __cplusplus extern "C" { #endif + +typedef enum { + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_UP_DOWN, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_Y, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X_Y, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_WHEEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_WHEEL_ALL, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_UP_DOWN, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_Y, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X_Y, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_CANCEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_CANCEL_ALL, + SCREEN_CONNECTOR_INPUT_TYPE_KEY = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_KEY_ALL, +} screen_connector_input_type_e; + +typedef struct screen_connector_provider_s *screen_connector_provider_h; int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface); +screen_connector_provider_h screen_connector_provider_create(const char *id, struct wl_surface *surface); +int screen_connector_provider_set_event_filter(screen_connector_provider_h provider, unsigned int filter); int screen_connector_provider_init(void); int screen_connector_provider_fini(void); diff --git a/screen_connector_provider/src/screen_connector_provider.c b/screen_connector_provider/src/screen_connector_provider.c index 288804b..9213c39 100644 --- a/screen_connector_provider/src/screen_connector_provider.c +++ b/screen_connector_provider/src/screen_connector_provider.c @@ -38,7 +38,7 @@ static int __init_count; static struct tizen_remote_surface_manager *__rsm; -struct __remote_surface_s { +struct screen_connector_provider_s { struct wl_surface *surface; struct tizen_remote_surface_provider *rsp; char *id; @@ -53,7 +53,7 @@ static void __rsp_resource_id_cb(void *data, struct tizen_remote_surface_provide static void __rsp_visibility_cb(void *data, struct tizen_remote_surface_provider *provider, uint32_t visibility) { - struct __remote_surface_s *remote = (struct __remote_surface_s *)data; + struct screen_connector_provider_s *remote = (struct screen_connector_provider_s *)data; Ecore_Wl_Event_Window_Visibility_Change *ev; ev = calloc(1, sizeof(Ecore_Wl_Event_Window_Visibility_Change)); @@ -79,31 +79,31 @@ static const struct tizen_remote_surface_provider_listener __rsp_listener = { __rsp_visibility_cb, }; -EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface) +EXPORT_API screen_connector_provider_h screen_connector_provider_create(const char *id, struct wl_surface *surface) { - struct __remote_surface_s *remote; + struct screen_connector_provider_s *remote; struct wl_display *display; if (!__rsm) { LOGE("__rsm is not ready"); - return -1; + return NULL; } if (!surface || !id) { LOGE("invalid parameter"); - return -1; + return NULL; } display = ecore_wl_display_get(); if (!display) { LOGE("Fail to get"); - return -1; + return NULL; } - remote = (struct __remote_surface_s *)malloc(sizeof(struct __remote_surface_s)); + remote = (struct screen_connector_provider_s *)malloc(sizeof(struct screen_connector_provider_s)); if (!remote) { LOGE("out of memory"); - return -1; + return NULL; } remote->surface = surface; @@ -111,27 +111,56 @@ EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl if (!remote->win) { LOGE("failed to find win"); free(remote); - return -1; + return NULL; } remote->rsp = tizen_remote_surface_manager_create_provider(__rsm, surface); if (!remote->rsp) { LOGE("failed to create provider"); free(remote); - return -1; + return NULL; } remote->id = strdup(id); if (!remote->id) { free(remote); LOGE("out of memory"); - return -1; + return NULL; } tizen_remote_surface_provider_add_listener(remote->rsp, &__rsp_listener, remote); wl_display_roundtrip(display); - LOGD("%d surface remote enable"); + LOGD("surface remote enabled"); + + return remote; +} + +EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl_surface *surface) +{ + screen_connector_provider_h handle; + + handle = screen_connector_provider_create(id, surface); + if (handle) + return 0; + + return -1; +} + +EXPORT_API int screen_connector_provider_set_event_filter(screen_connector_provider_h provider, unsigned int filter) +{ + if (!provider) { + LOGE("invalid arguments"); + return -1; + } + + if (tizen_remote_surface_provider_get_version(provider->rsp) < + TIZEN_REMOTE_SURFACE_PROVIDER_SET_INPUT_EVENT_FILTER_SINCE_VERSION) { + LOGE("unsupported operation"); + return -1; + } + + tizen_remote_surface_provider_set_input_event_filter(provider->rsp, filter); return 0; } @@ -159,7 +188,8 @@ EXPORT_API int screen_connector_provider_init(void) EINA_INLIST_FOREACH(globals, global) { if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, - &tizen_remote_surface_manager_interface, 1); + &tizen_remote_surface_manager_interface, + global->version < 4 ? global->version : 4); } } diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index 223b850..e9a7d17 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -23,6 +23,20 @@ extern "C" { #endif +typedef enum { + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_UP_DOWN, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_Y, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_MOVE_X_Y, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_WHEEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_MOUSE_WHEEL_ALL, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_UP_DOWN = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_UP_DOWN, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_Y, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_MOVE_X_Y = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_MOVE_X_Y, + SCREEN_CONNECTOR_INPUT_TYPE_TOUCH_CANCEL = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_TOUCH_CANCEL_ALL, + SCREEN_CONNECTOR_INPUT_TYPE_KEY = TIZEN_REMOTE_SURFACE_INPUT_EVENT_FILTER_KEY_ALL, +} screen_connector_input_type_e; + typedef void (*screen_connector_watcher_update_cb)(struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time, void *data); typedef void (*screen_connector_watcher_missing_cb)(struct tizen_remote_surface *trs, void *data); typedef void (*screen_connector_watcher_change_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, @@ -45,6 +59,8 @@ 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); +unsigned int screen_connector_watcher_get_event_filter(screen_connector_watcher_h h); +int screen_connector_watcher_check_input_disabled(screen_connector_watcher_h h, screen_connector_input_type_e input); 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 dfec938..78cf107 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -42,6 +42,7 @@ struct _screen_connector_watcher_h { int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data); void *data; struct tizen_remote_surface *surface; + unsigned int event_filter; int resource_id; }; @@ -80,10 +81,21 @@ static void __buffer_changed(void *data, struct tizen_remote_surface *trs, uint3 watcher_h->change_cb(trs, type, tbm, img_file_fd, img_file_size, time, keys, watcher_h->data); } +static void __input_event_filter(void *data, struct tizen_remote_surface *trs, uint32_t event_filter) +{ + screen_connector_watcher_h watcher_h = (screen_connector_watcher_h)data; + + if (watcher_h) + watcher_h->event_filter = event_filter; + + LOGD("event filter updated:%d", event_filter); +} + static const struct tizen_remote_surface_listener __rs_listener = { __buffer_updated, __buffer_missing, __buffer_changed, + __input_event_filter, }; static void __app_removed(const char *appid, const int pid, void *data) @@ -346,3 +358,22 @@ EXPORT_API struct tizen_remote_surface *screen_connector_watcher_get_trs(screen_ return h->surface; } + +EXPORT_API unsigned int screen_connector_watcher_get_event_filter(screen_connector_watcher_h h) +{ + if (h == NULL) + return 0; + + return h->event_filter; +} + +EXPORT_API int screen_connector_watcher_check_input_disabled(screen_connector_watcher_h h, + screen_connector_input_type_e input) +{ + if (h == NULL) { + LOGE("inavlid argument"); + return -1; + } + + return ((h->event_filter & input) > 0); +} 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 c44a18b..b7803f4 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -172,6 +172,12 @@ static void __rs_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *even if (desc == NULL) desc = ""; + if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN)) { + LOGD("mouse down disabled"); + return; + } + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); tizen_remote_surface_transfer_mouse_event(surface, TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN, @@ -207,6 +213,12 @@ static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_ if (desc == NULL) desc = ""; + if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_UP_DOWN)) { + LOGD("mouse up disabled"); + return; + } + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); tizen_remote_surface_transfer_mouse_event(surface, TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, @@ -242,6 +254,12 @@ static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *even if (desc == NULL) desc = ""; + if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_MOVE_X_Y)) { + LOGD("mouse move disabled"); + return; + } + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); tizen_remote_surface_transfer_mouse_event(surface, TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE, @@ -271,6 +289,12 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve if (desc == NULL) desc = ""; + if (screen_connector_watcher_check_input_disabled(watcher_evas_h->watcher_h, + SCREEN_CONNECTOR_INPUT_TYPE_MOUSE_WHEEL)) { + LOGD("mouse wheel disabled"); + return; + } + surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); tizen_remote_surface_transfer_mouse_wheel(surface, ev->direction, -- 2.7.4 From 1a7a5d000173a1dbefbdfc2b97dd44b4de9a382b Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 17 Feb 2017 15:26:32 +0900 Subject: [PATCH 16/16] Fix screen_connector_watcher_remove API bug Widget app died after screen watcher handle freed, viewer crashed because of freed data. Change-Id: I7aef5e6b6b2dcf09cb2bdd04c7d38d016dedc936 Signed-off-by: Hyunho Kang (cherry picked from commit 53c7ae3a7c9570341c5b22f0b65fa572422eeac4) --- .../src/screen_connector_watcher.c | 13 +++++- .../src/screen_connector_watcher_evas.c | 52 ++++++++++++++++------ 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index 78cf107..ad29f4e 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -250,8 +250,15 @@ static void __destroy_watcher_h(screen_connector_watcher_h handle) if (!handle) return; - if (handle->appid) + tizen_remote_surface_set_user_data(handle->surface, NULL); + tizen_remote_surface_unredirect(handle->surface); + tizen_remote_surface_destroy(handle->surface); + handle->surface = NULL; + + if (handle->appid) { free(handle->appid); + handle->appid = NULL; + } free(handle); } @@ -308,6 +315,10 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connec EXPORT_API int screen_connector_watcher_remove(screen_connector_watcher_h h) { + if (h == NULL) { + LOGE("screen_connector_watcher_h is NULL"); + return -1; + } __destroy_watcher_h(h); return 0; 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 b7803f4..5966e2b 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -50,15 +50,6 @@ static Evas_Object *__viewer_win; static Ecore_Event_Handler *__visibility_listener; static GHashTable *__watcher_tbl; -static void __destroy_watcher_evas_handle(screen_connector_watcher_evas_h h) -{ - if (!h) - return; - free(h->ops); - free(h); - h = NULL; -} - EXPORT_API int screen_connector_watcher_evas_init(Evas_Object *win) { __viewer_win = win; @@ -179,6 +170,11 @@ static void __rs_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *even } surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return; + } + tizen_remote_surface_transfer_mouse_event(surface, TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN, 0, @@ -220,6 +216,11 @@ static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_ } surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return; + } + tizen_remote_surface_transfer_mouse_event(surface, TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP, 0, @@ -261,6 +262,11 @@ static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *even } surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return; + } + tizen_remote_surface_transfer_mouse_event(surface, TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE, 0, @@ -296,6 +302,11 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve } surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return; + } + tizen_remote_surface_transfer_mouse_wheel(surface, ev->direction, ev->z, @@ -483,8 +494,10 @@ static void __free_watcher_evas_h(screen_connector_watcher_evas_h watcher_evas_h watcher_evas_h->img_tbm = NULL; } - if (watcher_evas_h->ops) + if (watcher_evas_h->ops) { free(watcher_evas_h->ops); + watcher_evas_h->ops = NULL; + } free(watcher_evas_h); } @@ -515,6 +528,7 @@ static void __watcher_missing_cb(struct tizen_remote_surface *trs, void *data) watcher_evas_h->ops->removed(appid, watcher_evas_h->img_tbm, watcher_evas_h->data); else watcher_evas_h->ops->removed(appid, watcher_evas_h->img_file, watcher_evas_h->data); + __free_watcher_evas_h(watcher_evas_h); } @@ -551,11 +565,11 @@ EXPORT_API screen_connector_watcher_evas_h screen_connector_watcher_evas_add(scr EXPORT_API int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h handle) { - int ret; + if (handle == NULL) + return -1; - ret = screen_connector_watcher_remove(handle->watcher_h); - __destroy_watcher_evas_handle(handle); - return ret; + __free_watcher_evas_h(handle); + return 0; } EXPORT_API int screen_connector_watcher_evas_update(const char *appid) @@ -674,6 +688,11 @@ EXPORT_API int screen_connector_watcher_evas_send_mouse_up(Evas_Object *obj) } surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return -1; + } + evas_object_geometry_get(obj, &x, &y, &w, &h); timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff); tizen_remote_surface_transfer_mouse_event(surface, @@ -707,6 +726,11 @@ EXPORT_API int screen_connector_watcher_evas_send_touch_cancel(Evas_Object *obj) if (watcher_evas_h->img_tbm) { surface = screen_connector_watcher_get_trs(watcher_evas_h->watcher_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return -1; + } + tizen_remote_surface_transfer_touch_cancel(surface); watcher_evas_h->cancel_touch = true; } else { -- 2.7.4