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);
 }
 

-- 


Reply via email to