Chromium Code Reviews| Index: ui/events/ozone/evdev/keyboard_evdev.cc |
| diff --git a/ui/events/ozone/evdev/keyboard_evdev.cc b/ui/events/ozone/evdev/keyboard_evdev.cc |
| index c0bd7e7d37a2b474b31e073656223d875190d0c2..d08c20fe015ce803668830ef67f72f38a52f9f88 100644 |
| --- a/ui/events/ozone/evdev/keyboard_evdev.cc |
| +++ b/ui/events/ozone/evdev/keyboard_evdev.cc |
| @@ -4,6 +4,8 @@ |
| #include "ui/events/ozone/evdev/keyboard_evdev.h" |
| +#include "base/single_thread_task_runner.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "ui/events/event.h" |
| #include "ui/events/event_constants.h" |
| #include "ui/events/event_utils.h" |
| @@ -59,7 +61,9 @@ KeyboardEvdev::KeyboardEvdev(EventModifiersEvdev* modifiers, |
| modifiers_(modifiers), |
| keyboard_layout_engine_(keyboard_layout_engine), |
| repeat_enabled_(true), |
| - repeat_key_(KEY_RESERVED) { |
| + repeat_key_(KEY_RESERVED), |
| + repeat_sequence_(0), |
| + weak_ptr_factory_(this) { |
| repeat_delay_ = base::TimeDelta::FromMilliseconds(kRepeatDelayMs); |
| repeat_interval_ = base::TimeDelta::FromMilliseconds(kRepeatIntervalMs); |
| } |
| @@ -146,29 +150,31 @@ void KeyboardEvdev::UpdateKeyRepeat(unsigned int key, bool down) { |
| void KeyboardEvdev::StartKeyRepeat(unsigned int key) { |
| repeat_key_ = key; |
| - repeat_delay_timer_.Start( |
| - FROM_HERE, repeat_delay_, |
| - base::Bind(&KeyboardEvdev::OnRepeatDelayTimeout, base::Unretained(this))); |
| - repeat_interval_timer_.Stop(); |
| + repeat_sequence_++; |
| + |
| + ScheduleKeyRepeat(repeat_delay_); |
| } |
| void KeyboardEvdev::StopKeyRepeat() { |
| - repeat_key_ = KEY_RESERVED; |
| - repeat_delay_timer_.Stop(); |
| - repeat_interval_timer_.Stop(); |
| + repeat_sequence_++; |
| } |
| -void KeyboardEvdev::OnRepeatDelayTimeout() { |
| - DispatchKey(repeat_key_, true /* down */, true /* repeat */, |
| - EventTimeForNow()); |
| +void KeyboardEvdev::ScheduleKeyRepeat(const base::TimeDelta& delay) { |
| + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| + FROM_HERE, base::Bind(&KeyboardEvdev::OnRepeatTimeout, |
| + weak_ptr_factory_.GetWeakPtr(), repeat_sequence_), |
| + delay); |
| +} |
| + |
| +void KeyboardEvdev::OnRepeatTimeout(unsigned int sequence) { |
| + if (repeat_sequence_ != sequence) |
| + return; |
| - repeat_interval_timer_.Start( |
| - FROM_HERE, repeat_interval_, |
| - base::Bind(&KeyboardEvdev::OnRepeatIntervalTimeout, |
| - base::Unretained(this))); |
| + DispatchKeyRepeat(repeat_key_); |
|
alexst (slow to review)
2015/04/07 18:20:58
Probably worth just moving DispatchKey from Dispat
spang
2015/04/07 18:28:49
Done.
|
| + ScheduleKeyRepeat(repeat_interval_); |
| } |
| -void KeyboardEvdev::OnRepeatIntervalTimeout() { |
| +void KeyboardEvdev::DispatchKeyRepeat(unsigned int key) { |
| DispatchKey(repeat_key_, true /* down */, true /* repeat */, |
| EventTimeForNow()); |
| } |