From bf4e1e138c0151f4252fe6f6609282a01be77cfb Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Fri, 10 Jun 2011 11:19:32 +0900 Subject: [PATCH] elementary/listmerged with opensource (Revision: 60124)Fixed for potential duplicated deletion (this is patched by jae.hwan.kim@samsung.com)since the list calls the unref, it could be deleted multiple timeswhen user deletes the list in it's callback funtion. --- src/lib/elm_list.c | 89 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/src/lib/elm_list.c b/src/lib/elm_list.c index f801889..0334808 100644 --- a/src/lib/elm_list.c +++ b/src/lib/elm_list.c @@ -96,6 +96,27 @@ static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info); static Eina_Bool _deselect_all_items(Widget_Data *wd); +static const char SIG_CLICKED_DOUBLE[] = "clicked,double"; +static const char SIG_SELECTED[] = "selected"; +static const char SIG_UNSELECTED[] = "unselected"; +static const char SIG_LONGPRESSED[] = "longpressed"; +static const char SIG_SCROLL_EDGE_TOP[] = "scroll,edge,top"; +static const char SIG_SCROLL_EDGE_BOTTOM[] = "scroll,edge,bottom"; +static const char SIG_SCROLL_EDGE_LEFT[] = "scroll,edge,left"; +static const char SIG_SCROLL_EDGE_RIGHT[] = "scroll,edge,right"; + +static const Evas_Smart_Cb_Description _signals[] = { + {SIG_CLICKED_DOUBLE, ""}, + {SIG_SELECTED, ""}, + {SIG_UNSELECTED, ""}, + {SIG_LONGPRESSED, ""}, + {SIG_SCROLL_EDGE_TOP, ""}, + {SIG_SCROLL_EDGE_BOTTOM, ""}, + {SIG_SCROLL_EDGE_LEFT, ""}, + {SIG_SCROLL_EDGE_RIGHT, ""}, + {NULL, NULL} +}; + #define ELM_LIST_ITEM_CHECK_DELETED_RETURN(it, ...) \ ELM_WIDGET_ITEM_WIDTYPE_CHECK_OR_RETURN(it, __VA_ARGS__); \ if (it->deleted) \ @@ -425,21 +446,18 @@ _elm_list_unwalk(Widget_Data *wd) } } -// FIXME : This function might be unnecessary, fix self deletion bug then remove this function. static void _del_pre_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - if (wd->scr) - evas_object_event_callback_del_full - (wd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, - obj); - if (wd->box) - evas_object_event_callback_del_full - (wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, - obj); + evas_object_event_callback_del(wd->scr, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints); + evas_object_event_callback_del(wd->box, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints); } static void @@ -654,28 +672,25 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info) if (!wd) return; if (!sub) abort(); - if (sub == wd->scr) - wd->scr = NULL; - else + if ((sub == wd->box) || (sub == wd->scr)) return; + + EINA_LIST_FOREACH(wd->items, l, it) { - EINA_LIST_FOREACH(wd->items, l, it) + if ((sub == it->icon) || (sub == it->end)) { - if ((sub == it->icon) || (sub == it->end)) + if (it->icon == sub) it->icon = NULL; + if (it->end == sub) it->end = NULL; + evas_object_event_callback_del_full + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, + obj); + if (!wd->walking) { - if (it->icon == sub) it->icon = NULL; - if (it->end == sub) it->end = NULL; - evas_object_event_callback_del_full - (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, - obj); - if (!wd->walking) - { - _fix_items(obj); - _sizing_eval(obj); - } - else - wd->fix_pending = EINA_TRUE; - break; + _fix_items(obj); + _sizing_eval(obj); } + else + wd->fix_pending = EINA_TRUE; + break; } } } @@ -725,7 +740,7 @@ call: _elm_list_walk(wd); if (it->func) it->func((void *)it->base.data, it->base.widget, it); - evas_object_smart_callback_call(obj, "selected", it); + evas_object_smart_callback_call(obj, SIG_SELECTED, it); it->wd->last_selected_item = it; _elm_list_unwalk(wd); @@ -759,7 +774,7 @@ _item_unselect(Elm_List_Item *it) { it->selected = EINA_FALSE; wd->selected = eina_list_remove(wd->selected, it); - evas_object_smart_callback_call(it->base.widget, "unselected", it); + evas_object_smart_callback_call(it->base.widget, SIG_UNSELECTED, it); } _elm_list_unwalk(wd); @@ -826,28 +841,28 @@ static void _scroll_edge_left(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, "scroll,edge,left", NULL); + evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_LEFT, NULL); } static void _scroll_edge_right(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, "scroll,edge,right", NULL); + evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_RIGHT, NULL); } static void _scroll_edge_top(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, "scroll,edge,top", NULL); + evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_TOP, NULL); } static void _scroll_edge_bottom(void *data, Evas_Object *scr __UNUSED__, void *event_info __UNUSED__) { Evas_Object *obj = data; - evas_object_smart_callback_call(obj, "scroll,edge,bottom", NULL); + evas_object_smart_callback_call(obj, SIG_SCROLL_EDGE_BOTTOM, NULL); } static Eina_Bool @@ -864,7 +879,7 @@ _long_press(void *data) if (it->disabled) goto end; wd->longpressed = EINA_TRUE; - evas_object_smart_callback_call(it->base.widget, "longpressed", it); + evas_object_smart_callback_call(it->base.widget, SIG_LONGPRESSED, it); end: return ECORE_CALLBACK_CANCEL; @@ -917,7 +932,9 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void it->swipe_timer = ecore_timer_add(0.4, _swipe_cancel, it); /* Always call the callbacks last - the user may delete our context! */ if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) - evas_object_smart_callback_call(it->base.widget, "clicked,double", it); + { + evas_object_smart_callback_call(it->base.widget, SIG_CLICKED_DOUBLE, it); + } wd->swipe = EINA_FALSE; wd->movements = 0; @@ -1357,6 +1374,8 @@ elm_list_add(Evas_Object *parent) evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj); evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj); + evas_object_smart_callbacks_descriptions_set(obj, _signals); + _mirrored_set(obj, elm_widget_mirrored_get(obj)); _sizing_eval(obj); return obj; -- 2.7.4