Index: ui/base/ime/chromeos/ime_keymap.cc |
diff --git a/ui/base/ime/chromeos/ime_keymap.cc b/ui/base/ime/chromeos/ime_keymap.cc |
index 16b32f328ad8ee2d98f6df0da022135e5d7c2dbd..d21c64704b8f21beed35ffcda8b9bacf7bbbc33b 100644 |
--- a/ui/base/ime/chromeos/ime_keymap.cc |
+++ b/ui/base/ime/chromeos/ime_keymap.cc |
@@ -4,98 +4,175 @@ |
#include "ui/base/ime/chromeos/ime_keymap.h" |
-#define XK_MISCELLANY |
-#include <X11/keysymdef.h> |
-#include <X11/XF86keysym.h> |
+#include <map> |
Yuki
2014/06/16 08:30:45
nit: empty line between standard headers and ours.
Shu Chen
2014/06/16 08:43:14
Done.
|
+#include "base/lazy_instance.h" |
namespace ui { |
-std::string FromXKeycodeToKeyValue(int keyval) { |
- // TODO: Ensure all keys are supported. |
- switch (keyval) { |
- case XK_Escape: |
- return "Esc"; |
- case XK_F1: |
- case XF86XK_Back: |
- return "HistoryBack"; |
- case XK_F2: |
- case XF86XK_Forward: |
- return "HistoryForward"; |
- case XK_F3: |
- case XF86XK_Reload: |
- return "BrowserRefresh"; |
- case XK_F4: |
- case XF86XK_LaunchB: |
- return "ChromeOSFullscreen"; // TODO: Check this value |
- case XK_F5: |
- case XF86XK_LaunchA: |
- return "ChromeOSSwitchWindow"; // TODO: Check this value |
- case XK_F6: |
- case XF86XK_MonBrightnessDown: |
- return "BrightnessDown"; |
- case XK_F7: |
- case XF86XK_MonBrightnessUp: |
- return "BrightnessUp"; |
- case XK_F8: |
- case XF86XK_AudioMute: |
- return "AudioVolumeMute"; |
- case XK_F9: |
- case XF86XK_AudioLowerVolume: |
- return "AudioVolumeDown"; |
- case XK_F10: |
- case XF86XK_AudioRaiseVolume: |
- return "AudioVolumeUp"; |
- case XK_BackSpace: |
- return "Backspace"; |
- case XK_Delete: |
- case XK_KP_Delete: |
- return "Delete"; |
- case XK_Tab: |
- return "Tab"; |
- case XK_KP_Enter: |
- case XK_Return: |
- return "Enter"; |
- case XK_Meta_L: |
- return "BrowserSearch"; |
- case XK_Up: |
- case XK_KP_Up: |
- return "Up"; |
- case XK_Down: |
- case XK_KP_Down: |
- return "Down"; |
- case XK_Left: |
- case XK_KP_Left: |
- return "Left"; |
- case XK_Right: |
- case XK_KP_Right: |
- return "Right"; |
- case XK_Page_Up: |
- return "PageUp"; |
- case XK_Page_Down: |
- return "PageDown"; |
- case XK_Home: |
- return "Home"; |
- case XK_End: |
- return "End"; |
- case XK_Shift_L: |
- case XK_Shift_R: |
- return "Shift"; |
- case XK_Alt_L: |
- case XK_Alt_R: |
- return "Alt"; |
- case XK_Control_L: |
- case XK_Control_R: |
- return "Ctrl"; |
- case XK_Caps_Lock: |
- return "CapsLock"; |
- default: { |
- // TODO: Properly support unicode characters. |
- char value[2]; |
- value[0] = keyval; |
- value[1] = '\0'; |
- return value; |
- } |
+namespace { |
+ |
+const struct KeyCodeMap { |
+ KeyboardCode keyboard_code; |
+ const char* dom_code; |
+} kKeyCodeMap[] = {{VKEY_BACK, "Backspace"}, |
Yuki
2014/06/16 08:30:46
nit: Seems better to break just before "{VKEY_BACK
Shu Chen
2014/06/16 08:43:14
Done.
|
+ {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_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 KeyCodeMapWrapper { |
Yuki
2014/06/16 08:30:45
You can name this class "KeycodeMap" and the data
Shu Chen
2014/06/16 08:43:14
Done.
|
+ public: |
+ KeyCodeMapWrapper() { |
+ for (size_t i = 0; i < arraysize(kKeyCodeMap); ++i) |
+ map_[kKeyCodeMap[i].dom_code] = kKeyCodeMap[i].keyboard_code; |
+ } |
+ |
+ KeyboardCode GetKeyboardCode(const std::string& dom_code) { |
Yuki
2014/06/16 08:30:46
nit: Can be a const method.
Shu Chen
2014/06/16 08:43:14
Done.
|
+ std::map<std::string, KeyboardCode>::const_iterator it = |
+ map_.find(dom_code); |
+ return (it == map_.end()) ? VKEY_UNKNOWN : it->second; |
} |
+ |
+ private: |
+ std::map<std::string, KeyboardCode> map_; |
+}; |
+ |
+static base::LazyInstance<KeyCodeMapWrapper> |
Yuki
2014/06/16 08:30:45
You don't need "static" here because it's inside a
Yuki
2014/06/16 08:30:45
I think this can be leaky. You can use base::Lazy
Shu Chen
2014/06/16 08:43:14
Done.
Shu Chen
2014/06/16 08:43:14
Done.
|
+ g_key_code_map = LAZY_INSTANCE_INITIALIZER; |
+ |
+} // namespace |
+ |
+KeyboardCode DomCode2KeyboardCode(const std::string& code) { |
+ return g_key_code_map.Get().GetKeyboardCode(code); |
} |
} // namespace ui |