Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/edje

Dir     : e17/libs/edje/src/lib


Modified Files:
        edje_callbacks.c edje_load.c edje_private.h edje_program.c 
        edje_smart.c edje_util.c 


Log Message:


IMMENSELY evil!
akuma no code desu!

there are a LOT of paths that lead to calling external callbacks froma
pgoram thaty will invalidate the loop or code just after that call-
causing... segv's and all sort sof fun goodies. i've blocks/locks off a lot
of them... i hope i haven't missed any - but it's likely. tread carefully
within callbacks!

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_callbacks.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- edje_callbacks.c    15 Aug 2003 13:35:25 -0000      1.8
+++ edje_callbacks.c    26 Aug 2003 00:16:49 -0000      1.9
@@ -62,6 +62,7 @@
    else
 #endif     
      snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
+   _edje_ref(ed);
    if ((rp->part->dragable.x) || (rp->part->dragable.y))
      {
        if (rp->drag.down.count == 0)
@@ -83,6 +84,7 @@
    _edje_emit(ed, buf, rp->part->name);
    _edje_recalc(ed);
    _edje_thaw(ed);   
+   _edje_unref(ed);
 }
 
 void
@@ -98,6 +100,7 @@
    rp = evas_object_data_get(obj, "real_part");
    if (!rp) return;
    snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button);
+   _edje_ref(ed);
    _edje_emit(ed, buf, rp->part->name);
    if ((rp->part->dragable.x) || (rp->part->dragable.y))
      {
@@ -122,6 +125,7 @@
      }
    _edje_recalc(ed);
    _edje_thaw(ed);
+   _edje_unref(ed);
 }
 
 void
@@ -165,11 +169,11 @@
             ed->dirty = 1;
          }
      }
+   _edje_ref(ed);
    _edje_emit(ed, "mouse,move", rp->part->name);
    ed->calc_only = 1;
    _edje_recalc(ed);
    ed->calc_only = 0;
-   _edje_thaw(ed); 
    if ((rp->part->dragable.x) || (rp->part->dragable.y))
      {
        if (rp->drag.down.count > 0)
@@ -187,6 +191,8 @@
               }
          }
      }
+   _edje_unref(ed);
+   _edje_thaw(ed); 
 }
 
 void
@@ -225,9 +231,10 @@
        Evas_List *newl = NULL;
        
        ed = animl->data;
+       _edje_block(ed);
        _edje_freeze(ed);
        animl = evas_list_remove(animl, animl->data);
-       if (!ed->paused)
+       if ((!ed->paused) && (!ed->delete_me))
          {
             ed->walking_actions = 1;
             for (l = ed->actions; l; l = l->next)
@@ -240,6 +247,12 @@
                  newl = evas_list_remove(newl, newl->data);
                  if (!runp->delete_me)
                    _edje_program_run_iterate(runp, t);
+                 if (_edje_block_break(ed))
+                   {
+                      evas_list_free(newl);
+                      newl = NULL;
+                      goto break_prog;
+                   }
               }
             for (l = ed->actions; l; l = l->next)
               newl = evas_list_append(newl, l->data);
@@ -262,6 +275,8 @@
               }
             ed->walking_actions = 0;
          }
+       break_prog:
+       _edje_unblock(ed);
        _edje_thaw(ed);
        _edje_unref(ed);
      }
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_load.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- edje_load.c 15 Aug 2003 13:35:25 -0000      1.22
+++ edje_load.c 26 Aug 2003 00:16:49 -0000      1.23
@@ -85,6 +85,7 @@
             rp->part = ep;
             ed->parts = evas_list_append(ed->parts, rp);
             rp->param1.description =  ep->default_desc;
+            printf("MEH %s\n", rp->part->name);
             if (!rp->param1.description)
               {
                  printf("EDJE ERROR: no default part description!\n");
@@ -133,8 +134,8 @@
               }
             else
               evas_object_pass_events_set(rp->object, 1);
-            evas_object_clip_set(rp->object, ed->clipper);
-            evas_object_show(rp->object);
+            if (rp->part->clip_to_id < 0)
+              evas_object_clip_set(rp->object, ed->clipper);
          }
        for (l = ed->parts; l; l = l->next)
          {
@@ -162,13 +163,25 @@
             if (rp->part->dragable.confine_id >= 0)
               rp->confine_to = evas_list_nth(ed->parts, 
rp->part->dragable.confine_id);
          }
-       ed->dirty = 1;
+       _edje_ref(ed);
+       _edje_block(ed);
        _edje_freeze(ed);
-       _edje_recalc(ed);
        _edje_emit(ed, "load", "");
-       _edje_thaw(ed);
+       for (l = ed->parts; l; l = l->next)
+         {
+            Edje_Real_Part *rp;
+            
+            rp = l->data;
+            evas_object_show(rp->object);
+            if (_edje_block_break(ed)) break;
+         }
+       ed->dirty = 1;
        if ((ed->parts) && (evas_object_visible_get(obj)))
          evas_object_show(ed->clipper);
+       _edje_recalc(ed);
+       _edje_thaw(ed);
+       _edje_unblock(ed);
+       _edje_unref(ed);
      }
 }
 
@@ -359,9 +372,9 @@
 void
 _edje_file_del(Edje *ed)
 {
-   /* segv's sometimes happen after here... */
-   /* avoid segv's... but LEAK */
-   /* return; */
+   _edje_emit(ed, NULL, NULL); /* clear out signal emissions */
+   ed->dont_clear_signals = 1;
+   _edje_block_violate(ed);
    if (ed->collection)
      {
        ed->collection->references--;
@@ -385,7 +398,6 @@
             
             rp = ed->parts->data;
             ed->parts = evas_list_remove(ed->parts, rp);
-            _edje_text_part_on_del(ed, rp);
             evas_object_event_callback_del(rp->object, 
                                            EVAS_CALLBACK_MOUSE_IN,
                                            _edje_mouse_in_cb);
@@ -404,6 +416,7 @@
             evas_object_event_callback_del(rp->object, 
                                            EVAS_CALLBACK_MOUSE_WHEEL,
                                            _edje_mouse_wheel_cb);
+            _edje_text_part_on_del(ed, rp);
             evas_object_del(rp->object);
             if (rp->swallowed_object)
               {
@@ -431,8 +444,8 @@
             ed->actions = evas_list_remove(ed->actions, runp);
             free(runp);
          }
-       _edje_animators = evas_list_remove(_edje_animators, ed);
      }
+   _edje_animators = evas_list_remove(_edje_animators, ed);
    if (ed->pending_actions)
      {
        while (ed->pending_actions)
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_private.h,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -3 -r1.42 -r1.43
--- edje_private.h      15 Aug 2003 13:35:25 -0000      1.42
+++ edje_private.h      26 Aug 2003 00:16:49 -0000      1.43
@@ -17,9 +17,13 @@
 
 /* FIXME:
  * 
+ * recursions, unsafe callbacks outside edje etc. with freeze, ref/unref and 
blobk/unblock and break_programs needs to be redesigned & fixed
+ * all unsafe calls that may result in callbacks must be marked and dealt with
+ * 
+ * dragable needs to be able to reverse value affect for "other direction" drag
+ * dragable relative value needs to be able to be set or ++/-- by actions
  * dragable needs to be able to affect rel/abs values of other parts
  * dragable relative value needs to be able to be applied to other part vals.
- * dragable relative value needs to be able to be set or ++/-- by actions
  * 
  * more example edje files
  * 
@@ -370,6 +374,9 @@
    unsigned short        no_anim : 1;
    unsigned short        calc_only : 1;
    unsigned short        walking_actions : 1;
+   unsigned short        block_break : 1;
+   unsigned short        delete_me : 1;
+   unsigned short        dont_clear_signals : 1;
    double                paused_at;
    Evas                 *evas; /* the evas this edje belongs to */
    Evas_Object          *obj; /* the smart object */
@@ -384,7 +391,8 @@
    Evas_List            *text_classes;
    int                   freeze;
    int                   references;
-   
+   int                   block;
+   Evas_List            *emissions;
 };
 
 struct _Edje_Real_Part
@@ -581,6 +589,10 @@
 int               _edje_glob_match(char *str, char *glob);
 int               _edje_freeze(Edje *ed);
 int               _edje_thaw(Edje *ed);
+int               _edje_block(Edje *ed);
+int               _edje_unblock(Edje *ed);
+int               _edje_block_break(Edje *ed);
+void              _edje_block_violate(Edje *ed);    
 void              _edje_object_part_swallow_free_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_program.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- edje_program.c      15 Aug 2003 13:35:25 -0000      1.18
+++ edje_program.c      26 Aug 2003 00:16:49 -0000      1.19
@@ -37,6 +37,7 @@
    if ((!emission) || (!source) || (!func)) return;
    ed = _edje_fetch(obj);
    if (!ed) return;
+   if (ed->delete_me) return;
    escb = calloc(1, sizeof(Edje_Signal_Callback));
    escb->signal = strdup(emission);
    escb->source = strdup(source);
@@ -59,6 +60,7 @@
    if ((!emission) || (!source) || (!func)) return NULL;
    ed = _edje_fetch(obj);
    if (!ed) return;
+   if (ed->delete_me) return NULL;
    for (l = ed->callbacks; l; l = l->next)
      {
        Edje_Signal_Callback *escb;
@@ -97,6 +99,7 @@
    if ((!emission) || (!source)) return;
    ed = _edje_fetch(obj);
    if (!ed) return;
+   if (ed->delete_me) return;
    _edje_emit(ed, (char *)emission, (char *)source);
 }
 
@@ -109,6 +112,7 @@
    
    ed = _edje_fetch(obj);
    if (!ed) return;
+   if (ed->delete_me) return;
    if (play)
      {
        if (!ed->paused) return;
@@ -137,6 +141,7 @@
 
    ed = _edje_fetch(obj);
    if (!ed) return 0;
+   if (ed->delete_me) return 0;
    if (ed->paused) return 0;
    return 1;
 }
@@ -149,6 +154,8 @@
    
    ed = _edje_fetch(obj);
    if (!ed) return;   
+   if (ed->delete_me) return;
+   _edje_block(ed);
    ed->no_anim = !on;
    _edje_freeze(ed);
    if (!on)
@@ -164,6 +171,11 @@
             runp = newl->data;
             newl = evas_list_remove(newl, newl->data);
             _edje_program_run_iterate(runp, runp->start_time + 
runp->program->tween.time);
+            if (_edje_block_break(ed))
+              {
+                 evas_list_free(newl);
+                 goto break_prog;
+              }
          }
      }
    else
@@ -175,7 +187,9 @@
             evas_object_show(obj);
          }
      }
+   break_prog:
    _edje_thaw(ed);
+   _edje_unblock(ed);
 }
 
 int
@@ -185,6 +199,7 @@
    
    ed = _edje_fetch(obj);
    if (!ed) return 0;
+   if (ed->delete_me) return 0;
    if (ed->no_anim) return 0;
    return 1;
 }
@@ -196,9 +211,13 @@
 {
    double t, total;
    Evas_List *l;
+   Edje *ed;
 
-   _edje_ref(runp->edje);
-   _edje_freeze(runp->edje);
+   ed = runp->edje;
+   if (ed->delete_me) return 0;
+   _edje_block(ed);
+   _edje_ref(ed);
+   _edje_freeze(ed);
    t = tim - runp->start_time;
    total = runp->program->tween.time;
    t /= total;
@@ -209,8 +228,8 @@
        Edje_Program_Target *pt;
        
        pt = l->data;
-       rp = evas_list_nth(runp->edje->parts, pt->id);
-       if (rp) _edje_part_pos_set(runp->edje, rp, 
+       rp = evas_list_nth(ed->parts, pt->id);
+       if (rp) _edje_part_pos_set(ed, rp, 
                                   runp->program->tween.mode, t);
      }
    if (t >= 1.0)
@@ -221,45 +240,50 @@
             Edje_Program_Target *pt;
             
             pt = l->data;
-            rp = evas_list_nth(runp->edje->parts, pt->id);
+            rp = evas_list_nth(ed->parts, pt->id);
             if (rp)
               {
-                 _edje_part_description_apply(runp->edje, rp, 
+                 _edje_part_description_apply(ed, rp, 
                                               runp->program->state, 
                                               runp->program->value,
                                               NULL,
                                               0.0);
-                 _edje_part_pos_set(runp->edje, rp, 
+                 _edje_part_pos_set(ed, rp, 
                                     runp->program->tween.mode, 0.0);
                  rp->program = NULL;
               }
          }
-       _edje_recalc(runp->edje);
+       _edje_recalc(ed);
        runp->delete_me = 1;
-       if (!runp->edje->walking_actions)
+       if (!ed->walking_actions)
          {
             _edje_anim_count--;
-            runp->edje->actions = evas_list_remove(runp->edje->actions, runp);
-            if (!runp->edje->actions)
-              _edje_animators = evas_list_remove(_edje_animators, runp->edje);
+            ed->actions = evas_list_remove(ed->actions, runp);
+            if (!ed->actions)
+              _edje_animators = evas_list_remove(_edje_animators, ed);
          }
-       _edje_emit(runp->edje, "program,stop", runp->program->name);
+       _edje_emit(ed, "program,stop", runp->program->name);
+       if (_edje_block_break(ed)) goto break_prog;
        if (runp->program->after >= 0)
          {
             Edje_Program *pr;
             
-            pr = evas_list_nth(runp->edje->collection->programs, 
+            pr = evas_list_nth(ed->collection->programs, 
                                runp->program->after);
-            if (pr) _edje_program_run(runp->edje, pr, 0);
+            if (pr) _edje_program_run(ed, pr, 0);
+            if (_edje_block_break(ed)) goto break_prog;
          }
-       _edje_thaw(runp->edje);
-       _edje_unref(runp->edje);
-       if (!runp->edje->walking_actions) free(runp);
+       _edje_thaw(ed);
+       _edje_unref(ed);
+       if (!ed->walking_actions) free(runp);
+       _edje_unblock(ed);
        return  0;
      }
-   _edje_recalc(runp->edje);
-   _edje_thaw(runp->edje);
-   _edje_unref(runp->edje);
+   break_prog:
+   _edje_recalc(ed);
+   _edje_thaw(ed);
+   _edje_unref(ed);
+   _edje_unblock(ed);
    return 1;
 }
 
@@ -267,41 +291,46 @@
 _edje_program_end(Edje *ed, Edje_Running_Program *runp)
 {
    Evas_List *l;
+   char *pname = NULL;
 
-   _edje_ref(runp->edje);
-   _edje_freeze(runp->edje);
+   if (ed->delete_me) return;
+   _edje_ref(ed);
+   _edje_freeze(ed);
    for (l = runp->program->targets; l; l = l->next)
      {
        Edje_Real_Part *rp;
        Edje_Program_Target *pt;
        
        pt = l->data;
-       rp = evas_list_nth(runp->edje->parts, pt->id);
+       rp = evas_list_nth(ed->parts, pt->id);
        if (rp)
          {
-            _edje_part_description_apply(runp->edje, rp, 
+            _edje_part_description_apply(ed, rp, 
                                          runp->program->state, 
                                          runp->program->value,
                                          NULL,
                                          0.0);
-            _edje_part_pos_set(runp->edje, rp, 
+            _edje_part_pos_set(ed, rp, 
                                runp->program->tween.mode, 0.0);
             rp->program = NULL;
          }
      }
-   _edje_recalc(runp->edje);
+   _edje_recalc(ed);
    runp->delete_me = 1;
-   if (!runp->edje->walking_actions)
+   pname = runp->program->name;
+   if (!ed->walking_actions)
      {
        _edje_anim_count--;
-       runp->edje->actions = evas_list_remove(runp->edje->actions, runp);
-       if (!runp->edje->actions)
-         _edje_animators = evas_list_remove(_edje_animators, runp->edje);
-     }
-   _edje_emit(runp->edje, "program,stop", runp->program->name);
-   _edje_thaw(runp->edje);
-   _edje_unref(runp->edje);   
-   if (!runp->edje->walking_actions) free(runp);
+       ed->actions = evas_list_remove(ed->actions, runp);
+       if (!ed->actions)
+         {
+            _edje_animators = evas_list_remove(_edje_animators, ed);
+            free(runp);
+         }
+     }
+   _edje_emit(ed, "program,stop", pname);
+   _edje_thaw(ed);
+   _edje_unref(ed);   
 }
    
 void
@@ -312,6 +341,7 @@
    static int recursions = 0;
    static int recursion_limit = 0;
 
+   if (ed->delete_me) return;
    if ((pr->in.from > 0.0) && (pr->in.range >= 0.0) && (!force))
      {
        Edje_Pending_Program *pp;
@@ -340,8 +370,10 @@
        return;
      }
    recursions++;
-   _edje_freeze(ed);
+   _edje_block(ed);
    _edje_ref(ed);
+   _edje_freeze(ed);
+   printf("run program %s\n", pr->name);
    if (pr->action == EDJE_ACTION_TYPE_STATE_SET)
      {
        if ((pr->tween.time > 0.0) && (!ed->no_anim))
@@ -370,7 +402,7 @@
                    }
               }
             _edje_emit(ed, "program,start", pr->name);
-            
+            if (_edje_block_break(ed)) goto break_prog;
             if (!ed->actions)
               _edje_animators = evas_list_append(_edje_animators, ed);
             ed->actions = evas_list_append(ed->actions, runp);
@@ -403,7 +435,9 @@
                    }
               }
             _edje_emit(ed, "program,start", pr->name);
+            if (_edje_block_break(ed)) goto break_prog;
             _edje_emit(ed, "program,stop", pr->name);
+            if (_edje_block_break(ed)) goto break_prog;
             if (pr->after >= 0)
               {
                  Edje_Program *pr2;
@@ -411,6 +445,7 @@
                  pr2 = evas_list_nth(ed->collection->programs, 
                                     pr->after);
                  if (pr2) _edje_program_run(ed, pr2, 0);
+                 if (_edje_block_break(ed)) goto break_prog;
               }
             _edje_recalc(ed);
          }
@@ -451,12 +486,16 @@
             done:
          }
        _edje_emit(ed, "program,stop", pr->name);
+       if (_edje_block_break(ed)) goto break_prog;
      }
    else if (pr->action == EDJE_ACTION_TYPE_SIGNAL_EMIT)
      {
        _edje_emit(ed, "program,start", pr->name);
+       if (_edje_block_break(ed)) goto break_prog;
        _edje_emit(ed, pr->state, pr->state2);
+       if (_edje_block_break(ed)) goto break_prog;
        _edje_emit(ed, "program,stop", pr->name);
+       if (_edje_block_break(ed)) goto break_prog;
      }
    if (pr->action != EDJE_ACTION_TYPE_STATE_SET)
      {
@@ -466,57 +505,79 @@
             
             pr2 = evas_list_nth(ed->collection->programs, pr->after);
             if (pr2) _edje_program_run(ed, pr2, 0);
+            if (_edje_block_break(ed)) goto break_prog;
          }
      }
-   _edje_unref(ed);
+   break_prog:
    _edje_thaw(ed);
+   _edje_unref(ed);
    recursions--;
    if (recursions == 0) recursion_limit = 0;
+   _edje_unblock(ed);
 }
 
 void
 _edje_emit(Edje *ed, char *sig, char *src)
 {
    Evas_List *l;
-   static Evas_List *emissions = NULL;
    Edje_Emission *ee;
    /* limit self-feeding loops in callbacks to 64 levels */
    static int recursions = 0;
    static int recursion_limit = 0;
 
+   if ((!sig) && (!src))
+     {
+       printf("clear signals! %p\n", ed->emissions);
+       while (ed->emissions)
+         {
+            ee = ed->emissions->data;
+            free(ee->signal);
+            free(ee->source);
+            free(ee);
+            ed->emissions = evas_list_remove(ed->emissions, ee);
+         }
+       return;
+     }
+   if (ed->delete_me) return;
    if ((recursions >= 64) || (recursion_limit))
      {
        recursion_limit = 1;
        return;
      }
    recursions++;
-   _edje_ref(ed);
-   _edje_freeze(ed);
    printf("EDJE EMIT: signal: \"%s\" source: \"%s\"\n", sig, src);
-   ee = calloc(1, sizeof(Edje_Emission));
-   if (!ee)
+   if ((sig) && (src))
      {
-       recursions--;
-       if (recursions == 0) recursion_limit = 0;
-       return;
-     }
-   ee->signal = strdup(sig);
-   ee->source = strdup(src);
-   if (emissions)
-     {
-       emissions = evas_list_append(emissions, ee);
-       _edje_thaw(ed);
-       _edje_unref(ed);
-       recursions--;
-       if (recursions == 0) recursion_limit = 0;
-       return;
+       printf("queue emission\n");
+       ee = calloc(1, sizeof(Edje_Emission));
+       if (!ee)
+         {
+            recursions--;
+            if (recursions == 0) recursion_limit = 0;
+            return;
+         }
+       ee->signal = strdup(sig);
+       ee->source = strdup(src);
+       if ((ed->emissions) || (_edje_block_break(ed)))
+         {
+            printf("append signal & leave\n");
+            ed->emissions = evas_list_append(ed->emissions, ee);
+            recursions--;
+            if (recursions == 0) recursion_limit = 0;
+            return;
+         }
+       else
+         ed->emissions = evas_list_append(ed->emissions, ee);
      }
-   else
-     emissions = evas_list_append(emissions, ee);
-   while (emissions)
+   if (!ed->emissions) return;
+   _edje_block(ed);
+   _edje_ref(ed);
+   _edje_freeze(ed);
+   while (ed->emissions)
      {
-       ee = emissions->data;
-       emissions = evas_list_remove(emissions, ee);
+       ee = ed->emissions->data;
+       ed->emissions = evas_list_remove(ed->emissions, ee);
+       printf("EDJE: handle emission \"%s\" \"%s\"\n", ee->signal, ee->source);
        if (ed->collection)
          {
             Edje_Part_Collection *ec;
@@ -542,7 +603,9 @@
                  Evas_List *matches;
                  
                  if (evas_hash_find(ec->prog_cache.no_matches, tmps))
-                   done = 1;
+                   {
+                      done = 1;
+                   }
                  else if ((matches = evas_hash_find(ec->prog_cache.matches, tmps)))
                    {
                       for (l = matches; l; l = l->next)
@@ -551,6 +614,13 @@
                            
                            pr = l->data;
                            _edje_program_run(ed, pr, 0);
+                           if (_edje_block_break(ed))
+                             {
+                                if (tmps) free(tmps);
+                                if (!ed->dont_clear_signals)
+                                  _edje_emit(ed, NULL, NULL);
+                                goto break_prog;
+                             }
                         }
                       done = 1;
                    }
@@ -572,6 +642,14 @@
                         {
                            matched++;
                            _edje_program_run(ed, pr, 0);
+                           if (_edje_block_break(ed))
+                             {
+                                if (tmps) free(tmps);
+                                evas_list_free(matches);
+                                if (!ed->dont_clear_signals)
+                                  _edje_emit(ed, NULL, NULL);
+                                goto break_prog;
+                             }
                            matches = evas_list_append(matches, pr);
                         }
                    }
@@ -586,16 +664,26 @@
                    }
               }
             _edje_emit_cb(ed, ee->signal, ee->source);
+            if (_edje_block_break(ed))
+              {
+                 if (tmps) free(tmps);
+                 if (!ed->dont_clear_signals)              
+                   _edje_emit(ed, NULL, NULL);
+                 goto break_prog;
+              }
             if (tmps) free(tmps);
+            tmps = NULL;
          }
        free(ee->signal);
        free(ee->source);
        free(ee);
      }
-   _edje_thaw(ed);
-   _edje_unref(ed);
+   break_prog:
    recursions--;
    if (recursions == 0) recursion_limit = 0;
+   _edje_thaw(ed);
+   _edje_unref(ed);
+   _edje_unblock(ed);
 }
 
 static void
@@ -603,6 +691,10 @@
 {
    Evas_List *l;
    
+   if (ed->delete_me) return;
+   _edje_ref(ed);
+   _edje_freeze(ed);   
+   _edje_block(ed);
    ed->walking_callbacks = 1;
    for (l = ed->callbacks; l; l = l->next)
      {
@@ -614,6 +706,7 @@
            (_edje_glob_match(sig, escb->signal)) &&
            (_edje_glob_match(src, escb->source)))
          escb->func(escb->data, ed->obj, sig, src);
+       if (_edje_block_break(ed)) goto break_prog;
      }
    ed->walking_callbacks = 0;
    if ((ed->delete_callbacks) || (ed->just_added_callbacks))
@@ -639,4 +732,8 @@
             l = next_l;
          }
      }
+   break_prog:
+   _edje_unblock(ed);
+   _edje_thaw(ed);
+   _edje_unref(ed);
 }
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_smart.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- edje_smart.c        30 Jul 2003 02:58:22 -0000      1.9
+++ edje_smart.c        26 Aug 2003 00:16:49 -0000      1.10
@@ -67,6 +67,8 @@
 
    ed = evas_object_smart_data_get(obj);
    if (!ed) return;
+   _edje_block_violate(ed);
+   ed->delete_me = 1;
    _edje_clean_objects(ed);
    _edje_unref(ed);
    _edje_edjes = evas_list_remove(_edje_edjes, obj);
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_util.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- edje_util.c 15 Aug 2003 13:35:25 -0000      1.19
+++ edje_util.c 26 Aug 2003 00:16:49 -0000      1.20
@@ -764,9 +764,42 @@
 {
    ed->freeze--;
    if (ed->freeze < 0) ed->freeze = 0;
-   if ((ed->freeze == 0) && (ed->recalc))
-     _edje_recalc(ed);
+   if ((ed->freeze == 0) && (ed->recalc)) _edje_recalc(ed);
    return ed->freeze;
+}
+
+int
+_edje_block(Edje *ed)
+{
+   ed->block++;
+   return ed->block;
+}
+
+int
+_edje_unblock(Edje *ed)
+{
+   ed->block--;
+   if (ed->block == 0)
+     {
+       ed->block_break = 0;
+       printf("unblock!!! ed->emissions = %p\n", ed->emissions);
+       ed->dont_clear_signals = 0;
+       if (ed->emissions) _edje_emit(ed, "", NULL);
+     }
+   return ed->block;
+}
+
+int
+_edje_block_break(Edje *ed)
+{
+   if (ed->block_break) return 1;
+   return 0;
+}
+
+void
+_edje_block_violate(Edje *ed)
+{
+   if (ed->block > 0) ed->block_break = 1;
 }
 
 void




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to