From acf380a217578c085f28fa13b10f8cba00f5ae53 Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Wed, 26 Apr 2017 14:08:33 +0900 Subject: [PATCH 01/16] Delay resuming time - This patch allows some widgets to postpone getting resuming callback - If widgets change the visibility repeatedly, the performance will not be good - Added API will help to adjust the delayed resuming time - By default, the delayed resuming time is 0 Change-Id: I87edb61a7706bd0abf28fe63c9289c56635d64e5 Signed-off-by: Junghoon Park --- .../include/screen_connector_toolkit_evas.h | 1 + .../src/screen_connector_toolkit_evas.c | 51 +++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h index d0d4a89..b1ae572 100644 --- a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h @@ -65,6 +65,7 @@ int screen_connector_toolkit_evas_init(Evas_Object *win, screen_connector_screen int screen_connector_toolkit_evas_fini(screen_connector_screen_type_e type); screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add(screen_connector_toolkit_evas_ops *ops, char *id, screen_connector_screen_type_e type, void *data); +int screen_connector_toolkit_evas_set_delayed_resuming_time(int ms); int screen_connector_toolkit_evas_remove(screen_connector_toolkit_evas_h handle); int screen_connector_toolkit_evas_update(const char *appid, const char *instance_id); int screen_connector_toolkit_evas_start_visibility_notify(void); diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index cb9b226..d53e0ed 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -52,11 +52,13 @@ struct _screen_connector_toolkit_evas_h { uint32_t img_type; struct wl_buffer *pre_buffer; struct _screen_connector_type_evas_h *type_h; + guint resuming_timer; void *data; }; static GHashTable *__type_table = NULL; static Ecore_Event_Handler *__visibility_listener; +static int __delayed_resuming_time; static void __destroy_type_h(gpointer data) { @@ -115,6 +117,9 @@ static void __destroy_toolkit_evas_h(gpointer data) if (toolkit_evas_h->ops) free(toolkit_evas_h->ops); + if (toolkit_evas_h->resuming_timer > 0) + g_source_remove(toolkit_evas_h->resuming_timer); + free(toolkit_evas_h); } @@ -169,6 +174,8 @@ EXPORT_API int screen_connector_toolkit_evas_fini(screen_connector_screen_type_e __type_table = NULL; } + __delayed_resuming_time = 0; + return screen_connector_toolkit_fini(type); } @@ -211,6 +218,22 @@ static bool __obj_is_visible(screen_connector_toolkit_evas_h toolkit_evas_h) return false; } +static gboolean __resuming_timeout_cb(gpointer user_data) +{ + screen_connector_toolkit_evas_h toolkit_evas_h = user_data; + struct tizen_remote_surface *surface; + + surface = screen_connector_toolkit_get_trs(toolkit_evas_h->toolkit_h); + if (surface) { + tizen_remote_surface_transfer_visibility(surface, + TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE); + } + + toolkit_evas_h->resuming_timer = 0; + + return G_SOURCE_REMOVE; +} + static int __set_visibility(screen_connector_toolkit_evas_h toolkit_evas_h, visibility_type type) { int obscured; @@ -234,9 +257,28 @@ static int __set_visibility(screen_connector_toolkit_evas_h toolkit_evas_h, visi } surface = screen_connector_toolkit_get_trs(toolkit_evas_h->toolkit_h); - if (surface) + if (!surface) + return -1; + + if (__delayed_resuming_time == 0) { tizen_remote_surface_transfer_visibility(surface, obscured); + return 0; + } + + if (obscured == TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_INVISIBLE) { + if (toolkit_evas_h->resuming_timer > 0) { + g_source_remove(toolkit_evas_h->resuming_timer); + toolkit_evas_h->resuming_timer = 0; + } + tizen_remote_surface_transfer_visibility(surface, obscured); + } else { + if (toolkit_evas_h->resuming_timer == 0) { + toolkit_evas_h->resuming_timer = g_timeout_add(__delayed_resuming_time, + __resuming_timeout_cb, toolkit_evas_h); + } + } + return 0; } @@ -600,6 +642,13 @@ static void __toolkit_removed_cb(const char *appid, const char *instance_id, con g_hash_table_remove(toolkit_evas_h->type_h->toolkit_table, instance_id); } +EXPORT_API int screen_connector_toolkit_evas_set_delayed_resuming_time(int ms) +{ + __delayed_resuming_time = ms; + + return 0; +} + EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_with_win(screen_connector_toolkit_evas_ops *ops, char *id, screen_connector_screen_type_e type, Evas_Object *win, void *data) { -- 2.7.4 From 18498e0b1b8785ccbfbec95a1958aed1511f8306 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 12 May 2017 09:57:35 +0900 Subject: [PATCH 02/16] Add mouse in/out handling logic Change-Id: I4b87825c3bfb29851b1a12430c26da22245b2159 Signed-off-by: Hyunho Kang --- .../src/screen_connector_toolkit_evas.c | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index d53e0ed..b4bf4fe 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -468,6 +468,80 @@ static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *eve ev->timestamp); } +static void __rs_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + screen_connector_toolkit_evas_h toolkit_evas_h = (screen_connector_toolkit_evas_h)data; + Evas_Event_Mouse_In *ev = event_info; + const char *desc = evas_device_description_get(ev->dev); + int x; + int y; + int w; + int h; + struct tizen_remote_surface *surface; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + LOGD("mouse in: %d %d", ev->canvas.x - x, ev->canvas.y - y); + + if (desc == NULL) + desc = ""; + + surface = screen_connector_toolkit_get_trs(toolkit_evas_h->toolkit_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return; + } + + tizen_remote_surface_transfer_mouse_event( + surface, + TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_IN, + 0, + 0, + ev->canvas.x - x, + ev->canvas.y - y, + 0, + 0, + 0, + 0, + evas_device_class_get(ev->dev), + evas_device_subclass_get(ev->dev), + desc, + ev->timestamp); +} + +static void __rs_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + screen_connector_toolkit_evas_h toolkit_evas_h = (screen_connector_toolkit_evas_h)data; + Evas_Event_Mouse_Out *ev = event_info; + const char *desc = evas_device_description_get(ev->dev); + struct tizen_remote_surface *surface; + + LOGD("mouse out"); + if (desc == NULL) + desc = ""; + + surface = screen_connector_toolkit_get_trs(toolkit_evas_h->toolkit_h); + if (surface == NULL) { + LOGE("surface is NULL"); + return; + } + + tizen_remote_surface_transfer_mouse_event( + surface, + TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_OUT, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + evas_device_class_get(ev->dev), + evas_device_subclass_get(ev->dev), + desc, + ev->timestamp); +} + static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info) { LOGD("show"); @@ -521,6 +595,12 @@ static void __toolkit_update_cb(struct tizen_remote_surface *trs, uint32_t type, EVAS_CALLBACK_MOUSE_WHEEL, __rs_cb_mouse_wheel, toolkit_evas_h); evas_object_event_callback_add(toolkit_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_IN, + __rs_cb_mouse_in, toolkit_evas_h); + evas_object_event_callback_add(toolkit_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_OUT, + __rs_cb_mouse_out, toolkit_evas_h); + evas_object_event_callback_add(toolkit_evas_h->img_tbm, EVAS_CALLBACK_SHOW, __rs_cb_show, toolkit_evas_h); evas_object_event_callback_add(toolkit_evas_h->img_tbm, -- 2.7.4 From c9c6c1722a0bc848f213c130c7987f12030a5055 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 12 May 2017 10:36:56 +0900 Subject: [PATCH 03/16] Release version 1.2.1 Changes: - Delay resuming time - Add mouse in/out handling logic Change-Id: Ib12d1df12113aee95136c485a4bc3167c655d4c2 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 b22c29d..aed9486 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.2.0 +Version: 1.2.1 Release: 1 Group: Applications/Core Applications License: Apache-2.0 -- 2.7.4 From fcefc9d15e719d27fcc34919d2fd2eca079259fc Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Tue, 16 May 2017 11:18:24 +0900 Subject: [PATCH 04/16] Add APIs to control visibility Change-Id: I901d56fce6ab6703f865388fd361157b374f82d6 Signed-off-by: Junghoon Park --- .../include/screen_connector_toolkit_evas.h | 1 + .../src/screen_connector_toolkit_evas.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h index b1ae572..7cd665d 100644 --- a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h @@ -72,6 +72,7 @@ int screen_connector_toolkit_evas_start_visibility_notify(void); int screen_connector_toolkit_evas_stop_visibility_notify(void); int screen_connector_toolkit_evas_freeze_visibility(Evas_Object *obj, visibility_type type); int screen_connector_toolkit_evas_thaw_visibility(Evas_Object *obj); +int screen_connector_toolkit_evas_send_visibility(Evas_Object *obj, visibility_type type); int screen_connector_toolkit_evas_send_mouse_up(Evas_Object *obj); int screen_connector_toolkit_evas_send_touch_cancel(Evas_Object *obj); diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index b4bf4fe..856d363 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -959,6 +959,19 @@ EXPORT_API int screen_connector_toolkit_evas_thaw_visibility(Evas_Object *obj) return 0; } +EXPORT_API int screen_connector_toolkit_evas_send_visibility(Evas_Object *obj, visibility_type type) +{ + screen_connector_toolkit_evas_h toolkit_evas_h; + + toolkit_evas_h = __find_toolkit_evas_h(obj); + if (!toolkit_evas_h) { + LOGE("obj not found"); + return -1; + } + + return __set_visibility(toolkit_evas_h, type); +} + EXPORT_API int screen_connector_toolkit_evas_send_mouse_up(Evas_Object *obj) { screen_connector_toolkit_evas_h toolkit_evas_h; -- 2.7.4 From 9aa15f9d996452848326df4430976c982842823c Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Thu, 18 May 2017 17:14:45 +0900 Subject: [PATCH 05/16] Release version 1.2.2 Changes: - Add APIs to control visibility Change-Id: I4d335bf69a6087c8170492801b0209881e82e7d8 Signed-off-by: Junghoon Park --- 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 aed9486..38d630e 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.2.1 +Version: 1.2.2 Release: 1 Group: Applications/Core Applications License: Apache-2.0 -- 2.7.4 From 90bac99e6166992f06a86ea370c13583314e21d1 Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Thu, 11 May 2017 14:09:39 +0900 Subject: [PATCH 06/16] Add APIs for binding and unbinding window Change-Id: I0ae4e1aaff04896400047ed9867fd5c75f823cb6 Signed-off-by: Junghoon Park --- .../include/screen_connector_toolkit.h | 3 ++ .../src/screen_connector_toolkit.c | 34 ++++++++++++++++++++++ .../include/screen_connector_toolkit_evas.h | 3 ++ .../src/screen_connector_toolkit_evas.c | 34 ++++++++++++++++++++++ 4 files changed, 74 insertions(+) diff --git a/screen_connector_watcher/include/screen_connector_toolkit.h b/screen_connector_watcher/include/screen_connector_toolkit.h index 39968b1..8b8a80d 100644 --- a/screen_connector_watcher/include/screen_connector_toolkit.h +++ b/screen_connector_watcher/include/screen_connector_toolkit.h @@ -81,6 +81,9 @@ int screen_connector_toolkit_redirect_surface(screen_connector_toolkit_h info); screen_connector_toolkit_h screen_connector_toolkit_add_with_surface(screen_connector_toolkit_ops *ops, char *id, screen_connector_screen_type_e type, struct wl_surface *surface, void *data); +int screen_connector_toolkit_bind(screen_connector_toolkit_h h, struct wl_surface *surface); +int screen_connector_toolkit_unbind(screen_connector_toolkit_h h); + #ifdef __cplusplus } #endif diff --git a/screen_connector_watcher/src/screen_connector_toolkit.c b/screen_connector_watcher/src/screen_connector_toolkit.c index 3a36df2..d1747b2 100644 --- a/screen_connector_watcher/src/screen_connector_toolkit.c +++ b/screen_connector_watcher/src/screen_connector_toolkit.c @@ -474,3 +474,37 @@ EXPORT_API struct tizen_remote_surface *screen_connector_toolkit_get_trs(screen_ return h->surface; } + +EXPORT_API int screen_connector_toolkit_bind(screen_connector_toolkit_h h, + struct wl_surface *surface) +{ + struct tizen_remote_surface_manager *rsm = screen_connector_get_rsm(); + + if (!h || !rsm || !(h->surface)) { + LOGE("invalid argument %p %p", h, rsm); + + return -1; + } + + tizen_remote_surface_manager_bind_surface(rsm, surface, h->surface); + + return 0; +} + +EXPORT_API int screen_connector_toolkit_unbind(screen_connector_toolkit_h h) +{ + struct tizen_remote_surface_manager *rsm = screen_connector_get_rsm(); + + if (!h || !rsm || !(h->surface)) { + LOGE("invalid argument %p %p", h, rsm); + + return -1; + } + + tizen_remote_surface_manager_bind_surface(rsm, NULL, h->surface); + tizen_remote_surface_redirect(h->surface); + + return 0; +} + + diff --git a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h index 7cd665d..95ed241 100644 --- a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h @@ -75,6 +75,9 @@ int screen_connector_toolkit_evas_thaw_visibility(Evas_Object *obj); int screen_connector_toolkit_evas_send_visibility(Evas_Object *obj, visibility_type type); int screen_connector_toolkit_evas_send_mouse_up(Evas_Object *obj); int screen_connector_toolkit_evas_send_touch_cancel(Evas_Object *obj); +int screen_connector_toolkit_evas_bind(screen_connector_toolkit_evas_h h, Evas_Object *win); +int screen_connector_toolkit_evas_unbind(screen_connector_toolkit_evas_h h); + /** * @brief Add screen connector toolkit by rid. diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index 856d363..631b767 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -1126,3 +1126,37 @@ EXPORT_API int screen_connector_toolkit_evas_get_pid(Evas_Object *obj, int *pid) return 0; } + +EXPORT_API int screen_connector_toolkit_evas_bind(screen_connector_toolkit_evas_h h, + Evas_Object *win) +{ + struct wl_surface *surface; + Ecore_Wl_Window *wl_win; + + if (!h) + return -1; + + wl_win = elm_win_wl_window_get(win); + if (!wl_win) { + LOGE("failed to get wl_win"); + return -1; + } + + surface = ecore_wl_window_surface_get(wl_win); + if (!surface) { + LOGE("failed to get surface"); + return -1; + } + + return screen_connector_toolkit_bind(h->toolkit_h, surface); +} + +EXPORT_API int screen_connector_toolkit_evas_unbind(screen_connector_toolkit_evas_h h) +{ + if (!h || !(h->toolkit_h)) { + LOGE("invalid argument %p", h); + return -1; + } + + return screen_connector_toolkit_unbind(h->toolkit_h); +} -- 2.7.4 From 22c053a2c63f4ae10027a3ef842eaf569b810f2e Mon Sep 17 00:00:00 2001 From: Junghoon Park Date: Fri, 19 May 2017 11:14:42 +0900 Subject: [PATCH 07/16] Release version 1.2.3 Changes: - Add APIs for binding and unbinding window Change-Id: If2734a40b1a13768e2020343a1a95623348c737b Signed-off-by: Junghoon Park --- 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 38d630e..76e9979 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.2.2 +Version: 1.2.3 Release: 1 Group: Applications/Core Applications License: Apache-2.0 -- 2.7.4 From e8a3bca0355fc7bc735876529aebcb55cab78839 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Thu, 25 May 2017 19:36:43 +0900 Subject: [PATCH 08/16] Add buffer changed event filter Some watcher application like task-manager want to receive only file type update event. Using these APIs developer can filter update event. - screen_connector_watcher_set_changed_event_filter - screen_connector_watcher_evas_set_changed_event_filter Change-Id: I773f6817d3ab6c2ac58941b1948940daaed90976 Signed-off-by: Hyunho Kang --- .../include/screen_connector_watcher.h | 10 ++++++++ .../src/screen_connector_trs.c | 2 +- .../src/screen_connector_watcher.c | 30 ++++++++++++++++++++++ .../include/screen_connector_watcher_evas.h | 9 +++++++ .../src/screen_connector_watcher_evas.c | 5 ++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index 31d6b85..b2b4816 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -23,6 +23,14 @@ extern "C" { #endif +typedef enum { + SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_NONE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_NONE, + SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_TBM = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM, + SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_IMAGE_FILE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, + SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_ALL = + TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM | TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, +} screen_connector_changed_event_filter_type; + typedef void (*screen_connector_watcher_added_cb)(const char *appid, const char *instance_id, const int pid, void *data); typedef void (*screen_connector_watcher_removed_cb)(const char *appid, const char *instance_id, const int pid, void *data); typedef void (*screen_connector_watcher_update_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, @@ -53,6 +61,8 @@ int screen_connector_watcher_set_resource_id(screen_connector_watcher_h h, int r 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); int screen_connector_watcher_redirect_surface(screen_connector_info_h info); +int screen_connector_watcher_set_changed_event_filter(screen_connector_watcher_h h, + screen_connector_changed_event_filter_type type); #ifdef __cplusplus } diff --git a/screen_connector_watcher/src/screen_connector_trs.c b/screen_connector_watcher/src/screen_connector_trs.c index fedb303..548fcc1 100644 --- a/screen_connector_watcher/src/screen_connector_trs.c +++ b/screen_connector_watcher/src/screen_connector_trs.c @@ -72,7 +72,7 @@ int screen_connector_trs_init(void) if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, &tizen_remote_surface_manager_interface, - global->version < 4 ? global->version : 4); + global->version < 5 ? global->version : 5); } } diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index 02bd07b..e78a339 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -43,6 +43,7 @@ struct _screen_connector_watcher_h { void *data; GHashTable *info_table; aul_screen_viewer_h aul_handle; + screen_connector_changed_event_filter_type changed_filter; }; struct _screen_connector_info_h { @@ -54,6 +55,7 @@ struct _screen_connector_info_h { struct tizen_remote_surface *surface; bool renderable; void *data; + screen_connector_changed_event_filter_type changed_filter; }; static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time) @@ -106,6 +108,8 @@ EXPORT_API int screen_connector_watcher_redirect_surface(screen_connector_info_h LOGD("resource_id : %d, (%p)", info->surface_id, info->surface); tizen_remote_surface_add_listener(info->surface, &__rs_listener, info); tizen_remote_surface_redirect(info->surface); + tizen_remote_surface_set_buffer_changed_event_filter(info->surface, info->changed_filter); + LOGD("set filter [%d] for [%s]", info->changed_filter, info->instance_id); return 0; } @@ -158,6 +162,7 @@ static void __aul_screen_viewer_cb(const char *appid, const char *instance_id, info->ops = watcher_h->ops; info->data = watcher_h->data; info->renderable = false; + info->changed_filter = watcher_h->changed_filter; if (event_type == AUL_SCREEN_CONNECTOR_EVENT_TYPE_ADD) { @@ -228,6 +233,7 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connec LOGE("watcher_h calloc fail"); return NULL; } + watcher_h->changed_filter = SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_ALL; watcher_h->data = data; watcher_h->ops = ops; watcher_h->info_table = g_hash_table_new_full(g_str_hash, @@ -301,3 +307,27 @@ EXPORT_API void *screen_connector_watcher_get_user_data(screen_connector_info_h { return h->data; } + +EXPORT_API int screen_connector_watcher_set_changed_event_filter(screen_connector_watcher_h h, + screen_connector_changed_event_filter_type type) +{ + GHashTableIter iter; + gpointer key, value; + screen_connector_info_h info; + + if (h == NULL || h->info_table == NULL) { + LOGE("Invalid param"); + return -1; + } + + g_hash_table_iter_init(&iter, h->info_table); + while (g_hash_table_iter_next(&iter, &key, &value)) { + info = (screen_connector_info_h)value; + LOGD("set filter [%d] for [%s]", type, info->instance_id); + tizen_remote_surface_set_buffer_changed_event_filter(info->surface, type); + } + + h->changed_filter = type; + + return 0; +} 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 75959dd..d1e67d8 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -36,6 +36,13 @@ extern "C" { * @addtogroup CAPI_SCREEN_CONNECTOR_WATCHER_EVAS_MODULE * @{ */ +typedef enum { + SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_NONE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_NONE, + SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_TBM = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM, + SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_IMAGE_FILE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, + SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_ALL = + TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM | TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, +} screen_connector_evas_changed_event_filter_type; typedef void (*screen_connector_watcher_evas_added_cb)(const char *appid, const char *instance_id, const int pid, void *data); typedef void (*screen_connector_watcher_evas_removed_cb)(const char *appid, const char *instance_id, const int pid, void *data); @@ -55,6 +62,8 @@ int screen_connector_watcher_evas_fini(void); screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connector_watcher_evas_ops *ops, void *data); int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h h); int screen_connector_watcher_evas_update(screen_connector_watcher_evas_h watcher_evas_h, const char *instance_id); +int screen_connector_watcher_evas_set_changed_event_filter(screen_connector_watcher_evas_h watcher_evas_h, + screen_connector_evas_changed_event_filter_type type); /** * @} 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 0e4d177..b39b4cf 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -302,3 +302,8 @@ EXPORT_API int screen_connector_watcher_evas_update(screen_connector_watcher_eva return screen_connector_watcher_update(watcher_evas_h->watcher_h, instance_id); } +EXPORT_API int screen_connector_watcher_evas_set_changed_event_filter(screen_connector_watcher_evas_h watcher_evas_h, + screen_connector_evas_changed_event_filter_type type) +{ + return screen_connector_watcher_set_changed_event_filter(watcher_evas_h->watcher_h, type); +} -- 2.7.4 From 302617dcdd84c0d7c0c7cffc60a9ee4960169d2b Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 26 May 2017 10:58:50 +0900 Subject: [PATCH 09/16] Move unversioned so file to devel package Unversioned so file is not needed at runtime. It is only used at build time. Change-Id: I9577e22b392145460c5cb36e4a155d5563561134 Signed-off-by: Hyunho Kang --- packaging/libscreen_connector.spec | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packaging/libscreen_connector.spec b/packaging/libscreen_connector.spec index 76e9979..a904f0f 100644 --- a/packaging/libscreen_connector.spec +++ b/packaging/libscreen_connector.spec @@ -69,12 +69,13 @@ Header & package configuration files to support development of the widget viewer %files -n %{name}_watcher %manifest %{name}_watcher.manifest -%attr(0644,root,root) %{_libdir}/%{name}_watcher.so* +%attr(0644,root,root) %{_libdir}/%{name}_watcher.so.* %license LICENSE %files -n %{name}_watcher-devel %{_includedir}/screen_connector_watcher/*.h %{_libdir}/pkgconfig/screen_connector_watcher.pc +%attr(0644,root,root) %{_libdir}/%{name}_watcher.so ################################################# @@ -101,12 +102,13 @@ Header & package configuration files to support development of the widget viewer %files -n %{name}_provider %manifest %{name}_provider.manifest -%attr(0644,root,root) %{_libdir}/%{name}_provider.so* +%attr(0644,root,root) %{_libdir}/%{name}_provider.so.* %license LICENSE %files -n %{name}_provider-devel %{_includedir}/screen_connector_provider/*.h %{_libdir}/pkgconfig/screen_connector_provider.pc +%attr(0644,root,root) %{_libdir}/%{name}_provider.so ################################################# @@ -133,12 +135,13 @@ Header & package configuration files to support development of the widget viewer %files -n %{name}_watcher_evas %manifest %{name}_watcher_evas.manifest -%attr(0644,root,root) %{_libdir}/%{name}_watcher_evas.so* +%attr(0644,root,root) %{_libdir}/%{name}_watcher_evas.so.* %license LICENSE %files -n %{name}_watcher_evas-devel %{_includedir}/screen_connector_watcher_evas/*.h %{_libdir}/pkgconfig/screen_connector_watcher_evas.pc +%attr(0644,root,root) %{_libdir}/%{name}_watcher_evas.so # End of a file -- 2.7.4 From ccbbd8ee1c6b87fe36907ca4b4d6f3fd56c62ace Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Thu, 1 Jun 2017 00:56:38 +0000 Subject: [PATCH 10/16] Revert "Add buffer changed event filter" This reverts commit e8a3bca0355fc7bc735876529aebcb55cab78839. Change-Id: I16e93b0a732792aafbc40fcdb1efbeac63241cc4 --- .../include/screen_connector_watcher.h | 10 -------- .../src/screen_connector_trs.c | 2 +- .../src/screen_connector_watcher.c | 30 ---------------------- .../include/screen_connector_watcher_evas.h | 9 ------- .../src/screen_connector_watcher_evas.c | 5 ---- 5 files changed, 1 insertion(+), 55 deletions(-) diff --git a/screen_connector_watcher/include/screen_connector_watcher.h b/screen_connector_watcher/include/screen_connector_watcher.h index b2b4816..31d6b85 100644 --- a/screen_connector_watcher/include/screen_connector_watcher.h +++ b/screen_connector_watcher/include/screen_connector_watcher.h @@ -23,14 +23,6 @@ extern "C" { #endif -typedef enum { - SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_NONE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_NONE, - SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_TBM = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM, - SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_IMAGE_FILE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, - SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_ALL = - TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM | TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, -} screen_connector_changed_event_filter_type; - typedef void (*screen_connector_watcher_added_cb)(const char *appid, const char *instance_id, const int pid, void *data); typedef void (*screen_connector_watcher_removed_cb)(const char *appid, const char *instance_id, const int pid, void *data); typedef void (*screen_connector_watcher_update_cb)(struct tizen_remote_surface *trs, uint32_t type, struct wl_buffer *tbm, @@ -61,8 +53,6 @@ int screen_connector_watcher_set_resource_id(screen_connector_watcher_h h, int r 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); int screen_connector_watcher_redirect_surface(screen_connector_info_h info); -int screen_connector_watcher_set_changed_event_filter(screen_connector_watcher_h h, - screen_connector_changed_event_filter_type type); #ifdef __cplusplus } diff --git a/screen_connector_watcher/src/screen_connector_trs.c b/screen_connector_watcher/src/screen_connector_trs.c index 548fcc1..fedb303 100644 --- a/screen_connector_watcher/src/screen_connector_trs.c +++ b/screen_connector_watcher/src/screen_connector_trs.c @@ -72,7 +72,7 @@ int screen_connector_trs_init(void) if (!strcmp(global->interface, "tizen_remote_surface_manager")) { __rsm = wl_registry_bind(registry, global->id, &tizen_remote_surface_manager_interface, - global->version < 5 ? global->version : 5); + global->version < 4 ? global->version : 4); } } diff --git a/screen_connector_watcher/src/screen_connector_watcher.c b/screen_connector_watcher/src/screen_connector_watcher.c index e78a339..02bd07b 100644 --- a/screen_connector_watcher/src/screen_connector_watcher.c +++ b/screen_connector_watcher/src/screen_connector_watcher.c @@ -43,7 +43,6 @@ struct _screen_connector_watcher_h { void *data; GHashTable *info_table; aul_screen_viewer_h aul_handle; - screen_connector_changed_event_filter_type changed_filter; }; struct _screen_connector_info_h { @@ -55,7 +54,6 @@ struct _screen_connector_info_h { struct tizen_remote_surface *surface; bool renderable; void *data; - screen_connector_changed_event_filter_type changed_filter; }; static void __buffer_updated(void *data, struct tizen_remote_surface *trs, struct wl_buffer *buffer, uint32_t time) @@ -108,8 +106,6 @@ EXPORT_API int screen_connector_watcher_redirect_surface(screen_connector_info_h LOGD("resource_id : %d, (%p)", info->surface_id, info->surface); tizen_remote_surface_add_listener(info->surface, &__rs_listener, info); tizen_remote_surface_redirect(info->surface); - tizen_remote_surface_set_buffer_changed_event_filter(info->surface, info->changed_filter); - LOGD("set filter [%d] for [%s]", info->changed_filter, info->instance_id); return 0; } @@ -162,7 +158,6 @@ static void __aul_screen_viewer_cb(const char *appid, const char *instance_id, info->ops = watcher_h->ops; info->data = watcher_h->data; info->renderable = false; - info->changed_filter = watcher_h->changed_filter; if (event_type == AUL_SCREEN_CONNECTOR_EVENT_TYPE_ADD) { @@ -233,7 +228,6 @@ EXPORT_API screen_connector_watcher_h screen_connector_watcher_add(screen_connec LOGE("watcher_h calloc fail"); return NULL; } - watcher_h->changed_filter = SCREEN_CONNECTOR_CHANGED_EVENT_FILTER_ALL; watcher_h->data = data; watcher_h->ops = ops; watcher_h->info_table = g_hash_table_new_full(g_str_hash, @@ -307,27 +301,3 @@ EXPORT_API void *screen_connector_watcher_get_user_data(screen_connector_info_h { return h->data; } - -EXPORT_API int screen_connector_watcher_set_changed_event_filter(screen_connector_watcher_h h, - screen_connector_changed_event_filter_type type) -{ - GHashTableIter iter; - gpointer key, value; - screen_connector_info_h info; - - if (h == NULL || h->info_table == NULL) { - LOGE("Invalid param"); - return -1; - } - - g_hash_table_iter_init(&iter, h->info_table); - while (g_hash_table_iter_next(&iter, &key, &value)) { - info = (screen_connector_info_h)value; - LOGD("set filter [%d] for [%s]", type, info->instance_id); - tizen_remote_surface_set_buffer_changed_event_filter(info->surface, type); - } - - h->changed_filter = type; - - return 0; -} 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 d1e67d8..75959dd 100644 --- a/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_watcher_evas.h @@ -36,13 +36,6 @@ extern "C" { * @addtogroup CAPI_SCREEN_CONNECTOR_WATCHER_EVAS_MODULE * @{ */ -typedef enum { - SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_NONE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_NONE, - SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_TBM = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM, - SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_IMAGE_FILE = TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, - SCREEN_CONNECTOR_EVAS_CHANGED_EVENT_FILTER_ALL = - TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_TBM | TIZEN_REMOTE_SURFACE_BUFFER_CHANGED_EVENT_FILTER_IMAGE_FILE, -} screen_connector_evas_changed_event_filter_type; typedef void (*screen_connector_watcher_evas_added_cb)(const char *appid, const char *instance_id, const int pid, void *data); typedef void (*screen_connector_watcher_evas_removed_cb)(const char *appid, const char *instance_id, const int pid, void *data); @@ -62,8 +55,6 @@ int screen_connector_watcher_evas_fini(void); screen_connector_watcher_evas_h screen_connector_watcher_evas_add(screen_connector_watcher_evas_ops *ops, void *data); int screen_connector_watcher_evas_remove(screen_connector_watcher_evas_h h); int screen_connector_watcher_evas_update(screen_connector_watcher_evas_h watcher_evas_h, const char *instance_id); -int screen_connector_watcher_evas_set_changed_event_filter(screen_connector_watcher_evas_h watcher_evas_h, - screen_connector_evas_changed_event_filter_type type); /** * @} 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 b39b4cf..0e4d177 100644 --- a/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_watcher_evas.c @@ -302,8 +302,3 @@ EXPORT_API int screen_connector_watcher_evas_update(screen_connector_watcher_eva return screen_connector_watcher_update(watcher_evas_h->watcher_h, instance_id); } -EXPORT_API int screen_connector_watcher_evas_set_changed_event_filter(screen_connector_watcher_evas_h watcher_evas_h, - screen_connector_evas_changed_event_filter_type type) -{ - return screen_connector_watcher_set_changed_event_filter(watcher_evas_h->watcher_h, type); -} -- 2.7.4 From 5616860841370bdd65cdc322ebf735199073f751 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 31 May 2017 19:26:00 +0900 Subject: [PATCH 11/16] Add object visible check API - screen_connector_toolkit_evas_is_visible Change-Id: Id8010fa0507770ea85135fcf3597032f36ca0734 Signed-off-by: Hyunho Kang --- .../include/screen_connector_toolkit_evas.h | 1 + .../src/screen_connector_toolkit_evas.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h index 95ed241..65c7724 100644 --- a/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h +++ b/screen_connector_watcher_evas/include/screen_connector_toolkit_evas.h @@ -112,6 +112,7 @@ screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_by_rid(screen_ int screen_connector_toolkit_evas_get_rid(Evas_Object *obj, int *resource_id); screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_with_win(screen_connector_toolkit_evas_ops *ops, char *id, screen_connector_screen_type_e type, Evas_Object *win, void *data); +int screen_connector_toolkit_evas_is_visible(Evas_Object *obj, bool *is_visible); /** diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index 631b767..667bcfc 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -1160,3 +1160,22 @@ EXPORT_API int screen_connector_toolkit_evas_unbind(screen_connector_toolkit_eva return screen_connector_toolkit_unbind(h->toolkit_h); } + +EXPORT_API int screen_connector_toolkit_evas_is_visible(Evas_Object *obj, bool *is_visible) +{ + screen_connector_toolkit_evas_h toolkit_evas_h; + + if (!obj) { + LOGE("invalid argument"); + return -1; + } + toolkit_evas_h = __find_toolkit_evas_h(obj); + if (!toolkit_evas_h) { + LOGE("obj not found"); + return -1; + } + + *is_visible = __obj_is_visible(toolkit_evas_h); + + return 0; +} -- 2.7.4 From 228cecf94ea5851c970bb5aba818a8c0dfd26542 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 7 Jun 2017 13:33:54 +0900 Subject: [PATCH 12/16] Replace wl_display_roundtrip with wl_display_roundtrip_queue wl_display_roundtrip API depend on ecore main loop. To support multi-thread senario we should use wl_display_roundtrip_queue Change-Id: I35e1e141f9a2304e94dba479f2b2352ec3896c06 Signed-off-by: Hyunho Kang --- .../src/screen_connector_provider.c | 45 ++++++++++++++++------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/screen_connector_provider/src/screen_connector_provider.c b/screen_connector_provider/src/screen_connector_provider.c index 70575e4..403c975 100644 --- a/screen_connector_provider/src/screen_connector_provider.c +++ b/screen_connector_provider/src/screen_connector_provider.c @@ -88,29 +88,40 @@ static const struct tizen_remote_surface_provider_listener __rsp_listener = { 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; @@ -118,28 +129,38 @@ EXPORT_API screen_connector_provider_h screen_connector_provider_create(const ch 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; } -- 2.7.4 From 9940a69146e4886652706af429b4f04c3fb9e9cc Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 7 Jun 2017 12:38:58 +0900 Subject: [PATCH 13/16] Add null check logic for object is visible API Change-Id: I708b780f892b6ac1142794a731d7a76beaf1ba12 Signed-off-by: Hyunho Kang --- screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index 667bcfc..cc2703b 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -1165,7 +1165,7 @@ EXPORT_API int screen_connector_toolkit_evas_is_visible(Evas_Object *obj, bool * { screen_connector_toolkit_evas_h toolkit_evas_h; - if (!obj) { + if (obj == NULL || is_visible == NULL) { LOGE("invalid argument"); return -1; } -- 2.7.4 From 825993a1202998f442bf9eb30e75294c200667fe Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 9 Jun 2017 11:17:24 +0900 Subject: [PATCH 14/16] Release version 1.2.4 Changes: - Add null check logic for object is visible API - Replace wl_display_roundtrip with wl_display_roundtrip_queue - Add object visible check API - Move unversioned so file to devel package Change-Id: I8126a6ee728134e56a65fe388590c1be4022359e 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 a904f0f..7fd31c3 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.2.3 +Version: 1.2.4 Release: 1 Group: Applications/Core Applications License: Apache-2.0 -- 2.7.4 From 0653f2cc5b7c305ae1db3fe1b19438156ce8ac86 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 16 Jun 2017 15:54:05 +0900 Subject: [PATCH 15/16] Remove evas callback from destroyed surface tbm Destroyed surface's tbm buffer can be remained in viewer application so we need to remove every callback from destroyed surface's tbm buffer. Change-Id: I0487f697ae506079790c333875cc8f7885452087 Signed-off-by: Hyunho Kang --- .../src/screen_connector_toolkit_evas.c | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index cc2703b..407c9f4 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -60,6 +60,15 @@ static GHashTable *__type_table = NULL; static Ecore_Event_Handler *__visibility_listener; static int __delayed_resuming_time; +static void __rs_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __rs_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __rs_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __rs_cb_show(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void __rs_cb_resize(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); + static void __destroy_type_h(gpointer data) { screen_connector_type_evas_h type_h = (screen_connector_type_evas_h)data; @@ -106,6 +115,41 @@ static void __destroy_toolkit_evas_h(gpointer data) return; if (toolkit_evas_h->img_tbm != NULL) { + + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_DOWN, + __rs_cb_mouse_down); + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_UP, + __rs_cb_mouse_up); + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_MOVE, + __rs_cb_mouse_move); + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_MOUSE_WHEEL, + __rs_cb_mouse_wheel); + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_SHOW, + __rs_cb_show); + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_HIDE, + __rs_cb_hide); + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_RESIZE, + __rs_cb_resize); + + evas_object_event_callback_del( + toolkit_evas_h->img_tbm, + EVAS_CALLBACK_MOVE, + __obj_update_visibility); + plug_id = evas_object_data_del(toolkit_evas_h->img_tbm, "___PLUGID"); if (plug_id) free(plug_id); -- 2.7.4 From 11482856d6aeb5adc9b404e0a2cfe297c0c7b13e Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Fri, 2 Jun 2017 16:34:04 +0900 Subject: [PATCH 16/16] Fix add by rid bug - Only main viewer should remove prev tbm buffer. - Resources which generated by add_by_rid should be managed Change-Id: Icf2dfdc47b131e2efd86b82aabdb1ff683d30203 Signed-off-by: Hyunho Kang --- .../include/screen_connector_toolkit.h | 4 +- .../src/screen_connector_toolkit.c | 23 +++++- .../src/screen_connector_toolkit_evas.c | 83 ++++++++++++++++++---- 3 files changed, 93 insertions(+), 17 deletions(-) diff --git a/screen_connector_watcher/include/screen_connector_toolkit.h b/screen_connector_watcher/include/screen_connector_toolkit.h index 8b8a80d..7fe718c 100644 --- a/screen_connector_watcher/include/screen_connector_toolkit.h +++ b/screen_connector_watcher/include/screen_connector_toolkit.h @@ -74,8 +74,8 @@ void *screen_connector_toolkit_get_user_data(screen_connector_toolkit_h h); unsigned int screen_connector_toolkit_get_event_filter(screen_connector_toolkit_h h); int screen_connector_toolkit_check_input_disabled(screen_connector_toolkit_h h, screen_connector_input_type_e input); -screen_connector_toolkit_h screen_connector_toolkit_create_handle(char *id, int surface_id, - screen_connector_toolkit_ops *ops, void *data); +screen_connector_toolkit_h screen_connector_toolkit_add_by_rid(screen_connector_toolkit_ops *ops, char *id, + screen_connector_screen_type_e type, int surface_id, void *data); struct tizen_remote_surface *screen_connector_toolkit_get_trs(screen_connector_toolkit_h h); int screen_connector_toolkit_redirect_surface(screen_connector_toolkit_h info); screen_connector_toolkit_h screen_connector_toolkit_add_with_surface(screen_connector_toolkit_ops *ops, char *id, diff --git a/screen_connector_watcher/src/screen_connector_toolkit.c b/screen_connector_watcher/src/screen_connector_toolkit.c index d1747b2..c79e6b5 100644 --- a/screen_connector_watcher/src/screen_connector_toolkit.c +++ b/screen_connector_watcher/src/screen_connector_toolkit.c @@ -247,11 +247,18 @@ EXPORT_API int screen_connector_toolkit_fini(screen_connector_screen_type_e type return ret; } -EXPORT_API screen_connector_toolkit_h screen_connector_toolkit_create_handle(char *id, int surface_id, - screen_connector_toolkit_ops *ops, void *data) +EXPORT_API screen_connector_toolkit_h screen_connector_toolkit_add_by_rid(screen_connector_toolkit_ops *ops, char *id, + screen_connector_screen_type_e type, int surface_id, void *data) { screen_connector_toolkit_h toolkit_h = NULL; screen_connector_toolkit_ops *ops_copy; + screen_connector_type_h type_h; + + type_h = g_hash_table_lookup(__type_table, GINT_TO_POINTER(type)); + if (type_h == NULL) { + LOGE("type %d is not initialized !!", type); + return NULL; + } ops_copy = (screen_connector_toolkit_ops *)calloc(1, sizeof(screen_connector_toolkit_ops)); if (ops_copy == NULL) { @@ -271,6 +278,18 @@ EXPORT_API screen_connector_toolkit_h screen_connector_toolkit_create_handle(cha toolkit_h->instance_id = strdup(id); toolkit_h->data = data; toolkit_h->ops = ops_copy; + toolkit_h->type_h = type_h; + + if (type_h->toolkit_table == NULL) + type_h->toolkit_table = g_hash_table_new_full(g_str_hash, + g_str_equal, free, __destroy_toolkit_h); + + g_hash_table_insert(type_h->toolkit_table, strdup(id), toolkit_h); + + if (type_h->aul_handle == NULL) + aul_screen_connector_add_screen_viewer(__aul_screen_viewer_cb, type, true, type_h, &type_h->aul_handle); + + screen_connector_toolkit_redirect_surface(toolkit_h); return toolkit_h; } diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index 407c9f4..74781a1 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "screen_connector_toolkit.h" #include "screen_connector_toolkit_evas.h" @@ -41,6 +42,12 @@ struct _screen_connector_type_evas_h { Evas_Object *viewer_win; }; +struct _cur_buffer_info_h { + struct wl_buffer *cur_buffer; + int ref_count; +}; +typedef struct _cur_buffer_info_h *cur_buffer_info_h; + struct _screen_connector_toolkit_evas_h { screen_connector_toolkit_evas_ops *ops; screen_connector_toolkit_h toolkit_h; @@ -50,12 +57,13 @@ struct _screen_connector_toolkit_evas_h { Evas_Object *img_tbm; Evas_Object *img_file; uint32_t img_type; - struct wl_buffer *pre_buffer; + struct wl_buffer *cur_buffer; struct _screen_connector_type_evas_h *type_h; guint resuming_timer; void *data; }; +static GHashTable *__cur_buffer_table = NULL; static GHashTable *__type_table = NULL; static Ecore_Event_Handler *__visibility_listener; static int __delayed_resuming_time; @@ -82,6 +90,37 @@ static void __destroy_type_h(gpointer data) free(type_h); } +static void __cur_buffer_info_ref(cur_buffer_info_h info) +{ + info->ref_count++; +} + +static void __cur_buffer_info_unref(struct tizen_remote_surface *trs, cur_buffer_info_h info) +{ + tbm_surface_h cur_tbm_surface; + + info->ref_count--; + if (info->ref_count == 0) { + tizen_remote_surface_release(trs, info->cur_buffer); + cur_tbm_surface = (tbm_surface_h)wl_buffer_get_user_data(info->cur_buffer); + tbm_surface_internal_unref(cur_tbm_surface); + g_hash_table_remove(__cur_buffer_table, info->cur_buffer); + } +} + +static void __destroy_cur_buffer(gpointer data) +{ + cur_buffer_info_h info = (cur_buffer_info_h)data; + + if (!info) + return; + + if (info->cur_buffer) + wl_buffer_destroy(info->cur_buffer); + + free(info); +} + static void __clear_img_tbm(screen_connector_toolkit_evas_h toolkit_evas_h) { char *plug_id; @@ -174,6 +213,9 @@ EXPORT_API int screen_connector_toolkit_evas_init(Evas_Object *win, screen_conne if (__type_table == NULL) __type_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __destroy_type_h); + if (__cur_buffer_table == NULL) + __cur_buffer_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __destroy_cur_buffer); + type_h = g_hash_table_lookup(__type_table, GINT_TO_POINTER(type)); if (type_h == NULL) { type_h = (screen_connector_type_evas_h)calloc(1, sizeof(struct _screen_connector_type_evas_h)); @@ -216,6 +258,10 @@ EXPORT_API int screen_connector_toolkit_evas_fini(screen_connector_screen_type_e if (g_hash_table_size(__type_table) == 0) { g_hash_table_destroy(__type_table); __type_table = NULL; + + if (__cur_buffer_table) + g_hash_table_destroy(__cur_buffer_table); + __cur_buffer_table = NULL; } __delayed_resuming_time = 0; @@ -615,7 +661,7 @@ static void __toolkit_update_cb(struct tizen_remote_surface *trs, uint32_t type, char format[] = "png"; char plug_id[256]; screen_connector_toolkit_evas_h toolkit_evas_h; - tbm_surface_h pre_tbm_surface; + cur_buffer_info_h c_buf_info; toolkit_evas_h = (screen_connector_toolkit_evas_h)data; if (toolkit_evas_h->img_tbm == NULL) { @@ -700,15 +746,24 @@ static void __toolkit_update_cb(struct tizen_remote_surface *trs, uint32_t type, evas_object_image_native_surface_set(toolkit_evas_h->img_tbm, NULL); /* set null to previous object for the tbm type */ } - if (toolkit_evas_h->pre_buffer) { + if (toolkit_evas_h->cur_buffer) { if (tizen_remote_surface_get_version(trs) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) { - tizen_remote_surface_release(trs, toolkit_evas_h->pre_buffer); - pre_tbm_surface = (tbm_surface_h)wl_buffer_get_user_data(toolkit_evas_h->pre_buffer); - tbm_surface_internal_unref(pre_tbm_surface); - wl_buffer_destroy(toolkit_evas_h->pre_buffer); + c_buf_info = g_hash_table_lookup(__cur_buffer_table, toolkit_evas_h->cur_buffer); + if (c_buf_info != NULL) + __cur_buffer_info_unref(trs, c_buf_info); } } - toolkit_evas_h->pre_buffer = tbm; + + toolkit_evas_h->cur_buffer = tbm; + c_buf_info = g_hash_table_lookup(__cur_buffer_table, toolkit_evas_h->cur_buffer); + if (c_buf_info == NULL) { + c_buf_info = (cur_buffer_info_h)calloc(1, sizeof(struct _cur_buffer_info_h)); + c_buf_info->cur_buffer = toolkit_evas_h->cur_buffer; + __cur_buffer_info_ref(c_buf_info); + g_hash_table_insert(__cur_buffer_table, toolkit_evas_h->cur_buffer, c_buf_info); + } else { + __cur_buffer_info_ref(c_buf_info); + } if (is_added) { LOGD("call added !!!! %s, type %d", appid, type); @@ -722,7 +777,6 @@ static void __toolkit_update_cb(struct tizen_remote_surface *trs, uint32_t type, __clear_img_file(toolkit_evas_h); } } else { - LOGD("call updated !!!! %s, type %d", appid, type); if (type == TIZEN_REMOTE_SURFACE_BUFFER_TYPE_IMAGE_FILE) { toolkit_evas_h->ops->updated_cb(appid, instance_id, pid, toolkit_evas_h->img_file, toolkit_evas_h->data); @@ -1098,7 +1152,9 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_by_ screen_connector_toolkit_evas_ops *evas_ops; screen_connector_toolkit_ops toolkit_ops; screen_connector_type_evas_h type_h; - char rid_str[32]; + char id_str[70]; + char uuid[37]; + uuid_t u; type_h = g_hash_table_lookup(__type_table, GINT_TO_POINTER(type)); if (type_h == NULL) { @@ -1128,9 +1184,10 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_by_ handle->data = data; handle->type_h = type_h; - snprintf(rid_str, sizeof(rid_str), "%d", res_id); - handle->toolkit_h = screen_connector_toolkit_create_handle(rid_str, res_id, &toolkit_ops, handle); - screen_connector_toolkit_redirect_surface(handle->toolkit_h); + uuid_generate(u); + uuid_unparse(u, uuid); + snprintf(id_str, sizeof(id_str), "%s:%d", uuid, res_id); + handle->toolkit_h = screen_connector_toolkit_add_by_rid(&toolkit_ops, id_str, type, res_id, handle); return handle; } -- 2.7.4