Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(981)

Unified Diff: ui/events/keycodes/keyboard_code_conversion_x.cc

Issue 611993002: linux: Do not fallback to the hardware keycodes for modifers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed wez's review comments. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698