From: Jihoon Kim Date: Wed, 28 Jun 2017 22:58:35 +0000 (+0900) Subject: Fix memory leak related to genlist and popup data X-Git-Tag: submit/tizen/20170621.072205~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F01%2F136401%2F4;p=platform%2Fcore%2Fuifw%2Finputmethod-setting.git Fix memory leak related to genlist and popup data The allocated memory should be deallocated when the associated widget is destroyed not selected. Change-Id: Ib8d0acb20b52d9024519afbefbfb0173e4453a70 Signed-off-by: Jihoon Kim --- diff --git a/im_setting_list/input_method_setting_list_popup_view.cpp b/im_setting_list/input_method_setting_list_popup_view.cpp index 1b0e8ad..5b29f76 100644 --- a/im_setting_list/input_method_setting_list_popup_view.cpp +++ b/im_setting_list/input_method_setting_list_popup_view.cpp @@ -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(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(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, diff --git a/im_setting_list/input_method_setting_list_ui.cpp b/im_setting_list/input_method_setting_list_ui.cpp index ab6cde8..02825b1 100644 --- a/im_setting_list/input_method_setting_list_ui.cpp +++ b/im_setting_list/input_method_setting_list_ui.cpp @@ -203,14 +203,12 @@ im_setting_list_check_popup_ok_cb(void *data, Evas_Object *obj, void *event_info int index = (int)reinterpret_cast(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(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(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(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(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) diff --git a/im_setting_selector/input_method_setting_selector_ui.cpp b/im_setting_selector/input_method_setting_selector_ui.cpp index c8aeb43..37c5285 100644 --- a/im_setting_selector/input_method_setting_selector_ui.cpp +++ b/im_setting_selector/input_method_setting_selector_ui.cpp @@ -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(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(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,