diff --git a/legacy/evas/README b/legacy/evas/README index 2e82a8f2cc..45ba8b9d7a 100644 --- a/legacy/evas/README +++ b/legacy/evas/README @@ -325,8 +325,8 @@ Notes: gcc 3.0.x on solaris screws up the jpeg code so erroring out doesn't work. use gcc 3.2 on solaris. freetype 2.1.2 is BAD. RedHat 8.0 uses this as do some streams of debain. - either downgrade to 2.1.1. freetype 2.1.3 is ALSO BAD. It has glyph - metric rendering bugs and glyph geomery query bugs. do not use it. + either downgrade to 2.1.1. freetype 2.1.3 is ALSO BAD, as is 2.0.9. It has + glyph metric rendering bugs and glyph geomery query bugs. do not use it. try using 2.0.3. It is known to be stable and work perfectly with Evas. -------------------------------------------------------------------------- diff --git a/legacy/evas/evas.c.in b/legacy/evas/evas.c.in index ea09b0e593..ad84b31afe 100644 --- a/legacy/evas/evas.c.in +++ b/legacy/evas/evas.c.in @@ -468,6 +468,7 @@ make CFLAGS="-O9 -I/opt/Embedix/tools/arm-linux/include" @todo (1.0) Document API @todo (1.0) Add button grabbing @todo (1.0) Add generic object method call system +@todo (1.0) Add callbacks set for smart object parents to be set on all child smart objects too. @todo (1.0) Define image load errors (and maybe have an error to string func) @todo (1.0) Add text styles (outline etc.) @todo (1.0) Add font load query calls (so we know if a font load failed) diff --git a/legacy/evas/src/lib/canvas/evas_callbacks.c b/legacy/evas/src/lib/canvas/evas_callbacks.c index caf8bb7d44..55d12f3bdb 100644 --- a/legacy/evas/src/lib/canvas/evas_callbacks.c +++ b/legacy/evas/src/lib/canvas/evas_callbacks.c @@ -3,6 +3,8 @@ #include "Evas.h" static void evas_object_event_callback_list_free(Evas_Object_List **list); +static void evas_object_event_callback_list_post_free(Evas_Object_List **list); +static void evas_object_event_callback_clear(Evas_Object *obj); static void evas_object_event_callback_list_free(Evas_Object_List **list) @@ -18,6 +20,50 @@ evas_object_event_callback_list_free(Evas_Object_List **list) } } +static void +evas_object_event_callback_list_post_free(Evas_Object_List **list) +{ + Evas_Object_List *l; + + /* MEM OK */ + for (l = *list; l;) + { + Evas_Func_Node *fn; + + fn = (Evas_Func_Node *)l; + l = l->next; + if (fn->delete_me) + { + *list = evas_object_list_remove(*list, fn); + free(fn); + } + } +} + +static void +evas_object_event_callback_clear(Evas_Object *obj) +{ + Evas_Callback_Type t; + + if (!obj->callbacks.deletions_waiting) return; + obj->callbacks.deletions_waiting = 0; + evas_object_event_callback_list_post_free(&(obj->callbacks.in)); + evas_object_event_callback_list_post_free(&(obj->callbacks.out)); + evas_object_event_callback_list_post_free(&(obj->callbacks.down)); + evas_object_event_callback_list_post_free(&(obj->callbacks.up)); + evas_object_event_callback_list_post_free(&(obj->callbacks.move)); + evas_object_event_callback_list_post_free(&(obj->callbacks.free)); + evas_object_event_callback_list_post_free(&(obj->callbacks.key_down)); + evas_object_event_callback_list_post_free(&(obj->callbacks.key_up)); + evas_object_event_callback_list_post_free(&(obj->callbacks.obj_focus_in)); + evas_object_event_callback_list_post_free(&(obj->callbacks.obj_focus_out)); + evas_object_event_callback_list_post_free(&(obj->callbacks.obj_show)); + evas_object_event_callback_list_post_free(&(obj->callbacks.obj_hide)); + evas_object_event_callback_list_post_free(&(obj->callbacks.obj_move)); + evas_object_event_callback_list_post_free(&(obj->callbacks.obj_resize)); + evas_object_event_callback_list_post_free(&(obj->callbacks.obj_restack)); +} + void evas_object_event_callback_cleanup(Evas_Object *obj) { @@ -96,13 +142,19 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void return; break; } + obj->callbacks.walking_list++; for (l = *l_mod; l; l = l->next) { Evas_Func_Node *fn; fn = (Evas_Func_Node *)l; - fn->func(fn->data, obj->layer->evas, obj, event_info); + if (!fn->delete_me) + fn->func(fn->data, obj->layer->evas, obj, event_info); + if (obj->delete_me) break; } + obj->callbacks.walking_list--; + if (!obj->callbacks.walking_list) + evas_object_event_callback_clear(obj); } /** @@ -427,8 +479,10 @@ evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void ( void *data; data = fn->data; - *l_mod = evas_object_list_remove(*l_mod, fn); - free(fn); + fn->delete_me = 1; + obj->callbacks.deletions_waiting = 1; + if (!obj->callbacks.walking_list) + evas_object_event_callback_clear(obj); return data; } } diff --git a/legacy/evas/src/lib/canvas/evas_key_grab.c b/legacy/evas/src/lib/canvas/evas_key_grab.c index 37cd79a90f..78b7bb39cb 100644 --- a/legacy/evas/src/lib/canvas/evas_key_grab.c +++ b/legacy/evas/src/lib/canvas/evas_key_grab.c @@ -10,7 +10,7 @@ static Evas_Key_Grab *evas_key_grab_new (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive); static void evas_key_grab_free (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers); -static Evas_Key_Grab *evas_key_grab_find (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers); +static Evas_Key_Grab *evas_key_grab_find (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive); static Evas_Key_Grab * evas_key_grab_new(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive) @@ -77,7 +77,7 @@ evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod /* MEM OK */ Evas_Key_Grab *g; - g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers); + g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0); if (!g) return; g->object->grabs = evas_list_remove(g->object->grabs, g); if (g->keyname) free(g->keyname); @@ -85,11 +85,11 @@ evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod } static Evas_Key_Grab * -evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers) +evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive) { /* MEM OK */ Evas_List *l; - + for (l = obj->layer->evas->grabs; l; l = l->next) { Evas_Key_Grab *g; @@ -99,7 +99,7 @@ evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask mod (g->not_modifiers == not_modifiers) && (!strcmp(g->keyname, keyname))) { - if ((!obj) || (obj == g->object)) return g; + if ((exclusive) || (obj == g->object)) return g; } } return NULL; @@ -135,7 +135,7 @@ evas_object_key_grab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask m MAGIC_CHECK_END(); if (exclusive) { - g = evas_key_grab_find(NULL, keyname, modifiers, not_modifiers); + g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, exclusive); if (g) return 0; } g = evas_key_grab_new(obj, keyname, modifiers, not_modifiers, exclusive); @@ -152,7 +152,7 @@ evas_object_key_ungrab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); return; MAGIC_CHECK_END(); - g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers); + g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0); if (!g) return; evas_key_grab_free(g->object, keyname, modifiers, not_modifiers); } diff --git a/legacy/evas/src/lib/canvas/evas_object_main.c b/legacy/evas/src/lib/canvas/evas_object_main.c index ddf866b7f8..d351176e21 100644 --- a/legacy/evas/src/lib/canvas/evas_object_main.c +++ b/legacy/evas/src/lib/canvas/evas_object_main.c @@ -423,7 +423,6 @@ evas_object_del(Evas_Object *obj) obj->delete_me = 1; if (obj->smart.smart) evas_object_smart_del(obj); evas_object_smart_cleanup(obj); - obj->smart.smart = NULL; } void diff --git a/legacy/evas/src/lib/canvas/evas_object_smart.c b/legacy/evas/src/lib/canvas/evas_object_smart.c index 371b3d207b..230a5dcd6c 100644 --- a/legacy/evas/src/lib/canvas/evas_object_smart.c +++ b/legacy/evas/src/lib/canvas/evas_object_smart.c @@ -257,9 +257,12 @@ evas_object_smart_cleanup(Evas_Object *obj) cb = obj->smart.callbacks->data; obj->smart.callbacks = evas_list_remove(obj->smart.callbacks, cb); - if (cb->event) free (cb->event); + if (cb->event) free(cb->event); free(cb); } + obj->smart.parent; + obj->smart.data = NULL; + obj->smart.smart = NULL; if (s) evas_object_smart_unuse(s); } diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index c786877509..34779d46a9 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -328,6 +328,8 @@ struct _Evas_Object Evas_List *grabs; struct { + int deletions_waiting : 1; + int walking_list : 1; Evas_Object_List *in; Evas_Object_List *out; Evas_Object_List *down; @@ -365,8 +367,8 @@ struct _Evas_Object struct _Evas_Func_Node { - Evas_Object_List _list_data; - + Evas_Object_List _list_data; + int delete_me : 1; void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info); void *data; };