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

Reply via email to