Chromium Code Reviews| Index: ui/events/event.cc |
| diff --git a/ui/events/event.cc b/ui/events/event.cc |
| index 4a8370bb16aebee181bd887a4fcf4664ccea18f9..7040c65c8ee67ca6cc0fffaa033d85ad798ab48b 100644 |
| --- a/ui/events/event.cc |
| +++ b/ui/events/event.cc |
| @@ -7,6 +7,7 @@ |
| #if defined(USE_X11) |
| #include <X11/extensions/XInput2.h> |
| #include <X11/Xlib.h> |
| +#include <X11/keysym.h> |
| #endif |
| #include <cmath> |
| @@ -591,6 +592,11 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event) |
| #if defined(USE_X11) |
| NormalizeFlags(); |
| #endif |
| +#if defined(OS_WIN) |
| + // Only Windows has native character events. |
| + if (is_char_) |
| + character_ = native_event.wParam; |
| +#endif |
| } |
| KeyEvent::KeyEvent(EventType type, |
| @@ -600,7 +606,7 @@ KeyEvent::KeyEvent(EventType type, |
| key_code_(key_code), |
| is_char_(false), |
| platform_keycode_(0), |
| - character_(GetCharacterFromKeyCode(key_code, flags)) { |
| + character_() { |
| } |
| KeyEvent::KeyEvent(EventType type, |
| @@ -612,7 +618,7 @@ KeyEvent::KeyEvent(EventType type, |
| code_(code), |
| is_char_(false), |
| platform_keycode_(0), |
| - character_(GetCharacterFromKeyCode(key_code, flags)) { |
| + character_(0) { |
| } |
| KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) |
| @@ -624,15 +630,21 @@ KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) |
| } |
| base::char16 KeyEvent::GetCharacter() const { |
| - if (character_) |
| + if (is_char_ || character_) |
| return character_; |
| + // TODO(kpschoedel): streamline these cases after settling Ozone |
| + // positional coding. |
| #if defined(OS_WIN) |
| - return (native_event().message == WM_CHAR) ? key_code_ : |
| - GetCharacterFromKeyCode(key_code_, flags()); |
| + // Native Windows character events always have is_char_ == true, |
| + // so this is a synthetic or native keystroke event. |
| + character_ = GetCharacterFromKeyCode(key_code_, flags()); |
| + return character_; |
| #elif defined(USE_X11) |
| - if (!native_event()) |
| - return GetCharacterFromKeyCode(key_code_, flags()); |
| + if (!native_event()) { |
| + character_ = GetCharacterFromKeyCode(key_code_, flags()); |
| + return character_; |
| + } |
| DCHECK(native_event()->type == KeyPress || |
| native_event()->type == KeyRelease || |
| @@ -730,6 +742,78 @@ void KeyEvent::SetTranslated(bool translated) { |
| } |
| } |
| +bool KeyEvent::IsRightSideKey() const { |
| + switch (key_code_) { |
| + case VKEY_CONTROL: |
| + case VKEY_SHIFT: |
| + case VKEY_MENU: |
| + case VKEY_LWIN: |
| +#if defined(USE_X11) |
| + // Under X11, setting code_ requires platform-dependent information, and |
| + // currently assumes that X keycodes are based on Linux evdev keycodes. |
| + // In certain test environments this is not the case, and code_ is not |
| + // set accurately, so we need a different mechanism. Fortunately X11 key |
| + // mapping preserves the left-right distinction, so testing keysyms works |
| + // if the value is available (as it is for all X11 native-based events). |
| + if (platform_keycode_) { |
| + return (platform_keycode_ == XK_Shift_R) || |
| + (platform_keycode_ == XK_Control_R) || |
| + (platform_keycode_ == XK_Alt_R) || |
| + (platform_keycode_ == XK_Meta_R) || |
| + (platform_keycode_ == XK_Super_R) || |
| + (platform_keycode_ == XK_Hyper_R); |
| + } |
| + // Fall through to the generic code if we have no platform_keycode_. |
| + // Under X11, this must be a synthetic event, so we can require that |
| + // code_ be set correctly. |
| +#endif |
| + return ((code_.size() > 5) && |
| + (code_.compare(code_.size() - 5, 5, "Right", 5)) == 0); |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| +KeyboardCode KeyEvent::GetLocatedWindowsKeyboardCode() const { |
| + switch (key_code_) { |
| + case VKEY_SHIFT: |
| + return IsRightSideKey() ? VKEY_RSHIFT : VKEY_LSHIFT; |
| + case VKEY_CONTROL: |
| + return IsRightSideKey() ? VKEY_RCONTROL : VKEY_LCONTROL; |
| + case VKEY_MENU: |
| + return IsRightSideKey() ? VKEY_RMENU : VKEY_LMENU; |
| + case VKEY_LWIN: |
| + return IsRightSideKey() ? VKEY_RWIN : VKEY_LWIN; |
| + case VKEY_0: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD0 : VKEY_0; |
|
sadrul
2014/08/19 03:46:19
EF_NUMPAD_KEY is set only on X11. Does that make a
kpschoedel
2014/08/19 21:58:10
It's only used for X11 / Ozone at present, and it'
|
| + case VKEY_1: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD1 : VKEY_1; |
| + case VKEY_2: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD2 : VKEY_2; |
| + case VKEY_3: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD3 : VKEY_3; |
| + case VKEY_4: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD4 : VKEY_4; |
| + case VKEY_5: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD5 : VKEY_5; |
| + case VKEY_6: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD6 : VKEY_6; |
| + case VKEY_7: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD7 : VKEY_7; |
| + case VKEY_8: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD8 : VKEY_8; |
| + case VKEY_9: |
| + return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD9 : VKEY_9; |
| + // Locatable codes not currently distinguished: |
|
sadrul
2014/08/19 03:46:19
Should be a TODO (maybe with an accompanying crbug
kpschoedel
2014/08/19 21:58:10
I'll just delete this. There will probably never b
|
| + // case VKEY_RETURN: |
| + // return (flags() & EF_NUMPAD_KEY) ? VKEY_RETURN : ** numpad enter **; |
| + // case VKEY_OEM_PLUS: |
| + // return (flags() & EF_NUMPAD_KEY) ? VKEY_OEM_PLUS : ** numpad equal **; |
| + default: |
| + return key_code_; |
| + } |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // ScrollEvent |