Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_evas


Modified Files:
        ecore_evas.c ecore_evas_fb.c ecore_evas_private.h 
        ecore_evas_x.c 


Log Message:


defer evas destruction until idle time :)

===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- ecore_evas.c        8 Jan 2005 18:40:31 -0000       1.18
+++ ecore_evas.c        28 Jul 2005 14:09:08 -0000      1.19
@@ -6,6 +6,8 @@
 
 static int _ecore_evas_init_count = 0;
 
+static int _ecore_evas_idle_enter_delete(void *data);
+
 /**
  * Query if a particular renginering engine target has support
  * @param  engine The engine to check support for
@@ -110,31 +112,10 @@
                         "ecore_evas_free");
        return;
      }
-   ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
-   while (ee->sub_ecore_evas)
-     {
-       ecore_evas_free(ee->sub_ecore_evas->data);
-     }
-   if (ee->data) evas_hash_free(ee->data);
-   if (ee->driver) free(ee->driver);
-   if (ee->name) free(ee->name);
-   if (ee->prop.title) free(ee->prop.title);
-   if (ee->prop.name) free(ee->prop.name);
-   if (ee->prop.clas) free(ee->prop.clas);
-   if (ee->prop.cursor.file) free(ee->prop.cursor.file);
-   if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
-   if (ee->evas) evas_free(ee->evas);
-   ee->data = NULL;
-   ee->driver = NULL;
-   ee->name = NULL;
-   ee->prop.title = NULL;
-   ee->prop.name = NULL;
-   ee->prop.clas = NULL;
-   ee->prop.cursor.file = NULL;
-   ee->prop.cursor.object = NULL;
-   ee->evas = NULL;
-   if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee);
-   free(ee);
+   if (ee->delete_idle_enterer) return;
+   ee->delete_idle_enterer = 
+     ecore_idle_enterer_add(_ecore_evas_idle_enter_delete, ee);
+   return;
 }
 
 void *
@@ -1603,3 +1584,48 @@
      }
 }
 #endif
+
+void
+_ecore_evas_free(Ecore_Evas *ee)
+{
+   ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
+   if (ee->delete_idle_enterer)
+     {
+       ecore_idle_enterer_del(ee->delete_idle_enterer);
+       ee->delete_idle_enterer = NULL;
+     }
+   while (ee->sub_ecore_evas)
+     {
+       ecore_evas_free(ee->sub_ecore_evas->data);
+     }
+   if (ee->data) evas_hash_free(ee->data);
+   if (ee->driver) free(ee->driver);
+   if (ee->name) free(ee->name);
+   if (ee->prop.title) free(ee->prop.title);
+   if (ee->prop.name) free(ee->prop.name);
+   if (ee->prop.clas) free(ee->prop.clas);
+   if (ee->prop.cursor.file) free(ee->prop.cursor.file);
+   if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
+   if (ee->evas) evas_free(ee->evas);
+   ee->data = NULL;
+   ee->driver = NULL;
+   ee->name = NULL;
+   ee->prop.title = NULL;
+   ee->prop.name = NULL;
+   ee->prop.clas = NULL;
+   ee->prop.cursor.file = NULL;
+   ee->prop.cursor.object = NULL;
+   ee->evas = NULL;
+   if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee);
+   free(ee);
+}
+
+static int
+_ecore_evas_idle_enter_delete(void *data)
+{
+   Ecore_Evas *ee;
+   
+   ee = (Ecore_Evas *)data;
+   _ecore_evas_free(ee);
+   return 0;
+}
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_fb.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- ecore_evas_fb.c     25 Jul 2005 09:55:47 -0000      1.12
+++ ecore_evas_fb.c     28 Jul 2005 14:09:09 -0000      1.13
@@ -64,7 +64,9 @@
        Ecore_Evas *ee;
        
        ee = (Ecore_Evas *)l;
-       return ee;
+       if (ee->delete_idle_enterer) continue;
+       else
+         return ee;
      }
    return NULL;
 }
@@ -404,7 +406,7 @@
      {
        int i;
    
-       while (ecore_evases) ecore_evas_free(ecore_evases);
+       while (ecore_evases) _ecore_evas_free(ecore_evases);
        for (i = 0; i < 5; i++)
          ecore_event_handler_del(ecore_evas_event_handlers[i]);
        ecore_idle_enterer_del(ecore_evas_idle_enterer);
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_private.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- ecore_evas_private.h        25 Jun 2005 07:23:38 -0000      1.12
+++ ecore_evas_private.h        28 Jul 2005 14:09:09 -0000      1.13
@@ -139,6 +139,8 @@
    char        visible : 1;
    char        should_be_visible : 1;
 
+   Ecore_Idle_Enterer *delete_idle_enterer;
+   
    Evas_Hash  *data;
 
    struct {
@@ -212,5 +214,6 @@
 void _ecore_evas_fps_debug_init(void);
 void _ecore_evas_fps_debug_shutdown(void);
 void _ecore_evas_fps_debug_rendertime_add(double t);
+void _ecore_evas_free(Ecore_Evas *ee);
 
 #endif
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_x.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -3 -r1.50 -r1.51
--- ecore_evas_x.c      25 Jul 2005 09:55:47 -0000      1.50
+++ ecore_evas_x.c      28 Jul 2005 14:09:09 -0000      1.51
@@ -27,12 +27,14 @@
    Evas_List *ll;
 #endif
    
+   if (ee->delete_idle_enterer) return;
 #ifdef BUILD_ECORE_EVAS_BUFFER
    for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
      {
        Ecore_Evas *ee2;
        
        ee2 = ll->data;
+       if (ee2->delete_idle_enterer) continue;
        if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
        _ecore_evas_buffer_render(ee2);
        if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
@@ -250,7 +252,11 @@
 static Ecore_Evas *
 _ecore_evas_x_match(Ecore_X_Window win)
 {
-   return evas_hash_find(ecore_evases_hash, _ecore_evas_x_winid_str_get(win));
+   Ecore_Evas *ee;
+   
+   ee = evas_hash_find(ecore_evases_hash, _ecore_evas_x_winid_str_get(win));
+   if ((ee) && (ee->delete_idle_enterer)) return NULL;
+   return ee;
 }
 
 static void
@@ -1500,7 +1506,7 @@
      {
        int i;
    
-       while (ecore_evases) ecore_evas_free(ecore_evases);
+       while (ecore_evases) _ecore_evas_free(ecore_evases);
        for (i = 0; i < 16; i++)
          ecore_event_handler_del(ecore_evas_event_handlers[i]);
        ecore_idle_enterer_del(ecore_evas_idle_enterer);




-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO September
19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to