and lets make that safe for smart obbies

SVN revision: 6599
This commit is contained in:
Carsten Haitzler 2003-01-20 04:36:17 +00:00
parent 1512080561
commit 7b1247042b
2 changed files with 40 additions and 5 deletions

View File

@ -14,11 +14,13 @@ struct _Evas_Object_Smart
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 @@ evas_object_smart_callback_del(Evas_Object *obj, const char *event, void (*func)
{
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 @@ evas_object_smart_callback_call(Evas_Object *obj, const char *event, void *event
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)
{

View File

@ -355,6 +355,8 @@ struct _Evas_Object
Evas_Object_Func *func;
struct {
int walking_list;
int deletions_waiting : 1;
Evas_Smart *smart;
void *data;
Evas_Object *parent;