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


SVN revision: 26460
This commit is contained in:
Stafford Mitchell Horne 2006-10-10 00:23:30 +00:00
parent 0f0e801dc2
commit ce6e698871
1 changed files with 119 additions and 30 deletions

View File

@ -23,6 +23,7 @@ static int _lang_list_sort (void *data1, void *data2);
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 _region_hash_cb (Evas_Hash *hash, const char *key, v
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 @@ struct _E_Config_Dialog_Data
Evas_Hash *locale_hash;
Evas_List *lang_list;
Evas_List *region_list;
Evas_List *blang_list;
struct
{
@ -606,6 +609,28 @@ _fill_data(E_Config_Dialog_Data *cfdata)
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 @@ _fill_data(E_Config_Dialog_Data *cfdata)
/* 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))
@ -745,6 +760,11 @@ _fill_data(E_Config_Dialog_Data *cfdata)
}
}
/* 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)
{
free(e_lang_list->data);
@ -786,6 +806,7 @@ _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
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 @@ static Evas_Object *
_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;
@ -889,19 +911,23 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
cur_sig_loc = NULL;
i = 0;
while (basic_language_predefined_pairs[i].locale_key)
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 @@ static Evas_Object *
_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);
@ -1026,7 +1052,25 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_framelist_content_align_set(of, 0.0, 0.0);
e_widget_list_object_append(o, of, 1, 1, 0.5);
_cfdata_language_go(cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod, cfdata);
/* 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);
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);
@ -1269,7 +1313,12 @@ _intl_current_locale_setup(E_Config_Dialog_Data *cfdata)
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);
@ -1403,3 +1452,43 @@ _region_list_load(void *data)
}
}
}
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;
}