Hide keyboard shortcuts

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. 

6 

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 } 

166 

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 } 

374 

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) 

392 

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 

405 

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