wo... this turned out to be much more of a pain. minmul now works -
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 14 Jan 2012 02:29:13 +0000 (02:29 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 14 Jan 2012 02:29:13 +0000 (02:29 +0000)
allows us to multiple a minimim size explicitly for min size calc so
we can do things like have content slide open/closed properly.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@67197 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/edje_cc_handlers.c
src/lib/edje_calc.c
src/lib/edje_callbacks.c
src/lib/edje_data.c
src/lib/edje_embryo.c
src/lib/edje_load.c
src/lib/edje_private.h
src/lib/edje_program.c
src/lib/edje_util.c

index 30dab28..86def01 100644 (file)
@@ -172,6 +172,7 @@ static void st_collections_group_parts_part_description_visible(void);
 static void st_collections_group_parts_part_description_align(void);
 static void st_collections_group_parts_part_description_fixed(void);
 static void st_collections_group_parts_part_description_min(void);
+static void st_collections_group_parts_part_description_minmul(void);
 static void st_collections_group_parts_part_description_max(void);
 static void st_collections_group_parts_part_description_step(void);
 static void st_collections_group_parts_part_description_aspect(void);
@@ -434,6 +435,7 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.parts.part.description.align", st_collections_group_parts_part_description_align},
      {"collections.group.parts.part.description.fixed", st_collections_group_parts_part_description_fixed},
      {"collections.group.parts.part.description.min", st_collections_group_parts_part_description_min},
+     {"collections.group.parts.part.description.minmul", st_collections_group_parts_part_description_minmul},
      {"collections.group.parts.part.description.max", st_collections_group_parts_part_description_max},
      {"collections.group.parts.part.description.step", st_collections_group_parts_part_description_step},
      {"collections.group.parts.part.description.aspect", st_collections_group_parts_part_description_aspect},
@@ -4132,6 +4134,9 @@ ob_collections_group_parts_part_description(void)
    ed->map.persp_on = 0;
    ed->persp.zplane = 0;
    ed->persp.focal = 1000;
+   ed->minmul.have = 1;
+   ed->minmul.w = FROM_INT(1);
+   ed->minmul.h = FROM_INT(1);
 }
 
 /**
@@ -4550,6 +4555,26 @@ st_collections_group_parts_part_description_min(void)
 /**
     @page edcref
     @property
+        minmul
+    @parameters
+        [width multipler] [height multiplier]
+    @effect
+        A multiplier FORCIBLY applied to whatever minimum size is only during
+        minimum size calculation.
+    @endproperty
+*/
+static void
+st_collections_group_parts_part_description_minmul(void)
+{
+   check_arg_count(2);
+
+   current_desc->minmul.w = FROM_DOUBLE(parse_float_range(0, 0, 999999));
+   current_desc->minmul.h = FROM_DOUBLE(parse_float_range(1, 0, 999999));
+}
+
+/**
+    @page edcref
+    @property
         max
     @parameters
         [width] [height]
index 8e7e7ce..213e266 100644 (file)
@@ -116,6 +116,7 @@ _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T
    ep->description_pos = npos;
 
    ed->dirty = 1;
+   ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    ep->invalidate = 1;
 #endif
@@ -572,6 +573,7 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
      _edje_external_recalc_apply(ed, ep, NULL, chosen_desc);
 
    ed->dirty = 1;
+   ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    ep->invalidate = 1;
 #endif
@@ -641,9 +643,13 @@ _edje_recalc_do(Edje *ed)
    ed->text_part_change = 0;
 #endif
    if (!ed->calc_only)
-     evas_object_smart_callback_call(ed->obj, "recalc", NULL);
+     {
+        if (ed->recalc_call)
+          evas_object_smart_callback_call(ed->obj, "recalc", NULL);
+     }
    else
      evas_object_smart_need_recalculate_set(ed->obj, need_calc);
+   ed->recalc_call = 0;
 }
 
 void
@@ -711,6 +717,7 @@ _edje_dragable_pos_set(Edje *ed, Edje_Real_Part *ep, FLOAT_T x, FLOAT_T y)
        ep->drag->tmp.x = 0;
        ep->drag->need_reset = 0;
        ed->dirty = 1;
+        ed->recalc_call = 1;
      }
 
    if (ep->drag->y != y || ep->drag->tmp.y)
@@ -719,6 +726,7 @@ _edje_dragable_pos_set(Edje *ed, Edje_Real_Part *ep, FLOAT_T x, FLOAT_T y)
        ep->drag->tmp.y = 0;
        ep->drag->need_reset = 0;
        ed->dirty = 1;
+        ed->recalc_call = 1;
      }
 
 #ifdef EDJE_CALC_CACHE
@@ -1681,6 +1689,15 @@ _edje_part_recalc_single_min_max(FLOAT_T sc,
    if (ep->swallow_params.min.w > desc->min.w)
      *minw = ep->swallow_params.min.w;
 
+   if (ep->edje->calc_only)
+     {
+        if (desc->minmul.have)
+          {
+             FLOAT_T mmw = desc->minmul.w;
+             if (mmw != FROM_INT(1)) *minw = TO_INT(SCALE(mmw, *minw));
+          }
+     }
+
    /* XXX TODO: remove need of EDJE_INF_MAX_W, see edje_util.c */
    if ((ep->swallow_params.max.w <= 0) ||
        (ep->swallow_params.max.w == EDJE_INF_MAX_W))
@@ -1708,6 +1725,8 @@ _edje_part_recalc_single_min_max(FLOAT_T sc,
               *maxw = ep->swallow_params.max.w;
          }
      }
+   if ((ep->edje->calc_only) && (desc->minmul.have) && 
+       (desc->minmul.w != FROM_INT(1))) *maxw = *minw;
    if (*maxw >= 0)
      {
        if (*maxw < *minw) *maxw = *minw;
@@ -1718,6 +1737,16 @@ _edje_part_recalc_single_min_max(FLOAT_T sc,
    if (ep->swallow_params.min.h > desc->min.h)
      *minh = ep->swallow_params.min.h;
 
+   if (ep->edje->calc_only)
+     {
+        if (desc->minmul.have)
+          {
+             FLOAT_T mmh = desc->minmul.h;
+             if (mmh != FROM_INT(1)) *minh = TO_INT(SCALE(mmh, *minh));
+          }
+     }
+
+
    /* XXX TODO: remove need of EDJE_INF_MAX_H, see edje_util.c */
    if ((ep->swallow_params.max.h <= 0) ||
        (ep->swallow_params.max.h == EDJE_INF_MAX_H))
@@ -1744,7 +1773,9 @@ _edje_part_recalc_single_min_max(FLOAT_T sc,
             if (ep->swallow_params.max.h < *maxh)
               *maxh = ep->swallow_params.max.h;
          }
-       }
+     }
+   if ((ep->edje->calc_only) && (desc->minmul.have) && 
+       (desc->minmul.h != FROM_INT(1))) *maxh = *minh;
    if (*maxh >= 0)
      {
        if (*maxh < *minh) *maxh = *minh;
@@ -1876,7 +1907,7 @@ _edje_part_recalc_single(Edje *ed,
    sc = ed->scale;
    if (sc == ZERO) sc = _edje_scale;
    _edje_part_recalc_single_min_max(sc, ep, desc, &minw, &minh, &maxw, &maxh);
-
+   
    /* relative coords of top left & bottom right */
    _edje_part_recalc_single_rel(ed, ep, desc, rel1_to_x, rel1_to_y, rel2_to_x, rel2_to_y, params);
 
@@ -2062,7 +2093,7 @@ _edje_proxy_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
    Edje_Real_Part *pp;
    int part_id = -1;
 
-   if (pos >= 0.5)
+   if (pos >= FROM_DOUBLE(0.5))
       part_id = ((Edje_Part_Description_Proxy*) ep->param2->description)->proxy.id;
    else
       part_id = chosen_desc->proxy.id;
@@ -2334,7 +2365,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
         Edje_Real_Part *pp;
         int part_id = -1;
 
-        if (pos >= 0.5)
+        if (pos >= FROM_DOUBLE(0.5))
           part_id = ((Edje_Part_Description_Proxy*) ep->param2->description)->proxy.id;
         else
           part_id = ((Edje_Part_Description_Proxy*) chosen_desc)->proxy.id;
@@ -2437,8 +2468,13 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
            ((ep->part->type == EDJE_PART_TYPE_TEXT || ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) && ed->text_part_change))
 #endif
          {
-            _edje_part_recalc_single(ed, ep, ep->param2->description, chosen_desc, center[1], light[1], persp[1],
-                                     ep->param2->rel1_to_x, ep->param2->rel1_to_y, ep->param2->rel2_to_x, ep->param2->rel2_to_y,
+            _edje_part_recalc_single(ed, ep, ep->param2->description, 
+                                      chosen_desc, 
+                                      center[1], light[1], persp[1],
+                                     ep->param2->rel1_to_x, 
+                                      ep->param2->rel1_to_y, 
+                                      ep->param2->rel2_to_x, 
+                                      ep->param2->rel2_to_y,
                                      confine_to,
                                      p2, pos);
 #ifdef EDJE_CALC_CACHE
@@ -2486,7 +2522,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
        p3->req.y = INTP(p1->req.y, p2->req.y, pos);
        p3->req.w = INTP(p1->req.w, p2->req.w, pos);
        p3->req.h = INTP(p1->req.h, p2->req.h, pos);
-
+        
        if (ep->part->dragable.x)
          {
             p3->req_drag.x = INTP(p1->req_drag.x, p2->req_drag.x, pos);
index e0b0eae..2b02891 100644 (file)
@@ -134,6 +134,7 @@ _edje_mouse_down_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi
                  _edje_emit(ed, buf, events->part->name);
               }
             ed->dirty = 1;
+             ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
             rp->invalidate = 1;
 #endif
@@ -157,6 +158,7 @@ _edje_mouse_down_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi
                rp->drag->val.y = dy;
                if (!ignored)
                  _edje_emit(ed, "drag", rp->part->name);
+                ed->recalc_call = 1;
                ed->dirty = 1;
 #ifdef EDJE_CALC_CACHE
                rp->invalidate = 1;
@@ -235,6 +237,7 @@ _edje_mouse_up_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void
             if (rp->drag->down.count == 0)
               {
                  rp->drag->need_reset = 1;
+                  ed->recalc_call = 1;
                  ed->dirty = 1;
 #ifdef EDJE_CALC_CACHE
                  rp->invalidate = 1;
@@ -314,6 +317,7 @@ _edje_mouse_move_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi
               rp->drag->tmp.x = ev->cur.canvas.x - rp->drag->down.x;
             if (rp->part->dragable.y)
               rp->drag->tmp.y = ev->cur.canvas.y - rp->drag->down.y;
+             ed->recalc_call = 1;
             ed->dirty = 1;
 #ifdef EDJE_CALC_CACHE
             rp->invalidate = 1;
@@ -332,6 +336,7 @@ _edje_mouse_move_signal_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, voi
                  rp->drag->val.y = dy;
                  if (!ignored)
                    _edje_emit(ed, "drag", rp->part->name);
+                  ed->recalc_call = 1;
                  ed->dirty = 1;
 #ifdef EDJE_CALC_CACHE
                  rp->invalidate = 1;
index 6b7b395..32b17b6 100644 (file)
@@ -451,6 +451,9 @@ _edje_edd_init(void)
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "align.y", align.y, EDJE_T_FLOAT); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "fixed.w", fixed.w, EET_T_UCHAR); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "fixed.h", fixed.h, EET_T_UCHAR); \
+      EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "minmul.have", minmul.have, EET_T_UCHAR); \
+      EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "minmul.w", minmul.w, EDJE_T_FLOAT); \
+      EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "minmul.h", minmul.h, EDJE_T_FLOAT); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "min.w", min.w, EET_T_INT); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "min.h", min.h, EET_T_INT); \
       EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "max.w", max.w, EET_T_INT); \
index c89a4f4..1ad2377 100644 (file)
@@ -674,6 +674,7 @@ _edje_embryo_fn_set_min_size(Embryo_Program *ep, Embryo_Cell *params)
    if (h < 0.0) h = 0.0;
    ed->collection->prop.min.w = w;
    ed->collection->prop.min.h = h;
+   ed->recalc_call = 1;
    ed->dirty = 1;
 #ifdef EDJE_CALC_CACHE
    ed->all_part_change = 1;
@@ -701,6 +702,7 @@ _edje_embryo_fn_set_max_size(Embryo_Program *ep, Embryo_Cell *params)
    if (h < 0.0) h = 0.0;
    ed->collection->prop.max.w = w;
    ed->collection->prop.max.h = h;
+   ed->recalc_call = 1;
    ed->dirty = 1;
 #ifdef EDJE_CALC_CACHE
    ed->all_part_change = 1;
index de247a6..8fe5842 100644 (file)
@@ -525,7 +525,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                         }
 
                       rp->swallow_params.min.w = 0;
-                      rp->swallow_params.min.w = 0;
+                      rp->swallow_params.min.h = 0;
                       rp->swallow_params.max.w = -1;
                       rp->swallow_params.max.h = -1;
 
@@ -603,6 +603,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                       _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
                    }
               }
+             ed->recalc_call = 1;
             ed->dirty = 1;
 #ifdef EDJE_CALC_CACHE
             ed->all_part_change = 1;
index e170c58..5d657d0 100644 (file)
@@ -835,6 +835,11 @@ struct _Edje_Part_Description_Common
       unsigned char  w, h; /* width or height is fixed in side (cannot expand with Edje object size) */
    } fixed;
 
+   struct { // only during recalc
+      unsigned char have;
+      FLOAT_T w, h;
+   } minmul;
+   
    Edje_Size min, max;
    Edje_Position step; /* size stepping by n pixels, 0 = none */
    Edje_Aspect_Prefer aspect;
@@ -1139,6 +1144,7 @@ struct _Edje
    unsigned int          all_part_change : 1;
 #endif
    unsigned int          have_mapped_part : 1;
+   unsigned int          recalc_call : 1;
 };
 
 struct _Edje_Calc_Params
index 1e8f03c..d80c7c9 100644 (file)
@@ -1621,6 +1621,7 @@ _edje_param_native_set(Edje_Real_Part *rp, const char *name, const Edje_External
                  if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
                    return EINA_FALSE;
                  rp->drag->size.x = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
+                  rp->edje->recalc_call = 1;
                  rp->edje->dirty = 1;
 #ifdef EDJE_CALC_CACHE
                  rp->invalidate = 1;
@@ -1633,6 +1634,7 @@ _edje_param_native_set(Edje_Real_Part *rp, const char *name, const Edje_External
                  if (param->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
                    return EINA_FALSE;
                  rp->drag->size.y = FROM_DOUBLE(CLAMP(param->d, 0.0, 1.0));
+                  rp->edje->recalc_call = 1;
                  rp->edje->dirty = 1;
 #ifdef EDJE_CALC_CACHE
                  rp->invalidate = 1;
index 0e2aa8f..2205ba3 100644 (file)
@@ -438,6 +438,7 @@ edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2
 
        ed = eina_list_data_get(members);
        ed->dirty = 1;
+        ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
        ed->all_part_change = 1;
 #endif
@@ -504,6 +505,7 @@ edje_color_class_del(const char *color_class)
 
        ed = eina_list_data_get(members);
        ed->dirty = 1;
+        ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
        ed->all_part_change = 1;
 #endif
@@ -583,6 +585,7 @@ edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, in
             cc->b3 = b3;
             cc->a3 = a3;
             ed->dirty = 1;
+             ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
             ed->all_part_change = 1;
 #endif
@@ -611,6 +614,7 @@ edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, in
    cc->a3 = a3;
    ed->color_classes = eina_list_append(ed->color_classes, cc);
    ed->dirty = 1;
+   ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    ed->all_part_change = 1;
 #endif
@@ -693,6 +697,7 @@ edje_object_color_class_del(Evas_Object *obj, const char *color_class)
      }
 
    ed->dirty = 1;
+   ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    ed->all_part_change = 1;
 #endif
@@ -752,6 +757,7 @@ edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size siz
 
        ed = eina_list_data_get(members);
        ed->dirty = 1;
+        ed->recalc_call = 1;
        _edje_textblock_style_all_update(ed);
 #ifdef EDJE_CALC_CACHE
        ed->text_part_change = 1;
@@ -847,6 +853,7 @@ edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char
 
             /* Update edje */
             ed->dirty = 1;
+             ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
             ed->text_part_change = 1;
 #endif
@@ -881,6 +888,7 @@ edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char
    /* Add to edje's text class list */
    ed->text_classes = eina_list_append(ed->text_classes, tc);
    ed->dirty = 1;
+   ed->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    ed->text_part_change = 1;
 #endif
@@ -1005,6 +1013,7 @@ _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char
    else
      if (text) rp->text.text = eina_stringshare_add(text);
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -1039,6 +1048,7 @@ _edje_object_part_text_raw_append(Evas_Object *obj, Edje_Real_Part *rp, const ch
           }
      }
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -1307,6 +1317,7 @@ edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *tex
    if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
    _edje_entry_text_markup_insert(rp, text);
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -1328,6 +1339,7 @@ edje_object_part_text_append(Evas_Object *obj, const char *part, const char *tex
    if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
    _edje_object_part_text_raw_append(obj, rp, part, text);
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -1936,6 +1948,7 @@ _recalc_extern_parent(Evas_Object *obj)
    ed = _edje_fetch(parent);
 
    ed->dirty = 1;
+   ed->recalc_call = 1; // ZZZ: ???
    _edje_recalc(ed);
 }
 
@@ -2227,6 +2240,7 @@ edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow
        rp->swallow_params.max.w = 0;
        rp->swallow_params.max.h = 0;
        rp->edje->dirty = 1;
+        rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
        rp->invalidate = 1;
 #endif
@@ -2687,6 +2701,7 @@ edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, do
    rp->drag->size.x = FROM_DOUBLE(dw);
    rp->drag->size.y = FROM_DOUBLE(dh);
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -3021,6 +3036,7 @@ _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUS
    Edje_Real_Part *rp = data;
 
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -3034,6 +3050,7 @@ _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -3047,6 +3064,7 @@ _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -3189,6 +3207,7 @@ _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UN
    Edje_Real_Part *rp = data;
 
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -3202,6 +3221,7 @@ _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -3215,6 +3235,7 @@ _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
 #ifdef EDJE_CALC_CACHE
    rp->invalidate = 1;
 #endif
@@ -3317,6 +3338,7 @@ _edje_perspective_obj_del(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object
         if (!ed) continue;
         ed->persp = NULL;
         ed->dirty = 1;
+        ed->recalc_call = 1;
         _edje_recalc_do(ed);
      }
    free(ps);
@@ -3370,6 +3392,7 @@ edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Co
         if (!ed->persp)
           {
              ed->dirty = 1;
+             ed->recalc_call = 1;
              _edje_recalc_do(ed);
           }
      }
@@ -3384,6 +3407,7 @@ edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Co
              if (!ed->persp)
                {
                   ed->dirty = 1;
+                  ed->recalc_call = 1;
                   _edje_recalc_do(ed);
                }
           }
@@ -3417,6 +3441,7 @@ edje_perspective_global_set(Edje_Perspective *ps, Eina_Bool global)
         if (!ed->persp)
           {
              ed->dirty = 1;
+             ed->recalc_call = 1;
              _edje_recalc_do(ed);
           }
      }
@@ -3456,6 +3481,7 @@ edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps)
    ed->persp = ps;
    if (ps) ps->users = eina_list_append(ps->users, obj);
    ed->dirty = 1;
+   ed->recalc_call = 1;
    _edje_recalc_do(ed);
 }
 
@@ -4078,6 +4104,7 @@ _edje_object_part_swallow_changed_hints_cb(void *data, __UNUSED__ Evas *e, __UNU
    rp = data;
    _edje_real_part_swallow_hints_update(rp);
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
    _edje_recalc(rp->edje);
    return;
 }
@@ -4099,6 +4126,7 @@ _edje_real_part_swallow(Edje_Real_Part *rp,
              if (hints_update)
                _edje_real_part_swallow_hints_update(rp);
              rp->edje->dirty = 1;
+             rp->edje->recalc_call = 1;
              _edje_recalc(rp->edje);
              return;
           }
@@ -4142,6 +4170,7 @@ _edje_real_part_swallow(Edje_Real_Part *rp,
      evas_object_precise_is_inside_set(obj_swallow, 1);
 
    rp->edje->dirty = 1;
+   rp->edje->recalc_call = 1;
    _edje_recalc(rp->edje);
 }