Hi,
I have been using Gustavo patch, that delay edje_recalc as much as
possible using the new infrastructure provided by Evas for smart
object, since a few month. I did find a few issue and they are fixed
in the attachment. This patch seems ready to be included from my point
of view as it ease the use of edje and improve speed, it just need
more users :-) So are you guy interested by another break ? :)
As always, have fun !
--
Cedric BAIL
diff --git a/edje/configure.ac b/edje/configure.ac
index 1a9ccd6..155e6b6 100644
--- a/edje/configure.ac
+++ b/edje/configure.ac
@@ -3,7 +3,7 @@ dnl Process this file with autoconf to produce a configure script.
# get rid of that stupid cache mechanism
rm -f config.cache
-AC_INIT([edje], [0.9.9.050], [EMAIL PROTECTED])
+AC_INIT([edje], [0.9.9.050.7], [EMAIL PROTECTED])
AC_PREREQ(2.52)
AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4])
diff --git a/edje/src/lib/edje_calc.c b/edje/src/lib/edje_calc.c
index 91fc593..a89cabd 100644
--- a/edje/src/lib/edje_calc.c
+++ b/edje/src/lib/edje_calc.c
@@ -137,21 +137,30 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
void
_edje_recalc(Edje *ed)
{
- int i;
-
- if (!ed->dirty)
- {
- return;
- }
if ((ed->freeze > 0) || (_edje_freeze_val > 0))
{
ed->recalc = 1;
if (!ed->calc_only)
{
if (_edje_freeze_val > 0) _edje_freeze_calc_count++;
- return;
+ return ;
}
}
+ if (ed->postponed) return ;
+ evas_object_smart_changed(ed->obj);
+ ed->postponed = 1;
+}
+
+void
+_edje_recalc_do(Edje *ed)
+{
+ int i;
+
+ ed->postponed = 0;
+ if (!ed->dirty)
+ {
+ return;
+ }
for (i = 0; i < ed->table_parts_size; i++)
{
Edje_Real_Part *ep;
@@ -168,8 +177,9 @@ _edje_recalc(Edje *ed)
if (ep->calculated != FLAG_XY)
_edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY);
}
- ed->dirty = 0;
if (!ed->calc_only) ed->recalc = 0;
+ ed->dirty = 0;
+ ed->calc_only = 0;
}
int
diff --git a/edje/src/lib/edje_callbacks.c b/edje/src/lib/edje_callbacks.c
index 66583aa..3e584dc 100644
--- a/edje/src/lib/edje_callbacks.c
+++ b/edje/src/lib/edje_callbacks.c
@@ -117,7 +117,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
}
ed->dirty = 1;
}
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
/*
_edje_thaw(ed);
_edje_unref(ed);
@@ -139,7 +139,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
_edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1;
rp->drag.need_reset = 1;
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
}
}
}
@@ -162,7 +162,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->clicked_button = ev->button;
rp->still_in = 1;
}
-// _edje_recalc(ed);
+// _edje_recalc_do(ed);
_edje_thaw(ed);
_edje_unref(ed);
return;
@@ -226,7 +226,7 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->clicked_button = 0;
rp->still_in = 0;
-// _edje_recalc(ed);
+// _edje_recalc_do(ed);
_edje_thaw(ed);
_edje_unref(ed);
return;
@@ -282,7 +282,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->drag.tmp.y = ev->cur.canvas.y - rp->drag.down.y;
ed->dirty = 1;
}
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
}
if ((rp->part->dragable.x) || (rp->part->dragable.y))
{
@@ -299,7 +299,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
if (!ignored)
_edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1;
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
}
}
}
diff --git a/edje/src/lib/edje_private.h b/edje/src/lib/edje_private.h
index a203fde..6183870 100644
--- a/edje/src/lib/edje_private.h
+++ b/edje/src/lib/edje_private.h
@@ -667,6 +667,7 @@ struct _Edje
unsigned short walking_actions : 1;
unsigned short block_break : 1;
unsigned short delete_me : 1;
+ unsigned short postponed : 1;
};
struct _Edje_Real_Part
@@ -1009,6 +1010,7 @@ void _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos);
Edje_Part_Description *_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name, double val);
void _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, double v1, const char *d2, double v2);
void _edje_recalc(Edje *ed);
+void _edje_recalc_do(Edje *ed);
int _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y);
void _edje_dragable_pos_set(Edje *ed, Edje_Real_Part *ep, double x, double y);
diff --git a/edje/src/lib/edje_program.c b/edje/src/lib/edje_program.c
index 3e778f2..d80ae38 100644
--- a/edje/src/lib/edje_program.c
+++ b/edje/src/lib/edje_program.c
@@ -749,7 +749,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
_edje_embryo_test_run(ed, fname, ssig, ssrc);
// _edje_emit(ed, "program,stop", pr->name);
if (_edje_block_break(ed)) goto break_prog;
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
}
else if (pr->action == EDJE_ACTION_TYPE_FOCUS_SET)
{
diff --git a/edje/src/lib/edje_smart.c b/edje/src/lib/edje_smart.c
index 5ddc26a..1cd5dc4 100644
--- a/edje/src/lib/edje_smart.c
+++ b/edje/src/lib/edje_smart.c
@@ -13,6 +13,7 @@ static void _edje_smart_hide(Evas_Object * obj);
static void _edje_smart_color_set(Evas_Object * obj, int r, int g, int b, int a);
static void _edje_smart_clip_set(Evas_Object * obj, Evas_Object * clip);
static void _edje_smart_clip_unset(Evas_Object * obj);
+static void _edje_smart_calculate(Evas_Object * obj);
static Evas_Smart *_edje_smart = NULL;
@@ -45,7 +46,7 @@ edje_object_add(Evas *evas)
_edje_smart_color_set,
_edje_smart_clip_set,
_edje_smart_clip_unset,
- NULL,
+ _edje_smart_calculate,
NULL,
NULL,
NULL
@@ -170,7 +171,7 @@ _edje_smart_resize(Evas_Object * obj, Evas_Coord w, Evas_Coord h)
}
// evas_object_resize(ed->clipper, ed->w, ed->h);
ed->dirty = 1;
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
_edje_emit(ed, "resize", NULL);
}
@@ -244,3 +245,13 @@ _edje_smart_clip_unset(Evas_Object * obj)
evas_object_clip_unset(ed->clipper);
// _edje_emit(ed, "clip_unset", NULL);
}
+
+static void
+_edje_smart_calculate(Evas_Object *obj)
+{
+ Edje *ed;
+
+ ed = evas_object_smart_data_get(obj);
+ if (!ed) return;
+ _edje_recalc_do(ed);
+}
diff --git a/edje/src/lib/edje_util.c b/edje/src/lib/edje_util.c
index 0044e75..7e419e7 100644
--- a/edje/src/lib/edje_util.c
+++ b/edje/src/lib/edje_util.c
@@ -75,7 +75,7 @@ _edje_thaw_edje(Edje *ed)
if (ed2) _edje_thaw_edje(ed2);
}
}
- if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc(ed);
+ if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
}
#endif
@@ -785,6 +785,10 @@ edje_object_part_object_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return NULL;
return rp->object;
@@ -818,6 +822,10 @@ edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coo
if (h) *h = 0;
return;
}
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@@ -904,6 +912,10 @@ edje_object_part_text_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return NULL;
if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
@@ -1051,6 +1063,10 @@ edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_sw
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return;
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return;
if (rp->part->type != EDJE_PART_TYPE_SWALLOW) return;
@@ -1189,7 +1205,7 @@ edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
rp->swallow_params.max.w = 0;
rp->swallow_params.max.h = 0;
rp->edje->dirty = 1;
- _edje_recalc(rp->edje);
+ _edje_recalc_do(rp->edje);
return;
}
}
@@ -1207,6 +1223,10 @@ edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return NULL;
return rp->swallowed_object;
@@ -1256,6 +1276,10 @@ edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *m
if (maxh) *maxh = 0;
return;
}
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
if (ed->collection->prop.max.w == 0)
{
/* XXX TODO: convert maxw to 0, fix things that break. */
@@ -1298,7 +1322,7 @@ edje_object_calc_force(Evas_Object *obj)
_edje_freeze_val = 0;
ed->freeze = 0;
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
ed->freeze = pf;
_edje_freeze_val = pf2;
@@ -1362,7 +1386,7 @@ edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Co
ok = 0;
ed->dirty = 1;
- _edje_recalc(ed);
+ _edje_recalc_do(ed);
if (reset_maxwh)
{
maxw = 0;
@@ -1466,6 +1490,10 @@ edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val
if (val_ret) *val_ret = 0;
return "";
}
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@@ -1510,6 +1538,10 @@ edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return EDJE_DRAG_DIR_NONE;
if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
@@ -1574,6 +1606,10 @@ edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double
if (dy) *dy = 0;
return;
}
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@@ -1639,6 +1675,10 @@ edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double
if (dh) *dh = 0;
return;
}
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@@ -1697,6 +1737,10 @@ edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double
if (dy) *dy = 0;
return;
}
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@@ -1755,6 +1799,10 @@ edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double
if (dy) *dy = 0;
return;
}
+
+ /* Need to recalc before providing the object. */
+ _edje_recalc_do(ed);
+
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel