unicode_to_keysym.cc 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/host/linux/unicode_to_keysym.h"
  5. #include <algorithm>
  6. #include "ui/gfx/x/keysyms/keysyms.h"
  7. namespace remoting {
  8. namespace {
  9. struct CodePair {
  10. int keysym;
  11. uint32_t unicode;
  12. };
  13. // The table has been sorted by the second column so it can be searched using
  14. // binary search. There might be multiple present keysyms for the same unicode
  15. // value (e.g. see XK_Tab and XK_KP_Tab). It excludes Latin1 characters (which
  16. // have 1-to-1 mapping between keysym and unicode), but includes some
  17. // alternative keysyms for some of them (e.g. XK_KP_0 for '0').
  18. const CodePair kKeySymUnicodeMap[] = {
  19. { XK_BackSpace, 0x0008 },
  20. { XK_Tab, 0x0009 },
  21. { XK_KP_Tab, 0x0009 },
  22. { XK_Return, 0x000a },
  23. { XK_Escape, 0x001b },
  24. { XK_KP_Multiply, 0x002a },
  25. { XK_KP_Add, 0x002b },
  26. { XK_KP_Separator, 0x002c },
  27. { XK_KP_Subtract, 0x002d },
  28. { XK_KP_Decimal, 0x002e },
  29. { XK_KP_Divide, 0x002f },
  30. { XK_KP_0, 0x0030 },
  31. { XK_KP_1, 0x0031 },
  32. { XK_KP_2, 0x0032 },
  33. { XK_KP_3, 0x0033 },
  34. { XK_KP_4, 0x0034 },
  35. { XK_KP_5, 0x0035 },
  36. { XK_KP_6, 0x0036 },
  37. { XK_KP_7, 0x0037 },
  38. { XK_KP_8, 0x0038 },
  39. { XK_KP_9, 0x0039 },
  40. { XK_leftcaret, 0x003c },
  41. { XK_KP_Equal, 0x003d },
  42. { XK_rightcaret, 0x003e },
  43. { XK_underbar, 0x005f },
  44. { XK_Delete, 0x007f },
  45. { XK_overbar, 0x00af },
  46. { XK_Amacron, 0x0100 },
  47. { XK_amacron, 0x0101 },
  48. { XK_Abreve, 0x0102 },
  49. { XK_abreve, 0x0103 },
  50. { XK_Aogonek, 0x0104 },
  51. { XK_aogonek, 0x0105 },
  52. { XK_Cacute, 0x0106 },
  53. { XK_cacute, 0x0107 },
  54. { XK_Ccircumflex, 0x0108 },
  55. { XK_ccircumflex, 0x0109 },
  56. { XK_Cabovedot, 0x010a },
  57. { XK_cabovedot, 0x010b },
  58. { XK_Ccaron, 0x010c },
  59. { XK_ccaron, 0x010d },
  60. { XK_Dcaron, 0x010e },
  61. { XK_dcaron, 0x010f },
  62. { XK_Dstroke, 0x0110 },
  63. { XK_dstroke, 0x0111 },
  64. { XK_Emacron, 0x0112 },
  65. { XK_emacron, 0x0113 },
  66. { XK_Eabovedot, 0x0116 },
  67. { XK_eabovedot, 0x0117 },
  68. { XK_Eogonek, 0x0118 },
  69. { XK_eogonek, 0x0119 },
  70. { XK_Ecaron, 0x011a },
  71. { XK_ecaron, 0x011b },
  72. { XK_Gcircumflex, 0x011c },
  73. { XK_gcircumflex, 0x011d },
  74. { XK_Gbreve, 0x011e },
  75. { XK_gbreve, 0x011f },
  76. { XK_Gabovedot, 0x0120 },
  77. { XK_gabovedot, 0x0121 },
  78. { XK_Gcedilla, 0x0122 },
  79. { XK_gcedilla, 0x0123 },
  80. { XK_Hcircumflex, 0x0124 },
  81. { XK_hcircumflex, 0x0125 },
  82. { XK_Hstroke, 0x0126 },
  83. { XK_hstroke, 0x0127 },
  84. { XK_Itilde, 0x0128 },
  85. { XK_itilde, 0x0129 },
  86. { XK_Imacron, 0x012a },
  87. { XK_imacron, 0x012b },
  88. { XK_Iogonek, 0x012e },
  89. { XK_iogonek, 0x012f },
  90. { XK_Iabovedot, 0x0130 },
  91. { XK_idotless, 0x0131 },
  92. { XK_Jcircumflex, 0x0134 },
  93. { XK_jcircumflex, 0x0135 },
  94. { XK_Kcedilla, 0x0136 },
  95. { XK_kcedilla, 0x0137 },
  96. { XK_kra, 0x0138 },
  97. { XK_Lacute, 0x0139 },
  98. { XK_lacute, 0x013a },
  99. { XK_Lcedilla, 0x013b },
  100. { XK_lcedilla, 0x013c },
  101. { XK_Lcaron, 0x013d },
  102. { XK_lcaron, 0x013e },
  103. { XK_Lstroke, 0x0141 },
  104. { XK_lstroke, 0x0142 },
  105. { XK_Nacute, 0x0143 },
  106. { XK_nacute, 0x0144 },
  107. { XK_Ncedilla, 0x0145 },
  108. { XK_ncedilla, 0x0146 },
  109. { XK_Ncaron, 0x0147 },
  110. { XK_ncaron, 0x0148 },
  111. { XK_ENG, 0x014a },
  112. { XK_eng, 0x014b },
  113. { XK_Omacron, 0x014c },
  114. { XK_omacron, 0x014d },
  115. { XK_Odoubleacute, 0x0150 },
  116. { XK_odoubleacute, 0x0151 },
  117. { XK_OE, 0x0152 },
  118. { XK_oe, 0x0153 },
  119. { XK_Racute, 0x0154 },
  120. { XK_racute, 0x0155 },
  121. { XK_Rcedilla, 0x0156 },
  122. { XK_rcedilla, 0x0157 },
  123. { XK_Rcaron, 0x0158 },
  124. { XK_rcaron, 0x0159 },
  125. { XK_Sacute, 0x015a },
  126. { XK_sacute, 0x015b },
  127. { XK_Scircumflex, 0x015c },
  128. { XK_scircumflex, 0x015d },
  129. { XK_Scedilla, 0x015e },
  130. { XK_scedilla, 0x015f },
  131. { XK_Scaron, 0x0160 },
  132. { XK_scaron, 0x0161 },
  133. { XK_Tcedilla, 0x0162 },
  134. { XK_tcedilla, 0x0163 },
  135. { XK_Tcaron, 0x0164 },
  136. { XK_tcaron, 0x0165 },
  137. { XK_Tslash, 0x0166 },
  138. { XK_tslash, 0x0167 },
  139. { XK_Utilde, 0x0168 },
  140. { XK_utilde, 0x0169 },
  141. { XK_Umacron, 0x016a },
  142. { XK_umacron, 0x016b },
  143. { XK_Ubreve, 0x016c },
  144. { XK_ubreve, 0x016d },
  145. { XK_Uring, 0x016e },
  146. { XK_uring, 0x016f },
  147. { XK_Udoubleacute, 0x0170 },
  148. { XK_udoubleacute, 0x0171 },
  149. { XK_Uogonek, 0x0172 },
  150. { XK_uogonek, 0x0173 },
  151. { XK_Ydiaeresis, 0x0178 },
  152. { XK_Zacute, 0x0179 },
  153. { XK_zacute, 0x017a },
  154. { XK_Zabovedot, 0x017b },
  155. { XK_zabovedot, 0x017c },
  156. { XK_Zcaron, 0x017d },
  157. { XK_zcaron, 0x017e },
  158. { XK_function, 0x0192 },
  159. { XK_caron, 0x02c7 },
  160. { XK_breve, 0x02d8 },
  161. { XK_abovedot, 0x02d9 },
  162. { XK_ogonek, 0x02db },
  163. { XK_doubleacute, 0x02dd },
  164. { XK_Greek_accentdieresis, 0x0385 },
  165. { XK_Greek_ALPHAaccent, 0x0386 },
  166. { XK_Greek_EPSILONaccent, 0x0388 },
  167. { XK_Greek_ETAaccent, 0x0389 },
  168. { XK_Greek_IOTAaccent, 0x038a },
  169. { XK_Greek_OMICRONaccent, 0x038c },
  170. { XK_Greek_UPSILONaccent, 0x038e },
  171. { XK_Greek_OMEGAaccent, 0x038f },
  172. { XK_Greek_iotaaccentdieresis, 0x0390 },
  173. { XK_Greek_ALPHA, 0x0391 },
  174. { XK_Greek_BETA, 0x0392 },
  175. { XK_Greek_GAMMA, 0x0393 },
  176. { XK_Greek_DELTA, 0x0394 },
  177. { XK_Greek_EPSILON, 0x0395 },
  178. { XK_Greek_ZETA, 0x0396 },
  179. { XK_Greek_ETA, 0x0397 },
  180. { XK_Greek_THETA, 0x0398 },
  181. { XK_Greek_IOTA, 0x0399 },
  182. { XK_Greek_KAPPA, 0x039a },
  183. { XK_Greek_LAMDA, 0x039b },
  184. { XK_Greek_MU, 0x039c },
  185. { XK_Greek_NU, 0x039d },
  186. { XK_Greek_XI, 0x039e },
  187. { XK_Greek_OMICRON, 0x039f },
  188. { XK_Greek_PI, 0x03a0 },
  189. { XK_Greek_RHO, 0x03a1 },
  190. { XK_Greek_SIGMA, 0x03a3 },
  191. { XK_Greek_TAU, 0x03a4 },
  192. { XK_Greek_UPSILON, 0x03a5 },
  193. { XK_Greek_PHI, 0x03a6 },
  194. { XK_Greek_CHI, 0x03a7 },
  195. { XK_Greek_PSI, 0x03a8 },
  196. { XK_Greek_OMEGA, 0x03a9 },
  197. { XK_Greek_IOTAdiaeresis, 0x03aa },
  198. { XK_Greek_UPSILONdieresis, 0x03ab },
  199. { XK_Greek_alphaaccent, 0x03ac },
  200. { XK_Greek_epsilonaccent, 0x03ad },
  201. { XK_Greek_etaaccent, 0x03ae },
  202. { XK_Greek_iotaaccent, 0x03af },
  203. { XK_Greek_upsilonaccentdieresis, 0x03b0 },
  204. { XK_Greek_alpha, 0x03b1 },
  205. { XK_Greek_beta, 0x03b2 },
  206. { XK_Greek_gamma, 0x03b3 },
  207. { XK_Greek_delta, 0x03b4 },
  208. { XK_Greek_epsilon, 0x03b5 },
  209. { XK_Greek_zeta, 0x03b6 },
  210. { XK_Greek_eta, 0x03b7 },
  211. { XK_Greek_theta, 0x03b8 },
  212. { XK_Greek_iota, 0x03b9 },
  213. { XK_Greek_kappa, 0x03ba },
  214. { XK_Greek_lamda, 0x03bb },
  215. { XK_Greek_mu, 0x03bc },
  216. { XK_Greek_nu, 0x03bd },
  217. { XK_Greek_xi, 0x03be },
  218. { XK_Greek_omicron, 0x03bf },
  219. { XK_Greek_pi, 0x03c0 },
  220. { XK_Greek_rho, 0x03c1 },
  221. { XK_Greek_finalsmallsigma, 0x03c2 },
  222. { XK_Greek_sigma, 0x03c3 },
  223. { XK_Greek_tau, 0x03c4 },
  224. { XK_Greek_upsilon, 0x03c5 },
  225. { XK_Greek_phi, 0x03c6 },
  226. { XK_Greek_chi, 0x03c7 },
  227. { XK_Greek_psi, 0x03c8 },
  228. { XK_Greek_omega, 0x03c9 },
  229. { XK_Greek_iotadieresis, 0x03ca },
  230. { XK_Greek_upsilondieresis, 0x03cb },
  231. { XK_Greek_omicronaccent, 0x03cc },
  232. { XK_Greek_upsilonaccent, 0x03cd },
  233. { XK_Greek_omegaaccent, 0x03ce },
  234. { XK_Cyrillic_IO, 0x0401 },
  235. { XK_Serbian_DJE, 0x0402 },
  236. { XK_Macedonia_GJE, 0x0403 },
  237. { XK_Ukrainian_IE, 0x0404 },
  238. { XK_Macedonia_DSE, 0x0405 },
  239. { XK_Ukrainian_I, 0x0406 },
  240. { XK_Ukrainian_YI, 0x0407 },
  241. { XK_Cyrillic_JE, 0x0408 },
  242. { XK_Cyrillic_LJE, 0x0409 },
  243. { XK_Cyrillic_NJE, 0x040a },
  244. { XK_Serbian_TSHE, 0x040b },
  245. { XK_Macedonia_KJE, 0x040c },
  246. { XK_Byelorussian_SHORTU, 0x040e },
  247. { XK_Cyrillic_DZHE, 0x040f },
  248. { XK_Cyrillic_A, 0x0410 },
  249. { XK_Cyrillic_BE, 0x0411 },
  250. { XK_Cyrillic_VE, 0x0412 },
  251. { XK_Cyrillic_GHE, 0x0413 },
  252. { XK_Cyrillic_DE, 0x0414 },
  253. { XK_Cyrillic_IE, 0x0415 },
  254. { XK_Cyrillic_ZHE, 0x0416 },
  255. { XK_Cyrillic_ZE, 0x0417 },
  256. { XK_Cyrillic_I, 0x0418 },
  257. { XK_Cyrillic_SHORTI, 0x0419 },
  258. { XK_Cyrillic_KA, 0x041a },
  259. { XK_Cyrillic_EL, 0x041b },
  260. { XK_Cyrillic_EM, 0x041c },
  261. { XK_Cyrillic_EN, 0x041d },
  262. { XK_Cyrillic_O, 0x041e },
  263. { XK_Cyrillic_PE, 0x041f },
  264. { XK_Cyrillic_ER, 0x0420 },
  265. { XK_Cyrillic_ES, 0x0421 },
  266. { XK_Cyrillic_TE, 0x0422 },
  267. { XK_Cyrillic_U, 0x0423 },
  268. { XK_Cyrillic_EF, 0x0424 },
  269. { XK_Cyrillic_HA, 0x0425 },
  270. { XK_Cyrillic_TSE, 0x0426 },
  271. { XK_Cyrillic_CHE, 0x0427 },
  272. { XK_Cyrillic_SHA, 0x0428 },
  273. { XK_Cyrillic_SHCHA, 0x0429 },
  274. { XK_Cyrillic_HARDSIGN, 0x042a },
  275. { XK_Cyrillic_YERU, 0x042b },
  276. { XK_Cyrillic_SOFTSIGN, 0x042c },
  277. { XK_Cyrillic_E, 0x042d },
  278. { XK_Cyrillic_YU, 0x042e },
  279. { XK_Cyrillic_YA, 0x042f },
  280. { XK_Cyrillic_a, 0x0430 },
  281. { XK_Cyrillic_be, 0x0431 },
  282. { XK_Cyrillic_ve, 0x0432 },
  283. { XK_Cyrillic_ghe, 0x0433 },
  284. { XK_Cyrillic_de, 0x0434 },
  285. { XK_Cyrillic_ie, 0x0435 },
  286. { XK_Cyrillic_zhe, 0x0436 },
  287. { XK_Cyrillic_ze, 0x0437 },
  288. { XK_Cyrillic_i, 0x0438 },
  289. { XK_Cyrillic_shorti, 0x0439 },
  290. { XK_Cyrillic_ka, 0x043a },
  291. { XK_Cyrillic_el, 0x043b },
  292. { XK_Cyrillic_em, 0x043c },
  293. { XK_Cyrillic_en, 0x043d },
  294. { XK_Cyrillic_o, 0x043e },
  295. { XK_Cyrillic_pe, 0x043f },
  296. { XK_Cyrillic_er, 0x0440 },
  297. { XK_Cyrillic_es, 0x0441 },
  298. { XK_Cyrillic_te, 0x0442 },
  299. { XK_Cyrillic_u, 0x0443 },
  300. { XK_Cyrillic_ef, 0x0444 },
  301. { XK_Cyrillic_ha, 0x0445 },
  302. { XK_Cyrillic_tse, 0x0446 },
  303. { XK_Cyrillic_che, 0x0447 },
  304. { XK_Cyrillic_sha, 0x0448 },
  305. { XK_Cyrillic_shcha, 0x0449 },
  306. { XK_Cyrillic_hardsign, 0x044a },
  307. { XK_Cyrillic_yeru, 0x044b },
  308. { XK_Cyrillic_softsign, 0x044c },
  309. { XK_Cyrillic_e, 0x044d },
  310. { XK_Cyrillic_yu, 0x044e },
  311. { XK_Cyrillic_ya, 0x044f },
  312. { XK_Cyrillic_io, 0x0451 },
  313. { XK_Serbian_dje, 0x0452 },
  314. { XK_Macedonia_gje, 0x0453 },
  315. { XK_Ukrainian_ie, 0x0454 },
  316. { XK_Macedonia_dse, 0x0455 },
  317. { XK_Ukrainian_i, 0x0456 },
  318. { XK_Ukrainian_yi, 0x0457 },
  319. { XK_Cyrillic_je, 0x0458 },
  320. { XK_Cyrillic_lje, 0x0459 },
  321. { XK_Cyrillic_nje, 0x045a },
  322. { XK_Serbian_tshe, 0x045b },
  323. { XK_Macedonia_kje, 0x045c },
  324. { XK_Byelorussian_shortu, 0x045e },
  325. { XK_Cyrillic_dzhe, 0x045f },
  326. { XK_hebrew_aleph, 0x05d0 },
  327. { XK_hebrew_bet, 0x05d1 },
  328. { XK_hebrew_gimel, 0x05d2 },
  329. { XK_hebrew_dalet, 0x05d3 },
  330. { XK_hebrew_he, 0x05d4 },
  331. { XK_hebrew_waw, 0x05d5 },
  332. { XK_hebrew_zain, 0x05d6 },
  333. { XK_hebrew_chet, 0x05d7 },
  334. { XK_hebrew_tet, 0x05d8 },
  335. { XK_hebrew_yod, 0x05d9 },
  336. { XK_hebrew_finalkaph, 0x05da },
  337. { XK_hebrew_kaph, 0x05db },
  338. { XK_hebrew_lamed, 0x05dc },
  339. { XK_hebrew_finalmem, 0x05dd },
  340. { XK_hebrew_mem, 0x05de },
  341. { XK_hebrew_finalnun, 0x05df },
  342. { XK_hebrew_nun, 0x05e0 },
  343. { XK_hebrew_samech, 0x05e1 },
  344. { XK_hebrew_ayin, 0x05e2 },
  345. { XK_hebrew_finalpe, 0x05e3 },
  346. { XK_hebrew_pe, 0x05e4 },
  347. { XK_hebrew_finalzade, 0x05e5 },
  348. { XK_hebrew_zade, 0x05e6 },
  349. { XK_hebrew_qoph, 0x05e7 },
  350. { XK_hebrew_resh, 0x05e8 },
  351. { XK_hebrew_shin, 0x05e9 },
  352. { XK_hebrew_taw, 0x05ea },
  353. { XK_Arabic_comma, 0x060c },
  354. { XK_Arabic_semicolon, 0x061b },
  355. { XK_Arabic_question_mark, 0x061f },
  356. { XK_Arabic_hamza, 0x0621 },
  357. { XK_Arabic_maddaonalef, 0x0622 },
  358. { XK_Arabic_hamzaonalef, 0x0623 },
  359. { XK_Arabic_hamzaonwaw, 0x0624 },
  360. { XK_Arabic_hamzaunderalef, 0x0625 },
  361. { XK_Arabic_hamzaonyeh, 0x0626 },
  362. { XK_Arabic_alef, 0x0627 },
  363. { XK_Arabic_beh, 0x0628 },
  364. { XK_Arabic_tehmarbuta, 0x0629 },
  365. { XK_Arabic_teh, 0x062a },
  366. { XK_Arabic_theh, 0x062b },
  367. { XK_Arabic_jeem, 0x062c },
  368. { XK_Arabic_hah, 0x062d },
  369. { XK_Arabic_khah, 0x062e },
  370. { XK_Arabic_dal, 0x062f },
  371. { XK_Arabic_thal, 0x0630 },
  372. { XK_Arabic_ra, 0x0631 },
  373. { XK_Arabic_zain, 0x0632 },
  374. { XK_Arabic_seen, 0x0633 },
  375. { XK_Arabic_sheen, 0x0634 },
  376. { XK_Arabic_sad, 0x0635 },
  377. { XK_Arabic_dad, 0x0636 },
  378. { XK_Arabic_tah, 0x0637 },
  379. { XK_Arabic_zah, 0x0638 },
  380. { XK_Arabic_ain, 0x0639 },
  381. { XK_Arabic_ghain, 0x063a },
  382. { XK_Arabic_tatweel, 0x0640 },
  383. { XK_Arabic_feh, 0x0641 },
  384. { XK_Arabic_qaf, 0x0642 },
  385. { XK_Arabic_kaf, 0x0643 },
  386. { XK_Arabic_lam, 0x0644 },
  387. { XK_Arabic_meem, 0x0645 },
  388. { XK_Arabic_noon, 0x0646 },
  389. { XK_Arabic_ha, 0x0647 },
  390. { XK_Arabic_waw, 0x0648 },
  391. { XK_Arabic_alefmaksura, 0x0649 },
  392. { XK_Arabic_yeh, 0x064a },
  393. { XK_Arabic_fathatan, 0x064b },
  394. { XK_Arabic_dammatan, 0x064c },
  395. { XK_Arabic_kasratan, 0x064d },
  396. { XK_Arabic_fatha, 0x064e },
  397. { XK_Arabic_damma, 0x064f },
  398. { XK_Arabic_kasra, 0x0650 },
  399. { XK_Arabic_shadda, 0x0651 },
  400. { XK_Arabic_sukun, 0x0652 },
  401. { XK_Thai_kokai, 0x0e01 },
  402. { XK_Thai_khokhai, 0x0e02 },
  403. { XK_Thai_khokhuat, 0x0e03 },
  404. { XK_Thai_khokhwai, 0x0e04 },
  405. { XK_Thai_khokhon, 0x0e05 },
  406. { XK_Thai_khorakhang, 0x0e06 },
  407. { XK_Thai_ngongu, 0x0e07 },
  408. { XK_Thai_chochan, 0x0e08 },
  409. { XK_Thai_choching, 0x0e09 },
  410. { XK_Thai_chochang, 0x0e0a },
  411. { XK_Thai_soso, 0x0e0b },
  412. { XK_Thai_chochoe, 0x0e0c },
  413. { XK_Thai_yoying, 0x0e0d },
  414. { XK_Thai_dochada, 0x0e0e },
  415. { XK_Thai_topatak, 0x0e0f },
  416. { XK_Thai_thothan, 0x0e10 },
  417. { XK_Thai_thonangmontho, 0x0e11 },
  418. { XK_Thai_thophuthao, 0x0e12 },
  419. { XK_Thai_nonen, 0x0e13 },
  420. { XK_Thai_dodek, 0x0e14 },
  421. { XK_Thai_totao, 0x0e15 },
  422. { XK_Thai_thothung, 0x0e16 },
  423. { XK_Thai_thothahan, 0x0e17 },
  424. { XK_Thai_thothong, 0x0e18 },
  425. { XK_Thai_nonu, 0x0e19 },
  426. { XK_Thai_bobaimai, 0x0e1a },
  427. { XK_Thai_popla, 0x0e1b },
  428. { XK_Thai_phophung, 0x0e1c },
  429. { XK_Thai_fofa, 0x0e1d },
  430. { XK_Thai_phophan, 0x0e1e },
  431. { XK_Thai_fofan, 0x0e1f },
  432. { XK_Thai_phosamphao, 0x0e20 },
  433. { XK_Thai_moma, 0x0e21 },
  434. { XK_Thai_yoyak, 0x0e22 },
  435. { XK_Thai_rorua, 0x0e23 },
  436. { XK_Thai_ru, 0x0e24 },
  437. { XK_Thai_loling, 0x0e25 },
  438. { XK_Thai_lu, 0x0e26 },
  439. { XK_Thai_wowaen, 0x0e27 },
  440. { XK_Thai_sosala, 0x0e28 },
  441. { XK_Thai_sorusi, 0x0e29 },
  442. { XK_Thai_sosua, 0x0e2a },
  443. { XK_Thai_hohip, 0x0e2b },
  444. { XK_Thai_lochula, 0x0e2c },
  445. { XK_Thai_oang, 0x0e2d },
  446. { XK_Thai_honokhuk, 0x0e2e },
  447. { XK_Thai_paiyannoi, 0x0e2f },
  448. { XK_Thai_saraa, 0x0e30 },
  449. { XK_Thai_maihanakat, 0x0e31 },
  450. { XK_Thai_saraaa, 0x0e32 },
  451. { XK_Thai_saraam, 0x0e33 },
  452. { XK_Thai_sarai, 0x0e34 },
  453. { XK_Thai_saraii, 0x0e35 },
  454. { XK_Thai_saraue, 0x0e36 },
  455. { XK_Thai_sarauee, 0x0e37 },
  456. { XK_Thai_sarau, 0x0e38 },
  457. { XK_Thai_sarauu, 0x0e39 },
  458. { XK_Thai_phinthu, 0x0e3a },
  459. { XK_Thai_baht, 0x0e3f },
  460. { XK_Thai_sarae, 0x0e40 },
  461. { XK_Thai_saraae, 0x0e41 },
  462. { XK_Thai_sarao, 0x0e42 },
  463. { XK_Thai_saraaimaimuan, 0x0e43 },
  464. { XK_Thai_saraaimaimalai, 0x0e44 },
  465. { XK_Thai_lakkhangyao, 0x0e45 },
  466. { XK_Thai_maiyamok, 0x0e46 },
  467. { XK_Thai_maitaikhu, 0x0e47 },
  468. { XK_Thai_maiek, 0x0e48 },
  469. { XK_Thai_maitho, 0x0e49 },
  470. { XK_Thai_maitri, 0x0e4a },
  471. { XK_Thai_maichattawa, 0x0e4b },
  472. { XK_Thai_thanthakhat, 0x0e4c },
  473. { XK_Thai_nikhahit, 0x0e4d },
  474. { XK_Thai_leksun, 0x0e50 },
  475. { XK_Thai_leknung, 0x0e51 },
  476. { XK_Thai_leksong, 0x0e52 },
  477. { XK_Thai_leksam, 0x0e53 },
  478. { XK_Thai_leksi, 0x0e54 },
  479. { XK_Thai_lekha, 0x0e55 },
  480. { XK_Thai_lekhok, 0x0e56 },
  481. { XK_Thai_lekchet, 0x0e57 },
  482. { XK_Thai_lekpaet, 0x0e58 },
  483. { XK_Thai_lekkao, 0x0e59 },
  484. { XK_Hangul_J_Kiyeog, 0x11a8 },
  485. { XK_Hangul_J_SsangKiyeog, 0x11a9 },
  486. { XK_Hangul_J_KiyeogSios, 0x11aa },
  487. { XK_Hangul_J_Nieun, 0x11ab },
  488. { XK_Hangul_J_NieunJieuj, 0x11ac },
  489. { XK_Hangul_J_NieunHieuh, 0x11ad },
  490. { XK_Hangul_J_Dikeud, 0x11ae },
  491. { XK_Hangul_J_Rieul, 0x11af },
  492. { XK_Hangul_J_RieulKiyeog, 0x11b0 },
  493. { XK_Hangul_J_RieulMieum, 0x11b1 },
  494. { XK_Hangul_J_RieulPieub, 0x11b2 },
  495. { XK_Hangul_J_RieulSios, 0x11b3 },
  496. { XK_Hangul_J_RieulTieut, 0x11b4 },
  497. { XK_Hangul_J_RieulPhieuf, 0x11b5 },
  498. { XK_Hangul_J_RieulHieuh, 0x11b6 },
  499. { XK_Hangul_J_Mieum, 0x11b7 },
  500. { XK_Hangul_J_Pieub, 0x11b8 },
  501. { XK_Hangul_J_PieubSios, 0x11b9 },
  502. { XK_Hangul_J_Sios, 0x11ba },
  503. { XK_Hangul_J_SsangSios, 0x11bb },
  504. { XK_Hangul_J_Ieung, 0x11bc },
  505. { XK_Hangul_J_Jieuj, 0x11bd },
  506. { XK_Hangul_J_Cieuc, 0x11be },
  507. { XK_Hangul_J_Khieuq, 0x11bf },
  508. { XK_Hangul_J_Tieut, 0x11c0 },
  509. { XK_Hangul_J_Phieuf, 0x11c1 },
  510. { XK_Hangul_J_Hieuh, 0x11c2 },
  511. { XK_Hangul_J_PanSios, 0x11eb },
  512. { XK_Hangul_J_KkogjiDalrinIeung , 0x11f0 },
  513. { XK_Hangul_J_YeorinHieuh, 0x11f9 },
  514. { XK_enspace, 0x2002 },
  515. { XK_emspace, 0x2003 },
  516. { XK_em3space, 0x2004 },
  517. { XK_em4space, 0x2005 },
  518. { XK_digitspace, 0x2007 },
  519. { XK_punctspace, 0x2008 },
  520. { XK_thinspace, 0x2009 },
  521. { XK_hairspace, 0x200a },
  522. { XK_figdash, 0x2012 },
  523. { XK_endash, 0x2013 },
  524. { XK_emdash, 0x2014 },
  525. { XK_Greek_horizbar, 0x2015 },
  526. { XK_hebrew_doublelowline, 0x2017 },
  527. { XK_leftsinglequotemark, 0x2018 },
  528. { XK_rightsinglequotemark, 0x2019 },
  529. { XK_singlelowquotemark, 0x201a },
  530. { XK_leftdoublequotemark, 0x201c },
  531. { XK_rightdoublequotemark, 0x201d },
  532. { XK_doublelowquotemark, 0x201e },
  533. { XK_dagger, 0x2020 },
  534. { XK_doubledagger, 0x2021 },
  535. { XK_enfilledcircbullet, 0x2022 },
  536. { XK_doubbaselinedot, 0x2025 },
  537. { XK_ellipsis, 0x2026 },
  538. { XK_minutes, 0x2032 },
  539. { XK_seconds, 0x2033 },
  540. { XK_caret, 0x2038 },
  541. { XK_overline, 0x203e },
  542. { XK_Korean_Won, 0x20a9 },
  543. { XK_EuroSign, 0x20ac },
  544. { XK_careof, 0x2105 },
  545. { XK_numerosign, 0x2116 },
  546. { XK_phonographcopyright, 0x2117 },
  547. { XK_prescription, 0x211e },
  548. { XK_trademark, 0x2122 },
  549. { XK_onethird, 0x2153 },
  550. { XK_twothirds, 0x2154 },
  551. { XK_onefifth, 0x2155 },
  552. { XK_twofifths, 0x2156 },
  553. { XK_threefifths, 0x2157 },
  554. { XK_fourfifths, 0x2158 },
  555. { XK_onesixth, 0x2159 },
  556. { XK_fivesixths, 0x215a },
  557. { XK_oneeighth, 0x215b },
  558. { XK_threeeighths, 0x215c },
  559. { XK_fiveeighths, 0x215d },
  560. { XK_seveneighths, 0x215e },
  561. { XK_leftarrow, 0x2190 },
  562. { XK_uparrow, 0x2191 },
  563. { XK_rightarrow, 0x2192 },
  564. { XK_downarrow, 0x2193 },
  565. { XK_implies, 0x21d2 },
  566. { XK_ifonlyif, 0x21d4 },
  567. { XK_partialderivative, 0x2202 },
  568. { XK_nabla, 0x2207 },
  569. { XK_jot, 0x2218 },
  570. { XK_radical, 0x221a },
  571. { XK_variation, 0x221d },
  572. { XK_infinity, 0x221e },
  573. { XK_logicaland, 0x2227 },
  574. { XK_logicalor, 0x2228 },
  575. { XK_intersection, 0x2229 },
  576. { XK_union, 0x222a },
  577. { XK_integral, 0x222b },
  578. { XK_therefore, 0x2234 },
  579. { XK_approximate, 0x223c },
  580. { XK_similarequal, 0x2243 },
  581. { XK_notequal, 0x2260 },
  582. { XK_identical, 0x2261 },
  583. { XK_lessthanequal, 0x2264 },
  584. { XK_greaterthanequal, 0x2265 },
  585. { XK_includedin, 0x2282 },
  586. { XK_includes, 0x2283 },
  587. { XK_righttack, 0x22a2 },
  588. { XK_lefttack, 0x22a3 },
  589. { XK_uptack, 0x22a4 },
  590. { XK_downtack, 0x22a5 },
  591. { XK_upstile, 0x2308 },
  592. { XK_downstile, 0x230a },
  593. { XK_telephonerecorder, 0x2315 },
  594. { XK_topintegral, 0x2320 },
  595. { XK_botintegral, 0x2321 },
  596. { XK_leftanglebracket, 0x2329 },
  597. { XK_rightanglebracket, 0x232a },
  598. { XK_quad, 0x2395 },
  599. { XK_topleftparens, 0x239b },
  600. { XK_botleftparens, 0x239d },
  601. { XK_toprightparens, 0x239e },
  602. { XK_botrightparens, 0x23a0 },
  603. { XK_topleftsqbracket, 0x23a1 },
  604. { XK_botleftsqbracket, 0x23a3 },
  605. { XK_toprightsqbracket, 0x23a4 },
  606. { XK_botrightsqbracket, 0x23a6 },
  607. { XK_leftmiddlecurlybrace, 0x23a8 },
  608. { XK_rightmiddlecurlybrace, 0x23ac },
  609. { XK_leftradical, 0x23b7 },
  610. { XK_horizlinescan1, 0x23ba },
  611. { XK_horizlinescan3, 0x23bb },
  612. { XK_horizlinescan7, 0x23bc },
  613. { XK_horizlinescan9, 0x23bd },
  614. { XK_ht, 0x2409 },
  615. { XK_lf, 0x240a },
  616. { XK_vt, 0x240b },
  617. { XK_ff, 0x240c },
  618. { XK_cr, 0x240d },
  619. { XK_nl, 0x2424 },
  620. { XK_horizlinescan5, 0x2500 },
  621. { XK_vertbar, 0x2502 },
  622. { XK_upleftcorner, 0x250c },
  623. { XK_uprightcorner, 0x2510 },
  624. { XK_lowleftcorner, 0x2514 },
  625. { XK_lowrightcorner, 0x2518 },
  626. { XK_leftt, 0x251c },
  627. { XK_rightt, 0x2524 },
  628. { XK_topt, 0x252c },
  629. { XK_bott, 0x2534 },
  630. { XK_crossinglines, 0x253c },
  631. { XK_checkerboard, 0x2592 },
  632. { XK_enfilledsqbullet, 0x25aa },
  633. { XK_enopensquarebullet, 0x25ab },
  634. { XK_filledrectbullet, 0x25ac },
  635. { XK_openrectbullet, 0x25ad },
  636. { XK_emfilledrect, 0x25ae },
  637. { XK_emopenrectangle, 0x25af },
  638. { XK_filledtribulletup, 0x25b2 },
  639. { XK_opentribulletup, 0x25b3 },
  640. { XK_filledrighttribullet, 0x25b6 },
  641. { XK_rightopentriangle, 0x25b7 },
  642. { XK_filledtribulletdown, 0x25bc },
  643. { XK_opentribulletdown, 0x25bd },
  644. { XK_filledlefttribullet, 0x25c0 },
  645. { XK_leftopentriangle, 0x25c1 },
  646. { XK_soliddiamond, 0x25c6 },
  647. { XK_emopencircle, 0x25cb },
  648. { XK_emfilledcircle, 0x25cf },
  649. { XK_enopencircbullet, 0x25e6 },
  650. { XK_openstar, 0x2606 },
  651. { XK_telephone, 0x260e },
  652. { XK_signaturemark, 0x2613 },
  653. { XK_leftpointer, 0x261c },
  654. { XK_rightpointer, 0x261e },
  655. { XK_femalesymbol, 0x2640 },
  656. { XK_malesymbol, 0x2642 },
  657. { XK_club, 0x2663 },
  658. { XK_heart, 0x2665 },
  659. { XK_diamond, 0x2666 },
  660. { XK_musicalflat, 0x266d },
  661. { XK_musicalsharp, 0x266f },
  662. { XK_checkmark, 0x2713 },
  663. { XK_ballotcross, 0x2717 },
  664. { XK_latincross, 0x271d },
  665. { XK_maltesecross, 0x2720 },
  666. { XK_kana_comma, 0x3001 },
  667. { XK_kana_fullstop, 0x3002 },
  668. { XK_kana_openingbracket, 0x300c },
  669. { XK_kana_closingbracket, 0x300d },
  670. { XK_voicedsound, 0x309b },
  671. { XK_semivoicedsound, 0x309c },
  672. { XK_kana_a, 0x30a1 },
  673. { XK_kana_A, 0x30a2 },
  674. { XK_kana_i, 0x30a3 },
  675. { XK_kana_I, 0x30a4 },
  676. { XK_kana_u, 0x30a5 },
  677. { XK_kana_U, 0x30a6 },
  678. { XK_kana_e, 0x30a7 },
  679. { XK_kana_E, 0x30a8 },
  680. { XK_kana_o, 0x30a9 },
  681. { XK_kana_O, 0x30aa },
  682. { XK_kana_KA, 0x30ab },
  683. { XK_kana_KI, 0x30ad },
  684. { XK_kana_KU, 0x30af },
  685. { XK_kana_KE, 0x30b1 },
  686. { XK_kana_KO, 0x30b3 },
  687. { XK_kana_SA, 0x30b5 },
  688. { XK_kana_SHI, 0x30b7 },
  689. { XK_kana_SU, 0x30b9 },
  690. { XK_kana_SE, 0x30bb },
  691. { XK_kana_SO, 0x30bd },
  692. { XK_kana_TA, 0x30bf },
  693. { XK_kana_CHI, 0x30c1 },
  694. { XK_kana_tsu, 0x30c3 },
  695. { XK_kana_TSU, 0x30c4 },
  696. { XK_kana_TE, 0x30c6 },
  697. { XK_kana_TO, 0x30c8 },
  698. { XK_kana_NA, 0x30ca },
  699. { XK_kana_NI, 0x30cb },
  700. { XK_kana_NU, 0x30cc },
  701. { XK_kana_NE, 0x30cd },
  702. { XK_kana_NO, 0x30ce },
  703. { XK_kana_HA, 0x30cf },
  704. { XK_kana_HI, 0x30d2 },
  705. { XK_kana_FU, 0x30d5 },
  706. { XK_kana_HE, 0x30d8 },
  707. { XK_kana_HO, 0x30db },
  708. { XK_kana_MA, 0x30de },
  709. { XK_kana_MI, 0x30df },
  710. { XK_kana_MU, 0x30e0 },
  711. { XK_kana_ME, 0x30e1 },
  712. { XK_kana_MO, 0x30e2 },
  713. { XK_kana_ya, 0x30e3 },
  714. { XK_kana_YA, 0x30e4 },
  715. { XK_kana_yu, 0x30e5 },
  716. { XK_kana_YU, 0x30e6 },
  717. { XK_kana_yo, 0x30e7 },
  718. { XK_kana_YO, 0x30e8 },
  719. { XK_kana_RA, 0x30e9 },
  720. { XK_kana_RI, 0x30ea },
  721. { XK_kana_RU, 0x30eb },
  722. { XK_kana_RE, 0x30ec },
  723. { XK_kana_RO, 0x30ed },
  724. { XK_kana_WA, 0x30ef },
  725. { XK_kana_WO, 0x30f2 },
  726. { XK_kana_N, 0x30f3 },
  727. { XK_kana_conjunctive, 0x30fb },
  728. { XK_prolongedsound, 0x30fc },
  729. { XK_Hangul_Kiyeog, 0x3131 },
  730. { XK_Hangul_SsangKiyeog, 0x3132 },
  731. { XK_Hangul_KiyeogSios, 0x3133 },
  732. { XK_Hangul_Nieun, 0x3134 },
  733. { XK_Hangul_NieunJieuj, 0x3135 },
  734. { XK_Hangul_NieunHieuh, 0x3136 },
  735. { XK_Hangul_Dikeud, 0x3137 },
  736. { XK_Hangul_SsangDikeud, 0x3138 },
  737. { XK_Hangul_Rieul, 0x3139 },
  738. { XK_Hangul_RieulKiyeog, 0x313a },
  739. { XK_Hangul_RieulMieum, 0x313b },
  740. { XK_Hangul_RieulPieub, 0x313c },
  741. { XK_Hangul_RieulSios, 0x313d },
  742. { XK_Hangul_RieulTieut, 0x313e },
  743. { XK_Hangul_RieulPhieuf, 0x313f },
  744. { XK_Hangul_RieulHieuh, 0x3140 },
  745. { XK_Hangul_Mieum, 0x3141 },
  746. { XK_Hangul_Pieub, 0x3142 },
  747. { XK_Hangul_SsangPieub, 0x3143 },
  748. { XK_Hangul_PieubSios, 0x3144 },
  749. { XK_Hangul_Sios, 0x3145 },
  750. { XK_Hangul_SsangSios, 0x3146 },
  751. { XK_Hangul_Ieung, 0x3147 },
  752. { XK_Hangul_Jieuj, 0x3148 },
  753. { XK_Hangul_SsangJieuj, 0x3149 },
  754. { XK_Hangul_Cieuc, 0x314a },
  755. { XK_Hangul_Khieuq, 0x314b },
  756. { XK_Hangul_Tieut, 0x314c },
  757. { XK_Hangul_Phieuf, 0x314d },
  758. { XK_Hangul_Hieuh, 0x314e },
  759. { XK_Hangul_A, 0x314f },
  760. { XK_Hangul_AE, 0x3150 },
  761. { XK_Hangul_YA, 0x3151 },
  762. { XK_Hangul_YAE, 0x3152 },
  763. { XK_Hangul_EO, 0x3153 },
  764. { XK_Hangul_E, 0x3154 },
  765. { XK_Hangul_YEO, 0x3155 },
  766. { XK_Hangul_YE, 0x3156 },
  767. { XK_Hangul_O, 0x3157 },
  768. { XK_Hangul_WA, 0x3158 },
  769. { XK_Hangul_WAE, 0x3159 },
  770. { XK_Hangul_OE, 0x315a },
  771. { XK_Hangul_YO, 0x315b },
  772. { XK_Hangul_U, 0x315c },
  773. { XK_Hangul_WEO, 0x315d },
  774. { XK_Hangul_WE, 0x315e },
  775. { XK_Hangul_WI, 0x315f },
  776. { XK_Hangul_YU, 0x3160 },
  777. { XK_Hangul_EU, 0x3161 },
  778. { XK_Hangul_YI, 0x3162 },
  779. { XK_Hangul_I, 0x3163 },
  780. { XK_Hangul_RieulYeorinHieuh, 0x316d },
  781. { XK_Hangul_SunkyeongeumMieum, 0x3171 },
  782. { XK_Hangul_SunkyeongeumPieub, 0x3178 },
  783. { XK_Hangul_PanSios, 0x317f },
  784. { XK_Hangul_KkogjiDalrinIeung, 0x3181 },
  785. { XK_Hangul_SunkyeongeumPhieuf, 0x3184 },
  786. { XK_Hangul_YeorinHieuh, 0x3186 },
  787. { XK_Hangul_AraeA, 0x318d },
  788. { XK_Hangul_AraeAE, 0x318e },
  789. };
  790. bool CompareCodePair(const CodePair& pair, uint32_t unicode) {
  791. return pair.unicode < unicode;
  792. }
  793. } // namespace
  794. std::vector<uint32_t> GetKeySymsForUnicode(uint32_t unicode) {
  795. std::vector<uint32_t> keysyms;
  796. // Latin-1 characters have the same values in Unicode and KeySym.
  797. if ((unicode >= 0x0020 && unicode <= 0x007e) ||
  798. (unicode >= 0x00a0 && unicode <= 0x00ff)) {
  799. keysyms.push_back(unicode);
  800. }
  801. const CodePair* map_end = kKeySymUnicodeMap + std::size(kKeySymUnicodeMap);
  802. const CodePair* pair =
  803. std::lower_bound(kKeySymUnicodeMap, map_end, unicode, &CompareCodePair);
  804. while (pair != map_end && pair->unicode == unicode) {
  805. keysyms.push_back(pair->keysym);
  806. ++pair;
  807. }
  808. keysyms.push_back(0x01000000 | unicode);
  809. return keysyms;
  810. }
  811. } // namespace remoting