Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/keyboard/layouts.py : 100%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2# This file is part of Xpra.
3# Copyright (C) 2011-2020 Antoine Martin <antoine@xpra.org>
4# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
5# later version. See the file COPYING for details.
7# The data for this table can be found mostly here:
8# http://msdn.microsoft.com/en-us/library/aa912040.aspx
9# and here:
10# http://support.microsoft.com/kb/278957
11# Format:
12# Language identifier: (Language code, Sublanguage - locale, Language, Default code page, X11 keymap, x11 variants)
13# The x11 keymap name was found in /usr/share/X11/xkb/rules/*
14# This is used for converting the layout we detect using win32api into
15# something that can be used by X11 (a layout with optional variant)
16UNICODE=-1
17LATAM_VARIANTS = ["nodeadkeys", "deadtilde", "sundeadkeys"]
18ARA_VARIANTS = ["azerty", "azerty_digits", "digits", "qwerty", "qwerty_digits", "buckwalter"]
19ES_VARIANTS = ["nodeadkeys", "deadtilde", "sundeadkeys", "dvorak", "est", "cat", "mac"]
20RS_VARIANTS = ["yz", "latin", "latinunicode", "latinyz", "latinunicodeyz", "alternatequotes", "latinalternatequotes", "rue"]
21FR_VARIANTS = ["nodeadkeys", "sundeadkeys", "oss", "oss_latin9", "oss_nodeadkeys", "oss_sundeadkeys", "latin9", "latin9_nodeadkeys", "latin9_sundeadkeys", "bepo", "bepo_latin9", "dvorak", "mac", "bre", "oci", "geo"]
22WIN32_LAYOUTS = {
23 1025: ("ARA", "Saudi Arabia", "Arabic", 1356, "ar", []),
24 1026: ("BGR", "Bulgaria", "Bulgarian", 1251, "bg", ["phonetic", "bas_phonetic"]),
25 1027: ("CAT", "Spain", "Catalan", 1252, "ad", []),
26 1028: ("CHT", "Taiwan", "Chinese", 950, "tw", ["indigenous", "saisiyat"]),
27 1029: ("CSY", "Czech", "Czech", 1250, "cz", ["bksl", "qwerty", "qwerty_bksl", "ucw", "dvorak-ucw"]),
28 1030: ("DAN", "Denmark", "Danish", 1252, "dk", ["nodeadkeys", "mac", "mac_nodeadkeys", "dvorak"]),
29 1031: ("DEU", "Germany", "German", 1252, "de", ["nodeadkeys", "sundeadkeys", "mac"]),
30 1032: ("ELL", "Greece", "Greek", 1253, "gr", ["simple", "extended", "nodeadkeys", "polytonic"]),
31 1033: ("USA", "United States", "English", 1252, "us", []),
32 1034: ("ESP", "Spain (Traditional sort)", "Spanish", 1252, "es", ES_VARIANTS),
33 1035: ("FIN", "Finland", "Finnish", 1252, "fi", ["classic", "nodeadkeys", "smi", "mac"]),
34 1036: ("FRA", "France", "French", 1252, "fr", FR_VARIANTS),
35 1037: ("HEB", "Israel", "Hebrew", 1255, "il", ["lyx", "phonetic", "biblical"]),
36 1038: ("HUN", "Hungary", "Hungarian", 1250, "hu", ["standard", "nodeadkeys", "qwerty", "101_qwertz_comma_dead", "101_qwertz_comma_nodead", "101_qwertz_dot_dead", "101_qwertz_dot_nodead", "101_qwerty_comma_dead", "101_qwerty_comma_nodead", "101_qwerty_dot_dead", "101_qwerty_dot_nodead", "102_qwertz_comma_dead", "102_qwertz_comma_nodead", "102_qwertz_dot_dead", "102_qwertz_dot_nodead", "102_qwerty_comma_dead", "102_qwerty_comma_nodead", "102_qwerty_dot_dead", "102_qwerty_dot_nodead"]),
37 1039: ("ISL", "Iceland", "Icelandic", 1252, "is", ["sundeadkeys", "nodeadkeys", "mac", "dvorak"]),
38 1040: ("ITA", "Italy", "Italian", 1252, "it", ["nodeadkeys", "mac", "us", "geo"]),
39 1041: ("JPN", "Japan", "Japanese", 932, "jp", ["kana", "kana86", "OADG109A", "mac"]),
40 1042: ("KOR", "Korea", "Korean", 949, "kr", ["kr104"]),
41 1043: ("NLD", "Netherlands", "Dutch", 1252, "nl", ["sundeadkeys", "mac", "std"]),
42 1044: ("NOR", "Norway (Bokmål)","Norwegian", 1252, "no", ["nodeadkeys", "dvorak", "smi", "smi_nodeadkeys", "mac", "mac_nodeadkeys"]),
43 1045: ("PLK", "Poland", "Polish", 1250, "pl", ["qwertz", "dvorak", "dvorak_quotes", "dvorak_altquotes", "csb", "ru_phonetic_dvorak", "dvp"]),
44 1046: ("PTB", "Brazil", "Portuguese", 1252, "br", ["nodeadkeys", "dvorak", "nativo", "nativo-us", "nativo-epo"]),
45 1048: ("ROM", "Romania", "Romanian", 1250, "ro", ["cedilla", "std", "std_cedilla", "winkeys"]),
46 1049: ("RUS", "Russia", "Russian", 1251, "ru", ["phonetic", "phonetic_winkeys", "typewriter", "legacy", "typewriter-legacy", "tt", "os_legacy", "os_winkeys", "cv", "cv_latin", "udm", "kom", "sah", "xal", "dos", "srp", "bak", "chm"]),
47 1050: ("HRV", "Croatia", "Croatian", 1250, "hr", ["alternatequotes", "unicode", "unicodeus", "us"]),
48 1051: ("SKY", "Slovakia", "Slovakian", 1250, "sk", ["bksl", "qwerty", "qwerty_bksl"]),
49 1052: ("SQI", "Albania", "Albanian", 1250, "al", []),
50 1053: ("SVE", "Sweden", "Swedish", 1252, "se", ["nodeadkeys", "dvorak", "rus", "rus_nodeadkeys", "smi", "mac", "svdvorak", "swl"]),
51 1054: ("THA", "Thailand", "Thai", 874, "th", ["tis", "pat"]),
52 1055: ("TRK", "Turkey", "Turkish", 1254, "tr", ["f", "alt", "sundeadkeys", "ku", "ku_f", "ku_alt", "intl", "crh", "crh_f", "crh_alt"]),
53 1056: ("URP", "Pakistan", "Urdu", 1256, "pk", ["urd-crulp", "urd-nla", "ara", "snd"]),
54 1057: ("IND", "Indonesia (Bahasa)", "Indonesian", 1252, "", []),
55 1058: ("UKR", "Ukraine", "Ukrainian", 1251, "ua", ["phonetic", "typewriter", "winkeys", "legacy", "rstu", "rstu_ru", "homophonic"]),
56 1059: ("BEL", "Belarus", "Belarusian", 1251, "by", ["legacy", "latin"]),
57 1060: ("SLV", "Slovenia", "Slovenian", 1250, "si", ["alternatequotes", "us"]),
58 1061: ("ETI", "Estonia", "Estonian", 1257, "ee", ["nodeadkeys", "dvorak", "us"]),
59 1062: ("LVI", "Latvia", "Latvian", 1257, "lv", ["apostrophe", "tilde", "fkey", "modern", "ergonomic", "adapted"]),
60 1063: ("LTH", "Lithuania", "Lithuanian", 1257, "lt", ["std", "us", "ibm", "lekp", "lekpa"]),
61 1065: ("FAR", "Iran", "Farsi", 1256, "", []),
62 1066: ("VIT", "Viet Nam", "Vietnamese", 1258, "vn", []),
63 1067: ("HYE", "Armenia", "Armenian", UNICODE,"am", ["phonetic", "phonetic-alt", "eastern", "western", "eastern-alt"]),
64 1068: ("AZE", "Azerbaijan (Latin)", "Azeri", 1254, "az", ["cyrillic"]),
65 1069: ("EUQ", "Spain", "Basque", 1252, "es", []),
66 1071: ("MKI", "F.Y.R.O. Macedonia", "F.Y.R.O. Macedonia", 1251, "mk", ["nodeadkeys"]),
67 1078: ("AFK", "South Africa", "Afrikaans", 1252, "", []),
68 1079: ("KAT", "Georgia", "Georgian", UNICODE,"ge", ["ergonomic", "mess", "ru", "os"]),
69 1080: ("FOS", "Faroe Islands", "Faroese", 1252, "fo", ["nodeadkeys"]),
70 1081: ("HIN", "India", "Hindi", UNICODE,"in", ["bolnagri", "hin-wx"]),
71 1086: ("MSL", "Malaysia", "Malay", 1252, "in", ["mal", "mal_lalitha", "mal_enhanced"]),
72 1087: ("KKZ", "Kazakstan", "Kazakh", 1251, "kz", ["ruskaz", "kazrus"]),
73 1088: ("KYR", "Kyrgyzstan", "Kyrgyz", 1251, "kg", ["phonetic"]),
74 1089: ("SWK", "Kenya", "Swahili", 1252, "ke", ["kik"]),
75 1091: ("UZB", "Uzbekistan (Latin)", "Uzbek", 1254, "uz", ["latin"]),
76 1092: ("TTT", "Tatarstan", "Tatar", 1251, "ru", ["tt"]),
77 1094: ("PAN", "India (Gurmukhi script)", "Punjabi", UNICODE,"in", ["guru", "jhelum"]),
78 1095: ("GUJ", "India", "Gujarati", UNICODE,"in", ["guj"]),
79 1097: ("TAM", "India", "Tamil", UNICODE,"in", ["tam_unicode", "tam_keyboard_with_numerals", "tam_TAB", "tam_TSCII", "tam"]),
80 1098: ("TEL", "India (Telugu script)", "Telugu", UNICODE,"in", ["tel"]),
81 1099: ("KAN", "India (Kannada script)", "Kannada", UNICODE,"in", ["kan"]),
82 1102: ("MAR", "India", "Marathi", UNICODE,"in", []),
83 1103: ("SAN", "India", "Sanskrit", UNICODE,"in", []),
84 1104: ("MON", "Mongolia", "Mongolian (Cyrillic)", 1251, "mn", []),
85 1110: ("GLC", "Spain", "Galician", 1252, "es", []),
86 1111: ("KNK", "India", "Konkani", UNICODE,"in", []),
87 1114: ("SYR", "Syria", "Syriac", UNICODE,"sy", ["syc", "syc_phonetic", "ku", "ku_f", "ku_alt"]),
88 1125: ("DIV", "Maldives", "Divehi", UNICODE,"", []),
89 2049: ("ARI", "Iraq", "Arabic", 1256, "iq", ["ku", "ku_f", "ku_alt", "ku_ara"]),
90 2052: ("CHS", "PRC", "Chinese, Simplified", 0, "cn", ["tib", "tib_asciinum", "uig"]),
91 2055: ("DES", "Switzerland", "German", 1252, "de", ["deadacute", "deadgraveacute", "nodeadkeys", "ro", "ro_nodeadkeys", "dvorak", "sundeadkeys", "neo", "mac", "mac_nodeadkeys", "dsb", "dsb_qwertz", "qwerty", "ru"]),
92 2057: ("ENG", "UK", "English", 1252, "gb", ["extd", "intl", "dvorak", "dvorakukp", "mac", "mac_intl", "colemak"]),
93 2058: ("ESM", "Mexico", "Spanish", 1252, "es", ES_VARIANTS),
94 2060: ("FRB", "Benelux", "French", 1252, "be", ["oss", "oss_latin9", "oss_sundeadkeys", "iso-alternate", "nodeadkeys", "sundeadkeys", "wang"]),
95 2064: ("ITS", "Switzerland", "Italian", 1252, "it", ["nodeadkeys", "mac", "us", "geo"]),
96 2067: ("NLB", "Belgium", "Dutch", 1252, "nl", ["sundeadkeys", "mac", "std"]),
97 2068: ("NON", "Norway (Nynorsk)", "Norwegian", 1252, "no", ["nodeadkeys", "dvorak", "smi", "smi_nodeadkeys", "mac", "mac_nodeadkeys"]),
98 2070: ("PTG", "Portugal", "Portuguese", 1252, "pt", ["nodeadkeys", "sundeadkeys", "mac", "mac_nodeadkeys", "mac_sundeadkeys", "nativo", "nativo-us", "nativo-epo"]),
99 2074: ("SRL", "Serbia (Latin)", "Serbian", 1250, "rs", RS_VARIANTS),
100 2077: ("SVF", "Finland", "Swedish", 1252, "se", ["nodeadkeys", "dvorak", "rus", "rus_nodeadkeys", "smi", "mac", "svdvorak", "swl"]),
101 2092: ("AZE", "Azerbaijan (Cyrillic)", "Azeri", 1251, "az", ["cyrillic"]),
102 2110: ("MSB", "Brunei Darussalam", "Malay", 1252, "in", ["mal", "mal_lalitha", "mal_enhanced"]),
103 2115: ("UZB", "Uzbekistan (Cyrillic)", "Uzbek", 1251, "uz", ["latin"]),
104 3073: ("ARE", "Egypt", "Arabic", 1256, "ara", ARA_VARIANTS),
105 3076: ("ZHH", "Hong Kong SAR", "Chinese", 950, "cn", []),
106 3079: ("DEA", "Austria", "German", 1252, "at", ["nodeadkeys", "sundeadkeys", "mac"]),
107 3081: ("ENA", "Australia", "English", 1252, "us", []),
108 3082: ("ESN", "Spain (International sort)", "Spanish", 1252, "es", ES_VARIANTS),
109 3084: ("FRC", "Canada", "French", 1252, "ca", ["fr-dvorak", "fr-legacy", "multix", "multi", "multi-2gr", "ike"]),
110 3098: ("SRB", "Serbia (Cyrillic)", "Serbian", 1251, "", RS_VARIANTS),
111 4097: ("ARL", "Libya", "Arabic", 1256, "ara", ARA_VARIANTS),
112 4100: ("ZHI", "Singapore", "Chinese", 936, "cn", []),
113 4103: ("DEL", "Luxembourg", "German", 1252, "de", []),
114 4105: ("ENC", "Canada", "English", 1252, "ca", ["eng"]),
115 4106: ("ESG", "Guatemala", "Spanish", 1252, "latam", LATAM_VARIANTS),
116 4108: ("FRS", "Switzerland", "French", 1252, "ch", ["fr", "fr_nodeadkeys", "fr_sundeadkeys", "fr_mac"]),
117 5121: ("ARG", "Algeria", "Arabic", 1256, "ara", ARA_VARIANTS),
118 5124: ("ZHM", "Macao SAR", "Chinese", 950, "cn", []),
119 5127: ("DEC", "Liechtenstein", "German", 1252, "de", []),
120 5129: ("ENZ", "New Zealand", "English", 1252, "us", []),
121 5130: ("ESC", "Costa Rica", "Spanish", 1252, "latam", LATAM_VARIANTS),
122 5132: ("FRL", "Luxembourg", "French", 1252, "fr", FR_VARIANTS),
123 6145: ("ARM", "Morocco", "Arabic", 1256, "ara", ARA_VARIANTS),
124 6153: ("ENI", "Ireland", "English", 1252, "en", []),
125 6154: ("ESA", "Panama", "Spanish", 1252, "latam", LATAM_VARIANTS),
126 6156: ("FRM", "Monaco", "French", 1252, "fr", FR_VARIANTS),
127 7169: ("ART", "Tunisia", "Arabic", 1256, "ara", ARA_VARIANTS),
128 7177: ("ENS", "South Africa", "English", 1252, "en", []),
129 7178: ("ESD", "Dominican Republic", "Spanish", 1252, "latam", LATAM_VARIANTS),
130 8193: ("ARO", "Oman", "Arabic", 1256, "ara", ARA_VARIANTS),
131 8201: ("ENJ", "Jamaica", "English", 1252, "en", []),
132 8202: ("ESV", "Venezuela", "Spanish", 1252, "latam", LATAM_VARIANTS),
133 9217: ("ARY", "Yemen", "Arabic", 1256, "ara", ARA_VARIANTS),
134 9225: ("ENB", "Caribbean", "English", 1252, "en", []),
135 9226: ("ESO", "Colombia", "Spanish", 1252, "latam", LATAM_VARIANTS),
136 10241: ("ARS", "Syria", "Arabic", 1256, "sy", ["syc", "syc_phonetic"]),
137 10249: ("ENL", "Belize", "English", 1252, "us", []),
138 10250: ("ESR", "Peru", "Spanish", 1252, "latam", LATAM_VARIANTS),
139 11265: ("ARJ", "Jordan", "Arabic", 1256, "ara", ARA_VARIANTS),
140 11273: ("ENT", "Trinidad", "English", 1252, "us", []),
141 11274: ("ESS", "Argentina", "Spanish", 1252, "latam", LATAM_VARIANTS),
142 12289: ("ARB", "Lebanon", "Arabic", 1256, "ara", ARA_VARIANTS),
143 12297: ("ENW", "Zimbabwe", "English", 1252, "us", []),
144 12298: ("ESF", "Ecuador", "Spanish", 1252, "latam", LATAM_VARIANTS),
145 13321: ("ENP", "Philippines", "English", 1252, "us", []),
146 13313: ("ARK", "Kuwait", "Arabic", 1256, "ara", ARA_VARIANTS),
147 13322: ("ESL", "Chile", "Spanish", 1252, "latam", LATAM_VARIANTS),
148 14337: ("ARU", "U.A.E.", "Arabic", 1256, "ara", ARA_VARIANTS),
149 14345: ("", "Indonesia", "English", 1252, "us", []),
150 14346: ("ESY", "Uruguay", "Spanish", 1252, "latam", LATAM_VARIANTS),
151 15361: ("ARH", "Bahrain", "Arabic", 1256, "ara", ARA_VARIANTS),
152 15369: ("ZHH", "Hong Kong SAR", "English", 1252, "us", []),
153 15370: ("ESZ", "Paraguay", "Spanish", 1252, "latam", LATAM_VARIANTS),
154 16385: ("ARQ", "Qatar", "Arabic", 1256, "ara", ARA_VARIANTS),
155 16393: ("", "India", "English", 1252, "us", []),
156 16394: ("ESB", "Bolivia", "Spanish", 1252, "latam", LATAM_VARIANTS),
157 17417: ("", "Malaysia", "English", 1252, "us", []),
158 17418: ("ESE", "El Salvador", "Spanish", 1252, "latam", LATAM_VARIANTS),
159 18441: ("", "Singapore", "English", 1252, "us", []),
160 18442: ("ESH", "Honduras", "Spanish", 1252, "latam", LATAM_VARIANTS),
161 19466: ("ESI", "Nicaragua", "Spanish", 1252, "latam", LATAM_VARIANTS),
162 20490: ("ESU", "Puerto Rico", "Spanish", 1252, "latam", LATAM_VARIANTS),
163 58378: ("", "LatAm", "Spanish", 1252, "latam", LATAM_VARIANTS),
164 58380: ("", "North Africa", "French", 1252, "fr", FR_VARIANTS),
165 }
167#map win32 keyboard codes to x11 names:
168#based on
169#https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-language-pack-default-values
170WIN32_KEYBOARDS = {
171 0x0000041c : ("al", "Albania"),
172 0x00000401 : ("ar", "Arabic (101)"),
173 0x00010401 : ("ar", "Arabic (102)"),
174 0x00020401 : ("ar", "Arabic (102) AZERTY"),
175 0x0000042b : ("am", "Armenian Eastern"),
176 0x0002042b : ("am", "Armenian Phonetic"),
177 0x0003042b : ("am", "Armenian Typewriter"),
178 0x0001042b : ("am", "Armenian Western"),
179 0x0000044d : ("in", "Assamese - Inscript"),
180 0x0001042c : ("az", "Azerbaijani (Standard)"),
181 0x0000082c : ("az", "Azerbaijani Cyrillic"),
182 0x0000042c : ("az", "Azerbaijani Latin"),
183 0x0000046d : ("ru", "Bashkir"),
184 0x00000423 : ("by", "Belarusian"),
185 0x0001080c : ("be", "Belgian (Comma)"),
186 0x00000813 : ("be", "Belgian (Period)"),
187 0x0000080c : ("be", "Belgian French"),
188 0x00000445 : ("bd", "Bangla (Bangladesh)"),
189 0x00020445 : ("bd", "Bangla (India)"),
190 0x00010445 : ("bd", "Bangla (India - Legacy)"),
191 0x0000201a : ("ba", "Bosnian (Cyrillic)"),
192 0x000b0c00 : ("??", "Buginese"),
193 0x00030402 : ("bg", "Bulgarian"),
194 0x00010402 : ("bg", "Bulgarian (Latin)"),
195 0x00020402 : ("bg", "Bulgarian (phonetic layout)"),
196 0x00040402 : ("bg", "Bulgarian (phonetic traditional)"),
197 0x00000402 : ("bg", "Bulgarian (Typewriter)"),
198 0x00001009 : ("ca", "Canadian French"),
199 0x00000c0c : ("ca", "Canadian French (Legacy)"),
200 0x00011009 : ("ca", "Canadian Multilingual Standard"),
201 0x0000085f : ("fr", "Central Atlas Tamazight"),
202 0x00000429 : ("ku", "Central Kurdish"),
203 0x0000045c : ("us", "Cherokee Nation"),
204 0x0001045c : ("us", "Cherokee Nation Phonetic"),
205 0x00000804 : ("cn", "Chinese (Simplified) - US Keyboard"),
206 0x00000404 : ("cn", "Chinese (Traditional) - US Keyboard"),
207 0x00000c04 : ("cn", "Chinese (Traditional, Hong Kong S.A.R.)"),
208 0x00001404 : ("cn", "Chinese (Traditional Macao S.A.R.) US Keyboard"),
209 0x00001004 : ("cn", "Chinese (Simplified, Singapore) - US keyboard"),
210 0x0000041a : ("hr", "Croatian"),
211 0x00000405 : ("cz", "Czech"),
212 0x00010405 : ("cz", "Czech (QWERTY)"),
213 0x00020405 : ("cz", "Czech Programmers"),
214 0x00000406 : ("dk", "Danish"),
215 0x00000439 : ("in", "Devanagari-INSCRIPT"),
216 0x00000465 : ("in", "Divehi Phonetic"),
217 0x00010465 : ("in", "Divehi Typewriter"),
218 0x00000413 : ("nl", "Dutch"),
219 0x00000C51 : ("dz", "Dzongkha"),
220 0x00000425 : ("ee", "Estonian"),
221 0x00000438 : ("fo", "Faeroese"),
222 0x0000040b : ("fi", "Finnish"),
223 0x0001083b : ("fi", "Finnish with Sami"),
224 0x0000040c : ("fr", "French"),
225 0x00120c00 : ("??", "Futhark"),
226 0x00000437 : ("ge", "Georgian"),
227 0x00020437 : ("ge", "Georgian (Ergonomic)"),
228 0x00010437 : ("ge", "Georgian (QWERTY)"),
229 0x00030437 : ("ge", "Georgian Ministry of Education and Science Schools"),
230 0x00040437 : ("ge", "Georgian (Old Alphabets)"),
231 0x00000407 : ("de", "German"),
232 0x00010407 : ("de", "German (IBM)"),
233 0x000c0c00 : ("??", "Gothic"),
234 0x00000408 : ("gr", "Greek"),
235 #Duplicate of 'tr':
236 #0x00010408 : ("gr", "Greek (220)"),
237 0x00030408 : ("gr", "Greek (220) Latin"),
238 0x00020408 : ("gr", "Greek (319)"),
239 0x00040408 : ("gr", "Greek (319) Latin"),
240 0x00050408 : ("gr", "Greek Latin"),
241 0x00060408 : ("gr", "Greek Polytonic"),
242 0x0000046f : ("??", "Greenlandic"),
243 0x00000474 : ("??", "Guarani"),
244 0x00000447 : ("in", "Gujarati"),
245 0x00000468 : ("gh", "Hausa"),
246 0x0000040d : ("il", "Hebrew"),
247 0x00010439 : ("in", "Hindi Traditional"),
248 0x0000040e : ("hu", "Hungarian"),
249 0x0001040e : ("hu", "Hungarian 101-key"),
250 0x0000040f : ("is", "Icelandic"),
251 0x00000470 : ("ng", "Igbo"),
252 0x00004009 : ("in", "India"),
253 0x0000085d : ("ca", "Inuktitut - Latin"),
254 0x0001045d : ("ca", "Inuktitut - Naqittaut"),
255 0x00001809 : ("ie", "Ireland"),
256 0x00000410 : ("it", "Italian"),
257 0x00010410 : ("it", "Italian"),
258 0x00000411 : ("jp", "Japanese"),
259 0x00110c00 : ("??", "Javanese"),
260 0x0000044b : ("in", "Kannada"),
261 0x0000043f : ("kz", "Kazakh"),
262 0x00000453 : ("kh", "Khmer"),
263 0x00010453 : ("kh", "Khmer (NIDA)"),
264 0x00000412 : ("kr", "Korean"),
265 0x00000440 : ("kg", "Kyrgyz Cyrillic"),
266 0x00000454 : ("la", "Lao"),
267 0x0000080a : ("latam", "Latin American"),
268 0x00020426 : ("lv", "Latvian (Standard)"),
269 0x00010426 : ("lv", "Latvian (Legacy)"),
270 0x00070c00 : ("??", "Lisu (Basic)"),
271 0x00080c00 : ("??", "Lisu (Standard)"),
272 0x00010427 : ("lt", "Lithuanian"),
273 0x00000427 : ("lt", "Lithuanian IBM"),
274 0x00020427 : ("lt", "Lithuanian Standard"),
275 0x0000046e : ("de", "Luxembourgish"),
276 0x0000042f : ("mk", "Macedonia (FYROM)"),
277 0x0001042f : ("mk", "Macedonia (FYROM) - Standard"),
278 0x0000044c : ("in", "Malayalam"),
279 0x0000043a : ("mt", "Maltese 47-Key"),
280 0x0001043a : ("mt", "Maltese 48-key"),
281 0x00000481 : ("mao", "Maori"),
282 0x0000044e : ("in", "Marathi"),
283 0x00000850 : ("mn", "Mongolian (Mongolian Script - Legacy)"),
284 0x00020850 : ("mn", "Mongolian (Mongolian Script - Standard)"),
285 0x00000450 : ("mn", "Mongolian Cyrillic"),
286 0x00010c00 : ("mm", "Myanmar"),
287 0x00090c00 : ("??", "N'ko"),
288 0x00000461 : ("np", "Nepali"),
289 0x00020c00 : ("th", "New Tai Lue"),
290 0x00000414 : ("no", "Norwegian"),
291 0x0000043b : ("no", "Norwegian with Sami"),
292 0x00000448 : ("in", "Odia"),
293 0x000d0c00 : ("in", "Ol Chiki"),
294 0x000f0c00 : ("??", "Old Italic"),
295 0x000e0c00 : ("??", "Osmanya"),
296 0x00000463 : ("af", "Pashto (Afghanistan)"),
297 #duplicate of 'ku'
298 #0x00000429 : ("ir", "Persian"),
299 0x00050429 : ("ir", "Persian (Standard)"),
300 0x000a0c00 : ("cn", "Phags-pa"),
301 0x00010415 : ("pl", "Polish (214)"),
302 0x00000415 : ("pl", "Polish (Programmers)"),
303 0x00000816 : ("pt", "Portuguese"),
304 0x00000416 : ("pt", "Portuguese (Brazilian ABNT),"),
305 0x00010416 : ("pt", "Portuguese (Brazilian ABNT2)"),
306 0x00000446 : ("in", "Punjabi"),
307 0x00000418 : ("ro", "Romanian (Legacy)"),
308 0x00020418 : ("ro", "Romanian (Programmers)"),
309 0x00010418 : ("ro", "Romanian (Standard)"),
310 0x00000419 : ("ru", "Russian"),
311 0x00020419 : ("ru", "Russian - Mnemonic"),
312 0x00010419 : ("ru", "Russian (Typewriter)"),
313 #duplicate of 'tr'
314 #0x00000485 : ("ru", "Sakha"),
315 0x0002083b : ("fi", "Sami Extended Finland-Sweden"),
316 0x0001043b : ("no", "Sami Extended Norway"),
317 0x00011809 : ("gb", "Scottish Gaelic"),
318 0x00000c1a : ("ru", "Serbian (Cyrillic)"),
319 0x0000081a : ("rs", "Serbian (Latin)"),
320 0x0000046c : ("za", "Sesotho sa Leboa"),
321 0x00000432 : ("za", "Setswana"),
322 0x0000045b : ("in", "Sinhala"),
323 0x0001045b : ("in", "Sinhala - wij 9"),
324 0x0000041b : ("sk", "Slovak"),
325 0x0001041b : ("sk", "Slovak (QWERTY)"),
326 0x00000424 : ("si", "Slovenian"),
327 0x00100c00 : ("in", "Sora"),
328 0x0001042e : ("de", "Sorbian Extended"),
329 0x0002042e : ("de", "Sorbian Standard"),
330 0x0000042e : ("de", "Sorbian Standard (Legacy)"),
331 0x0000040a : ("es", "Spanish"),
332 0x0001040a : ("es", "Spanish Variation"),
333 0x0000041d : ("se", "Swedish"),
334 0x0000083b : ("se", "Swedish with Sami"),
335 0x0000100c : ("fr", "Swiss French"),
336 0x00000807 : ("de", "Swiss German"),
337 0x0000045a : ("sy", "Syriac"),
338 0x0001045a : ("sy", "Syriac Phonetic"),
339 0x00030c00 : ("cn", "Tai Le"),
340 0x00000428 : ("tj", "Tajik"),
341 0x00000449 : ("in", "Tamil"),
342 0x00010444 : ("ru", "Tatar"),
343 0x00000444 : ("ru", "Tatar (Legacy)"),
344 0x0000044a : ("in", "Telugu"),
345 0x0000041e : ("th", "Thai Kedmanee"),
346 0x0002041e : ("th", "Thai Kedmanee (non-ShiftLock)"),
347 0x0001041e : ("th", "Thai Pattachote"),
348 0x0003041e : ("th", "Thai Pattachote (non-ShiftLock)"),
349 0x00010451 : ("cn", "Tibetan (PRC - Standard)"),
350 0x00000451 : ("cn", "Tibetan (PRC - Legacy)"),
351 0x00050c00 : ("ma", "Tifinagh (Basic)"),
352 0x00060c00 : ("ma", "Tifinagh (Full)"),
353 0x0001041f : ("tr", "Turkish F"),
354 0x0000041f : ("tr", "Turkish Q"),
355 0x00000442 : ("tm", "Turkmen"),
356 0x00010408 : ("tr", "Uyghur "),
357 0x00000480 : ("tr", "Uyghur (Legacy)"),
358 0x00000422 : ("ua", "Ukrainian"),
359 0x00020422 : ("ua", "Ukrainian (Enhanced)"),
360 0x00000809 : ("gb", "United Kingdom"),
361 0x00000452 : ("gb", "United Kingdom Extended"),
362 0x00010409 : ("us", "United States - Dvorak"),
363 0x00020409 : ("us", "United States - International"),
364 0x00030409 : ("us", "United States-Dvorak for left hand"),
365 0x00040409 : ("us", "United States-Dvorak for right hand"),
366 0x00000409 : ("us", "United States - English"),
367 0x00000420 : ("in", "Urdu"),
368 0x00000843 : ("ru", "Uzbek Cyrillic"),
369 0x0000042a : ("vn", "Vietnamese"),
370 0x00000488 : ("fr", "Wolof"),
371 0x00000485 : ("tr", "Yakut"),
372 0x0000046a : ("??", "Yoruba"),
373 }
375# This is generated from the table above so we can
376# let the user choose his own layout.
377# (country,language) : (layout,variant)
378X11_LAYOUTS = {}
379for _, country, language, _, layout, variants in WIN32_LAYOUTS.values():
380 key = (country,language)
381 value = (layout, variants)
382 X11_LAYOUTS[key] = value
383LAYOUT_VARIANTS = {}
384for _, _, _, _, layout, variants in WIN32_LAYOUTS.values():
385 l = LAYOUT_VARIANTS.get(layout)
386 if not l:
387 l = []
388 LAYOUT_VARIANTS[layout] = l
389 for variant in variants:
390 if variant not in l:
391 l.append(variant)
393def parse_xkbmap_query(xkbmap_query):
394 """ parses the output of "setxkbmap -query" into a dict """
395 import re
396 settings = {}
397 opt_re = re.compile(r"(\w*):\s*(.*)")
398 for line in xkbmap_query.splitlines():
399 m = opt_re.match(line)
400 if m:
401 v = m.group(2).strip()
402 if v.strip(","):
403 settings[m.group(1)] = v
404 return settings
406def xkbmap_query_tostring(query_dict):
407 """ converts an xkb query dict back into a string """
408 s = ""
409 for k in ("rules", "model", "layout", "variant", "options"):
410 if k in query_dict:
411 v = query_dict.get(k)
412 s += (str(k)+":").ljust(12)+str(v)+"\n"
413 return s