Fix memory leak related to genlist and popup data 01/136401/4
authorJihoon Kim <jihoon48.kim@samsung.com>
Wed, 28 Jun 2017 22:58:35 +0000 (07:58 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Thu, 29 Jun 2017 09:54:29 +0000 (18:54 +0900)
The allocated memory should be deallocated when the associated widget is destroyed not selected.

Change-Id: Ib8d0acb20b52d9024519afbefbfb0173e4453a70
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
im_setting_list/input_method_setting_list_popup_view.cpp
im_setting_list/input_method_setting_list_ui.cpp
im_setting_selector/input_method_setting_selector_ui.cpp

index 1b0e8ad..5b29f76 100644 (file)
@@ -175,7 +175,6 @@ static void im_setting_list_ime_sel_cb(void *data, Evas_Object *obj, void *event
 
     Elm_Object_Item *item = (Elm_Object_Item *)event_info;
     if (!item) {
-        delete cb_data;
         return;
     }
 
@@ -205,7 +204,11 @@ static Evas_Object *im_setting_list_genlist_create(Evas_Object* parent, Evas_Obj
 
 static char *im_setting_list_genlist_item_label_get(void *data, Evas_Object *obj, const char *part)
 {
-    int index = (int)reinterpret_cast<long>(data);
+    sel_cb_data *cb_data = (sel_cb_data *)data;
+    if (!cb_data)
+        return NULL;
+
+    int index = cb_data->index;
     if (index < 0 || index >= (int)g_active_ime_info_list.size()) {
         LOGW("Wrong value. index : %d, g_active_ime_info_list.size() : %d\n", index, g_active_ime_info_list.size());
         return NULL;
@@ -222,7 +225,11 @@ static char *im_setting_list_genlist_item_label_get(void *data, Evas_Object *obj
 
 static Evas_Object *im_setting_list_genlist_item_icon_get(void *data, Evas_Object *obj, const char *part)
 {
-    int index = (int)reinterpret_cast<long>(data);
+    sel_cb_data *cb_data = (sel_cb_data *)data;
+    if (!cb_data)
+        return NULL;
+
+    int index = cb_data->index;
     Elm_Object_Item *it = elm_genlist_nth_item_get(obj, index);
 
     if (!strcmp(part, "elm.swallow.end") ||
@@ -242,6 +249,15 @@ static Evas_Object *im_setting_list_genlist_item_icon_get(void *data, Evas_Objec
     return NULL;
 }
 
+static void im_setting_list_genlist_item_del_cb(void *data, Evas_Object *obj)
+{
+    sel_cb_data *cb_data = (sel_cb_data *)data;
+    if (!cb_data)
+        return;
+
+    delete cb_data;
+}
+
 static void im_setting_list_genlist_item_class_create(void)
 {
     itc_im_list = elm_genlist_item_class_new();
@@ -254,7 +270,7 @@ static void im_setting_list_genlist_item_class_create(void)
         itc_im_list->func.text_get = im_setting_list_genlist_item_label_get;
         itc_im_list->func.content_get = im_setting_list_genlist_item_icon_get;
         itc_im_list->func.state_get = NULL;
-        itc_im_list->func.del = NULL;
+        itc_im_list->func.del = im_setting_list_genlist_item_del_cb;
     }
 }
 
@@ -276,7 +292,7 @@ static Evas_Object *im_setting_list_list_create(void *data)
         cb_data->index = i;
         elm_genlist_item_append(genlist,
             itc_im_list,
-            (void *)(i),
+            (void *)(cb_data),
             NULL,
             ELM_GENLIST_ITEM_NONE,
             im_setting_list_ime_sel_cb,
@@ -386,7 +402,7 @@ static void im_setting_list_screen_create(void *data)
         cb_data->index = i;
         elm_genlist_item_append(genlist,
             itc_im_list,
-            (void *)(i),
+            (void *)(cb_data),
             NULL,
             ELM_GENLIST_ITEM_NONE,
             im_setting_list_ime_sel_cb,
index ab6cde8..02825b1 100644 (file)
@@ -203,14 +203,12 @@ im_setting_list_check_popup_ok_cb(void *data, Evas_Object *obj, void *event_info
     int index = (int)reinterpret_cast<long>(cb_data->data);
     if (index < 0 || index >= (int)g_ime_info_list.size()) {
         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
-        delete cb_data;
         return;
     }
     Eina_Bool state = EINA_FALSE;
     state = g_gen_item_data[index].chk_status;
     isf_control_set_enable_ime(g_ime_info_list[index].appid, state);
     evas_object_del(cb_data->popup);
-    delete cb_data;
 }
 
 static void
@@ -222,7 +220,6 @@ im_setting_list_check_popup_cancel_cb(void *data, Evas_Object *obj, void *event_
     int index = (int)reinterpret_cast<long>(cb_data->data);
     if (index < 0 || index >= (int)g_ime_info_list.size()) {
         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
-        delete cb_data;
         return;
     }
 
@@ -231,7 +228,6 @@ im_setting_list_check_popup_cancel_cb(void *data, Evas_Object *obj, void *event_
     g_gen_item_data[index].chk_status = !state;
     elm_genlist_item_update(g_gen_item_data[index].gen_item);
     evas_object_del(cb_data->popup);
-    delete cb_data;
 }
 
 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
@@ -243,7 +239,6 @@ static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
     int index = (int)reinterpret_cast<long>(cb_data->data);
     if (index < 0 || index >= (int)g_ime_info_list.size()) {
         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
-        delete cb_data;
         return;
     }
 
@@ -251,10 +246,18 @@ static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
         im_setting_list_check_popup_cancel_cb(data, NULL, NULL);
     } else {
         evas_object_del(cb_data->popup);
-        delete cb_data;
     }
 }
 
+static void _popup_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+    popup_cb_data *cb_data = (popup_cb_data *)data;
+    if (!cb_data)
+        return;
+
+    delete cb_data;
+}
+
 static void im_setting_list_show_popup(void *data, Evas_Object *obj, popup_ok_cb ime_setting_list_ok_callback, popup_cancel_cb ime_setting_list_cancel_callback)
 {
     int index = (int)reinterpret_cast<long>(data);
@@ -289,6 +292,7 @@ static void im_setting_list_show_popup(void *data, Evas_Object *obj, popup_ok_cb
     evas_object_smart_callback_add(btn_ok, "clicked", ime_setting_list_ok_callback, cb_data);
 
     eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_back_cb, cb_data);
+    evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _popup_del_cb, cb_data);
     evas_object_show(popup);
 }
 
@@ -320,7 +324,6 @@ im_setting_list_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
     int index = (int)reinterpret_cast<long>(cb_data->data);
     if (index < 0 || index >= (int)g_ime_info_list.size()) {
         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
-        delete cb_data;
         return;
     }
 
@@ -329,7 +332,6 @@ im_setting_list_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
     isf_control_set_enable_ime(g_ime_info_list[index].appid, !state);
     elm_genlist_item_update(g_gen_item_data[index].gen_item);
     evas_object_del(cb_data->popup);
-    delete cb_data;
 }
 
 static void
@@ -339,7 +341,6 @@ im_setting_list_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
     if (!cb_data)
         return;
     evas_object_del(cb_data->popup);
-    delete cb_data;
 }
 
 static void im_setting_list_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
index c8aeb43..37c5285 100644 (file)
@@ -208,8 +208,6 @@ static void im_setting_selector_ime_sel_cb(void *data, Evas_Object *obj, void *e
     selected_index = index;
     im_setting_selector_update_radio_state(item, obj, index);
     ecore_idler_add(_ime_select_idler_cb, ad);
-
-    delete cb_data;
 }
 
 static Evas_Object *im_setting_selector_genlist_create(Evas_Object* parent, Evas_Object* conform)
@@ -231,7 +229,11 @@ static Evas_Object *im_setting_selector_genlist_create(Evas_Object* parent, Evas
 
 static char *im_setting_selector_genlist_item_label_get(void *data, Evas_Object *obj, const char *part)
 {
-    int index = (int)reinterpret_cast<long>(data);
+    sel_cb_data *cb_data = (sel_cb_data *)data;
+    if (!cb_data)
+        return NULL;
+
+    int index = cb_data->index;
     if (index < 0 || index >= (int)g_ime_info_list.size()) {
         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
         return NULL;
@@ -248,7 +250,11 @@ static char *im_setting_selector_genlist_item_label_get(void *data, Evas_Object
 
 static Evas_Object *im_setting_selector_genlist_item_icon_get(void *data, Evas_Object *obj, const char *part)
 {
-    int index = (int)reinterpret_cast<long>(data);
+    sel_cb_data *cb_data = (sel_cb_data *)data;
+    if (!cb_data)
+        return NULL;
+
+    int index = cb_data->index;
     Elm_Object_Item *it = elm_genlist_nth_item_get(obj, index);
 
     if (!strcmp(part, "elm.swallow.end") ||
@@ -268,6 +274,16 @@ static Evas_Object *im_setting_selector_genlist_item_icon_get(void *data, Evas_O
     return NULL;
 }
 
+static void
+im_setting_selector_genlist_item_del_cb(void *data, Evas_Object *obj)
+{
+    sel_cb_data *cb_data = (sel_cb_data *)data;
+    if (!cb_data)
+        return;
+
+    delete cb_data;
+}
+
 static void im_setting_selector_genlist_item_class_create(void)
 {
     itc_im_selector = elm_genlist_item_class_new();
@@ -280,7 +296,7 @@ static void im_setting_selector_genlist_item_class_create(void)
         itc_im_selector->func.text_get = im_setting_selector_genlist_item_label_get;
         itc_im_selector->func.content_get = im_setting_selector_genlist_item_icon_get;
         itc_im_selector->func.state_get = NULL;
-        itc_im_selector->func.del = NULL;
+        itc_im_selector->func.del = im_setting_selector_genlist_item_del_cb;
     }
 }
 
@@ -296,9 +312,10 @@ static void im_setting_selector_add_ime(void *data) {
         sel_cb_data *cb_data = new sel_cb_data;
         cb_data->data = data;
         cb_data->index = i;
+
         elm_genlist_item_append(ad->genlist,
             itc_im_selector,
-            (void *)(i),
+            (void *)(cb_data),
             NULL,
             ELM_GENLIST_ITEM_NONE,
             im_setting_selector_ime_sel_cb,
@@ -456,7 +473,7 @@ static void im_setting_selector_screen_create(void *data)
         cb_data->index = i;
         elm_genlist_item_append(genlist,
             itc_im_selector,
-            (void *)(i),
+            (void *)(cb_data),
             NULL,
             ELM_GENLIST_ITEM_NONE,
             im_setting_selector_ime_sel_cb,