From baa6c0759dc06c73ca6e66fc768d42c8b5eabffa Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Fri, 03 May 2013 00:11:37 +0000 Subject: Complete port to introspection; fix problem with language setting This series of patches completes the conversion to intropection for the keyboard section of the Sugar control panel. The issues were: (1) conversion to XKL (import xklavier was causing Sugar to crash); (2) work-around for the problem with gconf get_list and set_list (dnarvaez added a Sugar extention to enable set_list to save a list of keyboard layouts); and (3) fixing a problem with setting the proper default languages in the UI. Part 3 requires a conversion from ISO-639 2-character codes to ISO-639 3-character codes. This is accomplished by making use of a table available at: http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt A snapshot of this table is now included in sugar/data. Signed-off-by: Ajay Garg --- diff --git a/data/ISO-639-2_utf-8.txt b/data/ISO-639-2_utf-8.txt new file mode 100644 index 0000000..e2ba0be --- /dev/null +++ b/data/ISO-639-2_utf-8.txt @@ -0,0 +1,486 @@ +aar||aa|Afar|afar +abk||ab|Abkhazian|abkhaze +ace|||Achinese|aceh +ach|||Acoli|acoli +ada|||Adangme|adangme +ady|||Adyghe; Adygei|adyghé +afa|||Afro-Asiatic languages|afro-asiatiques, langues +afh|||Afrihili|afrihili +afr||af|Afrikaans|afrikaans +ain|||Ainu|aïnou +aka||ak|Akan|akan +akk|||Akkadian|akkadien +alb|sqi|sq|Albanian|albanais +ale|||Aleut|aléoute +alg|||Algonquian languages|algonquines, langues +alt|||Southern Altai|altai du Sud +amh||am|Amharic|amharique +ang|||English, Old (ca.450-1100)|anglo-saxon (ca.450-1100) +anp|||Angika|angika +apa|||Apache languages|apaches, langues +ara||ar|Arabic|arabe +arc|||Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)|araméen d'empire (700-300 BCE) +arg||an|Aragonese|aragonais +arm|hye|hy|Armenian|arménien +arn|||Mapudungun; Mapuche|mapudungun; mapuche; mapuce +arp|||Arapaho|arapaho +art|||Artificial languages|artificielles, langues +arw|||Arawak|arawak +asm||as|Assamese|assamais +ast|||Asturian; Bable; Leonese; Asturleonese|asturien; bable; léonais; asturoléonais +ath|||Athapascan languages|athapascanes, langues +aus|||Australian languages|australiennes, langues +ava||av|Avaric|avar +ave||ae|Avestan|avestique +awa|||Awadhi|awadhi +aym||ay|Aymara|aymara +aze||az|Azerbaijani|azéri +bad|||Banda languages|banda, langues +bai|||Bamileke languages|bamiléké, langues +bak||ba|Bashkir|bachkir +bal|||Baluchi|baloutchi +bam||bm|Bambara|bambara +ban|||Balinese|balinais +baq|eus|eu|Basque|basque +bas|||Basa|basa +bat|||Baltic languages|baltes, langues +bej|||Beja; Bedawiyet|bedja +bel||be|Belarusian|biélorusse +bem|||Bemba|bemba +ben||bn|Bengali|bengali +ber|||Berber languages|berbères, langues +bho|||Bhojpuri|bhojpuri +bih||bh|Bihari languages|langues biharis +bik|||Bikol|bikol +bin|||Bini; Edo|bini; edo +bis||bi|Bislama|bichlamar +bla|||Siksika|blackfoot +bnt|||Bantu (Other)|bantoues, autres langues +bos||bs|Bosnian|bosniaque +bra|||Braj|braj +bre||br|Breton|breton +btk|||Batak languages|batak, langues +bua|||Buriat|bouriate +bug|||Buginese|bugi +bul||bg|Bulgarian|bulgare +bur|mya|my|Burmese|birman +byn|||Blin; Bilin|blin; bilen +cad|||Caddo|caddo +cai|||Central American Indian languages|amérindiennes de L'Amérique centrale, langues +car|||Galibi Carib|karib; galibi; carib +cat||ca|Catalan; Valencian|catalan; valencien +cau|||Caucasian languages|caucasiennes, langues +ceb|||Cebuano|cebuano +cel|||Celtic languages|celtiques, langues; celtes, langues +cha||ch|Chamorro|chamorro +chb|||Chibcha|chibcha +che||ce|Chechen|tchétchène +chg|||Chagatai|djaghataï +chi|zho|zh|Chinese|chinois +chk|||Chuukese|chuuk +chm|||Mari|mari +chn|||Chinook jargon|chinook, jargon +cho|||Choctaw|choctaw +chp|||Chipewyan; Dene Suline|chipewyan +chr|||Cherokee|cherokee +chu||cu|Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic|slavon d'église; vieux slave; slavon liturgique; vieux bulgare +chv||cv|Chuvash|tchouvache +chy|||Cheyenne|cheyenne +cmc|||Chamic languages|chames, langues +cop|||Coptic|copte +cor||kw|Cornish|cornique +cos||co|Corsican|corse +cpe|||Creoles and pidgins, English based|créoles et pidgins basés sur l'anglais +cpf|||Creoles and pidgins, French-based |créoles et pidgins basés sur le français +cpp|||Creoles and pidgins, Portuguese-based |créoles et pidgins basés sur le portugais +cre||cr|Cree|cree +crh|||Crimean Tatar; Crimean Turkish|tatar de Crimé +crp|||Creoles and pidgins |créoles et pidgins +csb|||Kashubian|kachoube +cus|||Cushitic languages|couchitiques, langues +cze|ces|cs|Czech|tchèque +dak|||Dakota|dakota +dan||da|Danish|danois +dar|||Dargwa|dargwa +day|||Land Dayak languages|dayak, langues +del|||Delaware|delaware +den|||Slave (Athapascan)|esclave (athapascan) +dgr|||Dogrib|dogrib +din|||Dinka|dinka +div||dv|Divehi; Dhivehi; Maldivian|maldivien +doi|||Dogri|dogri +dra|||Dravidian languages|dravidiennes, langues +dsb|||Lower Sorbian|bas-sorabe +dua|||Duala|douala +dum|||Dutch, Middle (ca.1050-1350)|néerlandais moyen (ca. 1050-1350) +dut|nld|nl|Dutch; Flemish|néerlandais; flamand +dyu|||Dyula|dioula +dzo||dz|Dzongkha|dzongkha +efi|||Efik|efik +egy|||Egyptian (Ancient)|égyptien +eka|||Ekajuk|ekajuk +elx|||Elamite|élamite +eng||en|English|anglais +enm|||English, Middle (1100-1500)|anglais moyen (1100-1500) +epo||eo|Esperanto|espéranto +est||et|Estonian|estonien +ewe||ee|Ewe|éwé +ewo|||Ewondo|éwondo +fan|||Fang|fang +fao||fo|Faroese|féroïen +fat|||Fanti|fanti +fij||fj|Fijian|fidjien +fil|||Filipino; Pilipino|filipino; pilipino +fin||fi|Finnish|finnois +fiu|||Finno-Ugrian languages|finno-ougriennes, langues +fon|||Fon|fon +fre|fra|fr|French|français +frm|||French, Middle (ca.1400-1600)|français moyen (1400-1600) +fro|||French, Old (842-ca.1400)|français ancien (842-ca.1400) +frr|||Northern Frisian|frison septentrional +frs|||Eastern Frisian|frison oriental +fry||fy|Western Frisian|frison occidental +ful||ff|Fulah|peul +fur|||Friulian|frioulan +gaa|||Ga|ga +gay|||Gayo|gayo +gba|||Gbaya|gbaya +gem|||Germanic languages|germaniques, langues +geo|kat|ka|Georgian|géorgien +ger|deu|de|German|allemand +gez|||Geez|guèze +gil|||Gilbertese|kiribati +gla||gd|Gaelic; Scottish Gaelic|gaélique; gaélique écossais +gle||ga|Irish|irlandais +glg||gl|Galician|galicien +glv||gv|Manx|manx; mannois +gmh|||German, Middle High (ca.1050-1500)|allemand, moyen haut (ca. 1050-1500) +goh|||German, Old High (ca.750-1050)|allemand, vieux haut (ca. 750-1050) +gon|||Gondi|gond +gor|||Gorontalo|gorontalo +got|||Gothic|gothique +grb|||Grebo|grebo +grc|||Greek, Ancient (to 1453)|grec ancien (jusqu'à 1453) +gre|ell|el|Greek, Modern (1453-)|grec moderne (après 1453) +grn||gn|Guarani|guarani +gsw|||Swiss German; Alemannic; Alsatian|suisse alémanique; alémanique; alsacien +guj||gu|Gujarati|goudjrati +gwi|||Gwich'in|gwich'in +hai|||Haida|haida +hat||ht|Haitian; Haitian Creole|haïtien; créole haïtien +hau||ha|Hausa|haoussa +haw|||Hawaiian|hawaïen +heb||he|Hebrew|hébreu +her||hz|Herero|herero +hil|||Hiligaynon|hiligaynon +him|||Himachali languages; Western Pahari languages|langues himachalis; langues paharis occidentales +hin||hi|Hindi|hindi +hit|||Hittite|hittite +hmn|||Hmong; Mong|hmong +hmo||ho|Hiri Motu|hiri motu +hrv||hr|Croatian|croate +hsb|||Upper Sorbian|haut-sorabe +hun||hu|Hungarian|hongrois +hup|||Hupa|hupa +iba|||Iban|iban +ibo||ig|Igbo|igbo +ice|isl|is|Icelandic|islandais +ido||io|Ido|ido +iii||ii|Sichuan Yi; Nuosu|yi de Sichuan +ijo|||Ijo languages|ijo, langues +iku||iu|Inuktitut|inuktitut +ile||ie|Interlingue; Occidental|interlingue +ilo|||Iloko|ilocano +ina||ia|Interlingua (International Auxiliary Language Association)|interlingua (langue auxiliaire internationale) +inc|||Indic languages|indo-aryennes, langues +ind||id|Indonesian|indonésien +ine|||Indo-European languages|indo-européennes, langues +inh|||Ingush|ingouche +ipk||ik|Inupiaq|inupiaq +ira|||Iranian languages|iraniennes, langues +iro|||Iroquoian languages|iroquoises, langues +ita||it|Italian|italien +jav||jv|Javanese|javanais +jbo|||Lojban|lojban +jpn||ja|Japanese|japonais +jpr|||Judeo-Persian|judéo-persan +jrb|||Judeo-Arabic|judéo-arabe +kaa|||Kara-Kalpak|karakalpak +kab|||Kabyle|kabyle +kac|||Kachin; Jingpho|kachin; jingpho +kal||kl|Kalaallisut; Greenlandic|groenlandais +kam|||Kamba|kamba +kan||kn|Kannada|kannada +kar|||Karen languages|karen, langues +kas||ks|Kashmiri|kashmiri +kau||kr|Kanuri|kanouri +kaw|||Kawi|kawi +kaz||kk|Kazakh|kazakh +kbd|||Kabardian|kabardien +kha|||Khasi|khasi +khi|||Khoisan languages|khoïsan, langues +khm||km|Central Khmer|khmer central +kho|||Khotanese; Sakan|khotanais; sakan +kik||ki|Kikuyu; Gikuyu|kikuyu +kin||rw|Kinyarwanda|rwanda +kir||ky|Kirghiz; Kyrgyz|kirghiz +kmb|||Kimbundu|kimbundu +kok|||Konkani|konkani +kom||kv|Komi|kom +kon||kg|Kongo|kongo +kor||ko|Korean|coréen +kos|||Kosraean|kosrae +kpe|||Kpelle|kpellé +krc|||Karachay-Balkar|karatchai balkar +krl|||Karelian|carélien +kro|||Kru languages|krou, langues +kru|||Kurukh|kurukh +kua||kj|Kuanyama; Kwanyama|kuanyama; kwanyama +kum|||Kumyk|koumyk +kur||ku|Kurdish|kurde +kut|||Kutenai|kutenai +lad|||Ladino|judéo-espagnol +lah|||Lahnda|lahnda +lam|||Lamba|lamba +lao||lo|Lao|lao +lat||la|Latin|latin +lav||lv|Latvian|letton +lez|||Lezghian|lezghien +lim||li|Limburgan; Limburger; Limburgish|limbourgeois +lin||ln|Lingala|lingala +lit||lt|Lithuanian|lituanien +lol|||Mongo|mongo +loz|||Lozi|lozi +ltz||lb|Luxembourgish; Letzeburgesch|luxembourgeois +lua|||Luba-Lulua|luba-lulua +lub||lu|Luba-Katanga|luba-katanga +lug||lg|Ganda|ganda +lui|||Luiseno|luiseno +lun|||Lunda|lunda +luo|||Luo (Kenya and Tanzania)|luo (Kenya et Tanzanie) +lus|||Lushai|lushai +mac|mkd|mk|Macedonian|macédonien +mad|||Madurese|madourais +mag|||Magahi|magahi +mah||mh|Marshallese|marshall +mai|||Maithili|maithili +mak|||Makasar|makassar +mal||ml|Malayalam|malayalam +man|||Mandingo|mandingue +mao|mri|mi|Maori|maori +map|||Austronesian languages|austronésiennes, langues +mar||mr|Marathi|marathe +mas|||Masai|massaï +may|msa|ms|Malay|malais +mdf|||Moksha|moksa +mdr|||Mandar|mandar +men|||Mende|mendé +mga|||Irish, Middle (900-1200)|irlandais moyen (900-1200) +mic|||Mi'kmaq; Micmac|mi'kmaq; micmac +min|||Minangkabau|minangkabau +mis|||Uncoded languages|langues non codées +mkh|||Mon-Khmer languages|môn-khmer, langues +mlg||mg|Malagasy|malgache +mlt||mt|Maltese|maltais +mnc|||Manchu|mandchou +mni|||Manipuri|manipuri +mno|||Manobo languages|manobo, langues +moh|||Mohawk|mohawk +mon||mn|Mongolian|mongol +mos|||Mossi|moré +mul|||Multiple languages|multilingue +mun|||Munda languages|mounda, langues +mus|||Creek|muskogee +mwl|||Mirandese|mirandais +mwr|||Marwari|marvari +myn|||Mayan languages|maya, langues +myv|||Erzya|erza +nah|||Nahuatl languages|nahuatl, langues +nai|||North American Indian languages|nord-amérindiennes, langues +nap|||Neapolitan|napolitain +nau||na|Nauru|nauruan +nav||nv|Navajo; Navaho|navaho +nbl||nr|Ndebele, South; South Ndebele|ndébélé du Sud +nde||nd|Ndebele, North; North Ndebele|ndébélé du Nord +ndo||ng|Ndonga|ndonga +nds|||Low German; Low Saxon; German, Low; Saxon, Low|bas allemand; bas saxon; allemand, bas; saxon, bas +nep||ne|Nepali|népalais +new|||Nepal Bhasa; Newari|nepal bhasa; newari +nia|||Nias|nias +nic|||Niger-Kordofanian languages|nigéro-kordofaniennes, langues +niu|||Niuean|niué +nno||nn|Norwegian Nynorsk; Nynorsk, Norwegian|norvégien nynorsk; nynorsk, norvégien +nob||nb|Bokmål, Norwegian; Norwegian Bokmål|norvégien bokmål +nog|||Nogai|nogaï; nogay +non|||Norse, Old|norrois, vieux +nor||no|Norwegian|norvégien +nqo|||N'Ko|n'ko +nso|||Pedi; Sepedi; Northern Sotho|pedi; sepedi; sotho du Nord +nub|||Nubian languages|nubiennes, langues +nwc|||Classical Newari; Old Newari; Classical Nepal Bhasa|newari classique +nya||ny|Chichewa; Chewa; Nyanja|chichewa; chewa; nyanja +nym|||Nyamwezi|nyamwezi +nyn|||Nyankole|nyankolé +nyo|||Nyoro|nyoro +nzi|||Nzima|nzema +oci||oc|Occitan (post 1500); Provençal|occitan (après 1500); provençal +oji||oj|Ojibwa|ojibwa +ori||or|Oriya|oriya +orm||om|Oromo|galla +osa|||Osage|osage +oss||os|Ossetian; Ossetic|ossète +ota|||Turkish, Ottoman (1500-1928)|turc ottoman (1500-1928) +oto|||Otomian languages|otomi, langues +paa|||Papuan languages|papoues, langues +pag|||Pangasinan|pangasinan +pal|||Pahlavi|pahlavi +pam|||Pampanga; Kapampangan|pampangan +pan||pa|Panjabi; Punjabi|pendjabi +pap|||Papiamento|papiamento +pau|||Palauan|palau +peo|||Persian, Old (ca.600-400 B.C.)|perse, vieux (ca. 600-400 av. J.-C.) +per|fas|fa|Persian|persan +phi|||Philippine languages|philippines, langues +phn|||Phoenician|phénicien +pli||pi|Pali|pali +pol||pl|Polish|polonais +pon|||Pohnpeian|pohnpei +por||pt|Portuguese|portugais +pra|||Prakrit languages|prâkrit, langues +pro|||Provençal, Old (to 1500)|provençal ancien (jusqu'à 1500) +pus||ps|Pushto; Pashto|pachto +qaa-qtz|||Reserved for local use|réservée à l'usage local +que||qu|Quechua|quechua +raj|||Rajasthani|rajasthani +rap|||Rapanui|rapanui +rar|||Rarotongan; Cook Islands Maori|rarotonga; maori des îles Cook +roa|||Romance languages|romanes, langues +roh||rm|Romansh|romanche +rom|||Romany|tsigane +rum|ron|ro|Romanian; Moldavian; Moldovan|roumain; moldave +run||rn|Rundi|rundi +rup|||Aromanian; Arumanian; Macedo-Romanian|aroumain; macédo-roumain +rus||ru|Russian|russe +sad|||Sandawe|sandawe +sag||sg|Sango|sango +sah|||Yakut|iakoute +sai|||South American Indian (Other)|indiennes d'Amérique du Sud, autres langues +sal|||Salishan languages|salishennes, langues +sam|||Samaritan Aramaic|samaritain +san||sa|Sanskrit|sanskrit +sas|||Sasak|sasak +sat|||Santali|santal +scn|||Sicilian|sicilien +sco|||Scots|écossais +sel|||Selkup|selkoupe +sem|||Semitic languages|sémitiques, langues +sga|||Irish, Old (to 900)|irlandais ancien (jusqu'à 900) +sgn|||Sign Languages|langues des signes +shn|||Shan|chan +sid|||Sidamo|sidamo +sin||si|Sinhala; Sinhalese|singhalais +sio|||Siouan languages|sioux, langues +sit|||Sino-Tibetan languages|sino-tibétaines, langues +sla|||Slavic languages|slaves, langues +slo|slk|sk|Slovak|slovaque +slv||sl|Slovenian|slovène +sma|||Southern Sami|sami du Sud +sme||se|Northern Sami|sami du Nord +smi|||Sami languages|sames, langues +smj|||Lule Sami|sami de Lule +smn|||Inari Sami|sami d'Inari +smo||sm|Samoan|samoan +sms|||Skolt Sami|sami skolt +sna||sn|Shona|shona +snd||sd|Sindhi|sindhi +snk|||Soninke|soninké +sog|||Sogdian|sogdien +som||so|Somali|somali +son|||Songhai languages|songhai, langues +sot||st|Sotho, Southern|sotho du Sud +spa||es|Spanish; Castilian|espagnol; castillan +srd||sc|Sardinian|sarde +srn|||Sranan Tongo|sranan tongo +srp||sr|Serbian|serbe +srr|||Serer|sérère +ssa|||Nilo-Saharan languages|nilo-sahariennes, langues +ssw||ss|Swati|swati +suk|||Sukuma|sukuma +sun||su|Sundanese|soundanais +sus|||Susu|soussou +sux|||Sumerian|sumérien +swa||sw|Swahili|swahili +swe||sv|Swedish|suédois +syc|||Classical Syriac|syriaque classique +syr|||Syriac|syriaque +tah||ty|Tahitian|tahitien +tai|||Tai languages|tai, langues +tam||ta|Tamil|tamoul +tat||tt|Tatar|tatar +tel||te|Telugu|télougou +tem|||Timne|temne +ter|||Tereno|tereno +tet|||Tetum|tetum +tgk||tg|Tajik|tadjik +tgl||tl|Tagalog|tagalog +tha||th|Thai|thaï +tib|bod|bo|Tibetan|tibétain +tig|||Tigre|tigré +tir||ti|Tigrinya|tigrigna +tiv|||Tiv|tiv +tkl|||Tokelau|tokelau +tlh|||Klingon; tlhIngan-Hol|klingon +tli|||Tlingit|tlingit +tmh|||Tamashek|tamacheq +tog|||Tonga (Nyasa)|tonga (Nyasa) +ton||to|Tonga (Tonga Islands)|tongan (Îles Tonga) +tpi|||Tok Pisin|tok pisin +tsi|||Tsimshian|tsimshian +tsn||tn|Tswana|tswana +tso||ts|Tsonga|tsonga +tuk||tk|Turkmen|turkmène +tum|||Tumbuka|tumbuka +tup|||Tupi languages|tupi, langues +tur||tr|Turkish|turc +tut|||Altaic languages|altaïques, langues +tvl|||Tuvalu|tuvalu +twi||tw|Twi|twi +tyv|||Tuvinian|touva +udm|||Udmurt|oudmourte +uga|||Ugaritic|ougaritique +uig||ug|Uighur; Uyghur|ouïgour +ukr||uk|Ukrainian|ukrainien +umb|||Umbundu|umbundu +und|||Undetermined|indéterminée +urd||ur|Urdu|ourdou +uzb||uz|Uzbek|ouszbek +vai|||Vai|vaï +ven||ve|Venda|venda +vie||vi|Vietnamese|vietnamien +vol||vo|Volapük|volapük +vot|||Votic|vote +wak|||Wakashan languages|wakashanes, langues +wal|||Walamo|walamo +war|||Waray|waray +was|||Washo|washo +wel|cym|cy|Welsh|gallois +wen|||Sorbian languages|sorabes, langues +wln||wa|Walloon|wallon +wol||wo|Wolof|wolof +xal|||Kalmyk; Oirat|kalmouk; oïrat +xho||xh|Xhosa|xhosa +yao|||Yao|yao +yap|||Yapese|yapois +yid||yi|Yiddish|yiddish +yor||yo|Yoruba|yoruba +ypk|||Yupik languages|yupik, langues +zap|||Zapotec|zapotèque +zbl|||Blissymbols; Blissymbolics; Bliss|symboles Bliss; Bliss +zen|||Zenaga|zenaga +zgh|||Standard Moroccan Tamazight|amazighe standard marocain +zha||za|Zhuang; Chuang|zhuang; chuang +znd|||Zande languages|zandé, langues +zul||zu|Zulu|zoulou +zun|||Zuni|zuni +zxx|||No linguistic content; Not applicable|pas de contenu linguistique; non applicable +zza|||Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki|zaza; dimili; dimli; kirdki; kirmanjki; zazaki \ No newline at end of file diff --git a/data/Makefile.am b/data/Makefile.am index 2a92ce1..b8f1c67 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -19,6 +19,7 @@ sugar-72-contrast.gtkrc: gtkrc-contrast.em sugardir = $(pkgdatadir)/data sugar_DATA = \ activities.defaults \ + ISO-639-2_utf-8.txt \ kbdconfig \ mime.defaults \ GPLv2 \ diff --git a/extensions/cpsection/keyboard/model.py b/extensions/cpsection/keyboard/model.py index bfd7e31..16f6a01 100644 --- a/extensions/cpsection/keyboard/model.py +++ b/extensions/cpsection/keyboard/model.py @@ -1,3 +1,4 @@ +# Copyright (C) 2013 Sugar Labs # Copyright (C) 2009 OLPC # Author: Sayamindu Dasgupta # @@ -16,9 +17,11 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # -import xklavier +from gi.repository import Xkl from gi.repository import GConf +from gi.repository import SugarExt +import logging _GROUP_NAME = 'grp' # The XKB name for group switch options @@ -27,29 +30,35 @@ _OPTIONS_KEY = '/desktop/sugar/peripherals/keyboard/options' _MODEL_KEY = '/desktop/sugar/peripherals/keyboard/model' +def _item_str(s): + '''Convert a zero-terminated byte array to a proper str''' + + i = s.find(b'\x00') + return s[:i].decode("utf-8") + + class KeyboardManager(object): def __init__(self, display): - self._engine = xklavier.Engine(display) - self._configregistry = xklavier.ConfigRegistry(self._engine) + self._engine = Xkl.Engine.get_instance(display) + self._configregistry = Xkl.ConfigRegistry.get_instance(self._engine) self._configregistry.load(False) - self._configrec = xklavier.ConfigRec() + self._configrec = Xkl.ConfigRec() self._configrec.get_from_server(self._engine) self._gconf_client = GConf.Client.get_default() def _populate_one(self, config_registry, item, store): - store.append([item.get_description(), item.get_name()]) + store.append([_item_str(item.description), _item_str(item.name)]) def _populate_two(self, config_registry, item, subitem, store): - layout = item.get_name() + layout = _item_str(item.name) if subitem: - description = '%s, %s' % (subitem.get_description(), \ - item.get_description()) - variant = subitem.get_name() + description = '%s, %s' % (_item_str(subitem.description), + _item_str(item.description)) + variant = _item_str(subitem.name) else: - description = 'Default layout, %s' % item.get_description() + description = 'Default layout, %s' % _item_str(item.description) variant = '' - store.append([description, ('%s(%s)' % (layout, variant))]) def get_models(self): @@ -69,8 +78,9 @@ class KeyboardManager(object): def get_layouts_for_language(self, language): """Return list of supported keyboard layouts for a given language""" layouts = [] - self._configregistry.foreach_language_variant(language, \ - self._populate_two, layouts) + self._configregistry.foreach_language_variant(language, + self._populate_two, + layouts) layouts.sort() return layouts @@ -85,18 +95,15 @@ class KeyboardManager(object): def get_current_model(self): """Return the enabled keyboard model""" model = self._gconf_client.get_string(_MODEL_KEY) - if model: - return model - else: - model = self._configrec.get_model() + if not model: + model = self._configrec.model self.set_model(model) - return model + return model def get_current_layouts(self): """Return the enabled keyboard layouts with variants""" # FIXME, gconf_client_get_list not introspectable #681433 - layouts_from_gconf = self._gconf_client.get( - '/desktop/sugar/peripherals/keyboard/layouts') + layouts_from_gconf = self._gconf_client.get(_LAYOUTS_KEY) layouts = [] if layouts_from_gconf: for gval in layouts_from_gconf.get_list(): @@ -105,8 +112,8 @@ class KeyboardManager(object): if layouts: return layouts - layouts = self._configrec.get_layouts() - variants = self._configrec.get_variants() + layouts = self._configrec.layouts + variants = self._configrec.variants layout_list = [] i = 0 @@ -118,22 +125,20 @@ class KeyboardManager(object): i += 1 self.set_layouts(layout_list) - return layout_list def get_current_option_group(self): """Return the enabled option for switching keyboard group""" options = [] # FIXME, gconf_client_get_list not introspectable #681433 - options_from_gconf = gconf_client.get(\ - '/desktop/sugar/peripherals/keyboard/options') + options_from_gconf = self._gconf_client.get(_OPTIONS_KEY) if options_from_gconf: for gval in options_from_gconf.get_list(): option = gval.get_string() options.append(option) if not options: - options = self._configrec.get_options() + options = self._configrec.options self.set_option_group(options) for option in options: @@ -163,7 +168,11 @@ class KeyboardManager(object): options = option_group else: options = [option_group] - self._gconf_client.set_list(_OPTIONS_KEY, GConf.ValueType.STRING, options) + # FIXME, gconf_client_set_list not introspectable #681433 + # self._gconf_client.set_list(_OPTIONS_KEY, GConf.ValueType.STRING, + # options) + SugarExt.gconf_client_set_string_list(self._gconf_client, + _OPTIONS_KEY, options) self._configrec.set_options(options) self._configrec.activate(self._engine) @@ -171,13 +180,16 @@ class KeyboardManager(object): """Sets the supplied keyboard layouts (with variants)""" if layouts is None or not layouts: return - self._gconf_client.set_list(_LAYOUTS_KEY, GConf.ValueType.STRING, layouts) + # FIXME, gconf_client_set_list not introspectable #681433 + # self._gconf_client.set_list(_LAYOUTS_KEY, GConf.ValueType.STRING, + # layouts) + SugarExt.gconf_client_set_string_list(self._gconf_client, + _LAYOUTS_KEY, layouts) layouts_list = [] variants_list = [] for layout in layouts: layouts_list.append(layout.split('(')[0]) variants_list.append(layout.split('(')[1][:-1]) - self._configrec.set_layouts(layouts_list) self._configrec.set_variants(variants_list) self._configrec.activate(self._engine) diff --git a/extensions/cpsection/keyboard/view.py b/extensions/cpsection/keyboard/view.py index 085ec10..46e508f 100644 --- a/extensions/cpsection/keyboard/view.py +++ b/extensions/cpsection/keyboard/view.py @@ -1,3 +1,4 @@ +# Copyright (C) 2013, Sugar Labs # Copyright (C) 2009, OLPC # Author: Sayamindu Dasgupta # @@ -15,9 +16,14 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +import os +import locale + from gi.repository import Gtk +from gi.repository import GdkX11 from gi.repository import GObject from gi.repository import Pango + import logging from gettext import gettext as _ @@ -25,7 +31,7 @@ from sugar3.graphics import style from sugar3.graphics.icon import Icon from jarabe.controlpanel.sectionview import SectionView - +from jarabe.config import data_path CLASS = 'Language' ICON = 'module-keyboard' @@ -33,14 +39,35 @@ TITLE = _('Keyboard') _APPLY_TIMEOUT = 500 +_iso_639_1_to_2 = {} + #TODO: This cpsection adds checks for xklavier in bin/sugar-session and # src/jarabe/controlpanel/gui.py. We should get rid of these checks # once python-xklavier has been packaged for all major distributions # For more information, see: http://dev.sugarlabs.org/ticket/407 -class LayoutCombo(Gtk.HBox): +def _build_ISO_639_dictionary(): + """ The keyboard section of the control panel requires a conversion + between ISO 639 two-character codes and three-character code. This + method uses the table available at: + http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt + """ + + ISO_DATA_FILE = 'ISO-639-2_utf-8.txt' + + path = os.path.join(data_path, ISO_DATA_FILE) + if os.path.exists(path): + f = open(path, 'r') + for line in f: + codes = line.split('|') + if codes[2] != '': + _iso_639_1_to_2[codes[2]] = codes[0] + else: + logging.error('%s not found' % (ISO_DATA_FILE)) + +class LayoutCombo(Gtk.HBox): """ Custom GTK widget with two comboboxes side by side, one for layout, and the other for variants for the selected layout. @@ -62,12 +89,12 @@ class LayoutCombo(Gtk.HBox): label = Gtk.Label(label=' %s ' % str(n + 1)) label.set_use_markup(True) label.modify_fg(Gtk.StateType.NORMAL, - style.COLOR_SELECTION_GREY.get_gdk_color()) + style.COLOR_SELECTION_GREY.get_gdk_color()) label.set_alignment(0.5, 0.5) self.pack_start(label, False, True, 0) - self._klang_store = Gtk.ListStore(GObject.TYPE_STRING, \ - GObject.TYPE_STRING) + self._klang_store = Gtk.ListStore(GObject.TYPE_STRING, + GObject.TYPE_STRING) for description, name in self._keyboard_manager.get_languages(): self._klang_store.append([name, description]) @@ -84,33 +111,52 @@ class LayoutCombo(Gtk.HBox): self._kvariant_store = None self._kvariant_combo = Gtk.ComboBox(model=None) self._kvariant_combo_changed_id = \ - self._kvariant_combo.connect('changed', \ - self._kvariant_combo_changed_cb) + self._kvariant_combo.connect('changed', + self._kvariant_combo_changed_cb) cell = Gtk.CellRendererText() cell.props.ellipsize = Pango.EllipsizeMode.MIDDLE cell.props.ellipsize_set = True self._kvariant_combo.pack_start(cell, True) self._kvariant_combo.add_attribute(cell, 'text', 1) - self.pack_start(self._kvariant_combo, expand=True, fill=True, padding=0) + self.pack_start(self._kvariant_combo, expand=True, fill=True, + padding=0) self._klang_combo.set_active(self._index) def select_layout(self, layout): """Select a given keyboard layout and show appropriate variants""" + self._kvariant_combo.handler_block(self._kvariant_combo_changed_id) - for i in range(0, len(self._klang_store)): - self._klang_combo.set_active(i) - for j in range(0, len(self._kvariant_store)): - if self._kvariant_store[j][0] == layout: - self._kvariant_combo.set_active(j) - self._kvariant_combo.handler_unblock(\ - self._kvariant_combo_changed_id) + + # Look for $LANG first + for lang in os.environ.get('LANG', + locale.getdefaultlocale()[0]).split(':'): + if lang[0:2] in _iso_639_1_to_2: + if self._look_for_lang_and_layout(_iso_639_1_to_2[lang[0:2]], + layout): return True + # Then look for any language + if self._look_for_lang_and_layout(None, layout): + return True + + # Finally, select a default self._kvariant_combo.handler_unblock(self._kvariant_combo_changed_id) self._klang_combo.set_active(0) return False + def _look_for_lang_and_layout(self, lang, layout): + for i in range(0, len(self._klang_store)): + if lang == self._klang_store[i][0] or lang is None: + self._klang_combo.set_active(i) + for j in range(0, len(self._kvariant_store)): + if self._kvariant_store[j][0] == layout: + self._kvariant_combo.set_active(j) + self._kvariant_combo.handler_unblock( + self._kvariant_combo_changed_id) + return True + return False + def get_layout(self): """Gets the selected layout (with variant)""" it = self._kvariant_combo.get_active_iter() @@ -118,8 +164,8 @@ class LayoutCombo(Gtk.HBox): return model.get(it, 0)[0] def _set_kvariant_store(self, lang): - self._kvariant_store = Gtk.ListStore(GObject.TYPE_STRING, \ - GObject.TYPE_STRING) + self._kvariant_store = Gtk.ListStore(GObject.TYPE_STRING, + GObject.TYPE_STRING) layouts = self._keyboard_manager.get_layouts_for_language(lang) for description, name in layouts: self._kvariant_store.append([name, description]) @@ -159,7 +205,11 @@ class Keyboard(SectionView): self._layout_table = Gtk.Table(rows=4, columns=2, homogeneous=False) - self._keyboard_manager = model.KeyboardManager(self.get_display()) + _build_ISO_639_dictionary() + + self._keyboard_manager = model.KeyboardManager( + GdkX11.x11_get_default_xdisplay()) + self._layout_combo_list = [] self._layout_addremovebox_list = [] @@ -196,8 +246,8 @@ class Keyboard(SectionView): box_kmodel.set_border_width(style.DEFAULT_SPACING * 2) box_kmodel.set_spacing(style.DEFAULT_SPACING) - kmodel_store = Gtk.ListStore(GObject.TYPE_STRING, \ - GObject.TYPE_STRING) + kmodel_store = Gtk.ListStore(GObject.TYPE_STRING, + GObject.TYPE_STRING) for description, name in self._keyboard_manager.get_models(): kmodel_store.append([name, description]) @@ -225,7 +275,8 @@ class Keyboard(SectionView): if self.__kmodel_sid is not None: GObject.source_remove(self.__kmodel_sid) self.__kmodel_sid = GObject.timeout_add(_APPLY_TIMEOUT, - self.__kmodel_timeout_cb, combobox) + self.__kmodel_timeout_cb, + combobox) def __kmodel_timeout_cb(self, combobox): it = combobox.get_active_iter() @@ -256,8 +307,8 @@ class Keyboard(SectionView): box_group_option.set_border_width(style.DEFAULT_SPACING * 2) box_group_option.set_spacing(style.DEFAULT_SPACING) - group_option_store = Gtk.ListStore(GObject.TYPE_STRING, \ - GObject.TYPE_STRING) + group_option_store = Gtk.ListStore(GObject.TYPE_STRING, + GObject.TYPE_STRING) for description, name in self._keyboard_manager.get_options_group(): group_option_store.append([name, description]) @@ -269,7 +320,7 @@ class Keyboard(SectionView): group_option_combo.add_attribute(cell, 'text', 1) self._group_switch_option = \ - self._keyboard_manager.get_current_option_group() + self._keyboard_manager.get_current_option_group() if not self._group_switch_option: group_option_combo.set_active(0) else: @@ -286,14 +337,13 @@ class Keyboard(SectionView): self._vbox.pack_start(box_group_option, False, True, 0) box_group_option.show_all() - group_option_combo.connect('changed', \ - self.__group_switch_changed_cb) + group_option_combo.connect('changed', self.__group_switch_changed_cb) def __group_switch_changed_cb(self, combobox): if self.__group_switch_sid is not None: GObject.source_remove(self.__group_switch_sid) - self.__group_switch_sid = GObject.timeout_add(_APPLY_TIMEOUT, - self.__group_switch_timeout_cb, combobox) + self.__group_switch_sid = GObject.timeout_add( + _APPLY_TIMEOUT, self.__group_switch_timeout_cb, combobox) def __group_switch_timeout_cb(self, combobox): it = combobox.get_active_iter() @@ -303,7 +353,7 @@ class Keyboard(SectionView): self._keyboard_manager.get_current_option_group(): return try: - self._keyboard_manager.set_option_group(\ + self._keyboard_manager.set_option_group( self._selected_group_switch_option) except Exception: logging.exception('Could not set new keyboard group switch option') @@ -328,8 +378,8 @@ class Keyboard(SectionView): self._layout_table.attach(add_remove_box, 1, 2, i, i + 1) layout_combo = LayoutCombo(self._keyboard_manager, i) - layout_combo.connect('selection-changed', \ - self.__layout_combo_selection_changed_cb) + layout_combo.connect('selection-changed', + self.__layout_combo_selection_changed_cb) self._layout_combo_list.append(layout_combo) self._layout_table.attach(layout_combo, 0, 1, i, i + 1) @@ -338,7 +388,8 @@ class Keyboard(SectionView): layout_combo.select_layout(self._klayouts[i]) self._vbox.pack_start(self._layout_table, False, True, 0) - self._layout_table.set_size_request(self._vbox.size_request()[0], -1) + self._layout_table.set_size_request( + self._vbox.get_size_request()[0], -1) self._layout_table.show() self._update_klayouts() @@ -366,13 +417,13 @@ class Keyboard(SectionView): add_button = Gtk.Button() add_button.set_image(add_icon) add_button.connect('clicked', - self.__add_button_clicked_cb) + self.__add_button_clicked_cb) remove_icon = Icon(icon_name='list-remove') remove_button = Gtk.Button() remove_button.set_image(remove_icon) remove_button.connect('clicked', - self.__remove_button_clicked_cb) + self.__remove_button_clicked_cb) add_remove_box = Gtk.HButtonBox() add_remove_box.set_layout(Gtk.ButtonBoxStyle.START) @@ -405,7 +456,7 @@ class Keyboard(SectionView): if self.__layout_sid is not None: GObject.source_remove(self.__layout_sid) self.__layout_sid = GObject.timeout_add(_APPLY_TIMEOUT, - self.__layout_timeout_cb) + self.__layout_timeout_cb) def __layout_timeout_cb(self): if self._selected_klayouts == \ -- cgit v0.9.1