And let's not expose internal objects when setting signal callbacks on widgets.

SVN revision: 54004
This commit is contained in:
Iván Briano 2010-10-29 18:21:58 +00:00
parent 0699115dae
commit ea3dda3527
14 changed files with 116 additions and 67 deletions

View 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

View 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

View 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*/

View 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

View 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

View 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

View 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

View 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);
}

View 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

View 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

View 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

View 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

View 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);

View 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);