On Mon, Aug 18, 2008 at 6:24 PM, Cedric BAIL <[EMAIL PROTECTED]> wrote:
> On Sat, Aug 16, 2008 at 3:15 AM, Jose Gonzalez <[EMAIL PROTECTED]> wrote:
>>     Just to make it clear what I think about this: This kind of thing is
>> something that really needs to be done, one way or another. :)
>>
>>     Some time back, I thought about having the edje recalc function called
>> by smart class render-pre/post funcs, and these funcs I wanted to be called
>> by the obj's internal render-pre/post ones as this would be useful for 
>> creating
>> semi-custom, stateful, objs that rendered to image buffers (possibly native
>> surfaces). But I saw that there were problems with that due to the very kinds
>> of things you mention, the events system and possibly other things, as I
>> mentioned to Cedric once here.
>>     You could have an additional smart class func, say a "calculate" one and
>> then do as you suggest.. but the main issue here is whether this kind of 
>> smart
>> class specific approach is the "best" way to deal with this kind of general
>> issue.
>>     I've mentioned two other possible ways to deal with this in a more 
>> generic
>> manner - for example an ecore_evas based one akin to what's done with 
>> sub-canvases
>> (which is useful for those), or a more 'evas only' one akin to what you have 
>> here
>> but using user supplied callbacks. There are other possibilities.. evas could
>> expose an EVAS_RENDER_EVENT and have callbacks one can add for such, called 
>> prior
>> to the internal evas-render loop... and other possibilities.
>
>>     I don't know what might be best.. just that this is something needed but
>> that needs more thought, some experimenting, etc. Maybe raster, nathan, 
>> hisham,
>> and others can give more feedback on this - maybe your proposal *is* the best
>> way to deal with this general issue, but it won't hurt to consider other 
>> possible
>> ways if they have potentially wider applicability. :)
>
> Ok, here is a patch that improve the speed for evas part of Gustavo
> work. I did rename the callback to calculate. Regarding if it's the
> best way, that I don't know, but it's easy to implement on both side
> and fast.
>
> Between the edje patch is currently not correct as many getter expect
> the underlying object to be calculated. If you apply the attached
> patch (not really a smart patch) you will see that many user of edje
> expect it to be calculated at some point.

And here is the edje patch. It did fix E17 use of edje and I didn't
see any problem. But please test this serie of patch against your own
apps as it could break things.

-- 
Cedric BAIL
diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c
index 005ca2b..131675f 100644
--- a/src/lib/edje_calc.c
+++ b/src/lib/edje_calc.c
@@ -136,13 +136,22 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
 void
 _edje_recalc(Edje *ed)
 {
+   if (ed->postponed) return ;
+   evas_object_smart_changed(ed->obj);
+   ed->postponed = 1;
+}
+
+void
+_edje_recalc_do(Edje *ed)
+{
    int i;
 
    if (!ed->dirty) return;
    if (ed->freeze)
      {
 	ed->recalc = 1;
-	if (!ed->calc_only) return;
+	if (!ed->calc_only &&
+	    !ed->postponed) return;
      }
    for (i = 0; i < ed->table_parts_size; i++)
      {
@@ -161,6 +170,7 @@ _edje_recalc(Edje *ed)
 	  _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY);
      }
    ed->dirty = 0;
+   ed->postponed = 0;
    if (!ed->calc_only) ed->recalc = 0;
 }
 
diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h
index 8d60b7e..edcd44d 100644
--- a/src/lib/edje_private.h
+++ b/src/lib/edje_private.h
@@ -681,6 +681,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
@@ -1007,6 +1008,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/src/lib/edje_smart.c b/src/lib/edje_smart.c
index b4f027f..16b73f3 100644
--- a/src/lib/edje_smart.c
+++ b/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,6 +46,7 @@ edje_object_add(Evas *evas)
 	       _edje_smart_color_set,
 	       _edje_smart_clip_set,
 	       _edje_smart_clip_unset,
+  	       _edje_smart_calculate,
 	       NULL
 	  };
 	_edje_smart = evas_smart_class_new(&sc);
@@ -237,3 +239,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/src/lib/edje_util.c b/src/lib/edje_util.c
index dd2971a..2854bc2 100644
--- a/src/lib/edje_util.c
+++ b/src/lib/edje_util.c
@@ -715,6 +715,10 @@ edje_object_part_object_get(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;
@@ -748,6 +752,10 @@ edje_object_part_geometry_get(Evas_Object *obj, const char *part, Evas_Coord *x,
 	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)
      {
@@ -828,6 +836,10 @@ edje_object_part_text_get(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->type == EDJE_PART_TYPE_TEXT)
@@ -855,6 +867,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;
@@ -1039,6 +1055,10 @@ edje_object_part_swallow_get(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;
@@ -1088,6 +1108,10 @@ edje_object_size_max_get(Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
 	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. */
@@ -1125,7 +1149,7 @@ edje_object_calc_force(Evas_Object *obj)
    ed->dirty = 1;
    pf = ed->freeze;
    ed->freeze = 0;
-   _edje_recalc(ed);
+   _edje_recalc_do(ed);
    ed->freeze = pf;
 }
 
@@ -1187,7 +1211,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;
@@ -1291,6 +1315,10 @@ edje_object_part_state_get(Evas_Object *obj, const char *part, double *val_ret)
 	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)
      {
@@ -1335,6 +1363,10 @@ edje_object_part_drag_dir_get(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;
@@ -1399,6 +1431,10 @@ edje_object_part_drag_value_get(Evas_Object *obj, const char *part, double *dx,
 	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)
      {
@@ -1464,6 +1500,10 @@ edje_object_part_drag_size_get(Evas_Object *obj, const char *part, double *dw, d
 	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)
      {
@@ -1522,6 +1562,10 @@ edje_object_part_drag_step_get(Evas_Object *obj, const char *part, double *dx, d
 	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)
      {
@@ -1580,6 +1624,10 @@ edje_object_part_drag_page_get(Evas_Object *obj, const char *part, double *dx, d
 	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

Reply via email to