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 (GetInterpretationFromKeyCode(key_code, flags, &dom_key, &character)) |
| 16 return character; |
| 17 return 0; |
| 18 } |
| 19 |
| 20 EVENTS_BASE_EXPORT bool GetInterpretationFromKeyCode(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; |
| 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 |