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

-- 


Reply via email to