Index: ChangeLog
===================================================================
--- ChangeLog	(revision 82792)
+++ ChangeLog	(working copy)
@@ -702,3 +702,8 @@
 2013-01-10  Shinwoo Kim
 
 	* backport r82456: Fix potential problem which would cause resource leak.
+
+2013-01-15  Thiep Ha
+
+        * Fix memory leak and callback function in ctxpopup.
+
Index: src/lib/elc_ctxpopup.c
===================================================================
--- src/lib/elc_ctxpopup.c	(revision 82792)
+++ src/lib/elc_ctxpopup.c	(working copy)
@@ -8,6 +8,13 @@
 {
    ELM_WIDGET_ITEM;
    Elm_Object_Item *list_item;
+
+   struct
+     {
+        Evas_Smart_Cb org_func_cb;
+        const void    *org_data;
+        Evas_Object   *cobj;
+     } wcb;
 };
 
 struct _Widget_Data
@@ -17,6 +24,7 @@
    Evas_Object *content;
    Evas_Object *list;
    Evas_Object *box;
+   Eina_List   *items;
    Evas_Object *arrow;
    Evas_Object *bg;
    Elm_Ctxpopup_Direction dir;
@@ -127,6 +135,7 @@
 static void _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source);
 static void _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data);
 static void _signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data);
+static void _item_wrap_cb(void *data, Evas_Object *obj, void *event_info);
 
 static const char SIG_DISMISSED[] = "dismissed";
 
@@ -750,6 +759,7 @@
 _del_hook(Evas_Object *obj)
 {
    Widget_Data *wd;
+   Elm_Ctxpopup_Item *it;
 
    wd = elm_widget_data_get(obj);
    if (!wd) return;
@@ -757,6 +767,11 @@
    elm_ctxpopup_clear(obj);
    evas_object_del(wd->arrow);
    evas_object_del(wd->base);
+
+   EINA_LIST_FREE (wd->items, it)
+     {
+        elm_widget_item_free(it);
+     }
    free(wd);
 }
 
@@ -1126,11 +1141,13 @@
    if (eina_list_count(elm_list_items_get(list)) < 2)
      {
         elm_object_item_del(ctxpopup_it->list_item);
+        wd->items = eina_list_remove(wd->items, it);
         evas_object_hide(WIDGET(ctxpopup_it));
         return EINA_TRUE;
      }
 
    elm_object_item_del(ctxpopup_it->list_item);
+   wd->items = eina_list_remove(wd->items, it);
    if (wd->list_visible)
      _sizing_eval(WIDGET(ctxpopup_it));
 
@@ -1171,6 +1188,13 @@
    edje_object_signal_callback_del_full(wd->base, emission, source, func_cb, data);
 }
 
+static void
+_item_wrap_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Elm_Ctxpopup_Item *item = data;
+   item->wcb.org_func_cb((void *)item->wcb.org_data, item->wcb.cobj, item);
+}
+
 EAPI Evas_Object *
 elm_ctxpopup_add(Evas_Object *parent)
 {
@@ -1385,7 +1409,11 @@
         _content_set_hook(obj, "default", wd->list);
      }
 
-   item->list_item = elm_list_item_append(wd->list, label, icon, NULL, func, data);
+   item->wcb.org_func_cb = func;
+   item->wcb.org_data = data;
+   item->wcb.cobj = obj;
+   item->list_item = elm_list_item_append(wd->list, label, icon, NULL, _item_wrap_cb, item);
+   wd->items = eina_list_append(wd->items, item);
 
    wd->dir = ELM_CTXPOPUP_DIRECTION_UNKNOWN;
 
Index: src/bin/test_ctxpopup.c
===================================================================
--- src/bin/test_ctxpopup.c	(revision 82792)
+++ src/bin/test_ctxpopup.c	(working copy)
@@ -283,6 +283,48 @@
    evas_object_smart_callback_add(btn, "clicked", _btn_clicked, ctxpopup);
 }
 
+static void
+_ctxpopup_item_disable_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   printf("ctxpopup item selected: %s\n",
+          elm_object_item_text_get(event_info));
+
+   Elm_Object_Item *it = (Elm_Object_Item *)event_info;
+   elm_object_item_disabled_set(it, EINA_TRUE);
+}
+
+static void
+_ctxpopup_item_delete_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info)
+{
+   printf("ctxpopup item selected: %s\n",
+          elm_object_item_text_get(event_info));
+
+   evas_object_del(obj);
+}
+
+static void
+_list_item_cb7(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Evas_Object *ctxpopup;
+   Evas_Coord x,y;
+
+   ctxpopup = elm_ctxpopup_add(obj);
+   evas_object_smart_callback_add(ctxpopup,
+                                  "dismissed",
+                                  _dismissed,
+                                  NULL);
+
+   elm_ctxpopup_item_append(ctxpopup, "Disable this item", NULL, _ctxpopup_item_disable_cb, ctxpopup);
+   elm_ctxpopup_item_append(ctxpopup, "Delete this ctxpopup", NULL, _ctxpopup_item_delete_cb, ctxpopup);
+   elm_ctxpopup_item_append(ctxpopup, "Another item", NULL, _ctxpopup_item_cb, NULL);
+
+   evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
+   evas_object_size_hint_max_set(ctxpopup, 240, 240);
+   evas_object_move(ctxpopup, x, y);
+   evas_object_show(ctxpopup);
+   _print_current_dir(ctxpopup);
+}
+
 static void _list_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    elm_list_item_selected_set(event_info, EINA_FALSE);
@@ -315,6 +357,8 @@
                         _list_item_cb5, NULL);
    elm_list_item_append(list, "Ctxpopup with restacking", NULL, NULL,
                         _list_item_cb6, NULL);
+   elm_list_item_append(list, "Ctxpopup with callback function", NULL, NULL,
+                        _list_item_cb7, NULL);
    evas_object_show(list);
    elm_list_go(list);
 
Index: NEWS
===================================================================
--- NEWS	(revision 82792)
+++ NEWS	(working copy)
@@ -18,6 +18,7 @@
    * Tooltips now correctly set NETWM tooltip window type
    * Fix the naviframe item part text to be set properly.
    * Fix list separator size bug.
+   * Fix memory leak and callback function in ctxpoup.
 
 Elementary 1.7.4
 
