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; |