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