Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/lib/canvas


Modified Files:
        evas_callbacks.c evas_events.c evas_main.c 


Log Message:


extensive delete me handling for evas free's and list walks

===================================================================
RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_callbacks.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -3 -r1.30 -r1.31
--- evas_callbacks.c    5 Apr 2007 15:40:51 -0000       1.30
+++ evas_callbacks.c    30 Apr 2007 04:22:42 -0000      1.31
@@ -30,44 +30,6 @@
    if (!obj->callbacks) return;
    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->wheel));
-   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));
-   if ((!obj->callbacks->in) &&
-       (!obj->callbacks->out) &&
-       (!obj->callbacks->down) &&
-       (!obj->callbacks->up) &&
-       (!obj->callbacks->move) &&
-       (!obj->callbacks->wheel) &&
-       (!obj->callbacks->free) &&
-       (!obj->callbacks->key_down) &&
-       (!obj->callbacks->key_up) &&
-       (!obj->callbacks->obj_focus_in) &&
-       (!obj->callbacks->obj_focus_out) &&
-       (!obj->callbacks->obj_show) &&
-       (!obj->callbacks->obj_hide) &&
-       (!obj->callbacks->obj_move) &&
-       (!obj->callbacks->obj_resize) &&
-       (!obj->callbacks->obj_restack))
-     {
-       free(obj->callbacks);
-       obj->callbacks = NULL;
-     }
- */
    evas_object_event_callback_list_post_free(&obj->callbacks->callbacks);
    if (!obj->callbacks->callbacks)
      {
@@ -96,26 +58,6 @@
 {
    /* MEM OK */
    if (!obj->callbacks) return;
-   /*
-   evas_object_event_callback_list_free(&(obj->callbacks->in));
-   evas_object_event_callback_list_free(&(obj->callbacks->out));
-   evas_object_event_callback_list_free(&(obj->callbacks->down));
-   evas_object_event_callback_list_free(&(obj->callbacks->up));
-   evas_object_event_callback_list_free(&(obj->callbacks->move));
-   evas_object_event_callback_list_free(&(obj->callbacks->wheel));
-   evas_object_event_callback_list_free(&(obj->callbacks->free));
-   evas_object_event_callback_list_free(&(obj->callbacks->key_down));
-   evas_object_event_callback_list_free(&(obj->callbacks->key_up));
-   evas_object_event_callback_list_free(&(obj->callbacks->obj_focus_in));
-   evas_object_event_callback_list_free(&(obj->callbacks->obj_focus_out));
-   evas_object_event_callback_list_free(&(obj->callbacks->obj_show));
-   evas_object_event_callback_list_free(&(obj->callbacks->obj_hide));
-   evas_object_event_callback_list_free(&(obj->callbacks->obj_move));
-   evas_object_event_callback_list_free(&(obj->callbacks->obj_resize));
-   evas_object_event_callback_list_free(&(obj->callbacks->obj_restack));
-   free(obj->callbacks);
-   obj->callbacks = NULL;
-    */
    evas_object_event_callback_list_post_free(&obj->callbacks->callbacks);
    free(obj->callbacks);
    obj->callbacks = NULL;
@@ -132,85 +74,9 @@
    if (obj->delete_me) return;
    e = evas_object_evas_get(obj);
      
+   _evas_walk(e);
    if (obj->callbacks)
      {
-       /*
-        switch (type)
-          {
-             case EVAS_CALLBACK_MOUSE_IN:
-              l_mod = &(obj->callbacks->in);
-              break;
-             case EVAS_CALLBACK_MOUSE_OUT:
-              l_mod = &(obj->callbacks->out);
-              break;
-             case EVAS_CALLBACK_MOUSE_DOWN:
-               {
-                  Evas_Event_Mouse_Down *ev = event_info;
-                  
-                  flags = ev->flags;
-                 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | 
EVAS_BUTTON_TRIPLE_CLICK))
-                   {
-                      if (obj->last_mouse_down_counter < 
(e->last_mouse_down_counter - 1))
-                        ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | 
EVAS_BUTTON_TRIPLE_CLICK);
-                   }
-                 l_mod = &(obj->callbacks->down);
-                  obj->last_mouse_down_counter = e->last_mouse_down_counter;
-                 break;
-               }
-             case EVAS_CALLBACK_MOUSE_UP:
-               {
-                  Evas_Event_Mouse_Up *ev = event_info;
-                  
-                  flags = ev->flags;
-                 if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | 
EVAS_BUTTON_TRIPLE_CLICK))
-                   {
-                      if (obj->last_mouse_up_counter < 
(e->last_mouse_up_counter - 1))
-                        ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | 
EVAS_BUTTON_TRIPLE_CLICK);
-                   }
-                 l_mod = &(obj->callbacks->up);
-                  obj->last_mouse_up_counter = e->last_mouse_up_counter;
-                 break;
-               }
-             case EVAS_CALLBACK_MOUSE_MOVE:
-              l_mod = &(obj->callbacks->move);
-              break;
-            case EVAS_CALLBACK_MOUSE_WHEEL:
-              l_mod = &(obj->callbacks->wheel);
-              break;
-             case EVAS_CALLBACK_FREE:
-              l_mod = &(obj->callbacks->free);
-              break;
-             case EVAS_CALLBACK_KEY_DOWN:
-               l_mod = &(obj->callbacks->key_down);
-               break;
-             case EVAS_CALLBACK_KEY_UP:
-               l_mod = &(obj->callbacks->key_up);
-               break;
-             case EVAS_CALLBACK_FOCUS_IN:
-               l_mod = &(obj->callbacks->obj_focus_in);
-             case EVAS_CALLBACK_FOCUS_OUT:
-               l_mod = &(obj->callbacks->obj_focus_out);
-               break;
-             case EVAS_CALLBACK_SHOW:
-               l_mod = &(obj->callbacks->obj_show);
-               break;
-             case EVAS_CALLBACK_HIDE:
-               l_mod = &(obj->callbacks->obj_hide);
-               break;
-             case EVAS_CALLBACK_MOVE:
-               l_mod = &(obj->callbacks->obj_move);
-               break;
-             case EVAS_CALLBACK_RESIZE:
-               l_mod = &(obj->callbacks->obj_resize);
-               break;
-             case EVAS_CALLBACK_RESTACK:
-               l_mod = &(obj->callbacks->obj_restack);
-               break;
-             default:
-               return;
-               break;
-          }
-       */      
        l_mod = &obj->callbacks->callbacks;
         switch (type)
           {
@@ -272,10 +138,13 @@
           }
      }
    
-   if ((obj->no_propagate) && (l_mod) && (*l_mod)) return;
-   if ((obj->smart.parent) && (type != EVAS_CALLBACK_FREE) &&
-       (type <= EVAS_CALLBACK_KEY_UP))
-     evas_object_event_callback_call(obj->smart.parent, type, event_info);
+   if (!((obj->no_propagate) && (l_mod) && (*l_mod)))
+     {
+       if ((obj->smart.parent) && (type != EVAS_CALLBACK_FREE) &&
+           (type <= EVAS_CALLBACK_KEY_UP))
+         evas_object_event_callback_call(obj->smart.parent, type, event_info);
+     }
+   _evas_unwalk(e);
 }
 
 /**
@@ -471,64 +340,6 @@
        free(fn);
        return;
      }
-   /*
-   switch (type)
-     {
-      case EVAS_CALLBACK_MOUSE_IN:
-       l_mod = &(obj->callbacks->in);
-       break;
-      case EVAS_CALLBACK_MOUSE_OUT:
-       l_mod = &(obj->callbacks->out);
-       break;
-      case EVAS_CALLBACK_MOUSE_DOWN:
-       l_mod = &(obj->callbacks->down);
-       break;
-      case EVAS_CALLBACK_MOUSE_UP:
-       l_mod = &(obj->callbacks->up);
-       break;
-      case EVAS_CALLBACK_MOUSE_MOVE:
-       l_mod = &(obj->callbacks->move);
-       break;
-         case EVAS_CALLBACK_MOUSE_WHEEL:
-       l_mod = &(obj->callbacks->wheel);
-       break;
-      case EVAS_CALLBACK_FREE:
-       l_mod = &(obj->callbacks->free);
-       break;
-      case EVAS_CALLBACK_KEY_DOWN:
-       l_mod = &(obj->callbacks->key_down);
-       break;
-      case EVAS_CALLBACK_KEY_UP:
-       l_mod = &(obj->callbacks->key_up);
-       break;
-      case EVAS_CALLBACK_FOCUS_IN:
-       l_mod = &(obj->callbacks->obj_focus_in);
-       break;
-      case EVAS_CALLBACK_FOCUS_OUT:
-       l_mod = &(obj->callbacks->obj_focus_out);
-       break;
-      case EVAS_CALLBACK_SHOW:
-       l_mod = &(obj->callbacks->obj_show);
-       break;
-      case EVAS_CALLBACK_HIDE:
-       l_mod = &(obj->callbacks->obj_hide);
-       break;
-      case EVAS_CALLBACK_MOVE:
-       l_mod = &(obj->callbacks->obj_move);
-       break;
-      case EVAS_CALLBACK_RESIZE:
-       l_mod = &(obj->callbacks->obj_resize);
-       break;
-      case EVAS_CALLBACK_RESTACK:
-       l_mod = &(obj->callbacks->obj_restack);
-       break;
-      default:
-       free(fn);
-       return;
-       break;
-     }
-   *l_mod = evas_object_list_append(*l_mod, fn);
-    */
    obj->callbacks->callbacks = 
      evas_object_list_append(obj->callbacks->callbacks, fn);
 }
@@ -571,79 +382,6 @@
 
    if (!obj->callbacks) return NULL;
 
-   /*
-   switch (type)
-     {
-      case EVAS_CALLBACK_MOUSE_IN:
-       l_mod = &(obj->callbacks->in);
-       break;
-      case EVAS_CALLBACK_MOUSE_OUT:
-       l_mod = &(obj->callbacks->out);
-       break;
-      case EVAS_CALLBACK_MOUSE_DOWN:
-       l_mod = &(obj->callbacks->down);
-       break;
-      case EVAS_CALLBACK_MOUSE_UP:
-       l_mod = &(obj->callbacks->up);
-       break;
-      case EVAS_CALLBACK_MOUSE_MOVE:
-       l_mod = &(obj->callbacks->move);
-       break;
-         case EVAS_CALLBACK_MOUSE_WHEEL:
-       l_mod = &(obj->callbacks->wheel);
-       break;
-      case EVAS_CALLBACK_FREE:
-       l_mod = &(obj->callbacks->free);
-       break;
-      case EVAS_CALLBACK_KEY_DOWN:
-       l_mod = &(obj->callbacks->key_down);
-       break;
-      case EVAS_CALLBACK_KEY_UP:
-       l_mod = &(obj->callbacks->key_up);
-       break;
-      case EVAS_CALLBACK_FOCUS_IN:
-       l_mod = &(obj->callbacks->obj_focus_in);
-       break;
-      case EVAS_CALLBACK_FOCUS_OUT:
-       l_mod = &(obj->callbacks->obj_focus_out);
-       break;
-      case EVAS_CALLBACK_SHOW:
-       l_mod = &(obj->callbacks->obj_show);
-       break;
-      case EVAS_CALLBACK_HIDE:
-       l_mod = &(obj->callbacks->obj_hide);
-       break;
-      case EVAS_CALLBACK_MOVE:
-       l_mod = &(obj->callbacks->obj_move);
-       break;
-      case EVAS_CALLBACK_RESIZE:
-       l_mod = &(obj->callbacks->obj_resize);
-       break;
-      case EVAS_CALLBACK_RESTACK:
-       l_mod = &(obj->callbacks->obj_restack);
-       break;
-      default:
-       return NULL;
-       break;
-     }
-   for (l = *l_mod; l; l = l->next)
-     {
-       Evas_Func_Node *fn;
-
-       fn = (Evas_Func_Node *)l;
-       if ((fn->func == func) && (!fn->delete_me))
-         {
-            void *data;
-
-            data = fn->data;
-            fn->delete_me = 1;
-            obj->callbacks->deletions_waiting = 1;
-            if (!obj->callbacks->walking_list)
-              evas_object_event_callback_clear(obj);
-            return data;
-         }
-     }
-    */
    for (l = obj->callbacks->callbacks; l; l = l->next)
      {
        Evas_Func_Node *fn;
===================================================================
RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_events.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -3 -r1.50 -r1.51
--- evas_events.c       8 Dec 2006 07:51:48 -0000       1.50
+++ evas_events.c       30 Apr 2007 04:22:42 -0000      1.51
@@ -235,6 +235,7 @@
    if (e->events_frozen > 0) return;
    e->last_timestamp = timestamp;
 
+   _evas_walk(e);
    copy = evas_event_list_copy(e->pointer.object.in);
    for (l = copy; l; l = l->next)
      {
@@ -259,9 +260,11 @@
        ev.timestamp = timestamp;
        if (e->events_frozen <= 0)
          evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
+       if (e->delete_me) break;
      }
    if (copy) copy = evas_list_free(copy);
    e->last_mouse_down_counter++;
+   _evas_unwalk(e);
 }
 
 /**
@@ -286,6 +289,7 @@
    if (e->events_frozen > 0) return;
    e->last_timestamp = timestamp;
    
+   _evas_walk(e);
    copy = evas_event_list_copy(e->pointer.object.in);
    for (l = copy; l; l = l->next)
      {
@@ -311,6 +315,7 @@
        ev.timestamp = timestamp;
        if (e->events_frozen <= 0)
          evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev);
+       if (e->delete_me) break;
      }
    if (copy) copy = evas_list_free(copy);
    e->last_mouse_up_counter++;
@@ -348,6 +353,7 @@
                  if (e->events_frozen <= 0)
                    evas_object_event_callback_call(obj, 
EVAS_CALLBACK_MOUSE_OUT, &ev);
               }
+            if (e->delete_me) break;
          }
        if (copy) copy = evas_list_free(copy);
        if (e->pointer.inside)
@@ -377,6 +383,7 @@
                       if (e->events_frozen <= 0)
                         evas_object_event_callback_call(obj, 
EVAS_CALLBACK_MOUSE_IN, &ev);
                    }
+                 if (e->delete_me) break;
               }
          }
        else
@@ -394,6 +401,7 @@
      {
        e->pointer.mouse_grabbed = 0;
      }
+   _evas_unwalk(e);
 }
 
 /**
@@ -414,6 +422,7 @@
    if (e->events_frozen > 0) return;
    e->last_timestamp = timestamp;
 
+   _evas_walk(e);
    copy = evas_event_list_copy(e->pointer.object.in);
    
    for (l = copy; l; l = l->next)
@@ -435,10 +444,11 @@
        ev.timestamp = timestamp;
        if (e->events_frozen <= 0)
          evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev);
+       if (e->delete_me) break;
      }
    if (copy) copy = evas_list_free(copy);
 
-   return;
+   _evas_unwalk(e);
 }
 
 /**
@@ -472,6 +482,7 @@
 ////   e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
 ////   e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
    if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
+   _evas_walk(e);
    /* if our mouse button is grabbed to any objects */
    if (e->pointer.mouse_grabbed > 0)
      {
@@ -517,6 +528,7 @@
               }
             else
               outs = evas_list_append(outs, obj);
+            if (e->delete_me) break;
          }
        if (copy) copy = evas_list_free(copy);
        while (outs)
@@ -525,7 +537,7 @@
 
             obj = outs->data;
             outs = evas_list_remove(outs, obj);
-            if (!obj->mouse_grabbed)
+            if ((!obj->mouse_grabbed) && (!e->delete_me))
               {
                  e->pointer.object.in = evas_list_remove(e->pointer.object.in, 
obj);
                    {
@@ -619,6 +631,7 @@
                  if (e->events_frozen <= 0)
                    evas_object_event_callback_call(obj, 
EVAS_CALLBACK_MOUSE_OUT, &ev);
               }
+            if (e->delete_me) break;
          }
        if (copy) copy = evas_list_free(copy);
        /* go thru our current list of ins */
@@ -647,12 +660,14 @@
                  if (e->events_frozen <= 0)
                    evas_object_event_callback_call(obj, 
EVAS_CALLBACK_MOUSE_IN, &ev);
               }
+            if (e->delete_me) break;
          }
        /* free our old list of ins */
        evas_list_free(e->pointer.object.in);
        /* and set up the new one */
        e->pointer.object.in = ins;
      }
+   _evas_unwalk(e);
 }
 
 /**
@@ -677,6 +692,7 @@
 
    if (e->pointer.mouse_grabbed != 0) return;
 
+   _evas_walk(e);
    /* get new list of ins */
    ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
    for (l = ins; l; l = l->next)
@@ -704,12 +720,14 @@
             if (e->events_frozen <= 0)
               evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, 
&ev);
          }
+       if (e->delete_me) break;
      }
    /* free our old list of ins */
    e->pointer.object.in = evas_list_free(e->pointer.object.in);
    /* and set up the new one */
    e->pointer.object.in = ins;
    evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
+   _evas_unwalk(e);
 }
 
 /**
@@ -729,6 +747,7 @@
    if (e->events_frozen > 0) return;
    e->last_timestamp = timestamp;
 
+   _evas_walk(e);
    /* if our mouse button is grabbed to any objects */
    if (e->pointer.mouse_grabbed == 0)
      {
@@ -759,11 +778,13 @@
                  if (e->events_frozen <= 0)
                    evas_object_event_callback_call(obj, 
EVAS_CALLBACK_MOUSE_OUT, &ev);
               }
+            if (e->delete_me) break;
          }
        if (copy) copy = evas_list_free(copy);
        /* free our old list of ins */
        e->pointer.object.in =  evas_list_free(e->pointer.object.in);
      }
+   _evas_unwalk(e);
 }
 
 /**
@@ -781,6 +802,7 @@
    if (!keyname) return;
    if (e->events_frozen > 0) return;
    e->last_timestamp = timestamp;
+   _evas_walk(e);
      {
        Evas_Event_Key_Down ev;
        int exclusive;
@@ -821,6 +843,7 @@
                            if (g->exclusive) exclusive = 1;
                         }
                    }
+                 if (e->delete_me) break;
               }
             e->walking_grabs--;
             if (e->walking_grabs <= 0)
@@ -848,6 +871,7 @@
               evas_object_event_callback_call(e->focused, 
EVAS_CALLBACK_KEY_DOWN, &ev);
          }
      }
+   _evas_unwalk(e);
 }
 
 /**
@@ -865,6 +889,7 @@
    if (!keyname) return;
    if (e->events_frozen > 0) return;
    e->last_timestamp = timestamp;
+   _evas_walk(e);
      {
        Evas_Event_Key_Up ev;
        int exclusive;
@@ -904,6 +929,7 @@
                         evas_object_event_callback_call(g->object, 
EVAS_CALLBACK_KEY_UP, &ev);
                       if (g->exclusive) exclusive = 1;
                    }
+                 if (e->delete_me) break;
               }
             e->walking_grabs--;
             if (e->walking_grabs <= 0)
@@ -931,6 +957,7 @@
               evas_object_event_callback_call(e->focused, 
EVAS_CALLBACK_KEY_UP, &ev);
          }
      }
+   _evas_unwalk(e);
 }
 
 /**
===================================================================
RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_main.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -3 -r1.33 -r1.34
--- evas_main.c 29 Apr 2007 15:45:39 -0000      1.33
+++ evas_main.c 30 Apr 2007 04:22:42 -0000      1.34
@@ -85,7 +85,9 @@
    return;
    MAGIC_CHECK_END();
 
+   if (e->walking_list > 0) return;
    del = 1;
+   e->walking_list++;
    while (del)
      {
        del = 0;
@@ -101,6 +103,13 @@
                  Evas_Object *o;
 
                  o = (Evas_Object *)ll;
+                 if ((o->callbacks) && (o->callbacks->walking_list))
+                   {
+                      /* Defer free */
+                      e->delete_me = 1;
+                      e->walking_list--;
+                      return;
+                   }
                  if (!o->delete_me)
                    del = 1;
               }
@@ -114,7 +123,8 @@
        evas_layer_del(lay);
        evas_layer_free(lay);
      }
-
+   e->walking_list--;
+   
    evas_font_path_clear(e);
    e->pointer.object.in = evas_list_free(e->pointer.object.in);
 
@@ -958,3 +968,17 @@
    MAGIC_CHECK_END();
    return e->attach_data;
 }
+
+void
+_evas_walk(Evas *e)
+{
+   e->walking_list++;
+}
+
+void
+_evas_unwalk(Evas *e)
+{
+   e->walking_list--;
+   if ((e->walking_list == 0) && (e->delete_me)) evas_free(e);
+}
+



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to