| 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..c2b46b3e142ab3a574b5b4f79fbfd1b9345fafa1 100644
|
| --- a/ui/events/keycodes/keyboard_code_conversion.cc
|
| +++ b/ui/events/keycodes/keyboard_code_conversion.cc
|
| @@ -5,112 +5,371 @@
|
| #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) {
|
| + ui::DomKey dom_key;
|
| + uint16 character;
|
| + if (GetInterpretationFromKeyCode(key_code, flags, &dom_key, &character))
|
| + return character;
|
| + return 0;
|
| +}
|
| +
|
| +EVENTS_BASE_EXPORT bool GetInterpretationFromKeyCode(KeyboardCode key_code,
|
| + int flags,
|
| + DomKey* dom_key,
|
| + uint16* 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) {
|
| + 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;
|
| + case VKEY_SHIFT:
|
| + *dom_key = DomKey::SHIFT;
|
| + case VKEY_CONTROL:
|
| + *dom_key = DomKey::CONTROL;
|
| + case VKEY_MENU:
|
| + *dom_key = DomKey::ALT;
|
| + case VKEY_PAUSE:
|
| + *dom_key = DomKey::PAUSE;
|
| + case VKEY_CAPITAL:
|
| + *dom_key = DomKey::CAPS_LOCK;
|
| + case VKEY_KANA:
|
| + // Windows conflates 'KanaMode' and 'HangulMode'
|
| + *dom_key = DomKey::KANA_MODE;
|
| + case VKEY_JUNJA:
|
| + *dom_key = DomKey::JUNJA_MODE;
|
| + case VKEY_FINAL:
|
| + *dom_key = DomKey::FINAL_MODE;
|
| + case VKEY_HANJA:
|
| + // Windows conflates 'HanjaMode' and 'KanjiMode'
|
| + *dom_key = DomKey::HANJA_MODE;
|
| + case VKEY_CONVERT:
|
| + *dom_key = DomKey::CONVERT;
|
| + case VKEY_NONCONVERT:
|
| + *dom_key = DomKey::NON_CONVERT;
|
| + case VKEY_ACCEPT:
|
| + *dom_key = DomKey::ACCEPT;
|
| + case VKEY_MODECHANGE:
|
| + *dom_key = DomKey::MODE_CHANGE;
|
| + case VKEY_PRIOR:
|
| + *dom_key = DomKey::PAGE_UP;
|
| + case VKEY_NEXT:
|
| + *dom_key = DomKey::PAGE_DOWN;
|
| + case VKEY_END:
|
| + *dom_key = DomKey::END;
|
| + case VKEY_HOME:
|
| + *dom_key = DomKey::HOME;
|
| + case VKEY_LEFT:
|
| + *dom_key = DomKey::ARROW_LEFT;
|
| + case VKEY_UP:
|
| + *dom_key = DomKey::ARROW_UP;
|
| + case VKEY_RIGHT:
|
| + *dom_key = DomKey::ARROW_RIGHT;
|
| + case VKEY_DOWN:
|
| + *dom_key = DomKey::ARROW_DOWN;
|
| + case VKEY_SELECT:
|
| + *dom_key = DomKey::SELECT;
|
| + case VKEY_PRINT:
|
| + *dom_key = DomKey::PRINT;
|
| + case VKEY_EXECUTE:
|
| + *dom_key = DomKey::EXECUTE;
|
| + case VKEY_SNAPSHOT:
|
| + *dom_key = DomKey::PRINT_SCREEN;
|
| + case VKEY_INSERT:
|
| + *dom_key = DomKey::INSERT;
|
| + case VKEY_DELETE:
|
| + *dom_key = DomKey::DEL;
|
| + case VKEY_HELP:
|
| + *dom_key = DomKey::HELP;
|
| + case VKEY_LWIN:
|
| + case VKEY_RWIN:
|
| + *dom_key = DomKey::OS;
|
| + case VKEY_APPS:
|
| + *dom_key = DomKey::MEDIA_APPS;
|
| + case VKEY_NUMLOCK:
|
| + *dom_key = DomKey::NUM_LOCK;
|
| + case VKEY_SCROLL:
|
| + *dom_key = DomKey::SCROLL_LOCK;
|
| + case VKEY_LSHIFT:
|
| + case VKEY_RSHIFT:
|
| + *dom_key = DomKey::SHIFT;
|
| + case VKEY_LCONTROL:
|
| + case VKEY_RCONTROL:
|
| + *dom_key = DomKey::CONTROL;
|
| + case VKEY_LMENU:
|
| + case VKEY_RMENU:
|
| + *dom_key = DomKey::ALT;
|
| + case VKEY_BROWSER_BACK:
|
| + *dom_key = DomKey::BROWSER_BACK;
|
| + case VKEY_BROWSER_FORWARD:
|
| + *dom_key = DomKey::BROWSER_FORWARD;
|
| + case VKEY_BROWSER_REFRESH:
|
| + *dom_key = DomKey::BROWSER_REFRESH;
|
| + case VKEY_BROWSER_STOP:
|
| + *dom_key = DomKey::BROWSER_STOP;
|
| + case VKEY_BROWSER_SEARCH:
|
| + *dom_key = DomKey::BROWSER_SEARCH;
|
| + case VKEY_BROWSER_FAVORITES:
|
| + *dom_key = DomKey::BROWSER_FAVORITES;
|
| + case VKEY_BROWSER_HOME:
|
| + *dom_key = DomKey::BROWSER_HOME;
|
| + case VKEY_VOLUME_MUTE:
|
| + *dom_key = DomKey::VOLUME_MUTE;
|
| + case VKEY_VOLUME_DOWN:
|
| + *dom_key = DomKey::VOLUME_DOWN;
|
| + case VKEY_VOLUME_UP:
|
| + *dom_key = DomKey::VOLUME_UP;
|
| + case VKEY_MEDIA_NEXT_TRACK:
|
| + *dom_key = DomKey::MEDIA_TRACK_NEXT;
|
| + case VKEY_MEDIA_PREV_TRACK:
|
| + *dom_key = DomKey::MEDIA_TRACK_PREVIOUS;
|
| + case VKEY_MEDIA_STOP:
|
| + *dom_key = DomKey::MEDIA_STOP;
|
| + case VKEY_MEDIA_PLAY_PAUSE:
|
| + *dom_key = DomKey::MEDIA_PLAY_PAUSE;
|
| + case VKEY_MEDIA_LAUNCH_MAIL:
|
| + *dom_key = DomKey::LAUNCH_MAIL;
|
| + case VKEY_MEDIA_LAUNCH_MEDIA_SELECT:
|
| + *dom_key = DomKey::LAUNCH_MEDIA_PLAYER;
|
| + case VKEY_MEDIA_LAUNCH_APP1:
|
| + *dom_key = DomKey::LAUNCH_MY_COMPUTER;
|
| + case VKEY_MEDIA_LAUNCH_APP2:
|
| + *dom_key = DomKey::LAUNCH_CALCULATOR;
|
| + case VKEY_OEM_8:
|
| + // ISO Level 5 Shift in ChromeOS
|
| + *dom_key = DomKey::SUPER;
|
| + case VKEY_OEM_103:
|
| + *dom_key = DomKey::MEDIA_REWIND;
|
| + case VKEY_OEM_104:
|
| + *dom_key = DomKey::MEDIA_FAST_FORWARD;
|
| + case VKEY_PROCESSKEY:
|
| + *dom_key = DomKey::PROCESS;
|
| + case VKEY_DBE_SBCSCHAR:
|
| + *dom_key = DomKey::HANKAKU;
|
| + case VKEY_DBE_DBCSCHAR:
|
| + *dom_key = DomKey::ZENKAKU;
|
| + case VKEY_ATTN:
|
| + *dom_key = DomKey::ATTN;
|
| + case VKEY_CRSEL:
|
| + *dom_key = DomKey::CR_SEL;
|
| + case VKEY_EXSEL:
|
| + *dom_key = DomKey::EX_SEL;
|
| + case VKEY_EREOF:
|
| + *dom_key = DomKey::ERASE_EOF;
|
| + case VKEY_PLAY:
|
| + *dom_key = DomKey::MEDIA_PLAY;
|
| + case VKEY_ZOOM:
|
| + *dom_key = DomKey::ZOOM_TOGGLE;
|
| + case VKEY_OEM_CLEAR:
|
| + *dom_key = DomKey::CLEAR;
|
| + case VKEY_POWER:
|
| + *dom_key = DomKey::POWER;
|
| + case VKEY_BRIGHTNESS_DOWN:
|
| + *dom_key = DomKey::BRIGHTNESS_DOWN;
|
| + case VKEY_BRIGHTNESS_UP:
|
| + *dom_key = DomKey::BRIGHTNESS_UP;
|
| + case VKEY_ALTGR:
|
| + *dom_key = DomKey::ALT_GRAPH;
|
| +#if defined(USE_X11)
|
| + case VKEY_COMPOSE:
|
| + *dom_key = DomKey::COMPOSE;
|
| +#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;
|
| }
|
| }
|
|
|
|
|