Commit 7515213c authored by Nick Diego Yamane's avatar Nick Diego Yamane Committed by Commit Bot

Keep native event usage only in KeyEvent initialization

As part of X11 PlatformEvent migration effort, this CL eliminates
native_event() usage from KeyEvent::IsRepeated method, which is only
called at object initialization, this eliminating one more native event
usage after event object construction.

This corresponds to item 1.5 of PlatformEvent migration doc:
https://docs.google.com/document/d/1Neh2p6f8pew9SPuEAtnJMafozAY7uhAIfhwd43CLETc

Bug: 965991
Change-Id: Ib5ad9f7da00e1d26b86616033eee343676e5a494
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1816777Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Commit-Queue: Nick Yamane <nickdiego@igalia.com>
Cr-Commit-Position: refs/heads/master@{#703780}
parent df44699b
......@@ -838,71 +838,6 @@ KeyEvent* KeyEvent::last_key_event_ = nullptr;
KeyEvent* KeyEvent::last_ibus_key_event_ = nullptr;
#endif
// static
bool KeyEvent::IsRepeated(const KeyEvent& event) {
// A safe guard in case if there were continuous key pressed events that are
// not auto repeat.
const int kMaxAutoRepeatTimeMs = 2000;
KeyEvent** last_key_event;
#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.
last_key_event = X11EventHasNonStandardState(event.native_event())
? &last_ibus_key_event_
: &last_key_event_;
#else
last_key_event = &last_key_event_;
#endif
if (event.is_char())
return false;
if (event.type() == ui::ET_KEY_RELEASED) {
delete *last_key_event;
*last_key_event = nullptr;
return false;
}
CHECK_EQ(ui::ET_KEY_PRESSED, event.type());
if (!(*last_key_event)) {
*last_key_event = new KeyEvent(event);
return false;
} else if (event.time_stamp() == (*last_key_event)->time_stamp()) {
// The KeyEvent is created from the same native event.
return ((*last_key_event)->flags() & ui::EF_IS_REPEAT) != 0;
}
DCHECK(*last_key_event);
bool is_repeat = false;
#if defined(OS_WIN)
if (event.HasNativeEvent()) {
// Bit 30 of lParam represents the "previous key state". If set, the key
// was already down, therefore this is an auto-repeat.
is_repeat = (event.native_event().lParam & 0x40000000) != 0;
}
#endif
if (!is_repeat) {
if (event.key_code() == (*last_key_event)->key_code() &&
event.flags() == ((*last_key_event)->flags() & ~ui::EF_IS_REPEAT) &&
(event.time_stamp() - (*last_key_event)->time_stamp())
.InMilliseconds() < kMaxAutoRepeatTimeMs) {
is_repeat = true;
}
}
if (is_repeat) {
(*last_key_event)->set_time_stamp(event.time_stamp());
(*last_key_event)->set_flags((*last_key_event)->flags() | ui::EF_IS_REPEAT);
return true;
}
delete *last_key_event;
*last_key_event = new KeyEvent(event);
return false;
}
KeyEvent::KeyEvent(const PlatformEvent& native_event)
: KeyEvent(native_event, EventFlagsFromNative(native_event)) {}
......@@ -915,10 +850,15 @@ KeyEvent::KeyEvent(const PlatformEvent& native_event, int event_flags)
INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, time_stamp());
latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT);
if (IsRepeated(*this))
set_flags(flags() | ui::EF_IS_REPEAT);
KeyEvent** last_key_event = &last_key_event_;
#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 (X11EventHasNonStandardState(native_event))
last_key_event = &last_ibus_key_event_;
NormalizeFlags();
key_ = GetDomKeyFromXEvent(native_event);
SetProperties(GetEventPropertiesFromXEvent(type(), *native_event));
......@@ -933,6 +873,9 @@ KeyEvent::KeyEvent(const PlatformEvent& native_event, int event_flags)
set_flags(adjusted_flags);
}
#endif
if (IsRepeated(last_key_event))
set_flags(flags() | ui::EF_IS_REPEAT);
}
KeyEvent::KeyEvent(EventType type,
......@@ -1033,6 +976,63 @@ void KeyEvent::ApplyLayout() const {
key_ = DomKey::UNIDENTIFIED;
}
bool KeyEvent::IsRepeated(KeyEvent** last_key_event) {
DCHECK(last_key_event);
// A safe guard in case if there were continuous key pressed events that are
// not auto repeat.
const int kMaxAutoRepeatTimeMs = 2000;
if (is_char())
return false;
if (type() == ui::ET_KEY_RELEASED) {
delete *last_key_event;
*last_key_event = nullptr;
return false;
}
CHECK_EQ(ui::ET_KEY_PRESSED, type());
KeyEvent* last = *last_key_event;
if (!last) {
*last_key_event = new KeyEvent(*this);
return false;
} else if (time_stamp() == last->time_stamp()) {
// The KeyEvent is created from the same native event.
return (last->flags() & ui::EF_IS_REPEAT) != 0;
}
DCHECK(last);
bool is_repeat = false;
#if defined(OS_WIN)
if (HasNativeEvent()) {
// Bit 30 of lParam represents the "previous key state". If set, the key
// was already down, therefore this is an auto-repeat.
is_repeat = (native_event().lParam & 0x40000000) != 0;
}
#endif
if (!is_repeat) {
if (key_code() == last->key_code() &&
flags() == (last->flags() & ~ui::EF_IS_REPEAT) &&
(time_stamp() - last->time_stamp()).InMilliseconds() <
kMaxAutoRepeatTimeMs) {
is_repeat = true;
}
}
if (is_repeat) {
last->set_time_stamp(time_stamp());
last->set_flags(last->flags() | ui::EF_IS_REPEAT);
return true;
}
delete *last_key_event;
*last_key_event = new KeyEvent(*this);
return false;
}
DomKey KeyEvent::GetDomKey() const {
// Determination of key_ may be done lazily.
if (key_ == DomKey::NONE)
......
......@@ -894,7 +894,9 @@ class EVENTS_EXPORT KeyEvent : public Event {
// Determine key_ on a keystroke event from code_ and flags().
void ApplyLayout() const;
static bool IsRepeated(const KeyEvent& event);
// Tells if this is a repeated KeyEvent based on |last_key_event|, which is
// then updated with the new last KeyEvent address.
bool IsRepeated(KeyEvent** last_key_event);
KeyboardCode key_code_;
......
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