diff options
author | garykac@chromium.org <garykac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-15 21:16:47 +0000 |
---|---|---|
committer | garykac@chromium.org <garykac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-15 21:16:47 +0000 |
commit | 1a6258fb3553dadf76de4d93eebf7721bdfff2a7 (patch) | |
tree | ff7721ed9b9e35173f08e49de8bea60675ee3593 /remoting/host/event_executor_win.cc | |
parent | 886eb02799f17da233ba28e88a82a932b2761d44 (diff) | |
download | chromium_src-1a6258fb3553dadf76de4d93eebf7721bdfff2a7.zip chromium_src-1a6258fb3553dadf76de4d93eebf7721bdfff2a7.tar.gz chromium_src-1a6258fb3553dadf76de4d93eebf7721bdfff2a7.tar.bz2 |
[Chromoting] Add USB keycode handling to Windows host.
Review URL: https://chromiumcodereview.appspot.com/9624011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126996 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/host/event_executor_win.cc')
-rw-r--r-- | remoting/host/event_executor_win.cc | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/remoting/host/event_executor_win.cc b/remoting/host/event_executor_win.cc index af66225..2a1871e 100644 --- a/remoting/host/event_executor_win.cc +++ b/remoting/host/event_executor_win.cc @@ -20,6 +20,12 @@ using protocol::KeyEvent; namespace { +// USB to XKB keycode map table. +#define USB_KEYMAP(usb, xkb, win, mac) {usb, win} +#define INVALID_KEYCODE 0x0000 +#include "remoting/host/usb_keycode_map.h" +#undef USB_KEYMAP + // A class to generate events on Windows. class EventExecutorWin : public EventExecutor { public: @@ -69,13 +75,34 @@ void EventExecutorWin::InjectMouseEvent(const MouseEvent& event) { HandleMouse(event); } +uint16_t UsbKeycodeToWinScancode(uint32_t usb_keycode) { + for (int i = 0; i < arraysize(usb_keycode_map); i++) { + if (usb_keycode_map[i].usb_keycode == usb_keycode) + return usb_keycode_map[i].native_keycode; + } + + return INVALID_KEYCODE; +} + void EventExecutorWin::HandleKey(const KeyEvent& event) { int key = event.keycode(); bool down = event.pressed(); - // Calculate scan code from virtual key. - HKL hkl = GetKeyboardLayout(0); - int scan_code = MapVirtualKeyEx(key, MAPVK_VK_TO_VSC_EX, hkl); + // Calculate scan code from key event. + int scancode = INVALID_KEYCODE; + if (event.has_usb_keycode() && event.usb_keycode() != 0) { + int scancode = UsbKeycodeToWinScancode(event.usb_keycode()); + LOG(INFO) << std::hex << "Host received keycode: " << event.keycode() + << " usb_keycode: " << event.usb_keycode() + << " to scancode: " << scancode + << std::dec; + } else { + HKL hkl = GetKeyboardLayout(0); + scancode = MapVirtualKeyEx(key, MAPVK_VK_TO_VSC_EX, hkl); + } + + if (scancode == INVALID_KEYCODE) + return; INPUT input; memset(&input, 0, sizeof(input)); @@ -83,11 +110,11 @@ void EventExecutorWin::HandleKey(const KeyEvent& event) { input.type = INPUT_KEYBOARD; input.ki.time = 0; input.ki.wVk = key; - input.ki.wScan = scan_code; + input.ki.wScan = scancode; // Flag to mark extended 'e0' key scancodes. Without this, the left and // right windows keys will not be handled properly (on US keyboard). - if ((scan_code & 0xFF00) == 0xE000) { + if ((scancode & 0xFF00) == 0xE000) { input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY; } |