// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ui/base/ime/chromeos/ime_keymap.h" #include <map> #include "base/lazy_instance.h" namespace ui { namespace { const struct KeyCodeTable { KeyboardCode keyboard_code; const char* dom_code; } kKeyCodeTable[] = { {VKEY_BACK, "Backspace"}, {VKEY_TAB, "Tab"}, {VKEY_RETURN, "Enter"}, {VKEY_MENU, "ContextMenu"}, {VKEY_PAUSE, "Pause"}, {VKEY_CAPITAL, "CapsLock"}, {VKEY_KANA, "KanaMode"}, {VKEY_HANGUL, "HangulMode"}, {VKEY_HANJA, "Hanja"}, {VKEY_KANJI, "Kanji"}, {VKEY_ESCAPE, "Escape"}, {VKEY_CONVERT, "Convert"}, {VKEY_NONCONVERT, "NoConvert"}, {VKEY_SPACE, "Space"}, {VKEY_END, "End"}, {VKEY_HOME, "Home"}, {VKEY_LEFT, "ArrowLeft"}, {VKEY_UP, "ArrowUp"}, {VKEY_RIGHT, "ArrowRight"}, {VKEY_DOWN, "ArrowDown"}, {VKEY_PRINT, "PrintScreen"}, {VKEY_INSERT, "Insert"}, {VKEY_DELETE, "Delete"}, {VKEY_HELP, "Help"}, {VKEY_0, "Digit0"}, {VKEY_1, "Digit1"}, {VKEY_2, "Digit2"}, {VKEY_3, "Digit3"}, {VKEY_4, "Digit4"}, {VKEY_5, "Digit5"}, {VKEY_6, "Digit6"}, {VKEY_7, "Digit7"}, {VKEY_8, "Digit8"}, {VKEY_9, "Digit9"}, {VKEY_A, "KeyA"}, {VKEY_B, "KeyB"}, {VKEY_C, "KeyC"}, {VKEY_D, "KeyD"}, {VKEY_E, "KeyE"}, {VKEY_F, "KeyF"}, {VKEY_G, "KeyG"}, {VKEY_H, "KeyH"}, {VKEY_I, "KeyI"}, {VKEY_J, "KeyJ"}, {VKEY_K, "KeyK"}, {VKEY_L, "KeyL"}, {VKEY_M, "KeyM"}, {VKEY_N, "KeyN"}, {VKEY_O, "KeyO"}, {VKEY_P, "KeyP"}, {VKEY_Q, "KeyQ"}, {VKEY_R, "KeyR"}, {VKEY_S, "KeyS"}, {VKEY_T, "KeyT"}, {VKEY_U, "KeyU"}, {VKEY_V, "KeyV"}, {VKEY_W, "KeyW"}, {VKEY_X, "KeyX"}, {VKEY_Y, "KeyY"}, {VKEY_Z, "KeyZ"}, {VKEY_LWIN, "OSLeft"}, {VKEY_RWIN, "OSRight"}, {VKEY_NUMPAD0, "Numpad0"}, {VKEY_NUMPAD1, "Numpad1"}, {VKEY_NUMPAD2, "Numpad2"}, {VKEY_NUMPAD3, "Numpad3"}, {VKEY_NUMPAD4, "Numpad4"}, {VKEY_NUMPAD5, "Numpad5"}, {VKEY_NUMPAD6, "Numpad6"}, {VKEY_NUMPAD7, "Numpad7"}, {VKEY_NUMPAD8, "Numpad8"}, {VKEY_NUMPAD9, "Numpad9"}, {VKEY_MULTIPLY, "NumpadMultiply"}, {VKEY_ADD, "NumpadAdd"}, {VKEY_SUBTRACT, "NumpadSubtract"}, {VKEY_DECIMAL, "NumpadDecimal"}, {VKEY_DIVIDE, "NumpadDivide"}, {VKEY_F1, "F1"}, {VKEY_F2, "F2"}, {VKEY_F3, "F3"}, {VKEY_F4, "F4"}, {VKEY_F5, "F5"}, {VKEY_F6, "F6"}, {VKEY_F7, "F7"}, {VKEY_F8, "F8"}, {VKEY_F9, "F9"}, {VKEY_F10, "F10"}, {VKEY_F11, "F11"}, {VKEY_F12, "F12"}, {VKEY_F13, "F13"}, {VKEY_F14, "F14"}, {VKEY_F15, "F15"}, {VKEY_F16, "F16"}, {VKEY_F17, "F17"}, {VKEY_F18, "F18"}, {VKEY_F19, "F19"}, {VKEY_F20, "F20"}, {VKEY_F21, "F21"}, {VKEY_F22, "F22"}, {VKEY_F23, "F23"}, {VKEY_F24, "F24"}, {VKEY_NUMLOCK, "NumLock"}, {VKEY_SCROLL, "ScrollLock"}, {VKEY_LSHIFT, "ShiftLeft"}, {VKEY_RSHIFT, "ShiftRight"}, {VKEY_LCONTROL, "CtrlLeft"}, {VKEY_RCONTROL, "CtrlRight"}, {VKEY_LMENU, "AltLeft"}, {VKEY_RMENU, "AltRight"}, {VKEY_BROWSER_BACK, "BrowserBack"}, {VKEY_BROWSER_FORWARD, "BrowserForward"}, {VKEY_BROWSER_REFRESH, "BrowserRefresh"}, {VKEY_BROWSER_STOP, "BrowserStop"}, {VKEY_BROWSER_SEARCH, "BrowserSearch"}, {VKEY_BROWSER_HOME, "BrowserHome"}, {VKEY_VOLUME_MUTE, "VolumeMute"}, {VKEY_VOLUME_DOWN, "VolumeDown"}, {VKEY_VOLUME_UP, "VolumeUp"}, {VKEY_BRIGHTNESS_DOWN, "BrightnessDown"}, {VKEY_BRIGHTNESS_UP, "BrightnessUp"}, {VKEY_MEDIA_LAUNCH_APP1, "ChromeOSSwitchWindow"}, {VKEY_MEDIA_LAUNCH_APP2, "ChromeOSFullscreen"}, {VKEY_MEDIA_NEXT_TRACK, "MediaTrackNext"}, {VKEY_MEDIA_PREV_TRACK, "MediaTrackPrevious"}, {VKEY_MEDIA_STOP, "MediaStop"}, {VKEY_MEDIA_PLAY_PAUSE, "MediaPlayPause"}, {VKEY_MEDIA_LAUNCH_MAIL, "LaunchMail"}, {VKEY_OEM_1, "Semicolon"}, {VKEY_OEM_PLUS, "Equal"}, {VKEY_OEM_COMMA, "Comma"}, {VKEY_OEM_MINUS, "Minus"}, {VKEY_OEM_PERIOD, "Period"}, {VKEY_OEM_2, "Slash"}, {VKEY_OEM_3, "Backquote"}, {VKEY_OEM_4, "BracketLeft"}, {VKEY_OEM_5, "Backslash"}, {VKEY_OEM_6, "BracketRight"}, {VKEY_OEM_7, "Quote"}}; class KeyCodeMap { public: KeyCodeMap() { for (size_t i = 0; i < arraysize(kKeyCodeTable); ++i) { map_dom_key_[kKeyCodeTable[i].dom_code] = kKeyCodeTable[i].keyboard_code; map_key_dom_[kKeyCodeTable[i].keyboard_code] = kKeyCodeTable[i].dom_code; } } KeyboardCode GetKeyboardCode(const std::string& dom_code) const { std::map<std::string, KeyboardCode>::const_iterator it = map_dom_key_.find(dom_code); return (it == map_dom_key_.end()) ? VKEY_UNKNOWN : it->second; } std::string GetDomKeycode(KeyboardCode key_code) const { std::map<KeyboardCode, std::string>::const_iterator it = map_key_dom_.find(key_code); return (it == map_key_dom_.end()) ? "" : it->second; } private: std::map<std::string, KeyboardCode> map_dom_key_; std::map<KeyboardCode, std::string> map_key_dom_; }; base::LazyInstance<KeyCodeMap>::Leaky g_keycode_map = LAZY_INSTANCE_INITIALIZER; } // namespace KeyboardCode DomKeycodeToKeyboardCode(const std::string& code) { return g_keycode_map.Get().GetKeyboardCode(code); } std::string KeyboardCodeToDomKeycode(KeyboardCode code) { return g_keycode_map.Get().GetDomKeycode(code); } } // namespace ui