Index: ui/events/event.cc |
diff --git a/ui/events/event.cc b/ui/events/event.cc |
index f10c2081dfc69d72f947c832866eeb547b7120bb..8d87d19acc3ea5e73f38c023c90be4247aedaef7 100644 |
--- a/ui/events/event.cc |
+++ b/ui/events/event.cc |
@@ -479,6 +479,38 @@ void TouchEvent::UpdateForRootTransform( |
//////////////////////////////////////////////////////////////////////////////// |
// KeyEvent |
+// static |
+KeyEvent* KeyEvent::last_key_event_ = NULL; |
+ |
+// static |
+bool KeyEvent::IsRepeated(const KeyEvent& event) { |
+ // A safe guard in case if there were continous key pressed events that are |
+ // not auto repeat. |
+ const int kMaxAutoRepeatTimeMs = 2000; |
+ |
+ if (event.is_char()) |
+ return false; |
+ if (event.type() == ui::ET_KEY_RELEASED) { |
+ delete last_key_event_; |
+ last_key_event_ = NULL; |
+ return false; |
+ } |
+ CHECK_EQ(ui::ET_KEY_PRESSED, event.type()); |
+ if (!last_key_event_) { |
+ last_key_event_ = new KeyEvent(event); |
+ return false; |
+ } |
+ if (event.key_code() == last_key_event_->key_code() && |
+ event.flags() == last_key_event_->flags() && |
+ (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() < |
+ kMaxAutoRepeatTimeMs) { |
+ return true; |
+ } |
+ delete last_key_event_; |
+ last_key_event_ = new KeyEvent(event); |
+ return false; |
+} |
+ |
KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char) |
: Event(native_event, |
EventTypeFromNative(native_event), |
@@ -487,6 +519,9 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char) |
code_(CodeFromNative(native_event)), |
is_char_(is_char), |
character_(0) { |
+ if (IsRepeated(*this)) |
+ set_flags(flags() | ui::EF_IS_REPEAT); |
+ |
#if defined(USE_X11) |
NormalizeFlags(); |
#endif |