Commit 8306f1e2 authored by shuchen@chromium.org's avatar shuchen@chromium.org

Support non-US layout for rewriting Numpad key events.

BUG=335644
TEST=Verified on linux_chromeos.

Review URL: https://codereview.chromium.org/446693005

Cr-Commit-Position: refs/heads/master@{#288324}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288324 0039d316-1c4b-4281-b951-d872f2087c98
parent 19f2eabd
......@@ -212,6 +212,7 @@ void EventRewriter::BuildRewrittenKeyEvent(
else
xkeyevent.xkey = xev->xkey;
unsigned int original_x11_keycode = xkeyevent.xkey.keycode;
// Update native event to match rewritten |ui::Event|.
// The X11 keycode represents a physical key position, so it shouldn't
// change unless we have actually changed keys, not just modifiers.
......@@ -222,6 +223,26 @@ void EventRewriter::BuildRewrittenKeyEvent(
}
ui::KeyEvent x11_key_event(&xkeyevent);
rewritten_key_event = new ui::KeyEvent(x11_key_event);
// For numpad keys, the key char should always NOT be changed because
// XKeyCodeForWindowsKeyCode method cannot handle non-US keyboard layout.
// The correct key char can be got from original X11 keycode but not for the
// rewritten X11 keycode.
// For Shift+NumpadKey cases, use the rewritten X11 keycode (US layout).
// Please see crbug.com/335644.
if (key_code >= ui::VKEY_NUMPAD0 && key_code <= ui::VKEY_DIVIDE) {
XEvent numpad_xevent;
numpad_xevent.xkey = xkeyevent.xkey;
// Remove the shift state before getting key char.
// Because X11/XKB sometimes returns unexpected key char for
// Shift+NumpadKey. e.g. Shift+Numpad_4 returns 'D', etc.
numpad_xevent.xkey.state &= ~ShiftMask;
numpad_xevent.xkey.state |= Mod2Mask; // Always set NumLock mask.
if (!(flags & ui::EF_SHIFT_DOWN))
numpad_xevent.xkey.keycode = original_x11_keycode;
rewritten_key_event->set_character(
ui::GetCharacterFromXEvent(&numpad_xevent));
}
}
#endif
if (!rewritten_key_event)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment