enlightenment/src/modules/conf_intl/e_int_config_intl.c

1646 lines
55 KiB
C
Raw Normal View History

#include "e.h"
2012-06-13 23:55:01 -07:00
typedef struct _E_Intl_Pair E_Intl_Pair;
typedef struct _E_Intl_Langauge_Node E_Intl_Language_Node;
2012-06-13 23:55:01 -07:00
typedef struct _E_Intl_Region_Node E_Intl_Region_Node;
static void *_create_data(E_Config_Dialog *cfd);
static void *_create_desklock_data(E_Config_Dialog *cfd);
2012-06-13 23:55:01 -07:00
static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _basic_advanced_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _basic_advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
2012-06-13 23:55:01 -07:00
static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static void _ilist_basic_language_cb_change(void *data, Evas_Object *obj);
static void _ilist_language_cb_change(void *data, Evas_Object *obj);
static void _ilist_region_cb_change(void *data, Evas_Object *obj);
static void _ilist_codeset_cb_change(void *data, Evas_Object *obj);
static void _ilist_modifier_cb_change(void *data, Evas_Object *obj);
static int _lang_list_sort(const void *data1, const void *data2);
static void _lang_list_load(void *data, int *sel);
2012-06-13 23:55:01 -07:00
static int _region_list_sort(const void *data1, const void *data2);
static void _region_list_load(void *data);
static int _basic_lang_list_sort(const void *data1, const void *data2);
/* Fill the clear lists, fill with language, select */
/* Update lanague */
2012-06-13 23:55:01 -07:00
static void _cfdata_language_go(const char *lang, const char *region, const char *codeset, const char *modifier, E_Config_Dialog_Data *cfdata);
static Eina_Bool _lang_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata);
static Eina_Bool _region_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata);
static Eina_Bool _language_hash_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__);
static Eina_Bool _region_hash_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__);
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
{
const char *locale_key;
const char *locale_icon;
const char *locale_translation;
};
/* We need to store a map of languages -> Countries -> Extra
*
* Extra:
* Each region has its own Encodings
* Each region has its own Modifiers
*/
struct _E_Intl_Langauge_Node
{
2012-06-13 23:55:01 -07:00
const char *lang_code; /* en */
const char *lang_name; /* English (trans in ilist) */
const char *lang_icon;
2012-06-13 23:55:01 -07:00
int lang_available; /* defined in e translation */
Eina_Hash *region_hash; /* US->utf8 */
};
struct _E_Intl_Region_Node
{
2012-06-13 23:55:01 -07:00
const char *region_code; /* US */
const char *region_name; /* United States */
const char *region_icon;
Eina_List *available_codesets;
Eina_List *available_modifiers;
};
struct _E_Config_Dialog_Data
{
E_Config_Dialog *cfd;
2012-06-13 23:55:01 -07:00
Evas *evas;
/* Current data */
2012-06-13 23:55:01 -07:00
char *cur_language;
2012-06-13 23:55:01 -07:00
const char *cur_blang;
2012-06-13 23:55:01 -07:00
const char *cur_lang;
const char *cur_reg;
const char *cur_cs;
const char *cur_mod;
2012-06-13 23:55:01 -07:00
int lang_dirty;
2012-06-13 23:55:01 -07:00
Eina_Hash *locale_hash;
Eina_List *lang_list;
Eina_List *region_list;
Eina_List *blang_list;
struct
2012-06-13 23:55:01 -07:00
{
Evas_Object *blang_list;
2012-06-13 23:55:01 -07:00
Evas_Object *lang_list;
Evas_Object *reg_list;
Evas_Object *cs_list;
Evas_Object *mod_list;
2012-06-13 23:55:01 -07:00
Evas_Object *locale_entry;
} gui;
Eina_Bool desklock : 1;
};
2012-06-13 23:55:01 -07:00
const E_Intl_Pair basic_language_predefined_pairs[] = {
{"ar_AE.UTF-8", "ara_flag.png", "العربية"},
{"bg_BG.UTF-8", "bg_flag.png", "Български"},
{"ca_ES.UTF-8", "cat_flag.png", "Català"},
{"cs_CZ.UTF-8", "cz_flag.png", "Čeština"},
{"da_DK.UTF-8", "dk_flag.png", "Dansk"},
{"de_DE.UTF-8", "de_flag.png", "Deutsch"},
{"en_US.UTF-8", "us_flag.png", "English"},
{"en_GB.UTF-8", "gb_flag.png", "British English"},
{"el_GR.UTF-8", "gr_flag.png", "Ελληνικά"},
{"eo_US.UTF-8", "epo_flag.png", "Esperanto"},
2012-06-13 23:55:01 -07:00
{"eo.UTF-8", "epo_flag.png", "Esperanto"},
{"es_AR.UTF-8", "ar_flag.png", "Español"},
{"et_ET.UTF-8", "ee_flag.png", "Eesti keel"},
{"fi_FI.UTF-8", "fi_flag.png", "Suomi"},
{"fo_FO.UTF-8", "fo_flag.png", "Føroyskt"},
{"fr_CH.UTF-8", "ch_flag.png", "Français (Suisse)"},
{"fr_FR.UTF-8", "fr_flag.png", "Français"},
{"he_HE.UTF-8", "il_flag.png", "עברית"},
{"hr_HR.UTF-8", "hr_flag.png", "Hrvatski"},
{"hu_HU.UTF-8", "hu_flag.png", "Magyar"},
{"it_IT.UTF-8", "it_flag.png", "Italiano"},
{"ja_JP.UTF-8", "jp_flag.png", "日本語"},
{"km_KM.UTF-8", "kh_flag.png", "ភាសាខ្មែរ"},
{"ko_KR.UTF-8", "kr_flag.png", "한국어"},
{"ku.UTF-8", "ku_flag.png", "یدروك"},
{"lt_LT.UTF-8", "lt_flag.png", "Lietuvių kalba"},
{"ms_MY.UTF-8", "my_flag.png", "Bahasa Melayu"},
{"nb_NO.UTF-8", "no_flag.png", "Norsk Bokmål"},
{"nl_NL.UTF-8", "nl_flag.png", "Nederlands"},
{"pl_PL.UTF-8", "pl_flag.png", "Polski"},
{"pt_BR.UTF-8", "br_flag.png", "Português"},
{"ru_RU.UTF-8", "ru_flag.png", "Русский"},
{"sk_SK.UTF-8", "sk_flag.png", "Slovenčina"},
{"sl_SI.UTF-8", "si_flag.png", "Slovenščina"},
{"sv_SE.UTF-8", "se_flag.png", "Svenska"},
{"tr_TR.UTF-8", "tr_flag.png", "Türkçe"},
{"uk_UK.UTF-8", "ua_flag.png", "Українська мова"},
{"zh_CN.UTF-8", "cn_flag.png", "中文 (繁体)"},
{"zh_TW.UTF-8", "tw_flag.png", "中文 (繁體)"},
{ NULL, NULL, NULL }
};
2012-06-13 23:55:01 -07:00
const E_Intl_Pair language_predefined_pairs[] = {
{"aa", NULL, "Qafár af"},
{"af", NULL, "Afrikaans"},
{"ak", NULL, "Akan"},
{"am", NULL, "አማርኛ"},
{"an", NULL, "Aragonés"},
{"ar", NULL, "ةيبرعلا"},
{"as", NULL, "অসমীয়া"},
{"az", NULL, "Azərbaycan dili"},
{"be", NULL, "Беларуская мова"},
{"bg", NULL, "Български"},
{"bn", NULL, "বাংলা"},
{"br", NULL, "Brezhoneg"},
{"bs", NULL, "Bosanski"},
{"byn", NULL, "ብሊና"},
{"ca", NULL, "Català"},
{"cch", NULL, "Atsam"},
{"cs", NULL, "Čeština"},
{"cy", NULL, "Cymraeg"},
{"da", NULL, "Dansk"},
{"de", NULL, "Deutsch"},
{"dv", NULL, "ދިވެހި"},
{"dz", NULL, "Dzongkha"},
{"ee", NULL, "Eʋegbe"},
{"el", NULL, "Ελληνικά"},
{"en", NULL, "English"},
{"eo", NULL, "Esperanto"},
{"es", NULL, "Español"},
{"et", NULL, "Eesti keel"},
{"eu", NULL, "Euskara"},
{"fa", NULL, "یسراف"},
{"fi", NULL, "Suomi"},
{"fo", NULL, "Føroyskt"},
{"fr", NULL, "Français"},
{"fur", NULL, "Furlan"},
{"ga", NULL, "Gaeilge"},
{"gaa", NULL, ""},
{"gez", NULL, "ግዕዝ"},
{"gl", NULL, "Galego"},
{"gu", NULL, "Gujarati"},
{"gv", NULL, "Yn Ghaelg"},
{"ha", NULL, "Hausa"},
{"haw", NULL, "ʻŌlelo Hawaiʻi"},
{"he", NULL, "עברית"},
{"hi", NULL, "Hindi"},
{"hr", NULL, "Hrvatski"},
{"hu", NULL, "Magyar"},
{"hy", NULL, "Հայերեն"},
{"ia", NULL, "Interlingua"},
{"id", NULL, "Indonesian"},
{"ig", NULL, "Igbo"},
{"is", NULL, "Íslenska"},
{"it", NULL, "Italiano"},
{"iu", NULL, "ᐃᓄᒃᑎᑐᑦ"},
{"iw", NULL, "עברית"},
{"ja", NULL, "日本語"},
{"ka", NULL, "ქართული"},
{"kaj", NULL, "Jju"},
{"kam", NULL, "Kikamba"},
{"kcg", NULL, "Tyap"},
{"kfo", NULL, "Koro"},
{"kk", NULL, "Qazaq"},
{"kl", NULL, "Kalaallisut"},
{"km", NULL, "ភាសាខ្មែរ"},
{"kn", NULL, "ಕನ್ನಡ"},
{"ko", NULL, "한국어"},
{"kok", NULL, "Konkani"},
{"ku", NULL, "یدروك"},
{"kw", NULL, "Kernowek"},
{"ky", NULL, "Кыргыз тили"},
{"ln", NULL, "Lingála"},
{"lo", NULL, "ພາສາລາວ"},
{"lt", NULL, "Lietuvių kalba"},
{"lv", NULL, "Latviešu"},
{"mi", NULL, "Te Reo Māori"},
{"mk", NULL, "Македонски"},
{"ml", NULL, "മലയാളം"},
{"mn", NULL, "Монгол"},
{"mr", NULL, "मराठी"},
{"ms", NULL, "Bahasa Melayu"},
{"mt", NULL, "Malti"},
{"nb", NULL, "Norsk Bokmål"},
{"ne", NULL, "नेपाली"},
{"nl", NULL, "Nederlands"},
{"nn", NULL, "Norsk Nynorsk"},
{"no", NULL, "Norsk"},
{"nr", NULL, "isiNdebele"},
{"nso", NULL, "Sesotho sa Leboa"},
{"ny", NULL, "Chicheŵa"},
{"oc", NULL, "Occitan"},
{"om", NULL, "Oromo"},
{"or", NULL, "ଓଡ଼ିଆ"},
{"pa", NULL, "ਪੰਜਾਬੀ"},
{"pl", NULL, "Polski"},
{"ps", NULL, "وتښپ"},
{"pt", NULL, "Português"},
{"ro", NULL, "Română"},
{"ru", NULL, "Русский"},
{"rw", NULL, "Kinyarwanda"},
{"sa", NULL, "संस्कृतम्"},
{"se", NULL, "Davvisápmi"},
{"sh", NULL, "Srpskohrvatski/Српскохрватски"},
{"sid", NULL, "Sidámo 'Afó"},
{"sk", NULL, "Slovenčina"},
{"sl", NULL, "Slovenščina"},
{"so", NULL, "af Soomaali"},
{"sq", NULL, "Shqip"},
{"sr", NULL, "Српски"},
{"ss", NULL, "Swati"},
{"st", NULL, "Southern Sotho"},
{"sv", NULL, "Svenska"},
{"sw", NULL, "Swahili"},
{"syr", NULL, "Syriac"},
{"ta", NULL, "தமிழ்"},
{"te", NULL, "తెలుగు"},
{"tg", NULL, "Тоҷикӣ"},
{"th", NULL, "ภาษาไทย"},
{"ti", NULL, "ትግርኛ"},
{"tig", NULL, "ቲግሬ"},
{"tl", NULL, "Tagalog"},
{"tn", NULL, "Setswana"},
{"tr", NULL, "Türkçe"},
{"ts", NULL, "Tsonga"},
{"tt", NULL, "Татарча"},
{"uk", NULL, "Українська мова"},
{"ur", NULL, "ودراُ"},
{"uz", NULL, "Ozbek"},
{"ve", NULL, "Venda"},
{"vi", NULL, "Tiếng Việt"},
{"wa", NULL, "Walon"},
{"wal", NULL, "Walamo"},
{"xh", NULL, "Xhosa"},
{"yi", NULL, "שידיִי"},
{"yo", NULL, "èdèe Yorùbá"},
{"zh", NULL, "汉语/漢語"},
{"zu", NULL, "Zulu"},
{ NULL, NULL, NULL}
};
2012-06-13 23:55:01 -07:00
const E_Intl_Pair region_predefined_pairs[] = {
{ "AF", "af_flag.png", "Afghanistan"},
{ "AX", NULL, "Åland"},
{ "AL", "al_flag.png", "Shqipëria"},
{ "DZ", NULL, "Algeria"},
{ "AS", NULL, "Amerika Sāmoa"},
{ "AD", "ad_flag.png", "Andorra"},
{ "AO", NULL, "Angola"},
{ "AI", NULL, "Anguilla"},
{ "AQ", NULL, "Antarctica"},
{ "AG", NULL, "Antigua and Barbuda"},
{ "AR", "ar_flag.png", "Argentina"},
{ "AM", "am_flag.png", "Հայաստան"},
{ "AW", NULL, "Aruba"},
{ "AU", NULL, "Australia"},
{ "AT", "at_flag.png", "Österreich"},
{ "AZ", "az_flag.png", "Azərbaycan"},
{ "BS", NULL, "Bahamas"},
{ "BH", NULL, "Bahrain"},
{ "BD", "bd_flag.png", "বাংলাদেশ"},
{ "BB", NULL, "Barbados"},
{ "BY", "by_flag.png", "Беларусь"},
{ "BE", "be_flag.png", "Belgium"},
{ "BZ", NULL, "Belize"},
{ "BJ", NULL, "Bénin"},
{ "BM", NULL, "Bermuda"},
{ "BT", "bt_flag.png", "Bhutan"},
{ "BO", NULL, "Bolivia"},
{ "BA", "ba_flag.png", "Bosnia and Herzegovina"},
{ "BW", "bw_flag.png", "Botswana"},
{ "BV", NULL, "Bouvetøya"},
{ "BR", "br_flag.png", "Brazil"},
{ "IO", NULL, "British Indian Ocean Territory"},
{ "BN", NULL, "Brunei Darussalam"},
{ "BG", "bg_flag.png", "България"},
{ "BF", NULL, "Burkina Faso"},
{ "BI", NULL, "Burundi"},
{ "KH", "kh_flag.png", "Cambodia"},
{ "CM", "cm_flag.png", "Cameroon"},
{ "CA", "ca_flag.png", "Canada"},
{ "CV", NULL, "Cape Verde"},
{ "KY", NULL, "Cayman Islands"},
{ "CF", NULL, "Central African Republic"},
{ "TD", NULL, "Chad"},
{ "CL", NULL, "Chile"},
{ "CN", "cn_flag.png", "中國"},
{ "CX", NULL, "Christmas Island"},
{ "CC", NULL, "Cocos (keeling) Islands"},
{ "CO", NULL, "Colombia"},
{ "KM", NULL, "Comoros"},
{ "CG", NULL, "Congo"},
{ "CD", "cd_flag.png", "Congo"},
{ "CK", NULL, "Cook Islands"},
{ "CR", NULL, "Costa Rica"},
{ "CI", NULL, "Cote d'Ivoire"},
{ "HR", "hr_flag.png", "Hrvatska"},
{ "CU", NULL, "Cuba"},
{ "CY", NULL, "Cyprus"},
{ "CZ", "cz_flag.png", "Česká republika"},
{ "DK", "dk_flag.png", "Danmark"},
{ "DJ", NULL, "Djibouti"},
{ "DM", NULL, "Dominica"},
{ "DO", NULL, "República Dominicana"},
{ "EC", NULL, "Ecuador"},
{ "EG", NULL, "Egypt"},
{ "SV", NULL, "El Salvador"},
{ "GQ", NULL, "Equatorial Guinea"},
{ "ER", NULL, "Eritrea"},
{ "EE", "ee_flag.png", "Eesti"},
{ "ET", "et_flag.png", "Ethiopia"},
{ "FK", NULL, "Falkland Islands (malvinas)"},
{ "FO", "fo_flag.png", "Faroe Islands"},
{ "FJ", NULL, "Fiji"},
{ "FI", "fi_flag.png", "Finland"},
{ "FR", "fr_flag.png", "France"},
{ "GF", NULL, "French Guiana"},
{ "PF", NULL, "French Polynesia"},
{ "TF", NULL, "French Southern Territories"},
{ "GA", NULL, "Gabon"},
{ "GM", NULL, "Gambia"},
{ "GE", "ge_flag.png", "Georgia"},
{ "DE", "de_flag.png", "Deutschland"},
{ "GH", "gh_flag.png", "Ghana"},
{ "GI", NULL, "Gibraltar"},
{ "GR", "gr_flag.png", "Greece"},
{ "GL", NULL, "Greenland"},
{ "GD", NULL, "Grenada"},
{ "GP", NULL, "Guadeloupe"},
{ "GU", NULL, "Guam"},
{ "GT", NULL, "Guatemala"},
{ "GG", NULL, "Guernsey"},
{ "GN", "gn_flag.png", "Guinea"},
{ "GW", NULL, "Guinea-Bissau"},
{ "GY", NULL, "Guyana"},
{ "HT", NULL, "Haiti"},
{ "HM", NULL, "Heard Island and Mcdonald Islands"},
{ "VA", NULL, "Holy See (Vatican City State)"},
{ "HN", NULL, "Honduras"},
{ "HK", NULL, "Hong Kong"},
{ "HU", "hu_flag.png", "Magyarország"},
{ "IS", "is_flag.png", "Iceland"},
{ "IN", "in_flag.png", "India"},
{ "ID", NULL, "Indonesia"},
{ "IR", "ir_flag.png", "Iran"},
{ "IQ", "iq_flag.png", "Iraq"},
{ "IE", "ie_flag.png", "Éire"},
{ "IM", NULL, "Isle Of Man"},
{ "IL", "il_flag.png", "Israel"},
{ "IT", "it_flag.png", "Italia"},
{ "JM", NULL, "Jamaica"},
{ "JP", "jp_flag.png", "日本"},
{ "JE", NULL, "Jersey"},
{ "JO", NULL, "Jordan"},
{ "KZ", "kz_flag.png", "Kazakhstan"},
{ "KE", "ke_flag.png", "Kenya"},
{ "KI", NULL, "Kiribati"},
{ "KP", NULL, "Korea"},
{ "KR", "kr_flag.png", "Korea"},
{ "KW", NULL, "Kuwait"},
{ "KG", "kg_flag.png", "Kyrgyzstan"},
{ "LA", "la_flag.png", "Lao People's Democratic Republic"},
{ "LV", "lv_flag.png", "Latvija"},
{ "LB", NULL, "Lebanon"},
{ "LS", NULL, "Lesotho"},
{ "LR", NULL, "Liberia"},
{ "LY", NULL, "Libyan Arab Jamahiriya"},
{ "LI", NULL, "Liechtenstein"},
{ "LT", "lt_flag.png", "Lietuva"},
{ "LU", NULL, "Lëtzebuerg"},
{ "MO", NULL, "Macao"},
{ "MK", "mk_flag.png", "Македонија"},
{ "MG", NULL, "Madagascar"},
{ "MW", NULL, "Malawi"},
{ "MY", "my_flag.png", "Malaysia"},
{ "MV", "mv_flag.png", "Maldives"},
{ "ML", "ml_flag.png", "Mali"},
{ "MT", "mt_flag.png", "Malta"},
{ "MH", NULL, "Marshall Islands"},
{ "MQ", NULL, "Martinique"},
{ "MR", NULL, "Mauritania"},
{ "MU", NULL, "Mauritius"},
{ "YT", NULL, "Mayotte"},
{ "MX", NULL, "Mexico"},
{ "FM", NULL, "Micronesia"},
{ "MD", NULL, "Moldova"},
{ "MC", NULL, "Monaco"},
{ "MN", "mn_flag.png", "Mongolia"},
{ "ME", NULL, "Montenegro"},
{ "MS", NULL, "Montserrat"},
{ "MA", "ma_flag.png", "Morocco"},
{ "MZ", NULL, "Mozambique"},
{ "MM", "mm_flag.png", "Myanmar"},
{ "NA", NULL, "Namibia"},
{ "NR", NULL, "Nauru"},
{ "NP", "np_flag.png", "Nepal"},
{ "NL", "nl_flag.png", "Nederland"},
{ "AN", NULL, "Netherlands Antilles"},
{ "NC", NULL, "New Caledonia"},
{ "NZ", NULL, "New Zealand"},
{ "NI", NULL, "Nicaragua"},
{ "NE", NULL, "Niger"},
{ "NG", "ng_flag.png", "Nigeria"},
{ "NU", NULL, "Niue"},
{ "NF", NULL, "Norfolk Island"},
{ "MP", NULL, "Northern Mariana Islands"},
{ "NO", "no_flag.png", "Norge"},
{ "OM", NULL, "Oman"},
{ "PK", "pk_flag.png", "Pakistan"},
{ "PW", NULL, "Palau"},
{ "PS", NULL, "Palestinian Territory"},
{ "PA", NULL, "Panama"},
{ "PG", NULL, "Papua New Guinea"},
{ "PY", NULL, "Paraguay"},
{ "PE", NULL, "Peru"},
{ "PH", "ph_flag.png", "Philippines"},
{ "PN", NULL, "Pitcairn"},
{ "PL", "pl_flag.png", "Poland"},
{ "PT", "pt_flag.png", "Portugal"},
{ "PR", NULL, "Puerto Rico"},
{ "QA", NULL, "Qatar"},
{ "RE", NULL, "Reunion"},
{ "RO", "ro_flag.png", "Romania"},
{ "RU", "ru_flag.png", "Russian Federation"},
{ "RW", NULL, "Rwanda"},
{ "SH", NULL, "Saint Helena"},
{ "KN", NULL, "Saint Kitts and Nevis"},
{ "LC", NULL, "Saint Lucia"},
{ "PM", NULL, "Saint Pierre and Miquelon"},
{ "VC", NULL, "Saint Vincent and the Grenadines"},
{ "WS", NULL, "Samoa"},
{ "SM", NULL, "San Marino"},
{ "ST", NULL, "Sao Tome and Principe"},
{ "SA", NULL, "Saudi Arabia"},
{ "SN", "sn_flag.png", "Senegal"},
{ "RS", "rs_flag.png", "Serbia"},
{ "SC", NULL, "Seychelles"},
{ "SL", NULL, "Sierra Leone"},
{ "SG", NULL, "Singapore"},
{ "SK", "sk_flag.png", "Slovakia"},
{ "SI", "si_flag.png", "Slovenia"},
{ "SB", NULL, "Solomon Islands"},
{ "SO", NULL, "Somalia"},
{ "ZA", "za_flag.png", "South Africa"},
{ "GS", NULL, "South Georgia and the South Sandwich Islands"},
{ "ES", "es_flag.png", "Spain"},
{ "LK", "lk_flag.png", "Sri Lanka"},
{ "SD", NULL, "Sudan"},
{ "SR", NULL, "Suriname"},
{ "SJ", NULL, "Svalbard and Jan Mayen"},
{ "SZ", NULL, "Swaziland"},
{ "SE", "se_flag.png", "Sweden"},
{ "CH", "ch_flag.png", "Switzerland"},
{ "SY", "sy_flag.png", "Syrian Arab Republic"},
{ "TW", "tw_flag.png", "Taiwan"},
{ "TJ", "tj_flag.png", "Tajikistan"},
{ "TZ", "tz_flag.png", "Tanzania"},
{ "TH", "th_flag.png", "Thailand"},
{ "TL", NULL, "Timor-Leste"},
{ "TG", NULL, "Togo"},
{ "TK", NULL, "Tokelau"},
{ "TO", NULL, "Tonga"},
{ "TT", NULL, "Trinidad and Tobago"},
{ "TN", NULL, "Tunisia"},
{ "TR", "tr_flag.png", "Turkey"},
{ "TM", "tm_flag.png", "Turkmenistan"},
{ "TC", NULL, "Turks and Caicos Islands"},
{ "TV", NULL, "Tuvalu"},
{ "UG", NULL, "Uganda"},
{ "UA", "ua_flag.png", "Ukraine"},
{ "AE", NULL, "United Arab Emirates"},
{ "GB", "gb_flag.png", "United Kingdom"},
{ "US", "us_flag.png", "United States"},
{ "UM", NULL, "United States Minor Outlying Islands"},
{ "UY", NULL, "Uruguay"},
{ "UZ", "uz_flag.png", "Uzbekistan"},
{ "VU", NULL, "Vanuatu"},
{ "VE", NULL, "Venezuela"},
{ "VN", "vn_flag.png", "Viet Nam"},
{ "VG", NULL, "Virgin Islands"},
{ "VI", NULL, "Virgin Islands"},
{ "WF", NULL, "Wallis and Futuna"},
{ "EH", NULL, "Western Sahara"},
{ "YE", NULL, "Yemen"},
{ "ZM", NULL, "Zambia"},
{ "ZW", NULL, "Zimbabwe"},
{ NULL, NULL, NULL}
};
/* This comes from
$ man charsets
* and
$ locale -a | grep -v @ | grep "\." | cut -d . -f 2 | sort -u
*
* On some machines is complains if codesets don't look like this
* On linux its not really a problem but BSD has issues. So we neet to
* make sure that locale -a output gets converted to upper-case form in
* all situations just to be safe.
*/
2012-06-13 23:55:01 -07:00
const E_Intl_Pair charset_predefined_pairs[] = {
/* These are in locale -a but not in charsets */
{"cp1255", NULL, "CP1255"},
{"euc", NULL, "EUC"},
{"georgianps", NULL, "GEORGIAN-PS"},
{"iso885914", NULL, "ISO-8859-14"},
{"koi8t", NULL, "KOI8-T"},
{"tcvn", NULL, "TCVN"},
{"ujis", NULL, "UJIS"},
2012-06-13 23:55:01 -07:00
/* These are from charsets man page */
{"big5", NULL, "BIG5"},
{"big5hkscs", NULL, "BIG5-HKSCS"},
{"cp1251", NULL, "CP1251"},
{"eucjp", NULL, "EUC-JP"},
{"euckr", NULL, "EUC-KR"},
{"euctw", NULL, "EUC-TW"},
{"gb18030", NULL, "GB18030"},
{"gb2312", NULL, "GB2312"},
{"gbk", NULL, "GBK"},
{"iso88591", NULL, "ISO-8859-1"},
{"iso885913", NULL, "ISO-8859-13"},
{"iso885915", NULL, "ISO-8859-15"},
{"iso88592", NULL, "ISO-8859-2"},
{"iso88593", NULL, "ISO-8859-3"},
{"iso88595", NULL, "ISO-8859-5"},
{"iso88596", NULL, "ISO-8859-6"},
{"iso88597", NULL, "ISO-8859-7"},
{"iso88598", NULL, "ISO-8859-8"},
{"iso88599", NULL, "ISO-8859-9"},
{"koi8r", NULL, "KOI8-R"},
{"koi8u", NULL, "KOI8-U"},
{"tis620", NULL, "TIS-620"},
{"utf8", NULL, "UTF-8"},
{ NULL, NULL, NULL }
};
2010-01-22 12:28:39 -08:00
E_Config_Dialog *
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
e_int_config_intl(E_Comp *comp, const char *params __UNUSED__)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
if (e_config_dialog_find("E", "language/language_settings")) return NULL;
v = E_NEW(E_Config_Dialog_View, 1);
v->create_cfdata = _create_data;
v->free_cfdata = _free_data;
v->advanced.create_widgets = _advanced_create_widgets;
v->advanced.apply_cfdata = _basic_advanced_apply_data;
v->advanced.check_changed = _basic_advanced_check_changed;
v->basic.create_widgets = _basic_create_widgets;
v->basic.apply_cfdata = _basic_advanced_apply_data;
v->basic.check_changed = _basic_advanced_check_changed;
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
cfd = e_config_dialog_new(comp,
2012-06-13 23:55:01 -07:00
_("Language Settings"),
"E", "language/language_settings",
"preferences-desktop-locale", 0, v, NULL);
return cfd;
}
E_Config_Dialog *
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
e_int_config_desklock_intl(E_Comp *comp, const char *params __UNUSED__)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
if (e_config_dialog_find("E", "language/desklock_language_settings")) return NULL;
v = E_NEW(E_Config_Dialog_View, 1);
v->create_cfdata = _create_desklock_data;
v->free_cfdata = _free_data;
v->advanced.create_widgets = _advanced_create_widgets;
v->advanced.apply_cfdata = _basic_advanced_apply_data;
v->advanced.check_changed = _basic_advanced_check_changed;
v->basic.create_widgets = _basic_create_widgets;
v->basic.apply_cfdata = _basic_advanced_apply_data;
v->basic.check_changed = _basic_advanced_check_changed;
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
cfd = e_config_dialog_new(comp,
_("Desklock Language Settings"),
"E", "language/desklock_language_settings",
"preferences-desktop-locale", 0, v, NULL);
return cfd;
}
/* Build hash tables used for locale navigation. The locale information is
* gathered using the locale -a command.
*
* Below the following terms are used:
* ll - Locale Language Code (Example en)
* RR - Locale Region code (Example US)
* enc - Locale Encoding (Example UTF-8)
* mod - Locale Modifier (Example EURO)
*/
static void
_fill_data(E_Config_Dialog_Data *cfdata)
{
2012-06-13 23:55:01 -07:00
Eina_List *e_lang_list;
FILE *output;
e_lang_list = e_intl_language_list();
/* Get list of all locales and start making map */
#ifdef __OpenBSD__
output = popen("ls /usr/share/locale", "r");
#else
output = popen("locale -a", "r");
#endif
if ( output )
{
2012-06-13 23:55:01 -07:00
char line[32];
while (fscanf(output, "%[^\n]\n", line) == 1)
{
E_Locale_Parts *locale_parts;
locale_parts = e_intl_locale_parts_get(line);
if (locale_parts)
{
char *basic_language = NULL;
2012-06-13 23:55:01 -07:00
if (locale_parts->mask & E_INTL_LOC_REGION)
basic_language = e_intl_locale_parts_combine(locale_parts, E_INTL_LOC_LANG | E_INTL_LOC_REGION);
else if (locale_parts->lang)
basic_language = strdup(locale_parts->lang);
2012-06-13 23:55:01 -07:00
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 (!eina_list_data_find(cfdata->blang_list, &basic_language_predefined_pairs[i]))
cfdata->blang_list = eina_list_append(cfdata->blang_list, &basic_language_predefined_pairs[i]);
break;
}
i++;
}
}
E_FREE(basic_language);
/* If the language is a valid ll_RR[.enc[@mod]] locale add it to the hash */
if (locale_parts->lang)
{
E_Intl_Language_Node *lang_node;
E_Intl_Region_Node *region_node;
/* Add the language to the new locale properties to the hash */
/* First check if the LANGUAGE exists in there already */
lang_node = eina_hash_find(cfdata->locale_hash, locale_parts->lang);
if (!lang_node)
{
Eina_List *next;
int i;
/* create new node */
lang_node = E_NEW(E_Intl_Language_Node, 1);
lang_node->lang_code = eina_stringshare_add(locale_parts->lang);
/* Check if the language list exists */
/* Linear Search */
for (next = e_lang_list; next; next = next->next)
{
char *e_lang;
e_lang = next->data;
if (!strncmp(e_lang, locale_parts->lang, 2) || !strcmp("en", locale_parts->lang))
{
lang_node->lang_available = 1;
break;
}
}
/* Search for translation */
/* Linear Search */
i = 0;
while (language_predefined_pairs[i].locale_key)
{
if (!strcmp(language_predefined_pairs[i].locale_key, locale_parts->lang))
{
lang_node->lang_name = _(language_predefined_pairs[i].locale_translation);
lang_node->lang_icon = language_predefined_pairs[i].locale_icon;
2012-06-13 23:55:01 -07:00
break;
}
i++;
}
if (!cfdata->locale_hash)
cfdata->locale_hash = eina_hash_string_superfast_new(NULL);
eina_hash_add(cfdata->locale_hash, locale_parts->lang, lang_node);
}
/* We now have the current language hash node, lets see if there is
region data that needs to be added.
*/
if (locale_parts->region)
{
region_node = eina_hash_find(lang_node->region_hash, locale_parts->region);
if (!region_node)
{
int i;
/* create new node */
region_node = E_NEW(E_Intl_Region_Node, 1);
region_node->region_code = eina_stringshare_add(locale_parts->region);
/* Get the region translation */
/* Linear Search */
i = 0;
while (region_predefined_pairs[i].locale_key)
{
if (!strcmp(region_predefined_pairs[i].locale_key, locale_parts->region))
{
region_node->region_name = _(region_predefined_pairs[i].locale_translation);
region_node->region_icon = region_predefined_pairs[i].locale_icon;
2012-06-13 23:55:01 -07:00
break;
}
i++;
}
if (!lang_node->region_hash)
lang_node->region_hash = eina_hash_string_superfast_new(NULL);
eina_hash_add(lang_node->region_hash, locale_parts->region, region_node);
}
/* We now have the current region hash node */
/* Add codeset to the region hash node if it exists */
if (locale_parts->codeset)
{
const char *cs = NULL;
const char *cs_trans;
cs_trans = _intl_charset_upper_get(locale_parts->codeset);
if (!cs_trans)
cs = eina_stringshare_add(locale_parts->codeset);
else
cs = eina_stringshare_add(cs_trans);
/* Exclusive */
/* Linear Search */
if (!eina_list_data_find(region_node->available_codesets, cs))
region_node->available_codesets = eina_list_append(region_node->available_codesets, cs);
else eina_stringshare_del(cs);
2012-06-13 23:55:01 -07:00
}
/* Add modifier to the region hash node if it exists */
if (locale_parts->modifier)
{
const char *mod;
mod = eina_stringshare_add(locale_parts->modifier);
/* Find only works here because we are using stringshare*/
/* Exclusive */
/* Linear Search */
if (!eina_list_data_find(region_node->available_modifiers, mod))
region_node->available_modifiers = eina_list_append(region_node->available_modifiers, mod);
}
}
}
e_intl_locale_parts_free(locale_parts);
}
}
/* Sort basic languages */
cfdata->blang_list = eina_list_sort(cfdata->blang_list,
eina_list_count(cfdata->blang_list),
_basic_lang_list_sort);
while (e_lang_list)
2012-06-13 23:55:01 -07:00
{
free(e_lang_list->data);
e_lang_list = eina_list_remove_list(e_lang_list, e_lang_list);
}
pclose(output);
}
/* Make sure we know the currently configured locale */
if (e_config->language)
cfdata->cur_language = strdup(e_config->language);
return;
}
static void *
_create_data(E_Config_Dialog *cfd)
{
E_Config_Dialog_Data *cfdata;
cfdata = E_NEW(E_Config_Dialog_Data, 1);
cfdata->cfd = cfd;
_fill_data(cfdata);
return cfdata;
}
static void *
_create_desklock_data(E_Config_Dialog *cfd)
{
E_Config_Dialog_Data *cfdata;
cfdata = _create_data(cfd);
E_FREE(cfdata->cur_language);
if (e_config->desklock_language)
cfdata->cur_language = strdup(e_config->desklock_language);
cfdata->desklock = 1;
return cfdata;
}
static void
2010-08-19 10:33:21 -07:00
_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
E_FREE(cfdata->cur_language);
eina_stringshare_del(cfdata->cur_blang);
eina_stringshare_del(cfdata->cur_lang);
eina_stringshare_del(cfdata->cur_reg);
eina_stringshare_del(cfdata->cur_cs);
eina_stringshare_del(cfdata->cur_mod);
eina_hash_foreach(cfdata->locale_hash, _language_hash_free_cb, NULL);
eina_hash_free(cfdata->locale_hash);
cfdata->lang_list = eina_list_free(cfdata->lang_list);
cfdata->region_list = eina_list_free(cfdata->region_list);
cfdata->blang_list = eina_list_free(cfdata->blang_list);
E_FREE(cfdata);
}
static Eina_Bool
_language_hash_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
{
E_Intl_Language_Node *node;
node = data;
if (node->lang_code) eina_stringshare_del(node->lang_code);
eina_hash_foreach(node->region_hash, _region_hash_free_cb, NULL);
eina_hash_free(node->region_hash);
free(node);
return 1;
}
static Eina_Bool
_region_hash_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
{
E_Intl_Region_Node *node;
node = data;
if (node->region_code) eina_stringshare_del(node->region_code);
while (node->available_codesets)
{
2012-06-13 23:55:01 -07:00
const char *str;
2012-06-13 23:55:01 -07:00
str = node->available_codesets->data;
if (str) eina_stringshare_del(str);
node->available_codesets =
eina_list_remove_list(node->available_codesets, node->available_codesets);
}
while (node->available_modifiers)
{
2012-06-13 23:55:01 -07:00
const char *str;
2012-06-13 23:55:01 -07:00
str = node->available_modifiers->data;
if (str) eina_stringshare_del(str);
node->available_modifiers =
eina_list_remove_list(node->available_modifiers, node->available_modifiers);
}
free(node);
return 1;
}
static void
_lc_check_del(void *data __UNUSED__)
{
E_Action *a;
a = e_action_find("restart");
if ((a) && (a->func.go)) a->func.go(NULL, NULL);
}
static void
_lc_check(void)
{
char buf[8192];
char buf2[512];
E_Dialog *dia;
buf2[0] = 0;
if (getenv("LC_CTYPE")) strcat(buf2, "<br>LC_CTYPE");
if (getenv("LC_NUMERIC")) strcat(buf2, "<br>LC_NUMERIC");
if (getenv("LC_TIME")) strcat(buf2, "<br>LC_TIME");
if (getenv("LC_COLLATE")) strcat(buf2, "<br>LC_COLLATE");
if (getenv("LC_MONETARY")) strcat(buf2, "<br>LC_MONETARY");
if (getenv("LC_MESSAGES")) strcat(buf2, "<br>LC_MESSAGES");
if (getenv("LC_ALL")) strcat(buf2, "<br>LC_ALL");
if (!buf2[0])
{
_lc_check_del(NULL);
return;
}
snprintf(buf, sizeof(buf), _("You have some extra locale environment<br>"
"variables set that may interfere with<br>"
"correct display of your chosen language.<br>"
"If you don't want these affected, use the<br>"
"Environment variable settings to unset them.<br>"
"The variables that may affect you are<br>"
"as follows:<br>"
"%s"), buf2);
dia = e_util_dialog_internal(_("Possible Locale problems"), buf);
e_object_free_attach_func_set(E_OBJECT(dia), _lc_check_del);
}
static int
_basic_advanced_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
const char *previous;
if (cfdata->desklock)
previous = e_config->desklock_language;
else
previous = e_config->language;
if (e_util_both_str_empty(previous, cfdata->cur_language))
return 0;
return e_util_strcmp(previous, cfdata->cur_language);
}
static int
_basic_advanced_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
if (cfdata->cur_language)
{
if (cfdata->desklock)
{
if (e_config->desklock_language) eina_stringshare_del(e_config->desklock_language);
e_config->desklock_language = NULL;
if ((cfdata->cur_language) && (cfdata->cur_language[0]))
e_config->desklock_language = eina_stringshare_add(cfdata->cur_language);
}
else
{
if (e_config->language) eina_stringshare_del(e_config->language);
e_config->language = NULL;
if ((cfdata->cur_language) && (cfdata->cur_language[0]))
e_config->language = eina_stringshare_add(cfdata->cur_language);
e_intl_language_set(e_config->language);
_lc_check();
}
}
e_config_save_queue();
return 1;
}
static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o, *of, *ob, *ic;
char *cur_sig_loc = NULL;
Eina_List *next;
int i = 0;
char buf[PATH_MAX];
cfdata->evas = evas;
o = e_widget_table_add(evas, 0);
of = e_widget_framelist_add(evas, _("Language Selector"), 0);
ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_blang));
e_widget_size_min_set(ob, 100, 80);
e_widget_on_change_hook_set(ob, _ilist_basic_language_cb_change, cfdata);
cfdata->gui.blang_list = ob;
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1);
/* Load languages */
evas_event_freeze(evas_object_evas_get(ob));
edje_freeze();
e_widget_ilist_freeze(ob);
if (cfdata->cur_language)
{
2012-06-13 23:55:01 -07:00
E_Locale_Parts *locale_parts;
locale_parts = e_intl_locale_parts_get(cfdata->cur_language);
if (locale_parts)
{
if (locale_parts->mask & E_INTL_LOC_REGION)
cur_sig_loc = e_intl_locale_parts_combine(locale_parts,
E_INTL_LOC_LANG | E_INTL_LOC_REGION);
else if (locale_parts->lang)
cur_sig_loc = strdup(locale_parts->lang);
2012-06-13 23:55:01 -07:00
e_intl_locale_parts_free(locale_parts);
}
}
e_prefix_data_snprintf(buf, sizeof(buf), "data/flags/%s", "lang-system.png");
ic = e_util_icon_add(buf, evas);
e_widget_ilist_append(cfdata->gui.blang_list, ic, _("System Default"), NULL, NULL, "");
if ((!cur_sig_loc) || (!cfdata->cur_language))
2012-06-13 23:55:01 -07:00
e_widget_ilist_selected_set(cfdata->gui.blang_list, i);
i++;
for (next = cfdata->blang_list; next; next = next->next)
{
2012-06-13 23:55:01 -07:00
E_Intl_Pair *pair;
const char *key;
const char *trans;
pair = next->data;
key = pair->locale_key;
trans = _(pair->locale_translation);
if (pair->locale_icon)
{
e_prefix_data_snprintf(buf, sizeof(buf), "data/flags/%s", pair->locale_icon);
ic = e_util_icon_add(buf, evas);
}
else
2012-06-13 23:55:01 -07:00
ic = NULL;
e_widget_ilist_append(cfdata->gui.blang_list, ic, trans, NULL, NULL, key);
if ((cur_sig_loc) &&
(!strncmp(key, cur_sig_loc, strlen(cur_sig_loc))))
2012-06-13 23:55:01 -07:00
e_widget_ilist_selected_set(cfdata->gui.blang_list, i);
2012-06-13 23:55:01 -07:00
i++;
}
E_FREE(cur_sig_loc);
e_widget_ilist_go(ob);
e_widget_ilist_thaw(ob);
edje_thaw();
evas_event_thaw(evas_object_evas_get(ob));
of = e_widget_frametable_add(evas, _("Locale Selected"), 0);
ob = e_widget_label_add(evas, _("Locale"));
e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
ob = e_widget_entry_add(evas, &(cfdata->cur_language), NULL, NULL, NULL);
cfdata->gui.locale_entry = ob;
e_widget_entry_readonly_set(cfdata->gui.locale_entry, 1);
e_widget_size_min_set(cfdata->gui.locale_entry, 100, 25);
e_widget_frametable_object_append(of, cfdata->gui.locale_entry,
2012-06-13 23:55:01 -07:00
1, 0, 1, 1, 1, 1, 1, 0);
e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 0, 1, 0);
return o;
}
static Evas_Object *
_advanced_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o, *of, *ob;
const char *lang, *reg, *cs, *mod;
int sel = -1;
cfdata->evas = evas;
_intl_current_locale_setup(cfdata);
o = e_widget_table_add(evas, 0);
of = e_widget_framelist_add(evas, _("Language Selector"), 1);
/* Language List */
ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_lang));
cfdata->gui.lang_list = ob;
/* If lang_list already loaded just use it */
if (!cfdata->lang_list)
eina_hash_foreach(cfdata->locale_hash, _lang_hash_cb, cfdata);
if (cfdata->lang_list)
{
2012-06-13 23:55:01 -07:00
cfdata->lang_list =
eina_list_sort(cfdata->lang_list, eina_list_count(cfdata->lang_list),
_lang_list_sort);
_lang_list_load(cfdata, &sel);
}
e_widget_ilist_go(ob);
e_widget_size_min_set(ob, 140, 200);
e_widget_framelist_object_append(of, ob);
e_widget_ilist_selected_set(ob, sel);
/* Region List */
ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_reg));
cfdata->gui.reg_list = ob;
e_widget_ilist_go(ob);
e_widget_size_min_set(ob, 100, 100);
e_widget_framelist_object_append(of, ob);
e_widget_ilist_selected_set(ob, sel);
/* Codeset List */
ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_cs));
cfdata->gui.cs_list = ob;
e_widget_ilist_go(ob);
e_widget_size_min_set(ob, 100, 100);
e_widget_framelist_object_append(of, ob);
/* Modified List */
ob = e_widget_ilist_add(evas, 0, 0, &(cfdata->cur_mod));
cfdata->gui.mod_list = ob;
e_widget_ilist_go(ob);
e_widget_size_min_set(ob, 100, 100);
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1);
/* Locale selector */
of = e_widget_frametable_add(evas, _("Locale Selected"), 0);
ob = e_widget_label_add(evas, _("Locale"));
e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
ob = e_widget_entry_add(evas, &(cfdata->cur_language), NULL, NULL, NULL);
cfdata->gui.locale_entry = ob;
e_widget_entry_readonly_set(cfdata->gui.locale_entry, 1);
e_widget_size_min_set(cfdata->gui.locale_entry, 100, 25);
e_widget_frametable_object_append(of, cfdata->gui.locale_entry,
2012-06-13 23:55:01 -07:00
0, 1, 1, 1, 1, 1, 1, 0);
e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 0, 1, 0);
/* all these cur_* values are not guaranteed to be const so we need to
* copy them.
*/
lang = eina_stringshare_ref(cfdata->cur_lang);
reg = eina_stringshare_ref(cfdata->cur_reg);
cs = eina_stringshare_ref(cfdata->cur_cs);
mod = eina_stringshare_ref(cfdata->cur_mod);
_cfdata_language_go(lang, reg, cs, mod, cfdata);
eina_stringshare_del(lang);
eina_stringshare_del(reg);
eina_stringshare_del(cs);
eina_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);
e_widget_on_change_hook_set(cfdata->gui.cs_list, _ilist_codeset_cb_change, cfdata);
e_widget_on_change_hook_set(cfdata->gui.mod_list, _ilist_modifier_cb_change, cfdata);
return o;
}
static void
2010-08-19 10:33:21 -07:00
_ilist_basic_language_cb_change(void *data, Evas_Object *obj __UNUSED__)
{
2010-08-19 10:33:21 -07:00
E_Config_Dialog_Data *cfdata;
2010-08-19 10:33:21 -07:00
cfdata = data;
e_widget_entry_text_set(cfdata->gui.locale_entry, cfdata->cur_blang);
}
static void
2010-08-19 10:33:21 -07:00
_ilist_language_cb_change(void *data, Evas_Object *obj __UNUSED__)
{
2010-08-19 10:33:21 -07:00
E_Config_Dialog_Data *cfdata;
cfdata = data;
_cfdata_language_go(cfdata->cur_lang, NULL, NULL, NULL, cfdata);
e_widget_entry_text_set(cfdata->gui.locale_entry, cfdata->cur_lang);
eina_stringshare_del(cfdata->cur_cs);
eina_stringshare_del(cfdata->cur_mod);
cfdata->cur_cs = NULL;
cfdata->cur_mod = NULL;
}
static void
2010-08-19 10:33:21 -07:00
_ilist_region_cb_change(void *data, Evas_Object *obj __UNUSED__)
{
2012-06-13 23:55:01 -07:00
E_Config_Dialog_Data *cfdata;
char locale[32];
cfdata = data;
_cfdata_language_go(cfdata->cur_lang, cfdata->cur_reg, NULL, NULL, cfdata);
if ((cfdata->cur_lang) && (cfdata->cur_lang[0]))
{
sprintf(locale, "%s_%s", cfdata->cur_lang, cfdata->cur_reg);
e_widget_entry_text_set(cfdata->gui.locale_entry, locale);
}
else
2012-06-13 23:55:01 -07:00
e_widget_entry_text_set(cfdata->gui.locale_entry, "");
eina_stringshare_del(cfdata->cur_cs);
eina_stringshare_del(cfdata->cur_mod);
cfdata->cur_cs = NULL;
cfdata->cur_mod = NULL;
}
static void
2010-08-19 10:33:21 -07:00
_ilist_codeset_cb_change(void *data, Evas_Object *obj __UNUSED__)
{
2012-06-13 23:55:01 -07:00
E_Config_Dialog_Data *cfdata;
char locale[32];
cfdata = data;
if ((cfdata->cur_lang) && (cfdata->cur_lang[0]))
{
if (cfdata->cur_mod)
2012-06-13 23:55:01 -07:00
sprintf(locale, "%s_%s.%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod);
else
2012-06-13 23:55:01 -07:00
sprintf(locale, "%s_%s.%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs);
e_widget_entry_text_set(cfdata->gui.locale_entry, locale);
}
else
2012-06-13 23:55:01 -07:00
e_widget_entry_text_set(cfdata->gui.locale_entry, "");
}
static void
2010-08-19 10:33:21 -07:00
_ilist_modifier_cb_change(void *data, Evas_Object *obj __UNUSED__)
{
2012-06-13 23:55:01 -07:00
E_Config_Dialog_Data *cfdata;
char locale[32];
cfdata = data;
if ((cfdata->cur_lang) && (cfdata->cur_lang[0]))
{
if (cfdata->cur_cs)
2012-06-13 23:55:01 -07:00
sprintf(locale, "%s_%s.%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_cs, cfdata->cur_mod);
else
2012-06-13 23:55:01 -07:00
sprintf(locale, "%s_%s@%s", cfdata->cur_lang, cfdata->cur_reg, cfdata->cur_mod);
e_widget_entry_text_set(cfdata->gui.locale_entry, locale);
}
else
2012-06-13 23:55:01 -07:00
e_widget_entry_text_set(cfdata->gui.locale_entry, "");
}
static void
_cfdata_language_go(const char *lang, const char *region, const char *codeset, const char *modifier, E_Config_Dialog_Data *cfdata)
{
E_Intl_Language_Node *lang_node;
int lang_update;
int region_update;
/* Check what changed */
lang_update = 0;
region_update = 0;
evas_event_freeze(evas_object_evas_get(cfdata->gui.cs_list));
evas_event_freeze(evas_object_evas_get(cfdata->gui.mod_list));
edje_freeze();
e_widget_ilist_freeze(cfdata->gui.cs_list);
e_widget_ilist_freeze(cfdata->gui.mod_list);
if ((!lang) || (!lang[0]))
{
e_widget_ilist_clear(cfdata->gui.reg_list);
2012-06-13 23:55:01 -07:00
e_widget_ilist_clear(cfdata->gui.cs_list);
e_widget_ilist_clear(cfdata->gui.mod_list);
}
if (cfdata->lang_dirty || (lang && !region))
{
2012-06-13 23:55:01 -07:00
lang_update = 1;
region_update = 1;
e_widget_ilist_clear(cfdata->gui.cs_list);
e_widget_ilist_clear(cfdata->gui.mod_list);
}
if (lang && region)
{
2012-06-13 23:55:01 -07:00
region_update = 1;
e_widget_ilist_clear(cfdata->gui.cs_list);
e_widget_ilist_clear(cfdata->gui.mod_list);
}
cfdata->lang_dirty = 0;
if (lang)
{
2012-06-13 23:55:01 -07:00
lang_node = eina_hash_find(cfdata->locale_hash, lang);
if (lang_node)
{
if (lang_update)
{
e_widget_ilist_clear(cfdata->gui.reg_list);
cfdata->region_list = eina_list_free(cfdata->region_list);
eina_hash_foreach(lang_node->region_hash,
_region_hash_cb, cfdata);
2012-06-13 23:55:01 -07:00
cfdata->region_list =
eina_list_sort(cfdata->region_list,
eina_list_count(cfdata->region_list),
_region_list_sort);
2012-06-13 23:55:01 -07:00
_region_list_load(cfdata);
}
if (region && region_update)
{
E_Intl_Region_Node *reg_node;
reg_node = eina_hash_find(lang_node->region_hash, region);
if (reg_node)
{
Eina_List *next;
for (next = reg_node->available_codesets; next; next = next->next)
{
const char *cs;
cs = next->data;
e_widget_ilist_append(cfdata->gui.cs_list, NULL, cs, NULL, NULL, cs);
if (codeset && !strcmp(cs, codeset))
{
int count;
count = e_widget_ilist_count(cfdata->gui.cs_list);
e_widget_ilist_selected_set(cfdata->gui.cs_list, count - 1);
}
}
for (next = reg_node->available_modifiers; next; next = next->next)
{
const char *mod;
mod = next->data;
e_widget_ilist_append(cfdata->gui.mod_list, NULL, mod, NULL, NULL, mod);
if (modifier && !strcmp(mod, modifier))
{
int count;
count = e_widget_ilist_count(cfdata->gui.mod_list);
e_widget_ilist_selected_set(cfdata->gui.mod_list, count - 1);
}
}
}
e_widget_ilist_go(cfdata->gui.cs_list);
e_widget_ilist_go(cfdata->gui.mod_list);
}
}
}
e_widget_ilist_thaw(cfdata->gui.cs_list);
e_widget_ilist_thaw(cfdata->gui.mod_list);
edje_thaw();
evas_event_thaw(evas_object_evas_get(cfdata->gui.cs_list));
evas_event_thaw(evas_object_evas_get(cfdata->gui.mod_list));
e_widget_ilist_go(cfdata->gui.reg_list);
}
static Eina_Bool
_lang_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
{
E_Config_Dialog_Data *cfdata;
E_Intl_Language_Node *lang_node;
cfdata = fdata;
lang_node = data;
cfdata->lang_list = eina_list_append(cfdata->lang_list, lang_node);
return 1;
}
static Eina_Bool
_region_hash_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
{
E_Config_Dialog_Data *cfdata;
E_Intl_Region_Node *reg_node;
cfdata = fdata;
reg_node = data;
cfdata->region_list = eina_list_append(cfdata->region_list, reg_node);
return 1;
}
void
_intl_current_locale_setup(E_Config_Dialog_Data *cfdata)
{
eina_stringshare_del(cfdata->cur_lang);
eina_stringshare_del(cfdata->cur_reg);
eina_stringshare_del(cfdata->cur_cs);
eina_stringshare_del(cfdata->cur_mod);
cfdata->cur_lang = NULL;
cfdata->cur_reg = NULL;
cfdata->cur_cs = NULL;
cfdata->cur_mod = NULL;
if (cfdata->cur_language)
{
2012-06-13 23:55:01 -07:00
E_Locale_Parts *locale_parts;
locale_parts = e_intl_locale_parts_get(cfdata->cur_language);
if (locale_parts)
{
cfdata->cur_lang = eina_stringshare_add(locale_parts->lang);
cfdata->cur_reg = eina_stringshare_add(locale_parts->region);
if (locale_parts->codeset)
{
const char *cs_trans;
cs_trans = _intl_charset_upper_get(locale_parts->codeset);
if (!cs_trans)
cfdata->cur_cs = eina_stringshare_add(locale_parts->codeset);
else
cfdata->cur_cs = eina_stringshare_add(cs_trans);
}
cfdata->cur_mod = eina_stringshare_add(locale_parts->modifier);
}
e_intl_locale_parts_free(locale_parts);
}
cfdata->lang_dirty = 1;
}
static int
_lang_list_sort(const void *data1, const void *data2)
{
2008-10-27 03:46:43 -07:00
const E_Intl_Language_Node *ln1, *ln2;
const char *trans1;
const char *trans2;
if (!data1) return 1;
if (!data2) return -1;
ln1 = data1;
ln2 = data2;
if (!ln1->lang_name) return 1;
trans1 = ln1->lang_name;
if (!ln2->lang_name) return -1;
trans2 = ln2->lang_name;
2012-06-13 23:55:01 -07:00
return strcmp(trans1, trans2);
}
static void
_lang_list_load(void *data, int *sel)
{
E_Config_Dialog_Data *cfdata;
Eina_List *l;
Evas_Object *ic;
char buf[PATH_MAX];
if (!data) return;
cfdata = data;
if (!cfdata->lang_list) return;
evas_event_freeze(evas_object_evas_get(cfdata->gui.lang_list));
edje_freeze();
e_widget_ilist_freeze(cfdata->gui.lang_list);
e_prefix_data_snprintf(buf, sizeof(buf), "data/flags/%s", "lang-system.png");
ic = e_util_icon_add(buf, cfdata->evas);
e_widget_ilist_append(cfdata->gui.lang_list, ic, _("System Default"), NULL, NULL, "");
for (l = cfdata->lang_list; l; l = l->next)
{
2012-06-13 23:55:01 -07:00
E_Intl_Language_Node *ln;
const char *trans;
ln = l->data;
if (!ln) continue;
if (ln->lang_name)
trans = ln->lang_name;
else
trans = ln->lang_code;
if (ln->lang_available)
{
ic = e_icon_add(cfdata->evas);
e_util_icon_theme_set(ic, "dialog-ok-apply");
}
else
ic = NULL;
e_widget_ilist_append(cfdata->gui.lang_list, ic, trans, NULL, NULL, ln->lang_code);
if (cfdata->cur_lang && !strcmp(cfdata->cur_lang, ln->lang_code))
*sel = e_widget_ilist_count(cfdata->gui.lang_list) - 1;
}
if (*sel > -1)
e_widget_ilist_selected_set(cfdata->gui.lang_list, *sel);
e_widget_ilist_thaw(cfdata->gui.lang_list);
edje_thaw();
evas_event_thaw(evas_object_evas_get(cfdata->gui.lang_list));
}
static int
_region_list_sort(const void *data1, const void *data2)
{
2008-10-27 03:46:43 -07:00
const E_Intl_Region_Node *rn1, *rn2;
const char *trans1;
const char *trans2;
if (!data1) return 1;
if (!data2) return -1;
rn1 = data1;
rn2 = data2;
if (!rn1->region_name) return 1;
trans1 = rn1->region_name;
if (!rn2->region_name) return -1;
trans2 = rn2->region_name;
2012-06-13 23:55:01 -07:00
return strcmp(trans1, trans2);
}
static void
_region_list_load(void *data)
{
E_Config_Dialog_Data *cfdata;
Eina_List *l;
Evas_Object *ic;
char buf[PATH_MAX];
if (!data) return;
cfdata = data;
if (!cfdata->region_list) return;
evas_event_freeze(evas_object_evas_get(cfdata->gui.reg_list));
edje_freeze();
e_widget_ilist_freeze(cfdata->gui.reg_list);
for (l = cfdata->region_list; l; l = l->next)
{
2012-06-13 23:55:01 -07:00
E_Intl_Region_Node *rn;
const char *trans;
2012-06-13 23:55:01 -07:00
rn = l->data;
if (!rn) continue;
if (rn->region_name)
trans = rn->region_name;
else
trans = rn->region_code;
if (rn->region_icon)
{
e_prefix_data_snprintf(buf, sizeof(buf), "data/flags/%s", rn->region_icon);
ic = e_util_icon_add(buf, cfdata->evas);
}
else
ic = NULL;
e_widget_ilist_append(cfdata->gui.reg_list, ic, trans, NULL, NULL, rn->region_code);
2012-06-13 23:55:01 -07:00
if (cfdata->cur_reg && !strcmp(cfdata->cur_reg, rn->region_code))
{
int count;
2012-06-13 23:55:01 -07:00
count = e_widget_ilist_count(cfdata->gui.reg_list);
e_widget_ilist_selected_set(cfdata->gui.reg_list, count - 1);
}
}
e_widget_ilist_thaw(cfdata->gui.reg_list);
edje_thaw();
evas_event_thaw(evas_object_evas_get(cfdata->gui.reg_list));
}
static int
_basic_lang_list_sort(const void *data1, const void *data2)
{
2008-10-27 03:46:43 -07:00
const 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;
2012-06-13 23:55:01 -07:00
return strcmp(trans1, trans2);
}
const char *
_intl_charset_upper_get(const char *charset)
{
int i;
i = 0;
while (charset_predefined_pairs[i].locale_key)
{
2012-06-13 23:55:01 -07:00
if (!strcmp(charset_predefined_pairs[i].locale_key, charset))
{
return charset_predefined_pairs[i].locale_translation;
}
i++;
}
return NULL;
}
2012-06-13 23:55:01 -07:00