Index: ui/events/keycodes/keyboard_code_conversion.cc |
diff --git a/ui/events/keycodes/keyboard_code_conversion.cc b/ui/events/keycodes/keyboard_code_conversion.cc |
index e7b067c5c9f75470a7bd654d3cabd586c3d5868a..ee41cb4849eaaeb387047ac956ed56e3fff663e3 100644 |
--- a/ui/events/keycodes/keyboard_code_conversion.cc |
+++ b/ui/events/keycodes/keyboard_code_conversion.cc |
@@ -5,112 +5,447 @@ |
#include "ui/events/keycodes/keyboard_code_conversion.h" |
#include "ui/events/event_constants.h" |
+#include "ui/events/keycodes/dom3/dom_key.h" |
namespace ui { |
-uint16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags) { |
+base::char16 GetCharacterFromKeyCode(KeyboardCode key_code, int flags) { |
+ ui::DomKey dom_key; |
+ base::char16 character; |
+ if (GetMeaningFromKeyCode(key_code, flags, &dom_key, &character)) |
+ return character; |
+ return 0; |
+} |
+ |
+EVENTS_BASE_EXPORT bool GetMeaningFromKeyCode(KeyboardCode key_code, |
+ int flags, |
+ DomKey* dom_key, |
+ base::char16* character) { |
const bool ctrl = (flags & EF_CONTROL_DOWN) != 0; |
const bool shift = (flags & EF_SHIFT_DOWN) != 0; |
const bool upper = shift ^ ((flags & EF_CAPS_LOCK_DOWN) != 0); |
- // Following Windows behavior to map ctrl-a ~ ctrl-z to \x01 ~ \x1A. |
- if (key_code >= VKEY_A && key_code <= VKEY_Z) { |
- return static_cast<uint16> |
- (key_code - VKEY_A + (ctrl ? 1 : (upper ? 'A' : 'a'))); |
- } |
- |
- // Other ctrl characters |
+ // Control characters. |
if (ctrl) { |
+ // Following Windows behavior to map ctrl-a ~ ctrl-z to \x01 ~ \x1A. |
+ if (key_code >= VKEY_A && key_code <= VKEY_Z) { |
+ *character = static_cast<uint16>(key_code - VKEY_A + 1); |
+ switch (key_code) { |
+ case VKEY_H: |
+ *dom_key = DomKey::BACKSPACE; |
+ break; |
+ case VKEY_I: |
+ *dom_key = DomKey::TAB; |
+ break; |
+ case VKEY_J: |
+ case VKEY_M: |
+ *dom_key = DomKey::ENTER; |
+ break; |
+ default: |
+ *dom_key = DomKey::CHARACTER; |
+ break; |
+ } |
+ return true; |
+ } |
+ // Other ctrl characters |
if (shift) { |
// following graphics chars require shift key to input. |
switch (key_code) { |
// ctrl-@ maps to \x00 (Null byte) |
case VKEY_2: |
- return 0; |
+ *dom_key = DomKey::CHARACTER; |
+ *character = 0; |
+ return true; |
// ctrl-^ maps to \x1E (Record separator, Information separator two) |
case VKEY_6: |
- return 0x1E; |
+ *dom_key = DomKey::CHARACTER; |
+ *character = 0x1E; |
+ return true; |
// ctrl-_ maps to \x1F (Unit separator, Information separator one) |
case VKEY_OEM_MINUS: |
- return 0x1F; |
+ *dom_key = DomKey::CHARACTER; |
+ *character = 0x1F; |
+ return true; |
// Returns 0 for all other keys to avoid inputting unexpected chars. |
default: |
- return 0; |
+ *dom_key = DomKey::UNIDENTIFIED; |
+ *character = 0; |
+ return false; |
} |
} else { |
switch (key_code) { |
// ctrl-[ maps to \x1B (Escape) |
case VKEY_OEM_4: |
- return 0x1B; |
+ *dom_key = DomKey::ESCAPE; |
+ *character = 0x1B; |
+ return true; |
// ctrl-\ maps to \x1C (File separator, Information separator four) |
case VKEY_OEM_5: |
- return 0x1C; |
+ *dom_key = DomKey::CHARACTER; |
+ *character = 0x1C; |
+ return true; |
// ctrl-] maps to \x1D (Group separator, Information separator three) |
case VKEY_OEM_6: |
- return 0x1D; |
+ *dom_key = DomKey::CHARACTER; |
+ *character = 0x1D; |
+ return true; |
// ctrl-Enter maps to \x0A (Line feed) |
case VKEY_RETURN: |
- return 0x0A; |
+ *dom_key = DomKey::CHARACTER; |
+ *character = 0x0A; |
+ return true; |
// Returns 0 for all other keys to avoid inputting unexpected chars. |
default: |
- return 0; |
+ *dom_key = DomKey::UNIDENTIFIED; |
+ *character = 0; |
+ return false; |
} |
} |
} |
- // For IME support. |
- if (key_code == ui::VKEY_PROCESSKEY) |
- return 0xE5; |
- |
// Normal characters |
+ if (key_code >= VKEY_A && key_code <= VKEY_Z) { |
+ *dom_key = DomKey::CHARACTER; |
+ *character = static_cast<uint16>(key_code - VKEY_A + (upper ? 'A' : 'a')); |
+ return true; |
+ } |
if (key_code >= VKEY_0 && key_code <= VKEY_9) { |
- return shift ? ")!@#$%^&*("[key_code - VKEY_0] : |
- static_cast<uint16>(key_code); |
- } else if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) { |
- return static_cast<uint16>(key_code - VKEY_NUMPAD0 + '0'); |
+ *dom_key = DomKey::CHARACTER; |
+ *character = |
+ shift ? ")!@#$%^&*("[key_code - VKEY_0] : static_cast<uint16>(key_code); |
+ return true; |
+ } |
+ if (key_code >= VKEY_NUMPAD0 && key_code <= VKEY_NUMPAD9) { |
+ *dom_key = DomKey::CHARACTER; |
+ *character = static_cast<uint16>(key_code - VKEY_NUMPAD0 + '0'); |
+ return true; |
} |
+ // Function keys |
+ if (key_code >= VKEY_F1 && key_code <= VKEY_F24) { |
+ *dom_key = |
+ static_cast<DomKey>(key_code - VKEY_F1 + static_cast<int>(DomKey::F1)); |
+ *character = 0; |
+ return true; |
+ } |
+ |
+ // Isolated characters. |
+ *dom_key = DomKey::CHARACTER; |
+ *character = 0; |
switch (key_code) { |
Wez
2014/12/09 07:00:33
The switches in these functions feels like they'd
kpschoedel
2014/12/09 19:58:43
OK. I agree tables are generally clearer. (Histori
|
+ case VKEY_BACK: |
+ *dom_key = DomKey::BACKSPACE; |
+ *character = '\b'; |
+ return true; |
case VKEY_TAB: |
- return '\t'; |
+ *dom_key = DomKey::TAB; |
+ *character = '\t'; |
+ return true; |
case VKEY_RETURN: |
- return '\r'; |
+ *dom_key = DomKey::ENTER; |
+ *character = '\r'; |
+ return true; |
+ case VKEY_ESCAPE: |
+ *dom_key = DomKey::ESCAPE; |
+ *character = 0x1B; |
+ return true; |
+ case VKEY_SPACE: |
+ *character = ' '; |
+ return true; |
case VKEY_MULTIPLY: |
- return '*'; |
+ *character = '*'; |
+ return true; |
case VKEY_ADD: |
- return '+'; |
+ *character = '+'; |
+ return true; |
+ case VKEY_SEPARATOR: |
+ *character = ','; |
+ return true; |
case VKEY_SUBTRACT: |
- return '-'; |
+ *character = '-'; |
+ return true; |
case VKEY_DECIMAL: |
- return '.'; |
+ *character = '.'; |
+ return true; |
case VKEY_DIVIDE: |
- return '/'; |
- case VKEY_SPACE: |
- return ' '; |
+ *character = '/'; |
+ return true; |
case VKEY_OEM_1: |
- return shift ? ':' : ';'; |
+ *character = shift ? ':' : ';'; |
+ return true; |
case VKEY_OEM_PLUS: |
- return shift ? '+' : '='; |
+ *character = shift ? '+' : '='; |
+ return true; |
case VKEY_OEM_COMMA: |
- return shift ? '<' : ','; |
+ *character = shift ? '<' : ','; |
+ return true; |
case VKEY_OEM_MINUS: |
- return shift ? '_' : '-'; |
+ *character = shift ? '_' : '-'; |
+ return true; |
case VKEY_OEM_PERIOD: |
- return shift ? '>' : '.'; |
+ *character = shift ? '>' : '.'; |
+ return true; |
case VKEY_OEM_2: |
- return shift ? '?' : '/'; |
+ *character = shift ? '?' : '/'; |
+ return true; |
case VKEY_OEM_3: |
- return shift ? '~' : '`'; |
+ *character = shift ? '~' : '`'; |
+ return true; |
case VKEY_OEM_4: |
- return shift ? '{' : '['; |
+ *character = shift ? '{' : '['; |
+ return true; |
case VKEY_OEM_5: |
- return shift ? '|' : '\\'; |
+ *character = shift ? '|' : '\\'; |
+ return true; |
case VKEY_OEM_6: |
- return shift ? '}' : ']'; |
+ *character = shift ? '}' : ']'; |
+ return true; |
case VKEY_OEM_7: |
- return shift ? '"' : '\''; |
+ *character = shift ? '"' : '\''; |
+ return true; |
+ case VKEY_OEM_102: |
+ *character = shift ? '>' : '<'; |
+ return true; |
+ case VKEY_CLEAR: |
+ *dom_key = DomKey::CLEAR; |
+ return true; |
+ case VKEY_SHIFT: |
+ *dom_key = DomKey::SHIFT; |
+ return true; |
+ case VKEY_CONTROL: |
+ *dom_key = DomKey::CONTROL; |
+ return true; |
+ case VKEY_MENU: |
+ *dom_key = DomKey::ALT; |
+ return true; |
+ case VKEY_PAUSE: |
+ *dom_key = DomKey::PAUSE; |
+ return true; |
+ case VKEY_CAPITAL: |
+ *dom_key = DomKey::CAPS_LOCK; |
+ return true; |
+ case VKEY_KANA: |
+ // Windows conflates 'KanaMode' and 'HangulMode' |
+ *dom_key = DomKey::KANA_MODE; |
+ return true; |
+ case VKEY_JUNJA: |
+ *dom_key = DomKey::JUNJA_MODE; |
+ return true; |
+ case VKEY_FINAL: |
+ *dom_key = DomKey::FINAL_MODE; |
+ return true; |
+ case VKEY_HANJA: |
+ // Windows conflates 'HanjaMode' and 'KanjiMode' |
+ *dom_key = DomKey::HANJA_MODE; |
+ return true; |
+ case VKEY_CONVERT: |
+ *dom_key = DomKey::CONVERT; |
+ return true; |
+ case VKEY_NONCONVERT: |
+ *dom_key = DomKey::NON_CONVERT; |
+ return true; |
+ case VKEY_ACCEPT: |
+ *dom_key = DomKey::ACCEPT; |
+ return true; |
+ case VKEY_MODECHANGE: |
+ *dom_key = DomKey::MODE_CHANGE; |
+ return true; |
+ case VKEY_PRIOR: |
+ *dom_key = DomKey::PAGE_UP; |
+ return true; |
+ case VKEY_NEXT: |
+ *dom_key = DomKey::PAGE_DOWN; |
+ return true; |
+ case VKEY_END: |
+ *dom_key = DomKey::END; |
+ return true; |
+ case VKEY_HOME: |
+ *dom_key = DomKey::HOME; |
+ return true; |
+ case VKEY_LEFT: |
+ *dom_key = DomKey::ARROW_LEFT; |
+ return true; |
+ case VKEY_UP: |
+ *dom_key = DomKey::ARROW_UP; |
+ return true; |
+ case VKEY_RIGHT: |
+ *dom_key = DomKey::ARROW_RIGHT; |
+ return true; |
+ case VKEY_DOWN: |
+ *dom_key = DomKey::ARROW_DOWN; |
+ return true; |
+ case VKEY_SELECT: |
+ *dom_key = DomKey::SELECT; |
+ return true; |
+ case VKEY_PRINT: |
+ *dom_key = DomKey::PRINT; |
+ return true; |
+ case VKEY_EXECUTE: |
+ *dom_key = DomKey::EXECUTE; |
+ return true; |
+ case VKEY_SNAPSHOT: |
+ *dom_key = DomKey::PRINT_SCREEN; |
+ return true; |
+ case VKEY_INSERT: |
+ *dom_key = DomKey::INSERT; |
+ return true; |
+ case VKEY_DELETE: |
+ *dom_key = DomKey::DEL; |
+ return true; |
+ case VKEY_HELP: |
+ *dom_key = DomKey::HELP; |
+ return true; |
+ case VKEY_LWIN: |
+ case VKEY_RWIN: |
+ *dom_key = DomKey::OS; |
+ return true; |
+ case VKEY_APPS: |
+ *dom_key = DomKey::MEDIA_APPS; |
+ return true; |
+ case VKEY_NUMLOCK: |
+ *dom_key = DomKey::NUM_LOCK; |
+ return true; |
+ case VKEY_SCROLL: |
+ *dom_key = DomKey::SCROLL_LOCK; |
+ return true; |
+ case VKEY_LSHIFT: |
+ case VKEY_RSHIFT: |
+ *dom_key = DomKey::SHIFT; |
+ return true; |
+ case VKEY_LCONTROL: |
+ case VKEY_RCONTROL: |
+ *dom_key = DomKey::CONTROL; |
+ return true; |
+ case VKEY_LMENU: |
+ case VKEY_RMENU: |
+ *dom_key = DomKey::ALT; |
+ return true; |
+ case VKEY_BROWSER_BACK: |
+ *dom_key = DomKey::BROWSER_BACK; |
+ return true; |
+ case VKEY_BROWSER_FORWARD: |
+ *dom_key = DomKey::BROWSER_FORWARD; |
+ return true; |
+ case VKEY_BROWSER_REFRESH: |
+ *dom_key = DomKey::BROWSER_REFRESH; |
+ return true; |
+ case VKEY_BROWSER_STOP: |
+ *dom_key = DomKey::BROWSER_STOP; |
+ return true; |
+ case VKEY_BROWSER_SEARCH: |
+ *dom_key = DomKey::BROWSER_SEARCH; |
+ return true; |
+ case VKEY_BROWSER_FAVORITES: |
+ *dom_key = DomKey::BROWSER_FAVORITES; |
+ return true; |
+ case VKEY_BROWSER_HOME: |
+ *dom_key = DomKey::BROWSER_HOME; |
+ return true; |
+ case VKEY_VOLUME_MUTE: |
+ *dom_key = DomKey::VOLUME_MUTE; |
+ return true; |
+ case VKEY_VOLUME_DOWN: |
+ *dom_key = DomKey::VOLUME_DOWN; |
+ return true; |
+ case VKEY_VOLUME_UP: |
+ *dom_key = DomKey::VOLUME_UP; |
+ return true; |
+ case VKEY_MEDIA_NEXT_TRACK: |
+ *dom_key = DomKey::MEDIA_TRACK_NEXT; |
+ return true; |
+ case VKEY_MEDIA_PREV_TRACK: |
+ *dom_key = DomKey::MEDIA_TRACK_PREVIOUS; |
+ return true; |
+ case VKEY_MEDIA_STOP: |
+ *dom_key = DomKey::MEDIA_STOP; |
+ return true; |
+ case VKEY_MEDIA_PLAY_PAUSE: |
+ *dom_key = DomKey::MEDIA_PLAY_PAUSE; |
+ return true; |
+ case VKEY_MEDIA_LAUNCH_MAIL: |
+ *dom_key = DomKey::LAUNCH_MAIL; |
+ return true; |
+ case VKEY_MEDIA_LAUNCH_MEDIA_SELECT: |
+ *dom_key = DomKey::LAUNCH_MEDIA_PLAYER; |
+ return true; |
+ case VKEY_MEDIA_LAUNCH_APP1: |
+ *dom_key = DomKey::LAUNCH_MY_COMPUTER; |
+ return true; |
+ case VKEY_MEDIA_LAUNCH_APP2: |
+ *dom_key = DomKey::LAUNCH_CALCULATOR; |
+ return true; |
+ case VKEY_OEM_8: |
+ // ISO Level 5 Shift in ChromeOS |
+ *dom_key = DomKey::SUPER; |
+ return true; |
+#if defined(OS_POSIX) |
+ case VKEY_OEM_103: |
+ *dom_key = DomKey::MEDIA_REWIND; |
+ return true; |
+ case VKEY_OEM_104: |
+ *dom_key = DomKey::MEDIA_FAST_FORWARD; |
+ return true; |
+#endif |
+ case VKEY_PROCESSKEY: |
+ *dom_key = DomKey::PROCESS; |
+ return true; |
+ case VKEY_DBE_SBCSCHAR: |
+ *dom_key = DomKey::HANKAKU; |
+ return true; |
+ case VKEY_DBE_DBCSCHAR: |
+ *dom_key = DomKey::ZENKAKU; |
+ return true; |
+ case VKEY_ATTN: |
+ *dom_key = DomKey::ATTN; |
+ return true; |
+ case VKEY_CRSEL: |
+ *dom_key = DomKey::CR_SEL; |
+ return true; |
+ case VKEY_EXSEL: |
+ *dom_key = DomKey::EX_SEL; |
+ return true; |
+ case VKEY_EREOF: |
+ *dom_key = DomKey::ERASE_EOF; |
+ return true; |
+ case VKEY_PLAY: |
+ *dom_key = DomKey::MEDIA_PLAY; |
+ return true; |
+ case VKEY_ZOOM: |
+ *dom_key = DomKey::ZOOM_TOGGLE; |
+ return true; |
+ case VKEY_OEM_CLEAR: |
+ *dom_key = DomKey::CLEAR; |
+ return true; |
+#if defined(OS_POSIX) |
+ case VKEY_POWER: |
+ *dom_key = DomKey::POWER; |
+ return true; |
+ case VKEY_BRIGHTNESS_DOWN: |
+ *dom_key = DomKey::BRIGHTNESS_DOWN; |
+ return true; |
+ case VKEY_BRIGHTNESS_UP: |
+ *dom_key = DomKey::BRIGHTNESS_UP; |
+ return true; |
+#endif |
+ case VKEY_ALTGR: |
+ *dom_key = DomKey::ALT_GRAPH; |
+ return true; |
+#if defined(OS_POSIX) |
+ case VKEY_COMPOSE: |
+ *dom_key = DomKey::COMPOSE; |
+ return true; |
+#endif |
+ // case VKEY_BACKTAB: |
+ // case VKEY_SLEEP: |
+ // case VKEY_PACKET: |
+ // case VKEY_NONAME: |
+ // case VKEY_PA1: |
+ // case VKEY_WLAN: // Toggle wifi in ChromeOS |
+ // case VKEY_KBD_BRIGHTNESS_DOWN: |
+ // case VKEY_KBD_BRIGHTNESS_UP: |
default: |
- return 0; |
+ *dom_key = DomKey::UNIDENTIFIED; |
+ return false; |
} |
} |