Index: ui/events/keycodes/keyboard_code_conversion_x.cc |
diff --git a/ui/events/keycodes/keyboard_code_conversion_x.cc b/ui/events/keycodes/keyboard_code_conversion_x.cc |
index a4a810e23a43004eb09af168daa797968e6d8a23..14c317fbe695932c7b28c7e760b0303c853e2a9f 100644 |
--- a/ui/events/keycodes/keyboard_code_conversion_x.cc |
+++ b/ui/events/keycodes/keyboard_code_conversion_x.cc |
@@ -459,6 +459,32 @@ KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) { |
return VKEY_UNKNOWN; |
} |
+// Check for TTY function keys or space key which should always be mapped |
+// based on KeySym, and never fall back to MAP0~MAP3, since some layouts |
+// generate them by applying the Control/AltGr modifier to some other key. |
+// e.g. in de(neo), AltGr+V generates XK_Enter. |
+bool IsTtyFunctionOrSpaceKey(KeySym keysym) { |
+ KeySym keysyms[] = { |
+ XK_BackSpace, |
+ XK_Tab, |
+ XK_Linefeed, |
+ XK_Clear, |
+ XK_Return, |
+ XK_Pause, |
+ XK_Scroll_Lock, |
+ XK_Sys_Req, |
+ XK_Escape, |
+ XK_Delete, |
+ XK_space |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(keysyms); ++i) { |
+ if (keysyms[i] == keysym) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
} // namespace |
// Get an ui::KeyboardCode from an X keyevent |
@@ -492,7 +518,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) { |
XLookupString(xkey, NULL, 0, &keysym, NULL); |
if (IsKeypadKey(keysym) || IsPrivateKeypadKey(keysym) || |
IsCursorKey(keysym) || IsPFKey(keysym) || IsFunctionKey(keysym) || |
- IsModifierKey(keysym)) { |
+ IsModifierKey(keysym) || IsTtyFunctionOrSpaceKey(keysym)) { |
return KeyboardCodeFromXKeysym(keysym); |
} |