Enlightenment CVS committal Author : shorne Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_int_config_intl.c Log Message: Cleanups, Cleanups * Fix minor mem corruption found while Valgrinding * Get selection for charset to work again * Only list basic locales which are supported by the system =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_config_intl.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- e_int_config_intl.c 9 Oct 2006 14:44:41 -0000 1.11 +++ e_int_config_intl.c 10 Oct 2006 00:23:30 -0000 1.12 @@ -23,6 +23,7 @@ static void _lang_list_load (void *data); static int _region_list_sort (void *data1, void *data2); static void _region_list_load (void *data); +static int _basic_lang_list_sort (void *data1, void *data2); /* Fill the clear lists, fill with language, select */ /* Update lanague */ @@ -32,6 +33,7 @@ static Evas_Bool _language_hash_free_cb (Evas_Hash *hash, const char *key, void *data, void *fdata); static Evas_Bool _region_hash_free_cb (Evas_Hash *hash, const char *key, void *data, void *fdata); static void _intl_current_locale_setup (E_Config_Dialog_Data *cfdata); +static const char *_intl_charset_upper_get (const char *charset); struct _E_Intl_Pair { @@ -82,6 +84,7 @@ Evas_Hash *locale_hash; Evas_List *lang_list; Evas_List *region_list; + Evas_List *blang_list; struct { @@ -606,6 +609,28 @@ while (fscanf(output, "%[^\n]\n", line) == 1) { char *language; + char *basic_language; + + basic_language = e_intl_locale_canonic_get(line, E_INTL_LOC_LANG | E_INTL_LOC_REGION); + if (basic_language) + { + int i; + + i = 0; + while (basic_language_predefined_pairs[i].locale_key) + { + /* if basic language is supported by E and System*/ + if (!strncmp(basic_language_predefined_pairs[i].locale_key, + basic_language, strlen(basic_language))) + { + if (!evas_list_find(cfdata->blang_list, &basic_language_predefined_pairs[i])) + cfdata->blang_list = evas_list_append(cfdata->blang_list, &basic_language_predefined_pairs[i]); + break; + } + i++; + } + } + E_FREE(basic_language); language = e_intl_locale_canonic_get(line, E_INTL_LOC_LANG); @@ -700,24 +725,14 @@ /* Add codeset to the region hash node if it exists */ if (codeset) { - int i; const char * cs; + const char * cs_trans; - /* get the charset UpperCase form */ - /* linear serach */ - i = 0; - cs = NULL; - while (charset_predefined_pairs[i].locale_key) - { - if (!strcmp(charset_predefined_pairs[i].locale_key, codeset)) - { - cs = evas_stringshare_add(charset_predefined_pairs[i].locale_translation); - break; - } - i++; - } - - if (cs == NULL) cs = evas_stringshare_add(codeset); + cs_trans = _intl_charset_upper_get(codeset); + if (cs_trans == NULL) + cs = evas_stringshare_add(codeset); + else + cs = evas_stringshare_add(cs_trans); /* Exclusive */ /* Linear Search */ if (!evas_list_find(region_node->available_codesets, cs)) @@ -744,6 +759,11 @@ free(language); } } + + /* Sort basic languages */ + cfdata->blang_list = evas_list_sort(cfdata->blang_list, + evas_list_count(cfdata->blang_list), + _basic_lang_list_sort); while (e_lang_list) { @@ -786,7 +806,8 @@ cfdata->lang_list = evas_list_free(cfdata->lang_list); cfdata->region_list = evas_list_free(cfdata->region_list); - + cfdata->blang_list = evas_list_free(cfdata->blang_list); + free(cfdata); } @@ -865,7 +886,8 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { Evas_Object *o, *of, *ob, *ot; - const char *cur_sig_loc; + char *cur_sig_loc; + Evas_List *next; int i; cfdata->evas = evas; @@ -887,21 +909,25 @@ } else cur_sig_loc = NULL; - - i = 0; - while (basic_language_predefined_pairs[i].locale_key) + + i = 0; + for (next = cfdata->blang_list; next; next = next->next) { + E_Intl_Pair *pair; const char *key; const char *trans; - key = basic_language_predefined_pairs[i].locale_key; - trans = _(basic_language_predefined_pairs[i].locale_translation); + pair = next->data; + key = pair->locale_key; + trans = _(pair->locale_translation); e_widget_ilist_append(cfdata->gui.blang_list, NULL, trans, NULL, NULL, key); if (cur_sig_loc && !strncmp(key, cur_sig_loc, strlen(cur_sig_loc))) e_widget_ilist_selected_set(cfdata->gui.blang_list, i); i++; } + E_FREE(cur_sig_loc); + e_widget_ilist_go(ob); e_widget_frametable_object_append(of, ob, 0, 0, 2, 6, 1, 1, 1, 1); @@ -936,7 +962,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { Evas_Object *o, *of, *ob, *ot; - + const char *lang, *reg, *cs, *mod; cfdata->evas = evas; _intl_current_locale_setup(cfdata); @@ -1025,9 +1051,27 @@ e_widget_framelist_object_append(of, ot); e_widget_framelist_content_align_set(of, 0.0, 0.0); e_widget_list_object_append(o, of, 1, 1, 0.5); + + /* all these cur_* values are not guaranteed to be const so we need to + * copy them. + */ + lang = NULL; + reg = NULL; + cs = NULL; + mod = NULL; + + if (cfdata->cur_lang) lang = evas_stringshare_add(cfdata->cur_lang); + if (cfdata->cur_reg) reg = evas_stringshare_add(cfdata->cur_reg); + if (cfdata->cur_cs) cs = evas_stringshare_add(cfdata->cur_cs); + if (cfdata->cur_mod) mod = evas_stringshare_add(cfdata->cur_mod); + + _cfdata_language_go(lang, reg, cs, mod, cfdata); + + if (lang) evas_stringshare_del(lang); + if (reg) evas_stringshare_del(reg); + if (cs) evas_stringshare_del(cs); + if (mod) evas_stringshare_del(mod); - _cfdata_language_go(cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod, cfdata); - e_widget_on_change_hook_set(cfdata->gui.lang_list, _ilist_language_cb_change, cfdata); e_widget_on_change_hook_set(cfdata->gui.reg_list, _ilist_region_cb_change, cfdata); e_widget_on_change_hook_set(cfdata->gui.cs_list, _ilist_codeset_cb_change, cfdata); @@ -1134,7 +1178,7 @@ } cfdata->lang_dirty = 0; - + if (lang) { lang_node = evas_hash_find(cfdata->locale_hash, lang); @@ -1269,7 +1313,12 @@ if (region) cfdata->cur_reg = strdup(region); if (codeset) - cfdata->cur_cs = strdup(codeset); + { + const char *cs_trans; + + cs_trans = _intl_charset_upper_get(codeset); + if (cs_trans) cfdata->cur_cs = strdup(cs_trans); + } if (modifier) cfdata->cur_mod = strdup(modifier); @@ -1379,7 +1428,7 @@ cfdata = data; if (!cfdata->region_list) return; - + for (l = cfdata->region_list; l; l = l->next) { E_Intl_Region_Node *rn; @@ -1393,7 +1442,7 @@ trans = rn->region_code; e_widget_ilist_append(cfdata->gui.reg_list, NULL, trans, NULL, NULL, rn->region_code); - + if (cfdata->cur_reg && !strcmp(cfdata->cur_reg, rn->region_code)) { int count; @@ -1402,4 +1451,44 @@ e_widget_ilist_selected_set(cfdata->gui.reg_list, count - 1); } } +} + +static int +_basic_lang_list_sort(void *data1, void *data2) +{ + E_Intl_Pair *ln1, *ln2; + const char *trans1; + const char *trans2; + + if (!data1) return 1; + if (!data2) return -1; + + ln1 = data1; + ln2 = data2; + + if (!ln1->locale_translation) return 1; + trans1 = ln1->locale_translation; + + if (!ln2->locale_translation) return -1; + trans2 = ln2->locale_translation; + + return (strcmp((const char *)trans1, (const char *)trans2)); +} + +const char * +_intl_charset_upper_get(const char *charset) +{ + int i; + + i = 0; + while (charset_predefined_pairs[i].locale_key) + { + if (!strcmp(charset_predefined_pairs[i].locale_key, charset)) + { + return charset_predefined_pairs[i].locale_translation; + } + i++; + } + + return NULL; } ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs