discomfitor pushed a commit to branch efl-1.9. http://git.enlightenment.org/core/efl.git/commit/?id=c625279a85858f64a1c1e4deb3bfec9e63effc7e
commit c625279a85858f64a1c1e4deb3bfec9e63effc7e Author: zmike <[email protected]> Date: Thu May 22 13:39:14 2014 -0400 recursively hide edje group objects on edje hide this massively improves edje performance when using groups, which previously would continue calculating their parts even when their parent object was hidden CPU usage in my test case went from 20-30% to 1%. @fix --- src/lib/edje/edje_calc.c | 2 +- src/lib/edje/edje_load.c | 4 +++- src/lib/edje/edje_smart.c | 20 ++++++++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index 00c25db..2419e61 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -3907,7 +3907,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta eo_do(ep->typedata.swallow->swallowed_object, evas_obj_position_set(ed->x + pf->final.x, ed->y + pf->final.y), evas_obj_size_set(pf->final.w, pf->final.h), - evas_obj_visibility_set(EINA_TRUE)); + evas_obj_visibility_set(evas_object_visible_get(ed->obj))); } else evas_object_hide(ep->typedata.swallow->swallowed_object); mo = ep->typedata.swallow->swallowed_object; diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index e43c8f1..eb2f40b 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -940,7 +940,9 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch obj); if (rp->part->type == EDJE_PART_TYPE_GROUP) { - ed->groups = eina_list_append(ed->groups, _edje_fetch(child_obj)); + Edje *edg = _edje_fetch(child_obj); + ed->groups = eina_list_append(ed->groups, edg); + evas_object_data_set(child_obj, "\377 edje.part_obj", rp); _edje_real_part_swallow(ed, rp, child_obj, EINA_TRUE); _edje_subobj_register(ed, child_obj); source = NULL; diff --git a/src/lib/edje/edje_smart.c b/src/lib/edje/edje_smart.c index b14ba16..aaf19ec 100644 --- a/src/lib/edje/edje_smart.c +++ b/src/lib/edje/edje_smart.c @@ -286,7 +286,8 @@ _edje_smart_resize(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list) static void _edje_smart_show(Eo *obj, void *_pd, va_list *list EINA_UNUSED) { - Edje *ed = _pd; + Edje *ed = _pd, *edg; + Eina_List *l; eo_do_super(obj, MY_CLASS, evas_obj_smart_show()); if (evas_object_visible_get(obj)) return; @@ -300,13 +301,26 @@ _edje_smart_show(Eo *obj, void *_pd, va_list *list EINA_UNUSED) _edje_lua_script_only_show(ed); return; } + if (eina_list_count(ed->groups) > 1) + { + EINA_LIST_FOREACH(ed->groups, l, edg) + { + Edje_Real_Part *rp; + + if (edg == ed) continue; + rp = evas_object_data_get(edg->obj, "\377 edje.part_obj"); + if (rp->chosen_description->visible) + evas_object_show(edg->obj); + } + } _edje_emit(ed, "show", NULL); } static void _edje_smart_hide(Eo *obj, void *_pd, va_list *list EINA_UNUSED) { - Edje *ed = _pd; + Edje *ed = _pd, *edg; + Eina_List *l; eo_do_super(obj, MY_CLASS, evas_obj_smart_hide()); if (!evas_object_visible_get(obj)) return; @@ -320,6 +334,8 @@ _edje_smart_hide(Eo *obj, void *_pd, va_list *list EINA_UNUSED) _edje_lua_script_only_hide(ed); return; } + EINA_LIST_FOREACH(ed->groups, l, edg) + if (edg != ed) evas_object_hide(edg->obj); _edje_emit(ed, "hide", NULL); } --
