OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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.h" | 5 #include "ui/events/keycodes/keyboard_code_conversion.h" |
6 | 6 |
7 #include "ui/events/event_constants.h" | 7 #include "ui/events/event_constants.h" |
8 #include "ui/events/keycodes/dom3/dom_key.h" | |
8 | 9 |
9 namespace ui { | 10 namespace ui { |
10 | 11 |
11 uint16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags) { | 12 uint16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags) { |
13 ui::DomKey dom_key; | |
14 uint16 character; | |
15 if (GetMeaningFromKeyCode(key_code, flags, &dom_key, &character)) | |
16 return character; | |
17 return 0; | |
18 } | |
19 | |
20 EVENTS_BASE_EXPORT bool GetMeaningFromKeyCode(KeyboardCode key_code, | |
21 int flags, | |
22 DomKey* dom_key, | |
23 uint16* character) { | |
12 const bool ctrl = (flags & EF_CONTROL_DOWN) != 0; | 24 const bool ctrl = (flags & EF_CONTROL_DOWN) != 0; |
13 const bool shift = (flags & EF_SHIFT_DOWN) != 0; | 25 const bool shift = (flags & EF_SHIFT_DOWN) != 0; |
14 const bool upper = shift ^ ((flags & EF_CAPS_LOCK_DOWN) != 0); | 26 const bool upper = shift ^ ((flags & EF_CAPS_LOCK_DOWN) != 0); |
15 | 27 |
16 // Following Windows behavior to map ctrl-a ~ ctrl-z to \x01 ~ \x1A. | 28 // Control characters. |
17 if (key_code >= VKEY_A && key_code <= VKEY_Z) { | |
18 return static_cast<uint16> | |
19 (key_code - VKEY_A + (ctrl ? 1 : (upper ? 'A' : 'a'))); | |
20 } | |
21 | |
22 // Other ctrl characters | |
23 if (ctrl) { | 29 if (ctrl) { |
30 // Following Windows behavior to map ctrl-a ~ ctrl-z to \x01 ~ \x1A. | |
31 if (key_code >= VKEY_A && key_code <= VKEY_Z) { | |
32 *character = static_cast<uint16>(key_code - VKEY_A + 1); | |
33 switch (key_code) { | |
34 case VKEY_H: | |
35 *dom_key = DomKey::BACKSPACE; | |
36 break; | |
37 case VKEY_I: | |
38 *dom_key = DomKey::TAB; | |
39 break; | |
40 case VKEY_J: | |
41 case VKEY_M: | |
42 *dom_key = DomKey::ENTER; | |
43 break; | |
44 default: | |
45 *dom_key = DomKey::CHARACTER; | |
46 break; | |
47 } | |
48 return true; | |
49 } | |
50 // Other ctrl characters | |
24 if (shift) { | 51 if (shift) { |
25 // following graphics chars require shift key to input. | 52 // following graphics chars require shift key to input. |
26 switch (key_code) { | 53 switch (key_code) { |
27 // ctrl-@ maps to \x00 (Null byte) | 54 // ctrl-@ maps to \x00 (Null byte) |
28 case VKEY_2: | 55 case VKEY_2: |
29 return 0; | 56 *dom_key = DomKey::CHARACTER; |
57 *character = 0; | |
58 return true; | |
30 // ctrl-^ maps to \x1E (Record separator, Information separator two) | 59 // ctrl-^ maps to \x1E (Record separator, Information separator two) |
31 case VKEY_6: | 60 case VKEY_6: |
32 return 0x1E; | 61 *dom_key = DomKey::CHARACTER; |
62 *character = 0x1E; | |
63 return true; | |
33 // ctrl-_ maps to \x1F (Unit separator, Information separator one) | 64 // ctrl-_ maps to \x1F (Unit separator, Information separator one) |
34 case VKEY_OEM_MINUS: | 65 case VKEY_OEM_MINUS: |
35 return 0x1F; | 66 *dom_key = DomKey::CHARACTER; |
67 *character = 0x1F; | |
68 return true; | |
36 // Returns 0 for all other keys to avoid inputting unexpected chars. | 69 // Returns 0 for all other keys to avoid inputting unexpected chars. |
37 default: | 70 default: |
38 return 0; | 71 *dom_key = DomKey::UNIDENTIFIED; |
72 *character = 0; | |
73 return false; | |
39 } | 74 } |
40 } else { | 75 } else { |
41 switch (key_code) { | 76 switch (key_code) { |
42 // ctrl-[ maps to \x1B (Escape) | 77 // ctrl-[ maps to \x1B (Escape) |
43 case VKEY_OEM_4: | 78 case VKEY_OEM_4: |
44 return 0x1B; | 79 *dom_key = DomKey::ESCAPE; |
80 *character = 0x1B; | |
81 return true; | |
45 // ctrl-\ maps to \x1C (File separator, Information separator four) | 82 // ctrl-\ maps to \x1C (File separator, Information separator four) |
46 case VKEY_OEM_5: | 83 case VKEY_OEM_5: |
47 return 0x1C; | 84 *dom_key = DomKey::CHARACTER; |
85 *character = 0x1C; | |
86 return true; | |
48 // ctrl-] maps to \x1D (Group separator, Information separator three) | 87 // ctrl-] maps to \x1D (Group separator, Information separator three) |
49 case VKEY_OEM_6: | 88 case VKEY_OEM_6: |
50 return 0x1D; | 89 *dom_key = DomKey::CHARACTER; |
90 *character = 0x1D; | |
91 return true; | |
51 // ctrl-Enter maps to \x0A (Line feed) | 92 // ctrl-Enter maps to \x0A (Line feed) |
52 case VKEY_RETURN: | 93 case VKEY_RETURN: |
53 return 0x0A; | 94 *dom_key = DomKey::CHARACTER; |
95 *character = 0x0A; | |
96 return true; | |
54 // Returns 0 for all other keys to avoid inputting unexpected chars. | 97 // Returns 0 for all other keys to avoid inputting unexpected chars. |
55 default: | 98 default: |
56 return 0; | 99 *dom_key = DomKey::UNIDENTIFIED; |
100 *character = 0; | |
101 return false; | |
57 } | 102 } |
58 } | 103 } |
59 } | 104 } |
60 | 105 |
61 // For IME support. | |
62 if (key_code == ui::VKEY_PROCESSKEY) | |
63 return 0xE5; | |
64 | |
65 // Normal characters | 106 // Normal characters |
107 if (key_code >= VKEY_A && key_code <= VKEY_Z) { | |
108 *dom_key = DomKey::CHARACTER; | |
109 *character = static_cast<uint16>(key_code - VKEY_A + (upper ? 'A' : 'a')); | |
110 return true; | |
111 } | |
66 if (key_code >= VKEY_0 && key_code <= VKEY_9) { | 112 if (key_code >= VKEY_0 && key_code <= VKEY_9) { |
67 return shift ? ")!@#$%^&*("[key_code - VKEY_0] : | 113 *dom_key = DomKey::CHARACTER; |
68 static_cast<uint16>(key_code); | 114 *character = |
69 } else if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) { | 115 shift ? ")!@#$%^&*("[key_code - VKEY_0] : static_cast<uint16>(key_code); |
70 return static_cast<uint16>(key_code - VKEY_NUMPAD0 + '0'); | 116 return true; |
71 } | 117 } |
72 | 118 if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) { |
119 *dom_key = DomKey::CHARACTER; | |
120 *character = static_cast<uint16>(key_code - VKEY_NUMPAD0 + '0'); | |
121 return true; | |
122 } | |
123 | |
124 // Function keys | |
125 if (key_code >= VKEY_F1 && key_code <= VKEY_F24) { | |
126 *dom_key = | |
127 static_cast<DomKey>(key_code - VKEY_F1 + static_cast<int>(DomKey::F1)); | |
128 *character = 0; | |
129 return true; | |
130 } | |
131 | |
132 // Isolated characters. | |
133 *dom_key = DomKey::CHARACTER; | |
134 *character = 0; | |
73 switch (key_code) { | 135 switch (key_code) { |
136 case VKEY_BACK: | |
137 *dom_key = DomKey::BACKSPACE; | |
138 *character = '\b'; | |
139 return true; | |
74 case VKEY_TAB: | 140 case VKEY_TAB: |
75 return '\t'; | 141 *dom_key = DomKey::TAB; |
142 *character = '\t'; | |
143 return true; | |
76 case VKEY_RETURN: | 144 case VKEY_RETURN: |
77 return '\r'; | 145 *dom_key = DomKey::ENTER; |
146 *character = '\r'; | |
147 return true; | |
148 case VKEY_ESCAPE: | |
149 *dom_key = DomKey::ESCAPE; | |
150 *character = 0x1B; | |
151 return true; | |
152 case VKEY_SPACE: | |
153 *character = ' '; | |
154 return true; | |
78 case VKEY_MULTIPLY: | 155 case VKEY_MULTIPLY: |
79 return '*'; | 156 *character = '*'; |
157 return true; | |
80 case VKEY_ADD: | 158 case VKEY_ADD: |
81 return '+'; | 159 *character = '+'; |
160 return true; | |
161 case VKEY_SEPARATOR: | |
162 *character = ','; | |
163 return true; | |
82 case VKEY_SUBTRACT: | 164 case VKEY_SUBTRACT: |
83 return '-'; | 165 *character = '-'; |
166 return true; | |
84 case VKEY_DECIMAL: | 167 case VKEY_DECIMAL: |
85 return '.'; | 168 *character = '.'; |
169 return true; | |
86 case VKEY_DIVIDE: | 170 case VKEY_DIVIDE: |
87 return '/'; | 171 *character = '/'; |
88 case VKEY_SPACE: | 172 return true; |
89 return ' '; | |
90 case VKEY_OEM_1: | 173 case VKEY_OEM_1: |
91 return shift ? ':' : ';'; | 174 *character = shift ? ':' : ';'; |
175 return true; | |
92 case VKEY_OEM_PLUS: | 176 case VKEY_OEM_PLUS: |
93 return shift ? '+' : '='; | 177 *character = shift ? '+' : '='; |
178 return true; | |
94 case VKEY_OEM_COMMA: | 179 case VKEY_OEM_COMMA: |
95 return shift ? '<' : ','; | 180 *character = shift ? '<' : ','; |
181 return true; | |
96 case VKEY_OEM_MINUS: | 182 case VKEY_OEM_MINUS: |
97 return shift ? '_' : '-'; | 183 *character = shift ? '_' : '-'; |
184 return true; | |
98 case VKEY_OEM_PERIOD: | 185 case VKEY_OEM_PERIOD: |
99 return shift ? '>' : '.'; | 186 *character = shift ? '>' : '.'; |
187 return true; | |
100 case VKEY_OEM_2: | 188 case VKEY_OEM_2: |
101 return shift ? '?' : '/'; | 189 *character = shift ? '?' : '/'; |
190 return true; | |
102 case VKEY_OEM_3: | 191 case VKEY_OEM_3: |
103 return shift ? '~' : '`'; | 192 *character = shift ? '~' : '`'; |
193 return true; | |
104 case VKEY_OEM_4: | 194 case VKEY_OEM_4: |
105 return shift ? '{' : '['; | 195 *character = shift ? '{' : '['; |
196 return true; | |
106 case VKEY_OEM_5: | 197 case VKEY_OEM_5: |
107 return shift ? '|' : '\\'; | 198 *character = shift ? '|' : '\\'; |
199 return true; | |
108 case VKEY_OEM_6: | 200 case VKEY_OEM_6: |
109 return shift ? '}' : ']'; | 201 *character = shift ? '}' : ']'; |
202 return true; | |
110 case VKEY_OEM_7: | 203 case VKEY_OEM_7: |
111 return shift ? '"' : '\''; | 204 *character = shift ? '"' : '\''; |
205 return true; | |
206 case VKEY_OEM_102: | |
207 *character = shift ? '>' : '<'; | |
208 return true; | |
209 case VKEY_CLEAR: | |
210 *dom_key = DomKey::CLEAR; | |
spang
2014/12/02 20:28:00
missing break?
kpschoedel
2014/12/02 21:52:34
Done.
| |
211 case VKEY_SHIFT: | |
212 *dom_key = DomKey::SHIFT; | |
213 case VKEY_CONTROL: | |
214 *dom_key = DomKey::CONTROL; | |
215 case VKEY_MENU: | |
216 *dom_key = DomKey::ALT; | |
217 case VKEY_PAUSE: | |
218 *dom_key = DomKey::PAUSE; | |
219 case VKEY_CAPITAL: | |
220 *dom_key = DomKey::CAPS_LOCK; | |
221 case VKEY_KANA: | |
222 // Windows conflates 'KanaMode' and 'HangulMode' | |
223 *dom_key = DomKey::KANA_MODE; | |
224 case VKEY_JUNJA: | |
225 *dom_key = DomKey::JUNJA_MODE; | |
226 case VKEY_FINAL: | |
227 *dom_key = DomKey::FINAL_MODE; | |
228 case VKEY_HANJA: | |
229 // Windows conflates 'HanjaMode' and 'KanjiMode' | |
230 *dom_key = DomKey::HANJA_MODE; | |
231 case VKEY_CONVERT: | |
232 *dom_key = DomKey::CONVERT; | |
233 case VKEY_NONCONVERT: | |
234 *dom_key = DomKey::NON_CONVERT; | |
235 case VKEY_ACCEPT: | |
236 *dom_key = DomKey::ACCEPT; | |
237 case VKEY_MODECHANGE: | |
238 *dom_key = DomKey::MODE_CHANGE; | |
239 case VKEY_PRIOR: | |
240 *dom_key = DomKey::PAGE_UP; | |
241 case VKEY_NEXT: | |
242 *dom_key = DomKey::PAGE_DOWN; | |
243 case VKEY_END: | |
244 *dom_key = DomKey::END; | |
245 case VKEY_HOME: | |
246 *dom_key = DomKey::HOME; | |
247 case VKEY_LEFT: | |
248 *dom_key = DomKey::ARROW_LEFT; | |
249 case VKEY_UP: | |
250 *dom_key = DomKey::ARROW_UP; | |
251 case VKEY_RIGHT: | |
252 *dom_key = DomKey::ARROW_RIGHT; | |
253 case VKEY_DOWN: | |
254 *dom_key = DomKey::ARROW_DOWN; | |
255 case VKEY_SELECT: | |
256 *dom_key = DomKey::SELECT; | |
257 case VKEY_PRINT: | |
258 *dom_key = DomKey::PRINT; | |
259 case VKEY_EXECUTE: | |
260 *dom_key = DomKey::EXECUTE; | |
261 case VKEY_SNAPSHOT: | |
262 *dom_key = DomKey::PRINT_SCREEN; | |
263 case VKEY_INSERT: | |
264 *dom_key = DomKey::INSERT; | |
265 case VKEY_DELETE: | |
266 *dom_key = DomKey::DEL; | |
267 case VKEY_HELP: | |
268 *dom_key = DomKey::HELP; | |
269 case VKEY_LWIN: | |
270 case VKEY_RWIN: | |
271 *dom_key = DomKey::OS; | |
272 case VKEY_APPS: | |
273 *dom_key = DomKey::MEDIA_APPS; | |
274 case VKEY_NUMLOCK: | |
275 *dom_key = DomKey::NUM_LOCK; | |
276 case VKEY_SCROLL: | |
277 *dom_key = DomKey::SCROLL_LOCK; | |
278 case VKEY_LSHIFT: | |
279 case VKEY_RSHIFT: | |
280 *dom_key = DomKey::SHIFT; | |
281 case VKEY_LCONTROL: | |
282 case VKEY_RCONTROL: | |
283 *dom_key = DomKey::CONTROL; | |
284 case VKEY_LMENU: | |
285 case VKEY_RMENU: | |
286 *dom_key = DomKey::ALT; | |
287 case VKEY_BROWSER_BACK: | |
288 *dom_key = DomKey::BROWSER_BACK; | |
289 case VKEY_BROWSER_FORWARD: | |
290 *dom_key = DomKey::BROWSER_FORWARD; | |
291 case VKEY_BROWSER_REFRESH: | |
292 *dom_key = DomKey::BROWSER_REFRESH; | |
293 case VKEY_BROWSER_STOP: | |
294 *dom_key = DomKey::BROWSER_STOP; | |
295 case VKEY_BROWSER_SEARCH: | |
296 *dom_key = DomKey::BROWSER_SEARCH; | |
297 case VKEY_BROWSER_FAVORITES: | |
298 *dom_key = DomKey::BROWSER_FAVORITES; | |
299 case VKEY_BROWSER_HOME: | |
300 *dom_key = DomKey::BROWSER_HOME; | |
301 case VKEY_VOLUME_MUTE: | |
302 *dom_key = DomKey::VOLUME_MUTE; | |
303 case VKEY_VOLUME_DOWN: | |
304 *dom_key = DomKey::VOLUME_DOWN; | |
305 case VKEY_VOLUME_UP: | |
306 *dom_key = DomKey::VOLUME_UP; | |
307 case VKEY_MEDIA_NEXT_TRACK: | |
308 *dom_key = DomKey::MEDIA_TRACK_NEXT; | |
309 case VKEY_MEDIA_PREV_TRACK: | |
310 *dom_key = DomKey::MEDIA_TRACK_PREVIOUS; | |
311 case VKEY_MEDIA_STOP: | |
312 *dom_key = DomKey::MEDIA_STOP; | |
313 case VKEY_MEDIA_PLAY_PAUSE: | |
314 *dom_key = DomKey::MEDIA_PLAY_PAUSE; | |
315 case VKEY_MEDIA_LAUNCH_MAIL: | |
316 *dom_key = DomKey::LAUNCH_MAIL; | |
317 case VKEY_MEDIA_LAUNCH_MEDIA_SELECT: | |
318 *dom_key = DomKey::LAUNCH_MEDIA_PLAYER; | |
319 case VKEY_MEDIA_LAUNCH_APP1: | |
320 *dom_key = DomKey::LAUNCH_MY_COMPUTER; | |
321 case VKEY_MEDIA_LAUNCH_APP2: | |
322 *dom_key = DomKey::LAUNCH_CALCULATOR; | |
323 case VKEY_OEM_8: | |
324 // ISO Level 5 Shift in ChromeOS | |
325 *dom_key = DomKey::SUPER; | |
326 case VKEY_OEM_103: | |
327 *dom_key = DomKey::MEDIA_REWIND; | |
328 case VKEY_OEM_104: | |
329 *dom_key = DomKey::MEDIA_FAST_FORWARD; | |
330 case VKEY_PROCESSKEY: | |
331 *dom_key = DomKey::PROCESS; | |
332 case VKEY_DBE_SBCSCHAR: | |
333 *dom_key = DomKey::HANKAKU; | |
334 case VKEY_DBE_DBCSCHAR: | |
335 *dom_key = DomKey::ZENKAKU; | |
336 case VKEY_ATTN: | |
337 *dom_key = DomKey::ATTN; | |
338 case VKEY_CRSEL: | |
339 *dom_key = DomKey::CR_SEL; | |
340 case VKEY_EXSEL: | |
341 *dom_key = DomKey::EX_SEL; | |
342 case VKEY_EREOF: | |
343 *dom_key = DomKey::ERASE_EOF; | |
344 case VKEY_PLAY: | |
345 *dom_key = DomKey::MEDIA_PLAY; | |
346 case VKEY_ZOOM: | |
347 *dom_key = DomKey::ZOOM_TOGGLE; | |
348 case VKEY_OEM_CLEAR: | |
349 *dom_key = DomKey::CLEAR; | |
350 case VKEY_POWER: | |
351 *dom_key = DomKey::POWER; | |
352 case VKEY_BRIGHTNESS_DOWN: | |
353 *dom_key = DomKey::BRIGHTNESS_DOWN; | |
354 case VKEY_BRIGHTNESS_UP: | |
355 *dom_key = DomKey::BRIGHTNESS_UP; | |
356 case VKEY_ALTGR: | |
357 *dom_key = DomKey::ALT_GRAPH; | |
358 #if defined(USE_X11) | |
359 case VKEY_COMPOSE: | |
360 *dom_key = DomKey::COMPOSE; | |
361 #endif | |
362 // case VKEY_BACKTAB: | |
363 // case VKEY_SLEEP: | |
364 // case VKEY_PACKET: | |
365 // case VKEY_NONAME: | |
366 // case VKEY_PA1: | |
367 // case VKEY_WLAN: // Toggle wifi in ChromeOS | |
368 // case VKEY_KBD_BRIGHTNESS_DOWN: | |
369 // case VKEY_KBD_BRIGHTNESS_UP: | |
112 default: | 370 default: |
113 return 0; | 371 *dom_key = DomKey::UNIDENTIFIED; |
372 return false; | |
114 } | 373 } |
115 } | 374 } |
116 | 375 |
117 } // namespace ui | 376 } // namespace ui |
OLD | NEW |