summaryrefslogtreecommitdiffstats
path: root/remoting/host/event_executor_win.cc
diff options
context:
space:
mode:
authorgarykac@chromium.org <garykac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-15 21:16:47 +0000
committergarykac@chromium.org <garykac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-15 21:16:47 +0000
commit1a6258fb3553dadf76de4d93eebf7721bdfff2a7 (patch)
treeff7721ed9b9e35173f08e49de8bea60675ee3593 /remoting/host/event_executor_win.cc
parent886eb02799f17da233ba28e88a82a932b2761d44 (diff)
downloadchromium_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.cc37
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;
}