Chromium Code Reviews| Index: remoting/host/event_executor_mac.cc |
| =================================================================== |
| --- remoting/host/event_executor_mac.cc (revision 126631) |
| +++ remoting/host/event_executor_mac.cc (working copy) |
| @@ -19,6 +19,11 @@ |
| namespace { |
| +// USB to Mac keycode mapping table. |
| +#define USB_KEYMAP(usb, xkb, win, mac) {usb, mac} |
| +#include "remoting/host/usb_keycode_map.h" |
| +#define INVALID_KEYCODE 0xffff |
|
Wez
2012/03/14 17:55:29
nit: It seems strange to define INVALID_KEYCODE an
garykac
2012/03/14 18:25:44
I did initially, but it made the table look heavy
Wez
2012/03/14 20:38:01
This was a nit; if it makes the table heavy then f
|
| + |
| using protocol::MouseEvent; |
| using protocol::KeyEvent; |
| @@ -56,47 +61,51 @@ |
| // TODO(wez): Replace this with something more closely tied to what |
| // WebInputEventFactory does on Linux/GTK, and which respects the |
| // host's keyboard layout. |
| +// |
| +// TODO(garykac): Remove this table once we switch to using USB |
| +// keycodes. |
| const int kUsVkeyToKeysym[256] = { |
| // 0x00 - 0x07 |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0x04 - 0x07 |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0x08 - 0x0B |
| - kVK_Delete, kVK_Tab, -1, -1, |
| + kVK_Delete, kVK_Tab, 0xffff, 0xffff, |
| // 0x0C - 0x0F |
| - -1, kVK_Return, -1, -1, |
| + 0xffff, kVK_Return, 0xffff, 0xffff, |
| // 0x10 - 0x13 |
| - kVK_Shift, kVK_Control, kVK_Option, -1, |
| + kVK_Shift, kVK_Control, kVK_Option, 0xffff, |
| // 0x14 - 0x17 |
| - kVK_CapsLock, kVK_JIS_Kana, /* VKEY_HANGUL */ -1, /* VKEY_JUNJA */ -1, |
| + kVK_CapsLock, kVK_JIS_Kana, /* VKEY_HANGUL */ 0xffff, /* VKEY_JUNJA */ 0xffff, |
| // 0x18 - 0x1B |
| - /* VKEY_FINAL */ -1, /* VKEY_Kanji */ -1, -1, kVK_Escape, |
| + /* VKEY_FINAL */ 0xffff, /* VKEY_Kanji */ 0xffff, 0xffff, kVK_Escape, |
| // 0x1C - 0x1F |
| - /* VKEY_CONVERT */ -1, /* VKEY_NONCONVERT */ -1, |
| - /* VKEY_ACCEPT */ -1, /* VKEY_MODECHANGE */ -1, |
| + /* VKEY_CONVERT */ 0xffff, /* VKEY_NONCONVERT */ 0xffff, |
| + /* VKEY_ACCEPT */ 0xffff, /* VKEY_MODECHANGE */ 0xffff, |
| // 0x20 - 0x23 |
| kVK_Space, kVK_PageUp, kVK_PageDown, kVK_End, |
| // 0x24 - 0x27 |
| kVK_Home, kVK_LeftArrow, kVK_UpArrow, kVK_RightArrow, |
| // 0x28 - 0x2B |
| - kVK_DownArrow, /* VKEY_SELECT */ -1, /* VKEY_PRINT */ -1, |
| - /* VKEY_EXECUTE */ -1, |
| + kVK_DownArrow, /* VKEY_SELECT */ 0xffff, /* VKEY_PRINT */ 0xffff, |
| + /* VKEY_EXECUTE */ 0xffff, |
| // 0x2C - 0x2F |
| - /* VKEY_SNAPSHOT */ -1, /* XK_INSERT */ -1, kVK_ForwardDelete, kVK_Help, |
| + /* VKEY_SNAPSHOT */ 0xffff, /* XK_INSERT */ 0xffff, |
| + kVK_ForwardDelete, kVK_Help, |
| // 0x30 - 0x33 |
| kVK_ANSI_0, kVK_ANSI_1, kVK_ANSI_2, kVK_ANSI_3, |
| // 0x34 - 0x37 |
| kVK_ANSI_4, kVK_ANSI_5, kVK_ANSI_6, kVK_ANSI_7, |
| // 0x38 - 0x3B |
| - kVK_ANSI_8, kVK_ANSI_9, -1, -1, |
| + kVK_ANSI_8, kVK_ANSI_9, 0xffff, 0xffff, |
| // 0x3C - 0x3F |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0x40 - 0x43 |
| - -1, kVK_ANSI_A, kVK_ANSI_B, kVK_ANSI_C, |
| + 0xffff, kVK_ANSI_A, kVK_ANSI_B, kVK_ANSI_C, |
| // 0x44 - 0x47 |
| kVK_ANSI_D, kVK_ANSI_E, kVK_ANSI_F, kVK_ANSI_G, |
| // 0x48 - 0x4B |
| @@ -111,7 +120,7 @@ |
| // 0x58 - 0x5B |
| kVK_ANSI_X, kVK_ANSI_Y, kVK_ANSI_Z, kVK_Command, |
| // 0x5C - 0x5F |
| - kVK_Command, kVK_Command, -1, /* VKEY_SLEEP */ -1, |
| + kVK_Command, kVK_Command, 0xffff, /* VKEY_SLEEP */ 0xffff, |
| // 0x60 - 0x63 |
| kVK_ANSI_Keypad0, kVK_ANSI_Keypad1, kVK_ANSI_Keypad2, kVK_ANSI_Keypad3, |
| @@ -121,7 +130,7 @@ |
| kVK_ANSI_Keypad8, kVK_ANSI_Keypad9, kVK_ANSI_KeypadMultiply, |
| kVK_ANSI_KeypadPlus, |
| // 0x6C - 0x6F |
| - /* VKEY_SEPARATOR */ -1, kVK_ANSI_KeypadMinus, |
| + /* VKEY_SEPARATOR */ 0xffff, kVK_ANSI_KeypadMinus, |
| kVK_ANSI_KeypadDecimal, kVK_ANSI_KeypadDivide, |
| // 0x70 - 0x73 |
| @@ -136,94 +145,116 @@ |
| // 0x80 - 0x83 |
| kVK_F17, kVK_F18, kVK_F19, kVK_F20, |
| // 0x84 - 0x87 |
| - /* VKEY_F21 */ -1, /* VKEY_F22 */ -1, /* VKEY_F23 */ -1, /* XKEY_F24 */ -1, |
| + /* VKEY_F21 */ 0xffff, /* VKEY_F22 */ 0xffff, |
| + /* VKEY_F23 */ 0xffff, /* XKEY_F24 */ 0xffff, |
| // 0x88 - 0x8B |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0x8C - 0x8F |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0x90 - 0x93 |
| - /* VKEY_NUMLOCK */ -1, /* VKEY_SCROLL */ -1, -1, -1, |
| + /* VKEY_NUMLOCK */ 0xffff, /* VKEY_SCROLL */ 0xffff, 0xffff, 0xffff, |
| // 0x94 - 0x97 |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0x98 - 0x9B |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0x9C - 0x9F |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xA0 - 0xA3 |
| kVK_Shift, kVK_RightShift, kVK_Control, kVK_RightControl, |
| // 0xA4 - 0xA7 |
| - kVK_Option, kVK_RightOption, /* XF86kVK_Back */ -1, /* XF86kVK_Forward */ -1, |
| + kVK_Option, kVK_RightOption, |
| + /* XF86kVK_Back */ 0xffff, /* XF86kVK_Forward */ 0xffff, |
| // 0xA8 - 0xAB |
| - /* XF86kVK_Refresh */ -1, /* XF86kVK_Stop */ -1, /* XF86kVK_Search */ -1, |
| - /* XF86kVK_Favorites */ -1, |
| + /* XF86kVK_Refresh */ 0xffff, /* XF86kVK_Stop */ 0xffff, |
| + /* XF86kVK_Search */ 0xffff, /* XF86kVK_Favorites */ 0xffff, |
| // 0xAC - 0xAF |
| - /* XF86kVK_HomePage */ -1, kVK_Mute, kVK_VolumeDown, kVK_VolumeUp, |
| + /* XF86kVK_HomePage */ 0xffff, kVK_Mute, kVK_VolumeDown, kVK_VolumeUp, |
| // 0xB0 - 0xB3 |
| - /* XF86kVK_AudioNext */ -1, /* XF86kVK_AudioPrev */ -1, |
| - /* XF86kVK_AudioStop */ -1, /* XF86kVK_AudioPause */ -1, |
| + /* XF86kVK_AudioNext */ 0xffff, /* XF86kVK_AudioPrev */ 0xffff, |
| + /* XF86kVK_AudioStop */ 0xffff, /* XF86kVK_AudioPause */ 0xffff, |
| // 0xB4 - 0xB7 |
| - /* XF86kVK_Mail */ -1, /* XF86kVK_AudioMedia */ -1, /* XF86kVK_Launch0 */ -1, |
| - /* XF86kVK_Launch1 */ -1, |
| + /* XF86kVK_Mail */ 0xffff, /* XF86kVK_AudioMedia */ 0xffff, |
| + /* XF86kVK_Launch0 */ 0xffff, /* XF86kVK_Launch1 */ 0xffff, |
| // 0xB8 - 0xBB |
| - -1, -1, kVK_ANSI_Semicolon, kVK_ANSI_Equal, |
| + 0xffff, 0xffff, kVK_ANSI_Semicolon, kVK_ANSI_Equal, |
| // 0xBC - 0xBF |
| kVK_ANSI_Comma, kVK_ANSI_Minus, kVK_ANSI_Period, kVK_ANSI_Slash, |
| // 0xC0 - 0xC3 |
| - kVK_ANSI_Grave, -1, -1, -1, |
| + kVK_ANSI_Grave, 0xffff, 0xffff, 0xffff, |
| // 0xC4 - 0xC7 |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xC8 - 0xCB |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xCC - 0xCF |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xD0 - 0xD3 |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xD4 - 0xD7 |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xD8 - 0xDB |
| - -1, -1, -1, kVK_ANSI_LeftBracket, |
| + 0xffff, 0xffff, 0xffff, kVK_ANSI_LeftBracket, |
| // 0xDC - 0xDF |
| kVK_ANSI_Backslash, kVK_ANSI_RightBracket, kVK_ANSI_Quote, |
| - /* VKEY_OEM_8 */ -1, |
| + /* VKEY_OEM_8 */ 0xffff, |
| // 0xE0 - 0xE3 |
| - -1, -1, /* VKEY_OEM_102 */ -1, -1, |
| + 0xffff, 0xffff, /* VKEY_OEM_102 */ 0xffff, 0xffff, |
| // 0xE4 - 0xE7 |
| - -1, /* VKEY_PROCESSKEY */ -1, -1, /* VKEY_PACKET */ -1, |
| + 0xffff, /* VKEY_PROCESSKEY */ 0xffff, 0xffff, /* VKEY_PACKET */ 0xffff, |
| // 0xE8 - 0xEB |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xEC - 0xEF |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xF0 - 0xF3 |
| - -1, -1, -1, -1, |
| + 0xffff, 0xffff, 0xffff, 0xffff, |
| // 0xF4 - 0xF7 |
| - -1, -1, /* VKEY_ATTN */ -1, /* VKEY_CRSEL */ -1, |
| + 0xffff, 0xffff, /* VKEY_ATTN */ 0xffff, /* VKEY_CRSEL */ 0xffff, |
| // 0xF8 - 0xFB |
| - /* VKEY_EXSEL */ -1, /* VKEY_EREOF */ -1, /* VKEY_PLAY */ -1, |
| - /* VKEY_ZOOM */ -1, |
| + /* VKEY_EXSEL */ 0xffff, /* VKEY_EREOF */ 0xffff, /* VKEY_PLAY */ 0xffff, |
| + /* VKEY_ZOOM */ 0xffff, |
| // 0xFC - 0xFF |
| - /* VKEY_NONAME */ -1, /* VKEY_PA1 */ -1, /* VKEY_OEM_CLEAR */ -1, -1 |
| + /* VKEY_NONAME */ 0xffff, /* VKEY_PA1 */ 0xffff, |
| + /* VKEY_OEM_CLEAR */ 0xffff, 0xffff |
| }; |
| +uint16_t UsbKeycodeToMacKeycode(uint32_t usb_keycode) { |
| + if (usb_keycode == 0) |
|
Wez
2012/03/14 17:55:29
Wrong indentation, throughout this function.
garykac
2012/03/14 18:25:44
Damn Xcode text editor (I didn't have it set up pr
|
| + return INVALID_KEYCODE; |
| + |
| + for (uint i = 0; i < arraysize(usb_keycode_map); i++) |
|
Wez
2012/03/14 17:55:29
Use braces for this "for".
garykac
2012/03/14 18:25:44
Done.
|
| + if (usb_keycode_map[i].usb_keycode == usb_keycode) |
| + return usb_keycode_map[i].native_keycode; |
| + |
| + return INVALID_KEYCODE; |
| +} |
| + |
| void EventExecutorMac::InjectKeyEvent(const KeyEvent& event) { |
| - int key_code = event.keycode(); |
| - if (key_code >= 0 && key_code < 256) { |
| - int key_sym = kUsVkeyToKeysym[key_code]; |
| - if (key_sym != -1) { |
| - // We use the deprecated event injection API because the new one doesn't |
| - // work with switched-out sessions (curtain mode). |
| - CGError error = CGPostKeyboardEvent(0, key_sym, event.pressed()); |
| - if (error != kCGErrorSuccess) { |
| - LOG(WARNING) << "CGPostKeyboardEvent error " << error; |
| - } |
| + int win_keycode = event.keycode(); |
|
Wez
2012/03/14 17:55:29
nit: Move this inside the else block, since it's o
garykac
2012/03/14 18:25:44
Done.
|
| + int keycode = 0; |
| + if (event.has_usb_keycode() && event.usb_keycode() != INVALID_KEYCODE) { |
| + keycode = UsbKeycodeToMacKeycode(event.usb_keycode()); |
| + VLOG(1) << "USB keycode: " << std::hex << event.usb_keycode() |
| + << " to Mac keycode: " << keycode << std::dec; |
| + } else { |
| + if (win_keycode >= 0 && win_keycode < 256) { |
| + keycode = kUsVkeyToKeysym[win_keycode]; |
| } |
| } |
| + |
| + if (keycode != INVALID_KEYCODE) { |
| + // We use the deprecated event injection API because the new one doesn't |
| + // work with switched-out sessions (curtain mode). |
| + CGError error = CGPostKeyboardEvent(0, keycode, event.pressed()); |
| + if (error != kCGErrorSuccess) { |
| + LOG(WARNING) << "CGPostKeyboardEvent error " << error; |
| + } |
| + } |
| } |
| void EventExecutorMac::InjectMouseEvent(const MouseEvent& event) { |