Chromium Code Reviews| Index: chrome/browser/chromeos/events/event_rewriter.cc |
| diff --git a/chrome/browser/chromeos/events/event_rewriter.cc b/chrome/browser/chromeos/events/event_rewriter.cc |
| index d7497c6ebae6c6b5f58284d0b37ff9d16c736088..9d833758363e51a4457abfba8cdd8579dd2823ba 100644 |
| --- a/chrome/browser/chromeos/events/event_rewriter.cc |
| +++ b/chrome/browser/chromeos/events/event_rewriter.cc |
| @@ -212,6 +212,7 @@ void EventRewriter::BuildRewrittenKeyEvent( |
| else |
| xkeyevent.xkey = xev->xkey; |
| + unsigned int original_x11_keycode = xkeyevent.xkey.keycode; |
|
oshima
2014/08/08 07:06:08
nit: move this after line 226 (closer to where thi
Shu Chen
2014/08/08 07:10:57
That will result in wrong behavior. Please notice
oshima
2014/08/08 09:32:11
oh, sorry I missed that. please ignore.
|
| // 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. |
|
oshima
2014/08/08 07:06:08
nit: two spaces between ; and //
Shu Chen
2014/08/08 07:10:57
Done.
|
| + 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) |