From: raster Date: Mon, 20 Feb 2012 08:26:17 +0000 (+0000) Subject: From: Hyoyoung Chang X-Git-Tag: REL_F_I9500_20120323_1~17^2~649 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=af23987f62283be2e261828def2990355c091642;p=framework%2Fuifw%2Felementary.git From: Hyoyoung Chang Subject: [E-devel] [patch] elm_genlist - add item_class management functions I make controversial apis for item class management. As raster and other guys suggest, I simplify APIs and its behaviors. First, Two public apis and two internal apis are introduced +EAPI Elm_Genlist_Item_Class * +elm_genlist_item_class_new(void) +EAPI void +elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc) +void +_elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc) +void +_elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc) genlist item class is maintained by genlist in automatic manner. And three fields are introduced in genlist item class. + int version; + unsigned int refcount; + Eina_Bool delete_me; Normally a user add a elm_genlist_item_class by elm_genlist_item_class_new(). Then its reference counter is automatic maintained. If the user wanna to remove the elm_genlist_item_class, then call elm_genlist_item_class_free() After refcount reaches to 0, it will be removed. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@68147 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/bin/test.c b/src/bin/test.c index 33a616a..a171781 100644 --- a/src/bin/test.c +++ b/src/bin/test.c @@ -11,7 +11,9 @@ void test_bg_options(void *data, Evas_Object *obj, void *event_info); void test_icon(void *data, Evas_Object *obj, void *event_info); void test_box_vert(void *data, Evas_Object *obj, void *event_info); void test_box_vert2(void *data, Evas_Object *obj, void *event_info); +void test_box_pack(void *data, Evas_Object *obj, void *event_info); void test_box_horiz(void *data, Evas_Object *obj, void *event_info); +void test_box_homo(void *data, Evas_Object *obj, void *event_info); void test_box_transition(void *data, Evas_Object *obj, void *event_info); void test_button(void *data, Evas_Object *obj, void *event_info); void test_cnp(void *data, Evas_Object *obj, void *event_info); @@ -340,7 +342,9 @@ add_tests: //------------------------------// ADD_TEST(NULL, "Containers", "Box Vert", test_box_vert); ADD_TEST(NULL, "Containers", "Box Vert 2", test_box_vert2); + ADD_TEST(NULL, "Containers", "Box Pack", test_box_pack); ADD_TEST(NULL, "Containers", "Box Horiz", test_box_horiz); + ADD_TEST(NULL, "Containers", "Box Homogeneous", test_box_homo); ADD_TEST(NULL, "Containers", "Box Transition", test_box_transition); ADD_TEST(NULL, "Containers", "Table", test_table); ADD_TEST(NULL, "Containers", "Table Homogeneous", test_table2); diff --git a/src/bin/test_box.c b/src/bin/test_box.c index bab0b7b..52518cd 100644 --- a/src/bin/test_box.c +++ b/src/bin/test_box.c @@ -3,6 +3,15 @@ # include "elementary_config.h" #endif #ifndef ELM_LIB_QUICKLAUNCH + +typedef enum +{ + BOX_PACK_POSITION_START, + BOX_PACK_POSITION_BEFORE, + BOX_PACK_POSITION_AFTER, + BOX_PACK_POSITION_END +} _Box_Pack_Position; + void test_box_vert(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { @@ -170,6 +179,323 @@ test_box_horiz(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i evas_object_show(win); } +static void +_unpack_btn_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *box, *radio; + Eina_List *rl, *l; + int value, svalue; + + box = (Evas_Object *) data; + + rl = (Eina_List *) evas_object_data_get(box, "radio-list"); + EINA_LIST_FOREACH(rl, l, radio) + { + value = elm_radio_value_get(radio); + svalue = elm_radio_state_value_get(radio); + + if (value != svalue) continue; + + elm_radio_value_set(radio, -1); + elm_box_unpack(box, radio); + rl = eina_list_remove(rl, radio); + evas_object_data_set(box, "radio-list", rl); + evas_object_del(radio); + } +} + +static void +_unpack_all_btn_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *box, *radio; + Eina_List *rl, *l; + + box = (Evas_Object *) data; + elm_box_unpack_all(box); + + rl = (Eina_List *) evas_object_data_get(box, "radio-list"); + EINA_LIST_FOREACH(rl, l, radio) evas_object_del(radio); + + evas_object_data_del(box, "radio-list"); + eina_list_free(rl); +} + +static Evas_Object * +_radio_new(Evas_Object *obj, int index) +{ + Evas_Object *ic, *rd; + char buf[PATH_MAX]; + + ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/icon_0%d.png", + elm_app_data_dir_get(), index); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + rd = elm_radio_add(obj); + elm_radio_state_value_set(rd, index); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_part_content_set(rd, "icon", ic); + + evas_object_show(rd); + evas_object_show(ic); + + return rd; +} + +static void +_pack(Evas_Object *box, _Box_Pack_Position pos) +{ + Evas_Object *radio; + Evas_Object *rd, *rdg = NULL; + Eina_List *rl, *l = NULL; + int value, svalue, count; + + rl = (Eina_List *) evas_object_data_get(box, "radio-list"); + if (!rl && (pos == BOX_PACK_POSITION_START || pos == BOX_PACK_POSITION_END)) + { + rd = _radio_new(box, 0); + if (pos == BOX_PACK_POSITION_START) elm_box_pack_start(box, rd); + else elm_box_pack_end(box, rd); + + l = eina_list_append(l, rd); + evas_object_data_set(box, "radio-list", l); + + rdg = rd; + evas_object_data_set(box, "radio-group", rdg); + + return; + } + + count = eina_list_count(rl); + EINA_LIST_FOREACH(rl, l, radio) + { + value = elm_radio_value_get(radio); + svalue = elm_radio_state_value_get(radio); + + if (value != svalue) continue; + + rd = _radio_new(box, count); + + switch(pos) + { + case BOX_PACK_POSITION_START: + elm_box_pack_start(box, rd); + break; + case BOX_PACK_POSITION_BEFORE: + elm_box_pack_before(box, rd, radio); + break; + case BOX_PACK_POSITION_AFTER: + elm_box_pack_after(box, rd, radio); + break; + case BOX_PACK_POSITION_END: + elm_box_pack_end(box, rd); + break; + } + + rdg = evas_object_data_get(box, "radio-group"); + elm_radio_group_add(rd, rdg); + + rl = eina_list_append(rl, rd); + evas_object_data_set(box, "radio-list", rl); + } +} + +static void +_pack_start_btn_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *box; + if (!data) return; + + box = (Evas_Object *) data; + _pack(box, BOX_PACK_POSITION_START); +} + +static void +_pack_before_btn_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *box; + if (!data) return; + + box = (Evas_Object *) data; + _pack(box, BOX_PACK_POSITION_BEFORE); +} + +static void +_pack_after_btn_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *box; + if (!data) return; + + box = (Evas_Object *) data; + _pack(box, BOX_PACK_POSITION_AFTER); +} + +static void +_pack_end_btn_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *box; + if (!data) return; + + box = (Evas_Object *) data; + _pack(box, BOX_PACK_POSITION_END); +} + +void +test_box_pack(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win, *bg; + Evas_Object *box, *lbox, *rbox; + Evas_Object *sc; + Evas_Object *bt; + Evas_Object *rd, *rdg = NULL; + Eina_List *l = NULL; + int i; + + win = elm_win_add(NULL, "box-pack", ELM_WIN_BASIC); + elm_win_title_set(win, "Box Pack"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + // left side + lbox = elm_box_add(win); + evas_object_size_hint_weight_set(lbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, 0, 1); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + + for(i = 0; i < 3; i++) + { + rd = _radio_new(win, i); + elm_box_pack_end(lbox, rd); + l = eina_list_append(l, rd); + if (i == 0) rdg = rd; + else elm_radio_group_add(rd, rdg); + } + + evas_object_data_set(lbox, "radio-list", l); + evas_object_data_set(lbox, "radio-group", rdg); + elm_object_content_set(sc, lbox); + evas_object_show(lbox); + elm_box_pack_end(box, sc); + evas_object_show(sc); + + // right side + rbox = elm_box_add(win); + evas_object_size_hint_weight_set(rbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(rbox); + elm_box_pack_end(box, rbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack Start"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_start_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack Before"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_before_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack After"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_after_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack End"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_end_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Unpack"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _unpack_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Unpack All"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _unpack_all_btn_cb, lbox); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +static void +_cb_check_changed(void *data, Evas_Object *obj, void *event __UNUSED__) +{ + Eina_Bool homo; + Evas_Object *box = data; + + homo = elm_check_state_get(obj); + elm_box_homogeneous_set(box, homo); + +} + +void +test_box_homo(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win, *bg; + Evas_Object *box, *o_bg; + Evas_Object *rd; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "box-homogeneous", ELM_WIN_BASIC); + elm_win_title_set(win, "Box Homogeneous"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + o_bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/twofish.jpg", elm_app_data_dir_get()); + elm_bg_file_set(o_bg, buf, NULL); + evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, o_bg); + + rd = elm_check_add(win); + elm_object_text_set(rd, "Homogeneous"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_check_changed, box); + elm_box_pack_end(box, rd); + evas_object_show(rd); + + evas_object_show(o_bg); + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + typedef struct { Eina_List *transitions; diff --git a/src/bin/test_genlist.c b/src/bin/test_genlist.c index c717cb6..aeb7c80 100644 --- a/src/bin/test_genlist.c +++ b/src/bin/test_genlist.c @@ -20,7 +20,7 @@ typedef struct _Testitem } Testitem; -static Elm_Genlist_Item_Class itc1; +static Elm_Genlist_Item_Class *itc1; char *gl_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) { char buf[256]; @@ -140,11 +140,12 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, over); - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; bt_50 = elm_button_add(win); elm_object_text_set(bt_50, "Go to 50"); @@ -158,7 +159,7 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf for (i = 0; i < 2000; i++) { - gli = elm_genlist_item_append(gl, &itc1, + gli = elm_genlist_item_append(gl, itc1, (void *)(long)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, @@ -169,6 +170,8 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf else if (i == 1500) evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli); } + elm_genlist_item_class_free(itc1); + evas_object_resize(win, 480, 800); evas_object_show(win); } @@ -188,13 +191,13 @@ my_gl_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) Evas_Object *gl = data; static int i = 0; - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)(long)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, @@ -210,11 +213,11 @@ my_gl_insert_before(void *data, Evas_Object *obj __UNUSED__, void *event_info __ static int i = 0; Elm_Object_Item *gli_selected; - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) @@ -223,7 +226,7 @@ my_gl_insert_before(void *data, Evas_Object *obj __UNUSED__, void *event_info __ return ; } - elm_genlist_item_insert_before(gl, &itc1, + elm_genlist_item_insert_before(gl, itc1, (void *)(long)i/* item data */, NULL/* parent */, gli_selected /* item before */, @@ -240,11 +243,11 @@ my_gl_insert_after(void *data, Evas_Object *obj __UNUSED__, void *event_info __U static int i = 0; Elm_Object_Item *gli_selected; - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) @@ -253,7 +256,7 @@ my_gl_insert_after(void *data, Evas_Object *obj __UNUSED__, void *event_info __U return ; } - elm_genlist_item_insert_after(gl, &itc1, + elm_genlist_item_insert_after(gl, itc1, (void *)(long)i/* item data */, NULL/* parent */, gli_selected /* item after */, @@ -367,34 +370,34 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(gl); - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; - gli[0] = elm_genlist_item_append(gl, &itc1, + gli[0] = elm_genlist_item_append(gl, itc1, (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1001/* func data */); - gli[1] = elm_genlist_item_append(gl, &itc1, + gli[1] = elm_genlist_item_append(gl, itc1, (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1002/* func data */); - gli[2] = elm_genlist_item_append(gl, &itc1, + gli[2] = elm_genlist_item_append(gl, itc1, (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1003/* func data */); - gli[3] = elm_genlist_item_prepend(gl, &itc1, + gli[3] = elm_genlist_item_prepend(gl, itc1, (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1004/* func data */); - gli[4] = elm_genlist_item_prepend(gl, &itc1, + gli[4] = elm_genlist_item_prepend(gl, itc1, (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1005/* func data */); - gli[5] = elm_genlist_item_insert_before(gl, &itc1, + gli[5] = elm_genlist_item_insert_before(gl, itc1, (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1006/* func data */); - gli[6] = elm_genlist_item_insert_after(gl, &itc1, + gli[6] = elm_genlist_item_insert_after(gl, itc1, (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)1007/* func data */); - elm_box_pack_end(bx, gl); bx2 = elm_box_add(win); @@ -504,6 +507,9 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in elm_box_pack_end(bx, bx3); evas_object_show(bx3); + /* item_class_ref is needed for itc1. some items can be added in callbacks */ + elm_genlist_item_class_ref(itc1); + elm_genlist_item_class_free(itc1); evas_object_resize(win, 320, 320); evas_object_show(win); @@ -1390,11 +1396,12 @@ test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in elm_box_pack_end(bx, gl); evas_object_show(gl); - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; itc_group.item_style = "group_index"; itc_group.func.text_get = gl8_text_get; @@ -1491,7 +1498,7 @@ test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in } else if (git) { - gli = elm_genlist_item_append(gl, &itc1, + gli = elm_genlist_item_append(gl, itc1, (void *)(long)i/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, @@ -1524,6 +1531,7 @@ test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in break; } } + elm_genlist_item_class_free(itc1); evas_object_resize(win, 480, 800); evas_object_show(win); @@ -1538,17 +1546,17 @@ gl9_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) Evas_Object *gl = elm_object_item_widget_get(glit); int val = (int)(long) elm_object_item_data_get(glit); val *= 10; - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)(long) (val + 1)/* item data */, glit/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)(long) (val + 2)/* item data */, glit/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)(long) (val + 3)/* item data */, glit/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, @@ -1603,11 +1611,12 @@ test_genlist9(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in elm_box_pack_end(bx, gl); evas_object_show(gl); - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; itc_group.item_style = "group_index"; itc_group.func.text_get = gl8_text_get; @@ -1619,28 +1628,29 @@ test_genlist9(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_display_only_set(git, EINA_TRUE); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, NULL/* func data */); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, NULL/* func data */); git = elm_genlist_item_append(gl, &itc_group, (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, NULL/* func data */); elm_genlist_item_display_only_set(git, EINA_TRUE); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, NULL/* func data */); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, NULL/* func data */); - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, NULL/* func data */); + elm_genlist_item_class_free(itc1); evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, gl); evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, gl); @@ -1875,22 +1885,25 @@ test_genlist11(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i elm_box_pack_end(bx, tg); evas_object_show(tg); - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; evas_object_smart_callback_add(gl, "moved", (Evas_Smart_Cb)gl_moved, gl); for (i = 0; i < 50; i++) elm_genlist_item_append(gl, - &itc1, + itc1, (void *)(1 + i)/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE/* flags */, NULL/* func */, NULL/* func data */); + elm_genlist_item_class_free(itc1); + elm_box_pack_end(bx, gl); evas_object_resize(win, 400, 500); @@ -1929,21 +1942,22 @@ test_genlist12(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i elm_box_pack_end(bx, gl); evas_object_show(gl); - itc1.item_style = "message"; - itc1.func.text_get = gl12_text_get; - itc1.func.content_get = gl_content_get; - itc1.func.state_get = gl_state_get; - itc1.func.del = gl_del; + itc1->item_style = "message"; + itc1->func.text_get = gl12_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.state_get = gl_state_get; + itc1->func.del = gl_del; for (i = 0; i < 1000; i++) { - elm_genlist_item_append(gl, &itc1, + elm_genlist_item_append(gl, itc1, (void *)(long)i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, (void *)(long)(i * 10)/* func data */); } + elm_genlist_item_class_free(itc1); evas_object_resize(win, 400, 500); evas_object_show(win); @@ -2047,11 +2061,11 @@ my_gl_insert_before_rel(void *data, Evas_Object *obj __UNUSED__, void *event_inf static int i = 1000; Elm_Object_Item *gli_selected; - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = NULL; - itc1.func.state_get = NULL; - itc1.func.del = NULL; + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = NULL; + itc1->func.state_get = NULL; + itc1->func.del = NULL; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) @@ -2060,7 +2074,7 @@ my_gl_insert_before_rel(void *data, Evas_Object *obj __UNUSED__, void *event_inf return; } - elm_genlist_item_insert_before(gl, &itc1, + elm_genlist_item_insert_before(gl, itc1, (void *)(long)i/* item data */, elm_genlist_item_parent_get(gli_selected), gli_selected/* item before */, @@ -2076,11 +2090,11 @@ my_gl_insert_after_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info static int i = 0; Elm_Object_Item *gli_selected; - itc1.item_style = "default"; - itc1.func.text_get = gl_text_get; - itc1.func.content_get = NULL; - itc1.func.state_get = NULL; - itc1.func.del = NULL; + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = NULL; + itc1->func.state_get = NULL; + itc1->func.del = NULL; gli_selected = elm_genlist_selected_item_get(gl); if (!gli_selected) @@ -2089,7 +2103,7 @@ my_gl_insert_after_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info return; } - elm_genlist_item_insert_after(gl, &itc1, + elm_genlist_item_insert_after(gl, itc1, (void *)(long)i/* item data */, elm_genlist_item_parent_get(gli_selected), gli_selected/* item after */, @@ -2137,6 +2151,8 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(gl); + itc1 = elm_genlist_item_class_new(); + itc4.item_style = "default"; itc4.func.text_get = gl4_text_get; itc4.func.content_get = NULL; @@ -2259,6 +2275,10 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i elm_box_pack_end(bx, bx2); evas_object_show(bx2); + /* item_class_ref is needed for itc1. some items can be added in callbacks */ + elm_genlist_item_class_ref(itc1); + elm_genlist_item_class_free(itc1); + evas_object_resize(win, 320, 320); evas_object_show(win); } diff --git a/src/bin/test_store.c b/src/bin/test_store.c index 12498af..5af6078 100644 --- a/src/bin/test_store.c +++ b/src/bin/test_store.c @@ -39,10 +39,7 @@ _st_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in } // store callbacks to handle loading/parsing/freeing of store items from src -static Elm_Genlist_Item_Class itc1 = -{ - "message", { NULL, NULL, NULL, NULL} -}; +static Elm_Genlist_Item_Class *itc1; static const Elm_Store_Item_Mapping it1_mapping[] = { @@ -112,7 +109,7 @@ _st_store_list(void *data __UNUSED__, Elm_Store_Item_Info *item_info) // choose the item genlist item class to use (only item style should be // provided by the app, store will fill everything else in, so it also // has to be writable - info->base.item_class = &itc1; // based on item info - return the item class wanted (only style field used - rest reset to internal funcs store sets up to get label/icon etc) + info->base.item_class = itc1; // based on item info - return the item class wanted (only style field used - rest reset to internal funcs store sets up to get label/icon etc) info->base.mapping = it1_mapping; info->base.data = NULL; // if we can already parse and load all of item here and want to - set this return EINA_TRUE; // return true to include this, false not to @@ -260,6 +257,9 @@ test_store(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info elm_box_pack_end(bx, gl); evas_object_show(gl); + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "message"; + st = elm_store_filesystem_new(); elm_store_list_func_set(st, _st_store_list, NULL); elm_store_fetch_func_set(st, _st_store_fetch, NULL); @@ -269,6 +269,10 @@ test_store(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info elm_store_target_genlist_set(st, gl); elm_store_filesystem_directory_set(st, "./store"); + /* item_class_ref is needed for itc1. some items can be added in callbacks */ + elm_genlist_item_class_ref(itc1); + elm_genlist_item_class_free(itc1); + evas_object_resize(win, 480, 800); evas_object_show(win); } diff --git a/src/lib/elc_fileselector.c b/src/lib/elc_fileselector.c index 6bbbd68..d768e27 100644 --- a/src/lib/elc_fileselector.c +++ b/src/lib/elc_fileselector.c @@ -78,15 +78,11 @@ typedef enum { ELM_FILE_LAST } Elm_Fileselector_Type; -static Elm_Genlist_Item_Class list_itc[ELM_FILE_LAST] = { - { "default", { NULL, NULL, NULL, NULL } }, - { "default", { NULL, NULL, NULL, NULL } }, - { "default", { NULL, NULL, NULL, NULL } } -}; +static Elm_Genlist_Item_Class *list_itc[ELM_FILE_LAST]; static Elm_Gengrid_Item_Class grid_itc[ELM_FILE_LAST] = { - { "default", { NULL, NULL, NULL, NULL } }, - { "default", { NULL, NULL, NULL, NULL } }, - { "default", { NULL, NULL, NULL, NULL } } + { ELM_GENGRID_ITEM_CLASS_HEADER, "default", { NULL, NULL, NULL, NULL } }, + { ELM_GENGRID_ITEM_CLASS_HEADER, "default", { NULL, NULL, NULL, NULL } }, + { ELM_GENGRID_ITEM_CLASS_HEADER, "default", { NULL, NULL, NULL, NULL } }, }; static const char *widtype = NULL; @@ -131,6 +127,10 @@ _del_hook(Evas_Object *obj) wd = elm_widget_data_get(obj); if (!wd) return; + elm_genlist_item_class_free(list_itc[ELM_DIRECTORY]); + elm_genlist_item_class_free(list_itc[ELM_FILE_IMAGE]); + elm_genlist_item_class_free(list_itc[ELM_FILE_UNKNOW]); + #ifdef HAVE_EIO if (wd->current) eio_file_cancel(wd->current); @@ -562,19 +562,19 @@ _filter_cb(void *data __UNUSED__, Eio_File *handler, const Eina_File_Direct_Info if (info->type == EINA_FILE_DIR) { eio_file_associate_direct_add(handler, "type/grid", &grid_itc[ELM_DIRECTORY], NULL); - eio_file_associate_direct_add(handler, "type/list", &list_itc[ELM_DIRECTORY], NULL); + eio_file_associate_direct_add(handler, "type/list", list_itc[ELM_DIRECTORY], NULL); } else { if (evas_object_image_extension_can_load_get(info->path + info->name_start)) { eio_file_associate_direct_add(handler, "type/grid", &grid_itc[ELM_FILE_IMAGE], NULL); - eio_file_associate_direct_add(handler, "type/list", &list_itc[ELM_FILE_IMAGE], NULL); + eio_file_associate_direct_add(handler, "type/list", list_itc[ELM_FILE_IMAGE], NULL); } else { eio_file_associate_direct_add(handler, "type/grid", &grid_itc[ELM_FILE_UNKNOW], NULL); - eio_file_associate_direct_add(handler, "type/list", &list_itc[ELM_FILE_UNKNOW], NULL); + eio_file_associate_direct_add(handler, "type/list", list_itc[ELM_FILE_UNKNOW], NULL); } } @@ -610,12 +610,12 @@ _file_list_cmp(const void *a, const void *b) const Elm_Genlist_Item_Class *ca = elm_genlist_item_item_class_get(la); const Elm_Genlist_Item_Class *cb = elm_genlist_item_item_class_get(lb); - if (ca == &list_itc[ELM_DIRECTORY]) + if (ca == list_itc[ELM_DIRECTORY]) { - if (cb != &list_itc[ELM_DIRECTORY]) + if (cb != list_itc[ELM_DIRECTORY]) return -1; } - else if (cb == &list_itc[ELM_DIRECTORY]) + else if (cb == list_itc[ELM_DIRECTORY]) { return 1; } @@ -658,7 +658,7 @@ _main_cb(void *data, Eio_File *handler, const Eina_File_Direct_Info *info __UNUS if (wr->wd->mode == ELM_FILESELECTOR_LIST) { - Eina_Bool is_dir = (eio_file_associate_find(handler, "type/list") == &list_itc[ELM_DIRECTORY]); + Eina_Bool is_dir = (eio_file_associate_find(handler, "type/list") == list_itc[ELM_DIRECTORY]); elm_genlist_item_direct_sorted_insert(wr->wd->files_list, eio_file_associate_find(handler, "type/list"), eina_stringshare_ref(eio_file_associate_find(handler, "filename")), @@ -755,7 +755,7 @@ _populate(Evas_Object *obj, EINA_LIST_FREE(dirs, real) { if (wd->mode == ELM_FILESELECTOR_LIST) - elm_genlist_item_append(wd->files_list, &list_itc[ELM_DIRECTORY], + elm_genlist_item_append(wd->files_list, list_itc[ELM_DIRECTORY], real, /* item data */ parent, wd->expand ? ELM_GENLIST_ITEM_SUBITEMS : @@ -773,7 +773,7 @@ _populate(Evas_Object *obj, ELM_FILE_IMAGE : ELM_FILE_UNKNOW; if (wd->mode == ELM_FILESELECTOR_LIST) - elm_genlist_item_append(wd->files_list, &list_itc[type], + elm_genlist_item_append(wd->files_list, list_itc[type], real, /* item data */ parent, ELM_GENLIST_ITEM_NONE, NULL, NULL); @@ -863,15 +863,20 @@ elm_fileselector_add(Evas_Object *parent) elm_widget_sub_object_add(obj, bt); wd->home_button = bt; - list_itc[ELM_DIRECTORY].func.content_get = grid_itc[ELM_DIRECTORY].func.content_get = _itc_icon_folder_get; - list_itc[ELM_FILE_IMAGE].func.content_get = grid_itc[ELM_FILE_IMAGE].func.content_get = _itc_icon_image_get; - list_itc[ELM_FILE_UNKNOW].func.content_get = grid_itc[ELM_FILE_UNKNOW].func.content_get = _itc_icon_file_get; + list_itc[ELM_DIRECTORY] = elm_genlist_item_class_new(); + list_itc[ELM_FILE_IMAGE] = elm_genlist_item_class_new(); + list_itc[ELM_FILE_UNKNOW] = elm_genlist_item_class_new(); + + list_itc[ELM_DIRECTORY]->func.content_get = grid_itc[ELM_DIRECTORY].func.content_get = _itc_icon_folder_get; + list_itc[ELM_FILE_IMAGE]->func.content_get = grid_itc[ELM_FILE_IMAGE].func.content_get = _itc_icon_image_get; + list_itc[ELM_FILE_UNKNOW]->func.content_get = grid_itc[ELM_FILE_UNKNOW].func.content_get = _itc_icon_file_get; for (i = 0; i < ELM_FILE_LAST; ++i) { - list_itc[i].func.text_get = grid_itc[i].func.text_get = _itc_text_get; - list_itc[i].func.state_get = grid_itc[i].func.state_get = _itc_state_get; - list_itc[i].func.del = grid_itc[i].func.del = _itc_del; + list_itc[i]->item_style = "default"; + list_itc[i]->func.text_get = grid_itc[i].func.text_get = _itc_text_get; + list_itc[i]->func.state_get = grid_itc[i].func.state_get = _itc_state_get; + list_itc[i]->func.del = grid_itc[i].func.del = _itc_del; } li = elm_genlist_add(parent); diff --git a/src/lib/elm_deprecated_before.h b/src/lib/elm_deprecated_before.h index 86ac8f9..97cf026 100644 --- a/src/lib/elm_deprecated_before.h +++ b/src/lib/elm_deprecated_before.h @@ -9,6 +9,9 @@ typedef Eina_Bool (*Elm_Gen_Item_State_Get_Cb)(void *data, E typedef void (*Elm_Gen_Item_Del_Cb)(void *data, Evas_Object *obj); /**< Deletion class function for gen item classes. */ struct _Elm_Gen_Item_Class { + int version; + unsigned int refcount; + Eina_Bool delete_me : 1; const char *item_style; struct _Elm_Gen_Item_Class_Func { diff --git a/src/lib/elm_gengrid.h b/src/lib/elm_gengrid.h index 4b5a043..b7a4605 100644 --- a/src/lib/elm_gengrid.h +++ b/src/lib/elm_gengrid.h @@ -223,6 +223,8 @@ */ typedef struct _Elm_Gengrid_Item_Class Elm_Gengrid_Item_Class; /**< Gengrid item class definition structs */ +#define ELM_GENGRID_ITEM_CLASS_HEADER 0, 0, 0 + #define Elm_Gengrid_Item_Class Elm_Gen_Item_Class typedef struct _Elm_Gengrid_Item_Class_Func Elm_Gengrid_Item_Class_Func; /**< Class functions for gengrid item classes. */ diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index b36e4cf..ad98448 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -796,6 +796,7 @@ _item_del(Elm_Gen_Item *it) it->parent->item->items = eina_list_remove(it->parent->item->items, it); if (it->item->swipe_timer) ecore_timer_del(it->item->swipe_timer); _elm_genlist_item_del_serious(it); + elm_genlist_item_class_unref((Elm_Genlist_Item_Class *)it->itc); evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); } @@ -3323,6 +3324,7 @@ _elm_genlist_item_new(Widget_Data *wd, it->wd = wd; it->generation = wd->generation; it->itc = itc; + elm_genlist_item_class_ref((Elm_Genlist_Item_Class *)itc); it->base.data = data; it->parent = parent; it->func.func = func; @@ -5331,6 +5333,57 @@ elm_genlist_item_flags_get(const Elm_Object_Item *it) return _it->item->flags; } +EAPI Elm_Genlist_Item_Class * +elm_genlist_item_class_new(void) +{ + Elm_Genlist_Item_Class *itc; + + itc = calloc(1, sizeof(Elm_Genlist_Item_Class)); + if (!itc) + return NULL; + itc->version = ELM_GENLIST_ITEM_CLASS_VERSION; + itc->refcount = 1; + itc->delete_me = EINA_FALSE; + + return itc; +} + +EAPI void +elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc) +{ + if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION)) + { + if (!itc->delete_me) itc->delete_me = EINA_TRUE; + if (itc->refcount > 0) elm_genlist_item_class_unref(itc); + else + { + itc->version = 0; + free(itc); + } + } +} + +EAPI void +elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc) +{ + if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION)) + { + itc->refcount++; + if (itc->refcount == 0) itc->refcount--; + } +} + +EAPI void +elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc) +{ + if (itc && (itc->version == ELM_GENLIST_ITEM_CLASS_VERSION)) + { + if (itc->refcount > 0) itc->refcount--; + if (itc->delete_me && (!itc->refcount)) + elm_genlist_item_class_free(itc); + } +} + /* for gengrid as of now */ void _elm_genlist_page_relative_set(Evas_Object *obj, diff --git a/src/lib/elm_genlist.h b/src/lib/elm_genlist.h index dda0ef6..2fcb9af 100644 --- a/src/lib/elm_genlist.h +++ b/src/lib/elm_genlist.h @@ -364,6 +364,7 @@ typedef enum ELM_GENLIST_ITEM_FIELD_STATE = (1 << 2) } Elm_Genlist_Item_Field_Flags; typedef struct _Elm_Genlist_Item_Class Elm_Genlist_Item_Class; /**< Genlist item class definition structs */ +#define ELM_GENLIST_ITEM_CLASS_HEADER 0, 0, 0 #define Elm_Genlist_Item_Class Elm_Gen_Item_Class typedef struct _Elm_Genlist_Item_Class_Func Elm_Genlist_Item_Class_Func; /**< Class functions for genlist item class */ @@ -1846,6 +1847,71 @@ EAPI Eina_Bool elm_genlist_reorder_mode_get(const Evas_Objec */ EAPI Elm_Genlist_Item_Flags elm_genlist_item_flags_get(const Elm_Object_Item *it); +#define ELM_GENLIST_ITEM_CLASS_VERSION 2 /* current version number */ + +/** + * Add a new genlist item class in a given genlist widget. + * + * @return New allocated a genlist item class. + * + * This adds genlist item class for the genlist widget. When adding a item, + * genlist_item_{append, prepend, insert} function needs item class of the item. + * Given callback paramters are used at retrieving {text, content} of + * added item. Set as NULL if it's not used. + * If there's no available memory, return can be NULL. + * + * @see elm_genlist_item_class_free() + * @see elm_genlist_item_append() + * + * @ingroup Genlist + */ +EAPI Elm_Genlist_Item_Class *elm_genlist_item_class_new(void); + +/** + * Remove a item class in a given genlist widget. + * + * @param itc The itc to be removed. + * + * This removes item class from the genlist widget. + * Whenever it has no more references to it, item class is going to be freed. + * Otherwise it just decreases its reference count. + * + * @see elm_genlist_item_class_new() + * @see elm_genlist_item_class_ref() + * @see elm_genlist_item_class_unref() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_class_free(Elm_Genlist_Item_Class *itc); + +/** + * Increments object reference count for the item class. + * + * @param itc The given item class object to reference + * + * This API just increases its reference count for item class management. + * + * @see elm_genlist_item_class_unref() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_class_ref(Elm_Genlist_Item_Class *itc); + +/** + * Decrements object reference count for the item class. + * + * @param itc The given item class object to reference + * + * This API just decreases its reference count for item class management. + * Reference count can't be less than 0. + * + * @see elm_genlist_item_class_ref() + * @see elm_genlist_item_class_free() + * + * @ingroup Genlist + */ +EAPI void elm_genlist_item_class_unref(Elm_Genlist_Item_Class *itc); + /** * @} */