add use of freeze+thaw for improvement in out-there scenarios.
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 27 May 2011 10:32:53 +0000 (10:32 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 27 May 2011 10:32:53 +0000 (10:32 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@59730 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
src/lib/edje_entry.c
src/lib/edje_load.c
src/lib/edje_smart.c

index d0e0c29..deb1382 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
           the cursor really didn't change, it's more like a new cursor.
           Also, when setting position, don't do anything if position is as it
           was.
+
+2011-05-27  Carsten Haitzler (The Rasterman)
+
+       * Improve performance on create/delete of edje objects by using
+        evas freeze and thaw calls. May help in certain pathological
+        situations.
+
index 316c5f3..39d3b64 100644 (file)
@@ -491,13 +491,14 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
    Sel *sel;
    Evas_Coord x, y, w, h;
    Evas_Object *smart, *clip;
+   Evas *tev = evas_object_evas_get(o);
 
    smart = evas_object_smart_parent_get(o);
    clip = evas_object_clip_get(o);
    if (en->sel_start)
      range = evas_textblock_cursor_range_geometry_get(en->sel_start, en->sel_end);
-   else
-     return;
+   else return;
+   evas_event_freeze(tev);
    if (eina_list_count(range) != eina_list_count(en->sel))
      {
         while (en->sel)
@@ -572,6 +573,8 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
              range = eina_list_remove_list(range, range);
           }
      }
+   evas_event_thaw(tev);
+   evas_event_thaw_eval(tev);
 }
 
 static void
index 68f4a29..847bd3e 100644 (file)
@@ -262,6 +262,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
    Eina_List *parts = NULL;
    Eina_List *old_swallows;
    int group_path_started = 0;
+   Evas *tev = evas_object_evas_get(obj);
 
    ed = _edje_fetch(obj);
    if (!ed) return 0;
@@ -271,6 +272,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
        (ed->group) && (!strcmp(group, ed->group)))
      return 1;
 
+   evas_event_freeze(tev);
    old_swallows = _edje_swallows_collect(ed);
 
    if (_edje_script_only(ed)) _edje_script_only_shutdown(ed);
@@ -354,6 +356,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                  if (!rp)
                    {
                       ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+                       evas_event_thaw(tev);
+                       evas_event_thaw_eval(tev);
                       return 0;
                    }
 
@@ -366,7 +370,9 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                         {
                            ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
                            free(rp);
-                           return 0;
+                            evas_event_thaw(tev);
+                            evas_event_thaw_eval(tev);
+                            return 0;
                         }
 
                       rp->drag->step.x = FROM_INT(ep->dragable.step_x);
@@ -685,6 +691,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                                      eina_list_free(group_path);
                                   }
                                 ed->load_error = EDJE_LOAD_ERROR_RECURSIVE_REFERENCE;
+                                 evas_event_thaw(tev);
+                                 evas_event_thaw_eval(tev);
                                 return 0;
                              }
                         }
@@ -707,6 +715,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                                   }
                              }
                            ed->load_error = edje_object_load_error_get(child_obj);
+                            evas_event_thaw(tev);
+                            evas_event_thaw_eval(tev);
                            return 0;
                         }
                       child_ed = _edje_fetch(child_obj);
@@ -826,12 +836,20 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                }
          }
         _edje_entry_init(ed);
+        evas_event_thaw(tev);
+        evas_event_thaw_eval(tev);
        return 1;
      }
    else
-     return 0;
+     {
+        evas_event_thaw(tev);
+        evas_event_thaw_eval(tev);
+        return 0;
+     }
    ed->load_error = EDJE_LOAD_ERROR_NONE;
    _edje_entry_init(ed);
+   evas_event_thaw(tev);
+   evas_event_thaw_eval(tev);
    return 1;
 }
 
@@ -875,6 +893,9 @@ _edje_swallows_collect(Edje *ed)
 void
 _edje_file_del(Edje *ed)
 {
+   Evas *tev = evas_object_evas_get(ed->obj);
+   
+   evas_event_freeze(tev);
    if (ed->freeze_calc)
      {
         _edje_freeze_calc_list = eina_list_remove(_edje_freeze_calc_list, ed);
@@ -891,7 +912,12 @@ _edje_file_del(Edje *ed)
 //        if (ed->collection->script) _edje_embryo_script_shutdown(ed);
 //     }
 
-   if (!((ed->file) && (ed->collection))) return;
+   if (!((ed->file) && (ed->collection)))
+     {
+        evas_event_thaw(tev);
+        evas_event_thaw_eval(tev);
+        return;
+     }
    if (ed->table_parts)
      {
        unsigned int i;
@@ -1019,6 +1045,8 @@ _edje_file_del(Edje *ed)
    ed->table_programs = NULL;
    ed->table_programs_size = 0;
    ed->focused_part = NULL;
+   evas_event_thaw(tev);
+   evas_event_thaw_eval(tev);
 }
 
 void
index e638278..e208dd2 100644 (file)
@@ -80,7 +80,9 @@ static void
 _edje_smart_add(Evas_Object *obj)
 {
    Edje *ed;
+   Evas *tev = evas_object_evas_get(obj);
 
+   evas_event_freeze(tev);
    ed = evas_object_smart_data_get(obj);
    if (!ed)
      {
@@ -88,7 +90,7 @@ _edje_smart_add(Evas_Object *obj)
         const Evas_Smart_Class *sc;
 
         ed = calloc(1, sizeof(Edje));
-        if (!ed) return;
+        if (!ed) goto end_smart_add;
 
         smart = evas_object_smart_smart_get(obj);
         sc = evas_smart_class_get(smart);
@@ -126,6 +128,9 @@ _edje_smart_add(Evas_Object *obj)
         printf("--- EDJE DUMP [%i]\n", eina_list_count(_edje_edjes));
      }
    */
+end_smart_add:
+   evas_event_thaw(tev);
+   evas_event_thaw_eval(tev);
 }
 
 static void