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