From: Hwankyu Jhun Date: Tue, 10 Jul 2018 06:23:43 +0000 (+0900) Subject: Modify toolkit management X-Git-Tag: submit/tizen/20180711.024357~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=57f433cf3f9e21cccfdb2ee17f7ba942000db574;p=platform%2Fcore%2Fappfw%2Fwidget-viewer.git Modify toolkit management The toolkit handle is managed by the list. Change-Id: I220cb3959389f39a72cc11e876c11ab382b780cc Signed-off-by: Hwankyu Jhun --- diff --git a/watch-control/src/control.c b/watch-control/src/control.c index 9319d0ad..8bcb717c 100755 --- a/watch-control/src/control.c +++ b/watch-control/src/control.c @@ -63,7 +63,6 @@ static int __default_width; static int __default_height; static screen_connector_toolkit_evas_h __toolkit; static screen_connector_toolkit_evas_h __rid_toolkit; -static screen_connector_toolkit_evas_h __tmp_toolkit; static Evas_Object *__win; static char *__watch_appid; @@ -77,6 +76,12 @@ static bool __is_bound = false; static int __viewer_visibility = AUL_SCREEN_STATUS_PAUSE; static Ecore_Event_Handler *__pre_visibility; +struct toolkit_info_s { + char *appid; + screen_connector_toolkit_evas_h toolkit; +}; +static GList *__toolkit_list; + static GList *__dead_cbs; struct dead_cb_s { watch_dead_signal_cb cb; @@ -94,6 +99,77 @@ static void __set_viewer_appid(void); static void __manual_render_start(void); static void __manual_render_finish(void); +static void __destroy_toolkit_info(gpointer data) +{ + struct toolkit_info_s *info = data; + + if (!info) + return; + + if (info->appid) + free(info->appid); + + free(info); +} + +static struct toolkit_info_s *__create_toolkit_info(const char *appid, + screen_connector_toolkit_evas_h toolkit) +{ + struct toolkit_info_s *info; + + info = malloc(sizeof(struct toolkit_info_s)); + if (!info) { + _E("Out of memory"); + return NULL; + } + + info->appid = strdup(appid); + if (!info->appid) { + _E("Failed to duplicate appid(%s)", appid); + free(info); + return NULL; + } + + info->toolkit = toolkit; + + return info; +} + +static struct toolkit_info_s *__find_toolkit_info(const char *appid) +{ + struct toolkit_info_s *info; + GList *iter; + + iter = __toolkit_list; + while (iter) { + info = (struct toolkit_info_s *)iter->data; + if (info && !strcmp(info->appid, appid)) + return info; + + iter = g_list_next(iter); + } + + return NULL; +} + +static struct toolkit_info_s *__find_toolkit_info_by_toolkit( + screen_connector_toolkit_evas_h toolkit) +{ + struct toolkit_info_s *info; + GList *iter; + + iter = __toolkit_list; + while (iter) { + info = (struct toolkit_info_s *)iter->data; + if (info && info->toolkit == toolkit) + return info; + + iter = g_list_next(iter); + } + + return NULL; +} + static void __process_pending_status(int status, unsigned int surf) { int r; @@ -342,14 +418,23 @@ static void __screen_connector_toolkit_evas_removed_cb(const char *appid, const Evas_Object *image, void *data) { Evas_Object *cur_image; + struct toolkit_info_s *info; + GList *iter; _D("obj(%p) removed", image); evas_object_smart_callback_call(__win, WATCH_SMART_SIGNAL_REMOVED, image); cur_image = evas_object_data_get(__win, "tbm,watch"); if (cur_image == image) { evas_object_data_set(__win, "tbm,watch", NULL); - if (__toolkit) + if (__toolkit) { + info = __find_toolkit_info_by_toolkit(__toolkit); + if (info) { + __toolkit_list = g_list_remove(__toolkit_list, + info); + __destroy_toolkit_info(info); + } g_idle_add(__remove_toolkit, __toolkit); + } if (__rid_toolkit) g_idle_add(__remove_toolkit, __rid_toolkit); __toolkit = NULL; @@ -357,9 +442,16 @@ static void __screen_connector_toolkit_evas_removed_cb(const char *appid, const __is_bound = false; } - if (__tmp_toolkit) { - g_idle_add(__remove_toolkit, __tmp_toolkit); - __tmp_toolkit = NULL; + iter = __toolkit_list; + while (iter) { + info = (struct toolkit_info_s *)iter->data; + iter = g_list_next(iter); + if (info->toolkit != __toolkit && + info->toolkit != __rid_toolkit) { + __toolkit_list = g_list_remove(__toolkit_list, info); + g_idle_add(__remove_toolkit, info->toolkit); + __destroy_toolkit_info(info); + } } } @@ -562,6 +654,11 @@ API int watch_manager_get_app_control(const char *app_id, app_control_h *app_con API int watch_manager_fini() { + if (__toolkit_list) { + g_list_free_full(__toolkit_list, __destroy_toolkit_info); + __toolkit_list = NULL; + } + __watch_viewer_fini(); if (__watch_appid) { @@ -988,6 +1085,8 @@ static int __launch_signal_handler(const char *endpoint, char *viewer = NULL; char *pid_str = NULL; screen_connector_toolkit_evas_ops ops; + screen_connector_toolkit_evas_h toolkit; + struct toolkit_info_s *info; bool exist; bundle_get_str(envelope, AUL_K_WIDGET_VIEWER, &viewer); @@ -1007,20 +1106,32 @@ static int __launch_signal_handler(const char *endpoint, __watch_appid, appid, pid_str); exist = screen_connector_toolkit_is_exist(appid, - SCREEN_CONNECTOR_SCREEN_TYPE_WATCH); - + SCREEN_CONNECTOR_SCREEN_TYPE_WATCH); if (exist) { - screen_connector_toolkit_evas_remove(__toolkit); + info = __find_toolkit_info(appid); + if (info) { + __toolkit_list = g_list_remove(__toolkit_list, info); + screen_connector_toolkit_evas_remove(info->toolkit); + __destroy_toolkit_info(info); + } } else { - __tmp_toolkit = __toolkit; - _D("Old toolkit %p", __tmp_toolkit); + _D("Old toolkit %p", __toolkit); } ops.added_cb = __screen_connector_toolkit_evas_added_cb; ops.removed_cb = __screen_connector_toolkit_evas_removed_cb; ops.updated_cb = __screen_connector_toolkit_evas_updated_cb; - __toolkit = screen_connector_toolkit_evas_add(&ops, appid, + toolkit = screen_connector_toolkit_evas_add(&ops, appid, SCREEN_CONNECTOR_SCREEN_TYPE_WATCH, NULL); + if (!toolkit) { + LOGE("Failed to add toolkit evas. appid(%s)", appid); + } else { + info = __create_toolkit_info(appid, toolkit); + if (info) + __toolkit_list = g_list_append(__toolkit_list, info); + + __toolkit = toolkit; + } if (__watch_appid) free(__watch_appid);