cedric pushed a commit to branch master.
commit 669e40fbce8c90f7e35b9f7df7d52e7ba7fb5a5b
Author: Cedric Bail <[email protected]>
Date: Mon Jun 17 16:55:22 2013 +0900
edje: reduce memory footprint of edje callbacks.
Divide by two the amount of memory used by callbacks in elementary_test.
---
ChangeLog | 4 +
NEWS | 1 +
src/lib/edje/edje_callbacks.c | 174 ++++++++++++++++++------------------------
src/lib/edje/edje_load.c | 14 +++-
src/lib/edje/edje_private.h | 1 +
5 files changed, 93 insertions(+), 101 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 446c491..0a50b67 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-06-17 Cedric Bail
+
+ * Edje: Use Eo array of callbacks to reduce edje memory foot print.
+
2013-06-13 Jiyou Park
* Evas: Fix crash if app call image object update add after calling
api like fileset.
diff --git a/NEWS b/NEWS
index e8540cd..2cad3ed 100644
--- a/NEWS
+++ b/NEWS
@@ -188,6 +188,7 @@ Improvements:
* Turn on scissors always to abe able to to partual render on some GL
implementations properly.
* Evas gl engine - dont map dri/drm buffer unless we are going to render.
* Partial rendering support in evas for several gl drivers.
+ * edje: use eo array of callbacks to reduce callbacks memory footprint.
Fixes:
* Fix a memory leak in ecore_con_dns when using ecore_con_server_connect
diff --git a/src/lib/edje/edje_callbacks.c b/src/lib/edje/edje_callbacks.c
index 4b3fe3d..8987ba7 100644
--- a/src/lib/edje/edje_callbacks.c
+++ b/src/lib/edje/edje_callbacks.c
@@ -1,7 +1,7 @@
#include "edje_private.h"
-static void
-_edje_hold_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void
*event_info)
+static Eina_Bool
+_edje_hold_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc
EINA_UNUSED, void *event_info)
{
Evas_Event_Hold *ev;
Edje *ed;
@@ -10,15 +10,17 @@ _edje_hold_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, void *ev
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
- if (!rp) return;
+ if (!rp) return EO_CALLBACK_CONTINUE;
if (ev->hold)
_edje_emit(ed, "hold,on", rp->part->name);
else
_edje_emit(ed, "hold,off", rp->part->name);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_focus_in_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
+static Eina_Bool
+_edje_focus_in_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc
EINA_UNUSED, void *event_info EINA_UNUSED)
{
Edje *ed;
Edje_Real_Part *rp;
@@ -26,13 +28,16 @@ _edje_focus_in_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, void
ed = data;
rp = evas_object_data_get(obj, "real_part");
if ((!rp) || (!ed))
- return;
+ return EO_CALLBACK_CONTINUE;
_edje_emit(ed, "focus,part,in", rp->part->name);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_focus_out_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
+
+static Eina_Bool
+_edje_focus_out_signal_cb(void *data, Eo *obj, const Eo_Event_Description
*desc EINA_UNUSED, void *event_info EINA_UNUSED)
{
Edje *ed;
Edje_Real_Part *rp;
@@ -40,13 +45,16 @@ _edje_focus_out_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, voi
ed = data;
rp = evas_object_data_get(obj, "real_part");
if ((!rp) || (!ed))
- return;
+ return EO_CALLBACK_CONTINUE;
_edje_emit(ed, "focus,part,out", rp->part->name);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_mouse_in_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info)
+
+static Eina_Bool
+_edje_mouse_in_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc
EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_In *ev;
Edje *ed;
@@ -57,12 +65,15 @@ _edje_mouse_in_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, void
rp = evas_object_data_get(obj, "real_part");
if ((!rp) ||
((ev->event_flags) &&
- (rp->part->ignore_flags & ev->event_flags))) return;
+ (rp->part->ignore_flags & ev->event_flags))) return
EO_CALLBACK_CONTINUE;
_edje_emit(ed, "mouse,in", rp->part->name);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_mouse_out_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info)
+
+static Eina_Bool
+_edje_mouse_out_signal_cb(void *data, Eo *obj, const Eo_Event_Description
*desc EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Out *ev;
Edje *ed;
@@ -73,12 +84,15 @@ _edje_mouse_out_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, voi
rp = evas_object_data_get(obj, "real_part");
if ((!rp) ||
((ev->event_flags) &&
- (rp->part->ignore_flags & ev->event_flags))) return;
+ (rp->part->ignore_flags & ev->event_flags))) return
EO_CALLBACK_CONTINUE;
_edje_emit(ed, "mouse,out", rp->part->name);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_mouse_down_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info)
+
+static Eina_Bool
+_edje_mouse_down_signal_cb(void *data, Eo *obj, const Eo_Event_Description
*desc EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Down *ev;
Edje *ed;
@@ -89,7 +103,7 @@ _edje_mouse_down_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, vo
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
- if (!rp) return;
+ if (!rp) return EO_CALLBACK_CONTINUE;
ignored = rp->part->ignore_flags & ev->event_flags;
@@ -140,10 +154,13 @@ _edje_mouse_down_signal_cb(void *data, Evas *e
EINA_UNUSED, Evas_Object *obj, vo
// _edje_recalc_do(ed);
_edje_thaw(ed);
_edje_unref(ed);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_mouse_up_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info)
+
+static Eina_Bool
+_edje_mouse_up_signal_cb(void *data, Eo *obj, const Eo_Event_Description *desc
EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Up *ev;
Edje *ed;
@@ -154,7 +171,7 @@ _edje_mouse_up_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, void
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
- if (!rp) return;
+ if (!rp) return EO_CALLBACK_CONTINUE;
ignored = rp->part->ignore_flags & ev->event_flags;
@@ -207,10 +224,13 @@ _edje_mouse_up_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, void
// _edje_recalc_do(ed);
_edje_thaw(ed);
_edje_unref(ed);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_mouse_move_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info)
+
+static Eina_Bool
+_edje_mouse_move_signal_cb(void *data, Eo *obj, const Eo_Event_Description
*desc EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Move *ev;
Edje *ed;
@@ -220,7 +240,7 @@ _edje_mouse_move_signal_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, vo
ev = event_info;
ed = data;
rp = evas_object_data_get(obj, "real_part");
- if (!rp) return;
+ if (!rp) return EO_CALLBACK_CONTINUE;
if (rp->part->dragable.event_id >= 0)
{
rp = ed->table_parts[rp->part->dragable.event_id %
ed->table_parts_size];
@@ -298,10 +318,13 @@ _edje_mouse_move_signal_cb(void *data, Evas *e
EINA_UNUSED, Evas_Object *obj, vo
}
_edje_unref(ed);
_edje_thaw(ed);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_edje_mouse_wheel_signal_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info)
+
+static Eina_Bool
+_edje_mouse_wheel_signal_cb(void *data, Eo *obj, const Eo_Event_Description
*desc EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Wheel *ev;
Edje *ed;
@@ -313,12 +336,15 @@ _edje_mouse_wheel_signal_cb(void *data, Evas *e
EINA_UNUSED, Evas_Object *obj, v
rp = evas_object_data_get(obj, "real_part");
if ((!rp) ||
((ev->event_flags) &&
- (!(rp->part->ignore_flags & ev->event_flags)))) return;
+ (!(rp->part->ignore_flags & ev->event_flags)))) return
EO_CALLBACK_CONTINUE;
snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i", ev->direction, (ev->z < 0)
? (-1) : (1));
_edje_emit(ed, buf, rp->part->name);
+
+ return EO_CALLBACK_CONTINUE;
}
+
Eina_Bool
_edje_timer_cb(void *data EINA_UNUSED)
{
@@ -406,97 +432,47 @@ _edje_pending_timer_cb(void *data)
return ECORE_CALLBACK_CANCEL;
}
+static const Eo_Callback_Array_Item edje_callbacks[] = {
+ { EVAS_OBJECT_EVENT_HOLD, _edje_hold_signal_cb },
+ { EVAS_OBJECT_EVENT_MOUSE_IN, _edje_mouse_in_signal_cb },
+ { EVAS_OBJECT_EVENT_MOUSE_OUT, _edje_mouse_out_signal_cb },
+ { EVAS_OBJECT_EVENT_MOUSE_DOWN, _edje_mouse_down_signal_cb },
+ { EVAS_OBJECT_EVENT_MOUSE_UP, _edje_mouse_up_signal_cb },
+ { EVAS_OBJECT_EVENT_MOUSE_MOVE, _edje_mouse_move_signal_cb },
+ { EVAS_OBJECT_EVENT_MOUSE_WHEEL, _edje_mouse_wheel_signal_cb },
+ { NULL, NULL }
+};
+
+static const Eo_Callback_Array_Item edje_focus_callbacks[] = {
+ { EVAS_OBJECT_EVENT_FOCUS_IN, _edje_focus_in_signal_cb },
+ { EVAS_OBJECT_EVENT_FOCUS_OUT, _edje_focus_out_signal_cb },
+ { NULL, NULL }
+};
+
void
_edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
{
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_HOLD,
- _edje_hold_signal_cb,
- ed);
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_MOUSE_IN,
- _edje_mouse_in_signal_cb,
- ed);
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_MOUSE_OUT,
- _edje_mouse_out_signal_cb,
- ed);
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_MOUSE_DOWN,
- _edje_mouse_down_signal_cb,
- ed);
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_MOUSE_UP,
- _edje_mouse_up_signal_cb,
- ed);
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_MOUSE_MOVE,
- _edje_mouse_move_signal_cb,
- ed);
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_MOUSE_WHEEL,
- _edje_mouse_wheel_signal_cb,
- ed);
+ eo_do(obj, eo_event_callback_array_add(edje_callbacks, ed));
evas_object_data_set(obj, "real_part", rp);
}
void
_edje_callbacks_del(Evas_Object *obj, Edje *ed)
{
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_HOLD,
- _edje_hold_signal_cb,
- ed);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_IN,
- _edje_mouse_in_signal_cb,
- ed);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_OUT,
- _edje_mouse_out_signal_cb,
- ed);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_DOWN,
- _edje_mouse_down_signal_cb,
- ed);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_UP,
- _edje_mouse_up_signal_cb,
- ed);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_MOVE,
- _edje_mouse_move_signal_cb,
- ed);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_WHEEL,
- _edje_mouse_wheel_signal_cb,
- ed);
+ eo_do(obj, eo_event_callback_array_del(edje_callbacks, ed));
evas_object_data_del(obj, "real_part");
}
void
_edje_callbacks_focus_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
{
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_FOCUS_IN,
- _edje_focus_in_signal_cb,
- ed);
- evas_object_event_callback_add(obj,
- EVAS_CALLBACK_FOCUS_OUT,
- _edje_focus_out_signal_cb,
- ed);
+ eo_do(obj, eo_event_callback_array_add(edje_focus_callbacks, ed));
evas_object_data_set(obj, "real_part", rp);
}
void
_edje_callbacks_focus_del(Evas_Object *obj, Edje *ed)
{
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_FOCUS_IN,
- _edje_focus_in_signal_cb,
- ed);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_FOCUS_OUT,
- _edje_focus_out_signal_cb,
- ed);
+ eo_do(obj, eo_event_callback_array_del(edje_focus_callbacks, ed));
+ evas_object_data_del(obj, "real_part");
}
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index d4e2193..0bfa937 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -1317,8 +1317,18 @@ _edje_file_del(Edje *ed)
if (rp->object)
{
- _edje_callbacks_del(rp->object, ed);
- _edje_callbacks_focus_del(rp->object, ed);
+ switch (rp->part->type)
+ {
+ case EDJE_PART_TYPE_GROUP:
+ case EDJE_PART_TYPE_SWALLOW:
+ case EDJE_PART_TYPE_EXTERNAL:
+ _edje_callbacks_focus_del(rp->object, ed);
+ break;
+ default:
+ if (rp->part->mouse_events)
+ _edje_callbacks_del(rp->object, ed);
+ break;
+ }
evas_object_del(rp->object);
}
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index f47e3eb..bfbd2bc 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -37,6 +37,7 @@
#include <Eina.h>
#include <Eet.h>
+#include <Eo.h>
#include <Evas.h>
#include <Ecore.h>
#include <Ecore_Evas.h>
--
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev