Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/canvas Modified Files: evas_events.c evas_layer.c evas_object_main.c evas_object_smart.c evas_render.c evas_smart.c evas_stack.c Log Message: the first wave of evas smart object modes. commit hell #1. :) other things still need updating in cvs - but i am sure others can do that :) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_events.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -3 -r1.40 -r1.41 --- evas_events.c 24 Sep 2005 10:22:55 -0000 1.40 +++ evas_events.c 27 Oct 2005 02:44:36 -0000 1.41 @@ -19,6 +19,61 @@ return 0; } +static Evas_List * +_evas_event_object_list_in_get(Evas *e, Evas_List *in, Evas_Object_List *list, Evas_Object *stop, int x, int y, int *no_rep) +{ + Evas_Object_List *l; + + if (!list) return in; + for (l = list->last; l; l = l->prev) + { + Evas_Object *obj; + + obj = (Evas_Object *)l; + if (obj == stop) + { + *no_rep = 1; + return in; + } + if (!evas_event_passes_through(obj)) + { + if ((obj->cur.visible) && (obj->delete_me == 0) && + (!obj->clip.clipees) && + (evas_object_clippers_is_visible(obj))) + { + if (obj->smart.smart) + { + int norep; + + norep = 0; + in = _evas_event_object_list_in_get(e, in, + obj->smart.contained, + stop, x, y, &norep); + if (norep) + { + *no_rep = 1; + return in; + } + } + else + { + if (evas_object_is_in_output_rect(obj, x, y, 1, 1)) + { + in = evas_list_append(in, obj); + if (!obj->repeat_events) + { + *no_rep = 1; + return in; + } + } + } + } + } + } + *no_rep = 0; + return in; +} + Evas_List * evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y) { @@ -28,33 +83,15 @@ if (!e->layers) return NULL; for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev) { - Evas_Object_List *l2; Evas_Layer *lay; + int norep; lay = (Evas_Layer *)l; - for (l2 = ((Evas_Object_List *)(lay->objects))->last; l2; l2 = l2->prev) - { - Evas_Object *obj; - - obj = (Evas_Object *)l2; - if (obj == stop) goto done; - if ((!evas_event_passes_through(obj)) && (!obj->smart.smart)) - { -// FIXME: i don't think we need this -// evas_object_clip_recalc(obj); - if ((evas_object_is_in_output_rect(obj, x, y, 1, 1)) && - (obj->cur.visible) && - (obj->delete_me == 0) && - (evas_object_clippers_is_visible(obj)) && - (!obj->clip.clipees)) - { - in = evas_list_append(in, obj); - if (!obj->repeat_events) goto done; - } - } - } + norep = 0; + in = _evas_event_object_list_in_get(e, in, lay->objects, stop, + x, y, &norep); + if (norep) return in; } - done: return in; } @@ -431,7 +468,6 @@ if ((obj->cur.visible) && (evas_object_clippers_is_visible(obj)) && (!evas_event_passes_through(obj)) && - (!obj->smart.smart) && (!obj->clip.clipees)) { if ((px != x) || (py != y)) @@ -510,7 +546,6 @@ (evas_object_clippers_is_visible(obj)) && (evas_list_find(ins, obj)) && (!evas_event_passes_through(obj)) && - (!obj->smart.smart) && (!obj->clip.clipees)) { if ((px != x) || (py != y)) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_layer.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- evas_layer.c 25 Jul 2005 09:55:47 -0000 1.12 +++ evas_layer.c 27 Oct 2005 02:44:36 -0000 1.13 @@ -6,6 +6,7 @@ { Evas_Layer *lay; + if (obj->in_layer) return; lay = evas_layer_find(e, obj->cur.layer); if (!lay) { @@ -15,11 +16,13 @@ } lay->objects = evas_object_list_append(lay->objects, obj); obj->layer = lay; + obj->in_layer = 1; } void evas_object_release(Evas_Object *obj, int clean_layer) { + if (!obj->in_layer) return; obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); if (clean_layer) { @@ -30,6 +33,7 @@ } } obj->layer = NULL; + obj->in_layer = 0; } Evas_Layer * @@ -140,16 +144,12 @@ return; MAGIC_CHECK_END(); if (evas_object_intercept_call_layer_set(obj, l)) return; + if (obj->smart.parent) return; if (obj->cur.layer == l) { evas_object_raise(obj); return; } - if (obj->smart.smart) - { - if (obj->smart.smart->smart_class->layer_set) - obj->smart.smart->smart_class->layer_set(obj, l); - } e = obj->layer->evas; evas_object_release(obj, 1); obj->cur.layer = l; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_main.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -3 -r1.36 -r1.37 --- evas_object_main.c 23 Sep 2005 14:41:10 -0000 1.36 +++ evas_object_main.c 27 Oct 2005 02:44:36 -0000 1.37 @@ -18,13 +18,15 @@ void evas_object_free(Evas_Object *obj, int clean_layer) { + int was_smart_child = 0; + evas_object_grabs_cleanup(obj); evas_object_intercept_cleanup(obj); + if (obj->smart.parent) was_smart_child = 1; evas_object_smart_cleanup(obj); obj->func->free(obj); - if (obj->name) - evas_object_name_set(obj, NULL); - evas_object_release(obj, clean_layer); + if (obj->name) evas_object_name_set(obj, NULL); + if (!was_smart_child) evas_object_release(obj, clean_layer); if (obj->name) { free(obj->name); @@ -59,12 +61,9 @@ { Evas_List *l; - if (obj->smart.smart) return; - if (!((obj->cur.visible != obj->prev.visible) || (obj->cur.visible))) - return; + obj->layer->evas->changed = 1; if (obj->changed) return; obj->changed = 1; - obj->layer->evas->changed = 1; /* set changed flag on all objects this one clips too */ for (l = obj->clip.clipees; l; l = l->next) { @@ -73,6 +72,7 @@ o = (Evas_Object *)l->data; evas_object_change(o); } + if (obj->smart.parent) evas_object_change(obj->smart.parent); } Evas_List * =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_smart.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- evas_object_smart.c 22 Jul 2005 10:28:10 -0000 1.15 +++ evas_object_smart.c 27 Oct 2005 02:44:36 -0000 1.16 @@ -132,11 +132,18 @@ return; MAGIC_CHECK_END(); + if (obj->smart.parent == smart_obj) return; + if (obj->smart.parent) evas_object_smart_member_del(obj); - + + evas_object_release(obj, 1); + obj->layer = smart_obj->layer; + obj->cur.layer = obj->layer->layer; obj->smart.parent = smart_obj; - smart_obj->smart.contained = evas_list_append(smart_obj->smart.contained, obj); + smart_obj->smart.contained = evas_object_list_append(smart_obj->smart.contained, obj); evas_object_smart_member_cache_invalidate(obj); + obj->restack = 1; + evas_object_change(obj); } /** @@ -153,10 +160,13 @@ MAGIC_CHECK_END(); if (!obj->smart.parent) return; - - obj->smart.parent->smart.contained = evas_list_remove(obj->smart.parent->smart.contained, obj); + obj->smart.parent->smart.contained = evas_object_list_remove(obj->smart.parent->smart.contained, obj); obj->smart.parent = NULL; evas_object_smart_member_cache_invalidate(obj); + obj->cur.layer = obj->layer->layer; + evas_object_inject(obj, obj->layer->evas); + obj->restack = 1; + evas_object_change(obj); } /** @@ -340,11 +350,7 @@ if (obj->smart.parent) evas_object_smart_member_del(obj); while (obj->smart.contained) - { - /* null out smart parent object - maybe a hole to creep through? */ - ((Evas_Object *)obj->smart.contained->data)->smart.parent = NULL; - obj->smart.contained = evas_list_remove(obj->smart.contained, obj->smart.contained->data); - } + evas_object_smart_member_del((Evas_Object *)obj->smart.contained); while (obj->smart.callbacks) { Evas_Smart_Callback *cb; @@ -362,14 +368,14 @@ void evas_object_smart_member_cache_invalidate(Evas_Object *obj) { - Evas_List *l; + Evas_Object_List *l; obj->parent_cache_valid = 0; for (l = obj->smart.contained; l; l = l->next) { Evas_Object *obj2; - obj2 = l->data; + obj2 = (Evas_Object *)l; evas_object_smart_member_cache_invalidate(obj2); } } =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_render.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- evas_render.c 18 Jun 2005 01:00:30 -0000 1.9 +++ evas_render.c 27 Oct 2005 02:44:36 -0000 1.10 @@ -64,6 +64,103 @@ } } + +static void +_evas_render_phase1_object_process(Evas *e, Evas_Object *obj, Evas_List **active_objects, Evas_List **restack_objects, int restack) +{ +/* if (obj->cur.cache.clip.dirty) */ + evas_object_clip_recalc(obj); + /* build active object list */ + if (evas_object_is_active(obj)) + *active_objects = evas_list_append(*active_objects, obj); + /* something changed... maybe... */ + if (restack) + { + obj->restack = 1; + obj->changed = 1; + } + if (obj->changed) + { + if (obj->smart.smart) + { + Evas_Object_List *l; + + for (l = obj->smart.contained; l; l = l->next) + { + Evas_Object *obj2; + + obj2 = (Evas_Object *)l; + _evas_render_phase1_object_process(e, obj2, + active_objects, + restack_objects, obj->restack); + } + + } + else + { + if ((obj->restack) && (!obj->clip.clipees) && + evas_object_is_active(obj)) + *restack_objects = evas_list_append(*restack_objects, obj); + else + obj->func->render_pre(obj); + } + } + /* nothing changed at all */ + else + { + if ((!obj->clip.clipees) && (obj->delete_me == 0)) + { + if (obj->smart.smart) + { + Evas_Object_List *l; + + for (l = obj->smart.contained; l; l = l->next) + { + Evas_Object *obj2; + + obj2 = (Evas_Object *)l; + _evas_render_phase1_object_process(e, obj2, + active_objects, + restack_objects, + restack); + } + } + else + { + if (evas_object_is_opaque(obj) && + evas_object_is_visible(obj)) + e->engine.func->output_redraws_rect_del(e->engine.data.output, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + } + } + } + obj->restack = 0; +} + +static void +_evas_render_phase1_process(Evas *e, Evas_List **active_objects, Evas_List **restack_objects) +{ + Evas_Object_List *l; + + for (l = (Evas_Object_List *)e->layers; l; l = l->next) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + _evas_render_phase1_object_process(e, obj, active_objects, restack_objects, 0); + } + } +} + /** * To be documented. * @@ -91,49 +188,7 @@ if (!e->changed) return NULL; /* phase 1. add extra updates for changed objects */ - for (l = (Evas_Object_List *)e->layers; l; l = l->next) - { - Evas_Object_List *l2; - Evas_Layer *lay; - - lay = (Evas_Layer *)l; - for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next) - { - Evas_Object *obj; - - obj = (Evas_Object *)l2; -// if (obj->cur.cache.clip.dirty) - evas_object_clip_recalc(obj); - /* build active object list */ - if (evas_object_is_active(obj)) - active_objects = evas_list_append(active_objects, obj); - /* something changed... maybe... */ - if (obj->changed) - { - if ((obj->restack) && - (!obj->clip.clipees) && - (!obj->smart.smart) && - evas_object_is_active(obj)) - restack_objects = evas_list_append(restack_objects, obj); - else - obj->func->render_pre(obj); - } - /* nothing changed at all */ - else - { - if (evas_object_is_opaque(obj) && - evas_object_is_visible(obj) && - (!obj->smart.smart) && - (!obj->clip.clipees) && - (!obj->delete_me)) - e->engine.func->output_redraws_rect_del(e->engine.data.output, - obj->cur.cache.clip.x, - obj->cur.cache.clip.y, - obj->cur.cache.clip.w, - obj->cur.cache.clip.h); - } - } - } + _evas_render_phase1_process(e, &active_objects, &restack_objects); /* phase 2. force updates for restacks */ while (restack_objects) { @@ -299,29 +354,22 @@ /* clear redraws */ e->engine.func->output_redraws_clear(e->engine.data.output); /* and do a post render pass */ - for (l = (Evas_Object_List *)e->layers; l; l = l->next) + for (ll = active_objects; ll; ll = ll->next) { - Evas_Object_List *l2; - Evas_Layer *lay; - - lay = (Evas_Layer *)l; - for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next) + Evas_Object *obj; + + obj = (Evas_Object *)(ll->data); + obj->pre_render_done = 0; + if (obj->changed) { - Evas_Object *obj; - - obj = (Evas_Object *)l2; - obj->pre_render_done = 0; - if (obj->changed) - { - obj->func->render_post(obj); - obj->restack = 0; - obj->changed = 0; - } - /* if the object is flagged for deletion - note it */ - if (obj->delete_me == 2) - delete_objects = evas_list_append(delete_objects, obj); - if (obj->delete_me) obj->delete_me ++; + obj->func->render_post(obj); + obj->restack = 0; + obj->changed = 0; } + /* if the object is flagged for deletion - note it */ + if (obj->delete_me == 2) + delete_objects = evas_list_append(delete_objects, obj); + if (obj->delete_me) obj->delete_me ++; } /* delete all objects flagged for deletion now */ while (delete_objects) @@ -333,9 +381,9 @@ evas_object_free(obj, 1); } /* free our obscuring object list */ - obscuring_objects_orig = evas_list_free(obscuring_objects_orig); + evas_list_free(obscuring_objects_orig); /* free our active object list */ - active_objects = evas_list_free(active_objects); + evas_list_free(active_objects); e->changed = 0; e->viewport.changed = 0; e->output.changed = 0; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_smart.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- evas_smart.c 26 Aug 2005 06:53:37 -0000 1.10 +++ evas_smart.c 27 Oct 2005 02:44:36 -0000 1.11 @@ -47,11 +47,6 @@ s->smart_class->name = name; s->smart_class->add = func_add; s->smart_class->del = func_del; - s->smart_class->layer_set = func_layer_set; - s->smart_class->raise = func_raise; - s->smart_class->lower = func_lower; - s->smart_class->stack_above = func_stack_above; - s->smart_class->stack_below = func_stack_below; s->smart_class->move = func_move; s->smart_class->resize = func_resize; s->smart_class->show = func_show; @@ -88,38 +83,6 @@ * FIXME: To be fixed. * */ -void -evas_smart_above_get_set(Evas_Smart *s, Evas_Object *(*func_above_get) (Evas_Object *o)) -{ - Evas_Smart_Class *sc; - - if (!(sc = evas_smart_class_get(s))) - return; - sc->above_get = func_above_get; -} - -/** - * To be documented. - * - * FIXME: To be fixed. - * - */ -void -evas_smart_below_get_set(Evas_Smart *s, Evas_Object *(*func_below_get) (Evas_Object *o)) -{ - Evas_Smart_Class *sc; - - if (!(sc = evas_smart_class_get(s))) - return; - sc->below_get = func_below_get; -} - -/** - * To be documented. - * - * FIXME: To be fixed. - * - */ Evas_Smart * evas_smart_class_new(Evas_Smart_Class *sc) { =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_stack.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- evas_stack.c 22 Sep 2005 02:52:53 -0000 1.18 +++ evas_stack.c 27 Oct 2005 02:44:36 -0000 1.19 @@ -58,12 +58,18 @@ evas_object_inform_call_restack(obj); return; } - obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); - obj->layer->objects = evas_object_list_append(obj->layer->objects, obj); - if (obj->smart.smart) + if (obj->smart.parent) { - if (obj->smart.smart->smart_class->raise) - obj->smart.smart->smart_class->raise(obj); + obj->smart.parent->smart.contained = evas_object_list_remove(obj->smart.parent->smart.contained, obj); + obj->smart.parent->smart.contained = evas_object_list_append(obj->smart.parent->smart.contained, obj); + } + else + { + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_append(obj->layer->objects, obj); + } } if (obj->clip.clipees) { @@ -106,18 +112,24 @@ return; MAGIC_CHECK_END(); if (evas_object_intercept_call_lower(obj)) return; - if (obj->smart.smart) - { - if (obj->smart.smart->smart_class->lower) - obj->smart.smart->smart_class->lower(obj); - } if (!(((Evas_Object_List *)obj)->prev)) { evas_object_inform_call_restack(obj); return; } - obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); - obj->layer->objects = evas_object_list_prepend(obj->layer->objects, obj); + if (obj->smart.parent) + { + obj->smart.parent->smart.contained = evas_object_list_remove(obj->smart.parent->smart.contained, obj); + obj->smart.parent->smart.contained = evas_object_list_prepend(obj->smart.parent->smart.contained, obj); + } + else + { + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_prepend(obj->layer->objects, obj); + } + } if (obj->clip.clipees) { evas_object_inform_call_restack(obj); @@ -162,19 +174,9 @@ return; MAGIC_CHECK_END(); if (evas_object_intercept_call_stack_above(obj, above)) return; - if (above->smart.smart) - { - if (above->smart.smart->smart_class->above_get) - above = above->smart.smart->smart_class->above_get(above); - } - if (obj->smart.smart) - { - if (obj->smart.smart->smart_class->stack_above) - obj->smart.smart->smart_class->stack_above(obj, above); - } - if (above->layer != obj->layer) + if (!above) { - evas_object_inform_call_restack(obj); + evas_object_raise(obj); return; } if (((Evas_Object_List *)obj)->prev == (Evas_Object_List *)above) @@ -182,8 +184,28 @@ evas_object_inform_call_restack(obj); return; } - obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); - obj->layer->objects = evas_object_list_append_relative(obj->layer->objects, obj, above); + if (obj->smart.parent) + { + if (obj->smart.parent != above->smart.parent) + { +// printf("BITCH! evas_object_stack_above(), %p not inside same smart as %p!\n", obj, above); + return; + } + obj->smart.parent->smart.contained = evas_object_list_remove(obj->smart.parent->smart.contained, obj); + obj->smart.parent->smart.contained = evas_object_list_append_relative(obj->smart.parent->smart.contained, obj, above); + } + else + { + if (obj->layer != above->layer) + { + return; + } + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_append_relative(obj->layer->objects, obj, above); + } + } if (obj->clip.clipees) { evas_object_inform_call_restack(obj); @@ -228,19 +250,9 @@ return; MAGIC_CHECK_END(); if (evas_object_intercept_call_stack_below(obj, below)) return; - if (below->smart.smart) - { - if (below->smart.smart->smart_class->below_get) - below = below->smart.smart->smart_class->below_get(below); - } - if (obj->smart.smart) + if (!below) { - if (obj->smart.smart->smart_class->stack_below) - obj->smart.smart->smart_class->stack_below(obj, below); - } - if (below->layer != obj->layer) - { - evas_object_inform_call_restack(obj); + evas_object_lower(obj); return; } if (((Evas_Object_List *)obj)->next == (Evas_Object_List *)below) @@ -248,8 +260,28 @@ evas_object_inform_call_restack(obj); return; } - obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); - obj->layer->objects = evas_object_list_prepend_relative(obj->layer->objects, obj, below); + if (obj->smart.parent) + { + if (obj->smart.parent != below->smart.parent) + { +// printf("BITCH! evas_object_stack_below(), %p not inside same smart as %p!\n", obj, below); + return; + } + obj->smart.parent->smart.contained = evas_object_list_remove(obj->smart.parent->smart.contained, obj); + obj->smart.parent->smart.contained = evas_object_list_prepend_relative(obj->smart.parent->smart.contained, obj, below); + } + else + { + if (obj->layer != below->layer) + { + return; + } + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_prepend_relative(obj->layer->objects, obj, below); + } + } if (obj->clip.clipees) { evas_object_inform_call_restack(obj); @@ -287,16 +319,12 @@ Evas_Object * evas_object_above_get(Evas_Object *obj) { - Evas_Object *obj2; - MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); return NULL; MAGIC_CHECK_END(); - obj2 = evas_object_above_get_internal(obj); - while (((obj2) && (obj2->smart.parent)) || - ((obj2) && (obj2->delete_me))) - obj2 = evas_object_above_get_internal(obj2); - return obj2; + if (obj->smart.parent) + return (Evas_Object *)(((Evas_Object_List *)(obj))->next); + return evas_object_above_get_internal(obj); } /** @@ -308,16 +336,12 @@ Evas_Object * evas_object_below_get(Evas_Object *obj) { - Evas_Object *obj2; - MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); return NULL; MAGIC_CHECK_END(); - obj2 = evas_object_below_get_internal(obj); - while (((obj2) && (obj2->smart.parent)) || - ((obj2) && (obj2->delete_me))) - obj2 = evas_object_below_get_internal(obj2); - return obj2; + if (obj->smart.parent) + return (Evas_Object *)(((Evas_Object_List *)(obj))->prev); + return evas_object_below_get_internal(obj); } /** @@ -329,17 +353,12 @@ Evas_Object * evas_object_bottom_get(Evas *e) { - Evas_Object *obj2 = NULL; - MAGIC_CHECK(e, Evas, MAGIC_EVAS); return NULL; MAGIC_CHECK_END(); if (e->layers) - obj2 = e->layers->objects; - while (((obj2) && (obj2->smart.parent)) || - ((obj2) && (obj2->delete_me))) - obj2 = evas_object_above_get_internal(obj2); - return obj2; + return e->layers->objects; + return NULL; } /** @@ -371,10 +390,5 @@ obj2 = (Evas_Object *) list->last; if (!obj2) return NULL; - while (((obj2) && (obj2->smart.parent)) || - ((obj2) && (obj2->delete_me))) { - obj2 = evas_object_below_get_internal(obj2); - } - return obj2; } ------------------------------------------------------- This SF.Net email is sponsored by the JBoss Inc. Get Certified Today * Register for a JBoss Training Course Free Certification Exam for All Training Attendees Through End of 2005 Visit http://www.jboss.com/services/certification for more information _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs