| // Copyright 2013 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 "chromeos/ime/ibus_keymap.h" |
| |
| #define XK_MISCELLANY |
| #include <X11/keysymdef.h> |
| #include <X11/XF86keysym.h> |
| |
| namespace chromeos { |
| namespace input_method { |
| |
| std::string GetIBusKey(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; |
| } |
| } |
| } |
| |
| // We should send KeyCode as string to meet DOM Level 4 event specification |
| // proposal. https://dvcs.w3.org/hg/d4e/raw-file/tip/source_respec.htm |
| // The original spec is 1:1 mapping with USB keycode, but for the Extension IME, |
| // mapping with XKB keycode is sufficient, because it works only on Chrome OS. |
| // We have to have own mapping because We can't use WebKit component in |
| // Extension IME, |
| // TODO(nona): Use if the original spec is introduced. |
| std::string GetIBusKeyCode(uint16 keycode) { |
| switch (keycode) { |
| // Function keys |
| case 0x0009: return "Esc"; |
| case 0x0043: return "F1"; |
| case 0x0044: return "F2"; |
| case 0x0045: return "F3"; |
| case 0x0046: return "F4"; |
| case 0x0047: return "F5"; |
| case 0x0048: return "F6"; |
| case 0x0049: return "F7"; |
| case 0x004a: return "F8"; |
| case 0x004b: return "F9"; |
| case 0x004c: return "F10"; |
| case 0x005f: return "F11"; |
| case 0x0060: return "F12"; |
| |
| // Alphanumeric keys |
| case 0x000a: return "Digit1"; |
| case 0x000b: return "Digit2"; |
| case 0x000c: return "Digit3"; |
| case 0x000d: return "Digit4"; |
| case 0x000e: return "Digit5"; |
| case 0x000f: return "Digit6"; |
| case 0x0010: return "Digit7"; |
| case 0x0011: return "Digit8"; |
| case 0x0012: return "Digit9"; |
| case 0x0013: return "Digit0"; |
| case 0x0014: return "Minus"; |
| case 0x0015: return "Equal"; |
| case 0x0016: return "Backspace"; |
| case 0x0017: return "Tab"; |
| case 0x0018: return "KeyQ"; |
| case 0x0019: return "KeyW"; |
| case 0x001a: return "KeyE"; |
| case 0x001b: return "KeyR"; |
| case 0x001c: return "KeyT"; |
| case 0x001d: return "KeyY"; |
| case 0x001e: return "KeyU"; |
| case 0x001f: return "KeyI"; |
| case 0x0020: return "KeyO"; |
| case 0x0021: return "KeyP"; |
| case 0x0022: return "BracketLeft"; |
| case 0x0023: return "BracketRight"; |
| case 0x0024: return "Enter"; |
| case 0x0025: return "ControlLeft"; |
| case 0x0026: return "KeyA"; |
| case 0x0027: return "KeyS"; |
| case 0x0028: return "KeyD"; |
| case 0x0029: return "KeyF"; |
| case 0x002a: return "KeyG"; |
| case 0x002b: return "KeyH"; |
| case 0x002c: return "KeyJ"; |
| case 0x002d: return "KeyK"; |
| case 0x002e: return "KeyL"; |
| case 0x002f: return "Semicolon"; |
| case 0x0030: return "Quote"; |
| case 0x0031: return "BackQuote"; |
| case 0x0032: return "ShiftLeft"; |
| case 0x0033: return "Backslash"; |
| case 0x0034: return "KeyZ"; |
| case 0x0035: return "KeyX"; |
| case 0x0036: return "KeyC"; |
| case 0x0037: return "KeyV"; |
| case 0x0038: return "KeyB"; |
| case 0x0039: return "KeyN"; |
| case 0x003a: return "KeyM"; |
| case 0x003b: return "Comma"; |
| case 0x003c: return "Period"; |
| case 0x003d: return "Slash"; |
| case 0x003e: return "ShiftRight"; |
| case 0x003f: return "NumpadMultiply"; |
| case 0x0040: return "AltLeft"; |
| case 0x0041: return "Space"; |
| case 0x0042: return "CapsLock"; |
| case 0x004d: return "NumLock"; |
| case 0x004e: return "ScrollLock"; |
| case 0x005e: return "IntlBackslash"; |
| case 0x0064: return "Convert"; |
| case 0x0065: return "KanaMode"; |
| case 0x0066: return "NoConvert"; |
| case 0x0069: return "ControlRight"; |
| case 0x006c: return "AltRight"; |
| case 0x0082: return "HangulMode"; |
| case 0x0083: return "Hanja"; |
| case 0x0085: return "OSLeft"; |
| case 0x0086: return "OSRight"; |
| case 0x0087: return "ContextMenu"; |
| case 0x0061: return "IntlRo"; |
| case 0x0084: return "IntlYen"; |
| |
| // Control pad keys |
| case 0x006b: return "PrintScreen"; |
| case 0x0070: return "PageUp"; |
| case 0x0073: return "End"; |
| case 0x0076: return "Insert"; |
| case 0x0077: return "Delete"; |
| case 0x006e: return "Home"; |
| case 0x0075: return "PageDown"; |
| case 0x0079: return "VolumeMute"; |
| case 0x007a: return "VolumeDown"; |
| case 0x007b: return "VolumeUp"; |
| case 0x007c: return "Power"; |
| case 0x007f: return "Pause"; |
| case 0x0092: return "Help"; |
| |
| // Arrow pad keys |
| case 0x006f: return "ArrowUp"; |
| case 0x0071: return "ArrowLeft"; |
| case 0x0072: return "ArrowRight"; |
| case 0x0074: return "ArrowDown"; |
| |
| // Numpad keys |
| case 0x005a: return "Numpad0"; |
| case 0x0057: return "Numpad1"; |
| case 0x0058: return "Numpad2"; |
| case 0x0059: return "Numpad3"; |
| case 0x0053: return "Numpad4"; |
| case 0x0054: return "Numpad5"; |
| case 0x0055: return "Numpad6"; |
| case 0x004f: return "Numpad7"; |
| case 0x0050: return "Numpad8"; |
| case 0x0051: return "Numpad9"; |
| case 0x0052: return "NumpadSubtract"; |
| case 0x0056: return "NumpadAdd"; |
| case 0x005b: return "NumpadDecimal"; |
| case 0x0068: return "NumpadEnter"; |
| case 0x006a: return "NumpadDivide"; |
| case 0x00bb: return "NumpadParenLeft"; |
| case 0x00bc: return "NumpadParenRight"; |
| |
| // Unsupported keys |
| |
| // No entry in specification. |
| case 0x0062: return ""; // UsbKeyCode: 0x070092(LANG3) |
| case 0x0063: return ""; // UsbKeyCode: 0x070093(LANG4) |
| case 0x007d: return ""; // UsbKeyCode: 0x070067(Num_=) |
| case 0x007e: return ""; // UsbkeyCode: 0x0700d7(Num_+-) |
| case 0x0081: return ""; // UsbKeyCode: 0x0700dc(NumpadDecimal) |
| case 0x0088: return ""; // UsbKeyCode: 0x07009b(Cancel) |
| case 0x0089: return ""; // UsbKeyCode: 0x070079(Again) |
| case 0x008b: return ""; // UsbKeyCode: 0x07007a(Undo) |
| case 0x008d: return ""; // UsbKeyCode: 0x07007c(Copy) |
| case 0x008f: return ""; // UsbKeyCode: 0x07007d(Paste) |
| case 0x0090: return ""; // UsbKeyCode: 0x07007e(Find) |
| case 0x0091: return ""; // UsbKeyCode: 0x07007b(Cut) |
| case 0x0093: return ""; // UsbKeyCode: 0x070076(Menu) |
| |
| // USB Usage Page 0x01: Generic Desktop Page |
| case 0x0094: return ""; // 0x0C page: AL_Calculator |
| case 0x0096: return ""; // 0x01 page: SystemSleep |
| case 0x0097: return ""; // 0x01 page: SystemWakeUp |
| |
| // USB Usage Page 0x0c: Consumer Page |
| case 0x0098: return ""; // AL_FileBrowser (Explorer)"; |
| case 0x00a4: return ""; // AC_Bookmarks (Favorites)"; |
| case 0x00a5: return ""; // AL_LocalMachineBrowser"; |
| case 0x00a6: return ""; // AC_Back"; |
| case 0x00a7: return ""; // AC_Forward"; |
| case 0x00b5: return ""; // AC_Refresh (Reload)"; |
| case 0x00ef: return ""; // AC_Send"; |
| case 0x00f0: return ""; // AC_Reply"; |
| case 0x00f1: return ""; // AC_ForwardMsg (MailForward)"; |
| case 0x00f3: return ""; // AL_Documents"; |
| |
| default: return ""; |
| } |
| } |
| |
| } // namespace input_method |
| } // namespace chromeos |