Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(630)

Unified Diff: ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc

Issue 990483002: ozone: evdev: Fix possibility of stuck keys with libevdev (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
index 58b38a0a20fdbc8a406be17af0a000a6101d0bd6..47965344e3206961c1e359b0ce5ec8c5f233fac6 100644
--- a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
@@ -79,10 +79,6 @@ base::TimeDelta StimeToTimedelta(stime_t timestamp) {
base::Time::kMicrosecondsPerSecond);
}
-base::TimeDelta TimeValToTimeDelta(const timeval& tv) {
- return base::TimeDelta::FromMicroseconds(tv.tv_sec * 1000000 + tv.tv_usec);
-}
-
// Number of fingers for scroll gestures.
const int kGestureScrollFingerCount = 2;
@@ -160,12 +156,14 @@ void GestureInterpreterLibevdevCros::OnLibEvdevCrosOpen(
void GestureInterpreterLibevdevCros::OnLibEvdevCrosEvent(Evdev* evdev,
EventStateRec* evstate,
const timeval& time) {
- // If the device has keys no it, dispatch any presses/release.
- DispatchChangedKeys(evdev, time);
+ stime_t timestamp = StimeFromTimeval(&time);
+
+ // If the device has keys on it, dispatch any presses/release.
+ DispatchChangedKeys(evdev->key_state_bitmask, timestamp);
HardwareState hwstate;
memset(&hwstate, 0, sizeof(hwstate));
- hwstate.timestamp = StimeFromTimeval(&time);
+ hwstate.timestamp = timestamp;
// Mouse.
hwstate.rel_x = evstate->rel_x;
@@ -207,6 +205,12 @@ void GestureInterpreterLibevdevCros::OnLibEvdevCrosEvent(Evdev* evdev,
GestureInterpreterPushHardwareState(interpreter_, &hwstate);
}
+void GestureInterpreterLibevdevCros::OnLibEvdevCrosStopped(
+ Evdev* evdev,
+ EventStateRec* state) {
+ ReleaseKeys();
+}
+
void GestureInterpreterLibevdevCros::SetAllowedKeys(
scoped_ptr<std::set<DomCode>> allowed_keys) {
if (!allowed_keys) {
@@ -421,18 +425,19 @@ void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int button,
allow_remap, StimeToTimedelta(time)));
}
-void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev,
- const timeval& time) {
+void GestureInterpreterLibevdevCros::DispatchChangedKeys(
+ unsigned long* new_key_state,
+ stime_t timestamp) {
unsigned long key_state_diff[EVDEV_BITS_TO_LONGS(KEY_CNT)];
// Find changed keys.
for (unsigned long i = 0; i < arraysize(key_state_diff); ++i)
- key_state_diff[i] = evdev->key_state_bitmask[i] ^ prev_key_state_[i];
+ key_state_diff[i] = new_key_state[i] ^ prev_key_state_[i];
// Dispatch events for changed keys.
for (unsigned long key = 0; key < KEY_CNT; ++key) {
if (EvdevBitIsSet(key_state_diff, key)) {
- bool value = EvdevBitIsSet(evdev->key_state_bitmask, key);
+ bool value = EvdevBitIsSet(new_key_state, key);
// Mouse buttons are handled by DispatchMouseButton.
if (key >= BTN_MOUSE && key < BTN_JOYSTICK)
@@ -447,13 +452,20 @@ void GestureInterpreterLibevdevCros::DispatchChangedKeys(Evdev* evdev,
// Dispatch key press or release to keyboard.
dispatcher_->DispatchKeyEvent(
- KeyEventParams(id_, key, value, TimeValToTimeDelta(time)));
+ KeyEventParams(id_, key, value, StimeToTimedelta(timestamp)));
}
}
// Update internal key state.
for (unsigned long i = 0; i < EVDEV_BITS_TO_LONGS(KEY_CNT); ++i)
- prev_key_state_[i] = evdev->key_state_bitmask[i];
+ prev_key_state_[i] = new_key_state[i];
+}
+
+void GestureInterpreterLibevdevCros::ReleaseKeys() {
+ unsigned long new_key_state[EVDEV_BITS_TO_LONGS(KEY_CNT)];
+ memset(&new_key_state, 0, sizeof(new_key_state));
+
+ DispatchChangedKeys(new_key_state, StimeNow());
}
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698