Enlightenment CVS committal
Author : raster
Project : e17
Module : libs/evas
Dir : e17/libs/evas/src/lib/canvas
Modified Files:
evas_callbacks.c evas_key_grab.c evas_object_main.c
evas_object_smart.c
Log Message:
ok ok.. callabcks walking lists.. delete flags... you get the idea. (i've
known about this for a long tiem and planned on fixing ti eventualyl... but
it's biting now.)
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_callbacks.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- evas_callbacks.c 10 Jan 2003 04:58:51 -0000 1.8
+++ evas_callbacks.c 20 Jan 2003 03:54:00 -0000 1.9
@@ -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 @@
}
}
+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 @@
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 @@
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;
}
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_key_grab.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- evas_key_grab.c 10 Jan 2003 04:58:51 -0000 1.2
+++ evas_key_grab.c 20 Jan 2003 03:54:00 -0000 1.3
@@ -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 @@
/* 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 @@
}
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 @@
(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 @@
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 @@
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);
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_main.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- evas_object_main.c 10 Jan 2003 05:38:47 -0000 1.7
+++ evas_object_main.c 20 Jan 2003 03:54:00 -0000 1.8
@@ -423,7 +423,6 @@
obj->delete_me = 1;
if (obj->smart.smart) evas_object_smart_del(obj);
evas_object_smart_cleanup(obj);
- obj->smart.smart = NULL;
}
void
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_smart.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- evas_object_smart.c 10 Jan 2003 05:38:47 -0000 1.3
+++ evas_object_smart.c 20 Jan 2003 03:54:00 -0000 1.4
@@ -257,9 +257,12 @@
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);
}
-------------------------------------------------------
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