Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Side by Side Diff: ui/events/keycodes/keyboard_code_conversion_x.cc

Issue 357613002: Gets correct KeyboardCode from XEvent for non-US layouts. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fallback to find with (ch0+sc+ch1) if (ch0+sc+ch1+ch2) is not found in map3. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/events/keycodes/keyboard_code_conversion_x.h" 5 #include "ui/events/keycodes/keyboard_code_conversion_x.h"
6 6
7 #include <algorithm>
8
7 #define XK_3270 // for XK_3270_BackTab 9 #define XK_3270 // for XK_3270_BackTab
8 #include <X11/keysym.h> 10 #include <X11/keysym.h>
9 #include <X11/Xlib.h> 11 #include <X11/Xlib.h>
10 #include <X11/Xutil.h> 12 #include <X11/Xutil.h>
11 #include <X11/XF86keysym.h> 13 #include <X11/XF86keysym.h>
12 14
13 #include "base/basictypes.h" 15 #include "base/basictypes.h"
14 #include "base/logging.h" 16 #include "base/logging.h"
15 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
16 #include "base/strings/sys_string_conversions.h" 18 #include "base/strings/sys_string_conversions.h"
17 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
18 #include "ui/events/keycodes/dom4/keycode_converter.h" 20 #include "ui/events/keycodes/dom4/keycode_converter.h"
19 21
22 #define VKEY_UNSUPPORTED VKEY_UNKNOWN
23
20 namespace ui { 24 namespace ui {
21 25
26 namespace {
27
28 // MAP0 - MAP3:
29 // These are the generated VKEY code maps for all possible Latin keyboard
30 // layouts in Windows. And the maps are only for special letter keys excluding
31 // [a-z] & [0-9].
32 //
33 // ch0: the keysym without modifier states.
34 // ch1: the keysym with shift state.
35 // ch2: the keysym with altgr state.
36 // sc: the hardware keycode (in Windows, it's called scan code).
37 // vk: the VKEY code.
38 //
39 // MAP0: maps from ch0 to vk.
40 // MAP1: maps from ch0+sc to vk.
41 // MAP2: maps from ch0+ch1+sc to vk.
42 // MAP3: maps from ch0+ch1+ch2+sc to vk.
43 // MAP0 - MAP3 are all sorted, so that finding VK can be binary search.
44 //
45 // Reason for creating these maps is because a hard-coded mapping in
46 // KeyboardCodeFromXKeysym() doesn't support non-US keyboard layouts.
47 // e.g. in UK keyboard, the key between Quote and Enter keys has the VKEY code
48 // VKEY_OEM_5 instead of VKEY_3.
49 //
50 // The key symbols which are not [a-zA-Z0-9] and functional/extend keys (e.g.
51 // TAB, ENTER, BS, Arrow keys, modifier keys, F1-F12, media/app keys, etc.)
52 // should go through these maps for correct VKEY codes.
53 //
54 // Please refer to crbug.com/386066.
55 //
56 const struct MAP0 {
57 uint16 ch0;
58 uint8 vk;
59 bool operator()(const MAP0& m1, const MAP0& m2) const {
60 return m1.ch0 < m2.ch0;
61 }
62 } map0[] = {
63 {0x0025, 0x35}, // XK_percent: VKEY_5
64 {0x0026, 0x31}, // XK_ampersand: VKEY_1
65 {0x003C, 0xDC}, // XK_less: VKEY_OEM_5
66 {0x007B, 0xDE}, // XK_braceleft: VKEY_OEM_7
67 {0x007C, 0xDC}, // XK_bar: VKEY_OEM_5
68 {0x007D, 0xBF}, // XK_braceright: VKEY_OEM_2
69 {0x007E, 0xDC}, // XK_asciitilde: VKEY_OEM_5
70 {0x00A1, 0xDD}, // XK_exclamdown: VKEY_OEM_6
71 {0x00AD, 0xC0}, // XK_hyphen: VKEY_OEM_3
72 {0x00B2, 0xDE}, // XK_twosuperior: VKEY_OEM_7
73 {0x00B5, 0xDC}, // XK_mu: VKEY_OEM_5
74 {0x00BB, 0x39}, // XK_guillemotright: VKEY_9
75 {0x00BD, 0xDC}, // XK_onehalf: VKEY_OEM_5
76 {0x00BF, 0xDD}, // XK_questiondown: VKEY_OEM_6
77 {0x00DF, 0xDB}, // XK_ssharp: VKEY_OEM_4
78 {0x00E5, 0xDD}, // XK_aring: VKEY_OEM_6
79 {0x00EA, 0x33}, // XK_ecircumflex: VKEY_3
80 {0x00EB, 0xBA}, // XK_ediaeresis: VKEY_OEM_1
81 {0x00EC, 0xDD}, // XK_igrave: VKEY_OEM_6
82 {0x00EE, 0xDD}, // XK_icircumflex: VKEY_OEM_6
83 {0x00F1, 0xC0}, // XK_ntilde: VKEY_OEM_3
84 {0x00F2, 0xC0}, // XK_ograve: VKEY_OEM_3
85 {0x00F5, 0xDB}, // XK_otilde: VKEY_OEM_4
86 {0x00F7, 0xDD}, // XK_division: VKEY_OEM_6
87 {0x00FD, 0x37}, // XK_yacute: VKEY_7
88 {0x00FE, 0xBD}, // XK_thorn: VKEY_OEM_MINUS
89 {0x01A1, 0xDD}, // XK_ohorn: VKEY_OEM_6
90 {0x01B0, 0xDB}, // XK_uhorn: VKEY_OEM_4
91 {0x01B5, 0x32}, // XK_lcaron: VKEY_2
92 {0x01B6, 0xDD}, // XK_zstroke: VKEY_OEM_6
93 {0x01BB, 0x35}, // XK_tcaron: VKEY_5
94 {0x01E6, 0xDE}, // XK_cacute: VKEY_OEM_7
95 {0x01EC, 0x32}, // XK_ecaron: VKEY_2
96 {0x01F2, 0xDC}, // XK_ncaron: VKEY_OEM_5
97 {0x01F5, 0xDB}, // XK_odoubleacute: VKEY_OEM_4
98 {0x01F8, 0x35}, // XK_rcaron: VKEY_5
99 {0x01F9, 0xBA}, // XK_uring: VKEY_OEM_1
100 {0x01FB, 0xDC}, // XK_udoubleacute: VKEY_OEM_5
101 {0x01FE, 0xDE}, // XK_tcedilla: VKEY_OEM_7
102 {0x0259, 0xC0}, // XK_schwa: VKEY_OEM_3
103 {0x02B1, 0xDD}, // XK_hstroke: VKEY_OEM_6
104 {0x02B9, 0xBA}, // XK_idotless: VKEY_OEM_1
105 {0x02BB, 0xDD}, // XK_gbreve: VKEY_OEM_6
106 {0x02E5, 0xC0}, // XK_cabovedot: VKEY_OEM_3
107 {0x02F5, 0xDB}, // XK_gabovedot: VKEY_OEM_4
108 {0x03B6, 0xBF}, // XK_lcedilla: VKEY_OEM_2
109 {0x03BA, 0x57}, // XK_emacron: VKEY_W
110 {0x03E0, 0xDF}, // XK_amacron: VKEY_OEM_8
111 {0x03EF, 0xDD}, // XK_imacron: VKEY_OEM_6
112 {0x03F1, 0xDB}, // XK_ncedilla: VKEY_OEM_4
113 {0x03F3, 0xDC}, // XK_kcedilla: VKEY_OEM_5
114 };
115
116 const struct MAP1 {
117 uint16 ch0;
118 uint8 sc;
119 uint8 vk;
120 bool operator()(const MAP1& m1, const MAP1& m2) const {
121 if (m1.ch0 == m2.ch0)
122 return m1.sc < m2.sc;
123 return m1.ch0 < m2.ch0;
124 }
125 } map1[] = {
126 {0x0021, 0x0A, 0x31}, // XK_exclam+AE01: VKEY_1
127 {0x0021, 0x11, 0x38}, // XK_exclam+AE08: VKEY_8
128 {0x0021, 0x3D, 0xDF}, // XK_exclam+AB10: VKEY_OEM_8
129 {0x0022, 0x0B, 0x32}, // XK_quotedbl+AE02: VKEY_2
130 {0x0022, 0x0C, 0x33}, // XK_quotedbl+AE03: VKEY_3
131 {0x0023, 0x31, 0xDE}, // XK_numbersign+TLDE: VKEY_OEM_7
132 {0x0024, 0x23, 0xBA}, // XK_dollar+AD12: VKEY_OEM_1
133 {0x0024, 0x33, 0xDF}, // XK_dollar+BKSL: VKEY_OEM_8
134 {0x0027, 0x0D, 0x34}, // XK_quoteright+AE04: VKEY_4
135 {0x0027, 0x18, 0xDE}, // XK_quoteright+AD01: VKEY_OEM_7
136 {0x0027, 0x23, 0xBA}, // XK_quoteright+AD12: VKEY_OEM_1
137 {0x0027, 0x3D, 0xDE}, // XK_quoteright+AB10: VKEY_OEM_7
138 {0x0028, 0x0E, 0x35}, // XK_parenleft+AE05: VKEY_5
139 {0x0028, 0x12, 0x39}, // XK_parenleft+AE09: VKEY_9
140 {0x0028, 0x33, 0xDC}, // XK_parenleft+BKSL: VKEY_OEM_5
141 {0x0029, 0x13, 0x30}, // XK_parenright+AE10: VKEY_0
142 {0x0029, 0x14, 0xDB}, // XK_parenright+AE11: VKEY_OEM_4
143 {0x0029, 0x23, 0xDD}, // XK_parenright+AD12: VKEY_OEM_6
144 {0x002A, 0x23, 0xBA}, // XK_asterisk+AD12: VKEY_OEM_1
145 {0x002A, 0x33, 0xDC}, // XK_asterisk+BKSL: VKEY_OEM_5
146 {0x002B, 0x0A, 0x31}, // XK_plus+AE01: VKEY_1
147 {0x002B, 0x15, 0xBB}, // XK_plus+AE12: VKEY_OEM_PLUS
148 {0x002B, 0x22, 0xBB}, // XK_plus+AD11: VKEY_OEM_PLUS
149 {0x002B, 0x23, 0xBB}, // XK_plus+AD12: VKEY_OEM_PLUS
150 {0x002B, 0x2F, 0xBB}, // XK_plus+AC10: VKEY_OEM_PLUS
151 {0x002B, 0x33, 0xBF}, // XK_plus+BKSL: VKEY_OEM_2
152 {0x002C, 0x0C, 0x33}, // XK_comma+AE03: VKEY_3
153 {0x002C, 0x0E, 0x35}, // XK_comma+AE05: VKEY_5
154 {0x002C, 0x0F, 0x36}, // XK_comma+AE06: VKEY_6
155 {0x002C, 0x12, 0x39}, // XK_comma+AE09: VKEY_9
156 {0x002C, 0x19, 0xBC}, // XK_comma+AD02: VKEY_OEM_COMMA
157 {0x002C, 0x37, 0xBC}, // XK_comma+AB04: VKEY_OEM_COMMA
158 {0x002C, 0x3A, 0xBC}, // XK_comma+AB07: VKEY_OEM_COMMA
159 {0x002C, 0x3B, 0xBC}, // XK_comma+AB08: VKEY_OEM_COMMA
160 {0x002D, 0x0B, 0x32}, // XK_minus+AE02: VKEY_2
161 {0x002D, 0x0F, 0x36}, // XK_minus+AE06: VKEY_6
162 {0x002D, 0x14, 0xBD}, // XK_minus+AE11: VKEY_OEM_MINUS
163 {0x002D, 0x26, 0xBD}, // XK_minus+AC01: VKEY_OEM_MINUS
164 {0x002D, 0x30, 0xBD}, // XK_minus+AC11: VKEY_OEM_MINUS
165 {0x002E, 0x10, 0x37}, // XK_period+AE07: VKEY_7
166 {0x002E, 0x11, 0x38}, // XK_period+AE08: VKEY_8
167 {0x002E, 0x1A, 0xBE}, // XK_period+AD03: VKEY_OEM_PERIOD
168 {0x002E, 0x1B, 0xBE}, // XK_period+AD04: VKEY_OEM_PERIOD
169 {0x002E, 0x20, 0xBE}, // XK_period+AD09: VKEY_OEM_PERIOD
170 {0x002E, 0x30, 0xDE}, // XK_period+AC11: VKEY_OEM_7
171 {0x002E, 0x3C, 0xBE}, // XK_period+AB09: VKEY_OEM_PERIOD
172 {0x002E, 0x3D, 0xBF}, // XK_period+AB10: VKEY_OEM_2
173 {0x002F, 0x14, 0xDB}, // XK_slash+AE11: VKEY_OEM_4
174 {0x002F, 0x22, 0xBF}, // XK_slash+AD11: VKEY_OEM_2
175 {0x002F, 0x31, 0xDE}, // XK_slash+TLDE: VKEY_OEM_7
176 {0x002F, 0x33, 0xDC}, // XK_slash+BKSL: VKEY_OEM_5
177 {0x002F, 0x3D, 0xBF}, // XK_slash+AB10: VKEY_OEM_2
178 {0x003A, 0x0A, 0x31}, // XK_colon+AE01: VKEY_1
179 {0x003A, 0x0E, 0x35}, // XK_colon+AE05: VKEY_5
180 {0x003A, 0x0F, 0x36}, // XK_colon+AE06: VKEY_6
181 {0x003A, 0x3C, 0xBF}, // XK_colon+AB09: VKEY_OEM_2
182 {0x003B, 0x0D, 0x34}, // XK_semicolon+AE04: VKEY_4
183 {0x003B, 0x11, 0x38}, // XK_semicolon+AE08: VKEY_8
184 {0x003B, 0x18, 0xBA}, // XK_semicolon+AD01: VKEY_OEM_1
185 {0x003B, 0x22, 0xBA}, // XK_semicolon+AD11: VKEY_OEM_1
186 {0x003B, 0x23, 0xDD}, // XK_semicolon+AD12: VKEY_OEM_6
187 {0x003B, 0x2F, 0xBA}, // XK_semicolon+AC10: VKEY_OEM_1
188 {0x003B, 0x31, 0xC0}, // XK_semicolon+TLDE: VKEY_OEM_3
189 {0x003B, 0x34, 0xBA}, // XK_semicolon+AB01: VKEY_OEM_1
190 {0x003B, 0x3B, 0xBE}, // XK_semicolon+AB08: VKEY_OEM_PERIOD
191 {0x003B, 0x3D, 0xBF}, // XK_semicolon+AB10: VKEY_OEM_2
192 {0x003D, 0x11, 0x38}, // XK_equal+AE08: VKEY_8
193 {0x003D, 0x15, 0xBB}, // XK_equal+AE12: VKEY_OEM_PLUS
194 {0x003D, 0x23, 0xBB}, // XK_equal+AD12: VKEY_OEM_PLUS
195 {0x003F, 0x0B, 0x32}, // XK_question+AE02: VKEY_2
196 {0x003F, 0x10, 0x37}, // XK_question+AE07: VKEY_7
197 {0x003F, 0x11, 0x38}, // XK_question+AE08: VKEY_8
198 {0x003F, 0x14, 0xBB}, // XK_question+AE11: VKEY_OEM_PLUS
199 {0x0040, 0x23, 0xDD}, // XK_at+AD12: VKEY_OEM_6
200 {0x0040, 0x31, 0xDE}, // XK_at+TLDE: VKEY_OEM_7
201 {0x005B, 0x0A, 0xDB}, // XK_bracketleft+AE01: VKEY_OEM_4
202 {0x005B, 0x14, 0xDB}, // XK_bracketleft+AE11: VKEY_OEM_4
203 {0x005B, 0x22, 0xDB}, // XK_bracketleft+AD11: VKEY_OEM_4
204 {0x005B, 0x23, 0xDD}, // XK_bracketleft+AD12: VKEY_OEM_6
205 {0x005B, 0x30, 0xDE}, // XK_bracketleft+AC11: VKEY_OEM_7
206 {0x005C, 0x15, 0xDB}, // XK_backslash+AE12: VKEY_OEM_4
207 {0x005D, 0x0B, 0xDD}, // XK_bracketright+AE02: VKEY_OEM_6
208 {0x005D, 0x15, 0xDD}, // XK_bracketright+AE12: VKEY_OEM_6
209 {0x005D, 0x23, 0xDD}, // XK_bracketright+AD12: VKEY_OEM_6
210 {0x005D, 0x31, 0xC0}, // XK_bracketright+TLDE: VKEY_OEM_3
211 {0x005D, 0x33, 0xDC}, // XK_bracketright+BKSL: VKEY_OEM_5
212 {0x005F, 0x11, 0x38}, // XK_underscore+AE08: VKEY_8
213 {0x005F, 0x14, 0xBD}, // XK_underscore+AE11: VKEY_OEM_MINUS
214 {0x00A7, 0x0D, 0x34}, // XK_section+AE04: VKEY_4
215 {0x00A7, 0x0F, 0x36}, // XK_section+AE06: VKEY_6
216 {0x00A7, 0x30, 0xDE}, // XK_section+AC11: VKEY_OEM_7
217 {0x00AB, 0x11, 0x38}, // XK_guillemotleft+AE08: VKEY_8
218 {0x00AB, 0x15, 0xDD}, // XK_guillemotleft+AE12: VKEY_OEM_6
219 {0x00B0, 0x15, 0xBF}, // XK_degree+AE12: VKEY_OEM_2
220 {0x00B0, 0x31, 0xDE}, // XK_degree+TLDE: VKEY_OEM_7
221 {0x00BA, 0x30, 0xDE}, // XK_masculine+AC11: VKEY_OEM_7
222 {0x00BA, 0x31, 0xDC}, // XK_masculine+TLDE: VKEY_OEM_5
223 {0x00E0, 0x13, 0x30}, // XK_agrave+AE10: VKEY_0
224 {0x00E0, 0x33, 0xDC}, // XK_agrave+BKSL: VKEY_OEM_5
225 {0x00E1, 0x11, 0x38}, // XK_aacute+AE08: VKEY_8
226 {0x00E1, 0x30, 0xDE}, // XK_aacute+AC11: VKEY_OEM_7
227 {0x00E2, 0x0B, 0x32}, // XK_acircumflex+AE02: VKEY_2
228 {0x00E2, 0x33, 0xDC}, // XK_acircumflex+BKSL: VKEY_OEM_5
229 {0x00E4, 0x23, 0xDD}, // XK_adiaeresis+AD12: VKEY_OEM_6
230 {0x00E6, 0x2F, 0xC0}, // XK_ae+AC10: VKEY_OEM_3
231 {0x00E6, 0x30, 0xDE}, // XK_ae+AC11: VKEY_OEM_7
232 {0x00E7, 0x12, 0x39}, // XK_ccedilla+AE09: VKEY_9
233 {0x00E7, 0x22, 0xDB}, // XK_ccedilla+AD11: VKEY_OEM_4
234 {0x00E7, 0x23, 0xDD}, // XK_ccedilla+AD12: VKEY_OEM_6
235 {0x00E7, 0x30, 0xDE}, // XK_ccedilla+AC11: VKEY_OEM_7
236 {0x00E7, 0x33, 0xBF}, // XK_ccedilla+BKSL: VKEY_OEM_2
237 {0x00E7, 0x3B, 0xBC}, // XK_ccedilla+AB08: VKEY_OEM_COMMA
238 {0x00E8, 0x10, 0x37}, // XK_egrave+AE07: VKEY_7
239 {0x00E8, 0x22, 0xBA}, // XK_egrave+AD11: VKEY_OEM_1
240 {0x00E8, 0x30, 0xC0}, // XK_egrave+AC11: VKEY_OEM_3
241 {0x00E9, 0x0B, 0x32}, // XK_eacute+AE02: VKEY_2
242 {0x00E9, 0x13, 0x30}, // XK_eacute+AE10: VKEY_0
243 {0x00E9, 0x3D, 0xBF}, // XK_eacute+AB10: VKEY_OEM_2
244 {0x00ED, 0x12, 0x39}, // XK_iacute+AE09: VKEY_9
245 {0x00ED, 0x31, 0x30}, // XK_iacute+TLDE: VKEY_0
246 {0x00F0, 0x22, 0xDD}, // XK_eth+AD11: VKEY_OEM_6
247 {0x00F0, 0x23, 0xBA}, // XK_eth+AD12: VKEY_OEM_1
248 {0x00F3, 0x15, 0xBB}, // XK_oacute+AE12: VKEY_OEM_PLUS
249 {0x00F3, 0x33, 0xDC}, // XK_oacute+BKSL: VKEY_OEM_5
250 {0x00F4, 0x0D, 0x34}, // XK_ocircumflex+AE04: VKEY_4
251 {0x00F4, 0x2F, 0xBA}, // XK_ocircumflex+AC10: VKEY_OEM_1
252 {0x00F6, 0x13, 0xC0}, // XK_odiaeresis+AE10: VKEY_OEM_3
253 {0x00F6, 0x14, 0xBB}, // XK_odiaeresis+AE11: VKEY_OEM_PLUS
254 {0x00F6, 0x22, 0xDB}, // XK_odiaeresis+AD11: VKEY_OEM_4
255 {0x00F8, 0x2F, 0xC0}, // XK_oslash+AC10: VKEY_OEM_3
256 {0x00F8, 0x30, 0xDE}, // XK_oslash+AC11: VKEY_OEM_7
257 {0x00F9, 0x30, 0xC0}, // XK_ugrave+AC11: VKEY_OEM_3
258 {0x00F9, 0x33, 0xBF}, // XK_ugrave+BKSL: VKEY_OEM_2
259 {0x00FA, 0x22, 0xDB}, // XK_uacute+AD11: VKEY_OEM_4
260 {0x00FA, 0x23, 0xDD}, // XK_uacute+AD12: VKEY_OEM_6
261 {0x00FC, 0x19, 0x57}, // XK_udiaeresis+AD02: VKEY_W
262 {0x01B1, 0x0A, 0x31}, // XK_aogonek+AE01: VKEY_1
263 {0x01B1, 0x18, 0x51}, // XK_aogonek+AD01: VKEY_Q
264 {0x01B1, 0x30, 0xDE}, // XK_aogonek+AC11: VKEY_OEM_7
265 {0x01B3, 0x2F, 0xBA}, // XK_lstroke+AC10: VKEY_OEM_1
266 {0x01B3, 0x33, 0xBF}, // XK_lstroke+BKSL: VKEY_OEM_2
267 {0x01B9, 0x0C, 0x33}, // XK_scaron+AE03: VKEY_3
268 {0x01B9, 0x0F, 0x36}, // XK_scaron+AE06: VKEY_6
269 {0x01B9, 0x22, 0xDB}, // XK_scaron+AD11: VKEY_OEM_4
270 {0x01B9, 0x26, 0xBA}, // XK_scaron+AC01: VKEY_OEM_1
271 {0x01B9, 0x29, 0x46}, // XK_scaron+AC04: VKEY_F
272 {0x01B9, 0x3C, 0xBE}, // XK_scaron+AB09: VKEY_OEM_PERIOD
273 {0x01BA, 0x2F, 0xBA}, // XK_scedilla+AC10: VKEY_OEM_1
274 {0x01BA, 0x3C, 0xBE}, // XK_scedilla+AB09: VKEY_OEM_PERIOD
275 {0x01BE, 0x0F, 0x36}, // XK_zcaron+AE06: VKEY_6
276 {0x01BE, 0x15, 0xBB}, // XK_zcaron+AE12: VKEY_OEM_PLUS
277 {0x01BE, 0x19, 0x57}, // XK_zcaron+AD02: VKEY_W
278 {0x01BE, 0x22, 0x59}, // XK_zcaron+AD11: VKEY_Y
279 {0x01BE, 0x33, 0xDC}, // XK_zcaron+BKSL: VKEY_OEM_5
280 {0x01BF, 0x22, 0xDB}, // XK_zabovedot+AD11: VKEY_OEM_4
281 {0x01BF, 0x33, 0xDC}, // XK_zabovedot+BKSL: VKEY_OEM_5
282 {0x01E3, 0x0A, 0x31}, // XK_abreve+AE01: VKEY_1
283 {0x01E3, 0x22, 0xDB}, // XK_abreve+AD11: VKEY_OEM_4
284 {0x01E8, 0x0B, 0x32}, // XK_ccaron+AE02: VKEY_2
285 {0x01E8, 0x0D, 0x34}, // XK_ccaron+AE04: VKEY_4
286 {0x01E8, 0x21, 0x58}, // XK_ccaron+AD10: VKEY_X
287 {0x01E8, 0x2F, 0xBA}, // XK_ccaron+AC10: VKEY_OEM_1
288 {0x01E8, 0x3B, 0xBC}, // XK_ccaron+AB08: VKEY_OEM_COMMA
289 {0x01EA, 0x0C, 0x33}, // XK_eogonek+AE03: VKEY_3
290 {0x01F0, 0x13, 0x30}, // XK_dstroke+AE10: VKEY_0
291 {0x01F0, 0x23, 0xDD}, // XK_dstroke+AD12: VKEY_OEM_6
292 {0x03E7, 0x0E, 0x35}, // XK_iogonek+AE05: VKEY_5
293 {0x03EC, 0x0D, 0x34}, // XK_eabovedot+AE04: VKEY_4
294 {0x03EC, 0x30, 0xDE}, // XK_eabovedot+AC11: VKEY_OEM_7
295 {0x03F9, 0x10, 0x37}, // XK_uogonek+AE07: VKEY_7
296 {0x03FE, 0x11, 0x38}, // XK_umacron+AE08: VKEY_8
297 {0x03FE, 0x18, 0x51}, // XK_umacron+AD01: VKEY_Q
298 {0x03FE, 0x35, 0x58}, // XK_umacron+AB02: VKEY_X
299 };
300
301 const struct MAP2 {
302 uint16 ch0;
303 uint8 sc;
304 uint16 ch1;
305 uint8 vk;
306 bool operator()(const MAP2& m1, const MAP2& m2) const {
307 if (m1.ch0 == m2.ch0 && m1.sc == m2.sc)
308 return m1.ch1 < m2.ch1;
309 if (m1.ch0 == m2.ch0)
310 return m1.sc < m2.sc;
311 return m1.ch0 < m2.ch0;
312 }
313 } map2[] = {
314 {0x0023, 0x33, 0x0027, 0xBF}, // XK_numbersign+BKSL+XK_quoteright: VKEY_OEM_2
315 {0x0027, 0x30, 0x0022, 0xDE}, // XK_quoteright+AC11+XK_quotedbl: VKEY_OEM_7
316 {0x0027, 0x31, 0x0022, 0xC0}, // XK_quoteright+TLDE+XK_quotedbl: VKEY_OEM_3
317 {0x0027, 0x31, 0x00B7, 0xDC}, // XK_quoteright+TLDE+XK_periodcentered: VKEY_O EM_5
318 {0x0027, 0x33, 0x0000, 0xDC}, // XK_quoteright+BKSL+NoSymbol: VKEY_OEM_5
319 {0x002D, 0x3D, 0x003D, 0xBD}, // XK_minus+AB10+XK_equal: VKEY_OEM_MINUS
320 {0x002F, 0x0C, 0x0033, 0x33}, // XK_slash+AE03+XK_3: VKEY_3
321 {0x002F, 0x0C, 0x003F, 0xBF}, // XK_slash+AE03+XK_question: VKEY_OEM_2
322 {0x002F, 0x13, 0x0030, 0x30}, // XK_slash+AE10+XK_0: VKEY_0
323 {0x002F, 0x13, 0x003F, 0xBF}, // XK_slash+AE10+XK_question: VKEY_OEM_2
324 {0x003D, 0x3D, 0x0025, 0xDF}, // XK_equal+AB10+XK_percent: VKEY_OEM_8
325 {0x003D, 0x3D, 0x002B, 0xBB}, // XK_equal+AB10+XK_plus: VKEY_OEM_PLUS
326 {0x005C, 0x33, 0x002F, 0xDE}, // XK_backslash+BKSL+XK_slash: VKEY_OEM_7
327 {0x005C, 0x33, 0x007C, 0xDC}, // XK_backslash+BKSL+XK_bar: VKEY_OEM_5
328 {0x0060, 0x31, 0x0000, 0xC0}, // XK_quoteleft+TLDE+NoSymbol: VKEY_OEM_3
329 {0x0060, 0x31, 0x00AC, 0xDF}, // XK_quoteleft+TLDE+XK_notsign: VKEY_OEM_8
330 {0x00A7, 0x31, 0x00B0, 0xBF}, // XK_section+TLDE+XK_degree: VKEY_OEM_2
331 {0x00A7, 0x31, 0x00BD, 0xDC}, // XK_section+TLDE+XK_onehalf: VKEY_OEM_5
332 {0x00E0, 0x30, 0x00B0, 0xDE}, // XK_agrave+AC11+XK_degree: VKEY_OEM_7
333 {0x00E0, 0x30, 0x00E4, 0xDC}, // XK_agrave+AC11+XK_adiaeresis: VKEY_OEM_5
334 {0x00E4, 0x30, 0x00E0, 0xDC}, // XK_adiaeresis+AC11+XK_agrave: VKEY_OEM_5
335 {0x00E9, 0x2F, 0x00C9, 0xBA}, // XK_eacute+AC10+XK_Eacute: VKEY_OEM_1
336 {0x00E9, 0x2F, 0x00F6, 0xDE}, // XK_eacute+AC10+XK_odiaeresis: VKEY_OEM_7
337 {0x00F6, 0x2F, 0x00E9, 0xDE}, // XK_odiaeresis+AC10+XK_eacute: VKEY_OEM_7
338 {0x00FC, 0x22, 0x00E8, 0xBA}, // XK_udiaeresis+AD11+XK_egrave: VKEY_OEM_1
339 };
340
341 const struct MAP3 {
342 uint16 ch0;
343 uint8 sc;
344 uint16 ch1;
345 uint16 ch2;
346 uint8 vk;
347 bool operator()(const MAP3& m1, const MAP3& m2) const {
348 if (m1.ch0 == m2.ch0 && m1.sc == m2.sc && m1.ch1 == m2.ch1)
349 return m1.ch2 < m2.ch2;
350 if (m1.ch0 == m2.ch0 && m1.sc == m2.sc)
351 return m1.ch1 < m2.ch1;
352 if (m1.ch0 == m2.ch0)
353 return m1.sc < m2.sc;
354 return m1.ch0 < m2.ch0;
355 }
356 } map3[] = {
357 {0x0023, 0x33, 0x007E, 0x0000, 0xDE}, // XK_numbersign+BKSL+XK_asciitilde+NoS ymbol: VKEY_OEM_7
358 {0x0027, 0x14, 0x003F, 0x0000, 0xDB}, // XK_quoteright+AE11+XK_question+NoSym bol: VKEY_OEM_4
359 {0x0027, 0x14, 0x003F, 0x00DD, 0xDB}, // XK_quoteright+AE11+XK_question+XK_Ya cute: VKEY_OEM_4
360 {0x0027, 0x15, 0x002A, 0x0000, 0xBB}, // XK_quoteright+AE12+XK_asterisk+NoSym bol: VKEY_OEM_PLUS
361 {0x0027, 0x30, 0x0040, 0x0000, 0xC0}, // XK_quoteright+AC11+XK_at+NoSymbol: V KEY_OEM_3
362 {0x0027, 0x33, 0x002A, 0x0000, 0xBF}, // XK_quoteright+BKSL+XK_asterisk+NoSym bol: VKEY_OEM_2
363 {0x0027, 0x33, 0x002A, 0x00BD, 0xDC}, // XK_quoteright+BKSL+XK_asterisk+XK_on ehalf: VKEY_OEM_5
364 {0x0027, 0x33, 0x002A, 0x01A3, 0xBF}, // XK_quoteright+BKSL+XK_asterisk+XK_Ls troke: VKEY_OEM_2
365 {0x0027, 0x34, 0x0022, 0x0000, 0x5A}, // XK_quoteright+AB01+XK_quotedbl+NoSym bol: VKEY_Z
366 {0x0027, 0x34, 0x0022, 0x01D8, 0xDE}, // XK_quoteright+AB01+XK_quotedbl+XK_Rc aron: VKEY_OEM_7
367 {0x002B, 0x14, 0x003F, 0x0000, 0xBB}, // XK_plus+AE11+XK_question+NoSymbol: V KEY_OEM_PLUS
368 {0x002B, 0x14, 0x003F, 0x005C, 0xBD}, // XK_plus+AE11+XK_question+XK_backslas h: VKEY_OEM_MINUS
369 {0x002B, 0x14, 0x003F, 0x01F5, 0xBB}, // XK_plus+AE11+XK_question+XK_odoublea cute: VKEY_OEM_PLUS
370 {0x002D, 0x15, 0x005F, 0x0000, 0xBD}, // XK_minus+AE12+XK_underscore+NoSymbol : VKEY_OEM_MINUS
371 {0x002D, 0x15, 0x005F, 0x03B3, 0xDB}, // XK_minus+AE12+XK_underscore+XK_rcedi lla: VKEY_OEM_4
372 {0x002D, 0x3D, 0x005F, 0x0000, 0xBD}, // XK_minus+AB10+XK_underscore+NoSymbol : VKEY_OEM_MINUS
373 {0x002D, 0x3D, 0x005F, 0x002A, 0xBD}, // XK_minus+AB10+XK_underscore+XK_aster isk: VKEY_OEM_MINUS
374 {0x002D, 0x3D, 0x005F, 0x002F, 0xBF}, // XK_minus+AB10+XK_underscore+XK_slash : VKEY_OEM_2
375 {0x002D, 0x3D, 0x005F, 0x006E, 0xBD}, // XK_minus+AB10+XK_underscore+XK_n: VK EY_OEM_MINUS
376 {0x003D, 0x14, 0x0025, 0x0000, 0xBB}, // XK_equal+AE11+XK_percent+NoSymbol: V KEY_OEM_PLUS
377 {0x003D, 0x14, 0x0025, 0x002D, 0xBD}, // XK_equal+AE11+XK_percent+XK_minus: V KEY_OEM_MINUS
378 {0x005C, 0x31, 0x007C, 0x0031, 0xDC}, // XK_backslash+TLDE+XK_bar+XK_1: VKEY_ OEM_5
379 {0x005C, 0x31, 0x007C, 0x03D1, 0xC0}, // XK_backslash+TLDE+XK_bar+XK_Ncedilla : VKEY_OEM_3
380 {0x0060, 0x31, 0x007E, 0x0000, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+NoSy mbol: VKEY_OEM_3
381 {0x0060, 0x31, 0x007E, 0x0031, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_1 : VKEY_OEM_3
382 {0x0060, 0x31, 0x007E, 0x003B, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_s emicolon: VKEY_OEM_3
383 {0x0060, 0x31, 0x007E, 0x0060, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_q uoteleft: VKEY_OEM_3
384 {0x0060, 0x31, 0x007E, 0x00BF, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_q uestiondown: VKEY_OEM_3
385 {0x0060, 0x31, 0x007E, 0x01F5, 0xC0}, // XK_quoteleft+TLDE+XK_asciitilde+XK_o doubleacute: VKEY_OEM_3
386 {0x00E4, 0x30, 0x00C4, 0x0000, 0xDE}, // XK_adiaeresis+AC11+XK_Adiaeresis+NoS ymbol: VKEY_OEM_7
387 {0x00E4, 0x30, 0x00C4, 0x01A6, 0xDE}, // XK_adiaeresis+AC11+XK_Adiaeresis+XK_ Sacute: VKEY_OEM_7
388 {0x00E4, 0x30, 0x00C4, 0x01F8, 0xDE}, // XK_adiaeresis+AC11+XK_Adiaeresis+XK_ rcaron: VKEY_OEM_7
389 {0x00E7, 0x2F, 0x00C7, 0x0000, 0xBA}, // XK_ccedilla+AC10+XK_Ccedilla+NoSymbo l: VKEY_OEM_1
390 {0x00E7, 0x2F, 0x00C7, 0x00DE, 0xC0}, // XK_ccedilla+AC10+XK_Ccedilla+XK_Thor n: VKEY_OEM_3
391 {0x00F6, 0x2F, 0x00D6, 0x0000, 0xC0}, // XK_odiaeresis+AC10+XK_Odiaeresis+NoS ymbol: VKEY_OEM_3
392 {0x00F6, 0x2F, 0x00D6, 0x01DE, 0xC0}, // XK_odiaeresis+AC10+XK_Odiaeresis+XK_ Tcedilla: VKEY_OEM_3
393 {0x00FC, 0x14, 0x00DC, 0x0000, 0xBF}, // XK_udiaeresis+AE11+XK_Udiaeresis+NoS ymbol: VKEY_OEM_2
394 {0x00FC, 0x22, 0x00DC, 0x0000, 0xBA}, // XK_udiaeresis+AD11+XK_Udiaeresis+NoS ymbol: VKEY_OEM_1
395 {0x00FC, 0x22, 0x00DC, 0x01A3, 0xC0}, // XK_udiaeresis+AD11+XK_Udiaeresis+XK_ Lstroke: VKEY_OEM_3
396 {0x01EA, 0x3D, 0x01CA, 0x0000, 0xBD}, // XK_eogonek+AB10+XK_Eogonek+NoSymbol: VKEY_OEM_MINUS
397 {0x01EA, 0x3D, 0x01CA, 0x006E, 0xBF}, // XK_eogonek+AB10+XK_Eogonek+XK_n: VKE Y_OEM_2
398 {0x03E7, 0x22, 0x03C7, 0x0000, 0xDB}, // XK_iogonek+AD11+XK_Iogonek+NoSymbol: VKEY_OEM_4
399 {0x03F9, 0x2F, 0x03D9, 0x0000, 0xC0}, // XK_uogonek+AC10+XK_Uogonek+NoSymbol: VKEY_OEM_3
400 {0x03F9, 0x2F, 0x03D9, 0x01DE, 0xBA}, // XK_uogonek+AC10+XK_Uogonek+XK_Tcedil la: VKEY_OEM_1
sadrul 2014/07/04 05:58:38 80+ cols here
Shu Chen 2014/07/04 09:49:44 Done.
401 };
402
403 template<class T_MAP>
404 KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size)
405 {
sadrul 2014/07/04 05:58:38 { in the previous line
Shu Chen 2014/07/04 09:49:44 Done.
406 T_MAP comp = {0};
407 const T_MAP* p = std::lower_bound(map, map + size, key, comp);
408 if (p != map + size && !comp(*p, key) && !comp(key, *p))
409 return static_cast<KeyboardCode>(p->vk);
410 return VKEY_UNKNOWN;
411 }
412
413 } // namespace
414
22 // Get an ui::KeyboardCode from an X keyevent 415 // Get an ui::KeyboardCode from an X keyevent
23 KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev) { 416 KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev) {
417 // Gets correct VKEY code from XEvent is performed as the following steps:
418 // 1. Gets the keysym without modifier states.
419 // 2. For [a-z] & [0-9] cases, returns the VKEY code accordingly.
420 // 3. Find keysym in map0.
421 // 4. If not found, fallback to find keysym + hardware_code in map1.
422 // 5. If not found, fallback to find keysym + keysym_shift + hardware_code
423 // in map2.
424 // 6. If not found, fallback to find keysym + keysym_shift + keysym_altgr +
425 // hardware_code in map3.
426 // 7. If not found, fallback to find in KeyboardCodeFromXKeysym(), which
427 // mainly for non-letter keys.
428 // 8. If not found, fallback to find with the hardware code in US layout.
429
430 KeySym keysym = NoSymbol;
431 XKeyEvent xkey = xev->xkey;
432 xkey.state &= ~(ShiftMask | Mod1Mask);
24 // XLookupKeysym does not take into consideration the state of the lock/shift 433 // XLookupKeysym does not take into consideration the state of the lock/shift
25 // etc. keys. So it is necessary to use XLookupString instead. 434 // etc. keys. So it is necessary to use XLookupString instead.
26 KeySym keysym; 435 XLookupString(&xkey, NULL, 0, &keysym, NULL);
27 XLookupString(&xev->xkey, NULL, 0, &keysym, NULL); 436
28 KeyboardCode keycode = KeyboardCodeFromXKeysym(keysym); 437 // [a-z] cases.
29 if (keycode == VKEY_UNKNOWN) { 438 if (keysym >= XK_a && keysym <= XK_z)
30 keysym = DefaultXKeysymFromHardwareKeycode(xev->xkey.keycode); 439 return static_cast<KeyboardCode>(VKEY_A + keysym - XK_a);
31 keycode = KeyboardCodeFromXKeysym(keysym); 440
441 // [0-9] cases.
442 if (keysym >= XK_0 && keysym <= XK_9)
443 return static_cast<KeyboardCode>(VKEY_0 + keysym - XK_0);
444
445 KeyboardCode keycode = VKEY_UNKNOWN;
446
447 if (!IsKeypadKey(keysym) && !IsPrivateKeypadKey(keysym) &&
448 !IsCursorKey(keysym) && !IsPFKey(keysym) && !IsFunctionKey(keysym) &&
449 !IsModifierKey(keysym)) {
450 MAP0 key0 = {keysym & 0xFFFF, 0};
451 keycode = FindVK(key0, map0, arraysize(map0));
452 if (keycode != VKEY_UNKNOWN)
453 return keycode;
454
455 MAP1 key1 = {keysym & 0xFFFF, xkey.keycode, 0};
456 keycode = FindVK(key1, map1, arraysize(map1));
457 if (keycode != VKEY_UNKNOWN)
458 return keycode;
459
460 KeySym keysym_shift = NoSymbol;
461 xkey.state |= ShiftMask;
462 XLookupString(&xkey, NULL, 0, &keysym_shift, NULL);
463 MAP2 key2 = {keysym & 0xFFFF, xkey.keycode, keysym_shift & 0xFFFF, 0};
464 keycode = FindVK(key2, map2, arraysize(map2));
465 if (keycode != VKEY_UNKNOWN)
466 return keycode;
467
468 KeySym keysym_altgr = NoSymbol;
469 xkey.state &= ~ShiftMask;
470 xkey.state |= Mod1Mask;
471 XLookupString(&xkey, NULL, 0, &keysym_altgr, NULL);
472 MAP3 key3 = {
473 keysym & 0xFFFF,
474 xkey.keycode,
475 keysym_shift & 0xFFFF,
476 keysym_altgr & 0xFFFF,
477 0
478 };
479 keycode = FindVK(key3, map3, arraysize(map3));
480 if (keycode != VKEY_UNKNOWN)
481 return keycode;
482
483 // On Linux some keys has AltGr char but not on Windows.
484 // So if cannot find VKEY with (ch0+sc+ch1+ch2) in map3, tries to fallback
485 // to just find VKEY with (ch0+sc+ch1). This is the best we could do.
486 MAP3 key4 = {
487 keysym & 0xFFFF,
488 xkey.keycode,
489 keysym_shift & 0xFFFF,
490 0xFFFF,
491 0
492 };
493 const MAP3* p = std::lower_bound(
494 map3, map3 + arraysize(map3), key4, MAP3());
495 if (p != map3 + arraysize(map3) && p->ch0 == key4.ch0 &&
496 p->sc == key4.sc && p->ch1 == key4.ch1)
497 return static_cast<KeyboardCode>(p->vk);
32 } 498 }
33 499
500 keycode = KeyboardCodeFromXKeysym(keysym);
501 if (keycode == VKEY_UNKNOWN)
502 keycode = DefaultKeyboardCodeFromHardwareKeycode(xkey.keycode);
503
34 return keycode; 504 return keycode;
35 } 505 }
36 506
37 KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { 507 KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) {
38 // TODO(sad): Have |keysym| go through the X map list? 508 // TODO(sad): Have |keysym| go through the X map list?
39 509
40 switch (keysym) { 510 switch (keysym) {
41 case XK_BackSpace: 511 case XK_BackSpace:
42 return VKEY_BACK; 512 return VKEY_BACK;
43 case XK_Delete: 513 case XK_Delete:
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 case XK_Hangul_Hanja: 563 case XK_Hangul_Hanja:
94 return VKEY_HANJA; 564 return VKEY_HANJA;
95 case XK_Kanji: 565 case XK_Kanji:
96 return VKEY_KANJI; 566 return VKEY_KANJI;
97 case XK_Henkan: 567 case XK_Henkan:
98 return VKEY_CONVERT; 568 return VKEY_CONVERT;
99 case XK_Muhenkan: 569 case XK_Muhenkan:
100 return VKEY_NONCONVERT; 570 return VKEY_NONCONVERT;
101 case XK_Zenkaku_Hankaku: 571 case XK_Zenkaku_Hankaku:
102 return VKEY_DBE_DBCSCHAR; 572 return VKEY_DBE_DBCSCHAR;
103 case XK_A:
104 case XK_a:
105 return VKEY_A;
106 case XK_B:
107 case XK_b:
108 return VKEY_B;
109 case XK_C:
110 case XK_c:
111 return VKEY_C;
112 case XK_D:
113 case XK_d:
114 return VKEY_D;
115 case XK_E:
116 case XK_e:
117 return VKEY_E;
118 case XK_F:
119 case XK_f:
120 return VKEY_F;
121 case XK_G:
122 case XK_g:
123 return VKEY_G;
124 case XK_H:
125 case XK_h:
126 return VKEY_H;
127 case XK_I:
128 case XK_i:
129 return VKEY_I;
130 case XK_J:
131 case XK_j:
132 return VKEY_J;
133 case XK_K:
134 case XK_k:
135 return VKEY_K;
136 case XK_L:
137 case XK_l:
138 return VKEY_L;
139 case XK_M:
140 case XK_m:
141 return VKEY_M;
142 case XK_N:
143 case XK_n:
144 return VKEY_N;
145 case XK_O:
146 case XK_o:
147 return VKEY_O;
148 case XK_P:
149 case XK_p:
150 return VKEY_P;
151 case XK_Q:
152 case XK_q:
153 return VKEY_Q;
154 case XK_R:
155 case XK_r:
156 return VKEY_R;
157 case XK_S:
158 case XK_s:
159 return VKEY_S;
160 case XK_T:
161 case XK_t:
162 return VKEY_T;
163 case XK_U:
164 case XK_u:
165 return VKEY_U;
166 case XK_V:
167 case XK_v:
168 return VKEY_V;
169 case XK_W:
170 case XK_w:
171 return VKEY_W;
172 case XK_X:
173 case XK_x:
174 return VKEY_X;
175 case XK_Y:
176 case XK_y:
177 return VKEY_Y;
178 case XK_Z:
179 case XK_z:
180 return VKEY_Z;
181
182 case XK_0:
183 case XK_1:
184 case XK_2:
185 case XK_3:
186 case XK_4:
187 case XK_5:
188 case XK_6:
189 case XK_7:
190 case XK_8:
191 case XK_9:
192 return static_cast<KeyboardCode>(VKEY_0 + (keysym - XK_0));
193
194 case XK_parenright:
195 return VKEY_0;
196 case XK_exclam:
197 return VKEY_1;
198 case XK_at:
199 return VKEY_2;
200 case XK_numbersign:
201 return VKEY_3;
202 case XK_dollar:
203 return VKEY_4;
204 case XK_percent:
205 return VKEY_5;
206 case XK_asciicircum:
207 return VKEY_6;
208 case XK_ampersand:
209 return VKEY_7;
210 case XK_asterisk:
211 return VKEY_8;
212 case XK_parenleft:
213 return VKEY_9;
214 573
215 case XK_KP_0: 574 case XK_KP_0:
216 case XK_KP_1: 575 case XK_KP_1:
217 case XK_KP_2: 576 case XK_KP_2:
218 case XK_KP_3: 577 case XK_KP_3:
219 case XK_KP_4: 578 case XK_KP_4:
220 case XK_KP_5: 579 case XK_KP_5:
221 case XK_KP_6: 580 case XK_KP_6:
222 case XK_KP_7: 581 case XK_KP_7:
223 case XK_KP_8: 582 case XK_KP_8:
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 int bytes_written = XLookupString(&xev->xkey, buf, 6, NULL, NULL); 796 int bytes_written = XLookupString(&xev->xkey, buf, 6, NULL, NULL);
438 DCHECK_LE(bytes_written, 6); 797 DCHECK_LE(bytes_written, 6);
439 798
440 if (bytes_written <= 0) 799 if (bytes_written <= 0)
441 return 0; 800 return 0;
442 const base::string16& result = base::WideToUTF16( 801 const base::string16& result = base::WideToUTF16(
443 base::SysNativeMBToWide(base::StringPiece(buf, bytes_written))); 802 base::SysNativeMBToWide(base::StringPiece(buf, bytes_written)));
444 return result.length() == 1 ? result[0] : 0; 803 return result.length() == 1 ? result[0] : 0;
445 } 804 }
446 805
447 unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int hardware_code) { 806 KeyboardCode DefaultKeyboardCodeFromHardwareKeycode(
807 unsigned int hardware_code) {
448 // This function assumes that X11 is using evdev-based keycodes. 808 // This function assumes that X11 is using evdev-based keycodes.
449 static const unsigned int kHardwareKeycodeMap[] = { 809 static const KeyboardCode kHardwareKeycodeMap[] = {
450 // This table covers the core 105-key keyboard. 810 // Please refer to below links for the table content:
451 0, // 0x00: 811 // http://www.w3.org/TR/DOM-Level-3-Events-code/#keyboard-101
452 0, // 0x01: 812 // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode
453 0, // 0x02: 813 // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-9231 43f3456c/translate.pdf
454 0, // 0x03: 814 VKEY_UNKNOWN, // 0x00:
455 0, // 0x04: 815 VKEY_UNKNOWN, // 0x01:
456 0, // 0x05: 816 VKEY_UNKNOWN, // 0x02:
457 0, // 0x06: 817 VKEY_UNKNOWN, // 0x03:
458 0, // XKB evdev (XKB - 8) X KeySym 818 VKEY_UNKNOWN, // 0x04:
459 0, // === =============== ====== 819 VKEY_UNKNOWN, // 0x05:
460 XK_Escape, // 0x09: KEY_ESC Escape 820 VKEY_UNKNOWN, // 0x06:
461 XK_1, // 0x0A: KEY_1 1 821 VKEY_UNKNOWN, // XKB evdev (XKB - 8) X KeySym
462 XK_2, // 0x0B: KEY_2 2 822 VKEY_UNKNOWN, // === =============== ======
463 XK_3, // 0x0C: KEY_3 3 823 VKEY_ESCAPE, // 0x09: KEY_ESC Escape
464 XK_4, // 0x0D: KEY_4 4 824 VKEY_1, // 0x0A: KEY_1 1
465 XK_5, // 0x0E: KEY_5 5 825 VKEY_2, // 0x0B: KEY_2 2
466 XK_6, // 0x0F: KEY_6 6 826 VKEY_3, // 0x0C: KEY_3 3
467 XK_7, // 0x10: KEY_7 7 827 VKEY_4, // 0x0D: KEY_4 4
468 XK_8, // 0x11: KEY_8 8 828 VKEY_5, // 0x0E: KEY_5 5
469 XK_9, // 0x12: KEY_9 9 829 VKEY_6, // 0x0F: KEY_6 6
470 XK_0, // 0x13: KEY_0 0 830 VKEY_7, // 0x10: KEY_7 7
471 XK_minus, // 0x14: KEY_MINUS minus 831 VKEY_8, // 0x11: KEY_8 8
472 XK_equal, // 0x15: KEY_EQUAL equal 832 VKEY_9, // 0x12: KEY_9 9
473 XK_BackSpace, // 0x16: KEY_BACKSPACE BackSpace 833 VKEY_0, // 0x13: KEY_0 0
474 XK_Tab, // 0x17: KEY_TAB Tab 834 VKEY_OEM_MINUS, // 0x14: KEY_MINUS minus
475 XK_q, // 0x18: KEY_Q q 835 VKEY_OEM_PLUS, // 0x15: KEY_EQUAL equal
476 XK_w, // 0x19: KEY_W w 836 VKEY_BACK, // 0x16: KEY_BACKSPACE BackSpace
477 XK_e, // 0x1A: KEY_E e 837 VKEY_TAB, // 0x17: KEY_TAB Tab
478 XK_r, // 0x1B: KEY_R r 838 VKEY_Q, // 0x18: KEY_Q q
479 XK_t, // 0x1C: KEY_T t 839 VKEY_W, // 0x19: KEY_W w
480 XK_y, // 0x1D: KEY_Y y 840 VKEY_E, // 0x1A: KEY_E e
481 XK_u, // 0x1E: KEY_U u 841 VKEY_R, // 0x1B: KEY_R r
482 XK_i, // 0x1F: KEY_I i 842 VKEY_T, // 0x1C: KEY_T t
483 XK_o, // 0x20: KEY_O o 843 VKEY_Y, // 0x1D: KEY_Y y
484 XK_p, // 0x21: KEY_P p 844 VKEY_U, // 0x1E: KEY_U u
485 XK_bracketleft, // 0x22: KEY_LEFTBRACE bracketleft 845 VKEY_I, // 0x1F: KEY_I i
486 XK_bracketright, // 0x23: KEY_RIGHTBRACE bracketright 846 VKEY_O, // 0x20: KEY_O o
487 XK_Return, // 0x24: KEY_ENTER Return 847 VKEY_P, // 0x21: KEY_P p
488 XK_Control_L, // 0x25: KEY_LEFTCTRL Control_L 848 VKEY_OEM_4, // 0x22: KEY_LEFTBRACE bracketleft
489 XK_a, // 0x26: KEY_A a 849 VKEY_OEM_6, // 0x23: KEY_RIGHTBRACE bracketright
490 XK_s, // 0x27: KEY_S s 850 VKEY_RETURN, // 0x24: KEY_ENTER Return
491 XK_d, // 0x28: KEY_D d 851 VKEY_LCONTROL, // 0x25: KEY_LEFTCTRL Control_L
492 XK_f, // 0x29: KEY_F f 852 VKEY_A, // 0x26: KEY_A a
493 XK_g, // 0x2A: KEY_G g 853 VKEY_S, // 0x27: KEY_S s
494 XK_h, // 0x2B: KEY_H h 854 VKEY_D, // 0x28: KEY_D d
495 XK_j, // 0x2C: KEY_J j 855 VKEY_F, // 0x29: KEY_F f
496 XK_k, // 0x2D: KEY_K k 856 VKEY_G, // 0x2A: KEY_G g
497 XK_l, // 0x2E: KEY_L l 857 VKEY_H, // 0x2B: KEY_H h
498 XK_semicolon, // 0x2F: KEY_SEMICOLON semicolon 858 VKEY_J, // 0x2C: KEY_J j
499 XK_apostrophe, // 0x30: KEY_APOSTROPHE apostrophe 859 VKEY_K, // 0x2D: KEY_K k
500 XK_grave, // 0x31: KEY_GRAVE grave 860 VKEY_L, // 0x2E: KEY_L l
501 XK_Shift_L, // 0x32: KEY_LEFTSHIFT Shift_L 861 VKEY_OEM_1, // 0x2F: KEY_SEMICOLON semicolon
502 XK_backslash, // 0x33: KEY_BACKSLASH backslash 862 VKEY_OEM_7, // 0x30: KEY_APOSTROPHE apostrophe
503 XK_z, // 0x34: KEY_Z z 863 VKEY_OEM_3, // 0x31: KEY_GRAVE grave
504 XK_x, // 0x35: KEY_X x 864 VKEY_LSHIFT, // 0x32: KEY_LEFTSHIFT Shift_L
505 XK_c, // 0x36: KEY_C c 865 VKEY_OEM_5, // 0x33: KEY_BACKSLASH backslash
506 XK_v, // 0x37: KEY_V v 866 VKEY_Z, // 0x34: KEY_Z z
507 XK_b, // 0x38: KEY_B b 867 VKEY_X, // 0x35: KEY_X x
508 XK_n, // 0x39: KEY_N n 868 VKEY_C, // 0x36: KEY_C c
509 XK_m, // 0x3A: KEY_M m 869 VKEY_V, // 0x37: KEY_V v
510 XK_comma, // 0x3B: KEY_COMMA comma 870 VKEY_B, // 0x38: KEY_B b
511 XK_period, // 0x3C: KEY_DOT period 871 VKEY_N, // 0x39: KEY_N n
512 XK_slash, // 0x3D: KEY_SLASH slash 872 VKEY_M, // 0x3A: KEY_M m
513 XK_Shift_R, // 0x3E: KEY_RIGHTSHIFT Shift_R 873 VKEY_OEM_COMMA, // 0x3B: KEY_COMMA comma
514 0, // 0x3F: KEY_KPASTERISK KP_Multiply 874 VKEY_OEM_PERIOD, // 0x3C: KEY_DOT period
515 XK_Alt_L, // 0x40: KEY_LEFTALT Alt_L 875 VKEY_OEM_2, // 0x3D: KEY_SLASH slash
516 XK_space, // 0x41: KEY_SPACE space 876 VKEY_RSHIFT, // 0x3E: KEY_RIGHTSHIFT Shift_R
517 XK_Caps_Lock, // 0x42: KEY_CAPSLOCK Caps_Lock 877 VKEY_MULTIPLY, // 0x3F: KEY_KPASTERISK KP_Multiply
518 XK_F1, // 0x43: KEY_F1 F1 878 VKEY_LMENU, // 0x40: KEY_LEFTALT Alt_L
519 XK_F2, // 0x44: KEY_F2 F2 879 VKEY_SPACE, // 0x41: KEY_SPACE space
520 XK_F3, // 0x45: KEY_F3 F3 880 VKEY_CAPITAL, // 0x42: KEY_CAPSLOCK Caps_Lock
521 XK_F4, // 0x46: KEY_F4 F4 881 VKEY_F1, // 0x43: KEY_F1 F1
522 XK_F5, // 0x47: KEY_F5 F5 882 VKEY_F2, // 0x44: KEY_F2 F2
523 XK_F6, // 0x48: KEY_F6 F6 883 VKEY_F3, // 0x45: KEY_F3 F3
524 XK_F7, // 0x49: KEY_F7 F7 884 VKEY_F4, // 0x46: KEY_F4 F4
525 XK_F8, // 0x4A: KEY_F8 F8 885 VKEY_F5, // 0x47: KEY_F5 F5
526 XK_F9, // 0x4B: KEY_F9 F9 886 VKEY_F6, // 0x48: KEY_F6 F6
527 XK_F10, // 0x4C: KEY_F10 F10 887 VKEY_F7, // 0x49: KEY_F7 F7
528 XK_Num_Lock, // 0x4D: KEY_NUMLOCK Num_Lock 888 VKEY_F8, // 0x4A: KEY_F8 F8
529 XK_Scroll_Lock, // 0x4E: KEY_SCROLLLOCK Scroll_Lock 889 VKEY_F9, // 0x4B: KEY_F9 F9
530 XK_KP_7, // 0x4F: KEY_KP7 KP_7 890 VKEY_F10, // 0x4C: KEY_F10 F10
531 XK_KP_8, // 0x50: KEY_KP8 KP_8 891 VKEY_NUMLOCK, // 0x4D: KEY_NUMLOCK Num_Lock
532 XK_KP_9, // 0x51: KEY_KP9 KP_9 892 VKEY_SCROLL, // 0x4E: KEY_SCROLLLOCK Scroll_Lock
533 XK_KP_Subtract, // 0x52: KEY_KPMINUS KP_Subtract 893 VKEY_NUMPAD7, // 0x4F: KEY_KP7 KP_7
534 XK_KP_4, // 0x53: KEY_KP4 KP_4 894 VKEY_NUMPAD8, // 0x50: KEY_KP8 KP_8
535 XK_KP_5, // 0x54: KEY_KP5 KP_5 895 VKEY_NUMPAD9, // 0x51: KEY_KP9 KP_9
536 XK_KP_6, // 0x55: KEY_KP6 KP_6 896 VKEY_SUBTRACT, // 0x52: KEY_KPMINUS KP_Subtract
537 XK_KP_Add, // 0x56: KEY_KPPLUS KP_Add 897 VKEY_NUMPAD4, // 0x53: KEY_KP4 KP_4
538 XK_KP_1, // 0x57: KEY_KP1 KP_1 898 VKEY_NUMPAD5, // 0x54: KEY_KP5 KP_5
539 XK_KP_2, // 0x58: KEY_KP2 KP_2 899 VKEY_NUMPAD6, // 0x55: KEY_KP6 KP_6
540 XK_KP_3, // 0x59: KEY_KP3 KP_3 900 VKEY_ADD, // 0x56: KEY_KPPLUS KP_Add
541 XK_KP_0, // 0x5A: KEY_KP0 KP_0 901 VKEY_NUMPAD1, // 0x57: KEY_KP1 KP_1
542 XK_KP_Decimal, // 0x5B: KEY_KPDOT KP_Decimal 902 VKEY_NUMPAD2, // 0x58: KEY_KP2 KP_2
543 0, // 0x5C: 903 VKEY_NUMPAD3, // 0x59: KEY_KP3 KP_3
544 XK_Zenkaku_Hankaku, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku 904 VKEY_NUMPAD0, // 0x5A: KEY_KP0 KP_0
545 XK_backslash, // 0x5E: KEY_102ND backslash 905 VKEY_DECIMAL, // 0x5B: KEY_KPDOT KP_Decimal
546 XK_F11, // 0x5F: KEY_F11 F11 906 VKEY_UNKNOWN, // 0x5C:
547 XK_F12, // 0x60: KEY_F12 F12 907 VKEY_DBE_DBCSCHAR, // 0x5D: KEY_ZENKAKUHANKAKU Zenkaku_Hankaku
548 XK_Romaji, // 0x61: KEY_RO Romaji 908 VKEY_OEM_5, // 0x5E: KEY_102ND backslash
549 XK_Katakana, // 0x62: KEY_KATAKANA Katakana 909 VKEY_F11, // 0x5F: KEY_F11 F11
550 XK_Hiragana, // 0x63: KEY_HIRAGANA Hiragana 910 VKEY_F12, // 0x60: KEY_F12 F12
551 XK_Henkan, // 0x64: KEY_HENKAN Henkan 911 VKEY_OEM_102, // 0x61: KEY_RO Romaji
552 XK_Hiragana_Katakana, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana 912 VKEY_UNSUPPORTED, // 0x62: KEY_KATAKANA Katakana
553 XK_Muhenkan, // 0x66: KEY_MUHENKAN Muhenkan 913 VKEY_UNSUPPORTED, // 0x63: KEY_HIRAGANA Hiragana
554 XK_KP_Separator, // 0x67: KEY_KPJPCOMMA KP_Separator 914 VKEY_CONVERT, // 0x64: KEY_HENKAN Henkan
555 XK_KP_Enter, // 0x68: KEY_KPENTER KP_Enter 915 VKEY_UNSUPPORTED, // 0x65: KEY_KATAKANAHIRAGANA Hiragana_Katakana
556 XK_Control_R, // 0x69: KEY_RIGHTCTRL Control_R 916 VKEY_NONCONVERT, // 0x66: KEY_MUHENKAN Muhenkan
557 XK_KP_Divide, // 0x6A: KEY_KPSLASH KP_Divide 917 VKEY_SEPARATOR, // 0x67: KEY_KPJPCOMMA KP_Separator
558 XK_Print, // 0x6B: KEY_SYSRQ Print 918 VKEY_RETURN, // 0x68: KEY_KPENTER KP_Enter
559 XK_Alt_R, // 0x6C: KEY_RIGHTALT Alt_R 919 VKEY_RCONTROL, // 0x69: KEY_RIGHTCTRL Control_R
560 XK_Linefeed, // 0x6D: KEY_LINEFEED Linefeed 920 VKEY_DIVIDE, // 0x6A: KEY_KPSLASH KP_Divide
561 XK_Home, // 0x6E: KEY_HOME Home 921 VKEY_PRINT, // 0x6B: KEY_SYSRQ Print
562 XK_Up, // 0x6F: KEY_UP Up 922 VKEY_RMENU, // 0x6C: KEY_RIGHTALT Alt_R
563 XK_Page_Up, // 0x70: KEY_PAGEUP Page_Up 923 VKEY_RETURN, // 0x6D: KEY_LINEFEED Linefeed
564 XK_Left, // 0x71: KEY_LEFT Left 924 VKEY_HOME, // 0x6E: KEY_HOME Home
565 XK_Right, // 0x72: KEY_RIGHT Right 925 VKEY_UP, // 0x6F: KEY_UP Up
566 XK_End, // 0x73: KEY_END End 926 VKEY_PRIOR, // 0x70: KEY_PAGEUP Page_Up
567 XK_Down, // 0x74: KEY_DOWN Down 927 VKEY_LEFT, // 0x71: KEY_LEFT Left
568 XK_Page_Down, // 0x75: KEY_PAGEDOWN Page_Down 928 VKEY_RIGHT, // 0x72: KEY_RIGHT Right
569 XK_Insert, // 0x76: KEY_INSERT Insert 929 VKEY_END, // 0x73: KEY_END End
570 XK_Delete, // 0x77: KEY_DELETE Delete 930 VKEY_DOWN, // 0x74: KEY_DOWN Down
571 0, // 0x78: KEY_MACRO 931 VKEY_NEXT, // 0x75: KEY_PAGEDOWN Page_Down
572 XF86XK_AudioMute, // 0x79: KEY_MUTE XF86AudioMute 932 VKEY_INSERT, // 0x76: KEY_INSERT Insert
573 XF86XK_AudioLowerVolume, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume 933 VKEY_DELETE, // 0x77: KEY_DELETE Delete
574 XF86XK_AudioRaiseVolume, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume 934 VKEY_UNSUPPORTED, // 0x78: KEY_MACRO
575 XF86XK_PowerOff, // 0x7C: KEY_POWER XF86PowerOff 935 VKEY_VOLUME_MUTE, // 0x79: KEY_MUTE XF86AudioMute
576 XK_KP_Equal, // 0x7D: KEY_KPEQUAL KP_Equal 936 VKEY_VOLUME_DOWN, // 0x7A: KEY_VOLUMEDOWN XF86AudioLowerVolume
577 XK_plusminus, // 0x7E: KEY_KPPLUSMINUS plusminus 937 VKEY_VOLUME_UP, // 0x7B: KEY_VOLUMEUP XF86AudioRaiseVolume
578 XK_Pause, // 0x7F: KEY_PAUSE Pause 938 VKEY_POWER, // 0x7C: KEY_POWER XF86PowerOff
579 XF86XK_LaunchA, // 0x80: KEY_SCALE XF86LaunchA 939 VKEY_OEM_PLUS, // 0x7D: KEY_KPEQUAL KP_Equal
580 XK_KP_Decimal, // 0x81: KEY_KPCOMMA KP_Decimal 940 VKEY_UNSUPPORTED, // 0x7E: KEY_KPPLUSMINUS plusminus
581 XK_Hangul, // 0x82: KEY_HANGUEL Hangul 941 VKEY_PAUSE, // 0x7F: KEY_PAUSE Pause
582 XK_Hangul_Hanja, // 0x83: KEY_HANJA Hangul_Hanja 942 VKEY_MEDIA_LAUNCH_APP1, // 0x80: KEY_SCALE XF86LaunchA
583 XK_yen, // 0x84: KEY_YEN yen 943 VKEY_DECIMAL, // 0x81: KEY_KPCOMMA KP_Decimal
584 XK_Super_L, // 0x85: KEY_LEFTMETA Super_L 944 VKEY_HANGUL, // 0x82: KEY_HANGUEL Hangul
585 XK_Super_R, // 0x86: KEY_RIGHTMETA Super_R 945 VKEY_HANJA, // 0x83: KEY_HANJA Hangul_Hanja
586 XK_Menu, // 0x87: KEY_COMPOSE Menu 946 VKEY_OEM_5, // 0x84: KEY_YEN yen
947 VKEY_LWIN, // 0x85: KEY_LEFTMETA Super_L
948 VKEY_RWIN, // 0x86: KEY_RIGHTMETA Super_R
949 VKEY_COMPOSE, // 0x87: KEY_COMPOSE Menu
587 }; 950 };
588 951
589 if (hardware_code >= arraysize(kHardwareKeycodeMap)) { 952 if (hardware_code >= arraysize(kHardwareKeycodeMap)) {
590 // Additional keycodes used by the Chrome OS top row special function keys. 953 // Additional keycodes used by the Chrome OS top row special function keys.
591 switch (hardware_code) { 954 switch (hardware_code) {
592 case 0xA6: // KEY_BACK 955 case 0xA6: // KEY_BACK
593 return XF86XK_Back; 956 return VKEY_BACK;
594 case 0xA7: // KEY_FORWARD 957 case 0xA7: // KEY_FORWARD
595 return XF86XK_Forward; 958 return VKEY_BROWSER_FORWARD;
596 case 0xB5: // KEY_REFRESH 959 case 0xB5: // KEY_REFRESH
597 return XF86XK_Reload; 960 return VKEY_BROWSER_REFRESH;
598 case 0xD4: // KEY_DASHBOARD 961 case 0xD4: // KEY_DASHBOARD
599 return XF86XK_LaunchB; 962 return VKEY_MEDIA_LAUNCH_APP2;
600 case 0xE8: // KEY_BRIGHTNESSDOWN 963 case 0xE8: // KEY_BRIGHTNESSDOWN
601 return XF86XK_MonBrightnessDown; 964 return VKEY_BRIGHTNESS_DOWN;
602 case 0xE9: // KEY_BRIGHTNESSUP 965 case 0xE9: // KEY_BRIGHTNESSUP
603 return XF86XK_MonBrightnessUp; 966 return VKEY_BRIGHTNESS_UP;
604 } 967 }
605 return 0; 968 return VKEY_UNKNOWN;
606 } 969 }
607 return kHardwareKeycodeMap[hardware_code]; 970 return kHardwareKeycodeMap[hardware_code];
608 } 971 }
609 972
610 // TODO(jcampan): this method might be incomplete. 973 // TODO(jcampan): this method might be incomplete.
611 int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) { 974 int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) {
612 switch (keycode) { 975 switch (keycode) {
613 case VKEY_NUMPAD0: 976 case VKEY_NUMPAD0:
614 return XK_KP_0; 977 return XK_KP_0;
615 case VKEY_NUMPAD1: 978 case VKEY_NUMPAD1:
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 case VKEY_KBD_BRIGHTNESS_UP: 1233 case VKEY_KBD_BRIGHTNESS_UP:
871 return XF86XK_KbdBrightnessUp; 1234 return XF86XK_KbdBrightnessUp;
872 1235
873 default: 1236 default:
874 LOG(WARNING) << "Unknown keycode:" << keycode; 1237 LOG(WARNING) << "Unknown keycode:" << keycode;
875 return 0; 1238 return 0;
876 } 1239 }
877 } 1240 }
878 1241
879 } // namespace ui 1242 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/keycodes/keyboard_code_conversion_x.h ('k') | ui/events/test/events_test_utils_x11.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698