Generate located Windows keycodes for number pad keys under Ozone
Makes Ozone's XKB keyboard layout support generate Windows keycodes
VKEY_NUMPAD0 through VKEY_NUMPAD9 for number pad keys, rather than
VKEY_0 through VKEY_9, to match the X11 behaviour.
BUG=574458
Review URL: https://codereview.chromium.org/1566463002
Cr-Commit-Position: refs/heads/master@{#381709}
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
index eb072d0..9367b62 100644
--- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
+++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
@@ -33,10 +33,15 @@
scoped_ptr<char, base::FreeDeleter>)>
LoadKeymapCallback;
-KeyboardCode AlphanumericKeyboardCode(base::char16 character) {
+KeyboardCode AlphanumericKeyboardCode(xkb_keysym_t xkb_keysym,
+ base::char16 character) {
// Plain ASCII letters and digits map directly to VKEY values.
- if ((character >= '0') && (character <= '9'))
- return static_cast<KeyboardCode>(VKEY_0 + character - '0');
+ if ((character >= '0') && (character <= '9')) {
+ int zero = ((xkb_keysym >= XKB_KEY_KP_0) && (xkb_keysym <= XKB_KEY_KP_9))
+ ? VKEY_NUMPAD0
+ : VKEY_0;
+ return static_cast<KeyboardCode>(zero + character - '0');
+ }
if ((character >= 'a') && (character <= 'z'))
return static_cast<KeyboardCode>(VKEY_A + character - 'a');
if ((character >= 'A') && (character <= 'Z'))
@@ -783,7 +788,7 @@
}
*dom_key = DomKey::FromCharacter(character);
- *key_code = AlphanumericKeyboardCode(character);
+ *key_code = AlphanumericKeyboardCode(xkb_keysym, character);
if (*key_code == VKEY_UNKNOWN) {
*key_code = DifficultKeyboardCode(dom_code, flags, xkb_keycode, xkb_flags,
xkb_keysym, character);
@@ -884,7 +889,7 @@
return NonPrintableDomKeyToKeyboardCode(plain_key);
// Plain ASCII letters and digits map directly to VKEY values.
- KeyboardCode key_code = AlphanumericKeyboardCode(plain_character);
+ KeyboardCode key_code = AlphanumericKeyboardCode(xkb_keysym, plain_character);
if (key_code != VKEY_UNKNOWN)
return key_code;
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
index ed59617..b8488af20 100644
--- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
+++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
@@ -45,6 +45,7 @@
struct KeysymEntry {
DomCode dom_code;
xkb_keysym_t keysym;
+ base::char16 character;
};
struct RuleNames {
@@ -128,7 +129,7 @@
return false;
}
*xkb_keysym = keysym_entry_->keysym;
- *character = 0;
+ *character = keysym_entry_->character;
return true;
}
return false;
@@ -815,6 +816,9 @@
{{DomCode::ENTER, XKB_KEY_Return}, VKEY_RETURN},
{{DomCode::NUMPAD_ENTER, XKB_KEY_KP_Enter}, VKEY_RETURN},
{{DomCode::SLEEP, XKB_KEY_XF86Sleep}, VKEY_SLEEP},
+ // Verify that number pad digits produce located VKEY codes.
+ {{DomCode::NUMPAD0, XKB_KEY_KP_0, '0'}, VKEY_NUMPAD0},
+ {{DomCode::NUMPAD9, XKB_KEY_KP_9, '9'}, VKEY_NUMPAD9},
};
for (const auto& e : kVkeyTestCase) {
SCOPED_TRACE(static_cast<int>(e.test.dom_code));