Chromium Code Reviews| Index: ui/base/keycodes/keyboard_code_conversion_mac.mm |
| diff --git a/ui/base/keycodes/keyboard_code_conversion_mac.mm b/ui/base/keycodes/keyboard_code_conversion_mac.mm |
| index bc9f070110175b75d222444b5ee797f6159258b8..c990255ee66b874f8ab3b7d98afdc366318415e0 100644 |
| --- a/ui/base/keycodes/keyboard_code_conversion_mac.mm |
| +++ b/ui/base/keycodes/keyboard_code_conversion_mac.mm |
| @@ -200,6 +200,252 @@ const KeyCodeMap kKeyCodesMap[] = { |
| // A convenient array for getting symbol characters on the number keys. |
| const char kShiftCharsForNumberKeys[] = ")!@#$%^&*("; |
| +// Translates from character code to keyboard code. |
| +KeyboardCode KeyboardCodeFromCharCode(unichar charCode) { |
| + switch (charCode) { |
| + case 8: case 0x7F: return VKEY_BACK; |
| + case 9: return VKEY_TAB; |
| + case 0xD: case 3: return VKEY_RETURN; |
| + case 0x1B: return VKEY_ESCAPE; |
| + case ' ': return VKEY_SPACE; |
| + case NSHomeFunctionKey: return VKEY_HOME; |
| + case NSEndFunctionKey: return VKEY_END; |
| + case NSPageUpFunctionKey: return VKEY_PRIOR; |
| + case NSPageDownFunctionKey: return VKEY_NEXT; |
| + case NSUpArrowFunctionKey: return VKEY_UP; |
| + case NSDownArrowFunctionKey: return VKEY_DOWN; |
| + case NSLeftArrowFunctionKey: return VKEY_LEFT; |
| + case NSRightArrowFunctionKey: return VKEY_RIGHT; |
| + case NSDeleteFunctionKey: return VKEY_DELETE; |
| + |
| + case '0': case ')': return VKEY_0; |
| + case '1': case '!': return VKEY_1; |
| + case '2': case '@': return VKEY_2; |
| + case '3': case '#': return VKEY_3; |
| + case '4': case '$': return VKEY_4; |
| + case '5': case '%': return VKEY_5; |
| + case '6': case '^': return VKEY_6; |
| + case '7': case '&': return VKEY_7; |
| + case '8': case '*': return VKEY_8; |
| + case '9': case '(': return VKEY_9; |
| + |
| + case 'a': case 'A': return VKEY_A; |
| + case 'b': case 'B': return VKEY_B; |
| + case 'c': case 'C': return VKEY_C; |
| + case 'd': case 'D': return VKEY_D; |
| + case 'e': case 'E': return VKEY_E; |
| + case 'f': case 'F': return VKEY_F; |
| + case 'g': case 'G': return VKEY_G; |
| + case 'h': case 'H': return VKEY_H; |
| + case 'i': case 'I': return VKEY_I; |
| + case 'j': case 'J': return VKEY_J; |
| + case 'k': case 'K': return VKEY_K; |
| + case 'l': case 'L': return VKEY_L; |
| + case 'm': case 'M': return VKEY_M; |
| + case 'n': case 'N': return VKEY_N; |
| + case 'o': case 'O': return VKEY_O; |
| + case 'p': case 'P': return VKEY_P; |
| + case 'q': case 'Q': return VKEY_Q; |
| + case 'r': case 'R': return VKEY_R; |
| + case 's': case 'S': return VKEY_S; |
| + case 't': case 'T': return VKEY_T; |
| + case 'u': case 'U': return VKEY_U; |
| + case 'v': case 'V': return VKEY_V; |
| + case 'w': case 'W': return VKEY_W; |
| + case 'x': case 'X': return VKEY_X; |
| + case 'y': case 'Y': return VKEY_Y; |
| + case 'z': case 'Z': return VKEY_Z; |
| + |
| + case NSPauseFunctionKey: return VKEY_PAUSE; |
| + case NSSelectFunctionKey: return VKEY_SELECT; |
| + case NSPrintFunctionKey: return VKEY_PRINT; |
| + case NSExecuteFunctionKey: return VKEY_EXECUTE; |
| + case NSPrintScreenFunctionKey: return VKEY_SNAPSHOT; |
| + case NSInsertFunctionKey: return VKEY_INSERT; |
| + case NSHelpFunctionKey: return VKEY_INSERT; |
| + |
| + case NSF1FunctionKey: return VKEY_F1; |
| + case NSF2FunctionKey: return VKEY_F2; |
| + case NSF3FunctionKey: return VKEY_F3; |
| + case NSF4FunctionKey: return VKEY_F4; |
| + case NSF5FunctionKey: return VKEY_F5; |
| + case NSF6FunctionKey: return VKEY_F6; |
| + case NSF7FunctionKey: return VKEY_F7; |
| + case NSF8FunctionKey: return VKEY_F8; |
| + case NSF9FunctionKey: return VKEY_F9; |
| + case NSF10FunctionKey: return VKEY_F10; |
| + case NSF11FunctionKey: return VKEY_F11; |
| + case NSF12FunctionKey: return VKEY_F12; |
| + case NSF13FunctionKey: return VKEY_F13; |
| + case NSF14FunctionKey: return VKEY_F14; |
| + case NSF15FunctionKey: return VKEY_F15; |
| + case NSF16FunctionKey: return VKEY_F16; |
| + case NSF17FunctionKey: return VKEY_F17; |
| + case NSF18FunctionKey: return VKEY_F18; |
| + case NSF19FunctionKey: return VKEY_F19; |
| + case NSF20FunctionKey: return VKEY_F20; |
| + |
| + case NSF21FunctionKey: return VKEY_F21; |
| + case NSF22FunctionKey: return VKEY_F22; |
| + case NSF23FunctionKey: return VKEY_F23; |
| + case NSF24FunctionKey: return VKEY_F24; |
| + case NSScrollLockFunctionKey: return VKEY_SCROLL; |
| + |
| + // U.S. Specific mappings. Mileage may vary. |
| + case ';': case ':': return VKEY_OEM_1; |
| + case '=': case '+': return VKEY_OEM_PLUS; |
| + case ',': case '<': return VKEY_OEM_COMMA; |
| + case '-': case '_': return VKEY_OEM_MINUS; |
| + case '.': case '>': return VKEY_OEM_PERIOD; |
| + case '/': case '?': return VKEY_OEM_2; |
| + case '`': case '~': return VKEY_OEM_3; |
| + case '[': case '{': return VKEY_OEM_4; |
| + case '\\': case '|': return VKEY_OEM_5; |
| + case ']': case '}': return VKEY_OEM_6; |
| + case '\'': case '"': return VKEY_OEM_7; |
| + } |
| + |
| + return VKEY_UNKNOWN; |
| +} |
| + |
| +KeyboardCode KeyboardCodeFromKeyCode(unsigned short keyCode) { |
| + static const KeyboardCode kKeyboardCodes[] = { |
| + /* 0 */ VKEY_A, |
| + /* 1 */ VKEY_S, |
| + /* 2 */ VKEY_D, |
| + /* 3 */ VKEY_F, |
| + /* 4 */ VKEY_H, |
| + /* 5 */ VKEY_G, |
| + /* 6 */ VKEY_Z, |
| + /* 7 */ VKEY_X, |
| + /* 8 */ VKEY_C, |
| + /* 9 */ VKEY_V, |
| + /* 0x0A */ VKEY_OEM_3, // Section key. |
| + /* 0x0B */ VKEY_B, |
| + /* 0x0C */ VKEY_Q, |
| + /* 0x0D */ VKEY_W, |
| + /* 0x0E */ VKEY_E, |
| + /* 0x0F */ VKEY_R, |
| + /* 0x10 */ VKEY_Y, |
| + /* 0x11 */ VKEY_T, |
| + /* 0x12 */ VKEY_1, |
| + /* 0x13 */ VKEY_2, |
| + /* 0x14 */ VKEY_3, |
| + /* 0x15 */ VKEY_4, |
| + /* 0x16 */ VKEY_6, |
| + /* 0x17 */ VKEY_5, |
| + /* 0x18 */ VKEY_OEM_PLUS, // =+ |
| + /* 0x19 */ VKEY_9, |
| + /* 0x1A */ VKEY_7, |
| + /* 0x1B */ VKEY_OEM_MINUS, // -_ |
| + /* 0x1C */ VKEY_8, |
| + /* 0x1D */ VKEY_0, |
| + /* 0x1E */ VKEY_OEM_6, // ]} |
| + /* 0x1F */ VKEY_O, |
| + /* 0x20 */ VKEY_U, |
| + /* 0x21 */ VKEY_OEM_4, // {[ |
| + /* 0x22 */ VKEY_I, |
| + /* 0x23 */ VKEY_P, |
| + /* 0x24 */ VKEY_RETURN, // Return |
| + /* 0x25 */ VKEY_L, |
| + /* 0x26 */ VKEY_J, |
| + /* 0x27 */ VKEY_OEM_7, // '" |
| + /* 0x28 */ VKEY_K, |
| + /* 0x29 */ VKEY_OEM_1, // ;: |
| + /* 0x2A */ VKEY_OEM_5, // \| |
| + /* 0x2B */ VKEY_OEM_COMMA, // ,< |
| + /* 0x2C */ VKEY_OEM_2, // /? |
| + /* 0x2D */ VKEY_N, |
| + /* 0x2E */ VKEY_M, |
| + /* 0x2F */ VKEY_OEM_PERIOD, // .> |
| + /* 0x30 */ VKEY_TAB, |
| + /* 0x31 */ VKEY_SPACE, |
| + /* 0x32 */ VKEY_OEM_3, // `~ |
| + /* 0x33 */ VKEY_BACK, // Backspace |
| + /* 0x34 */ VKEY_UNKNOWN, // n/a |
| + /* 0x35 */ VKEY_ESCAPE, |
| + /* 0x36 */ VKEY_APPS, // Right Command |
| + /* 0x37 */ VKEY_LWIN, // Left Command |
| + /* 0x38 */ VKEY_SHIFT, // Left Shift |
| + /* 0x39 */ VKEY_CAPITAL, // Caps Lock |
| + /* 0x3A */ VKEY_MENU, // Left Option |
| + /* 0x3B */ VKEY_CONTROL, // Left Ctrl |
| + /* 0x3C */ VKEY_SHIFT, // Right Shift |
| + /* 0x3D */ VKEY_MENU, // Right Option |
| + /* 0x3E */ VKEY_CONTROL, // Right Ctrl |
| + /* 0x3F */ VKEY_UNKNOWN, // fn |
| + /* 0x40 */ VKEY_F17, |
| + /* 0x41 */ VKEY_DECIMAL, // Num Pad . |
| + /* 0x42 */ VKEY_UNKNOWN, // n/a |
| + /* 0x43 */ VKEY_MULTIPLY, // Num Pad * |
| + /* 0x44 */ VKEY_UNKNOWN, // n/a |
| + /* 0x45 */ VKEY_ADD, // Num Pad + |
| + /* 0x46 */ VKEY_UNKNOWN, // n/a |
| + /* 0x47 */ VKEY_CLEAR, // Num Pad Clear |
| + /* 0x48 */ VKEY_VOLUME_UP, |
| + /* 0x49 */ VKEY_VOLUME_DOWN, |
| + /* 0x4A */ VKEY_VOLUME_MUTE, |
| + /* 0x4B */ VKEY_DIVIDE, // Num Pad / |
| + /* 0x4C */ VKEY_RETURN, // Num Pad Enter |
| + /* 0x4D */ VKEY_UNKNOWN, // n/a |
| + /* 0x4E */ VKEY_SUBTRACT, // Num Pad - |
| + /* 0x4F */ VKEY_F18, |
| + /* 0x50 */ VKEY_F19, |
| + /* 0x51 */ VKEY_OEM_PLUS, // Num Pad =. |
| + /* 0x52 */ VKEY_NUMPAD0, |
| + /* 0x53 */ VKEY_NUMPAD1, |
| + /* 0x54 */ VKEY_NUMPAD2, |
| + /* 0x55 */ VKEY_NUMPAD3, |
| + /* 0x56 */ VKEY_NUMPAD4, |
| + /* 0x57 */ VKEY_NUMPAD5, |
| + /* 0x58 */ VKEY_NUMPAD6, |
| + /* 0x59 */ VKEY_NUMPAD7, |
| + /* 0x5A */ VKEY_F20, |
| + /* 0x5B */ VKEY_NUMPAD8, |
| + /* 0x5C */ VKEY_NUMPAD9, |
| + /* 0x5D */ VKEY_UNKNOWN, // Yen (JIS Keyboard Only) |
| + /* 0x5E */ VKEY_UNKNOWN, // Underscore (JIS Keyboard Only) |
| + /* 0x5F */ VKEY_UNKNOWN, // KeypadComma (JIS Keyboard Only) |
| + /* 0x60 */ VKEY_F5, |
| + /* 0x61 */ VKEY_F6, |
| + /* 0x62 */ VKEY_F7, |
| + /* 0x63 */ VKEY_F3, |
| + /* 0x64 */ VKEY_F8, |
| + /* 0x65 */ VKEY_F9, |
| + /* 0x66 */ VKEY_UNKNOWN, // Eisu (JIS Keyboard Only) |
| + /* 0x67 */ VKEY_F11, |
| + /* 0x68 */ VKEY_UNKNOWN, // Kana (JIS Keyboard Only) |
| + /* 0x69 */ VKEY_F13, |
| + /* 0x6A */ VKEY_F16, |
| + /* 0x6B */ VKEY_F14, |
| + /* 0x6C */ VKEY_UNKNOWN, // n/a |
| + /* 0x6D */ VKEY_F10, |
| + /* 0x6E */ VKEY_UNKNOWN, // n/a (Windows95 key?) |
| + /* 0x6F */ VKEY_F12, |
| + /* 0x70 */ VKEY_UNKNOWN, // n/a |
| + /* 0x71 */ VKEY_F15, |
| + /* 0x72 */ VKEY_INSERT, // Help |
| + /* 0x73 */ VKEY_HOME, // Home |
| + /* 0x74 */ VKEY_PRIOR, // Page Up |
| + /* 0x75 */ VKEY_DELETE, // Forward Delete |
| + /* 0x76 */ VKEY_F4, |
| + /* 0x77 */ VKEY_END, // End |
| + /* 0x78 */ VKEY_F2, |
| + /* 0x79 */ VKEY_NEXT, // Page Down |
| + /* 0x7A */ VKEY_F1, |
| + /* 0x7B */ VKEY_LEFT, // Left Arrow |
| + /* 0x7C */ VKEY_RIGHT, // Right Arrow |
| + /* 0x7D */ VKEY_DOWN, // Down Arrow |
| + /* 0x7E */ VKEY_UP, // Up Arrow |
| + /* 0x7F */ VKEY_UNKNOWN // n/a |
| + }; |
| + |
| + if (keyCode >= 0x80) |
| + return VKEY_UNKNOWN; |
| + |
| + return kKeyboardCodes[keyCode]; |
| +} |
| + |
| } // anonymous namespace |
| int MacKeyCodeForWindowsKeyCode(KeyboardCode keycode, |
| @@ -288,4 +534,23 @@ int MacKeyCodeForWindowsKeyCode(KeyboardCode keycode, |
| return macKeycode; |
| } |
| +KeyboardCode KeyboardCodeFromNSEvent(NSEvent* event) { |
|
Nico
2011/12/19 23:30:28
As far as I understand, this will return "undefine
dhollowa
2011/12/20 00:05:34
VKEY_UNKNOWN is returned for key codes >= 0x80 if
|
| + KeyboardCode code = VKEY_UNKNOWN; |
| + |
| + if ([event type] == NSKeyDown || [event type] == NSKeyUp) { |
| + NSString* characters = [event characters]; |
| + if ([characters length] > 0) |
| + code = KeyboardCodeFromCharCode([characters characterAtIndex:0]); |
| + if (code) |
| + return code; |
| + |
| + characters = [event charactersIgnoringModifiers]; |
| + if ([characters length] > 0) |
| + code = KeyboardCodeFromCharCode([characters characterAtIndex:0]); |
| + if (code) |
| + return code; |
| + } |
| + return KeyboardCodeFromKeyCode([event keyCode]); |
| +} |
| + |
| } // namespace ui |