tizen 2.4 release
[framework/uifw/elementary.git] / src / bin / test_genlist.c
index 68207cb..93e86e1 100644 (file)
@@ -4,11 +4,19 @@
 #include "elementary_config.h"
 #endif
 #include <Elementary.h>
-#ifndef ELM_LIB_QUICKLAUNCH
+
+Evas_Object * _elm_min_set(Evas_Object *obj, Evas_Object *parent,
+                           Evas_Coord w, Evas_Coord h);
+
 struct _api_data
 {
    unsigned int state;  /* What state we are testing       */
    void *box;           /* Use this to get box content     */
+
+   Elm_Genlist_Item_Class *itc;
+   Elm_Genlist_Item_Class *itc1;
+   Elm_Genlist_Item_Class *itc2;
+   void *gl;
 };
 typedef struct _api_data api_data;
 
@@ -83,7 +91,7 @@ set_api_state(api_data *api)
 }
 
 static void
-_api_bt_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {  /* Will add here a SWITCH command containing code to modify test-object */
    /* in accordance a->state value. */
    api_data *a = data;
@@ -112,15 +120,21 @@ typedef struct _Testitem
    Eina_Bool checked;
 } Testitem;
 
-static Elm_Genlist_Item_Class *itc1;
-char *gl_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+static char *
+gl_text_get1(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    char buf[256];
-   snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data);
+   int num = (int)(uintptr_t)data;
+
+   if (num == 5)
+     snprintf(buf, sizeof(buf), "Item # %i (Genlist Cleear on Select)", num);
+   else
+     snprintf(buf, sizeof(buf), "Item # %i", num);
+
    return strdup(buf);
 }
 
-Evas_Object *gl_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
+Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
 {
    char buf[PATH_MAX];
    Evas_Object *ic = elm_icon_add(obj);
@@ -133,17 +147,17 @@ Evas_Object *gl_content_get(void *data __UNUSED__, Evas_Object *obj, const char
    return ic;
 }
 
-static void on_bt_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+static void on_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    printf("button clicked\n");
 }
 
-static void on_ck_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+static void on_ck_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    printf("checkbox changed\n");
 }
 
-Evas_Object *gl_content_full_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
+Evas_Object *gl_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
 {
    Evas_Object *fr, *bx, *ic, *bt, *ck;
 
@@ -157,7 +171,9 @@ Evas_Object *gl_content_full_get(void *data __UNUSED__, Evas_Object *obj, const
 
    ic = elm_icon_add(bx);
    elm_icon_standard_set(ic, "home");
-   evas_object_size_hint_min_set(ic, 32, 32);
+   evas_object_size_hint_min_set(ic,
+                                 ELM_SCALE_SIZE(32),
+                                 ELM_SCALE_SIZE(32));
    evas_object_size_hint_align_set(ic, 0.5, EVAS_HINT_FILL);
    evas_object_show(ic);
    elm_box_pack_end(bx, ic);
@@ -179,13 +195,15 @@ Evas_Object *gl_content_full_get(void *data __UNUSED__, Evas_Object *obj, const
    elm_box_pack_end(bx, ck);
 
    elm_layout_content_set(fr, NULL, bx);
-   evas_object_size_hint_min_set(fr, 100, 100);
+   evas_object_size_hint_min_set(fr,
+                                 ELM_SCALE_SIZE(100),
+                                 ELM_SCALE_SIZE(100));
 
    return fr;
 }
 
 
-Eina_Bool gl_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+Eina_Bool gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    return EINA_FALSE;
 }
@@ -197,7 +215,14 @@ gl_sel(void *data, Evas_Object *obj, void *event_info)
 }
 
 static void
-_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl_sel_clear_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                void *event_info EINA_UNUSED)
+{
+   elm_genlist_clear(obj);
+}
+
+static void
+_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Evas_Object *gl = data;
    Evas_Event_Mouse_Move *ev = event_info;
@@ -205,49 +230,55 @@ _move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *even
    Elm_Object_Item *gli;
    gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where);
    if (gli)
-     INF("over %p, where %i", elm_object_item_data_get(gli), where);
+     INF("<%s> over %p, where %i\n", __func__, elm_object_item_data_get(gli), where);
    else
-     INF("over none, where %i", where);
+     INF("<%s> over none, where %i\n", __func__,where);
 }
 
 static void
-_bt50_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_bt50_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_IN);
 }
 
 static void
-_bt1500_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_bt1500_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
 }
 
 static void
-_gl_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    printf("selected: %p\n", event_info);
 }
 
 static void
-_gl_double_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    printf("double clicked: %p\n", event_info);
 }
 
 static void
-_gl_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+_gl_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   printf("right clicked: %p\n", event_info);
+}
+
+static void
+_gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    printf("longpress %p\n", event_info);
 }
 
 static void
-_cleanup_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    free(data);
 }
 
 void
-test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
    Evas_Object *over;
@@ -260,8 +291,8 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf
    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bxx = elm_box_add(win);
-   elm_win_resize_object_add(win, bxx);
    evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bxx);
    evas_object_show(bxx);
 
    bx = elm_box_add(win);
@@ -282,6 +313,7 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf
    gl = elm_genlist_add(win);
    evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL);
    evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL);
+   evas_object_smart_callback_add(gl, "clicked,right", _gl_right_clicked, NULL);
    evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL);
    // FIXME: This causes genlist to resize the horiz axis very slowly :(
    // Reenable this and resize the window horizontally, then try to resize it back
@@ -294,17 +326,17 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf
    over = evas_object_rectangle_add(evas_object_evas_get(win));
    evas_object_color_set(over, 0, 0, 0, 0);
    evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
-   evas_object_repeat_events_set(over, 1);
+   evas_object_repeat_events_set(over, EINA_TRUE);
    evas_object_show(over);
    evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(win, over);
 
-   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       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get1;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
    bt_50 = elm_button_add(win);
    elm_object_text_set(bt_50, "Go to 50");
@@ -318,18 +350,31 @@ 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,
-                                      (void *)(long)i/* item data */,
-                                      NULL/* parent */,
-                                      ELM_GENLIST_ITEM_NONE,
-                                      gl_sel/* func */,
-                                      (void *)(long)(i * 10)/* func data */);
+        if (i == 5)
+          {
+             gli = elm_genlist_item_append(gl, api->itc1,
+                                           (void *)(uintptr_t)i/* item data */,
+                                           NULL/* parent */,
+                                           ELM_GENLIST_ITEM_NONE,
+                                           gl_sel_clear_cb/* func */,
+                                           (void *)(uintptr_t)(i * 10)/* func data */);
+          }
+        else
+          {
+             gli = elm_genlist_item_append(gl, api->itc1,
+                                           (void *)(uintptr_t)i/* item data */,
+                                           NULL/* parent */,
+                                           ELM_GENLIST_ITEM_NONE,
+                                           gl_sel/* func */,
+                                           (void *)(uintptr_t)(i * 10)/* func data */);
+          }
+
         if (i == 50)
           evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
         else if (i == 1500)
           evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
      }
-   elm_genlist_item_class_free(itc1);
+   elm_genlist_item_class_free(api->itc1);
 
    evas_object_resize(win, 480, 800);
    evas_object_show(win);
@@ -338,47 +383,65 @@ test_genlist(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf
 /*************/
 
 static void
-my_gl_clear(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
-   elm_genlist_clear(gl);
+   elm_genlist_clear(data);
 }
 
+static char *
+gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+   char buf[256];
+   snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
+   return strdup(buf);
+}
 static void
-my_gl_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;   
    static int i = 0;
 
-   if (!itc1) 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       = NULL;
+   if (!api->itc1)
+     {
+        ERR("Genlist item class should not be null. Something very bad is happening!!");
+        return;
+     }
+
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
-   elm_genlist_item_append(gl, itc1,
-                           (void *)(long)i/* item data */,
+   elm_genlist_item_append(gl, api->itc1,
+                           (void *)(uintptr_t)i/* item data */,
                            NULL/* parent */,
                            ELM_GENLIST_ITEM_NONE,
                            gl_sel/* func */,
-                           (void *)(long)(i * 10)/* func data */);
+                           (void *)(uintptr_t)(i * 10)/* func data */);
    i++;
 }
 
 static void
-my_gl_insert_before(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_insert_before(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    static int i = 0;
    Elm_Object_Item *gli_selected;
 
-   if (!itc1) 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       = NULL;
+   if (!api->itc1)
+     {
+        ERR("Genlist item class should not be null. Something very bad is happening!!");
+        return;
+     }
+
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
    gli_selected = elm_genlist_selected_item_get(gl);
    if (!gli_selected)
@@ -387,29 +450,35 @@ my_gl_insert_before(void *data, Evas_Object *obj __UNUSED__, void *event_info __
         return ;
      }
 
-   elm_genlist_item_insert_before(gl, itc1,
-                                  (void *)(long)i/* item data */,
+   elm_genlist_item_insert_before(gl, api->itc1,
+                                  (void *)(uintptr_t)i/* item data */,
                                   NULL/* parent */,
                                   gli_selected /* item before */,
                                   ELM_GENLIST_ITEM_NONE,
                                   gl_sel/* func */,
-                                  (void *)(long)(i * 10)/* func data */);
+                                  (void *)(uintptr_t)(i * 10)/* func data */);
    i++;
 }
 
 static void
-my_gl_insert_after(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_insert_after(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    static int i = 0;
    Elm_Object_Item *gli_selected;
 
-   if (!itc1) 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       = NULL;
+   if (!api->itc1)
+     {
+        ERR("Genlist item class should not be null. Something very bad is happening!!");
+        return;
+     }
+
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
    gli_selected = elm_genlist_selected_item_get(gl);
    if (!gli_selected)
@@ -418,20 +487,21 @@ my_gl_insert_after(void *data, Evas_Object *obj __UNUSED__, void *event_info __U
         return ;
      }
 
-   elm_genlist_item_insert_after(gl, itc1,
-                                 (void *)(long)i/* item data */,
+   elm_genlist_item_insert_after(gl, api->itc1,
+                                 (void *)(uintptr_t)i/* item data */,
                                  NULL/* parent */,
                                  gli_selected /* item after */,
                                  ELM_GENLIST_ITEM_NONE,
                                  gl_sel/* func */,
-                                 (void *)(long)(i * 10)/* func data */);
+                                 (void *)(uintptr_t)(i * 10)/* func data */);
    i++;
 }
 
 static void
-my_gl_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
    if (!gli)
      {
@@ -442,9 +512,10 @@ my_gl_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 }
 
 static void
-my_gl_disable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    Elm_Object_Item *gli = elm_genlist_selected_item_get(gl);
    if (!gli)
      {
@@ -457,9 +528,10 @@ my_gl_disable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED
 }
 
 static void
-my_gl_update_all(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_update_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    int i = 0;
    Elm_Object_Item *it = elm_genlist_first_item_get(gl);
    while (it)
@@ -472,9 +544,10 @@ my_gl_update_all(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNU
 }
 
 static void
-my_gl_first(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    Elm_Object_Item *gli = elm_genlist_first_item_get(gl);
    if (!gli) return;
    elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
@@ -482,9 +555,10 @@ my_gl_first(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__
 }
 
 static void
-my_gl_last(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    Elm_Object_Item *gli = elm_genlist_last_item_get(gl);
    if (!gli) return;
    elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN);
@@ -492,34 +566,45 @@ my_gl_last(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 }
 
 static Eina_Bool
-my_gl_flush_delay(void *data __UNUSED__)
+my_gl_flush_delay(void *data EINA_UNUSED)
 {
    elm_cache_all_flush();
    return ECORE_CALLBACK_CANCEL;
 }
 
 static void
-my_gl_flush(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_flush(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    ecore_timer_add(1.2, my_gl_flush_delay, NULL);
 }
 
+static void
+_genlist_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                void *event_info EINA_UNUSED)
+{
+   if (!data) return;
+
+   elm_genlist_item_class_free(data);
+}
+
 void
-test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *bg, *gl, *bx, *bx2, *bx3, *bt;
    Elm_Object_Item *gli[10];
    char buf[PATH_MAX];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_add(NULL, "genlist2", ELM_WIN_BASIC);
    elm_win_title_set(win, "Genlist 2");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bg = elm_bg_add(win);
    snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get());
    elm_bg_file_set(bg, buf, NULL);
-   elm_win_resize_object_add(win, bg);
    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bg);
    evas_object_show(bg);
 
    bx = elm_box_add(win);
@@ -531,34 +616,35 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
 
-   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       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get  = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
-   gli[0] = elm_genlist_item_append(gl, itc1,
+   gli[0] = elm_genlist_item_append(gl, api->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, api->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, api->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, api->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, api->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, api->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, api->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);
@@ -571,7 +657,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "/\\");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_first, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_first, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -579,7 +665,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "\\/");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_last, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_last, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -587,7 +673,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "#");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_disable, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_disable, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -595,7 +681,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "U");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -620,7 +706,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "+");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_add, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_add, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -628,7 +714,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "-");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_del, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_del, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -645,7 +731,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "+ before");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx3, bt);
@@ -653,7 +739,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "+ after");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx3, bt);
@@ -661,7 +747,7 @@ test_genlist2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "Flush");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_flush, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_flush, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx3, bt);
@@ -670,19 +756,14 @@ 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_event_callback_add(gl, EVAS_CALLBACK_DEL, _genlist_del_cb, api->itc1);
+   
    evas_object_resize(win, 320, 320);
    evas_object_show(win);
 }
 
 /*************/
-
-static Elm_Genlist_Item_Class itc2;
-
-char *gl2_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+char *gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    const Testitem *tit = data;
    char buf[256];
@@ -723,13 +804,13 @@ Evas_Object *gl2_content_get(void *data, Evas_Object *obj, const char *part)
    return ic;
 }
 
-Eina_Bool gl2_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+Eina_Bool gl2_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    return EINA_FALSE;
 }
 
 static void
-my_gl_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Testitem *tit = data;
    tit->mode++;
@@ -737,7 +818,7 @@ my_gl_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED_
 }
 
 static void
-my_gl_labels_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_labels_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Testitem *tit = data;
    tit->mode++;
@@ -745,7 +826,7 @@ my_gl_labels_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __
 }
 
 static void
-my_gl_contents_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_contents_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Testitem *tit = data;
    tit->mode++;
@@ -753,13 +834,15 @@ my_gl_contents_update(void *data, Evas_Object *obj __UNUSED__, void *event_info
 }
 
 void
-test_genlist3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bx, *bx2, *bt;
    static Testitem tit[3];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist3", "Genlist 3");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -771,22 +854,23 @@ test_genlist3(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);
 
-   itc2.item_style     = "default";
-   itc2.func.text_get = gl2_text_get;
-   itc2.func.content_get  = gl2_content_get;
-   itc2.func.state_get = gl2_state_get;
-   itc2.func.del       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl2_text_get;
+   api->itc1->func.content_get = gl2_content_get;
+   api->itc1->func.state_get = gl2_state_get;
+   api->itc1->func.del = NULL;
 
    tit[0].mode = 0;
-   tit[0].item = elm_genlist_item_append(gl, &itc2,
+   tit[0].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
    tit[1].mode = 1;
-   tit[1].item = elm_genlist_item_append(gl, &itc2,
+   tit[1].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
    tit[2].mode = 2;
-   tit[2].item = elm_genlist_item_append(gl, &itc2,
+   tit[2].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
 
@@ -826,6 +910,7 @@ test_genlist3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    elm_box_pack_end(bx, bx2);
    evas_object_show(bx2);
 
+   elm_genlist_item_class_free(api->itc1);
    evas_object_resize(win, 320, 320);
    evas_object_show(win);
 }
@@ -833,16 +918,14 @@ test_genlist3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 /*************/
 
 static void
-my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    Testitem *tit = data;
    tit->onoff = elm_check_state_get(obj);
    printf("item %p onoff = %i\n", tit, tit->onoff);
 }
 
-static Elm_Genlist_Item_Class itc3;
-
-char *gl3_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+char *gl3_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    const Testitem *tit = data;
    char buf[256];
@@ -875,19 +958,38 @@ Evas_Object *gl3_content_get(void *data, Evas_Object *obj, const char *part)
    return NULL;
 }
 
-Eina_Bool gl3_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+Eina_Bool gl3_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    return EINA_FALSE;
 }
 
+static void _realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei)
+{
+   Evas_Object *check;
+   Eina_List *items;
+   items = NULL;
+
+   if (!ei) return;
+   Elm_Object_Item *item = ei;
+
+   check = elm_object_item_part_content_get(item, "elm.swallow.end");
+
+   if (!check) return;
+
+   items = eina_list_append(items, check);
+   elm_object_item_access_order_set(item, items);
+}
+
 void
-test_genlist4(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bx, *bx2, *bt;
    static Testitem tit[3];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist4", "Genlist 4");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -896,30 +998,35 @@ test_genlist4(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
    gl = elm_genlist_add(win);
    elm_genlist_mode_set(gl, ELM_LIST_COMPRESS);
-   elm_genlist_multi_select_set(gl, 1);
+   elm_genlist_multi_select_set(gl, EINA_TRUE);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
 
-   itc3.item_style     = "default";
-   itc3.func.text_get = gl3_text_get;
-   itc3.func.content_get  = gl3_content_get;
-   itc3.func.state_get = gl3_state_get;
-   itc3.func.del       = NULL;
+   evas_object_smart_callback_add(gl, "realized", _realized, NULL);
+
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl3_text_get;
+   api->itc1->func.content_get = gl3_content_get;
+   api->itc1->func.state_get = gl3_state_get;
+   api->itc1->func.del = NULL;
 
    tit[0].mode = 0;
-   tit[0].item = elm_genlist_item_append(gl, &itc3,
+   tit[0].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
    tit[1].mode = 1;
-   tit[1].item = elm_genlist_item_append(gl, &itc3,
+   tit[1].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
    tit[2].mode = 2;
-   tit[2].item = elm_genlist_item_append(gl, &itc3,
+   tit[2].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
 
+   elm_genlist_item_class_free(api->itc1);
    elm_box_pack_end(bx, gl);
    evas_object_show(bx);
 
@@ -963,19 +1070,17 @@ test_genlist4(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 /*************/
 
 static void
-my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    Testitem *tit = data;
    tit->onoff = elm_check_state_get(obj);
    printf("item %p onoff = %i\n", tit, tit->onoff);
 }
 
-static Elm_Genlist_Item_Class itc5;
-
-char *gl5_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
+char *gl5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
 {
    const Testitem *tit = data;
-   char buf[256];
+   char buf[256] = { 0 };
    if (!strcmp(part, "elm.text"))
      {
         snprintf(buf, sizeof(buf), "Item mode %i", tit->mode);
@@ -999,12 +1104,12 @@ Evas_Object *gl5_content_get(void *data, Evas_Object *obj, const char *part)
         ic = elm_icon_add(obj);
         snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get());
         elm_image_file_set(ic, buf, NULL);
-        elm_image_resizable_set(ic, 0, 0);
+        elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
         evas_object_show(ic);
         elm_box_pack_end(bx, ic);
         ic = elm_icon_add(obj);
         elm_image_file_set(ic, buf, NULL);
-        elm_image_resizable_set(ic, 0, 0);
+        elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
         evas_object_show(ic);
         elm_box_pack_end(bx, ic);
         elm_box_horizontal_set(bx, EINA_TRUE);
@@ -1024,85 +1129,88 @@ Evas_Object *gl5_content_get(void *data, Evas_Object *obj, const char *part)
    return NULL;
 }
 
-Eina_Bool gl5_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+Eina_Bool gl5_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    return EINA_FALSE;
 }
 
 static void
-item_drag_up(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+item_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("drag up");
 }
 
 static void
-item_drag_down(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+item_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("drag down");
 }
 
 static void
-item_drag_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+item_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("drag left");
 }
 
 static void
-item_drag_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+item_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("drag right");
 }
 
 static void
-scroll_top(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+scroll_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("Top edge!");
 }
 
 static void
-scroll_bottom(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+scroll_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("Bottom edge!");
 }
 
 static void
-scroll_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+scroll_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("Left edge!");
 }
 
 static void
-scroll_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+scroll_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("Right edge!");
 }
 
 static void
-item_drag(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+item_drag(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("drag");
 }
 
 static void
-item_drag_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+item_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("drag stop");
 }
 
 static void
-item_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+item_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    INF("longpress");
 }
 
 void
-test_genlist5(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bx, *bx2, *bt;
    static Testitem tit[3];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist5", "Genlist 5");
    elm_win_autodel_set(win, EINA_TRUE);
+   elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -1113,23 +1221,26 @@ test_genlist5(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
-   itc5.item_style     = "double_label";
-   itc5.func.text_get = gl5_text_get;
-   itc5.func.content_get  = gl5_content_get;
-   itc5.func.state_get = gl5_state_get;
-   itc5.func.del       = NULL;
+
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "double_label";
+   api->itc1->func.text_get = gl5_text_get;
+   api->itc1->func.content_get = gl5_content_get;
+   api->itc1->func.state_get = gl5_state_get;
+   api->itc1->func.del = NULL;
 
    tit[0].mode = 0;
-   tit[0].item = elm_genlist_item_append(gl, &itc5,
+   tit[0].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
    tit[1].mode = 1;
-   tit[1].item = elm_genlist_item_append(gl, &itc5,
+   tit[1].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
    tit[2].mode = 2;
-   tit[2].item = elm_genlist_item_append(gl, &itc5,
+   tit[2].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */,
                                          NULL/* func data */);
 
@@ -1140,10 +1251,6 @@ test_genlist5(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL);
    evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL);
    evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL);
-   evas_object_smart_callback_add(gl, "scroll,edge,top", scroll_top, NULL);
-   evas_object_smart_callback_add(gl, "scroll,edge,bottom", scroll_bottom, NULL);
-   evas_object_smart_callback_add(gl, "scroll,edge,left", scroll_left, NULL);
-   evas_object_smart_callback_add(gl, "scroll,edge,right", scroll_right, NULL);
    evas_object_smart_callback_add(gl, "drag", item_drag, NULL);
    evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL);
    evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL);
@@ -1181,16 +1288,15 @@ test_genlist5(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    elm_box_pack_end(bx, bx2);
    evas_object_show(bx2);
 
+   elm_genlist_item_class_free(api->itc1);
    evas_object_resize(win, 320, 320);
    evas_object_show(win);
 }
 
 /*************/
 
-static Elm_Genlist_Item_Class *itc4;
-
 static void
-gl4_sel(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl4_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    int depth = elm_genlist_item_expanded_depth_get(glit);
@@ -1198,18 +1304,19 @@ gl4_sel(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 }
 
 static void
-gl4_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl4_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
+   api_data *api = data;
    Elm_Object_Item *glit = event_info;
    Evas_Object *gl = elm_object_item_widget_get(glit);
-   int val = (int)(long) elm_object_item_data_get(glit);
+   int val = (int)(uintptr_t) elm_object_item_data_get(glit);
    int i = 0;
 
    val *= 10;
    for (i = 0; i < 10; i++)
      {
-        elm_genlist_item_append(gl, itc4,
-                                (void *)(long) (val + i)/* item data */,
+        elm_genlist_item_append(gl, api->itc2,
+                                (void *)(uintptr_t) (val + i)/* item data */,
                                 glit/* parent */,
                                 ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                                 NULL/* func data */);
@@ -1217,34 +1324,48 @@ gl4_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 }
 
 static void
-gl4_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl4_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
+
+   /*
+   const Eina_List *list = NULL, *l = NULL;
+   Elm_Object_Item *it = NULL;
+
+   printf("\n");
+
+   list = elm_genlist_item_subitems_get(glit);
+   EINA_LIST_FOREACH(list, l, it)
+     {
+        printf("sub item: %p %s\n", it, elm_object_item_text_get(it));
+     }
+   */
+
    elm_genlist_item_subitems_clear(glit);
 }
 
 static void
-gl4_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl4_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    elm_genlist_item_expanded_set(glit, EINA_TRUE);
 }
 
 static void
-gl4_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl4_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    elm_genlist_item_expanded_set(glit, EINA_FALSE);
 }
 
-char *gl4_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+char *gl4_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    char buf[256];
-   snprintf(buf, sizeof(buf), "Item mode %i", (int)(long)data);
+   snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data);
    return strdup(buf);
 }
 
-Evas_Object *gl4_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
+Evas_Object *gl4_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
 {
    char buf[PATH_MAX];
    if (!strcmp(part, "elm.swallow.icon"))
@@ -1267,35 +1388,37 @@ Evas_Object *gl4_content_get(void *data __UNUSED__, Evas_Object *obj, const char
    return NULL;
 }
 
-Eina_Bool gl4_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+Eina_Bool gl4_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    return EINA_FALSE;
 }
 
-void gl4_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
+void gl4_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
 {
    printf("item deleted.\n");
 }
 
 static void
-_tree_effect_enable_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_tree_effect_enable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
 }
 
 static void
-_tree_effect_disable_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_tree_effect_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_tree_effect_enabled_set(data, EINA_FALSE);
 }
 
 void
-test_genlist6(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bx, *fr, *bx2, *rd1, *rd2;
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-tree", "Genlist Tree");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -1331,40 +1454,45 @@ test_genlist6(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    gl = elm_genlist_add(win);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
    elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE);
-
-   itc1 = elm_genlist_item_class_new();
-   itc1->item_style     = "default";
-   itc1->func.text_get = gl4_text_get;
-   itc1->func.content_get  = gl4_content_get;
-   itc1->func.state_get = gl4_state_get;
-   itc1->func.del       = gl4_del;
-
-   itc4 = elm_genlist_item_class_new();
-   itc4->item_style     = "tree_effect";
-   itc4->func.text_get = gl4_text_get;
-   itc4->func.content_get  = gl4_content_get;
-   itc4->func.state_get = gl4_state_get;
-   itc4->func.del       = gl4_del;
-
-   elm_genlist_item_append(gl, itc4,
+   evas_object_smart_callback_add(gl, "edge,left", scroll_left, NULL);
+   evas_object_smart_callback_add(gl, "edge,right", scroll_right, NULL);
+   evas_object_smart_callback_add(gl, "edge,top", scroll_top, NULL);
+   evas_object_smart_callback_add(gl, "edge,bottom", scroll_bottom, NULL);
+
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl4_text_get;
+   api->itc1->func.content_get = gl4_content_get;
+   api->itc1->func.state_get = gl4_state_get;
+   api->itc1->func.del = gl4_del;
+
+   api->itc2 = elm_genlist_item_class_new();
+   api->itc2->item_style = "tree_effect";
+   api->itc2->func.text_get = gl4_text_get;
+   api->itc2->func.content_get = gl4_content_get;
+   api->itc2->func.state_get = gl4_state_get;
+   api->itc2->func.del = gl4_del;
+
+   elm_genlist_item_append(gl, api->itc2,
                            (void *)1/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                            NULL/* func data */);
-   elm_genlist_item_append(gl, itc4,
+   elm_genlist_item_append(gl, api->itc2,
                            (void *)2/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                            NULL/* func data */);
-   elm_genlist_item_append(gl, itc1,
+   elm_genlist_item_append(gl, api->itc1,
                            (void *)3/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
                            NULL/* func data */);
 
-   elm_genlist_item_class_free(itc1);
-   elm_genlist_item_class_free(itc4);
+   elm_genlist_item_class_free(api->itc1);
+   elm_genlist_item_class_free(api->itc2);
 
-   evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl);
-   evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl);
-   evas_object_smart_callback_add(gl, "expanded", gl4_exp, gl);
-   evas_object_smart_callback_add(gl, "contracted", gl4_con, gl);
+   evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, api);
+   evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, api);
+   evas_object_smart_callback_add(gl, "expanded", gl4_exp, api);
+   evas_object_smart_callback_add(gl, "contracted", gl4_con, api);
 
    elm_box_pack_end(bx, gl);
 
@@ -1382,18 +1510,17 @@ struct genlist7_data
    Evas_Object *win, *naviframe;
 };
 
-static Elm_Genlist_Item_Class itc7;
-
 static void
 gl_sel7(void *data, Evas_Object *obj, void *event_info)
 {
    if (!event_info) return;
-   elm_genlist_item_item_class_update(event_info, &itc7);
-   printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, itc7.item_style);
+   api_data *api = data;
+   elm_genlist_item_item_class_update(event_info, api->itc2);
+   printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, api->itc2->item_style);
 }
 
 static void
-test_genlist7_back_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_gl7_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    struct genlist7_data *info = data;
    if (!info) return;
@@ -1402,7 +1529,7 @@ test_genlist7_back_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info
 }
 
 static void
-test_genlist7_swipe(void *data, Evas_Object *obj __UNUSED__, void *event_info)
+_gl7_swipe_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    struct genlist7_data *info = data;
    Evas_Object *box, *entry, *button;
@@ -1428,7 +1555,7 @@ test_genlist7_swipe(void *data, Evas_Object *obj __UNUSED__, void *event_info)
    elm_object_text_set(button, "back");
    evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0);
    evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0);
-   evas_object_smart_callback_add(button, "clicked", test_genlist7_back_cb,
+   evas_object_smart_callback_add(button, "clicked", _gl7_back_cb,
                                   info);
    evas_object_show(button);
 
@@ -1439,14 +1566,16 @@ test_genlist7_swipe(void *data, Evas_Object *obj __UNUSED__, void *event_info)
 }
 
 void
-test_genlist7(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *naviframe;
    static struct genlist7_data info;
    static Testitem tit[3];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist7", "Genlist 7");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
    info.win = win;
 
    naviframe = elm_naviframe_add(win);
@@ -1459,37 +1588,40 @@ test_genlist7(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
    gl = elm_genlist_add(win);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_smart_callback_add(gl, "swipe", test_genlist7_swipe, &info);
+   evas_object_smart_callback_add(gl, "swipe", _gl7_swipe_cb, &info);
+   api->gl = gl;
    evas_object_show(gl);
    elm_naviframe_item_simple_push(naviframe, gl);
 
-   itc2.item_style     = "default";
-   itc2.func.text_get = gl2_text_get;
-   itc2.func.content_get  = gl2_content_get;
-   itc2.func.state_get = gl2_state_get;
-   itc2.func.del       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl2_text_get;
+   api->itc1->func.content_get = gl2_content_get;
+   api->itc1->func.state_get = gl2_state_get;
+   api->itc1->func.del = NULL;
 
-   itc7.item_style     = "double_label";
-   itc7.func.text_get = gl5_text_get;
-   itc7.func.content_get  = gl5_content_get;
-   itc7.func.state_get = gl5_state_get;
-   itc7.func.del       = NULL;
+   api->itc2 = elm_genlist_item_class_new();
+   api->itc2->item_style = "double_label";
+   api->itc2->func.text_get = gl5_text_get;
+   api->itc2->func.content_get = gl5_content_get;
+   api->itc2->func.state_get = gl5_state_get;
+   api->itc2->func.del = NULL;
 
    tit[0].mode = 0;
-   tit[0].item = elm_genlist_item_append(gl, &itc2,
+   tit[0].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[0])/* item data */, NULL/* parent */,
                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
-                                         NULL/* func data */);
+                                         api/* func data */);
    tit[1].mode = 1;
-   tit[1].item = elm_genlist_item_append(gl, &itc2,
+   tit[1].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[1])/* item data */, NULL/* parent */,
                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
-                                         NULL/* func data */);
+                                         api/* func data */);
    tit[2].mode = 2;
-   tit[2].item = elm_genlist_item_append(gl, &itc2,
+   tit[2].item = elm_genlist_item_append(gl, api->itc1,
                                          &(tit[2])/* item data */, NULL/* parent */,
                                          ELM_GENLIST_ITEM_NONE, gl_sel7/* func */,
-                                         NULL/* func data */);
+                                         api/* func data */);
 
    evas_object_resize(win, 320, 320);
    evas_object_show(win);
@@ -1497,36 +1629,36 @@ test_genlist7(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 
 /*************/
 
-static Elm_Genlist_Item_Class *itc_group;
-
-char *gl8_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+char *gl8_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    char buf[256];
-   snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)",  (int)((long)data / 10), (int)(long)data);
+   snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)", (int)((uintptr_t)data / 10), (int)(uintptr_t)data);
    return strdup(buf);
 }
 
 static void
-_bt_show_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_bt_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_item_show(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
 }
 
 static void
-_bt_bring_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_bt_bring_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_TOP);
 }
 
 void
-test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bt[8], *bx, *bx2, *bx3;
    Elm_Object_Item *gli = NULL, *git = NULL;
    int i, bt_num;
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-group", "Genlist Group");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -1540,25 +1672,26 @@ test_genlist8(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_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_box_pack_end(bx, gl);
+   api->gl = gl;
    evas_object_show(gl);
 
    // Use homogeneous mode for group index + homogeneous test.
    // Homogeneous is not mandatory for group index.
    elm_genlist_homogeneous_set(gl, EINA_TRUE);
 
-   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       = NULL;
-
-   itc_group = elm_genlist_item_class_new();
-   itc_group->item_style     = "group_index";
-   itc_group->func.text_get = gl8_text_get;
-   itc_group->func.content_get  = NULL;
-   itc_group->func.state_get = NULL;
-   itc_group->func.del       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
+
+   api->itc2 = elm_genlist_item_class_new();
+   api->itc2->item_style = "group_index";
+   api->itc2->func.text_get = gl8_text_get;
+   api->itc2->func.content_get = NULL;
+   api->itc2->func.state_get = NULL;
+   api->itc2->func.del = NULL;
 
    bx2 = elm_box_add(win);
    elm_box_horizontal_set(bx2, EINA_TRUE);
@@ -1639,22 +1772,22 @@ test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
      {
         if (!(i % 10))
           {
-             gli = git = elm_genlist_item_append(gl, itc_group,
-                                                 (void *)(long)i/* item data */,
+             gli = git = elm_genlist_item_append(gl, api->itc2,
+                                                 (void *)(uintptr_t)i/* item data */,
                                                  NULL/* parent */,
                                                  ELM_GENLIST_ITEM_GROUP,
                                                  gl_sel/* func */,
-                                                 (void *)(long)(i * 10)/* func data */);
+                                                 (void *)(uintptr_t)(i * 10)/* func data */);
              elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
           }
         else if (git)
           {
-             gli = elm_genlist_item_append(gl, itc1,
-                                           (void *)(long)i/* item data */,
+             gli = elm_genlist_item_append(gl, api->itc1,
+                                           (void *)(uintptr_t)i/* item data */,
                                            git/* parent */,
                                            ELM_GENLIST_ITEM_NONE,
                                            gl_sel/* func */,
-                                           (void *)(long)(i * 10)/* func data */);
+                                           (void *)(uintptr_t)(i * 10)/* func data */);
           }
         switch (i)
           {
@@ -1682,8 +1815,9 @@ test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
               break;
           }
      }
-   elm_genlist_item_class_free(itc1);
-   elm_genlist_item_class_free(itc_group);
+
+   elm_genlist_item_class_free(api->itc1);
+   elm_genlist_item_class_free(api->itc2);
 
    evas_object_resize(win, 480, 800);
    evas_object_show(win);
@@ -1692,58 +1826,61 @@ test_genlist8(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
 /*************/
 
 static void
-gl9_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl9_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
+   api_data *api = data;
    Elm_Object_Item *glit = event_info;
    Evas_Object *gl = elm_object_item_widget_get(glit);
-   int val = (int)(long) elm_object_item_data_get(glit);
+   int val = (int)(uintptr_t) elm_object_item_data_get(glit);
    val *= 10;
-   elm_genlist_item_append(gl, itc1,
-                           (void *)(long) (val + 1)/* item data */,
+   elm_genlist_item_append(gl, api->itc1,
+                           (void *)(uintptr_t) (val + 1)/* item data */,
                            glit/* parent */,
                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
                            NULL/* func data */);
-   elm_genlist_item_append(gl, itc1,
-                           (void *)(long) (val + 2)/* item data */,
+   elm_genlist_item_append(gl, api->itc1,
+                           (void *)(uintptr_t) (val + 2)/* item data */,
                            glit/* parent */,
                            ELM_GENLIST_ITEM_NONE, gl4_sel/* func */,
                            NULL/* func data */);
-   elm_genlist_item_append(gl, itc1,
-                           (void *)(long) (val + 3)/* item data */,
+   elm_genlist_item_append(gl, api->itc1,
+                           (void *)(uintptr_t) (val + 3)/* item data */,
                            glit/* parent */,
                            ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                            NULL/* func data */);
 }
 
 static void
-gl9_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl9_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    elm_genlist_item_subitems_clear(glit);
 }
 
 static void
-gl9_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl9_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    elm_genlist_item_expanded_set(glit, EINA_TRUE);
 }
 
 static void
-gl9_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl9_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    elm_genlist_item_expanded_set(glit, EINA_FALSE);
 }
 
 void
-test_genlist9(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist9(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bx;
    Elm_Object_Item *git;
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-group-tree", "Genlist Group Tree");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -1757,78 +1894,77 @@ test_genlist9(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_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_box_pack_end(bx, gl);
+   api->gl = gl;
    evas_object_show(gl);
 
-   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       = NULL;
-
-   itc_group = elm_genlist_item_class_new();
-   itc_group->item_style     = "group_index";
-   itc_group->func.text_get = gl8_text_get;
-   itc_group->func.content_get  = NULL;
-   itc_group->func.state_get = NULL;
-   itc_group->func.del       = NULL;
-
-   git = elm_genlist_item_append(gl, itc_group,
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
+
+   api->itc2 = elm_genlist_item_class_new();
+   api->itc2->item_style = "group_index";
+   api->itc2->func.text_get = gl8_text_get;
+   api->itc2->func.content_get = NULL;
+   api->itc2->func.state_get = NULL;
+   api->itc2->func.del = NULL;
+
+   git = elm_genlist_item_append(gl, api->itc2,
                                  (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
                                  NULL/* func data */);
    elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
-   elm_genlist_item_append(gl, itc1,
+   elm_genlist_item_append(gl, api->itc1,
                            (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                            NULL/* func data */);
-   elm_genlist_item_append(gl, itc1,
+   elm_genlist_item_append(gl, api->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, api->itc1,
                            (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                            NULL/* func data */);
-   git = elm_genlist_item_append(gl, itc_group,
+   git = elm_genlist_item_append(gl, api->itc2,
                                  (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */,
                                  NULL/* func data */);
    elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
-   elm_genlist_item_append(gl, itc1,
+   elm_genlist_item_append(gl, api->itc1,
                            (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                            NULL/* func data */);
-   elm_genlist_item_append(gl, itc1,
+   elm_genlist_item_append(gl, api->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, api->itc1,
                            (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */,
                            NULL/* func data */);
-   elm_genlist_item_class_free(itc1);
-   elm_genlist_item_class_free(itc_group);
+   elm_genlist_item_class_free(api->itc1);
+   elm_genlist_item_class_free(api->itc2);
 
-   evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, gl);
-   evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, gl);
-   evas_object_smart_callback_add(gl, "expanded", gl9_exp, gl);
-   evas_object_smart_callback_add(gl, "contracted", gl9_con, gl);
+   evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, api);
+   evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, api);
+   evas_object_smart_callback_add(gl, "expanded", gl9_exp, api);
+   evas_object_smart_callback_add(gl, "contracted", gl9_con, api);
 
    evas_object_resize(win, 480, 800);
    evas_object_show(win);
 }
 
 /*************/
-
-static Elm_Genlist_Item_Class itc10;
 static char *mode_type[] = { "slide", "rotate" };
 
-char *gl10_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
+char *gl10_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
 {
    char buf[256];
    if (!strcmp(part, "elm.text.mode"))
-     snprintf(buf, sizeof(buf), "Mode # %i", (int)(long)data);
+     snprintf(buf, sizeof(buf), "Mode # %i", (int)(uintptr_t)data);
    else
-     snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data);
+     snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
    return strdup(buf);
 }
 
-Evas_Object *gl10_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
+Evas_Object *gl10_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part)
 {
    char buf[PATH_MAX];
    Evas_Object *ic = elm_icon_add(obj);
@@ -1842,7 +1978,7 @@ Evas_Object *gl10_content_get(void *data __UNUSED__, Evas_Object *obj, const cha
 }
 
 static void
-_gl_sel10(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_gl_sel10(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    if (!data) return;
    int v = elm_radio_value_get(data);
@@ -1851,7 +1987,7 @@ _gl_sel10(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 }
 
 static void
-_my_gl_mode_right(void *data, Evas_Object *obj __UNUSED__, void *event_info)
+_my_gl_mode_right(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    if (!data) return;
    int v = elm_radio_value_get(data);
@@ -1860,7 +1996,7 @@ _my_gl_mode_right(void *data, Evas_Object *obj __UNUSED__, void *event_info)
 }
 
 static void
-_my_gl_mode_left(void *data, Evas_Object *obj __UNUSED__, void *event_info)
+_my_gl_mode_left(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    if (!data) return;
    int v = elm_radio_value_get(data);
@@ -1869,7 +2005,7 @@ _my_gl_mode_left(void *data, Evas_Object *obj __UNUSED__, void *event_info)
 }
 
 static void
-_my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+_my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    fprintf(stderr, "drag\n");
    if (!data) return;
@@ -1879,13 +2015,15 @@ _my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info __UNUSED__)
 }
 
 void
-test_genlist10(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist10(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *fr, *bx, *bx2, *rd, *rdg, *gl;
    int i;
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-decorate-item-mode", "Genlist Decorate Item Mode");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -1893,7 +2031,7 @@ test_genlist10(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    evas_object_show(bx);
 
    fr = elm_frame_add(win);
-   elm_object_text_set(fr, "Decorate Mode Type");
+   elm_object_text_set(fr, "Decorate Item Mode Type");
    elm_box_pack_end(bx, fr);
    evas_object_show(fr);
 
@@ -1924,19 +2062,21 @@ test_genlist10(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
    evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
    evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
+   api->gl = gl;
    evas_object_show(gl);
 
-   itc10.item_style     = "default";
-   itc10.decorate_item_style = "mode";
-   itc10.func.text_get = gl10_text_get;
-   itc10.func.content_get  = gl10_content_get;
-   itc10.func.state_get = gl_state_get;
-   itc10.func.del       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->decorate_item_style = "mode";
+   api->itc1->func.text_get = gl10_text_get;
+   api->itc1->func.content_get = gl10_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
    for (i = 0; i < 50; i++)
      elm_genlist_item_append(gl,
-                             &itc10,
-                             (void *)(long)(1000 + i)/* item data */,
+                             api->itc1,
+                             (void *)(uintptr_t)(1000 + i)/* item data */,
                              NULL/* parent */,
                              ELM_GENLIST_ITEM_NONE/* flags */,
                              _gl_sel10/* func */,
@@ -1944,6 +2084,7 @@ test_genlist10(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
    elm_box_pack_end(bx, gl);
 
+   elm_genlist_item_class_free(api->itc1);
    evas_object_resize(win, 520, 520);
    evas_object_show(win);
 }
@@ -1951,7 +2092,7 @@ test_genlist10(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 /*************/
 
 static void
-_reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+_reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    elm_genlist_reorder_mode_set(data, elm_check_state_get(obj));
 }
@@ -1960,64 +2101,96 @@ _reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__
  * gl_moved is called after an item was reordered.
  * This is only called when reorder mode is enabled.
  *
- * @param data         :  the genlist object passed as data.
  * @param obj          :  the genlist object.
- * @param item         :  the moved item.
+ * @param event_info   :  the moved item.
  *
- *  the item(*item) had been moved
+ * the item(event_info) had been moved
  *
  */
-static void gl_moved(Evas_Object *data __UNUSED__, Evas_Object *obj __UNUSED__, Elm_Object_Item *item __UNUSED__)
+static void
+_gl_reorder_moved_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
 {
-   // if needed, add application logic.
+   printf("\"moved\" it: %p\n", event_info);
 }
 
 /**
- * gl_moved_after is called after an item was reordered.
+ * _gl_reorder_moved_after_cb is called after an item was reordered.
  * This is only called when reorder mode is enabled.
  *
- * @param data         :  the genlist object passed as data.
  * @param obj          :  the genlist object.
- * @param item         :  the moved item.
+ * @param event_info   :  the moved item.
  *
- *  the item(*item) had been moved after the given relative item(*rel_item) in list.
+ *  the item(event_info) had been moved after the given relative item(*rel_item) in list.
  *
  */
-static void gl_moved_after(Evas_Object *data __UNUSED__, Evas_Object *obj __UNUSED__, Elm_Object_Item *item __UNUSED__)
+static void
+_gl_reorder_moved_after_cb(void *data EINA_UNUSED,
+                           Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    // if needed, add application logic.
-   Elm_Object_Item *it;
-   it = elm_genlist_item_prev_get(item);
-   printf("it=%p, prev_it=%p\n",item,it);
+   Elm_Object_Item *it = elm_genlist_item_prev_get((Elm_Object_Item *)event_info);
+   printf("it = %p, prev_it = %p\n", event_info, it);
 }
 
 /**
- * gl_moved_before is called after an item was reordered.
+ * _gl_reorder_moved_before_cb is called after an item was reordered.
  * This is only called when reorder mode is enabled.
  *
- * @param data         :  the genlist object passed as data.
  * @param obj          :  the genlist object.
- * @param item         :  the moved item.
+ * @param event_info   :  the moved item.
  *
- *  the item(*item) had been moved before the given relative item(*rel_item) in list.
+ *  the item(event_info) had been moved before the given relative item(*rel_item) in list.
  *
  */
-static void gl_moved_before(Evas_Object *data __UNUSED__, Evas_Object *obj __UNUSED__, Elm_Object_Item *item __UNUSED__)
+static void
+_gl_reorder_moved_before_cb(void *data EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    // if needed, add application logic.
-   Elm_Object_Item *it;
-   it = elm_genlist_item_next_get(item);
-   printf("it=%p, next_it=%p\n",item,it);
+   Elm_Object_Item *it = elm_genlist_item_next_get((Elm_Object_Item *)event_info);
+   printf("it = %p, next_it = %p\n", event_info, it);
+}
+
+static void
+_gl_reorder_item_focused_cb(void *data EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   printf("\"item,focused\" it: %p\n", event_info);
+}
+
+static void
+_gl_reorder_item_unfocused_cb(void *data EINA_UNUSED,
+                              Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   printf("\"item,unfocused\" it: %p\n", event_info);
+}
+
+static void
+_gl_reorder_item_selected_cb(void *data EINA_UNUSED,
+                             Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   printf("\"selected\" it: %p\n", event_info);
+}
+
+static void
+_gl_reorder_item_unselected_cb(void *data EINA_UNUSED,
+                               Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   printf("\"unselected\" it: %p\n", event_info);
 }
 
 void
-test_genlist11(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist_reorder(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *fr, *lb, *bx, *tg, *gl;
    int i;
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-reorder-mode", "Genlist Reorder Mode");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -2040,6 +2213,7 @@ test_genlist11(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    gl = elm_genlist_add(win);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
 
    tg = elm_check_add(win);
@@ -2050,26 +2224,30 @@ test_genlist11(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    elm_box_pack_end(bx, tg);
    evas_object_show(tg);
 
-   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       = NULL;
-   evas_object_smart_callback_add(gl, "moved", (Evas_Smart_Cb)gl_moved, gl);
-   evas_object_smart_callback_add(gl, "moved,after", (Evas_Smart_Cb)gl_moved_after, gl);
-   evas_object_smart_callback_add(gl, "moved,before", (Evas_Smart_Cb)gl_moved_before, gl);
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
+   evas_object_smart_callback_add(gl, "moved", _gl_reorder_moved_cb, NULL);
+   evas_object_smart_callback_add(gl, "moved,after", _gl_reorder_moved_after_cb, NULL);
+   evas_object_smart_callback_add(gl, "moved,before", _gl_reorder_moved_before_cb, NULL);
+   evas_object_smart_callback_add(gl, "item,focused", _gl_reorder_item_focused_cb, NULL);
+   evas_object_smart_callback_add(gl, "item,unfocused", _gl_reorder_item_unfocused_cb, NULL);
+   evas_object_smart_callback_add(gl, "selected", _gl_reorder_item_selected_cb, NULL);
+   evas_object_smart_callback_add(gl, "unselected", _gl_reorder_item_unselected_cb, NULL);
 
    for (i = 0; i < 50; i++)
      elm_genlist_item_append(gl,
-                             itc1,
-                             (void *)(long)(1 + i)/* item data */,
+                             api->itc1,
+                             (void *)(uintptr_t)(1 + i)/* item data */,
                              NULL/* parent */,
                              ELM_GENLIST_ITEM_NONE/* flags */,
                              NULL/* func */,
                              NULL/* func data */);
 
-   elm_genlist_item_class_free(itc1);
+   elm_genlist_item_class_free(api->itc1);
 
    elm_box_pack_end(bx, gl);
 
@@ -2079,19 +2257,21 @@ test_genlist11(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
 /*************/
 
-char *gl12_text_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+char *gl12_text_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    return strdup("Enlightenment is not just a window manager for Linux/X11 and others, but also a whole suite of libraries to help you create beautiful user interfaces with much less work than doing it the old fashioned way and fighting with traditional toolkits, not to mention a traditional window manager. It covers uses from small mobile devices like phones all the way to powerful multi-core desktops (which are the primary development environment).");
 }
 
 void
-test_genlist12(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist12(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *bx, *gl;
    int i;
+   api_data *api = calloc(1, sizeof(api_data));
 
    win = elm_win_util_standard_add("genlist-textblock", "Genlist Textblock");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -2103,25 +2283,26 @@ test_genlist12(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_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_box_pack_end(bx, gl);
+   api->gl = gl;
    evas_object_show(gl);
 
-   itc1 = elm_genlist_item_class_new();
-   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       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "message";
+   api->itc1->func.text_get = gl12_text_get;
+   api->itc1->func.content_get = gl_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
    for (i = 0; i < 1000; i++)
      {
-        elm_genlist_item_append(gl, itc1,
-                                (void *)(long)i/* item data */,
+        elm_genlist_item_append(gl, api->itc1,
+                                (void *)(uintptr_t)i/* item data */,
                                 NULL/* parent */,
                                 ELM_GENLIST_ITEM_NONE,
                                 gl_sel/* func */,
-                                (void *)(long)(i * 10)/* func data */);
+                                (void *)(uintptr_t)(i * 10)/* func data */);
      }
-   elm_genlist_item_class_free(itc1);
+   elm_genlist_item_class_free(api->itc1);
 
    evas_object_resize(win, 400, 500);
    evas_object_show(win);
@@ -2133,19 +2314,21 @@ static int
 gl13_cmp(const void *pa, const void *pb)
 {
    const Elm_Object_Item *ia = pa, *ib = pb;
-   int a = (int)(long) elm_object_item_data_get(ia);
-   int b = (int)(long) elm_object_item_data_get(ib);
+   int a = (int)(uintptr_t) elm_object_item_data_get(ia);
+   int b = (int)(uintptr_t) elm_object_item_data_get(ib);
    return a - b;
 }
 
 void
-test_genlist13(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist13(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Elm_Object_Item *pi[6];
    Evas_Object *win, *bx, *gl; int i, base, idx[3] = {1, 10, 15};
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-tree-insert-sorted", "Genlist Tree, Insert Sorted");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -2157,19 +2340,19 @@ test_genlist13(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);
 
-   itc4 = elm_genlist_item_class_new();
-   itc4->item_style = "default";
-   itc4->func.text_get = gl4_text_get;
-   itc4->func.content_get = NULL;
-   itc4->func.state_get = NULL;
-   itc4->func.del = NULL;
+   api->itc2 = elm_genlist_item_class_new();
+   api->itc2->item_style = "default";
+   api->itc2->func.text_get = gl4_text_get;
+   api->itc2->func.content_get = NULL;
+   api->itc2->func.state_get = NULL;
+   api->itc2->func.del = NULL;
 
    /* mixed order to test insert sorted */
 
    for (i = 0; i < 3; i++)
      {
         pi[i] = elm_genlist_item_sorted_insert
-          (gl, itc4, (void *)(long)idx[i]/* item data */, NULL/* parent */,
+          (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, NULL/* parent */,
            ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */,
            NULL/* func */, NULL/* func data */);
      }
@@ -2180,7 +2363,7 @@ test_genlist13(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
         for (j = 0; j < 3; j++)
           {
              elm_genlist_item_sorted_insert
-               (gl, itc4, (void *)(long)(idx[j] + base)/* item data */,
+               (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */,
                 pi[i]/* parent */, ELM_GENLIST_ITEM_NONE,
                 gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
           }
@@ -2189,7 +2372,7 @@ test_genlist13(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    for (i = 0; i < 3; i++)
      {
         pi[i + 3] = elm_genlist_item_sorted_insert
-          (gl, itc4, (void *)(long)(idx[i] * 2)/* item data */, NULL/* parent */,
+          (gl, api->itc2, (void *)(uintptr_t)(idx[i] * 2)/* item data */, NULL/* parent */,
            ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */, NULL/* func */,
            NULL/* func data */);
      }
@@ -2201,12 +2384,12 @@ test_genlist13(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
         for (j = 0; j < 3; j++)
           {
              elm_genlist_item_sorted_insert
-               (gl, itc4, (void *)(long)(idx[j] + base)/* item data */,
+               (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */,
                 pi[i + 3]/* parent */, ELM_GENLIST_ITEM_NONE,
                 gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */);
           }
      }
-   elm_genlist_item_class_free(itc4);
+   elm_genlist_item_class_free(api->itc2);
    elm_box_pack_end(bx, gl);
    evas_object_show(bx);
 
@@ -2217,18 +2400,19 @@ test_genlist13(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 /*************/
 
 static void
-my_gl_insert_before_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_insert_before_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    static int i = 1000;
    Elm_Object_Item *gli_selected;
 
-   if (!itc1) itc1 = elm_genlist_item_class_new();
-   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;
+   if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = NULL;
+   api->itc1->func.state_get = NULL;
+   api->itc1->func.del = NULL;
 
    gli_selected = elm_genlist_selected_item_get(gl);
    if (!gli_selected)
@@ -2237,8 +2421,8 @@ my_gl_insert_before_rel(void *data, Evas_Object *obj __UNUSED__, void *event_inf
         return;
      }
 
-   elm_genlist_item_insert_before(gl, itc1,
-                                  (void *)(long)i/* item data */,
+   elm_genlist_item_insert_before(gl, api->itc1,
+                                  (void *)(uintptr_t)i/* item data */,
                                   elm_genlist_item_parent_get(gli_selected),
                                   gli_selected/* item before */,
                                   ELM_GENLIST_ITEM_NONE,
@@ -2247,18 +2431,19 @@ my_gl_insert_before_rel(void *data, Evas_Object *obj __UNUSED__, void *event_inf
 }
 
 static void
-my_gl_insert_after_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+my_gl_insert_after_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *gl = data;
+   api_data *api = data;
+   Evas_Object *gl = api->gl;
    static int i = 0;
    Elm_Object_Item *gli_selected;
 
-   if (!itc1) itc1 = elm_genlist_item_class_new();
-   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;
+   if (!api->itc1) api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl_text_get;
+   api->itc1->func.content_get = NULL;
+   api->itc1->func.state_get = NULL;
+   api->itc1->func.del = NULL;
 
    gli_selected = elm_genlist_selected_item_get(gl);
    if (!gli_selected)
@@ -2267,8 +2452,8 @@ my_gl_insert_after_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info
         return;
      }
 
-   elm_genlist_item_insert_after(gl, itc1,
-                                  (void *)(long)i/* item data */,
+   elm_genlist_item_insert_after(gl, api->itc1,
+                                  (void *)(uintptr_t)i/* item data */,
                                   elm_genlist_item_parent_get(gli_selected),
                                   gli_selected/* item after */,
                                   ELM_GENLIST_ITEM_NONE,
@@ -2277,7 +2462,7 @@ my_gl_insert_after_rel(void *data, Evas_Object *obj __UNUSED__, void *event_info
 }
 
 void
-test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist14(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Elm_Object_Item *pi[6];
    Evas_Object *win, *bx, *bx2, *bt, *gl;
@@ -2296,8 +2481,10 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
      -4  /* item '21' - insert before pi[4], item '33' */
    };
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-tree-insert-relative", "Genlist Tree, Insert Relative");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -2307,14 +2494,15 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    gl = elm_genlist_add(win);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
 
-   itc4 = elm_genlist_item_class_new();
-   itc4->item_style = "default";
-   itc4->func.text_get = gl4_text_get;
-   itc4->func.content_get = NULL;
-   itc4->func.state_get = NULL;
-   itc4->func.del = NULL;
+   api->itc2 = elm_genlist_item_class_new();
+   api->itc2->item_style = "default";
+   api->itc2->func.text_get = gl4_text_get;
+   api->itc2->func.content_get = NULL;
+   api->itc2->func.state_get = NULL;
+   api->itc2->func.del = NULL;
 
    /* mixed order to test insert sorted */
 
@@ -2322,7 +2510,7 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    // BUG2: should be able to insert after=NULL, append
 
    pi[0] = elm_genlist_item_append
-     (gl, itc4, (void *)(long)idx[0]/* item data */,
+     (gl, api->itc2, (void *)(uintptr_t)idx[0]/* item data */,
       NULL/* parent */,
       ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
 
@@ -2330,12 +2518,12 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
      {
         if (relative[i] < 0)
           pi[i] = elm_genlist_item_insert_before
-            (gl, itc4, (void *)(long)idx[i]/* item data */,
+            (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
              NULL/* parent */, pi[-relative[i]],
              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
         else
           pi[i] = elm_genlist_item_insert_after
-            (gl, itc4, (void *)(long)idx[i]/* item data */,
+            (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */,
              NULL/* parent */, pi[relative[i]],
              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
      }
@@ -2345,21 +2533,21 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
         Elm_Object_Item *sub_glit[6];
         int j;
 
-        base = 1000 * (int)(long) elm_object_item_data_get(pi[i]);
+        base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
 
         sub_glit[0] = elm_genlist_item_append
-          (gl, itc4, (void *)(long) (idx[0] + base)/* item data */, pi[i]/* parent */,
+          (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
            ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
 
         for (j = 1; j < 6; j++) {
            if (relative[j] < 0)
              sub_glit[j] = elm_genlist_item_insert_before
-               (gl, itc4, (void *)(long) (idx[j] + base)/* item data */,
+               (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
                 pi[i]/* parent */, sub_glit[-relative[j]],
                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
            else
              sub_glit[j] = elm_genlist_item_insert_after
-               (gl, itc4, (void *)(long) (idx[j] + base)/* item data */,
+               (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
                 pi[i]/* parent */, sub_glit[relative[j]],
                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
         }
@@ -2369,12 +2557,12 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
      {
         if (relative[i] < 0)
           pi[i] = elm_genlist_item_insert_before
-            (gl, itc4, (void *)(long) idx[i]/* item data */,
+            (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
              NULL/* parent */, pi[-relative[i]],
              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
         else
           pi[i] = elm_genlist_item_insert_after
-            (gl, itc4, (void *)(long) idx[i]/* item data */,
+            (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */,
              NULL/* parent */, pi[relative[i]],
              ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
      }
@@ -2384,21 +2572,21 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
         Elm_Object_Item *sub_glit[6];
         int j;
 
-        base = 1000 * (int)(long) elm_object_item_data_get(pi[i]);
+        base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]);
 
         sub_glit[0] = elm_genlist_item_append
-          (gl, itc4, (void *)(long) (idx[0] + base)/* item data */, pi[i]/* parent */,
+          (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */,
            ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
 
         for (j = 1; j < 6; j++) {
            if (relative[j] < 0)
              sub_glit[j] = elm_genlist_item_insert_before
-               (gl, itc4, (void *)(long) (idx[j] + base)/* item data */,
+               (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
                 pi[i]/* parent */, sub_glit[-relative[j]],
                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
            else
              sub_glit[j] = elm_genlist_item_insert_after
-               (gl, itc4, (void *)(long) (idx[j] + base)/* item data */,
+               (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */,
                 pi[i]/* parent */, sub_glit[relative[j]],
                 ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */);
         }
@@ -2415,7 +2603,7 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "+ before");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -2423,7 +2611,7 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
    bt = elm_button_add(win);
    elm_object_text_set(bt, "+ after");
-   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, gl);
+   evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, api);
    evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);
    elm_box_pack_end(bx2, bt);
@@ -2432,9 +2620,9 @@ 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 itc4. some items can be added in callbacks */
-   elm_genlist_item_class_ref(itc4);
-   elm_genlist_item_class_free(itc4);
+   /* item_class_ref is needed for itc2. some items can be added in callbacks */
+   elm_genlist_item_class_ref(api->itc2);
+   elm_genlist_item_class_free(api->itc2);
 
    evas_object_resize(win, 320, 320);
    evas_object_show(win);
@@ -2442,13 +2630,13 @@ test_genlist14(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
 /*************/
 
-static void _edit_icon_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+static void _edit_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Elm_Object_Item *item = (Elm_Object_Item *)data;
    elm_object_item_del(item);
 }
 
-char *gl15_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+char *gl15_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    const Testitem *tit = data;
    char buf[256];
@@ -2461,7 +2649,7 @@ Evas_Object *gl15_content_get(void *data, Evas_Object *obj, const char *part)
    Testitem *tit = data;
    char buf[PATH_MAX];
 
-   // "edit_default" EDC layout is like below. each part is swallow part.
+   // "edit" EDC layout is like below. each part is swallow part.
    // the existing item is swllowed to elm.swallow.edit.content part.
    // --------------------------------------------------------------------
    // | elm.edit.icon.1 | elm.swallow.decorate.content | elm.edit.icon,2 |
@@ -2498,7 +2686,7 @@ Evas_Object *gl15_content_get(void *data, Evas_Object *obj, const char *part)
 }
 
 static void
-gl15_sel(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+gl15_sel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    Testitem *tit = data;
    if (elm_genlist_decorate_mode_get(obj))
@@ -2510,34 +2698,36 @@ gl15_sel(void *data, Evas_Object *obj, void *event_info __UNUSED__)
 }
 
 static void
-gl15_deco_all_mode(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+gl15_deco_all_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_decorate_mode_set(data, EINA_TRUE);
    elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
 }
 
 static void
-gl15_normal_mode(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+gl15_normal_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    elm_genlist_decorate_mode_set(data, EINA_FALSE);
    elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT);
 }
 
-void gl15_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__)
+void gl15_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
 {
-   printf("item deleted.\n");
+   Testitem *ti = data;
+   printf("item deleted. (# %d)\n", ti->mode);
 }
 
-static Elm_Genlist_Item_Class *itc15;
 void
-test_genlist15(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist15(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *bx, *bx2, *bt, *gl;
    int i;
    static Testitem tit[100];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-decorate-all-mode", "Genlist Decorate All Mode");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -2547,27 +2737,28 @@ test_genlist15(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    gl = elm_genlist_add(win);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
 
-   itc15 = elm_genlist_item_class_new();
-   itc15->item_style     = "default";
-   itc15->func.text_get = gl15_text_get;
-   itc15->func.content_get  = gl15_content_get;
-   itc15->func.state_get = gl_state_get;
-   itc15->func.del       = gl15_del;
-   itc15->decorate_all_item_style = "edit";
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl15_text_get;
+   api->itc1->func.content_get = gl15_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = gl15_del;
+   api->itc1->decorate_all_item_style = "edit";
 
    for (i = 0; i < 100; i++)
      {
         tit[i].mode = i;
-        tit[i].item = elm_genlist_item_append(gl, itc15,
+        tit[i].item = elm_genlist_item_append(gl, api->itc1,
                                               &(tit[i])/* item data */,
                                               NULL/* parent */,
                                               ELM_GENLIST_ITEM_NONE/* flags */,
                                               gl15_sel/* func */,
-                                              (void *)(long)&(tit[i])/* func data */);
+                                              (void *)(uintptr_t)&(tit[i])/* func data */);
      }
-   elm_genlist_item_class_free(itc15);
+   elm_genlist_item_class_free(api->itc1);
    elm_box_pack_end(bx, gl);
    evas_object_show(bx);
 
@@ -2602,7 +2793,7 @@ test_genlist15(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
 /*************/
 
-static void _flip_icon_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+static void _flip_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    const Testitem *tit = data;
 
@@ -2612,7 +2803,7 @@ static void _flip_icon_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void
      elm_genlist_item_flip_set(tit->item, EINA_TRUE);
 }
 
-char *gl16_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
+char *gl16_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
 {
    const Testitem *tit = data;
    char buf[256];
@@ -2658,14 +2849,16 @@ Evas_Object *gl16_content_get(void *data, Evas_Object *obj, const char *part)
 }
 
 void
-test_genlist16(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist16(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *bx, *gl;
    int i;
    static Testitem tit[100];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-flip-mode", "Genlist Flip Mode");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -2675,31 +2868,32 @@ test_genlist16(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    gl = elm_genlist_add(win);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
 
    /* note: flip mode can be used with/without edit mode */
    elm_genlist_decorate_mode_set(gl, EINA_TRUE);
    elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
 
-   itc15 = elm_genlist_item_class_new();
-   itc15->item_style     = "default";
-   itc15->func.text_get = gl16_text_get;
-   itc15->func.content_get = gl16_content_get;
-   itc15->func.state_get = gl_state_get;
-   itc15->func.del       = NULL;
-   itc15->decorate_all_item_style = "edit";
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->func.text_get = gl16_text_get;
+   api->itc1->func.content_get = gl16_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
+   api->itc1->decorate_all_item_style = "edit";
 
    for (i = 0; i < 100; i++)
      {
         tit[i].mode = i;
-        tit[i].item = elm_genlist_item_append(gl, itc15,
+        tit[i].item = elm_genlist_item_append(gl, api->itc1,
                                               &(tit[i])/* item data */,
                                               NULL/* parent */,
                                               ELM_GENLIST_ITEM_NONE/* flags */,
                                               gl_sel/* func */,
-                                              (void *)(long)&(tit[i])/* func data */);
+                                              (void *)(uintptr_t)&(tit[i])/* func data */);
      }
-   elm_genlist_item_class_free(itc15);
+   elm_genlist_item_class_free(api->itc1);
    elm_box_pack_end(bx, gl);
    evas_object_show(bx);
 
@@ -2709,17 +2903,15 @@ test_genlist16(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
 /*************/
 
-static Elm_Genlist_Item_Class *itc17;
-
 char *
-gl17_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
+gl17_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
 {
    const Testitem *tit = data;
    char buf[256];
    if (!strcmp(part, "elm.text.mode"))
      snprintf(buf, sizeof(buf), "Mode # %i", tit->mode);
    else
-     snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data);
+     snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
    return strdup(buf);
 }
 
@@ -2758,7 +2950,7 @@ _decorate_item_mode_frame_new(Evas_Object *win, Evas_Object **rdg)
 }
 
 void
-_decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+_decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    if (!data) return;
 
@@ -2772,7 +2964,7 @@ _decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info
 }
 
 void
-_decorate_all_unset_btn_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+_decorate_all_unset_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    if (evas_object_data_get(data, "tree_effect"))
      elm_genlist_tree_effect_enabled_set(data, EINA_TRUE);
@@ -2811,14 +3003,16 @@ _decorate_all_mode_frame_new(Evas_Object *win, Evas_Object *rdg, Evas_Object *gl
 }
 
 void
-test_genlist17(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist17(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *fr1, *fr2, *bx, *bx2, *rdg = NULL, *gl;
    int i;
    static Testitem tit[50];
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-decorate-modes", "Genlist Decorate Modes");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -2841,23 +3035,24 @@ test_genlist17(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg);
    evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg);
    evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg);
+   api->gl = gl;
    evas_object_show(gl);
 
-   itc17 = elm_genlist_item_class_new();
-   itc17->item_style     = "default";
-   itc17->decorate_item_style = "mode";
-   itc17->func.text_get = gl15_text_get;
-   itc17->func.content_get  = gl15_content_get;
-   itc17->func.state_get = gl_state_get;
-   itc17->func.del       = NULL;
-   itc17->decorate_all_item_style = "edit";
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "default";
+   api->itc1->decorate_item_style = "mode";
+   api->itc1->func.text_get = gl15_text_get;
+   api->itc1->func.content_get = gl15_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
+   api->itc1->decorate_all_item_style = "edit";
 
    for (i = 0; i < 50; i++)
      {
         tit[i].checked = EINA_FALSE;
         tit[i].mode = i;
         tit[i].item = elm_genlist_item_append(gl,
-                                              itc17,
+                                              api->itc1,
                                               &(tit[i])/* item data */,
                                               NULL/* parent */,
                                               ELM_GENLIST_ITEM_NONE/* flags */,
@@ -2865,7 +3060,7 @@ test_genlist17(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
                                               NULL/* func data */);
      }
 
-   elm_genlist_item_class_free(itc17);
+   elm_genlist_item_class_free(api->itc1);
    elm_box_pack_end(bx, gl);
 
    fr2 = _decorate_all_mode_frame_new(win, rdg, gl);
@@ -2876,8 +3071,6 @@ test_genlist17(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 }
 
 /*************/
-
-Elm_Genlist_Item_Class *itc18, *itc18_tree;
 Evas_Object *
 _tree_effect_frame_new(Evas_Object *win, Evas_Object **rdg, Evas_Object *gl)
 {
@@ -2917,7 +3110,7 @@ _tree_effect_frame_new(Evas_Object *win, Evas_Object **rdg, Evas_Object *gl)
 }
 
 static void
-gl18_sel(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl18_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    int depth = elm_genlist_item_expanded_depth_get(glit);
@@ -2925,14 +3118,15 @@ gl18_sel(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 }
 
 static void
-gl18_del(void *data, Evas_Object *obj __UNUSED__)
+gl18_del(void *data, Evas_Object *obj EINA_UNUSED)
 {
    free(data);
 }
 
 static void
-gl18_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl18_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
+   api_data *api = data;
    Elm_Object_Item *glit = event_info;
    Evas_Object *gl = elm_object_item_widget_get(glit);
    Testitem *tit = elm_object_item_data_get(glit);
@@ -2944,7 +3138,7 @@ gl18_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
         tit = calloc(1, sizeof(Testitem));
         tit->mode = val + i;
         tit->item = elm_genlist_item_append(gl,
-                                            itc18_tree,
+                                            api->itc2,
                                             tit/* item data */,
                                             glit/* parent */,
                                             ELM_GENLIST_ITEM_TREE,
@@ -2956,7 +3150,7 @@ gl18_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
         tit = calloc(1, sizeof(Testitem));
         tit->mode = i;
         tit->item = elm_genlist_item_append(gl,
-                                            itc18,
+                                            api->itc1,
                                             tit/* item data */,
                                             glit/* parent */,
                                             ELM_GENLIST_ITEM_NONE,
@@ -2967,14 +3161,14 @@ gl18_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 }
 
 static void
-gl18_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+gl18_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Elm_Object_Item *glit = event_info;
    elm_genlist_item_subitems_clear(glit);
 }
 
 static void
-gl18_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__,
+gl18_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
              void *event_info)
 {
    Elm_Object_Item *glit = event_info;
@@ -2982,7 +3176,7 @@ gl18_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__,
 }
 
 static void
-gl18_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__,
+gl18_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
              void *event_info)
 {
    Elm_Object_Item *glit = event_info;
@@ -2990,17 +3184,19 @@ gl18_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__,
 }
 
 void
-test_genlist18(void        *data __UNUSED__,
-               Evas_Object *obj __UNUSED__,
-               void        *event_info __UNUSED__)
+test_genlist18(void        *data EINA_UNUSED,
+               Evas_Object *obj EINA_UNUSED,
+               void        *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bx, *fr1, *fr2, *bx2, *rdg;
    Testitem *tit = NULL;
    int i, j;
 
+   api_data *api = calloc(1, sizeof(api_data));
    win = elm_win_util_standard_add("genlist-tree-decorate-all",
                                    "Genlist Tree and Decorate All Mode");
    elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -3016,35 +3212,36 @@ test_genlist18(void        *data __UNUSED__,
    gl = elm_genlist_add(win);
    evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   api->gl = gl;
    evas_object_show(gl);
 
    elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE);
    evas_object_data_set(gl, "tree_effect", "true");
 
    /* normal item */
-   itc18 = elm_genlist_item_class_new();
-   itc18->item_style     = "tree_effect"; /* item/tree_effect */
-   itc18->func.text_get = gl15_text_get;
-   itc18->func.content_get  = gl15_content_get;
-   itc18->func.state_get = gl_state_get;
-   itc18->func.del       = gl18_del;
-   itc18->decorate_all_item_style = "edit";
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "tree_effect"; /* item/tree_effect */
+   api->itc1->func.text_get = gl15_text_get;
+   api->itc1->func.content_get = gl15_content_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = gl18_del;
+   api->itc1->decorate_all_item_style = "edit";
 
    /* expandable item */
-   itc18_tree = elm_genlist_item_class_new();
-   itc18_tree->item_style     = "tree_effect"; /* tree/tree_effect */
-   itc18_tree->func.text_get = gl15_text_get;
-   itc18_tree->func.content_get  = gl15_content_get;
-   itc18_tree->func.state_get = gl_state_get;
-   itc18_tree->func.del       = gl18_del;
-   itc18_tree->decorate_all_item_style = "edit";
+   api->itc2 = elm_genlist_item_class_new();
+   api->itc2->item_style = "tree_effect"; /* tree/tree_effect */
+   api->itc2->func.text_get = gl15_text_get;
+   api->itc2->func.content_get = gl15_content_get;
+   api->itc2->func.state_get = gl_state_get;
+   api->itc2->func.del = gl18_del;
+   api->itc2->decorate_all_item_style = "edit";
 
    for (i = 0; i < 5; i++)
      {
         tit = calloc(1, sizeof(Testitem));
         tit->mode = i;
         tit->item = elm_genlist_item_append(gl,
-                                            itc18_tree,
+                                            api->itc2,
                                             tit/* item data */,
                                             NULL/* parent */,
                                             ELM_GENLIST_ITEM_TREE,
@@ -3057,7 +3254,7 @@ test_genlist18(void        *data __UNUSED__,
         tit = calloc(1, sizeof(Testitem));
         tit->mode = i;
         tit->item = elm_genlist_item_append(gl,
-                                            itc18,
+                                            api->itc1,
                                             tit/* item data */,
                                             NULL/* parent */,
                                             ELM_GENLIST_ITEM_NONE,
@@ -3066,13 +3263,13 @@ test_genlist18(void        *data __UNUSED__,
         i++;
      }
 
-   elm_genlist_item_class_free(itc18);
-   elm_genlist_item_class_free(itc18_tree);
+   elm_genlist_item_class_free(api->itc1);
+   elm_genlist_item_class_free(api->itc2);
 
-   evas_object_smart_callback_add(gl, "expand,request", gl18_exp_req, gl);
-   evas_object_smart_callback_add(gl, "contract,request", gl18_con_req, gl);
-   evas_object_smart_callback_add(gl, "expanded", gl18_exp, gl);
-   evas_object_smart_callback_add(gl, "contracted", gl18_con, gl);
+   evas_object_smart_callback_add(gl, "expand,request", gl18_exp_req, api);
+   evas_object_smart_callback_add(gl, "contract,request", gl18_con_req, api);
+   evas_object_smart_callback_add(gl, "expanded", gl18_exp, api);
+   evas_object_smart_callback_add(gl, "contracted", gl18_con, api);
 
    elm_box_pack_end(bx, gl);
 
@@ -3087,7 +3284,7 @@ test_genlist18(void        *data __UNUSED__,
 }
 
 void
-test_genlist19(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+test_genlist19(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt;
    Evas_Object *over;
@@ -3095,7 +3292,7 @@ test_genlist19(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
    int i;
    api_data *api = calloc(1, sizeof(api_data));
 
-   win = elm_win_util_standard_add("genlist-full", "Genlist Full");
+   win = elm_win_util_standard_add("genlist-full", "Genlist Full Widget");
    elm_win_autodel_set(win, EINA_TRUE);
    evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
 
@@ -3129,22 +3326,23 @@ test_genlist19(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_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_box_pack_end(bx, gl);
+   api->gl = gl;
    evas_object_show(gl);
 
    over = evas_object_rectangle_add(evas_object_evas_get(win));
    evas_object_color_set(over, 0, 0, 0, 0);
    evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl);
-   evas_object_repeat_events_set(over, 1);
+   evas_object_repeat_events_set(over, EINA_TRUE);
    evas_object_show(over);
    evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(win, over);
 
-   itc1 = elm_genlist_item_class_new();
-   itc1->item_style     = "full";
-   itc1->func.text_get = gl_text_get;
-   itc1->func.content_get  = gl_content_full_get;
-   itc1->func.state_get = gl_state_get;
-   itc1->func.del       = NULL;
+   api->itc1 = elm_genlist_item_class_new();
+   api->itc1->item_style = "full";
+   api->itc1->func.text_get = NULL;
+   api->itc1->func.content_get = gl_content_full_get;
+   api->itc1->func.state_get = gl_state_get;
+   api->itc1->func.del = NULL;
 
    bt_50 = elm_button_add(win);
    elm_object_text_set(bt_50, "Go to 50");
@@ -3158,21 +3356,1386 @@ test_genlist19(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
 
    for (i = 0; i < 2000; i++)
      {
-        gli = elm_genlist_item_append(gl, itc1,
-                                      (void *)(long)i/* item data */,
+        gli = elm_genlist_item_append(gl, api->itc1,
+                                      (void *)(uintptr_t)i/* item data */,
                                       NULL/* parent */,
                                       ELM_GENLIST_ITEM_NONE,
                                       gl_sel/* func */,
-                                      (void *)(long)(i * 10)/* func data */);
+                                      (void *)(uintptr_t)(i * 10)/* func data */);
         if (i == 50)
           evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli);
         else if (i == 1500)
           evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli);
      }
-   elm_genlist_item_class_free(itc1);
+   elm_genlist_item_class_free(api->itc1);
 
    evas_object_resize(win, 480, 800);
    evas_object_show(win);
 }
 
-#endif
+/*************/
+
+/* test genlist item styles */
+
+const char *_genlist_styles[] = {
+   "default", "full", "one_icon", "end_icon", "no_icon",
+   "default_style", "double_label", "icon_top_text_bottom",
+   "message", "media", "media-album", "media-preview",
+   NULL
+};
+
+static void
+_genlist_renew(Evas_Object *obj, const char *style)
+{
+   Elm_Genlist_Item_Class *ic;
+   Evas_Object *check;
+   int i;
+
+   if (!obj) return;
+
+   elm_genlist_clear(obj);
+
+   check = evas_object_data_get(obj, "check");
+   if (elm_check_state_get(check))
+     elm_genlist_mode_set(obj, ELM_LIST_COMPRESS);
+   else
+     elm_genlist_mode_set(obj, ELM_LIST_SCROLL);
+
+   ic = elm_genlist_item_class_new();
+   ic->item_style = style;
+   ic->func.text_get = gl_text_get;
+   ic->func.content_get = gl_content_get;
+   ic->func.state_get = NULL;
+   ic->func.del = NULL;
+
+   for (i = 0; i < 50; i++)
+     {
+        elm_genlist_item_append(obj, ic, (void *)(uintptr_t)i, NULL,
+                                ELM_GENLIST_ITEM_NONE, NULL, NULL);
+     }
+   elm_genlist_item_class_free(ic);
+}
+
+static void
+_item_style_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+{
+   Evas_Object *gl = evas_object_data_get(obj, "genlist");
+   if (gl)
+     _genlist_renew(gl, elm_object_item_text_get(event_info));
+}
+
+static Evas_Object *
+_item_styles_list_create(Evas_Object *parent)
+{
+   Evas_Object *list;
+   int i = 0;
+
+   list = elm_list_add(parent);
+   evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+   while (_genlist_styles[i])
+     {
+        elm_list_item_append(list, _genlist_styles[i], NULL, NULL,
+                             _item_style_sel_cb, _genlist_styles[i]);
+        i++;
+     }
+
+   return list;
+}
+
+void
+test_genlist_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *box, *gl, *list, *table, *check;
+
+   win = elm_win_util_standard_add("genlist-item-styles", "Genlist Item Styles");
+   elm_win_autodel_set(win, EINA_TRUE);
+
+   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);
+   elm_win_resize_object_add(win, box);
+   evas_object_show(box);
+
+   list = _item_styles_list_create(box);
+   evas_object_show(list);
+
+   table = _elm_min_set(list, box, 200, 0);
+   evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(box, table);
+   evas_object_show(table);
+
+   gl = elm_genlist_add(box);
+   evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(box, gl);
+   evas_object_show(gl);
+
+   check = elm_check_add(win);
+   elm_object_text_set(check, "Compress");
+   elm_box_pack_end(box, check);
+   evas_object_show(check);
+   evas_object_data_set(gl, "check", check);
+   _genlist_renew(gl, "default");
+
+   evas_object_data_set(list, "genlist", gl);
+
+   evas_object_resize(win, 600, 600);
+   evas_object_show(win);
+}
+
+/***********/
+
+typedef struct _Genlist_Multi_Data Genlist_Multi_Data;
+struct _Genlist_Multi_Data
+{
+   Evas_Object *gl;
+   Evas_Object *rd1;
+   Evas_Object *rd2;
+};
+
+static void
+_multi_select_changed_cb(void *data, Evas_Object *obj,
+                         void *event_info EINA_UNUSED)
+{
+   Eina_Bool multi = elm_check_state_get(obj);
+   Genlist_Multi_Data *gd = data;
+   if (!gd) return;
+
+   elm_genlist_multi_select_set(gd->gl, multi);
+   elm_object_disabled_set(gd->rd1, !multi);
+   elm_object_disabled_set(gd->rd2, !multi);
+}
+
+static void
+_multi_select_mode_changed_cb(void *data, Evas_Object *obj,
+                              void *event_info EINA_UNUSED)
+{
+   // TIZEN_ONLY: Apply genlist widget from Tizen 2.3
+   (void) data;
+   (void) obj;
+   //elm_genlist_multi_select_mode_set(data, elm_radio_value_get(obj));
+   //
+}
+
+static void
+_multi_select_frame_create(Evas_Object *bx, Genlist_Multi_Data *gd)
+{
+   Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg;
+   if (!gd) return;
+
+   fr = elm_frame_add(bx);
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+   elm_object_text_set(fr, "Multi Select Option");
+   elm_box_pack_end(bx, fr);
+   evas_object_show(fr);
+
+   bx2 = elm_box_add(fr);
+   elm_object_content_set(fr, bx2);
+   evas_object_show(bx2);
+
+   tg = elm_check_add(bx2);
+   elm_object_style_set(tg, "toggle");
+   elm_object_text_set(tg, "Multi Select Mode");
+   elm_box_pack_end(bx2, tg);
+   evas_object_show(tg);
+
+   bx3 = elm_box_add(bx2);
+   elm_box_horizontal_set(bx3, EINA_TRUE);
+   elm_box_pack_end(bx2, bx3);
+   evas_object_show(bx3);
+
+   gd->rd1 = rdg = rd = elm_radio_add(bx3);
+   elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT);
+   elm_object_text_set(rd, "Default Mode");
+   elm_box_pack_end(bx3, rd);
+   evas_object_show(rd);
+   elm_object_disabled_set(rd, EINA_TRUE);
+   evas_object_smart_callback_add(rd, "changed",
+                                  _multi_select_mode_changed_cb, gd->gl);
+
+   gd->rd2 = rd = elm_radio_add(bx3);
+   elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL);
+   elm_radio_group_add(rd, rdg);
+   elm_object_text_set(rd, "With Control Mode");
+   elm_box_pack_end(bx3, rd);
+   evas_object_show(rd);
+   elm_object_disabled_set(rd, EINA_TRUE);
+   evas_object_smart_callback_add(rd, "changed",
+                                  _multi_select_mode_changed_cb, gd->gl);
+
+   evas_object_smart_callback_add(tg, "changed",
+                                  _multi_select_changed_cb, gd);
+}
+
+void
+test_genlist_multi_select(void *data EINA_UNUSED,
+                          Evas_Object *obj EINA_UNUSED,
+                          void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *gl, *bx;
+   Genlist_Multi_Data *gd = calloc(1, sizeof(Genlist_Multi_Data));
+   Elm_Genlist_Item_Class *itc = NULL;
+   int i = 0;
+
+   win = elm_win_util_standard_add("genlist-multi-select", "Genlist Multi Select");
+   elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, gd);
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bx);
+   evas_object_show(bx);
+
+   gd->gl = gl = elm_genlist_add(bx);
+   _multi_select_frame_create(bx, gd);
+
+   evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, gl);
+   evas_object_show(gl);
+
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_text_get;
+   itc->func.content_get = gl_content_get;
+   itc->func.state_get = gl_state_get;
+   itc->func.del = NULL;
+
+   for (i = 0; i < 100; i++)
+     {
+        elm_genlist_item_append(gl, itc,
+                                (void *)(uintptr_t)i/* item data */,
+                                NULL/* parent */,
+                                ELM_GENLIST_ITEM_NONE,
+                                gl_sel/* func */,
+                                (void *)(uintptr_t)(i * 10)/* func data */);
+     }
+   elm_genlist_item_class_free(itc);
+
+   evas_object_resize(win, 320, 500);
+   evas_object_show(win);
+}
+
+/* test genlist item search by text */
+
+typedef struct _gl20_Event_Data gl20_Event_Data;
+struct _gl20_Event_Data
+{
+   Evas_Object *gl_obj;
+   Evas_Object *tg_obj;
+   Evas_Object *en_obj;
+   Elm_Object_Item *last_item_found;
+};
+
+static const char *_gl20_items_text[] = {
+         "Albany",          "Annapolis",
+         "Atlanta",         "Augusta",
+         "Austin",          "Baton Rouge",
+         "Bismarck",        "Boise",
+         "Boston",          "Carson City",
+         "Charleston",      "Cheyenne",
+         "Columbia",        "Columbus",
+         "Concord",         "Denver",
+         "Des Moines",      "Dover",
+         "Frankfort",       "Harrisburg",
+         "Hartford",        "Helena",
+         "Honolulu",        "Indianapolis",
+         "Jackson",         "Jefferson City",
+         "Juneau",          "Lansing",
+         "Lincoln",         "Little Rock",
+         "Madison",         "Montgomery",
+         "Montpelier",      "Nashville",
+         "Oklahoma City",   "Olympia",
+         "Phoenix",         "Pierre",
+         "Providence",      "Raleigh",
+         "Richmond",        "Sacramento",
+         "Saint Paul",      "Salem",
+         "Salt Lake City",  "Santa Fe",
+         "Springfield",     "Tallahassee",
+         "Topeka",          "Trenton" };
+
+static char *
+_gl20_text_get(void *data, Evas_Object *obj EINA_UNUSED,
+               const char *part EINA_UNUSED)
+{
+   char buf[32];
+   int item_index = (int)(uintptr_t)data;
+
+   if (item_index < 50)
+     {
+        snprintf(buf, sizeof(buf), "%s", _gl20_items_text[item_index]);
+        return strdup(buf);
+     }
+   else if (item_index < 100)
+     {
+        snprintf(buf, sizeof(buf), "%X", (item_index - 50));
+        return strdup(buf);
+     }
+   else if (item_index == 100)
+     return strdup("Tree Item");
+
+   return NULL;
+}
+
+static void
+_gl20_search_item(gl20_Event_Data *event_data, Elm_Object_Item * it)
+{
+   // TIZEN_ONLY: Apply genlist widget from Tizen 2.3
+   (void) event_data;
+   (void) it;
+   /*
+   const char *str = elm_entry_entry_get(event_data->en_obj);
+   if (!str || !strlen(str)) return;
+
+   Elm_Glob_Match_Flags flag = 0;
+   if (!elm_check_state_get(event_data->tg_obj)) flag = ELM_GLOB_MATCH_NOCASE;
+
+   printf("Looking for \"%s\". ", str);
+   event_data->last_item_found = elm_genlist_search_by_text_item_get
+   (event_data->gl_obj, it, NULL, str, flag);
+
+   if (event_data->last_item_found)
+     {
+        printf("Found.\n");
+        elm_genlist_item_selected_set(event_data->last_item_found, EINA_TRUE);
+        elm_genlist_item_bring_in(event_data->last_item_found,
+           ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+        elm_object_focus_set(event_data->en_obj, EINA_TRUE);
+     }
+   else
+     printf("Not Found.\n");
+     */
+}
+
+static void
+_gl20_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                                 void *einfo EINA_UNUSED)
+{
+   _gl20_search_item(data, NULL);
+}
+
+static Elm_Genlist_Item_Class *
+_gl20_item_class_create(const char *item_style)
+{
+   Elm_Genlist_Item_Class * itc = elm_genlist_item_class_new();
+   itc->item_style = item_style;
+   itc->func.text_get = _gl20_text_get;
+   itc->func.content_get = gl_content_get;
+   itc->func.state_get = gl_state_get;
+   itc->func.del = NULL;
+   return itc;
+}
+
+static void
+_gl20_expand_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED,
+                void *event_info)
+{
+   Elm_Object_Item *glit = event_info;
+   Evas_Object *gl = elm_object_item_widget_get(glit);
+   Elm_Genlist_Item_Class *itc = NULL;
+   int i = 0;
+
+   itc = _gl20_item_class_create("default");
+
+   for (i = 50; i < 100; i++)
+     {
+        elm_genlist_item_append(gl, itc,
+           (void *)(uintptr_t) i/* item data */,
+           glit/* parent */,
+           ELM_GENLIST_ITEM_NONE, NULL/* func */,
+           NULL/* func data */);
+     }
+   elm_genlist_item_class_free(itc);
+}
+
+static void _gl20_on_keydown(void *data, Evas *evas EINA_UNUSED,
+                             Evas_Object *o EINA_UNUSED, void *einfo)
+{
+   Evas_Event_Key_Down *ev = einfo;
+   gl20_Event_Data * event_data = (gl20_Event_Data *)data;
+
+   if (!strcmp(ev->key, "Return"))
+     {
+        printf("Looking for next item\n");
+        _gl20_search_item(data, event_data->last_item_found);
+     }
+}
+
+void
+test_genlist20(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+               void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *bx, *gl;
+   Evas_Object *fr, *lb_frame;            // info frame
+   Evas_Object *bx_entry, *lb_entry, *en; // search line
+   Evas_Object *tg;                       // "case sensitive" toggle
+   Elm_Genlist_Item_Class *itc = NULL;
+   gl20_Event_Data* event_data = NULL;
+   int i = 0;
+
+   win = elm_win_util_standard_add("genlist-item-search-by-text",
+            "Genlist Item Search By Text");
+   elm_win_autodel_set(win, EINA_TRUE);
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bx);
+   evas_object_show(bx);
+
+   fr = elm_frame_add(bx);
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_text_set(fr, "Information");
+   elm_box_pack_end(bx, fr);
+   evas_object_show(fr);
+
+   lb_frame = elm_label_add(fr);
+   elm_object_text_set(lb_frame,
+      "<align=left>This is an example of "
+      "elm_genlist_search_by_text_item_get() usage.<br>"
+      "Enter search string to the entry and press Enter to "
+      "show next search result.<br>");
+   elm_object_content_set(fr, lb_frame);
+   evas_object_show(lb_frame);
+
+   tg = elm_check_add(win);
+   elm_object_style_set(tg, "toggle");
+   elm_object_text_set(tg, " Case Sensitive Search");
+   elm_check_state_set(tg, EINA_TRUE);
+   elm_box_pack_end(bx, tg);
+   evas_object_show(tg);
+
+   bx_entry = elm_box_add(win);
+   elm_box_horizontal_set(bx_entry, EINA_TRUE);
+   evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0);
+   elm_box_pack_end(bx, bx_entry);
+   evas_object_show(bx_entry);
+
+   lb_entry = elm_label_add(win);
+   elm_object_text_set(lb_entry, " Search:");
+   evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL);
+   elm_box_pack_end(bx_entry, lb_entry);
+   evas_object_show(lb_entry);
+
+   en = elm_entry_add(win);
+   elm_entry_single_line_set(en, EINA_TRUE);
+   elm_entry_scrollable_set(en, EINA_TRUE);
+   elm_object_part_text_set(en, "guide", "Type item's name here to search.");
+   evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx_entry, en);
+   evas_object_show(en);
+   elm_object_focus_set(en, EINA_TRUE);
+
+   gl = elm_genlist_add(bx);
+
+   evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, gl);
+   evas_object_show(gl);
+
+   event_data = calloc(1, sizeof(gl20_Event_Data));
+   event_data->tg_obj = tg;
+   event_data->en_obj = en;
+   event_data->gl_obj = gl;
+   event_data->last_item_found = NULL;
+
+   evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN,
+      _gl20_on_keydown, (void*)event_data);
+   evas_object_event_callback_add(gl, EVAS_CALLBACK_FREE,
+      _cleanup_cb, (void*)event_data);
+   evas_object_smart_callback_add(en, "changed,user",
+      _gl20_search_settings_changed_cb, (void*)event_data);
+   evas_object_smart_callback_add(tg, "changed",
+      _gl20_search_settings_changed_cb, (void*)event_data);
+   evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl);
+   evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl);
+   evas_object_smart_callback_add(gl, "contracted", gl4_con, gl);
+   evas_object_smart_callback_add(gl, "expanded", _gl20_expand_cb, gl);
+
+   itc = _gl20_item_class_create("tree_effect");
+
+   elm_genlist_item_append(gl, itc,
+      (void *)100/* item data */,
+      NULL/* parent */,
+      ELM_GENLIST_ITEM_TREE,
+      NULL/* func */,
+      NULL/* func data */);
+
+   itc->item_style = "default";
+
+   for (i = 0; i < 50; i++)
+     {
+        elm_genlist_item_append(gl, itc,
+           (void *)(uintptr_t)i/* item data */,
+           NULL/* parent */,
+           ELM_GENLIST_ITEM_NONE,
+           NULL/* func */,
+           NULL/* func data */);
+     }
+
+   elm_genlist_item_class_free(itc);
+
+   evas_object_resize(win, 320, 500);
+   evas_object_show(win);
+}
+
+/* test genlist deletion */
+
+static void _gl_del_sel(void *data, Evas_Object *obj, void *event_info);
+
+static void
+_gl_del_win_del_cb(void *data, Evas *e EINA_UNUSED,
+                   Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   if (!data) return;
+   elm_genlist_item_class_free(data);
+}
+
+static void
+_gl_del_unrealized_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info)
+{
+   int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
+   printf("unrealized item # %d\n", num);
+}
+
+static void
+_gl_del_doubleclick_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                       void *event_info)
+{
+   int num = (int)(uintptr_t)elm_object_item_data_get(event_info);
+   int num_category = num % 4;
+
+   if (num_category == 3)
+     elm_genlist_clear(obj);
+}
+static Evas_Object *
+_gl_del_genlist_add(Evas_Object *bx)
+{
+   Evas_Object *gl = NULL;
+
+   gl = elm_genlist_add(bx);
+   evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, gl);
+   evas_object_show(gl);
+   evas_object_smart_callback_add(gl, "unrealized",
+                                  _gl_del_unrealized_cb, NULL);
+   evas_object_smart_callback_add(gl, "clicked,double",
+                                  _gl_del_doubleclick_cb, NULL);
+
+   return gl;
+}
+
+static void
+_gl_del_item_append(Evas_Object *gl, Elm_Genlist_Item_Class *itc)
+{
+   int i = 0;
+   for (i = 0; i < 1000; i++)
+     {
+        elm_genlist_item_append(gl, itc,
+                                (void *)(uintptr_t)i/* item data */,
+                                NULL/* parent */,
+                                ELM_GENLIST_ITEM_NONE,
+                                _gl_del_sel/* func */,
+                                (void *)(uintptr_t)(i)/* func data */);
+     }
+}
+
+char *_gl_del_text_get(void *data, Evas_Object *obj EINA_UNUSED,
+                      const char *part EINA_UNUSED)
+{
+   char buf[256] = { 0 };
+   int num = (int)(uintptr_t)data;
+   int num_category = num % 4;
+
+   if (num_category == 0)
+     snprintf(buf, sizeof(buf),
+              "Item #%.02i - 1. Item Del", num);
+   else if (num_category == 1)
+     snprintf(buf, sizeof(buf),
+              "Item #%.02i - 2. Genlist Clear and Item Append", num);
+   else if (num_category == 2)
+     snprintf(buf, sizeof(buf),
+              "Item #%.02i - 3. Genlist Del", num);
+   else if (num_category == 3)
+     snprintf(buf, sizeof(buf),
+              "Item #%.02i - 4. Genlist Clear on double-click", num);
+
+   return strdup(buf);
+}
+
+static void
+_gl_del_sel(void *data, Evas_Object *obj, void *event_info)
+{
+   int num = (int)(uintptr_t)data;
+   int num_category = num % 4;
+   Elm_Object_Item *it = event_info;
+   Elm_Genlist_Item_Class *itc =
+      (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(it);
+
+   if (num_category == 0)
+     elm_object_item_del(it);
+   else if (num_category == 1)
+     {
+        elm_genlist_clear(obj);
+        _gl_del_item_append(obj, itc);
+     }
+   else if (num_category == 2)
+     {
+        evas_object_del(obj);
+     }
+}
+
+static void
+_gl_del_del_cb(void *data, Evas_Object *obj EINA_UNUSED)
+{
+   printf("deleted item # %d\n", (int)(uintptr_t)data);
+}
+
+void
+test_genlist_del(void *data EINA_UNUSED,
+                 Evas_Object *obj EINA_UNUSED,
+                 void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *bx, *fr, *lb, *gl;
+   Elm_Genlist_Item_Class *itc = NULL;
+
+   win = elm_win_util_standard_add("genlist-del", "Genlist Del");
+   elm_win_autodel_set(win, EINA_TRUE);
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bx);
+   elm_box_align_set(bx, 0.5, 0.0);
+   evas_object_show(bx);
+
+   fr = elm_frame_add(bx);
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_text_set(fr, "Information");
+   elm_box_pack_end(bx, fr);
+   evas_object_show(fr);
+
+   lb = elm_label_add(fr);
+   elm_object_text_set(lb, "<align=left>This example tests the following cases"
+                       " on item selection.<br/>"
+                       "   1. genlist item deletion<br/>"
+                       "   2. genlist clear and item append<br/>"
+                       "   3. genlist del<br/>"
+                       "   4. genlist clear on double-click</align>");
+   elm_object_content_set(fr, lb);
+   evas_object_show(lb);
+
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = _gl_del_text_get;
+   itc->func.content_get = gl_content_get;
+   itc->func.state_get = NULL;
+   itc->func.del = _gl_del_del_cb;
+   evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+                                  _gl_del_win_del_cb, itc);
+
+   gl = _gl_del_genlist_add(bx);
+   _gl_del_item_append(gl, itc);
+
+   evas_object_resize(win, 320, 500);
+   evas_object_show(win);
+}
+
+/*************/
+static unsigned _gl_focus_objects = 3;
+static const char *_gl_focus_object_names[] = {"None", "Square", "Button", "Check", "Box"};
+
+// for the top genlist items
+static char *
+gl_focus_top_items_text_get(void *data, Evas_Object *obj EINA_UNUSED,
+                            const char *part EINA_UNUSED)
+{
+   if (!data) return NULL;
+
+   if (!strcmp(data, "do_nothing"))
+     return strdup("Genlist Item");
+   else if (!strcmp(data, "popup_sel"))
+     return strdup("Create a popup on Select");
+   else if (!strcmp(data, "popup_mouse_down"))
+     return strdup("Create a popup on Mouse Down");
+   else if (!strcmp(data, "clear_on_focus"))
+     return strdup("Genlist Clear on Focus");
+   else
+     return NULL;
+}
+
+static char *
+gl_focus_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
+{
+   char buf[256];
+   unsigned char op = (uintptr_t)data % 100;
+   unsigned char v1, v2;
+
+   v1 = op / 10;
+   if (v1 > 4) v1 = 4;
+   v2 = op % 10;
+   if (v2 > 4) v2 = 4;
+   snprintf(buf, sizeof(buf), " %s / %s ",
+            _gl_focus_object_names[v1], _gl_focus_object_names[v2]);
+   return strdup(buf);
+}
+
+static Evas_Object *
+gl_focus_content_get(void *data, Evas_Object *obj, const char *part)
+{
+   Evas_Object *cnt = NULL;
+
+   char op = (uintptr_t)data % 100;
+   char type = (!strcmp(part,"elm.swallow.icon")) ? op / 10 : op % 10;
+
+   switch(type)
+     {
+      case 1:
+         cnt = elm_bg_add(obj);
+         evas_object_color_set(cnt, 128, 18, 128, 255);
+         break;
+      case 2:
+         cnt = elm_button_add(obj);
+         break;
+      case 3:
+         cnt = elm_check_add(obj);
+         break;
+      case 4:
+         cnt = elm_box_add(obj);
+         evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+         elm_box_horizontal_set(cnt, EINA_TRUE);
+         elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
+         elm_box_pack_end(cnt, gl_focus_content_get((void *)3, obj, ""));
+         elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, ""));
+         break;
+      default:
+         break;
+
+     }
+   if (cnt)
+     {
+        evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+        evas_object_show(cnt);
+     }
+   return cnt;
+}
+
+static void
+_gl_focus_sel_popup_close_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                                 void *event_info EINA_UNUSED)
+{
+   evas_object_del(data);
+}
+
+static void
+_gl_focus_sel_popup_create(Evas_Object *parent)
+{
+   Evas_Object *popup = NULL, *btn = NULL;
+
+   popup = elm_popup_add(parent);
+   elm_object_text_set(popup, "Popup for the genlist focus test with popup creation.");
+
+   // popup buttons
+   btn = elm_button_add(popup);
+   elm_object_text_set(btn, "Close");
+   elm_object_part_content_set(popup, "button1", btn);
+   evas_object_smart_callback_add(btn, "clicked", _gl_focus_sel_popup_close_btn_cb, popup);
+
+   // popup show should be called after adding all the contents and the buttons
+   // of popup to set the focus into popup's contents correctly.
+   evas_object_show(popup);
+}
+
+static void
+_gl_focus_0_item_sel_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                        void *event_info EINA_UNUSED)
+{
+   _gl_focus_sel_popup_create(obj);
+}
+
+static void
+_gl_focus_item_loop_enable_changed_cb(void *data, Evas_Object *obj,
+                                      void *event_info EINA_UNUSED)
+{
+   Evas_Object *gl = data;
+   elm_object_scroll_item_loop_enabled_set(gl, elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_focus_on_selection_set(Evas_Object *gl,
+                                 Evas_Object *chk, Eina_Bool focus)
+{
+   // TIZEN_ONLY: Apply genlist widget from Tizen 2.3
+   (void) gl;
+   (void) chk;
+   (void) focus;
+//   elm_genlist_focus_on_selection_set(gl, focus);
+//   elm_check_state_set(chk, focus);
+//   printf("genlist_focus_on_selection = %s\n", (focus) ? "true" : "false");
+   //
+}
+
+static void
+_gl_focus_focus_on_selection_changed_cb(void *data, Evas_Object *obj,
+                                        void *event_info EINA_UNUSED)
+{
+   // TIZEN_ONLY: Apply genlist widget from Tizen 2.3
+   _gl_focus_focus_on_selection_set(data, obj, EINA_FALSE);
+//   Eina_Bool nextstate = !elm_genlist_focus_on_selection_get(data);
+//   _gl_focus_focus_on_selection_set(data, obj, nextstate);
+   //
+}
+
+static void
+_gl_focus_focus_highlight_changed_cb(void *data, Evas_Object *obj,
+                                     void *event_info EINA_UNUSED)
+{
+   elm_win_focus_highlight_enabled_set(data,
+                                       elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_focus_animate_changed_cb(void *data, Evas_Object *obj,
+                                   void *event_info EINA_UNUSED)
+{
+   elm_win_focus_highlight_animate_set(data,
+                                       elm_check_state_get(obj));
+}
+
+static void
+_gl_focus_move_policy_changed_cb(void *data EINA_UNUSED,
+                                 Evas_Object *obj,
+                                 void *event_info EINA_UNUSED)
+{
+   int val = elm_radio_value_get(obj);
+
+   if (val == 0)
+     elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK);
+   else if (val == 1)
+     elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN);
+}
+
+static void
+_gl_focus_item_focus_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   printf("item,focused: %p\n", event_info);
+
+   if (event_info == data)
+     elm_genlist_clear(obj);
+}
+
+static void
+_gl_focus_item_unfocus_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                          void *event_info)
+{
+   printf("item,unfocused %p\n", event_info);
+}
+
+static void
+_gl_focus_item_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   printf("%s: %p\n", (char *)data, event_info);
+}
+
+static void
+_gl_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                      Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Key_Down *ev = event_info;
+   printf("\n=== Key Down : %s ===\n", ev->keyname);
+}
+
+static void
+_gl_focus_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                        Evas_Object *obj, void *event_info)
+{
+   Evas_Event_Mouse_Down *ev = event_info;
+   Elm_Object_Item *it = NULL;
+   int postret = 0;
+
+   it = elm_genlist_at_xy_item_get(obj, ev->canvas.x, ev->canvas.y, &postret);
+   if (!it) return;
+
+   if (elm_genlist_item_index_get(it) == 4)
+     _gl_focus_sel_popup_create(obj);
+}
+
+static Ecore_Timer *timer = NULL;
+static void
+_gl_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+                     Evas_Object *obj EINA_UNUSED,
+                     void *event_info EINA_UNUSED)
+{
+   ecore_timer_del(timer);
+   timer = NULL;
+}
+
+static void
+_gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                                                  void *event_info EINA_UNUSED)
+{
+   elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj));
+}
+
+static void
+_gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj,
+                                          void *event_info  EINA_UNUSED)
+{
+   elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj));
+}
+static Eina_Bool
+_focus_timer_cb(void *data)
+{
+   elm_object_item_focus_set(data, EINA_TRUE);
+   timer = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_select_timer_cb(void *data)
+{
+   elm_genlist_item_selected_set(data, EINA_TRUE);
+   timer = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+              void *event_info EINA_UNUSED)
+{
+   ecore_timer_del(timer);
+   timer = ecore_timer_add(1.5, _focus_timer_cb, data);
+}
+
+static void
+_sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   ecore_timer_del(timer);
+   timer = ecore_timer_add(1.5, _select_timer_cb, data);
+}
+
+static void
+_dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+            void *event_info EINA_UNUSED)
+{
+   elm_object_item_disabled_set(data, EINA_TRUE);
+}
+
+static void
+_add_more_items_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                       void *event_info EINA_UNUSED)
+{
+   Elm_Genlist_Item_Class *itc = NULL;
+   int i = 0;
+
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_text_get;
+   itc->func.content_get = NULL;
+   itc->func.state_get = NULL;
+   itc->func.del = NULL;
+
+
+   for (i = 0; i < 1000; i++)
+     {
+        elm_genlist_item_append(data, itc, (void *)(uintptr_t)i,
+                                NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+     }
+
+   elm_genlist_item_class_free(itc);
+}
+
+static void
+_focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                         void *event_info EINA_UNUSED)
+{
+   printf("Button clicked: %s\n", (char *)data);
+}
+
+void
+_focus_autoscroll_changed_cb(void *data EINA_UNUSED,
+                             Evas_Object *obj,
+                             void *event_info EINA_UNUSED)
+{
+   elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj));
+}
+
+/* this function is used in another tests such as list, gengrid, and toolbar. */
+Evas_Object *
+_focus_autoscroll_mode_frame_create(Evas_Object *parent)
+{
+   Evas_Object *fr, *bx, *rdg, *rd;
+
+   fr = elm_frame_add(parent);
+   elm_object_text_set(fr, "Focus Autoscroll Mode");
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5);
+   evas_object_show(fr);
+
+   bx = elm_box_add(fr);
+   elm_object_content_set(fr, bx);
+   evas_object_show(bx);
+
+   rdg = rd = elm_radio_add(bx);
+   elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW);
+   elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW");
+   elm_object_tooltip_text_set(rd, "Directly show the focused region<br/>"
+                               "or item automatically inside a scroller.");
+   evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, rd);
+   evas_object_show(rd);
+   evas_object_smart_callback_add(rd, "changed",
+                                  _focus_autoscroll_changed_cb,
+                                  NULL);
+
+   rd = elm_radio_add(bx);
+   elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE);
+   elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE");
+   elm_object_tooltip_text_set(rd, "Do not show the focused region or<br/>"
+                               "item automatically inside a scroller.");
+   evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, rd);
+   elm_radio_group_add(rd, rdg);
+   evas_object_show(rd);
+   evas_object_smart_callback_add(rd, "changed",
+                                  _focus_autoscroll_changed_cb,
+                                  NULL);
+
+
+   rd = elm_radio_add(bx);
+   elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN);
+   elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN");
+   elm_object_tooltip_text_set(rd, "Bring in the focused region or item<br/>"
+                               "automatically which might invole the scrolling.");
+   evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, rd);
+   elm_radio_group_add(rd, rdg);
+   evas_object_show(rd);
+   evas_object_smart_callback_add(rd, "changed",
+                                  _focus_autoscroll_changed_cb,
+                                  NULL);
+
+   elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get());
+
+   return fr;
+}
+
+static void
+_test_genlist_focus_option_panel_create(Evas_Object *win, Evas_Object *bx,
+                                        Evas_Object *gl, Elm_Object_Item *it_0,
+                                        Elm_Object_Item *it_2)
+{
+   Evas_Object *fr = NULL, *bx_opt = NULL, *chk = NULL;
+   Evas_Object *bx_mv = NULL, *rd = NULL, *rdg = NULL;
+   Evas_Object *btn_box  = NULL, *btn = NULL;
+
+   fr = elm_frame_add(bx);
+   elm_object_text_set(fr, "Options");
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, fr);
+   evas_object_show(fr);
+
+   bx_opt = elm_box_add(fr);
+   elm_box_horizontal_set(bx_opt, EINA_TRUE);
+   elm_object_content_set(fr, bx_opt);
+   evas_object_show(bx_opt);
+
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "Focus Highlight");
+   elm_check_state_set(chk, EINA_TRUE);
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _gl_focus_focus_highlight_changed_cb,
+                                  win);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "Focus Animation");
+   elm_check_state_set(chk, EINA_TRUE);
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _gl_focus_focus_animate_changed_cb,
+                                  win);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "Focus on selection");
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _gl_focus_focus_on_selection_changed_cb, gl);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "Item Looping Enable");
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _gl_focus_item_loop_enable_changed_cb, gl);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "Item Select on Focus disable");
+   elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get());
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _gl_focus_item_select_on_focus_disable_changed_cb,
+                                  NULL);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
+   chk = elm_check_add(bx_opt);
+   elm_object_text_set(chk, "First item focus on first focus in");
+   elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get());
+   evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(chk, "changed",
+                                  _gl_first_item_focus_on_first_focus_in_cb,
+                                  NULL);
+   elm_box_pack_end(bx_opt, chk);
+   evas_object_show(chk);
+
+   // Focus Autoscroll Mode
+   fr = _focus_autoscroll_mode_frame_create(bx);
+   elm_box_pack_end(bx, fr);
+
+   // Focus Movement Policy
+   fr = elm_frame_add(bx);
+   elm_object_text_set(fr, "Focus Movement Policy");
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, fr);
+   evas_object_show(fr);
+
+   bx_mv = elm_box_add(fr);
+   elm_box_horizontal_set(bx_mv, EINA_TRUE);
+   elm_object_content_set(fr, bx_mv);
+   evas_object_show(bx_mv);
+
+   rdg = rd = elm_radio_add(bx_mv);
+   elm_object_text_set(rd, "Focus Move by Click");
+   elm_radio_state_value_set(rd, 0);
+   evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(rd, "changed",
+                                  _gl_focus_move_policy_changed_cb,
+                                  NULL);
+   elm_box_pack_end(bx_mv, rd);
+   evas_object_show(rd);
+
+   rd = elm_radio_add(bx_mv);
+   elm_object_text_set(rd, "Focus Move by Mouse-In");
+   elm_radio_group_add(rd, rdg);
+   elm_radio_state_value_set(rd, 1);
+   evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0);
+   evas_object_smart_callback_add(rd, "changed",
+                                  _gl_focus_move_policy_changed_cb,
+                                  NULL);
+   elm_box_pack_end(bx_mv, rd);
+   evas_object_show(rd);
+
+   // Options
+   fr = elm_frame_add(bx);
+   elm_object_text_set(fr, "Options");
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, fr);
+   evas_object_show(fr);
+
+   btn_box = elm_box_add(fr);
+   elm_object_content_set(fr, btn_box);
+   evas_object_show(btn_box);
+
+   btn = elm_button_add(btn_box);
+   elm_object_text_set(btn, "Focus 2nd Item after 1.5 seconds.");
+   evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(btn_box, btn);
+   evas_object_show(btn);
+   evas_object_smart_callback_add(btn, "clicked", _focus_btn_cb, it_2);
+
+   btn = elm_button_add(btn_box);
+   elm_object_text_set(btn, "Select 2nd Item after 1.5 seconds.");
+   evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(btn_box, btn);
+   evas_object_show(btn);
+   evas_object_smart_callback_add(btn, "clicked", _sel_btn_cb, it_2);
+
+   btn = elm_button_add(btn_box);
+   elm_object_text_set(btn, "Disable 1st Item.");
+   evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(btn_box, btn);
+   evas_object_show(btn);
+   evas_object_smart_callback_add(btn, "clicked", _dis_btn_cb, it_0);
+
+
+   btn = elm_button_add(btn_box);
+   elm_object_text_set(btn, "Add more Genlist items");
+   evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(btn_box, btn);
+   evas_object_show(btn);
+   evas_object_smart_callback_add(btn, "clicked", _add_more_items_btn_cb, gl);
+}
+
+void
+test_genlist_focus(void *data EINA_UNUSED,
+                   Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   Evas_Object *win, *bx, *bx2, *gl, *btn;
+   unsigned lhand, rhand;
+   Elm_Object_Item *it = NULL, *it_1 = NULL, *it_2 = NULL;
+   Elm_Genlist_Item_Class *itc = NULL, *itc1 = NULL, *itc2 = NULL;
+
+   api_data *api = calloc(1, sizeof(api_data));
+   win = elm_win_util_standard_add("genlist-focus", "Genlist Focus");
+   elm_win_autodel_set(win, EINA_TRUE);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api);
+   evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
+                                  _gl_focus_win_del_cb, NULL);
+
+   elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
+   elm_win_focus_highlight_animate_set(win, EINA_TRUE);
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bx);
+   evas_object_show(bx);
+
+   btn = elm_button_add(bx);
+   elm_object_text_set(btn, "Up");
+   elm_box_pack_end(bx, btn);
+   evas_object_smart_callback_add(btn, "clicked",
+                                  _focus_button_clicked_cb, "Up");
+   evas_object_show(btn);
+
+   bx2 = elm_box_add(bx);
+   elm_box_horizontal_set(bx2, EINA_TRUE);
+   evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_pack_end(bx, bx2);
+   evas_object_show(bx2);
+
+   btn = elm_button_add(bx2);
+   elm_object_text_set(btn, "Left");
+   elm_box_pack_end(bx2, btn);
+   evas_object_smart_callback_add(btn, "clicked",
+                                  _focus_button_clicked_cb, "Left");
+   evas_object_show(btn);
+
+   gl = elm_genlist_add(bx);
+   evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
+   elm_box_pack_end(bx2, gl);
+   api->gl = gl;
+   evas_object_show(gl);
+   evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected");
+   evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected");
+   evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated");
+   evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted");
+   evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted");
+   evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL);
+   evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _gl_focus_mouse_down_cb, NULL);
+
+   btn = elm_button_add(bx2);
+   elm_object_text_set(btn, "Right");
+   elm_box_pack_end(bx2, btn);
+   evas_object_smart_callback_add(btn, "clicked",
+                                  _focus_button_clicked_cb, "Right");
+   evas_object_show(btn);
+
+   btn = elm_button_add(bx);
+   elm_object_text_set(btn, "Down");
+   elm_box_pack_end(bx, btn);
+   evas_object_smart_callback_add(btn, "clicked",
+                                  _focus_button_clicked_cb, "Down");
+   evas_object_show(btn);
+
+   itc = elm_genlist_item_class_new();
+   itc->item_style = "default";
+   itc->func.text_get = gl_focus_top_items_text_get;
+   itc->func.content_get = NULL;
+   itc->func.state_get = NULL;
+   itc->func.del = NULL;
+
+   itc1 = elm_genlist_item_class_new();
+   itc1->item_style = "default";
+   itc1->func.text_get = gl_focus_text_get;
+   itc1->func.content_get = gl_focus_content_get;
+   itc1->func.state_get = NULL;
+   itc1->func.del = NULL;
+
+   itc2 = elm_genlist_item_class_new();
+   itc2->item_style = "tree_effect";
+   itc2->func.text_get = gl_focus_text_get;
+   itc2->func.content_get = gl_focus_content_get;
+   itc2->func.state_get = NULL;
+   itc2->func.del = NULL;
+
+   it_1 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
+                                  NULL, NULL);
+   it_2 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE,
+                                  NULL, NULL);
+   elm_genlist_item_append(gl, itc, "popup_sel", NULL, ELM_GENLIST_ITEM_NONE,
+                           _gl_focus_0_item_sel_cb, NULL);
+   elm_genlist_item_append(gl, itc, "popup_mouse_down", NULL, ELM_GENLIST_ITEM_NONE,
+                           NULL, NULL);
+
+   it = elm_genlist_item_append(gl, itc, "clear_on_focus", NULL, ELM_GENLIST_ITEM_NONE,
+                                NULL, NULL);
+   evas_object_smart_callback_add(gl, "item,focused", _gl_focus_item_focus_cb, it);
+   evas_object_smart_callback_add(gl, "item,unfocused", _gl_focus_item_unfocus_cb, NULL);
+
+   for (lhand = 0; lhand < _gl_focus_objects; lhand++)
+     {
+        for (rhand = 0; rhand < _gl_focus_objects; rhand++)
+          {
+             unsigned digit1 = lhand * 10 + rhand;
+             elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit1,
+                                     NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+             unsigned digit2 = (_gl_focus_objects - lhand -1) * 10 +
+                (_gl_focus_objects - rhand -1);
+             it = elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit2,
+                                          NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+             if (rhand == 4)
+               elm_object_item_disabled_set(it, EINA_TRUE);
+
+             if (rhand == (_gl_focus_objects - 1))
+               elm_genlist_item_append(gl, itc2, (void*)(uintptr_t)digit1,
+                     NULL, ELM_GENLIST_ITEM_TREE, NULL, NULL);
+          }
+     }
+
+   elm_genlist_item_class_free(itc);
+   elm_genlist_item_class_free(itc1);
+   elm_genlist_item_class_free(itc2);
+
+   // Options
+   _test_genlist_focus_option_panel_create(win, bx, gl, it_1, it_2);
+
+   evas_object_resize(win, 420, 600);
+   evas_object_show(win);
+}
+