And let's not expose internal objects when setting signal callbacks on widgets.
authorIván Briano <sachieru@gmail.com>
Fri, 29 Oct 2010 18:21:58 +0000 (18:21 +0000)
committerIván Briano <sachieru@gmail.com>
Fri, 29 Oct 2010 18:21:58 +0000 (18:21 +0000)
SVN revision: 54004

14 files changed:
src/lib/elc_scrolled_entry.c
src/lib/elm_button.c
src/lib/elm_calendar.c
src/lib/elm_clock.c
src/lib/elm_entry.c
src/lib/elm_hover.c
src/lib/elm_index.c
src/lib/elm_layout.c
src/lib/elm_list.c
src/lib/elm_panel.c
src/lib/elm_scroller.c
src/lib/elm_spinner.c
src/lib/elm_widget.c
src/lib/elm_widget.h

index 175a61b..eb58680 100644 (file)
@@ -198,14 +198,12 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
         data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data __UNUSED__)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
    elm_object_signal_callback_del(wd->entry, emission, source, func_cb);
-   return elm_object_signal_callback_del(wd->scroller, emission, source,
-        func_cb);
+   elm_object_signal_callback_del(wd->scroller, emission, source, func_cb);
 }
 
 static void
index c1dc59e..f589f7b 100644 (file)
@@ -147,13 +147,12 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
    edje_object_signal_callback_add(wd->btn, emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return edje_object_signal_callback_del(wd->btn, emission, source,
-        func_cb);
+   edje_object_signal_callback_del_full(wd->btn, emission, source, func_cb,
+                                        data);
 }
 
 static void
index 85be984..71a8945 100644 (file)
@@ -377,13 +377,12 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
         source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return edje_object_signal_callback_del(wd->calendar, emission, source,
-        func_cb);
+   edje_object_signal_callback_del_full(wd->calendar, emission, source, func_cb,
+                                        data);
 }
 
 /* Set correct tm_wday and tm_yday after other fields changes*/
index e043638..815a6a3 100644 (file)
@@ -119,18 +119,18 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
      }
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    int i;
-   if (!wd) return NULL;
    for (i = 0; i < 6; i++)
      {
-       edje_object_signal_callback_del(wd->digit[i], emission, source,
-             func_cb);
+       edje_object_signal_callback_del_full(wd->digit[i], emission, source,
+                                             func_cb, data);
      }
-   return edje_object_signal_callback_del(wd->clk, emission, source, func_cb);
+   edje_object_signal_callback_del_full(wd->clk, emission, source, func_cb,
+                                        data);
 }
 
 static void
index 186da24..6fbbfca 100644 (file)
@@ -393,12 +393,12 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
    edje_object_signal_callback_add(wd->ent, emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return edje_object_signal_callback_del(wd->ent, emission, source, func_cb);
+   edje_object_signal_callback_del_full(wd->ent, emission, source, func_cb,
+                                        data);
 }
 
 static void
index 09ac469..437200d 100644 (file)
@@ -164,16 +164,15 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
    edje_object_signal_callback_add(wd->hov, emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd;
 
    wd = elm_widget_data_get(obj);
-   if (!wd)
-     return NULL;
 
-   return edje_object_signal_callback_del(wd->hov, emission, source, func_cb);
+   edje_object_signal_callback_del_full(wd->hov, emission, source, func_cb,
+                                        data);
 }
 
 static void
index 320561f..d9c3962 100644 (file)
@@ -82,12 +82,12 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
    edje_object_signal_callback_add(wd->base, emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return edje_object_signal_callback_del(wd->base, emission, source, func_cb);
+   edje_object_signal_callback_del_full(wd->base, emission, source, func_cb,
+                                        data);
 }
 
 static void
index 7c94fe5..0503fa6 100644 (file)
@@ -122,12 +122,12 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
    edje_object_signal_callback_add(wd->lay, emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   return edje_object_signal_callback_del(wd->lay, emission, source,
-        func_cb);
+   edje_object_signal_callback_del_full(wd->lay, emission, source, func_cb,
+                                        data);
 }
 
 
index d496c6f..563c5db 100644 (file)
@@ -441,24 +441,25 @@ static void
 _signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   elm_object_signal_emit(wd->scr, emission, source);
+   edje_object_signal_emit(elm_smart_scroller_edje_object_get(wd->scr),
+                           emission, source);
 }
 
 static void
 _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   elm_object_signal_callback_add(wd->scr, emission, source, func_cb, data);
+   edje_object_signal_callback_add(elm_smart_scroller_edje_object_get(wd->scr),
+                                   emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return elm_object_signal_callback_del(wd->scr, emission, source, func_cb);
+   edje_object_signal_callback_del_full(
+                              elm_smart_scroller_edje_object_get(wd->scr),
+                              emission, source, func_cb, data);
 }
 
 static void
index 798699a..2400b71 100644 (file)
@@ -115,14 +115,13 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
         emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return edje_object_signal_callback_del(
+   edje_object_signal_callback_del_full(
         elm_smart_scroller_edje_object_get(wd->scr), emission, source,
-        func_cb);
+        func_cb, data);
 }
 
 static void 
index 491672e..3da7985 100644 (file)
@@ -235,14 +235,13 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
         emission, source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return edje_object_signal_callback_del(
+   edje_object_signal_callback_del_full(
         elm_smart_scroller_edje_object_get(wd->scr), emission, source,
-        func_cb);
+        func_cb, data);
 }
 
 static void
index 8f5d1c1..a1793bd 100644 (file)
@@ -104,13 +104,12 @@ _signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *so
                                    source, func_cb, data);
 }
 
-static void *
-_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source))
+static void
+_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
-   return edje_object_signal_callback_del(wd->spinner, emission, source,
-                                          func_cb);
+   edje_object_signal_callback_del_full(wd->spinner, emission, source,
+                                        func_cb, data);
 }
 
 static void
index 1195437..f5b4659 100644 (file)
@@ -11,6 +11,7 @@ static const char SMART_NAME[] = "elm_widget";
    if (!sd) return;
 
 typedef struct _Smart_Data Smart_Data;
+typedef struct _Edje_Signal_Data Edje_Signal_Data;
 
 struct _Smart_Data
 {
@@ -35,10 +36,10 @@ struct _Smart_Data
                                const char *source, void (*func) (void *data,
                                   Evas_Object *o, const char *emission,
                                   const char *source), void *data);
-   void         *(*callback_del_func) (Evas_Object *obj, const char *emission,
+   void         (*callback_del_func) (Evas_Object *obj, const char *emission,
                                  const char *source, void (*func) (void *data,
                                     Evas_Object *o, const char *emission,
-                                    const char *source));
+                                    const char *source), void *data);
    void         (*changed_func) (Evas_Object *obj);
    Eina_Bool    (*focus_next_func) (const Evas_Object *obj, Elm_Focus_Direction dir,
                                     Evas_Object **next);
@@ -62,6 +63,9 @@ struct _Smart_Data
    
    int            child_drag_x_locked;
    int            child_drag_y_locked;
+
+   Eina_List     *edje_signals;
+
    Eina_Bool      drag_x_locked : 1;
    Eina_Bool      drag_y_locked : 1;
    
@@ -75,6 +79,15 @@ struct _Smart_Data
    Eina_List     *focus_chain;
 };
 
+struct _Edje_Signal_Data
+{
+   Evas_Object *obj;
+   Edje_Signal_Cb func;
+   const char *emission;
+   const char *source;
+   void *data;
+};
+
 /* local subsystem functions */
 static void _smart_reconfigure(Smart_Data *sd);
 static void _smart_add(Evas_Object *obj);
@@ -428,7 +441,7 @@ elm_widget_signal_callback_add_hook_set(Evas_Object *obj, void (*func) (Evas_Obj
 }
 
 EAPI void
-elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void *(*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source)))
+elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data))
 {
    API_ENTRY return;
    sd->callback_del_func = func;
@@ -1351,20 +1364,56 @@ elm_widget_signal_emit(Evas_Object *obj, const char *emission, const char *sourc
    sd->signal_func(obj, emission, source);
 }
 
+static void
+_edje_signal_callback(void *data, Evas_Object *obj __UNUSED__, const char *emission, const char *source)
+{
+   Edje_Signal_Data *esd = data;
+   esd->func(esd->data, esd->obj, emission, source);
+}
+
 EAPI void
 elm_widget_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
 {
+   Edje_Signal_Data *esd;
    API_ENTRY return;
    if (!sd->callback_add_func) return;
-   sd->callback_add_func(obj, emission, source, func, data);
+
+   esd = ELM_NEW(Edje_Signal_Data);
+   if (!esd) return;
+
+   esd->obj = obj;
+   esd->func = func;
+   esd->emission = eina_stringshare_add(emission);
+   esd->source = eina_stringshare_add(source);
+   esd->data = data;
+   sd->edje_signals = eina_list_append(sd->edje_signals, esd);
+   sd->callback_add_func(obj, emission, source, _edje_signal_callback, esd);
 }
 
 EAPI void *
 elm_widget_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source))
 {
+   Edje_Signal_Data *esd;
+   Eina_List *l;
+   void *data = NULL;
    API_ENTRY return NULL;
    if (!sd->callback_del_func) return NULL;
-   return sd->callback_del_func(obj, emission, source, func);
+
+   EINA_LIST_FOREACH(sd->edje_signals, l, esd)
+     {
+        if ((esd->func == func) && (!strcmp(esd->emission, emission)) &&
+            (!strcmp(esd->source, source)))
+          {
+             sd->edje_signals = eina_list_remove_list(sd->edje_signals, l);
+             eina_stringshare_del(esd->emission);
+             eina_stringshare_del(esd->source);
+             data = esd->data;
+             free(esd);
+             break;
+          }
+     }
+   sd->callback_del_func(obj, emission, source, _edje_signal_callback, esd);
+   return data;
 }
 
 EAPI void
@@ -2404,6 +2453,7 @@ static void
 _smart_del(Evas_Object *obj)
 {
    Evas_Object *sobj;
+   Edje_Signal_Data *esd;
 
    INTERNAL_ENTRY;
    if (sd->del_pre_func) sd->del_pre_func(obj);
@@ -2431,6 +2481,12 @@ _smart_del(Evas_Object *obj)
      }
    eina_list_free(sd->tooltips); /* should be empty anyway */
    eina_list_free(sd->cursors); /* should be empty anyway */
+   EINA_LIST_FREE(sd->edje_signals, esd)
+     {
+        eina_stringshare_del(esd->emission);
+        eina_stringshare_del(esd->source);
+        free(esd);
+     }
    if (sd->del_func) sd->del_func(obj);
    if (sd->style) eina_stringshare_del(sd->style);
    if (sd->type) eina_stringshare_del(sd->type);
index e8a5a4d..7e621f7 100644 (file)
@@ -217,7 +217,7 @@ EAPI void             elm_widget_event_hook_set(Evas_Object *obj, Eina_Bool (*fu
 EAPI void             elm_widget_changed_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj));
 EAPI void             elm_widget_signal_emit_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source));
 EAPI void             elm_widget_signal_callback_add_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data));
-EAPI void             elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void *(*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source)));
+EAPI void             elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj, const char *emission, const char *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, const char *source), void *data));
 EAPI void             elm_widget_theme(Evas_Object *obj);
 EAPI void             elm_widget_focus_next_hook_set(Evas_Object *obj, Eina_Bool (*func) (const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next));
 EAPI void             elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);