diff options
Diffstat (limited to 'chromium/ui/events/event.cc')
-rw-r--r-- | chromium/ui/events/event.cc | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/chromium/ui/events/event.cc b/chromium/ui/events/event.cc index 8f6c9a745bc..219c9c42080 100644 --- a/chromium/ui/events/event.cc +++ b/chromium/ui/events/event.cc @@ -8,6 +8,7 @@ #include <cstring> #include <utility> +#include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_macros.h" @@ -138,6 +139,14 @@ std::string ScrollEventPhaseToString(ScrollEventPhase phase) { } } +#if defined(USE_OZONE) +uint32_t ScanCodeFromNative(const PlatformEvent& native_event) { + const ui::KeyEvent* event = static_cast<const ui::KeyEvent*>(native_event); + DCHECK(event->IsKeyEvent()); + return event->scan_code(); +} +#endif // defined(USE_OZONE) + } // namespace //////////////////////////////////////////////////////////////////////////////// @@ -784,6 +793,9 @@ KeyEvent::KeyEvent(const PlatformEvent& native_event) KeyEvent::KeyEvent(const PlatformEvent& native_event, int event_flags) : Event(native_event, EventTypeFromNative(native_event), event_flags), key_code_(KeyboardCodeFromNative(native_event)), +#if defined(USE_OZONE) + scan_code_(ScanCodeFromNative(native_event)), +#endif // defined(USE_OZONE) code_(CodeFromNative(native_event)), is_char_(IsCharFromNative(native_event)) { InitializeNative(); @@ -837,14 +849,21 @@ KeyEvent::KeyEvent(base::char16 character, KeyEvent::KeyEvent(const KeyEvent& rhs) : Event(rhs), key_code_(rhs.key_code_), +#if defined(USE_OZONE) + scan_code_(rhs.scan_code_), +#endif // defined(USE_OZONE) code_(rhs.code_), is_char_(rhs.is_char_), - key_(rhs.key_) {} + key_(rhs.key_) { +} KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) { if (this != &rhs) { Event::operator=(rhs); key_code_ = rhs.key_code_; +#if defined(USE_OZONE) + scan_code_ = rhs.scan_code_; +#endif // defined(USE_OZONE) code_ = rhs.code_; key_ = rhs.key_; is_char_ = rhs.is_char_; @@ -859,16 +878,12 @@ void KeyEvent::InitializeNative() { INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, time_stamp()); latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT); - KeyEvent** last_key_event = &last_key_event_; + // Check if this is a key repeat. This must be called before initial flags + // processing, e.g: NormalizeFlags(), to avoid issues like crbug.com/1069690. + if (IsRepeated(GetLastKeyEvent())) + set_flags(flags() | ui::EF_IS_REPEAT); #if defined(USE_X11) - // Use a different static variable for key events that have non standard - // state masks as it may be reposted by an IME. IBUS-GTK uses this field - // to detect the re-posted event for example. crbug.com/385873. - if (properties() && properties()->contains(kPropertyKeyboardIBusFlag)) { - last_key_event = &last_ibus_key_event_; - } - NormalizeFlags(); #elif defined(OS_WIN) // Only Windows has native character events. @@ -881,9 +896,6 @@ void KeyEvent::InitializeNative() { set_flags(adjusted_flags); } #endif - - if (IsRepeated(last_key_event)) - set_flags(flags() | ui::EF_IS_REPEAT); } void KeyEvent::ApplyLayout() const { @@ -976,6 +988,19 @@ bool KeyEvent::IsRepeated(KeyEvent** last_key_event) { return false; } +KeyEvent** KeyEvent::GetLastKeyEvent() { +#if defined(USE_X11) + // Use a different static variable for key events that have non standard + // state masks as it may be reposted by an IME. IBUS-GTK uses this field + // to detect the re-posted event for example. crbug.com/385873. + return properties() && properties()->contains(kPropertyKeyboardIBusFlag) + ? &last_ibus_key_event_ + : &last_key_event_; +#else + return &last_key_event_; +#endif +} + DomKey KeyEvent::GetDomKey() const { // Determination of key_ may be done lazily. if (key_ == DomKey::NONE) |