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 e97f19a1a6e70df2ea1e18ca2dbab3121f8023f3..7f5511f0eefbf1d1c22e46eb96134f7e4cf43d7a 100644 |
--- a/ui/events/keycodes/keyboard_code_conversion_x.cc |
+++ b/ui/events/keycodes/keyboard_code_conversion_x.cc |
@@ -1327,4 +1327,30 @@ void InitXKeyEventFromXIDeviceEvent(const XEvent& src, XEvent* xkeyevent) { |
xkeyevent->xkey.same_screen = 1; |
} |
+unsigned int XKeyCodeForWindowsKeyCode(ui::KeyboardCode key_code, |
+ int flags, |
+ XDisplay* display) { |
+ // SHIFT state is ignored in the call to XKeysymForWindowsKeyCode() here |
+ // because we map the XKeysym back to a keycode, i.e. a physical key position. |
+ // Using a SHIFT-modified XKeysym would sometimes yield X keycodes that, |
+ // while technically valid, may be surprising in that they do not match |
+ // the keycode of the original press, and conflict with assumptions in |
+ // other code. |
+ // |
+ // For example, in a US layout, Shift-9 has the interpretation XK_parenleft, |
+ // but the keycode KEY_9 alone does not map to XK_parenleft; instead, |
+ // XKeysymToKeycode() returns KEY_KPLEFTPAREN (keypad left parenthesis) |
+ // which does map to XK_parenleft -- notwithstanding that keyboards with |
+ // dedicated number pad parenthesis keys are currently uncommon. |
+ // |
+ // Similarly, Shift-Comma has the interpretation XK_less, but KEY_COMMA |
+ // alone does not map to XK_less; XKeysymToKeycode() returns KEY_102ND |
+ // (the '<>' key between Shift and Z on 105-key keyboards) which does. |
+ // |
+ // crbug.com/386066 and crbug.com/390263 are examples of problems |
+ // associated with this. |
+ // |
+ return XKeysymToKeycode(display, XKeysymForWindowsKeyCode(key_code, false)); |
+} |
+ |
} // namespace ui |