Chromium Code Reviews| 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 4311a96f7e5b34d7d41cabf086b4104c738540e2..03caac91778d438146aaef64be5c0147ba314ee4 100644 |
| --- a/ui/events/keycodes/keyboard_code_conversion_x.cc |
| +++ b/ui/events/keycodes/keyboard_code_conversion_x.cc |
| @@ -12,6 +12,12 @@ |
| #include <X11/Xutil.h> |
| #include <X11/extensions/XInput2.h> |
| #include <X11/keysym.h> |
| +#if !defined(XK_dead_greek) |
| +// Old versions of <X11/keysymdef.h> don't define XK_dead_greek. If it's not |
|
Wez
2014/10/03 17:57:00
Do we ever build on platforms that don't have this
Yuki
2014/10/06 07:50:18
I found that trybots(Precise?) don't define this m
|
| +// defined, define it for ourselves. (It's not sure that exactly which version |
| +// of X11 first defined XK_dead_greek.) |
| +#define XK_dead_greek 0xfe8c |
| +#endif |
| #include "base/basictypes.h" |
| #include "base/logging.h" |
| @@ -459,6 +465,146 @@ KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) { |
| return VKEY_UNKNOWN; |
| } |
| +bool IsHardwareKeycodeFallbackAllowed(unsigned int keysym) { |
| + // The following modifier keys and dead keys should not fall back to |
| + // the hardware-keycode-based US layout. |
| + // |
| + // For example, suppose that keycode 108 (Right Alt key) is bound to |
| + // XK_ISO_Level3_Latch in order to produce "à" by the latch key + a. |
| + // If the latch key falls back to VKEY_RMENU, VKEY_RMENU is treated |
| + // as accelerator key and it focuses the hamburger menu and the |
| + // following 'a' key cannot produce "à". So these modifier keys and |
| + // dead keys shouldn't fall back to the hardware-key-based US layout. |
|
Wez
2014/10/03 17:57:01
nit: Suggest just "See crbug.com/<bug #>" here.
Yuki
2014/10/06 07:50:18
Done.
|
| + switch (keysym) { |
| + case XK_Shift_L: |
| + case XK_Shift_R: |
|
Wez
2014/10/03 17:57:01
Why are these (and Control, etc) in here? We have
Yuki
2014/10/06 07:50:18
You're right. I wanted to define this function in
|
| + case XK_Control_L: |
| + case XK_Control_R: |
| + case XK_Caps_Lock: |
| + case XK_Shift_Lock: |
| + case XK_Meta_L: |
| + case XK_Meta_R: |
| + case XK_Alt_L: |
| + case XK_Alt_R: |
| + case XK_Super_L: |
| + case XK_Super_R: |
| + case XK_Hyper_L: |
| + case XK_Hyper_R: |
| + case XK_ISO_Lock: |
| + case XK_ISO_Level2_Latch: |
| + case XK_ISO_Level3_Shift: |
| + case XK_ISO_Level3_Latch: |
| + case XK_ISO_Level3_Lock: |
| + case XK_ISO_Level5_Shift: |
| + case XK_ISO_Level5_Latch: |
| + case XK_ISO_Level5_Lock: |
| + case XK_ISO_Group_Latch: |
| + case XK_ISO_Group_Lock: |
| + case XK_ISO_Next_Group: |
| + case XK_ISO_Next_Group_Lock: |
| + case XK_ISO_Prev_Group: |
| + case XK_ISO_Prev_Group_Lock: |
| + case XK_ISO_First_Group: |
| + case XK_ISO_First_Group_Lock: |
| + case XK_ISO_Last_Group: |
| + case XK_ISO_Last_Group_Lock: |
| + case XK_dead_grave: |
| + case XK_dead_acute: |
| + case XK_dead_circumflex: |
| + case XK_dead_tilde: |
| + case XK_dead_macron: |
| + case XK_dead_breve: |
| + case XK_dead_abovedot: |
| + case XK_dead_diaeresis: |
| + case XK_dead_abovering: |
| + case XK_dead_doubleacute: |
| + case XK_dead_caron: |
| + case XK_dead_cedilla: |
| + case XK_dead_ogonek: |
| + case XK_dead_iota: |
| + case XK_dead_voiced_sound: |
| + case XK_dead_semivoiced_sound: |
| + case XK_dead_belowdot: |
| + case XK_dead_hook: |
| + case XK_dead_horn: |
| + case XK_dead_stroke: |
| + case XK_dead_abovecomma: |
| + case XK_dead_abovereversedcomma: |
| + case XK_dead_doublegrave: |
| + case XK_dead_belowring: |
| + case XK_dead_belowmacron: |
| + case XK_dead_belowcircumflex: |
| + case XK_dead_belowtilde: |
| + case XK_dead_belowbreve: |
| + case XK_dead_belowdiaeresis: |
| + case XK_dead_invertedbreve: |
| + case XK_dead_belowcomma: |
| + case XK_dead_currency: |
| + case XK_dead_a: |
| + case XK_dead_A: |
| + case XK_dead_e: |
| + case XK_dead_E: |
| + case XK_dead_i: |
| + case XK_dead_I: |
| + case XK_dead_o: |
| + case XK_dead_O: |
| + case XK_dead_u: |
| + case XK_dead_U: |
| + case XK_dead_small_schwa: |
| + case XK_dead_capital_schwa: |
| + case XK_dead_greek: |
| + case XK_First_Virtual_Screen: |
| + case XK_Prev_Virtual_Screen: |
| + case XK_Next_Virtual_Screen: |
| + case XK_Last_Virtual_Screen: |
| + case XK_Terminate_Server: |
| + case XK_AccessX_Enable: |
| + case XK_AccessX_Feedback_Enable: |
| + case XK_RepeatKeys_Enable: |
| + case XK_SlowKeys_Enable: |
| + case XK_BounceKeys_Enable: |
| + case XK_StickyKeys_Enable: |
| + case XK_MouseKeys_Enable: |
| + case XK_MouseKeys_Accel_Enable: |
| + case XK_Overlay1_Enable: |
| + case XK_Overlay2_Enable: |
| + case XK_AudibleBell_Enable: |
| + case XK_Pointer_Left: |
| + case XK_Pointer_Right: |
| + case XK_Pointer_Up: |
| + case XK_Pointer_Down: |
| + case XK_Pointer_UpLeft: |
| + case XK_Pointer_UpRight: |
| + case XK_Pointer_DownLeft: |
| + case XK_Pointer_DownRight: |
| + case XK_Pointer_Button_Dflt: |
| + case XK_Pointer_Button1: |
| + case XK_Pointer_Button2: |
| + case XK_Pointer_Button3: |
| + case XK_Pointer_Button4: |
| + case XK_Pointer_Button5: |
| + case XK_Pointer_DblClick_Dflt: |
| + case XK_Pointer_DblClick1: |
| + case XK_Pointer_DblClick2: |
| + case XK_Pointer_DblClick3: |
| + case XK_Pointer_DblClick4: |
| + case XK_Pointer_DblClick5: |
| + case XK_Pointer_Drag_Dflt: |
| + case XK_Pointer_Drag1: |
| + case XK_Pointer_Drag2: |
| + case XK_Pointer_Drag3: |
| + case XK_Pointer_Drag4: |
| + case XK_Pointer_Drag5: |
| + case XK_Pointer_EnableKeys: |
| + case XK_Pointer_Accelerate: |
| + case XK_Pointer_DfltBtnNext: |
| + case XK_Pointer_DfltBtnPrev: |
| + return false; |
| + default: |
| + return true; |
| + } |
| +} |
| + |
| } // namespace |
| // Get an ui::KeyboardCode from an X keyevent |
| @@ -545,7 +691,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const XEvent* xev) { |
| } |
| keycode = KeyboardCodeFromXKeysym(keysym); |
| - if (keycode == VKEY_UNKNOWN) |
| + if (keycode == VKEY_UNKNOWN && IsHardwareKeycodeFallbackAllowed(keysym)) |
| keycode = DefaultKeyboardCodeFromHardwareKeycode(xkey->keycode); |
| return keycode; |