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

Reply via email to