discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=385326b8e4d7c05794670773aad6ece236ea71d9

commit 385326b8e4d7c05794670773aad6ece236ea71d9
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  |  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);
 }
 

-- 


Reply via email to