Modify toolkit management 66/183766/1
authorHwankyu Jhun <h.jhun@samsung.com>
Tue, 10 Jul 2018 06:23:43 +0000 (15:23 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Wed, 11 Jul 2018 00:31:13 +0000 (09:31 +0900)
The toolkit handle is managed by the list.

Change-Id: I220cb3959389f39a72cc11e876c11ab382b780cc
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
watch-control/src/control.c

index 9319d0a..8bcb717 100755 (executable)
@@ -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);