Index: remoting/host/event_executor_linux.cc |
diff --git a/remoting/host/event_executor_linux.cc b/remoting/host/event_executor_linux.cc |
index fe64ad23e446d2c9260b56c8cc66430ab1e1f46a..bbd798546a1756f7d8be1bd772688335b264c322 100644 |
--- a/remoting/host/event_executor_linux.cc |
+++ b/remoting/host/event_executor_linux.cc |
@@ -7,8 +7,6 @@ |
#include <set> |
#include <X11/Xlib.h> |
-#include <X11/XF86keysym.h> |
-#include <X11/keysym.h> |
#include <X11/extensions/XTest.h> |
#include "base/basictypes.h" |
@@ -104,172 +102,6 @@ int VerticalScrollWheelToX11ButtonNumber(int dy) { |
return (dy > 0 ? 4 : 5); |
} |
-// Hard-coded mapping from Virtual Key codes to X11 KeySyms. |
-// This mapping is only valid if both client and host are using a |
-// US English keyboard layout. |
-// Because we're passing VK codes on the wire, with no Scancode, |
-// "extended" flag, etc, things like distinguishing left & right |
-// Shift keys doesn't work. |
-// |
-// TODO(wez): Replace this with something more closely tied to what |
-// WebInputEventFactory does on Linux/GTK, and which respects the |
-// host's keyboard layout (see http://crbug.com/74550 ). |
-const int kUsVkeyToKeysym[256] = { |
- // 0x00 - 0x07 |
- -1, -1, -1, XK_Cancel, |
- // 0x04 - 0x07 |
- -1, -1, -1, -1, |
- // 0x08 - 0x0B |
- XK_BackSpace, XK_Tab, -1, -1, |
- // 0x0C - 0x0F |
- XK_Clear, XK_Return, -1, -1, |
- |
- // 0x10 - 0x13 |
- XK_Shift_L, XK_Control_L, XK_Alt_L, XK_Pause, |
- // 0x14 - 0x17 |
- XK_Caps_Lock, XK_Kana_Shift, -1, XK_Hangul_Jeonja, |
- // 0x18 - 0x1B |
- XK_Hangul_End, XK_Kanji, -1, XK_Escape, |
- // 0x1C - 0x1F |
- XK_Henkan, XK_Muhenkan, /* VKEY_ACCEPT */ -1, XK_Mode_switch, |
- |
- // 0x20 - 0x23 |
- XK_space, XK_Prior, XK_Next, XK_End, |
- // 0x24 - 0x27 |
- XK_Home, XK_Left, XK_Up, XK_Right, |
- // 0x28 - 0x2B |
- XK_Down, XK_Select, /* VK_PRINT */ -1, XK_Execute, |
- // 0x2C - 0x2F |
- XK_Print, XK_Insert, XK_Delete, XK_Help, |
- |
- // 0x30 - 0x33 |
- XK_0, XK_1, XK_2, XK_3, |
- // 0x34 - 0x37 |
- XK_4, XK_5, XK_6, XK_7, |
- // 0x38 - 0x3B |
- XK_8, XK_9, -1, -1, |
- // 0x3C - 0x3F |
- -1, -1, -1, -1, |
- |
- // 0x40 - 0x43 |
- -1, XK_A, XK_B, XK_C, |
- // 0x44 - 0x47 |
- XK_D, XK_E, XK_F, XK_G, |
- // 0x48 - 0x4B |
- XK_H, XK_I, XK_J, XK_K, |
- // 0x4C - 0x4F |
- XK_L, XK_M, XK_N, XK_O, |
- |
- // 0x50 - 0x53 |
- XK_P, XK_Q, XK_R, XK_S, |
- // 0x54 - 0x57 |
- XK_T, XK_U, XK_V, XK_W, |
- // 0x58 - 0x5B |
- XK_X, XK_Y, XK_Z, XK_Super_L, |
- // 0x5C - 0x5F |
- XK_Super_R, XK_Menu, -1, /* VKEY_SLEEP */ -1, |
- |
- // 0x60 - 0x63 |
- XK_KP_0, XK_KP_1, XK_KP_2, XK_KP_3, |
- // 0x64 - 0x67 |
- XK_KP_4, XK_KP_5, XK_KP_6, XK_KP_7, |
- // 0x68 - 0x6B |
- XK_KP_8, XK_KP_9, XK_KP_Multiply, XK_KP_Add, |
- // 0x6C - 0x6F |
- XK_KP_Separator, XK_KP_Subtract, XK_KP_Decimal, XK_KP_Divide, |
- |
- // 0x70 - 0x73 |
- XK_F1, XK_F2, XK_F3, XK_F4, |
- // 0x74 - 0x77 |
- XK_F5, XK_F6, XK_F7, XK_F8, |
- // 0x78 - 0x7B |
- XK_F9, XK_F10, XK_F11, XK_F12, |
- // 0x7C - 0x7F |
- XK_F13, XK_F14, XK_F15, XK_F16, |
- |
- // 0x80 - 0x83 |
- XK_F17, XK_F18, XK_F19, XK_F20, |
- // 0x84 - 0x87 |
- XK_F21, XK_F22, XK_F23, XK_F24, |
- // 0x88 - 0x8B |
- -1, -1, -1, -1, |
- // 0x8C - 0x8F |
- -1, -1, -1, -1, |
- |
- // 0x90 - 0x93 |
- XK_Num_Lock, XK_Scroll_Lock, -1, -1, |
- // 0x94 - 0x97 |
- -1, -1, -1, -1, |
- // 0x98 - 0x9B |
- -1, -1, -1, -1, |
- // 0x9C - 0x9F |
- -1, -1, -1, -1, |
- |
- // 0xA0 - 0xA3 |
- XK_Shift_L, XK_Shift_R, XK_Control_L, XK_Control_R, |
- // 0xA4 - 0xA7 |
- XK_Meta_L, XK_Meta_R, XF86XK_Back, XF86XK_Forward, |
- // 0xA8 - 0xAB |
- XF86XK_Refresh, XF86XK_Stop, XF86XK_Search, XF86XK_Favorites, |
- // 0xAC - 0xAF |
- XF86XK_HomePage, XF86XK_AudioMute, XF86XK_AudioLowerVolume, |
- XF86XK_AudioRaiseVolume, |
- |
- // 0xB0 - 0xB3 |
- XF86XK_AudioNext, XF86XK_AudioPrev, XF86XK_AudioStop, XF86XK_AudioPause, |
- // 0xB4 - 0xB7 |
- XF86XK_Mail, XF86XK_AudioMedia, XF86XK_Launch0, XF86XK_Launch1, |
- // 0xB8 - 0xBB |
- -1, -1, XK_semicolon, XK_plus, |
- // 0xBC - 0xBF |
- XK_comma, XK_minus, XK_period, XK_slash, |
- |
- // 0xC0 - 0xC3 |
- XK_grave, -1, -1, -1, |
- // 0xC4 - 0xC7 |
- -1, -1, -1, -1, |
- // 0xC8 - 0xCB |
- -1, -1, -1, -1, |
- // 0xCC - 0xCF |
- -1, -1, -1, -1, |
- |
- // 0xD0 - 0xD3 |
- -1, -1, -1, -1, |
- // 0xD4 - 0xD7 |
- -1, -1, -1, -1, |
- // 0xD8 - 0xDB |
- -1, -1, -1, XK_bracketleft, |
- // 0xDC - 0xDF |
- XK_backslash, XK_bracketright, XK_apostrophe, |
- /* VKEY_OEM_8 */ -1, |
- |
- // 0xE0 - 0xE3 |
- -1, -1, /* VKEY_OEM_102 */ -1, -1, |
- // 0xE4 - 0xE7 |
- -1, /* VKEY_PROCESSKEY */ -1, -1, /* VKEY_PACKET */ -1, |
- // 0xE8 - 0xEB |
- -1, -1, -1, -1, |
- // 0xEC - 0xEF |
- -1, -1, -1, -1, |
- |
- // 0xF0 - 0xF3 |
- -1, -1, -1, -1, |
- // 0xF4 - 0xF7 |
- -1, -1, /* VKEY_ATTN */ -1, /* VKEY_CRSEL */ -1, |
- // 0xF8 - 0xFB |
- /* VKEY_EXSEL */ -1, /* VKEY_EREOF */ -1, /* VKEY_PLAY */ -1, |
- /* VKEY_ZOOM */ -1, |
- // 0xFC - 0xFF |
- /* VKEY_NONAME */ -1, /* VKEY_PA1 */ -1, /* VKEY_OEM_CLEAR */ -1, -1 |
-}; |
- |
-int ChromotocolKeycodeToX11Keysym(int32_t keycode) { |
- if (keycode < 0 || keycode > 255) |
- return kInvalidKeycode; |
- |
- return kUsVkeyToKeysym[keycode]; |
-} |
- |
EventExecutorLinux::EventExecutorLinux( |
scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
: task_runner_(task_runner), |
@@ -310,6 +142,7 @@ void EventExecutorLinux::InjectClipboardEvent(const ClipboardEvent& event) { |
void EventExecutorLinux::InjectKeyEvent(const KeyEvent& event) { |
// HostEventDispatcher should filter events missing the pressed field. |
DCHECK(event.has_pressed()); |
+ DCHECK(event.has_usb_keycode()); |
if (!task_runner_->BelongsToCurrentThread()) { |
task_runner_->PostTask( |
@@ -319,22 +152,11 @@ void EventExecutorLinux::InjectKeyEvent(const KeyEvent& event) { |
return; |
} |
- int keycode = kInvalidKeycode; |
- if (event.has_usb_keycode()) { |
- keycode = UsbKeycodeToNativeKeycode(event.usb_keycode()); |
- VLOG(3) << "Converting USB keycode: " << std::hex << event.usb_keycode() |
- << " to keycode: " << keycode << std::dec; |
- } else if (event.has_keycode()) { |
- // Fall back to keysym translation. |
- // TODO(garykac) Remove this once we switch entirely over to USB keycodes. |
- int keysym = ChromotocolKeycodeToX11Keysym(event.keycode()); |
- keycode = XKeysymToKeycode(display_, keysym); |
- VLOG(3) << "Converting VKEY: " << std::hex << event.keycode() |
- << " to keysym: " << keysym |
- << " to keycode: " << keycode << std::dec; |
- } |
+ int keycode = UsbKeycodeToNativeKeycode(event.usb_keycode()); |
+ VLOG(3) << "Converting USB keycode: " << std::hex << event.usb_keycode() |
+ << " to keycode: " << keycode << std::dec; |
- // Ignore events with no VK- or USB-keycode, or which can't be mapped. |
+ // Ignore events which can't be mapped. |
if (keycode == kInvalidKeycode) |
return; |