Fix viewer list handling bug 12/144412/5 accepted/tizen/3.0/common/20170818.112421 accepted/tizen/3.0/ivi/20170818.001406 accepted/tizen/3.0/mobile/20170818.001332 accepted/tizen/3.0/tv/20170818.001318 accepted/tizen/3.0/wearable/20170818.001351 submit/tizen_3.0/20170817.090741
authorHyunho Kang <hhstark.kang@samsung.com>
Wed, 16 Aug 2017 13:34:27 +0000 (22:34 +0900)
committerHyunho Kang <hhstark.kang@samsung.com>
Thu, 17 Aug 2017 04:28:40 +0000 (13:28 +0900)
Change-Id: Id3ab579548e6dd5a7e7b4bb3f353f90415d275ba
Signed-off-by: Hyunho Kang <hhstark.kang@samsung.com>
screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c

index a8eceae..2004d00 100644 (file)
@@ -67,6 +67,7 @@ struct _screen_connector_toolkit_evas_h {
        guint resuming_timer;
        GList *viewer_visibility_list;
        visibility_type auto_visibility;
+       int bind_win_id;
        void *data;
 };
 
@@ -93,6 +94,67 @@ static gint __comp_win_id(gconstpointer a, gconstpointer b)
        return !(win->win_id == GPOINTER_TO_INT(b));
 }
 
+static int __set_window_visibility_info(
+               screen_connector_toolkit_evas_h h,
+               int win_id, visibility_type visibility)
+{
+       viewer_visibility_h visibility_h;
+       GList *tmp_list = NULL;
+
+       if (h->viewer_visibility_list)
+               tmp_list = g_list_find_custom(
+                                       h->viewer_visibility_list,
+                                       GINT_TO_POINTER(win_id), __comp_win_id);
+
+       if (tmp_list == NULL) {
+               visibility_h = (viewer_visibility_h)calloc(1,
+                               sizeof(struct _viewer_visibility_h));
+               if (visibility_h == NULL) {
+                       LOGE("Out of memory fail to alloc");
+                       return -1;
+               }
+               h->viewer_visibility_list =
+                               g_list_append(
+                                       h->viewer_visibility_list,
+                                       visibility_h);
+       } else {
+               visibility_h = (viewer_visibility_h)tmp_list->data;
+       }
+       visibility_h->win_id = win_id;
+       visibility_h->visibility = visibility;
+
+       LOGI("set win(%d) to (%d), len(%d)", win_id, visibility, g_list_length(h->viewer_visibility_list));
+
+       return 0;
+}
+
+static int __remove_window_visibility_info(
+               screen_connector_toolkit_evas_h h,
+               int win_id)
+{
+       viewer_visibility_h visibility_h;
+       GList *tmp_list;
+
+       tmp_list = g_list_find_custom(
+                               h->viewer_visibility_list,
+                               GINT_TO_POINTER(win_id), __comp_win_id);
+
+       if (tmp_list == NULL) {
+               LOGE("win id %d not exist");
+               return -1;
+       }
+
+       visibility_h = (viewer_visibility_h)tmp_list->data;
+       h->viewer_visibility_list = g_list_remove(
+                                               h->viewer_visibility_list,
+                                               visibility_h);
+       free(visibility_h);
+
+       LOGI("remove win(%d) len(%d)", win_id, g_list_length(h->viewer_visibility_list));
+
+       return 0;
+}
+
 static void __destroy_type_h(gpointer data)
 {
        screen_connector_type_evas_h type_h = (screen_connector_type_evas_h)data;
@@ -745,6 +807,7 @@ static void __toolkit_update_cb(struct tizen_remote_surface *trs, uint32_t type,
        screen_connector_toolkit_evas_h toolkit_evas_h;
        cur_buffer_info_h c_buf_info;
        bool duplicate_buffer = false;
+       Ecore_Wl_Window *wl_win;
 
        toolkit_evas_h = (screen_connector_toolkit_evas_h)data;
        if (toolkit_evas_h->img_tbm == NULL)    {
@@ -793,6 +856,14 @@ static void __toolkit_update_cb(struct tizen_remote_surface *trs, uint32_t type,
                evas_object_data_set(toolkit_evas_h->img_tbm, SC_TOOLKIT_HANDLE_TAG, toolkit_evas_h);
                evas_object_event_callback_add(toolkit_evas_h->img_tbm,
                                EVAS_CALLBACK_MOVE, __obj_update_visibility, toolkit_evas_h);
+
+               wl_win = elm_win_wl_window_get(
+                               toolkit_evas_h->type_h->viewer_win);
+               if (!wl_win)
+                       LOGE("failed to get wl_win");
+
+               __set_window_visibility_info(toolkit_evas_h, ecore_wl_window_id_get(wl_win),
+                               VISIBILITY_TYPE_UNKNOWN);
        }
 
        if (toolkit_evas_h->img_type != type)
@@ -1053,7 +1124,6 @@ static void __send_visibility(gpointer key, gpointer value, gpointer user_data)
        Ecore_Wl_Event_Window_Visibility_Change *ev = user_data;
        int ret;
        visibility_type type;
-       GList *tmp_list = NULL;
        GList *iter;
        viewer_visibility_h visibility_h;
 
@@ -1068,29 +1138,8 @@ static void __send_visibility(gpointer key, gpointer value, gpointer user_data)
        else
                type = VISIBILITY_TYPE_UNOBSCURED;
 
-       if (toolkit_evas_h->viewer_visibility_list) {
-               tmp_list = g_list_find_custom(
-                               toolkit_evas_h->viewer_visibility_list,
-                               GINT_TO_POINTER(ev->win), __comp_win_id);
-       }
-
-       if (tmp_list == NULL) {
-               visibility_h = (viewer_visibility_h)calloc(1,
-                               sizeof(struct _viewer_visibility_h));
-               if (visibility_h == NULL) {
-                       LOGE("Out of memory fail to alloc");
-                       return;
-               }
-               visibility_h->win_id = ev->win;
-               visibility_h->visibility = type;
-               toolkit_evas_h->viewer_visibility_list =
-                               g_list_append(toolkit_evas_h->viewer_visibility_list,
-                                               visibility_h);
-       } else {
-               visibility_h = (viewer_visibility_h)tmp_list->data;
-               visibility_h->visibility = type;
-       }
 
+       __set_window_visibility_info(toolkit_evas_h, ev->win, type);
        type = VISIBILITY_TYPE_FULLY_OBSCURED;
        iter = toolkit_evas_h->viewer_visibility_list;
        while (iter != NULL) {
@@ -1389,9 +1438,10 @@ EXPORT_API int screen_connector_toolkit_evas_bind(screen_connector_toolkit_evas_
 {
        struct wl_surface *surface;
        Ecore_Wl_Window *wl_win;
-       viewer_visibility_h visibility_h;
        struct tizen_remote_surface *trs;
        cur_buffer_info_h c_buf_info;
+       int ret;
+       int bind_win_id;
 
        if (!h)
                return -1;
@@ -1408,17 +1458,15 @@ EXPORT_API int screen_connector_toolkit_evas_bind(screen_connector_toolkit_evas_
                return -1;
        }
 
-       visibility_h = (viewer_visibility_h)calloc(1,
-                       sizeof(struct _viewer_visibility_h));
-       if (visibility_h == NULL) {
-               LOGE("Out of memory fail to alloc");
+       bind_win_id = ecore_wl_window_id_get(wl_win);
+       ret = __set_window_visibility_info(h, bind_win_id,
+                       VISIBILITY_TYPE_UNKNOWN);
+       if (ret < 0) {
+               LOGE("failed to set visibility info");
                return -1;
        }
-       visibility_h->win_id = ecore_wl_window_id_get(wl_win);
-       visibility_h->visibility = VISIBILITY_TYPE_UNKNOWN;
+       h->bind_win_id = bind_win_id;
 
-       h->viewer_visibility_list =
-                       g_list_append(h->viewer_visibility_list, visibility_h);
        trs = screen_connector_toolkit_get_trs(h->toolkit_h);
        if (trs)
                tizen_remote_surface_transfer_touch_cancel(trs);
@@ -1443,6 +1491,8 @@ EXPORT_API int screen_connector_toolkit_evas_unbind(screen_connector_toolkit_eva
                return -1;
        }
 
+       __remove_window_visibility_info(h, h->bind_win_id);
+
        return screen_connector_toolkit_unbind(h->toolkit_h);
 }