From: <no-...@en...> - 2008-09-09 23:41:43
|
Author: barbieri Date: 2008-09-09 16:41:42 -0700 (Tue, 09 Sep 2008) New Revision: 35908 Modified: trunk/edje/src/lib/edje_calc.c trunk/edje/src/lib/edje_private.h trunk/edje/src/lib/edje_smart.c trunk/edje/src/lib/edje_util.c Log: Revert edje calculate optimizations. Edje is tricky, it's event processing is too weird and Cedric's changes to make it work are not working as expected. Edje freezes itself while processing signals, but in mouse down cb it forces recalculate, which seems was previously ignored, but now they are not. We should look at how to fix this and then re-apply this patch. Modified: trunk/edje/src/lib/edje_calc.c =================================================================== --- trunk/edje/src/lib/edje_calc.c 2008-09-09 21:24:23 UTC (rev 35907) +++ trunk/edje/src/lib/edje_calc.c 2008-09-09 23:41:42 UTC (rev 35908) @@ -136,22 +136,13 @@ 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 && - !ed->postponed) return; + if (!ed->calc_only) return; } for (i = 0; i < ed->table_parts_size; i++) { @@ -170,7 +161,6 @@ _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY); } ed->dirty = 0; - ed->postponed = 0; if (!ed->calc_only) ed->recalc = 0; } Modified: trunk/edje/src/lib/edje_private.h =================================================================== --- trunk/edje/src/lib/edje_private.h 2008-09-09 21:24:23 UTC (rev 35907) +++ trunk/edje/src/lib/edje_private.h 2008-09-09 23:41:42 UTC (rev 35908) @@ -682,7 +682,6 @@ unsigned short walking_actions : 1; unsigned short block_break : 1; unsigned short delete_me : 1; - unsigned short postponed : 1; }; struct _Edje_Real_Part @@ -1010,7 +1009,6 @@ 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); Modified: trunk/edje/src/lib/edje_smart.c =================================================================== --- trunk/edje/src/lib/edje_smart.c 2008-09-09 21:24:23 UTC (rev 35907) +++ trunk/edje/src/lib/edje_smart.c 2008-09-09 23:41:42 UTC (rev 35908) @@ -13,7 +13,6 @@ 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; @@ -46,7 +45,7 @@ _edje_smart_color_set, _edje_smart_clip_set, _edje_smart_clip_unset, - _edje_smart_calculate, + NULL, NULL }; _edje_smart = evas_smart_class_new(&sc); @@ -239,13 +238,3 @@ 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); -} Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2008-09-09 21:24:23 UTC (rev 35907) +++ trunk/edje/src/lib/edje_util.c 2008-09-09 23:41:42 UTC (rev 35908) @@ -735,10 +735,6 @@ 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; @@ -772,10 +768,6 @@ 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) { @@ -856,10 +848,6 @@ 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) @@ -887,10 +875,6 @@ 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; @@ -1057,7 +1041,7 @@ rp->swallow_params.max.w = 0; rp->swallow_params.max.h = 0; rp->edje->dirty = 1; - _edje_recalc_do(rp->edje); + _edje_recalc(rp->edje); return; } } @@ -1075,10 +1059,6 @@ 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; @@ -1128,10 +1108,6 @@ 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. */ @@ -1169,7 +1145,7 @@ ed->dirty = 1; pf = ed->freeze; ed->freeze = 0; - _edje_recalc_do(ed); + _edje_recalc(ed); ed->freeze = pf; } @@ -1231,7 +1207,7 @@ ok = 0; ed->dirty = 1; - _edje_recalc_do(ed); + _edje_recalc(ed); if (reset_maxwh) { maxw = 0; @@ -1335,10 +1311,6 @@ 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) { @@ -1383,10 +1355,6 @@ 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; @@ -1451,10 +1419,6 @@ 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) { @@ -1520,10 +1484,6 @@ 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) { @@ -1582,10 +1542,6 @@ 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) { @@ -1644,10 +1600,6 @@ 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) { @@ -2165,5 +2117,5 @@ evas_object_precise_is_inside_set(obj_swallow, 1); rp->edje->dirty = 1; - _edje_recalc_do(rp->edje); + _edje_recalc(rp->edje); } |
From: Enlightenment S. <no-...@en...> - 2008-09-16 18:50:18
|
Author: barbieri Date: 2008-09-16 18:50:16 -0700 (Tue, 16 Sep 2008) New Revision: 36031 Log: Revert edje_smart_calculate_v4_r2, it breaks e17 shelf resize. Not ready yet, reverting... Modified: trunk/edje/src/lib/edje_calc.c trunk/edje/src/lib/edje_callbacks.c trunk/edje/src/lib/edje_private.h trunk/edje/src/lib/edje_program.c trunk/edje/src/lib/edje_smart.c trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/edje_calc.c =================================================================== --- trunk/edje/src/lib/edje_calc.c 2008-09-17 01:40:57 UTC (rev 36030) +++ trunk/edje/src/lib/edje_calc.c 2008-09-17 01:50:16 UTC (rev 36031) @@ -136,14 +136,6 @@ 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) @@ -176,7 +168,6 @@ _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY); } ed->dirty = 0; - ed->postponed = 0; if (!ed->calc_only) ed->recalc = 0; } Modified: trunk/edje/src/lib/edje_callbacks.c =================================================================== --- trunk/edje/src/lib/edje_callbacks.c 2008-09-17 01:40:57 UTC (rev 36030) +++ trunk/edje/src/lib/edje_callbacks.c 2008-09-17 01:50:16 UTC (rev 36031) @@ -119,7 +119,7 @@ } ed->dirty = 1; } - _edje_recalc_do(ed); + _edje_recalc(ed); /* _edje_thaw(ed); _edje_unref(ed); @@ -141,7 +141,7 @@ _edje_emit(ed, "drag", rp->part->name); ed->dirty = 1; rp->drag.need_reset = 1; - _edje_recalc_do(ed); + _edje_recalc(ed); } } } @@ -164,7 +164,7 @@ rp->clicked_button = ev->button; rp->still_in = 1; } -// _edje_recalc_do(ed); +// _edje_recalc(ed); _edje_thaw(ed); _edje_unref(ed); return; @@ -228,7 +228,7 @@ rp->clicked_button = 0; rp->still_in = 0; -// _edje_recalc_do(ed); +// _edje_recalc(ed); _edje_thaw(ed); _edje_unref(ed); return; @@ -284,7 +284,7 @@ rp->drag.tmp.y = ev->cur.canvas.y - rp->drag.down.y; ed->dirty = 1; } - _edje_recalc_do(ed); + _edje_recalc(ed); } if ((rp->part->dragable.x) || (rp->part->dragable.y)) { @@ -301,7 +301,7 @@ if (!ignored) _edje_emit(ed, "drag", rp->part->name); ed->dirty = 1; - _edje_recalc_do(ed); + _edje_recalc(ed); } } } Modified: trunk/edje/src/lib/edje_private.h =================================================================== --- trunk/edje/src/lib/edje_private.h 2008-09-17 01:40:57 UTC (rev 36030) +++ trunk/edje/src/lib/edje_private.h 2008-09-17 01:50:16 UTC (rev 36031) @@ -676,7 +676,6 @@ unsigned short walking_actions : 1; unsigned short block_break : 1; unsigned short delete_me : 1; - unsigned short postponed : 1; }; struct _Edje_Real_Part @@ -1006,7 +1005,6 @@ 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); Modified: trunk/edje/src/lib/edje_program.c =================================================================== --- trunk/edje/src/lib/edje_program.c 2008-09-17 01:40:57 UTC (rev 36030) +++ trunk/edje/src/lib/edje_program.c 2008-09-17 01:50:16 UTC (rev 36031) @@ -783,7 +783,7 @@ _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_do(ed); + _edje_recalc(ed); } else { Modified: trunk/edje/src/lib/edje_smart.c =================================================================== --- trunk/edje/src/lib/edje_smart.c 2008-09-17 01:40:57 UTC (rev 36030) +++ trunk/edje/src/lib/edje_smart.c 2008-09-17 01:50:16 UTC (rev 36031) @@ -13,7 +13,6 @@ 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; @@ -46,7 +45,7 @@ _edje_smart_color_set, _edje_smart_clip_set, _edje_smart_clip_unset, - _edje_smart_calculate, + NULL, NULL }; _edje_smart = evas_smart_class_new(&sc); @@ -239,13 +238,3 @@ 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); -} Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2008-09-17 01:40:57 UTC (rev 36030) +++ trunk/edje/src/lib/edje_util.c 2008-09-17 01:50:16 UTC (rev 36031) @@ -787,10 +787,6 @@ 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; @@ -824,10 +820,6 @@ 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) { @@ -908,10 +900,6 @@ 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) @@ -939,10 +927,6 @@ 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; @@ -1109,7 +1093,7 @@ rp->swallow_params.max.w = 0; rp->swallow_params.max.h = 0; rp->edje->dirty = 1; - _edje_recalc_do(rp->edje); + _edje_recalc(rp->edje); return; } } @@ -1127,10 +1111,6 @@ 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; @@ -1180,10 +1160,6 @@ 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. */ @@ -1226,7 +1202,7 @@ _edje_freeze_val = 0; ed->freeze = 0; - _edje_recalc_do(ed); + _edje_recalc(ed); ed->freeze = pf; _edje_freeze_val = pf2; @@ -1290,7 +1266,7 @@ ok = 0; ed->dirty = 1; - _edje_recalc_do(ed); + _edje_recalc(ed); if (reset_maxwh) { maxw = 0; @@ -1394,10 +1370,6 @@ 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) { @@ -1442,10 +1414,6 @@ 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; @@ -1510,10 +1478,6 @@ 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) { @@ -1579,10 +1543,6 @@ 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) { @@ -1641,10 +1601,6 @@ 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) { @@ -1703,10 +1659,6 @@ 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) { @@ -2224,5 +2176,5 @@ evas_object_precise_is_inside_set(obj_swallow, 1); rp->edje->dirty = 1; - _edje_recalc_do(rp->edje); + _edje_recalc(rp->edje); } |
From: Enlightenment S. <no-...@en...> - 2008-10-25 02:58:40
|
Log: Set member_{add,del} to NULL. Author: barbieri Date: 2008-10-24 19:58:30 -0700 (Fri, 24 Oct 2008) New Revision: 37087 Modified: trunk/edje/src/lib/edje_container.c trunk/edje/src/lib/edje_smart.c Modified: trunk/edje/src/lib/edje_container.c =================================================================== --- trunk/edje/src/lib/edje_container.c 2008-10-25 02:57:03 UTC (rev 37086) +++ trunk/edje/src/lib/edje_container.c 2008-10-25 02:58:30 UTC (rev 37087) @@ -761,6 +761,8 @@ _smart_color_set, _smart_clip_set, _smart_clip_unset, + NULL, + NULL, NULL }; smart = evas_smart_class_new(&sc); Modified: trunk/edje/src/lib/edje_smart.c =================================================================== --- trunk/edje/src/lib/edje_smart.c 2008-10-25 02:57:03 UTC (rev 37086) +++ trunk/edje/src/lib/edje_smart.c 2008-10-25 02:58:30 UTC (rev 37087) @@ -46,6 +46,8 @@ _edje_smart_clip_set, _edje_smart_clip_unset, NULL, + NULL, + NULL, NULL }; _edje_smart = evas_smart_class_new(&sc); |
From: Enlightenment S. <no-...@en...> - 2008-11-05 16:08:47
|
Log: for some reason this was being NULL to me. it was crashing on group changing. Author: barbieri Date: 2008-11-05 08:08:39 -0800 (Wed, 05 Nov 2008) New Revision: 37473 Modified: trunk/edje/src/lib/edje_edit.c Modified: trunk/edje/src/lib/edje_edit.c =================================================================== --- trunk/edje/src/lib/edje_edit.c 2008-11-05 12:41:43 UTC (rev 37472) +++ trunk/edje/src/lib/edje_edit.c 2008-11-05 16:08:39 UTC (rev 37473) @@ -4109,7 +4109,7 @@ for (i = 0; i < ed->table_programs_size; i++) { epr = ed->table_programs[i]; - if (strcmp(epr->name, prog_name) == 0) + if ((epr->name) && (strcmp(epr->name, prog_name) == 0)) return epr; } return NULL; |
From: Enlightenment S. <no-...@en...> - 2008-12-05 22:32:09
|
Log: Hopefully fix some problems with Edje fnmatch and callbacks. * Fix buffer overflow with EDJE_PROGRAM_CACHE (not tested since I don't use it). * break_prog should always unset walking_callbacks and do after-tasks. * Fix list walking! ouch!!! Author: barbieri Date: 2008-12-05 14:32:04 -0800 (Fri, 05 Dec 2008) New Revision: 37944 Modified: trunk/edje/src/lib/edje_program.c Modified: trunk/edje/src/lib/edje_program.c =================================================================== --- trunk/edje/src/lib/edje_program.c 2008-12-05 21:10:50 UTC (rev 37943) +++ trunk/edje/src/lib/edje_program.c 2008-12-05 22:32:04 UTC (rev 37944) @@ -885,7 +885,8 @@ { Edje_Signals_Sources_Patterns *ssp = &ed->patterns.callbacks; - if (ssp->signals_patterns) + if ((ssp->signals_patterns) || (ssp->sources_patterns) || + (ssp->globing) || (ssp->exact_match)) return; ssp->globing = edje_match_callback_hash_build(ed->callbacks, @@ -919,7 +920,7 @@ #ifdef EDJE_PROGRAM_CACHE l1 = strlen(sig); l2 = strlen(src); - tmps = alloca(l1 + l2 + 2); + tmps = alloca(l1 + l2 + 3); /* \0, \337, \0 */ strcpy(tmps, sig); tmps[l1] = '\377'; strcpy(&(tmps[l1 + 1]), src); @@ -1052,19 +1053,19 @@ goto break_prog; } } + break_prog: ed->walking_callbacks = 0; if ((ed->delete_callbacks) || (ed->just_added_callbacks)) { - Edje_Signal_Callback *escb; - ed->delete_callbacks = 0; ed->just_added_callbacks = 0; - EINA_LIST_FOREACH(ed->callbacks, l, escb) + l = ed->callbacks; + while (l) { - Eina_List *next_l; + Edje_Signal_Callback *escb = l->data; + Eina_List *next_l = l->next; - next_l = eina_list_next(l); if (escb->just_added) escb->just_added = 0; if (escb->delete_me) @@ -1079,7 +1080,6 @@ _edje_callbacks_patterns_clean(ed); } - break_prog: _edje_unblock(ed); _edje_thaw(ed); _edje_unref(ed); |
From: Enlightenment S. <no-...@en...> - 2008-12-06 02:09:25
|
Log: fix list iteration and removal inside edje box. maybe we should add EINA_LIST_FOREACH_SAFE? Author: barbieri Date: 2008-12-05 17:44:01 -0800 (Fri, 05 Dec 2008) New Revision: 37947 Modified: trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2008-12-05 22:56:33 UTC (rev 37946) +++ trunk/edje/src/lib/edje_util.c 2008-12-06 01:44:01 UTC (rev 37947) @@ -2419,18 +2419,19 @@ Evas_Bool _edje_real_part_box_remove_all(Edje_Real_Part *rp, Evas_Bool clear) { - Evas_Object_Box_Option *opt; Evas_Object_Box_Data *priv; - Eina_List *l; + Eina_List *l, *l_next; int i; if (eina_list_count(rp->items) == 0) return evas_object_box_remove_all(rp->object, clear); priv = evas_object_smart_data_get(rp->object); i = 0; - EINA_LIST_FOREACH(priv->children, l, opt) + for (l = priv->children; l != NULL; l = l_next) { + Evas_Object_Box_Option *opt = l->data; Evas_Object *child_obj; + l_next = l->next; child_obj = opt->obj; if (evas_object_data_get(child_obj, "\377 edje.box_item")) { |
From: Enlightenment S. <no-...@en...> - 2008-12-14 16:30:39
|
Log: try to avoid infinite recalc loop. as reported, elicity triggers an infinite loop by calling edje_object_part_geometry_get(), which in turns calls _edje_recalc_do() which in turns calls the elicit code that requests edje_object_part_geometry_get() and since it's still marked as "dirty", it enters the loop... the real fix is just the move of ed->dirty = 0; before calling recalcs, but I also unmarked object as need_recalculate so we can even avoid requesting object to recalculate from evas. Author: barbieri Date: 2008-12-14 08:30:29 -0800 (Sun, 14 Dec 2008) New Revision: 38139 Modified: trunk/edje/src/lib/edje_calc.c Modified: trunk/edje/src/lib/edje_calc.c =================================================================== --- trunk/edje/src/lib/edje_calc.c 2008-12-14 15:14:04 UTC (rev 38138) +++ trunk/edje/src/lib/edje_calc.c 2008-12-14 16:30:29 UTC (rev 38139) @@ -157,10 +157,12 @@ int i; ed->postponed = 0; + evas_object_smart_need_recalculate_set(ed->obj, 0); if (!ed->dirty) { return; } + ed->dirty = 0; for (i = 0; i < ed->table_parts_size; i++) { Edje_Real_Part *ep; @@ -178,7 +180,6 @@ _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY); } if (!ed->calc_only) ed->recalc = 0; - ed->dirty = 0; ed->calc_only = 0; } |
From: Enlightenment S. <no-...@en...> - 2008-12-21 02:17:33
|
Log: force recalc after set_tween_state(). Author: barbieri Date: 2008-12-20 18:17:31 -0800 (Sat, 20 Dec 2008) New Revision: 38258 Modified: trunk/edje/src/lib/edje_embryo.c Modified: trunk/edje/src/lib/edje_embryo.c =================================================================== --- trunk/edje/src/lib/edje_embryo.c 2008-12-21 02:09:37 UTC (rev 38257) +++ trunk/edje/src/lib/edje_embryo.c 2008-12-21 02:17:31 UTC (rev 38258) @@ -902,6 +902,7 @@ if (rp->program) _edje_program_end(ed, rp->program); _edje_part_description_apply(ed, rp, state1, value1, state2, value2); _edje_part_pos_set(ed, rp, EDJE_TWEEN_MODE_LINEAR, tween); + _edje_recalc(ed); } return 0; } |
From: Enlightenment S. <no-...@en...> - 2008-12-21 18:39:40
|
Log: edjeL convert error code to string. Author: barbieri Date: 2008-12-21 10:39:36 -0800 (Sun, 21 Dec 2008) New Revision: 38268 Modified: trunk/edje/src/lib/Edje.h trunk/edje/src/lib/edje_load.c Modified: trunk/edje/src/lib/Edje.h =================================================================== --- trunk/edje/src/lib/Edje.h 2008-12-21 18:19:33 UTC (rev 38267) +++ trunk/edje/src/lib/Edje.h 2008-12-21 18:39:36 UTC (rev 38268) @@ -217,6 +217,7 @@ EAPI int edje_object_file_set (Evas_Object *obj, const char *file, const char *group); EAPI void edje_object_file_get (const Evas_Object *obj, const char **file, const char **group); EAPI int edje_object_load_error_get (const Evas_Object *obj); + EAPI const char *edje_load_error_str (int error); /* edje_program.c */ EAPI void edje_object_signal_callback_add (Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *obj, const char *emission, const char *source), void *data); Modified: trunk/edje/src/lib/edje_load.c =================================================================== --- trunk/edje/src/lib/edje_load.c 2008-12-21 18:19:33 UTC (rev 38267) +++ trunk/edje/src/lib/edje_load.c 2008-12-21 18:39:36 UTC (rev 38268) @@ -91,6 +91,37 @@ return ed->load_error; } +EAPI const char * +edje_load_error_str(int error) +{ + switch (error) + { + case EDJE_LOAD_ERROR_NONE: + return "No Error"; + case EDJE_LOAD_ERROR_GENERIC: + return "Generic Error"; + case EDJE_LOAD_ERROR_DOES_NOT_EXIST: + return "File Does Not Exist"; + case EDJE_LOAD_ERROR_PERMISSION_DENIED: + return "Permission Denied"; + case EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED: + return "Resource Allocation Failed"; + case EDJE_LOAD_ERROR_CORRUPT_FILE: + return "Corrupt File"; + case EDJE_LOAD_ERROR_UNKNOWN_FORMAT: + return "Unknown Format"; + case EDJE_LOAD_ERROR_INCOMPATIBLE_FILE: + return "Incompatible File"; + case EDJE_LOAD_ERROR_UNKNOWN_COLLECTION: + return "Unknown Collection"; + case EDJE_LOAD_ERROR_RECURSIVE_REFERENCE: + return "Recursive Reference"; + default: + return "Unknown Error"; + } +} + + /** Get a list of groups in an edje file * @param file The path to the edje file * |
From: Enlightenment S. <no-...@en...> - 2009-01-21 22:38:55
|
Log: Let's see if this edje forced recalc is really required. Author: barbieri Date: 2009-01-21 14:38:52 -0800 (Wed, 21 Jan 2009) New Revision: 38689 Modified: trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2009-01-21 20:25:45 UTC (rev 38688) +++ trunk/edje/src/lib/edje_util.c 2009-01-21 22:38:52 UTC (rev 38689) @@ -1101,7 +1101,10 @@ if ((!ed) || (!part)) return; /* Need to recalc before providing the object. */ - _edje_recalc_do(ed); + // XXX: I guess this is not required, removing for testing purposes + // XXX: uncomment if you see glitches in e17 or others. + // XXX: by Gustavo, January 21th 2009. + //_edje_recalc_do(ed); rp = _edje_real_part_recursive_get(ed, (char *)part); if (!rp) return; |
From: Enlightenment S. <no-...@en...> - 2009-02-05 18:15:37
|
Log: Interpolate text font size. Often requested for animations that want to grow or shrink text quickly. This is a faster alternative to using geometry with rel1/rel2 and "text.fit: 1 1;" since it does not need to figure out which size fits better into that object. I tested and it does not seem to introduce any regression. Also checked with scale and text_class variations. Author: barbieri Date: 2009-02-05 10:15:34 -0800 (Thu, 05 Feb 2009) New Revision: 38958 Modified: trunk/edje/src/lib/edje_calc.c trunk/edje/src/lib/edje_private.h trunk/edje/src/lib/edje_text.c Modified: trunk/edje/src/lib/edje_calc.c =================================================================== --- trunk/edje/src/lib/edje_calc.c 2009-02-05 17:35:48 UTC (rev 38957) +++ trunk/edje/src/lib/edje_calc.c 2009-02-05 18:15:34 UTC (rev 38958) @@ -867,6 +867,18 @@ } if (sfont) free(sfont); } + + if (ep->part->type == EDJE_PART_TYPE_TEXT) + { + const char *font; + char *sfont = NULL; + int size; + + font = _edje_text_class_font_get(ed, desc, &size, &sfont); + free(sfont); + params->text.size = size; + } + /* rememebr what our size is BEFORE we go limit it */ params->req.x = params->x; params->req.y = params->y; @@ -1469,6 +1481,7 @@ } break; case EDJE_PART_TYPE_TEXT: + p3.text.size = INTP(p1.text.size, p2.text.size, pos); case EDJE_PART_TYPE_TEXTBLOCK: p3.color2.r = INTP(p1.color2.r, p2.color2.r, pos); p3.color2.g = INTP(p1.color2.g, p2.color2.g, pos); Modified: trunk/edje/src/lib/edje_private.h =================================================================== --- trunk/edje/src/lib/edje_private.h 2009-02-05 17:35:48 UTC (rev 38957) +++ trunk/edje/src/lib/edje_private.h 2009-02-05 18:15:34 UTC (rev 38958) @@ -823,6 +823,7 @@ struct { Edje_Alignment align; /* text alignment within bounds */ double elipsis; + int size; } text; struct { int id; Modified: trunk/edje/src/lib/edje_text.c =================================================================== --- trunk/edje/src/lib/edje_text.c 2009-02-05 17:35:48 UTC (rev 38957) +++ trunk/edje/src/lib/edje_text.c 2009-02-05 18:15:34 UTC (rev 38958) @@ -392,6 +392,9 @@ sw = params->w; sh = params->h; } + + size = params->text.size; + if ((ep->text.cache.in_size == size) && (ep->text.cache.in_w == sw) && (ep->text.cache.in_h == sh) && |
From: Enlightenment S. <no-...@en...> - 2009-03-18 21:27:43
|
Log: Fix null dereference. By Luis Felipe Strano, spotted by clang. Author: barbieri Date: 2009-03-18 14:27:38 -0700 (Wed, 18 Mar 2009) New Revision: 39560 Modified: trunk/edje/src/lib/edje_entry.c Modified: trunk/edje/src/lib/edje_entry.c =================================================================== --- trunk/edje/src/lib/edje_entry.c 2009-03-18 21:26:00 UTC (rev 39559) +++ trunk/edje/src/lib/edje_entry.c 2009-03-18 21:27:38 UTC (rev 39560) @@ -307,6 +307,8 @@ clip = evas_object_clip_get(o); if (en->sel_start) range = evas_textblock_cursor_range_geometry_get(en->sel_start, en->sel_end); + else + return; if (eina_list_count(range) != eina_list_count(en->sel)) { while (en->sel) |
From: Enlightenment S. <no-...@en...> - 2009-04-14 23:53:32
|
Log: edje now handles escape/unescape automatically for textblock. these two new calls will escape the unescaped text if required, will unescape when get is called. Also I fixed edje_object_part_text_get() on non-editable TEXTBLOCK, now it will return the text with markup. Author: barbieri Date: 2009-04-14 16:53:25 -0700 (Tue, 14 Apr 2009) New Revision: 40066 Modified: trunk/edje/src/lib/Edje.h trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/Edje.h =================================================================== --- trunk/edje/src/lib/Edje.h 2009-04-14 23:51:43 UTC (rev 40065) +++ trunk/edje/src/lib/Edje.h 2009-04-14 23:53:25 UTC (rev 40066) @@ -247,6 +247,9 @@ EAPI void edje_object_text_change_cb_set (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, const char *part), void *data); EAPI void edje_object_part_text_set (Evas_Object *obj, const char *part, const char *text); EAPI const char *edje_object_part_text_get (const Evas_Object *obj, const char *part); + EAPI void edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape); + EAPI char *edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part); + EAPI const char *edje_object_part_text_selection_get(const Evas_Object *obj, const char *part); EAPI void edje_object_part_text_select_none(const Evas_Object *obj, const char *part); EAPI void edje_object_part_text_select_all(const Evas_Object *obj, const char *part); Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2009-04-14 23:51:43 UTC (rev 40065) +++ trunk/edje/src/lib/edje_util.c 2009-04-14 23:53:25 UTC (rev 40066) @@ -884,23 +884,9 @@ } } -/** Sets the text for an object part - * @param obj A valid Evas Object handle - * @param part The part name - * @param text The text string - */ -EAPI void -edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text) +static void +_edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text) { - Edje *ed; - Edje_Real_Part *rp; - - ed = _edje_fetch(obj); - if ((!ed) || (!part)) return; - rp = _edje_real_part_recursive_get(ed, (char *)part); - if (!rp) return; - if ((rp->part->type != EDJE_PART_TYPE_TEXT) && - (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return; if ((!rp->text.text) && (!text)) return; if ((rp->text.text) && (text) && @@ -921,6 +907,26 @@ rp->edje->text_change.func(rp->edje->text_change.data, obj, part); } +/** Sets the text for an object part + * @param obj A valid Evas Object handle + * @param part The part name + * @param text The text string + */ +EAPI void +edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text) +{ + Edje *ed; + Edje_Real_Part *rp; + + ed = _edje_fetch(obj); + if ((!ed) || (!part)) return; + rp = _edje_real_part_recursive_get(ed, (char *)part); + if (!rp) return; + if ((rp->part->type != EDJE_PART_TYPE_TEXT) && + (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return; + _edje_object_part_text_raw_set(obj, rp, part, text); +} + /** Returns the text of the object part * @param obj A valid Evas_Object handle * @param part The part name @@ -945,10 +951,228 @@ else { if (rp->part->type == EDJE_PART_TYPE_TEXT) return rp->text.text; + if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) + return evas_object_textblock_text_markup_get(rp->object); } return NULL; } +static Eina_Bool +_edje_strbuf_append(char **p_str, size_t *allocated, size_t *used, const char *news, size_t news_len) +{ + if (*used + news_len >= *allocated) + { + char *tmp; + size_t to_allocate = ((((*used + news_len) >> 4) + 1) << 4); + tmp = realloc(*p_str, to_allocate); + if (!tmp) + { + free(*p_str); + *p_str = NULL; + *allocated = 0; + return 0; + } + + *p_str = tmp; + *allocated = to_allocate; + } + + memcpy(*p_str + *used, news, news_len); + *used = *used + news_len; + return 1; +} + +static char * +_edje_text_escape(const char *text) +{ + char *ret; + const char *text_end; + size_t text_len, ret_len, used; + + if (!text) return NULL; + + text_len = strlen(text); + ret_len = (((text_len >> 4) + 1) << 4); /* rough guess */ + ret = malloc(ret_len); + if (!ret) return NULL; + + text_end = text + text_len; + used = 0; + while (text < text_end) + { + int advance, escaped_len; + const char *escaped = evas_textblock_string_escape_get(text, &advance); + if (!escaped) + { + escaped = text; + escaped_len = 1; + advance = 1; + } + else + escaped_len = strlen(escaped); + + if (!_edje_strbuf_append(&ret, &ret_len, &used, escaped, escaped_len)) + return NULL; + text += advance; + } + + if (!_edje_strbuf_append(&ret, &ret_len, &used, "", 1)) + return NULL; + return ret; +} + +static char * +_edje_text_unescape(const char *text) +{ + char *ret; + const char *text_end, *last, *escape_start; + size_t text_len, ret_len, used; + + if (!text) return NULL; + + text_len = strlen(text); + ret_len = text_len; + ret = malloc(ret_len); + if (!ret) return NULL; + + text_end = text + text_len; + used = 0; + last = text; + escape_start = NULL; + for (; text < text_end; text++) + { + if (*text == '&') + { + size_t len; + const char *str; + if (last) + { + len = text - last; + str = last; + } + else + { + len = text - escape_start; + str = escape_start; + } + + if (len > 0) + { + if (!_edje_strbuf_append(&ret, &ret_len, &used, str, len)) + return NULL; + } + + escape_start = text; + last = NULL; + } + else if ((*text == ';') && (escape_start)) + { + size_t len; + const char *str = evas_textblock_escape_string_range_get + (escape_start, text); + if (str) + len = strlen(str); + else + { + str = escape_start; + len = text + 1 - escape_start; + } + + if (!_edje_strbuf_append(&ret, &ret_len, &used, str, len)) + return NULL; + + escape_start = NULL; + last = text + 1; + } + } + + if (!last && escape_start) + last = escape_start; + + if (last && (text > last)) + { + size_t len = text - last; + if (!_edje_strbuf_append(&ret, &ret_len, &used, last, len)) + return NULL; + } + + if (!_edje_strbuf_append(&ret, &ret_len, &used, "", 1)) + return NULL; + return ret; +} + +/** Sets the raw (non escaped) text for an object part. + * + * This will do escape for you if it is a TEXTBLOCK part, that is, if + * text contain tags, these tags will not be interpreted/parsed by + * TEXTBLOCK. + * + * @param obj A valid Evas Object handle + * @param part The part name + * @param text The text string + */ +EAPI void +edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape) +{ + Edje *ed; + Edje_Real_Part *rp; + + ed = _edje_fetch(obj); + if ((!ed) || (!part)) return; + rp = _edje_real_part_recursive_get(ed, part); + if (!rp) return; + if (rp->part->type == EDJE_PART_TYPE_TEXT) + _edje_object_part_text_raw_set(obj, rp, part, text_to_escape); + else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) + { + char *text = _edje_text_escape(text_to_escape); + _edje_object_part_text_raw_set(obj, rp, part, text); + free(text); + } +} + +/** Returns the text of the object part, without escaping. + * + * Counterpart of edje_object_part_text_unescaped_set(). Please notice + * that the result is newly allocated memory and should be released + * with free() when done. + * + * @param obj A valid Evas_Object handle + * @param part The part name + * @return The @b allocated text string without escaping, or NULL on problems. + */ +EAPI char * +edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part) +{ + Edje *ed; + Edje_Real_Part *rp; + + 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) + { + const char *t = _edje_entry_text_get(rp); + return _edje_text_unescape(t); + } + else + { + if (rp->part->type == EDJE_PART_TYPE_TEXT) return strdup(rp->text.text); + if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK) + { + const char *t = evas_object_textblock_text_markup_get(rp->object); + return _edje_text_unescape(t); + } + } + return NULL; +} + + /** Returns the selection text of the object part * @param obj A valid Evas_Object handle * @param part The part name |
From: Enlightenment S. <no-...@en...> - 2009-04-27 02:37:09
|
Log: recalculate table if it is dirty. Author: barbieri Date: 2009-04-26 19:36:56 -0700 (Sun, 26 Apr 2009) New Revision: 40407 Modified: trunk/edje/src/lib/edje_calc.c Modified: trunk/edje/src/lib/edje_calc.c =================================================================== --- trunk/edje/src/lib/edje_calc.c 2009-04-27 01:29:02 UTC (rev 40406) +++ trunk/edje/src/lib/edje_calc.c 2009-04-27 02:36:56 UTC (rev 40407) @@ -1254,6 +1254,11 @@ evas_object_table_homogeneous_set(ep->object, chosen_desc->table.homogeneous); evas_object_table_align_set(ep->object, chosen_desc->table.align.x, chosen_desc->table.align.y); evas_object_table_padding_set(ep->object, chosen_desc->table.padding.x, chosen_desc->table.padding.y); + if (evas_object_smart_need_recalculate_get(ep->object)) + { + evas_object_smart_need_recalculate_set(ep->object, 0); + evas_object_smart_calculate(ep->object); + } } static void |
From: Enlightenment S. <no-...@en...> - 2009-04-27 02:38:21
|
Log: mark edje as dirty if box/table children changed. This should help to fix bugs with systray. Author: barbieri Date: 2009-04-26 19:38:14 -0700 (Sun, 26 Apr 2009) New Revision: 40408 Modified: trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2009-04-27 02:36:56 UTC (rev 40407) +++ trunk/edje/src/lib/edje_util.c 2009-04-27 02:38:14 UTC (rev 40408) @@ -2617,6 +2617,34 @@ } +static void +_edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__) +{ + Edje_Real_Part *rp = data; + rp->edje->dirty = 1; + _edje_recalc(rp->edje); +} + +static void +_edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child) +{ + evas_object_event_callback_add + (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp); + + rp->edje->dirty = 1; + _edje_recalc(rp->edje); +} + +static void +_edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child) +{ + evas_object_event_callback_del_full + (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp); + + rp->edje->dirty = 1; + _edje_recalc(rp->edje); +} + Evas_Bool _edje_real_part_box_append(Edje_Real_Part *rp, Evas_Object *child_obj) { @@ -2625,6 +2653,8 @@ opt = evas_object_box_append(rp->object, child_obj); if (!opt) return 0; + _edje_box_child_add(rp, child_obj); + return 1; } @@ -2636,6 +2666,8 @@ opt = evas_object_box_prepend(rp->object, child_obj); if (!opt) return 0; + _edje_box_child_add(rp, child_obj); + return 1; } @@ -2647,6 +2679,8 @@ opt = evas_object_box_insert_before(rp->object, child_obj, ref); if (!opt) return 0; + _edje_box_child_add(rp, child_obj); + return 1; } @@ -2658,6 +2692,8 @@ opt = evas_object_box_insert_at(rp->object, child_obj, pos); if (!opt) return 0; + _edje_box_child_add(rp, child_obj); + return 1; } @@ -2665,9 +2701,9 @@ _edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj) { if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL; - if (evas_object_box_remove(rp->object, child_obj)) - return child_obj; - return NULL; + if (!evas_object_box_remove(rp->object, child_obj)) return NULL; + _edje_box_child_remove(rp, child_obj); + return child_obj; } Evas_Object * @@ -2682,9 +2718,9 @@ if (!opt) return NULL; child_obj = opt->obj; if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL; - if (evas_object_box_remove_at(rp->object, pos)) - return child_obj; - return NULL; + if (!evas_object_box_remove_at(rp->object, pos)) return NULL; + _edje_box_child_remove(rp, child_obj); + return child_obj; } Evas_Bool @@ -2693,13 +2729,12 @@ Eina_List *children; int i; - if (eina_list_count(rp->items) == 0) - return evas_object_box_remove_all(rp->object, clear); i = 0; children = evas_object_box_children_get(rp->object); while (children) { Evas_Object *child_obj = children->data; + _edje_box_child_remove(rp, child_obj); if (evas_object_data_get(child_obj, "\377 edje.box_item")) i++; else @@ -2714,6 +2749,34 @@ return 1; } +static void +_edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__) +{ + Edje_Real_Part *rp = data; + rp->edje->dirty = 1; + _edje_recalc(rp->edje); +} + +static void +_edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child) +{ + evas_object_event_callback_add + (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp); + + rp->edje->dirty = 1; + _edje_recalc(rp->edje); +} + +static void +_edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child) +{ + evas_object_event_callback_del_full + (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp); + + rp->edje->dirty = 1; + _edje_recalc(rp->edje); +} + /** Packs an object into the table * @param obj A valid Evas_Object handle * @param part The part name @@ -2829,13 +2892,22 @@ Evas_Bool _edje_real_part_table_pack(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan) { - return evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan); + Evas_Bool ret = evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan); + + _edje_table_child_add(rp, child_obj); + + return ret; } Evas_Bool _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj) { - return evas_object_table_unpack(rp->object, child_obj); + Evas_Bool ret = evas_object_table_unpack(rp->object, child_obj); + + if (ret) + _edje_table_child_remove(rp, child_obj); + + return ret; } void @@ -2843,15 +2915,11 @@ { Eina_List *children; - if (eina_list_count(rp->items) == 0) - { - evas_object_table_clear(rp->object, clear); - return; - } children = evas_object_table_children_get(rp->object); while (children) { Evas_Object *child_obj = children->data; + _edje_table_child_remove(rp, child_obj); if (!evas_object_data_get(child_obj, "\377 edje.table_item")) { evas_object_table_unpack(rp->object, child_obj); |
From: Enlightenment S. <no-...@en...> - 2009-05-02 20:06:05
|
Log: Allow sending signals to GROUP sub-parts. Today signals emitted inside GROUP sub-parts are delivered to parent group as "part-name:original-source". This is good and allow edje groups to be reused. But no counter part to send events to inside sub-groups existed. This patch allows one to send a signal "signal" to inside a part "part" that is of type GROUP by prepending signal emission with part name: emission: "part:signal" source: "source" this is the same as: o = edje_object_part_swallow_get(ed); edje_object_signal_emit(o, "signal", "source"); but can be done all in themes, no need to go to application c/c++/python. Based on patch by Pieter, see mail list. Author: barbieri Date: 2009-05-02 13:05:53 -0700 (Sat, 02 May 2009) New Revision: 40489 Modified: trunk/edje/src/lib/edje_program.c Modified: trunk/edje/src/lib/edje_program.c =================================================================== --- trunk/edje/src/lib/edje_program.c 2009-05-02 19:02:09 UTC (rev 40488) +++ trunk/edje/src/lib/edje_program.c 2009-05-02 20:05:53 UTC (rev 40489) @@ -2,6 +2,7 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ +#define _GNU_SOURCE #include <string.h> #include "edje_private.h" @@ -814,8 +815,43 @@ Edje_Message_Signal emsg; Eina_List *l; Evas_Object *obj; - + const char *sep; + if (ed->delete_me) return; + + sep = strchr(sig, ':'); + if (sep) + { + /* the signal contains a colon, split the signal into "group:signal", + * and deliver it to "group" + */ + char *part = strdupa(sig); + if (part) + { + char *newsig = part + (sep - sig); + int i; + *newsig = '\0'; + newsig++; + + for (i = 0; i < ed->table_parts_size; i++) + { + Edje_Real_Part *rp = ed->table_parts[i]; + if ((rp->part->type == EDJE_PART_TYPE_GROUP) && + (rp->swallowed_object) && + (rp->part) && (rp->part->name) && + (strcmp(rp->part->name, part) == 0)) + { + Edje *ed2 = _edje_fetch(rp->swallowed_object); + if (ed2) _edje_emit(ed2, newsig, src); + return; /* stop processing. + * XXX maybe let signal be processed anyway? + * XXX in this case, just comment this line + */ + } + } + } + } + emsg.sig = sig; emsg.src = src; _edje_message_send(ed, EDJE_QUEUE_SCRIPT, EDJE_MESSAGE_SIGNAL, 0, &emsg); |
From: Enlightenment S. <no-...@en...> - 2009-05-02 23:22:11
|
Log: use alloca+memcpy instead of strdupa. for these guys that insist in using doomed systems like solaris or bsd, god save them ;-) Patch by vtorri. Author: barbieri Date: 2009-05-02 16:22:07 -0700 (Sat, 02 May 2009) New Revision: 40491 Modified: trunk/edje/src/lib/edje_program.c Modified: trunk/edje/src/lib/edje_program.c =================================================================== --- trunk/edje/src/lib/edje_program.c 2009-05-02 20:12:41 UTC (rev 40490) +++ trunk/edje/src/lib/edje_program.c 2009-05-02 23:22:07 UTC (rev 40491) @@ -822,14 +822,20 @@ sep = strchr(sig, ':'); if (sep) { + size_t length; + char *part; /* the signal contains a colon, split the signal into "group:signal", * and deliver it to "group" */ - char *part = strdupa(sig); + length = strlen(sig) + 1; + part = alloca(length); if (part) { - char *newsig = part + (sep - sig); + char *newsig; int i; + + memcpy(part, sig, length); + newsig = part + (sep - sig); *newsig = '\0'; newsig++; |
From: Enlightenment S. <no-...@en...> - 2009-07-10 23:13:17
|
Log: fix minor glitches with edje box. still missing: * box.max * proper handling of min/max, need to behave like text. Author: barbieri Date: 2009-07-10 16:13:09 -0700 (Fri, 10 Jul 2009) New Revision: 41297 Modified: trunk/edje/src/lib/edje_calc.c trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/edje_calc.c =================================================================== --- trunk/edje/src/lib/edje_calc.c 2009-07-10 15:57:49 UTC (rev 41296) +++ trunk/edje/src/lib/edje_calc.c 2009-07-10 23:13:09 UTC (rev 41297) @@ -1242,9 +1242,9 @@ evas_object_smart_calculate(ep->object); } evas_object_size_hint_min_get(ep->object, &min_w, &min_h); - if (chosen_desc->box.min.h) + if (chosen_desc->box.min.h && (p3->w < min_w)) p3->w = min_w; - if (chosen_desc->box.min.v) + if (chosen_desc->box.min.v && (p3->h < min_w)) p3->h = min_h; } Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2009-07-10 15:57:49 UTC (rev 41296) +++ trunk/edje/src/lib/edje_util.c 2009-07-10 23:13:09 UTC (rev 41297) @@ -2732,11 +2732,11 @@ while (children) { Evas_Object *child_obj = children->data; - _edje_box_child_remove(rp, child_obj); if (evas_object_data_get(child_obj, "\377 edje.box_item")) i++; else { + _edje_box_child_remove(rp, child_obj); if (!evas_object_box_remove_at(rp->object, i)) return EINA_FALSE; if (clear) |
From: Enlightenment S. <no-...@en...> - 2009-08-12 17:57:50
|
Log: NULL sfont as it might be used earlier. if sfont=something was given to _edje_text_class_font_get(), sfont might be untouched there and old pointer was being freed, resulting in double free. So make sure we're using the correct pointer there. Author: barbieri Date: 2009-08-12 10:57:34 -0700 (Wed, 12 Aug 2009) New Revision: 41714 Modified: trunk/edje/src/lib/edje_calc.c Modified: trunk/edje/src/lib/edje_calc.c =================================================================== --- trunk/edje/src/lib/edje_calc.c 2009-08-12 17:38:17 UTC (rev 41713) +++ trunk/edje/src/lib/edje_calc.c 2009-08-12 17:57:34 UTC (rev 41714) @@ -830,6 +830,7 @@ } /* FIXME: Do we really need to call it twice if chosen_desc ? */ + sfont = NULL; font = _edje_text_class_font_get(ed, desc, &size, &sfont); free(sfont); params->type.text.size = size; |
From: Enlightenment S. <no-...@en...> - 2009-09-28 17:23:17
|
Log: edje_{,object}_color_class_get() and signals when color_classes are changed. Enable applications to retrieve current color class values as well as emit edje signals when they are deleted or changed. Author: barbieri Date: 2009-09-28 10:23:02 -0700 (Mon, 28 Sep 2009) New Revision: 42773 Modified: trunk/edje/src/lib/Edje.h trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/Edje.h =================================================================== --- trunk/edje/src/lib/Edje.h 2009-09-28 16:36:05 UTC (rev 42772) +++ trunk/edje/src/lib/Edje.h 2009-09-28 17:23:02 UTC (rev 42773) @@ -259,6 +259,7 @@ /* edje_util.c */ EAPI void edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3); + EAPI Eina_Bool edje_color_class_get(const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3); EAPI void edje_color_class_del(const char *color_class); EAPI Eina_List * edje_color_class_list(void); EAPI void edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size); @@ -294,6 +295,7 @@ EAPI int edje_object_freeze (Evas_Object *obj); EAPI int edje_object_thaw (Evas_Object *obj); EAPI void edje_object_color_class_set (Evas_Object *obj, const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3); + EAPI Eina_Bool edje_object_color_class_get (const Evas_Object *o, const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3); EAPI void edje_object_color_class_del (Evas_Object *obj, const char *color_class); EAPI void edje_object_text_class_set (Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size); EAPI void edje_object_size_min_get (const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh); Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2009-09-28 16:36:05 UTC (rev 42772) +++ trunk/edje/src/lib/edje_util.c 2009-09-28 17:23:02 UTC (rev 42773) @@ -386,8 +386,13 @@ * the third is the text shadow. (Note that the second two only apply * to text parts). * + * Setting color emits a signal "color_class,set" with source being + * the given color class in all objects. + * * @see edje_color_class_set(). * + * @note unlike Evas, Edje colors are @b not pre-multiplied. That is, + * half-transparent white is 255 255 255 128. */ EAPI void edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3) @@ -452,11 +457,80 @@ ed->all_part_change = 1; #endif _edje_recalc(ed); + _edje_emit(ed, "color_class,set", color_class); members = eina_list_next(members); } } /** + * @brief Get Edje color class. + * + * @param color_class + * @param r Object Red value + * @param g Object Green value + * @param b Object Blue value + * @param a Object Alpha value + * @param r2 Outline Red value + * @param g2 Outline Green value + * @param b2 Outline Blue value + * @param a2 Outline Alpha value + * @param r3 Shadow Red value + * @param g3 Shadow Green value + * @param b3 Shadow Blue value + * @param a3 Shadow Alpha value + * + * @return EINA_TRUE if found or EINA_FALSE if not found and all + * values are zeroed. + * + * This function gets the color values for a process level color + * class. This value is the globally set and not per-object, that is, + * the value that would be used by objects if they did not override with + * edje_object_color_class_set(). + * + * The first color is the object, the second is the text outline, and + * the third is the text shadow. (Note that the second two only apply + * to text parts). + * + * @see edje_color_class_set(). + * + * @note unlike Evas, Edje colors are @b not pre-multiplied. That is, + * half-transparent white is 255 255 255 128. + */ +EAPI Eina_Bool +edje_color_class_get(const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3) +{ + Edje_Color_Class *cc; + + if (!color_class) + cc = NULL; + else + cc = eina_hash_find(_edje_color_class_hash, color_class); + + if (cc) + { +#define X(C) if (C) *C = cc->C +#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a) + S(r, g, b, a); + S(r2, g2, b2, a2); + S(r3, g3, b3, a3); +#undef S +#undef X + return EINA_TRUE; + } + else + { +#define X(C) if (C) *C = 0 +#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a) + S(r, g, b, a); + S(r2, g2, b2, a2); + S(r3, g3, b3, a3); +#undef S +#undef X + return EINA_FALSE; + } +} + +/** * @brief Delete edje color class. * * @param color_class @@ -464,6 +538,8 @@ * This function deletes any values at the process level for the * specified color class. * + * Deleting color emits a signal "color_class,del" with source being + * the given color class in all objects. */ void edje_color_class_del(const char *color_class) @@ -491,6 +567,7 @@ ed->all_part_change = 1; #endif _edje_recalc(ed); + _edje_emit(ed, "color_class,del", color_class); members = eina_list_next(members); } } @@ -554,6 +631,11 @@ * the third is the text shadow. (Note that the second two only apply * to text parts). * + * Setting color emits a signal "color_class,set" with source being + * the given color. + * + * @note unlike Evas, Edje colors are @b not pre-multiplied. That is, + * half-transparent white is 255 255 255 128. */ EAPI void edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3) @@ -642,9 +724,72 @@ } _edje_recalc(ed); + _edje_emit(ed, "color_class,set", color_class); } /** + * @brief Gets the object color class. + * + * @param obj A valid Evas_Object handle + * @param color_class + * @param r Object Red value + * @param g Object Green value + * @param b Object Blue value + * @param a Object Alpha value + * @param r2 Outline Red value + * @param g2 Outline Green value + * @param b2 Outline Blue value + * @param a2 Outline Alpha value + * @param r3 Shadow Red value + * @param g3 Shadow Green value + * @param b3 Shadow Blue value + * @param a3 Shadow Alpha value + * + * @return EINA_TRUE if found or EINA_FALSE if not found and all + * values are zeroed. + * + * This function gets the color values for an object level color + * class. If no explicit object color is set, then global values will + * be used. + * + * The first color is the object, the second is the text outline, and + * the third is the text shadow. (Note that the second two only apply + * to text parts). + * + * @note unlike Evas, Edje colors are @b not pre-multiplied. That is, + * half-transparent white is 255 255 255 128. + */ +EAPI Eina_Bool +edje_object_color_class_get(const Evas_Object *obj, const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3) +{ + Edje *ed = _edje_fetch(obj); + Edje_Color_Class *cc = _edje_color_class_find(ed, color_class); + + if (cc) + { +#define X(C) if (C) *C = cc->C +#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a) + S(r, g, b, a); + S(r2, g2, b2, a2); + S(r3, g3, b3, a3); +#undef S +#undef X + return EINA_TRUE; + } + else + { +#define X(C) if (C) *C = 0 +#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a) + S(r, g, b, a); + S(r2, g2, b2, a2); + S(r3, g3, b3, a3); +#undef S +#undef X + return EINA_FALSE; + } +} + +/** * @brief Delete the object color class. * * @param color_class The color class to be deleted. @@ -652,6 +797,8 @@ * This function deletes any values at the object level for the * specified object and color class. * + * Deleting color emits a signal "color_class,del" with source being + * the given color. */ void edje_object_color_class_del(Evas_Object *obj, const char *color_class) @@ -689,6 +836,7 @@ ed->all_part_change = 1; #endif _edje_recalc(ed); + _edje_emit(ed, "color_class,del", color_class); } /** |
From: Enlightenment S. <no-...@en...> - 2009-11-23 18:47:42
|
Log: edje external module loader: just load modules once. not tested, but should work. Author: barbieri Date: 2009-11-23 10:47:31 -0800 (Mon, 23 Nov 2009) New Revision: 43933 Modified: trunk/edje/src/lib/edje_module.c Modified: trunk/edje/src/lib/edje_module.c =================================================================== --- trunk/edje/src/lib/edje_module.c 2009-11-23 17:26:51 UTC (rev 43932) +++ trunk/edje/src/lib/edje_module.c 2009-11-23 18:47:31 UTC (rev 43933) @@ -59,6 +59,10 @@ Eina_Module *m; EINA_SAFETY_ON_NULL_RETURN_VAL(module, EINA_FALSE); + + if (eina_hash_find(_registered_modules, module)) + return EINA_TRUE; + m = eina_module_find(_available_modules, module); if (!m) |
From: Enlightenment S. <no-...@en...> - 2009-12-01 17:58:30
|
Log: batch register/unregister of external types, faster and lighter on memory. This is the recommended way to register a batch of types, it will not do check (hash lookup) before adding and keys are added as "direct" (not copied), thus lighter on memory. Author: barbieri Date: 2009-12-01 09:58:17 -0800 (Tue, 01 Dec 2009) New Revision: 44102 Modified: trunk/edje/src/lib/Edje.h trunk/edje/src/lib/edje_external.c Modified: trunk/edje/src/lib/Edje.h =================================================================== --- trunk/edje/src/lib/Edje.h 2009-12-01 17:52:04 UTC (rev 44101) +++ trunk/edje/src/lib/Edje.h 2009-12-01 17:58:17 UTC (rev 44102) @@ -328,6 +328,15 @@ typedef struct _Edje_External_Type Edje_External_Type; +struct _Edje_External_Type_Info +{ + const char *name; + const Edje_External_Type *info; +}; +typedef struct _Edje_External_Type_Info Edje_External_Type_Info; + + + typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source); typedef void (*Edje_Text_Change_Cb) (void *data, Evas_Object *obj, const char *part); typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg); @@ -482,6 +491,10 @@ /* edje_external.c */ EAPI Eina_Bool edje_external_type_register(const char *type_name, const Edje_External_Type *type_info); EAPI Eina_Bool edje_external_type_unregister(const char *type_name); + + EAPI void edje_external_type_array_register(const Edje_External_Type_Info *array); + EAPI void edje_external_type_array_unregister(const Edje_External_Type_Info *array); + EAPI Eina_Iterator *edje_external_iterator_get(void); EAPI Edje_External_Param *edje_external_param_find(const Eina_List *params, const char *key); EAPI Eina_Bool edje_external_param_int_get(const Eina_List *params, const char *key, int *ret); Modified: trunk/edje/src/lib/edje_external.c =================================================================== --- trunk/edje/src/lib/edje_external.c 2009-12-01 17:52:04 UTC (rev 44101) +++ trunk/edje/src/lib/edje_external.c 2009-12-01 17:58:17 UTC (rev 44102) @@ -7,6 +7,18 @@ static Eina_Hash *type_registry = NULL; static int init_count = 0; +/** + * Register given type name to return the given information. + * + * @param type_name name to register and be known by edje's "source:" + * parameter of "type: EXTERNAL" parts. + * @param type_info meta-information describing how to interact with it. + * + * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (like + * type already registered). + * + * @see edje_external_type_array_register() + */ EAPI Eina_Bool edje_external_type_register(const char *type_name, const Edje_External_Type *type_info) { @@ -18,12 +30,77 @@ return eina_hash_add(type_registry, type_name, type_info); } +/** + * Unregister given type name previously registered. + * + * @param type_name name to unregister. It should be registered with + * edje_external_type_register() before. + * + * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (like + * type_name did not exist). + * + * @see edje_external_type_array_unregister() + */ EAPI Eina_Bool edje_external_type_unregister(const char *type_name) { return eina_hash_del_by_key(type_registry, type_name); } +/** + * Register a batch of types and their information. + * + * This is the recommended function to add information as it's faster + * than the single version edje_external_type_register(). + * + * @note the given array is not modified, but the type name strings + * are @b not duplicated! That is, all type names must be @b + * live until they are unregistered! This was choosen to save + * some memory and most people will just define the array as a + * global static const type anyway. + * + * @param arrray @c NULL terminated array with type name and + * information. Note that type name or information are not + * modified by are @b referenced, so they must keep alive after + * this function returns! + * + * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (like + * type already registered). + * + * @see edje_external_type_register() + */ +EAPI void +edje_external_type_array_register(const Edje_External_Type_Info *array) +{ + const Edje_External_Type_Info *itr; + + if (!array) + return; + + for (itr = array; itr->name; itr++) + eina_hash_direct_add(type_registry, itr->name, itr->info); +} + +/** + * Unregister a batch of given external type previously registered. + * + * @param array @c NULL terminated array, should be the same as the + * one used to register with edje_external_type_array_register() + * + * @see edje_external_type_unregister() + */ +EAPI void +edje_external_type_array_unregister(const Edje_External_Type_Info *array) +{ + const Edje_External_Type_Info *itr; + + if (!array) + return; + + for (itr = array; itr->name; itr++) + eina_hash_del(type_registry, itr->name, itr->info); +} + EAPI Eina_Iterator * edje_external_iterator_get(void) { |
From: Enlightenment S. <no-...@en...> - 2009-12-02 21:16:55
|
Log: warn usage of part swallow without swallow Author: barbieri Date: 2009-12-02 13:16:42 -0800 (Wed, 02 Dec 2009) New Revision: 44134 Modified: trunk/edje/src/lib/edje_util.c Modified: trunk/edje/src/lib/edje_util.c =================================================================== --- trunk/edje/src/lib/edje_util.c 2009-12-02 21:06:11 UTC (rev 44133) +++ trunk/edje/src/lib/edje_util.c 2009-12-02 21:16:42 UTC (rev 44134) @@ -2067,7 +2067,12 @@ rp = _edje_real_part_recursive_get(ed, (char *)part); if (!rp) return; - if (rp->part->type != EDJE_PART_TYPE_SWALLOW) return; + if (rp->part->type != EDJE_PART_TYPE_SWALLOW) + { + fprintf(stderr, "ERROR: cannot unswallow part %s: not swallow type!\n", + rp->part->name); + return; + } _edje_real_part_swallow(rp, obj_swallow); } @@ -2407,8 +2412,16 @@ if (!obj_swallow) return; rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part"); - if (rp && rp->swallowed_object == obj_swallow) + if (!rp) + return; + if (rp->part->type != EDJE_PART_TYPE_SWALLOW) { + fprintf(stderr, "ERROR: cannot unswallow part %s: not swallow type!\n", + rp->part->name); + return; + } + if (rp->swallowed_object == obj_swallow) + { evas_object_smart_member_del(rp->swallowed_object); evas_object_event_callback_del_full(rp->swallowed_object, EVAS_CALLBACK_FREE, |
From: Enlightenment S. <no-...@en...> - 2009-12-02 21:41:43
|
Log: Edje_External_Type: break abi, add abi checker. - add preview_get() and description_get(), breaking ABI badly. - add abi_version field to be fileld with EDJE_EXTERNAL_TYPE_ABI_VERSION and checked with edje_external_type_abi_version_get() Author: barbieri Date: 2009-12-02 13:41:28 -0800 (Wed, 02 Dec 2009) New Revision: 44135 Modified: trunk/edje/src/lib/Edje.h trunk/edje/src/lib/edje_external.c Modified: trunk/edje/src/lib/Edje.h =================================================================== --- trunk/edje/src/lib/Edje.h 2009-12-02 21:16:42 UTC (rev 44134) +++ trunk/edje/src/lib/Edje.h 2009-12-02 21:41:28 UTC (rev 44135) @@ -311,6 +311,12 @@ struct _Edje_External_Type { +#define EDJE_EXTERNAL_TYPE_ABI_VERSION (1) + unsigned int abi_version; /**< always use: + * - #EDJE_EXTERNAL_TYPE_ABI_VERSION to declare. + * - edje_external_type_abi_version_get() to check. + */ + const char *module; Evas_Object *(*add) (void *data, Evas *evas, Evas_Object *parent, const Eina_List *params); void (*state_set) (void *data, Evas_Object *obj, const void *from_params, const void *to_params, float pos); @@ -318,8 +324,10 @@ void *(*params_parse) (void *data, Evas_Object *obj, const Eina_List *params); void (*params_free) (void *params); + const char *(*label_get) (void *data); + const char *(*description_get) (void *data); Evas_Object *(*icon_get) (void *data, Evas *e); - const char *(*label_get) (void *data); + Evas_Object *(*preview_get) (void *data, Evas *e); Edje_External_Param_Info *parameters_info; @@ -495,6 +503,9 @@ EAPI void edje_external_type_array_register(const Edje_External_Type_Info *array); EAPI void edje_external_type_array_unregister(const Edje_External_Type_Info *array); + EAPI unsigned int edje_external_type_abi_version_get(void) EINA_CONST; + + EAPI Eina_Iterator *edje_external_iterator_get(void); EAPI Edje_External_Param *edje_external_param_find(const Eina_List *params, const char *key); EAPI Eina_Bool edje_external_param_int_get(const Eina_List *params, const char *key, int *ret); Modified: trunk/edje/src/lib/edje_external.c =================================================================== --- trunk/edje/src/lib/edje_external.c 2009-12-02 21:16:42 UTC (rev 44134) +++ trunk/edje/src/lib/edje_external.c 2009-12-02 21:41:28 UTC (rev 44135) @@ -22,6 +22,20 @@ EAPI Eina_Bool edje_external_type_register(const char *type_name, const Edje_External_Type *type_info) { + if (!type_name) + return EINA_FALSE; + if (!type_info) + return EINA_FALSE; + + if (type_info->abi_version != EDJE_EXTERNAL_TYPE_ABI_VERSION) + { + printf("EDJE ERROR: external type '%s' (%p) has incorrect abi version. " + "got %#x where %#x was expected.\n", + type_name, type_info, + type_info->abi_version, EDJE_EXTERNAL_TYPE_ABI_VERSION); + return EINA_FALSE; + } + if (eina_hash_find(type_registry, type_name)) { printf("EDJE ERROR: external type '%s' already registered\n", type_name); @@ -44,6 +58,8 @@ EAPI Eina_Bool edje_external_type_unregister(const char *type_name) { + if (!type_name) + return EINA_FALSE; return eina_hash_del_by_key(type_registry, type_name); } @@ -78,7 +94,18 @@ return; for (itr = array; itr->name; itr++) - eina_hash_direct_add(type_registry, itr->name, itr->info); + { + if (itr->info->abi_version != EDJE_EXTERNAL_TYPE_ABI_VERSION) + { + printf("EDJE ERROR: external type '%s' (%p) has incorrect abi " + "version. got %#x where %#x was expected.\n", + itr->name, itr->info, + itr->info->abi_version, EDJE_EXTERNAL_TYPE_ABI_VERSION); + continue; + } + + eina_hash_direct_add(type_registry, itr->name, itr->info); + } } /** @@ -101,6 +128,30 @@ eina_hash_del(type_registry, itr->name, itr->info); } +/** + * Return the current ABI version for Edje_External_Type structure. + * + * Always check this number before accessing Edje_External_Type in + * your own software. If the number is not the same, your software may + * access invalid memory and crash, or just get garbage values. + * + * @warning @b NEVER, EVER define your own Edje_External_Type using the + * return of this function as it will change as Edje library + * (libedje.so) changes, but your type definition will + * not. Instead, use #EDJE_EXTERNAL_TYPE_ABI_VERSION. + * + * Summary: + * - use edje_external_type_abi_version_get() to check. + * - use #EDJE_EXTERNAL_TYPE_ABI_VERSION to define/declare. + * + * @return version this edje library was compiled. + */ +EAPI unsigned int +edje_external_type_abi_version_get(void) +{ + return EDJE_EXTERNAL_TYPE_ABI_VERSION; +} + EAPI Eina_Iterator * edje_external_iterator_get(void) { |
From: Enlightenment S. <no-...@en...> - 2009-12-02 21:54:41
|
Log: Edje_External_Type: rename functions that add new objects. Author: barbieri Date: 2009-12-02 13:54:28 -0800 (Wed, 02 Dec 2009) New Revision: 44137 Modified: trunk/edje/src/lib/Edje.h Modified: trunk/edje/src/lib/Edje.h =================================================================== --- trunk/edje/src/lib/Edje.h 2009-12-02 21:54:17 UTC (rev 44136) +++ trunk/edje/src/lib/Edje.h 2009-12-02 21:54:28 UTC (rev 44137) @@ -326,8 +326,8 @@ const char *(*label_get) (void *data); const char *(*description_get) (void *data); - Evas_Object *(*icon_get) (void *data, Evas *e); - Evas_Object *(*preview_get) (void *data, Evas *e); + Evas_Object *(*icon_add) (void *data, Evas *e); + Evas_Object *(*preview_add) (void *data, Evas *e); Edje_External_Param_Info *parameters_info; |