Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/lib/canvas


Modified Files:
        evas_object_smart.c 


Log Message:


and lets make that safe for smart obbies

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_smart.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- evas_object_smart.c 20 Jan 2003 03:54:00 -0000      1.4
+++ evas_object_smart.c 20 Jan 2003 04:36:17 -0000      1.5
@@ -14,11 +14,13 @@
 struct _Evas_Smart_Callback
 {
    char *event;
+   int   delete_me : 1;
    void (*func) (void *data, Evas_Object *obj, void *event_info);
    void *func_data;
 };
 
 /* private methods for smart objects */
+static void evas_object_smart_callbacks_clear(Evas_Object *obj);
 static void evas_object_smart_init(Evas_Object *obj);
 static void *evas_object_smart_new(void);
 static void evas_object_smart_render(Evas_Object *obj, void *output, void *context, 
void *surface, int x, int y);
@@ -197,10 +199,10 @@
          {
             void *data;
             
-            obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb);
             data = cb->func_data;
-            if (cb->event) free(cb->event);
-            free(cb);
+            cb->delete_me = 1;
+            obj->smart.deletions_waiting = 1;
+            evas_object_smart_callbacks_clear(obj);
             return data;
          }
      }
@@ -221,17 +223,48 @@
    return;
    MAGIC_CHECK_END();
    if (!event) return;
+   if (obj->delete_me) return;
+   obj->smart.walking_list++;
    for (l = obj->smart.callbacks; l; l = l->next)
      {
        Evas_Smart_Callback *cb;
        
        cb = l->data;
-       if (!strcmp(cb->event, event))
-         cb->func(cb->func_data, obj, event_info);
+       if (!cb->delete_me)
+         {
+            if (!strcmp(cb->event, event))
+              cb->func(cb->func_data, obj, event_info);
+         }
+       if (obj->delete_me)
+         break;
      }
+   obj->smart.walking_list--;
+   evas_object_smart_callbacks_clear(obj);
 }
 
 /* internal calls */
+static void
+evas_object_smart_callbacks_clear(Evas_Object *obj)
+{
+   Evas_List *l;
+   
+   if (obj->smart.walking_list) return;
+   if (!obj->smart.deletions_waiting) return;
+   for (l = obj->smart.callbacks; l;)
+     {
+       Evas_Smart_Callback *cb;
+       
+       cb = l->data;
+       l = l->next;
+       if (cb->delete_me)
+         {
+            obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb);
+            if (cb->event) free(cb->event);
+            free(cb);
+         }
+     }
+}
+
 void
 evas_object_smart_del(Evas_Object *obj)
 {




-------------------------------------------------------
This SF.NET email is sponsored by: FREE  SSL Guide from Thawte
are you planning your Web Server Security? Click here to get a FREE
Thawte SSL guide and find the answers to all your  SSL security issues.
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0026en
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to