From b3d52034aea11db3c63282b0005384cb1beda561 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 23 Jul 2012 12:35:48 +0000 Subject: [PATCH] fix segv on popup... with items. infinite stack blow. but oh my there is so much more to fix.. i don't know where to begin. SVN revision: 74324 --- legacy/elementary/src/lib/elc_popup.c | 91 ++++++++++++--------------- 1 file changed, 39 insertions(+), 52 deletions(-) diff --git a/legacy/elementary/src/lib/elc_popup.c b/legacy/elementary/src/lib/elc_popup.c index 1013f49465..d36cdc242f 100644 --- a/legacy/elementary/src/lib/elc_popup.c +++ b/legacy/elementary/src/lib/elc_popup.c @@ -15,6 +15,8 @@ struct _Widget_Data Evas_Object *content_text_obj; Evas_Object *action_area; Evas_Object *box; + Evas_Object *tbl; + Evas_Object *spacer; Evas_Object *scr; Evas_Object *content; Eina_List *items; @@ -74,8 +76,6 @@ static void _sizing_eval(Evas_Object *obj); static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info); static void _notify_resize(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _scroller_resize(void *data, Evas *e, Evas_Object *obj, - void *event_info); static void _timeout(void *data, Evas_Object *obj , void *event_info); static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl); @@ -250,8 +250,7 @@ _sizing_eval(Evas_Object *obj) { Eina_List *elist; Elm_Popup_Content_Item *item; - Evas_Coord w_box = 0, h_box = 0; - Evas_Coord minw_box = 0, minh_box = 0; + Evas_Coord h_box = 0, minh_box = 0; Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; Widget_Data *wd = elm_widget_data_get(obj); @@ -261,18 +260,23 @@ _sizing_eval(Evas_Object *obj) EINA_LIST_FOREACH(wd->items, elist, item) { _item_sizing_eval(item); - evas_object_size_hint_min_get(VIEW(item), &minw_box, - &minh_box); - if (minw_box > w_box) - w_box = minw_box; - if (minh_box != -1) - h_box += minh_box; + evas_object_size_hint_min_get(VIEW(item), NULL, &minh_box); + if (minh_box != -1) h_box += minh_box; } + evas_object_size_hint_min_set(wd->spacer, 0, MIN(h_box, wd->max_sc_h)); + evas_object_size_hint_max_set(wd->spacer, -1, wd->max_sc_h); +/* evas_object_size_hint_min_set(wd->box, w_box, h_box); evas_object_size_hint_min_set(wd->scr, w_box, MIN(h_box, wd->max_sc_h)); evas_object_size_hint_max_set(wd->scr, w_box, wd->max_sc_h); - evas_object_smart_calculate(wd->scr); + */ +// evas_object_smart_calculate(wd->scr); } + evas_object_size_hint_min_get(wd->scr, &minw, &minh); + printf("min: %ix%i\n", minw, minh); + evas_object_size_hint_max_get(wd->scr, &minw, &minh); + printf("max: %ix%i\n", minw, minh); + edje_object_size_min_calc(elm_layout_edje_get(wd->base), &minw, &minh); evas_object_size_hint_min_set(wd->base, minw, minh); evas_object_size_hint_max_set(wd->base, maxw, maxh); @@ -324,11 +328,12 @@ _sub_del(void *data, Evas_Object *obj, void *event_info) elm_object_part_content_unset(wd->base, "elm.swallow.content"); _sizing_eval(data); } - else if (sub == wd->scr) + else if (sub == wd->tbl) { + wd->tbl = NULL; + wd->spacer = NULL; wd->scr = NULL; wd->box = NULL; - elm_object_part_content_unset(wd->base, "elm.swallow.content"); _sizing_eval(data); } } @@ -409,72 +414,54 @@ _restack(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, evas_object_layer_set(wd->notify, evas_object_layer_get(obj)); } -static void -_scroller_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, - void *event_info __UNUSED__) -{ - Evas_Coord w, h; - Widget_Data *wd = elm_widget_data_get(data); - - if (!wd || wd->scr_size_recalc) return; - evas_object_geometry_get(obj, NULL, NULL, &w, &h); - if (w && h) - { - if ((w <= wd->max_sc_w) && (h <= wd->max_sc_h)) - { - _sizing_eval(data); - wd->scr_size_recalc = EINA_TRUE; - return; - } - } - if (wd->max_sc_w < w) - wd->max_sc_w = w; - if (wd->max_sc_h < h) - wd->max_sc_h = h; - _sizing_eval(data); -} - static void _list_new(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; + + wd->tbl = elm_table_add(obj); + elm_object_part_content_set(wd->base, "elm.swallow.content", wd->tbl); + evas_object_size_hint_weight_set(wd->tbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(wd->tbl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(wd->tbl); + + wd->spacer = evas_object_rectangle_add(evas_object_evas_get(obj)); + evas_object_color_set(wd->spacer, 0, 0, 0, 0); + elm_table_pack(wd->tbl, wd->spacer, 0, 0, 1, 1); + //Scroller wd->scr = elm_scroller_add(obj); + elm_scroller_content_min_limit(wd->scr, EINA_TRUE, EINA_FALSE); elm_scroller_bounce_set(wd->scr, EINA_FALSE, EINA_TRUE); - elm_object_content_set(wd->scr, wd->box); - evas_object_size_hint_weight_set(wd->scr, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(wd->scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(wd->scr, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_RESIZE, - _scroller_resize, obj); evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); - elm_object_part_content_set(wd->base, "elm.swallow.content", wd->scr); + elm_table_pack(wd->tbl, wd->scr, 0, 0, 1, 1); + evas_object_show(wd->scr); //Box wd->box = elm_box_add(obj); - evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL); - + evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, 0.0); elm_object_content_set(wd->scr, wd->box); + evas_object_show(wd->box); } static void _list_del(Widget_Data *wd) { if (!wd->scr) return; - elm_object_part_content_unset(wd->base, "elm.swallow.content"); - evas_object_event_callback_del(wd->scr, EVAS_CALLBACK_RESIZE, - _scroller_resize); evas_object_event_callback_del(wd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); - evas_object_del(wd->scr); + evas_object_del(wd->tbl); wd->scr = NULL; wd->box = NULL; + wd->spacer = NULL; + wd->tbl = NULL; } static void