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