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
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
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*/
}
}
-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
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
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
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
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);
}
_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
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
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
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
if (!sd) return;
typedef struct _Smart_Data Smart_Data;
+typedef struct _Edje_Signal_Data Edje_Signal_Data;
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);
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;
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);
}
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;
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
_smart_del(Evas_Object *obj)
{
Evas_Object *sobj;
+ Edje_Signal_Data *esd;
INTERNAL_ENTRY;
if (sd->del_pre_func) sd->del_pre_func(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);
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);