widget: move some callback infrastructure tu use Eo directly.

This save some serious amount of memory quite easily.
This commit is contained in:
Cedric BAIL 2014-07-06 19:08:56 +02:00
parent c4785994c4
commit 81cff04884
1 changed files with 128 additions and 98 deletions

View File

@ -83,6 +83,62 @@ _elm_scrollable_is(const Evas_Object *obj)
eo_isa(obj, ELM_INTERFACE_SCROLLABLE_MIXIN);
}
static Eina_Bool
_on_sub_obj_del(void *data,
Eo *obj,
const Eo_Event_Description *desc,
void *event_info);
static Eina_Bool
_on_sub_obj_hide(void *data,
Eo *obj,
const Eo_Event_Description *desc,
void *event_info);
static Eina_Bool
_propagate_event(void *data,
Eo *obj,
const Eo_Event_Description *desc,
void *event_info);
EO_CALLBACKS_ARRAY_DEFINE(elm_widget_subitems_callbacks,
{ EVAS_OBJECT_EVENT_DEL, _on_sub_obj_del },
{ EVAS_OBJECT_EVENT_HIDE, _on_sub_obj_hide });
EO_CALLBACKS_ARRAY_DEFINE(efl_subitems_callbacks,
{ EVAS_OBJECT_EVENT_DEL, _on_sub_obj_del });
EO_CALLBACKS_ARRAY_DEFINE(focus_callbacks,
{ EVAS_OBJECT_EVENT_KEY_DOWN, _propagate_event },
{ EVAS_OBJECT_EVENT_KEY_UP, _propagate_event },
{ EVAS_OBJECT_EVENT_MOUSE_WHEEL, _propagate_event });
static inline void
_callbacks_add(Eo *widget, void *data)
{
if (_elm_widget_is(widget))
{
eo_do(widget,
eo_event_callback_array_add(elm_widget_subitems_callbacks(), data));
}
else
{
eo_do(widget,
eo_event_callback_array_add(efl_subitems_callbacks(), data));
}
}
static inline void
_callbacks_del(Eo *widget, void *data)
{
if (_elm_widget_is(widget))
{
eo_do(widget,
eo_event_callback_array_del(elm_widget_subitems_callbacks(), data));
}
else
{
eo_do(widget,
eo_event_callback_array_del(efl_subitems_callbacks(), data));
}
}
void
_elm_widget_item_highlight_in_theme(Evas_Object *obj, Elm_Object_Item *it)
{
@ -167,20 +223,21 @@ _parents_unfocus(Evas_Object *obj)
}
}
static void
static Eina_Bool
_on_sub_obj_hide(void *data EINA_UNUSED,
Evas *e EINA_UNUSED,
Evas_Object *obj,
void *event_info EINA_UNUSED)
Eo *obj,
const Eo_Event_Description *desc EINA_UNUSED,
void *event_info EINA_UNUSED)
{
elm_widget_focus_hide_handle(obj);
return EO_CALLBACK_CONTINUE;
}
static void
static Eina_Bool
_on_sub_obj_del(void *data,
Evas *e EINA_UNUSED,
Evas_Object *obj,
void *event_info EINA_UNUSED)
Eo *obj,
const Eo_Event_Description *desc EINA_UNUSED,
void *event_info EINA_UNUSED)
{
ELM_WIDGET_DATA_GET(data, sd);
@ -192,18 +249,18 @@ _on_sub_obj_del(void *data,
{
/* already dels sub object */
elm_widget_resize_object_set(sd->obj, NULL, EINA_TRUE);
return;
}
else if (obj == sd->hover_obj)
{
sd->hover_obj = NULL;
return;
}
else
{
if (!elm_widget_sub_object_del(sd->obj, obj))
ERR("failed to remove sub object %p from %p\n", obj, sd->obj);
}
return EO_CALLBACK_CONTINUE;
}
static const Evas_Smart_Cb_Description _smart_callbacks[] =
@ -333,8 +390,7 @@ _elm_widget_evas_object_smart_del(Eo *obj, Elm_Widget_Smart_Data *sd)
if (sd->hover_obj)
{
/* detach it from us */
evas_object_event_callback_del_full
(sd->hover_obj, EVAS_CALLBACK_DEL, _on_sub_obj_del, obj);
_callbacks_del(sd->hover_obj, obj);
sd->hover_obj = NULL;
}
@ -579,44 +635,40 @@ _propagate_y_drag_lock(Evas_Object *obj,
}
}
static void
_propagate_event(void *data,
Evas *e EINA_UNUSED,
Evas_Object *obj,
static Eina_Bool
_propagate_event(void *data EINA_UNUSED,
Eo *obj,
const Eo_Event_Description *desc,
void *event_info)
{
INTERNAL_ENTRY;
Evas_Callback_Type type = (Evas_Callback_Type)(uintptr_t)data;
INTERNAL_ENTRY EO_CALLBACK_CONTINUE;
Evas_Callback_Type type;
Evas_Event_Flags *event_flags = NULL;
switch (type)
if (desc == EVAS_OBJECT_EVENT_KEY_DOWN)
{
case EVAS_CALLBACK_KEY_DOWN:
{
Evas_Event_Key_Down *ev = event_info;
event_flags = &(ev->event_flags);
}
break;
case EVAS_CALLBACK_KEY_UP:
{
Evas_Event_Key_Up *ev = event_info;
event_flags = &(ev->event_flags);
}
break;
case EVAS_CALLBACK_MOUSE_WHEEL:
{
Evas_Event_Mouse_Wheel *ev = event_info;
event_flags = &(ev->event_flags);
}
break;
default:
break;
Evas_Event_Key_Down *ev = event_info;
event_flags = &(ev->event_flags);
type = EVAS_CALLBACK_KEY_DOWN;
}
else if (desc == EVAS_OBJECT_EVENT_KEY_UP)
{
Evas_Event_Key_Up *ev = event_info;
event_flags = &(ev->event_flags);
type = EVAS_CALLBACK_KEY_UP;
}
else if (desc == EVAS_OBJECT_EVENT_MOUSE_WHEEL)
{
Evas_Event_Mouse_Wheel *ev = event_info;
event_flags = &(ev->event_flags);
type = EVAS_CALLBACK_MOUSE_WHEEL;
}
else
return EO_CALLBACK_CONTINUE;
elm_widget_event_propagate(obj, type, event_info, event_flags);
return EO_CALLBACK_CONTINUE;
}
/**
@ -1033,8 +1085,8 @@ _elm_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
}
sd->subobjs = eina_list_append(sd->subobjs, sobj);
evas_object_data_set(sobj, "elm-parent", obj);
evas_object_event_callback_add
(sobj, EVAS_CALLBACK_DEL, _on_sub_obj_del, obj);
_callbacks_add(sobj, obj);
if (_elm_widget_is(sobj))
{
ELM_WIDGET_DATA_GET(sobj, sdc);
@ -1051,9 +1103,6 @@ _elm_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
double scale, pscale = elm_widget_scale_get(sobj);
Elm_Theme *th, *pth = elm_widget_theme_get(sobj);
evas_object_event_callback_add
(sobj, EVAS_CALLBACK_HIDE, _on_sub_obj_hide, NULL);
scale = elm_widget_scale_get(sobj);
th = elm_widget_theme_get(sobj);
mirrored = elm_widget_mirrored_get(sobj);
@ -1148,11 +1197,7 @@ _elm_widget_sub_object_del(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
sd->subobjs = eina_list_remove(sd->subobjs, sobj);
evas_object_event_callback_del_full
(sobj, EVAS_CALLBACK_DEL, _on_sub_obj_del, obj);
if (_elm_widget_is(sobj))
evas_object_event_callback_del_full
(sobj, EVAS_CALLBACK_HIDE, _on_sub_obj_hide, NULL);
_callbacks_del(sobj, obj);
return EINA_TRUE;
}
@ -1224,14 +1269,12 @@ _elm_widget_hover_object_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd, Eva
{
if (sd->hover_obj)
{
evas_object_event_callback_del_full(sd->hover_obj, EVAS_CALLBACK_DEL,
_on_sub_obj_del, obj);
_callbacks_del(sd->hover_obj, obj);
}
sd->hover_obj = sobj;
if (sd->hover_obj)
{
evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL,
_on_sub_obj_del, obj);
_callbacks_add(sobj, obj);
_smart_reconfigure(sd);
}
}
@ -1257,24 +1300,11 @@ _elm_widget_can_focus_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool can_focu
sd->child_can_focus = EINA_TRUE;
}
evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
_propagate_event,
(void *)(uintptr_t)EVAS_CALLBACK_KEY_DOWN);
evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_UP,
_propagate_event,
(void *)(uintptr_t)EVAS_CALLBACK_KEY_UP);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_WHEEL,
_propagate_event,
(void *)(uintptr_t)EVAS_CALLBACK_MOUSE_WHEEL);
eo_do(obj, eo_event_callback_array_add(focus_callbacks(), NULL));
}
else
{
evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN,
_propagate_event);
evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_UP,
_propagate_event);
evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_WHEEL,
_propagate_event);
eo_do(obj, eo_event_callback_array_del(focus_callbacks(), NULL));
}
}
@ -3945,17 +3975,32 @@ _track_obj_update(Evas_Object *track, Evas_Object *obj)
else evas_object_hide(track);
}
static void
_track_obj_view_update(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
static Eina_Bool
_track_obj_view_update(void *data, Eo *obj,
const Eo_Event_Description *desc EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *track = data;
_track_obj_update(track, obj);
Elm_Widget_Item *item = data;
_track_obj_update(item->track_obj, obj);
return EO_CALLBACK_CONTINUE;
}
static void
_track_obj_view_del(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
static Eina_Bool
_track_obj_view_del(void *data, Eo *obj EINA_UNUSED,
const Eo_Event_Description *desc EINA_UNUSED,
void *event_info EINA_UNUSED);
EO_CALLBACKS_ARRAY_DEFINE(tracker_callbacks,
{ EVAS_OBJECT_EVENT_RESIZE, _track_obj_view_update },
{ EVAS_OBJECT_EVENT_MOVE, _track_obj_view_update },
{ EVAS_OBJECT_EVENT_SHOW, _track_obj_view_update },
{ EVAS_OBJECT_EVENT_HIDE, _track_obj_view_update },
{ EVAS_OBJECT_EVENT_DEL, _track_obj_view_del });
static Eina_Bool
_track_obj_view_del(void *data, Eo *obj EINA_UNUSED,
const Eo_Event_Description *desc EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Elm_Widget_Item *item = data;
@ -3966,6 +4011,8 @@ _track_obj_view_del(void *data, Evas *e EINA_UNUSED,
_track_obj_del);
evas_object_del(item->track_obj);
item->track_obj = NULL;
return EO_CALLBACK_CONTINUE;
}
static void
@ -3977,16 +4024,7 @@ _track_obj_del(void *data, Evas *e EINA_UNUSED,
if (!item->view) return;
evas_object_event_callback_del(item->view, EVAS_CALLBACK_RESIZE,
_track_obj_view_update);
evas_object_event_callback_del(item->view, EVAS_CALLBACK_MOVE,
_track_obj_view_update);
evas_object_event_callback_del(item->view, EVAS_CALLBACK_SHOW,
_track_obj_view_update);
evas_object_event_callback_del(item->view, EVAS_CALLBACK_HIDE,
_track_obj_view_update);
evas_object_event_callback_del(item->view, EVAS_CALLBACK_DEL,
_track_obj_view_del);
eo_do(item->view, eo_event_callback_array_del(tracker_callbacks(), item));
}
static void
@ -4512,16 +4550,8 @@ elm_widget_item_track(Elm_Widget_Item *item)
evas_object_event_callback_add(track, EVAS_CALLBACK_DEL, _track_obj_del,
item);
evas_object_event_callback_add(item->view, EVAS_CALLBACK_RESIZE,
_track_obj_view_update, track);
evas_object_event_callback_add(item->view, EVAS_CALLBACK_MOVE,
_track_obj_view_update, track);
evas_object_event_callback_add(item->view, EVAS_CALLBACK_SHOW,
_track_obj_view_update, track);
evas_object_event_callback_add(item->view, EVAS_CALLBACK_HIDE,
_track_obj_view_update, track);
evas_object_event_callback_add(item->view, EVAS_CALLBACK_DEL,
_track_obj_view_del, item);
eo_do(item->view,
eo_event_callback_array_add(tracker_callbacks(), item));
evas_object_ref(track);