discomfitor pushed a commit to branch efl-1.10. http://git.enlightenment.org/core/efl.git/commit/?id=dd7e5492e30290eba1a04d44ba008ec06652e93a
commit dd7e5492e30290eba1a04d44ba008ec06652e93a Author: zmike <michael.blumenkra...@gmail.com> 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 | 6 ++++-- src/lib/edje/edje_smart.c | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index 1bf7816..85ebf67 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -3915,7 +3915,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 51a21a9..a39a91a 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -899,7 +899,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; @@ -1965,4 +1967,4 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *sig, const char *sou if (ed_parent) _edje_util_message_send(ed_parent, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg); -} \ No newline at end of file +} diff --git a/src/lib/edje/edje_smart.c b/src/lib/edje/edje_smart.c index a4de77f..626fdd1 100644 --- a/src/lib/edje/edje_smart.c +++ b/src/lib/edje/edje_smart.c @@ -272,6 +272,9 @@ _edje_evas_smart_resize(Eo *obj EINA_UNUSED, Edje *ed, Evas_Coord w, Evas_Coord EOLIAN static void _edje_evas_smart_show(Eo *obj, Edje *ed) { + Eina_List *l; + Edje *edg; + eo_do_super(obj, MY_CLASS, evas_obj_smart_show()); if (evas_object_visible_get(obj)) return; if (_edje_script_only(ed)) @@ -284,12 +287,27 @@ _edje_evas_smart_show(Eo *obj, Edje *ed) _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); } EOLIAN static void _edje_evas_smart_hide(Eo *obj, Edje *ed) { + Eina_List *l; + Edje *edg; + eo_do_super(obj, MY_CLASS, evas_obj_smart_hide()); if (!evas_object_visible_get(obj)) return; if (_edje_script_only(ed)) @@ -302,6 +320,8 @@ _edje_evas_smart_hide(Eo *obj, Edje *ed) _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); } --