cedric pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=97e1fb1f77a4517a6cde5724f67098ca5654ef76
commit 97e1fb1f77a4517a6cde5724f67098ca5654ef76 Author: Cedric BAIL <[email protected]> Date: Sun Jul 6 19:08:56 2014 +0200 widget: move some callback infrastructure tu use Eo directly. This save some serious amount of memory quite easily. --- src/lib/elm_widget.c | 226 +++++++++++++++++++++++++++++---------------------- 1 file changed, 128 insertions(+), 98 deletions(-) diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index 00a754d..3a9e298 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -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); --
