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