1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/base/ime/chromeos/ime_keymap.h" 6 7 #include <map> 8 9 #include "base/lazy_instance.h" 10 11 namespace ui { 12 13 namespace { 14 15 const struct KeyCodeTable { 16 KeyboardCode keyboard_code; 17 const char* dom_code; 18 } kKeyCodeTable[] = { 19 {VKEY_BACK, "Backspace"}, 20 {VKEY_TAB, "Tab"}, 21 {VKEY_RETURN, "Enter"}, 22 {VKEY_MENU, "ContextMenu"}, 23 {VKEY_PAUSE, "Pause"}, 24 {VKEY_CAPITAL, "CapsLock"}, 25 {VKEY_KANA, "KanaMode"}, 26 {VKEY_HANGUL, "HangulMode"}, 27 {VKEY_HANJA, "Hanja"}, 28 {VKEY_KANJI, "Kanji"}, 29 {VKEY_ESCAPE, "Escape"}, 30 {VKEY_CONVERT, "Convert"}, 31 {VKEY_NONCONVERT, "NoConvert"}, 32 {VKEY_SPACE, "Space"}, 33 {VKEY_END, "End"}, 34 {VKEY_HOME, "Home"}, 35 {VKEY_LEFT, "ArrowLeft"}, 36 {VKEY_UP, "ArrowUp"}, 37 {VKEY_RIGHT, "ArrowRight"}, 38 {VKEY_DOWN, "ArrowDown"}, 39 {VKEY_PRINT, "PrintScreen"}, 40 {VKEY_INSERT, "Insert"}, 41 {VKEY_DELETE, "Delete"}, 42 {VKEY_HELP, "Help"}, 43 {VKEY_0, "Digit0"}, 44 {VKEY_1, "Digit1"}, 45 {VKEY_2, "Digit2"}, 46 {VKEY_3, "Digit3"}, 47 {VKEY_4, "Digit4"}, 48 {VKEY_5, "Digit5"}, 49 {VKEY_6, "Digit6"}, 50 {VKEY_7, "Digit7"}, 51 {VKEY_8, "Digit8"}, 52 {VKEY_9, "Digit9"}, 53 {VKEY_A, "KeyA"}, 54 {VKEY_B, "KeyB"}, 55 {VKEY_C, "KeyC"}, 56 {VKEY_D, "KeyD"}, 57 {VKEY_E, "KeyE"}, 58 {VKEY_F, "KeyF"}, 59 {VKEY_G, "KeyG"}, 60 {VKEY_H, "KeyH"}, 61 {VKEY_I, "KeyI"}, 62 {VKEY_J, "KeyJ"}, 63 {VKEY_K, "KeyK"}, 64 {VKEY_L, "KeyL"}, 65 {VKEY_M, "KeyM"}, 66 {VKEY_N, "KeyN"}, 67 {VKEY_O, "KeyO"}, 68 {VKEY_P, "KeyP"}, 69 {VKEY_Q, "KeyQ"}, 70 {VKEY_R, "KeyR"}, 71 {VKEY_S, "KeyS"}, 72 {VKEY_T, "KeyT"}, 73 {VKEY_U, "KeyU"}, 74 {VKEY_V, "KeyV"}, 75 {VKEY_W, "KeyW"}, 76 {VKEY_X, "KeyX"}, 77 {VKEY_Y, "KeyY"}, 78 {VKEY_Z, "KeyZ"}, 79 {VKEY_LWIN, "OSLeft"}, 80 {VKEY_RWIN, "OSRight"}, 81 {VKEY_NUMPAD0, "Numpad0"}, 82 {VKEY_NUMPAD1, "Numpad1"}, 83 {VKEY_NUMPAD2, "Numpad2"}, 84 {VKEY_NUMPAD3, "Numpad3"}, 85 {VKEY_NUMPAD4, "Numpad4"}, 86 {VKEY_NUMPAD5, "Numpad5"}, 87 {VKEY_NUMPAD6, "Numpad6"}, 88 {VKEY_NUMPAD7, "Numpad7"}, 89 {VKEY_NUMPAD8, "Numpad8"}, 90 {VKEY_NUMPAD9, "Numpad9"}, 91 {VKEY_MULTIPLY, "NumpadMultiply"}, 92 {VKEY_ADD, "NumpadAdd"}, 93 {VKEY_SUBTRACT, "NumpadSubtract"}, 94 {VKEY_DECIMAL, "NumpadDecimal"}, 95 {VKEY_DIVIDE, "NumpadDivide"}, 96 {VKEY_F1, "F1"}, 97 {VKEY_F2, "F2"}, 98 {VKEY_F3, "F3"}, 99 {VKEY_F4, "F4"}, 100 {VKEY_F5, "F5"}, 101 {VKEY_F6, "F6"}, 102 {VKEY_F7, "F7"}, 103 {VKEY_F8, "F8"}, 104 {VKEY_F9, "F9"}, 105 {VKEY_F10, "F10"}, 106 {VKEY_F11, "F11"}, 107 {VKEY_F12, "F12"}, 108 {VKEY_F13, "F13"}, 109 {VKEY_F14, "F14"}, 110 {VKEY_F15, "F15"}, 111 {VKEY_F16, "F16"}, 112 {VKEY_F17, "F17"}, 113 {VKEY_F18, "F18"}, 114 {VKEY_F19, "F19"}, 115 {VKEY_F20, "F20"}, 116 {VKEY_F21, "F21"}, 117 {VKEY_F22, "F22"}, 118 {VKEY_F23, "F23"}, 119 {VKEY_F24, "F24"}, 120 {VKEY_NUMLOCK, "NumLock"}, 121 {VKEY_SCROLL, "ScrollLock"}, 122 {VKEY_LSHIFT, "ShiftLeft"}, 123 {VKEY_RSHIFT, "ShiftRight"}, 124 {VKEY_LCONTROL, "CtrlLeft"}, 125 {VKEY_RCONTROL, "CtrlRight"}, 126 {VKEY_LMENU, "AltLeft"}, 127 {VKEY_RMENU, "AltRight"}, 128 {VKEY_BROWSER_BACK, "BrowserBack"}, 129 {VKEY_BROWSER_FORWARD, "BrowserForward"}, 130 {VKEY_BROWSER_REFRESH, "BrowserRefresh"}, 131 {VKEY_BROWSER_STOP, "BrowserStop"}, 132 {VKEY_BROWSER_SEARCH, "BrowserSearch"}, 133 {VKEY_BROWSER_HOME, "BrowserHome"}, 134 {VKEY_VOLUME_MUTE, "VolumeMute"}, 135 {VKEY_VOLUME_DOWN, "VolumeDown"}, 136 {VKEY_VOLUME_UP, "VolumeUp"}, 137 {VKEY_BRIGHTNESS_DOWN, "BrightnessDown"}, 138 {VKEY_BRIGHTNESS_UP, "BrightnessUp"}, 139 {VKEY_MEDIA_LAUNCH_APP1, "ChromeOSSwitchWindow"}, 140 {VKEY_MEDIA_LAUNCH_APP2, "ChromeOSFullscreen"}, 141 {VKEY_MEDIA_NEXT_TRACK, "MediaTrackNext"}, 142 {VKEY_MEDIA_PREV_TRACK, "MediaTrackPrevious"}, 143 {VKEY_MEDIA_STOP, "MediaStop"}, 144 {VKEY_MEDIA_PLAY_PAUSE, "MediaPlayPause"}, 145 {VKEY_MEDIA_LAUNCH_MAIL, "LaunchMail"}, 146 {VKEY_OEM_1, "Semicolon"}, 147 {VKEY_OEM_PLUS, "Equal"}, 148 {VKEY_OEM_COMMA, "Comma"}, 149 {VKEY_OEM_MINUS, "Minus"}, 150 {VKEY_OEM_PERIOD, "Period"}, 151 {VKEY_OEM_2, "Slash"}, 152 {VKEY_OEM_3, "Backquote"}, 153 {VKEY_OEM_4, "BracketLeft"}, 154 {VKEY_OEM_5, "Backslash"}, 155 {VKEY_OEM_6, "BracketRight"}, 156 {VKEY_OEM_7, "Quote"}}; 157 158 class KeyCodeMap { 159 public: 160 KeyCodeMap() { 161 for (size_t i = 0; i < arraysize(kKeyCodeTable); ++i) { 162 map_dom_key_[kKeyCodeTable[i].dom_code] = kKeyCodeTable[i].keyboard_code; 163 map_key_dom_[kKeyCodeTable[i].keyboard_code] = kKeyCodeTable[i].dom_code; 164 } 165 } 166 167 KeyboardCode GetKeyboardCode(const std::string& dom_code) const { 168 std::map<std::string, KeyboardCode>::const_iterator it = 169 map_dom_key_.find(dom_code); 170 return (it == map_dom_key_.end()) ? VKEY_UNKNOWN : it->second; 171 } 172 173 std::string GetDomKeycode(KeyboardCode key_code) const { 174 std::map<KeyboardCode, std::string>::const_iterator it = 175 map_key_dom_.find(key_code); 176 return (it == map_key_dom_.end()) ? "" : it->second; 177 } 178 179 private: 180 std::map<std::string, KeyboardCode> map_dom_key_; 181 std::map<KeyboardCode, std::string> map_key_dom_; 182 }; 183 184 base::LazyInstance<KeyCodeMap>::Leaky g_keycode_map = 185 LAZY_INSTANCE_INITIALIZER; 186 187 } // namespace 188 189 KeyboardCode DomKeycodeToKeyboardCode(const std::string& code) { 190 return g_keycode_map.Get().GetKeyboardCode(code); 191 } 192 193 std::string KeyboardCodeToDomKeycode(KeyboardCode code) { 194 return g_keycode_map.Get().GetDomKeycode(code); 195 } 196 197 } // namespace ui 198