| 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..1de30ff8a49be365e8ab0886e183bfb87991abe8 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,31 +150,30 @@ 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());
|
| -
|
| - repeat_interval_timer_.Start(
|
| - FROM_HERE, repeat_interval_,
|
| - base::Bind(&KeyboardEvdev::OnRepeatIntervalTimeout,
|
| - base::Unretained(this)));
|
| +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::OnRepeatIntervalTimeout() {
|
| +void KeyboardEvdev::OnRepeatTimeout(unsigned int sequence) {
|
| + if (repeat_sequence_ != sequence)
|
| + return;
|
| +
|
| DispatchKey(repeat_key_, true /* down */, true /* repeat */,
|
| EventTimeForNow());
|
| +
|
| + ScheduleKeyRepeat(repeat_interval_);
|
| }
|
|
|
| void KeyboardEvdev::DispatchKey(unsigned int key,
|
|
|