forked from enlightenment/efl
And let's not expose internal objects when setting signal callbacks on widgets.
SVN revision: 54004
This commit is contained in:
parent
0699115dae
commit
ea3dda3527
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue