Enlightenment CVS committal Author : sndev Project : e_modules Module : language
Dir : e_modules/language Modified Files: Makefile.am configure.in e_mod_config.c e_mod_lang.c e_mod_lang.h e_mod_main.c Log Message: Just next step forward :) Going with the config dialog(still ugly). Adding deps for the exml lib. =================================================================== RCS file: /cvs/e/e_modules/language/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- Makefile.am 10 May 2006 22:49:01 -0000 1.1 +++ Makefile.am 12 May 2006 11:02:31 -0000 1.2 @@ -30,7 +30,7 @@ e_mod_keybind.c \ e_mod_lang.h \ e_mod_lang.c -module_la_LIBADD = @e_libs@ +module_la_LIBADD = @e_libs@ -lexml module_la_LDFLAGS = -module -avoid-version module_la_DEPENDENCIES = $(top_builddir)/config.h =================================================================== RCS file: /cvs/e/e_modules/language/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- configure.in 10 May 2006 22:49:01 -0000 1.1 +++ configure.in 12 May 2006 11:02:31 -0000 1.2 @@ -97,6 +97,8 @@ AC_CHECK_LIB(dl, dlopen, dlopen_libs=-ldl) AC_SUBST(dlopen_libs) +AC_CHECK_HEADERS(EXML.h,, AC_MSG_ERROR([Cannot find EXML.h. Make sure your CFLAGS environment variable contains include lines for the location of this file and EXML lib is installed])) + AC_ARG_WITH(edje-config, [ --with-edje-config=EDJE_CONFIG use edje-config specified ], [ =================================================================== RCS file: /cvs/e/e_modules/language/e_mod_config.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_mod_config.c 10 May 2006 22:49:01 -0000 1.1 +++ e_mod_config.c 12 May 2006 11:02:31 -0000 1.2 @@ -4,8 +4,8 @@ #include "e_mod_config.h" #include "config.h" -#define ILIST_ICON_WIDTH 48 -#define ILIST_ICON_HEIGHT 48 +#define ILIST_ICON_WIDTH 32 +#define ILIST_ICON_HEIGHT 32 #define ILIST_LANGUAGE_LABEL_FORMAT "%s (%s)" @@ -17,6 +17,9 @@ //Lang *lang; Evas_List *selected_languages; + Evas_List *kbd_models; + + Evas *evas; struct { @@ -30,7 +33,10 @@ } gui; }; +/************** extern *****************************/ extern Evas_List *language_def_list; +extern Evas_List *language_kbd_model_list; +/**************************************************/ static void *_create_data(E_Config_Dialog *cfd); static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); @@ -51,6 +57,8 @@ static void _lang_languages_ilist_cb_change(void *data, Evas_Object *obj); static void _lang_selected_languages_ilist_cb_change(void *data, Evas_Object *obj); +void _lang_update_kbd_model_list(E_Config_Dialog_Data *cfdata); + static void _lang_free_language(Language *lang); /************************************************************/ @@ -109,6 +117,9 @@ //cfdata->lang = l; _fill_data(l, cfdata); + + lang_load_kbd_models(); + lang_load_xfree_languages(); return cfdata; } @@ -125,6 +136,9 @@ cfdata->selected_languages); } + lang_free_kbd_models(); + lang_free_xfree_languages(); + l = cfd->data; l->cfd = NULL; free(cfdata); @@ -137,12 +151,13 @@ Lang *l; l = cfd->data; + cfdata->evas = evas; o = e_widget_list_add(evas, 0, 0); ot = e_widget_table_add(evas, 0); { - ot2 = e_widget_table_add(evas, 1); + ot2 = e_widget_table_add(evas, 0); { of = e_widget_framelist_add(evas, _("Languages"), 0); { @@ -150,7 +165,7 @@ ob = e_widget_ilist_add(evas, ILIST_ICON_WIDTH, ILIST_ICON_HEIGHT, NULL); e_widget_on_change_hook_set(ob, _lang_languages_ilist_cb_change, cfdata); cfdata->gui.lang_ilist = ob; - e_widget_min_size_set(ob, 150, 200); + e_widget_min_size_set(ob, 250, 300); e_widget_ilist_go(ob); e_widget_framelist_object_append(of, ob); } @@ -170,7 +185,7 @@ ob = e_widget_ilist_add(evas, ILIST_ICON_WIDTH, ILIST_ICON_HEIGHT, NULL); e_widget_on_change_hook_set(ob, _lang_selected_languages_ilist_cb_change, cfdata); cfdata->gui.selected_lang_ilist = ob; - e_widget_min_size_set(ob, 150, 200); + e_widget_min_size_set(ob, 250, 200); e_widget_ilist_go(ob); e_widget_framelist_object_append(of, ob); } @@ -185,7 +200,7 @@ ob = e_widget_ilist_add(evas, ILIST_ICON_WIDTH, ILIST_ICON_HEIGHT, NULL); cfdata->gui.kbd_model_ilist = ob; { - e_widget_min_size_set(ob, 150, 75); + e_widget_min_size_set(ob, 250, 150); e_widget_ilist_go(ob); } e_widget_framelist_object_append(of, ob); @@ -257,6 +272,7 @@ static void _lang_update_lang_defined_list(E_Config_Dialog_Data *cfdata) { + //FIXME: optimize - too slow char buf[1024]; Evas_List *l, *l2; Language_Def *ld; @@ -279,6 +295,7 @@ e_widget_ilist_clear(cfdata->gui.lang_ilist); for (l = language_def_list; l; l = l->next) { + Evas_Object *ic = NULL; int found = 0; ld = l->data; @@ -294,7 +311,10 @@ if (found) continue; snprintf(buf, sizeof(buf), ILIST_LANGUAGE_LABEL_FORMAT, ld->lang_name, ld->lang_shortcut); - e_widget_ilist_append(cfdata->gui.lang_ilist, NULL, buf, NULL, NULL, NULL); + + ic = edje_object_add(cfdata->evas); + e_util_edje_icon_set(ic, "enlightenment/e"); + e_widget_ilist_append(cfdata->gui.lang_ilist, ic, buf, NULL, NULL, NULL); } if (sel_label) @@ -319,6 +339,7 @@ static void _lang_update_selected_lang_list(E_Config_Dialog_Data *cfdata) { + //FIXME: optimize - too slow char buf[1024]; Evas_List *l; Language *lang; @@ -334,11 +355,15 @@ e_widget_ilist_clear(cfdata->gui.selected_lang_ilist); for (l = cfdata->selected_languages; l; l = l->next) { + Evas_Object *ic; lang = l->data; snprintf(buf, sizeof(buf), ILIST_LANGUAGE_LABEL_FORMAT, lang->lang_name, lang->lang_shortcut); - e_widget_ilist_append(cfdata->gui.selected_lang_ilist, NULL, buf, NULL, NULL, NULL); + + ic = edje_object_add(cfdata->evas); + e_util_edje_icon_set(ic, "enlightenment/e"); + e_widget_ilist_append(cfdata->gui.selected_lang_ilist, ic, buf, NULL, NULL, NULL); } if (indx >= 0) @@ -475,7 +500,48 @@ if (!(cfdata = data)) return; _lang_update_unselect_button(cfdata); + + _lang_update_kbd_model_list(cfdata); } + +void +_lang_update_kbd_model_list(E_Config_Dialog_Data *cfdata) +{ + char *sel_lang_label; + if (!cfdata) return; + + sel_lang_label = e_widget_ilist_selected_label_get(cfdata->gui.selected_lang_ilist); + if (!sel_lang_label) + { + e_widget_ilist_clear(cfdata->gui.kbd_model_ilist); + return; + } + + if (!e_widget_ilist_count(cfdata->gui.kbd_model_ilist)) + { + int indx = 0; + char buf[4096]; + Language *lang; + Evas_List *l; + Language_Kbd_Model *lkm; + + //FIXME: determine the selection index in advance + /*for (l = cfdata->selected_languages; l; l = l->next) + { + }*/ + + for (l = language_kbd_model_list; l; l = l->next) + { + lkm = l->data; + snprintf(buf, sizeof(buf), "%s (%s)", lkm->kbd_model_desctiption, lkm->kbd_model); + e_widget_ilist_append(cfdata->gui.kbd_model_ilist, NULL, buf, NULL, NULL, NULL); + } + } + e_widget_ilist_go(cfdata->gui.kbd_model_ilist); + + //FIXME: select the appropriate kbd_model +} + static void _lang_free_language(Language *lang) { =================================================================== RCS file: /cvs/e/e_modules/language/e_mod_lang.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_mod_lang.c 10 May 2006 22:49:01 -0000 1.1 +++ e_mod_lang.c 12 May 2006 11:02:31 -0000 1.2 @@ -2,51 +2,242 @@ #include "e_mod_lang.h" #include "e_mod_main.h" -Evas_List *language_def_list = NULL; +#include <EXML.h> + +#define EXML_RETURN_ON_ERROR(xml) \ + { \ + exml_destroy(xml); \ + return 0; \ + } + +Evas_List *language_def_list = NULL; // Language_Def +Evas_List *language_kbd_model_list = NULL; // Language_Kbd_Model /************ private ********************/ int _lang_def_language_sort_cb(void *e1, void *e2); + +int _lang_load_xfree_languages_load_configItem(EXML *xml, Language_Def *ld); +int _lang_load_xfree_languages_load_variantList(EXML *xml, Language_Def *ld); +static void _lang_register_language(const char *lang_name, const char *lang_shortcut, + const char *lang_flag, Evas_List *kbd_layout, + Evas_List *kbd_layout_variant); /****************************************/ -void -lang_register_language(const char *lang_name, const char *lang_shortcut, - const char *lang_flag, const char *kbd_layout, - const char *kbd_layout_variant) + +int +lang_load_kbd_models() { - Language_Def *ld; - Evas_List *l; - int found = 0; - int i; + EXML *exml; + int found; - if (!lang_name || !lang_shortcut || !kbd_layout) return; + exml = exml_new(); - for (l = language_def_list; l && !found; l = l->next) - { - ld = l->data; + if (!exml) return 0; + if (!exml_init(exml)) + EXML_RETURN_ON_ERROR(exml); - if (!strcmp(ld->lang_name, lang_name)) + if (!exml_file_read(exml, "/usr/lib/X11/xkb/rules/xfree86.xml")) + EXML_RETURN_ON_ERROR(exml) + + if (strcasecmp(exml_tag_get(exml), "xkbConfigRegistry")) + EXML_RETURN_ON_ERROR(exml); + + exml_down(exml); + + found = 0; + while (!found) + { + if (!strcasecmp(exml_tag_get(exml), "modelList")) found = 1; + else + { + if (!exml_next_nomove(exml)) + break; + } } - if (found) return; - ld = E_NEW(Language_Def, 1); - if (!ld) return; + if (!found) + EXML_RETURN_ON_ERROR(exml); - ld->lang_name = evas_stringshare_add(lang_name); - ld->lang_shortcut = evas_stringshare_add(lang_shortcut); - ld->lang_flag = !lang_flag ? NULL : evas_stringshare_add(lang_flag); - ld->kbd_layout = evas_list_append(ld->kbd_layout, evas_stringshare_add(kbd_layout)); - if (kbd_layout_variant) - ld->kbd_variant = evas_list_append(ld->kbd_variant, evas_stringshare_add(kbd_layout_variant)); + exml_down(exml); - language_def_list = evas_list_append(language_def_list, ld); + if (strcasecmp(exml_tag_get(exml), "model")) + EXML_RETURN_ON_ERROR(exml); - language_def_list = evas_list_sort(language_def_list, evas_list_count(language_def_list), - _lang_def_language_sort_cb); + // here we run through all the kbd_models + while (1) + { + char buf[1024]; + static counter = 0; + Language_Kbd_Model *lkm; + + EXML_Node *current_model_node = exml_get(exml); + + exml_down(exml); + //here we should have an configItem tag + if (!strcasecmp(exml_tag_get(exml), "configItem")) + { + Language_Kbd_Model *lkm; + + lkm = E_NEW(Language_Kbd_Model, 1); + if (lkm) + { + // here we step into configItem + exml_down(exml); + + // here we run over the all elements in configItem + while (1) + { + char *tag = exml_tag_get(exml); + + if (!strcasecmp(tag, "name")) + lkm->kbd_model = evas_stringshare_add(exml_value_get(exml)); + + if (!strcasecmp(tag, "description")) + { + char *attr = exml_attribute_get(exml, "xml:lang"); + //FIXME: take into account current E localization + if (!attr) + lkm->kbd_model_desctiption = + evas_stringshare_add(exml_value_get(exml)); + } + + if (lkm->kbd_model && lkm->kbd_model_desctiption) + break; + + if (!exml_next_nomove(exml)) + break; + } + + if (lkm->kbd_model && lkm->kbd_model_desctiption) + language_kbd_model_list = evas_list_append(language_kbd_model_list, lkm); + else + { + if (lkm->kbd_model) evas_stringshare_del(lkm->kbd_model); + if (lkm->kbd_model_desctiption) + evas_stringshare_del(lkm->kbd_model_desctiption); + E_FREE(lkm); + } + } + } + + exml_goto_node(exml, current_model_node); + if (!exml_next_nomove(exml)) + break; + } + exml_destroy(exml); + + return 1; } +void +lang_free_kbd_models() +{ + Language_Kbd_Model *lkm; + + while (language_kbd_model_list) + { + lkm = language_kbd_model_list->data; -void -lang_unregister_all_languages() + if (lkm->kbd_model) evas_stringshare_del(lkm->kbd_model); + if (lkm->kbd_model_desctiption) evas_stringshare_del(lkm->kbd_model_desctiption); + E_FREE(lkm); + language_kbd_model_list = evas_list_remove_list(language_kbd_model_list, + language_kbd_model_list); + } +} +int +lang_load_xfree_languages() +{ + EXML *exml; + int found; + + exml = exml_new(); + + if (!exml) return 0; + if (!exml_init(exml)) + EXML_RETURN_ON_ERROR(exml) + + if (!exml_file_read(exml, "/usr/lib/X11/xkb/rules/xfree86.xml")) + EXML_RETURN_ON_ERROR(exml) + + if (strcasecmp(exml_tag_get(exml), "xkbConfigRegistry")) + EXML_RETURN_ON_ERROR(exml) + + exml_down(exml); + + found = 0; + while (!found) + { + if (!strcasecmp(exml_tag_get(exml), "layoutList")) + found = 1; + else + { + if (!exml_next_nomove(exml)) + break; + } + } + + if (!found) + EXML_RETURN_ON_ERROR(exml) + + exml_down(exml); + + if (strcasecmp(exml_tag_get(exml), "layout")) + EXML_RETURN_ON_ERROR(exml) + + while (1) + { + Language_Def *ld; + EXML_Node *cur_layout_node = exml_get(exml); + + ld = E_NEW(Language_Def, 1); + if (ld) + { + // here we enter into "layout" tag + exml_down(exml); + // now we loop in "loyout" tag + while (1) + { + _lang_load_xfree_languages_load_configItem(exml, ld); + _lang_load_xfree_languages_load_variantList(exml, ld); + + if (ld->lang_name && ld->lang_shortcut && ld->kbd_layout) + break; + + if (!exml_next_nomove(exml)) + break; + } + + if (ld->lang_name && ld->lang_shortcut && ld->kbd_layout) + { + _lang_register_language(ld->lang_name, ld->lang_shortcut, + ld->lang_flag, ld->kbd_layout, + ld->kbd_variant); + + if (ld->lang_name) evas_stringshare_del(ld->lang_name); + if (ld->lang_shortcut) evas_stringshare_del(ld->lang_shortcut); + if (ld->lang_flag) evas_stringshare_del(ld->lang_flag); + + while (ld->kbd_layout) + ld->kbd_layout = evas_list_remove_list(ld->kbd_layout, ld->kbd_layout); + + while (ld->kbd_variant) + ld->kbd_variant = evas_list_remove_list(ld->kbd_variant, + ld->kbd_variant); + E_FREE(ld); + } + } + + exml_goto_node(exml, cur_layout_node); + if (!exml_next_nomove(exml)) + break; + } + + exml_destroy(exml); + return 1; +} +void +lang_free_xfree_languages() { Language_Def *ld; while (language_def_list) @@ -70,6 +261,176 @@ language_def_list = evas_list_remove_list(language_def_list, language_def_list); } +} + +/******************* private *********************/ + +int +_lang_load_xfree_languages_load_configItem(EXML *xml, Language_Def *ld) +{ + EXML_Node *current_node; + if (!xml || !ld) return 0; + + if (strcasecmp(exml_tag_get(xml), "configItem")) return 0; + + current_node = exml_get(xml); + + exml_down(xml); + + while (1) + { + char *tag = exml_tag_get(xml); + + if (!strcasecmp(tag, "name")) + { + ld->kbd_layout = evas_list_append(ld->kbd_layout, + evas_stringshare_add(exml_value_get(xml))); + } + + if (!strcasecmp(tag, "shortDescription")) + { + char *attr = exml_attribute_get(xml, "xml:lang"); + //FIXME: take into account current E localization + if (!attr) + { + if (ld->lang_shortcut) evas_stringshare_del(ld->lang_shortcut); + ld->lang_shortcut = evas_stringshare_add(exml_value_get(xml)); + } + + if (!attr) + { + char buf[1024]; + if (ld->lang_flag) evas_stringshare_del(ld->lang_flag); + snprintf(buf, sizeof(buf), "%s_flag", exml_value_get(xml)); + ld->lang_flag = evas_stringshare_add(buf); + } + } + + if (!strcasecmp(tag, "description")) + { + char *attr = exml_attribute_get(xml, "xml:lang"); + //FIXME: take into account current E localization + if (!attr) + { + if (ld->lang_name) evas_stringshare_del(ld->lang_name); + ld->lang_name = evas_stringshare_add(exml_value_get(xml)); + } + } + + if (ld->lang_name && ld->lang_shortcut && ld->kbd_layout) + break; + + if (!exml_next_nomove(xml)) + break; + } + exml_goto_node(xml, current_node); + return 1; +} + +int +_lang_load_xfree_languages_load_variantList(EXML *xml, Language_Def *ld) +{ + EXML_Node *current_node; + if (!xml || !ld) return 0; + + if (strcasecmp(exml_tag_get(xml), "variantList")) return 0; + + current_node = exml_get(xml); + + if (!exml_down(xml)) return 0; + + // now we run through the variantList + while (1) + { + if (!strcasecmp(exml_tag_get(xml), "variant")) + { + EXML_Node *current_variant_node = exml_get(xml); + + exml_down(xml); + if (!strcasecmp(exml_tag_get(xml), "configItem")) + { + exml_down(xml); + // running inside the configItem + while (1) + { + char *tag = exml_tag_get(xml); + if (!strcasecmp(tag, "name")) + { + //we found a name of the variant + ld->kbd_variant = evas_list_append(ld->kbd_variant, + exml_value_get(xml)); + break; + } + + if (!exml_next_nomove(xml)) + break; + } + } + exml_goto_node(xml, current_variant_node); + } + + if (!exml_next_nomove(xml)) + break; + } + + exml_goto_node(xml, current_node); + + return 1; +} + +static void +_lang_register_language(const char *lang_name, const char *lang_shortcut, + const char *lang_flag, Evas_List *kbd_layout, + Evas_List *kbd_layout_variant) +{ + Language_Def *ld; + Evas_List *l; + int found = 0; + int i; + + if (!lang_name || !lang_shortcut || !kbd_layout) return; + + for (l = language_def_list; l && !found; l = l->next) + { + ld = l->data; + + if (!strcmp(ld->lang_name, lang_name)) + found = 1; + } + if (found) + { + for (l = kbd_layout; l; l = l->next) + ld->kbd_layout = evas_list_append(ld->kbd_layout, evas_stringshare_add(l->data)); + + if (kbd_layout_variant) + { + for (l = kbd_layout_variant; l; l = l->next) + ld->kbd_variant = evas_list_append(ld->kbd_variant, evas_stringshare_add(l->data)); + } + } + else + { + ld = E_NEW(Language_Def, 1); + if (!ld) return; + + ld->lang_name = evas_stringshare_add(lang_name); + ld->lang_shortcut = evas_stringshare_add(lang_shortcut); + ld->lang_flag = !lang_flag ? NULL : evas_stringshare_add(lang_flag); + + for (l = kbd_layout; l; l = l->next) + ld->kbd_layout = evas_list_append(ld->kbd_layout, evas_stringshare_add(l->data)); + + if (kbd_layout_variant) + { + for (l = kbd_layout_variant; l; l = l->next) + ld->kbd_variant = evas_list_append(ld->kbd_variant, evas_stringshare_add(l->data)); + } + } + + language_def_list = evas_list_append(language_def_list, ld); + + language_def_list = evas_list_sort(language_def_list, evas_list_count(language_def_list), + _lang_def_language_sort_cb); } int =================================================================== RCS file: /cvs/e/e_modules/language/e_mod_lang.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_mod_lang.h 10 May 2006 22:49:01 -0000 1.1 +++ e_mod_lang.h 12 May 2006 11:02:31 -0000 1.2 @@ -3,8 +3,15 @@ #include <e.h> -typedef struct _Language Language; -typedef struct _Language_Def Language_Def; +typedef struct _Language Language; +typedef struct _Language_Def Language_Def; +typedef struct _Language_Kbd_Model Language_Kbd_Model; + +struct _Language_Kbd_Model +{ + const char *kbd_model; + const char *kbd_model_desctiption; +}; struct _Language { @@ -25,13 +32,19 @@ Evas_List *kbd_variant; }; -void lang_register_language(const char *lang_name, const char *lang_shortcut, +/*void lang_register_language(const char *lang_name, const char *lang_shortcut, const char *lang_flag, const char *kbd_layout, - const char *kbd_layout_variant); + const char *kbd_layout_variant);*/ + +/*void lang_register_language_layout(const char *lang_name, const char *kbd_layout);*/ +/*void lang_register_language_layout_variant(const char *lang_name, const char *kbd_layout_variant);*/ + +/*void lang_unregister_all_languages();*/ -void lang_register_language_layout(const char *lang_name, const char *kbd_layout); -void lang_register_language_layout_variant(const char *lang_name, const char *kbd_layout_variant); +int lang_load_kbd_models(); +void lang_free_kbd_models(); -void lang_unregister_all_languages(); +int lang_load_xfree_languages(); +void lang_free_xfree_languages(); #endif =================================================================== RCS file: /cvs/e/e_modules/language/e_mod_main.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_mod_main.c 10 May 2006 22:49:01 -0000 1.1 +++ e_mod_main.c 12 May 2006 11:02:31 -0000 1.2 @@ -200,11 +200,13 @@ const char *en_v[] = {"basic", NULL}; const char *ru_l[] = {"ru", "ru_KOI", NULL}; const char *ru_v[] = {"basic", "difficult", NULL};*/ - lang_register_language("English", "EN", NULL, "en", "basic"); + //lang_register_language("English", "EN", NULL, "en", "basic"); - lang_register_language("Russian", "RU", NULL, "ru", NULL); + //lang_register_language("Russian", "RU", NULL, "ru", NULL); - lang_register_language("Lithuanian", "LT", NULL, "lt", NULL); + //lang_register_language("Lithuanian", "LT", NULL, "lt", NULL); + + //lang_load_kbd_models(); return l; } @@ -214,6 +216,9 @@ _lang_unregister_module_actions(); _lang_unregister_module_keybindings(l); + //lang_unregister_all_languages(); + //lang_free_kbd_models(); + while (l->conf->languages) { Language *lang = l->conf->languages->data; @@ -506,6 +511,7 @@ E_CONFIG_LIMIT(l->conf->lang_show_indicator, 0, 1); /* this is for debug */ +#if 0 Language *ll; ll = E_NEW(Language, 1); @@ -546,6 +552,7 @@ l->conf->languages = evas_list_append(l->conf->languages, ll); } +#endif } /*static void ------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs