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

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

Issue 983213003: ozone: evdev: Fix possibility of stuck mouse buttons (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
« no previous file with comments | « ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 47965344e3206961c1e359b0ce5ec8c5f233fac6..7a0f8c918a4832f53334f807c0ffff5c377f2657 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
@@ -208,7 +208,10 @@ void GestureInterpreterLibevdevCros::OnLibEvdevCrosEvent(Evdev* evdev,
void GestureInterpreterLibevdevCros::OnLibEvdevCrosStopped(
Evdev* evdev,
EventStateRec* state) {
- ReleaseKeys();
+ stime_t timestamp = StimeNow();
+
+ ReleaseKeys(timestamp);
+ ReleaseMouseButtons(timestamp);
}
void GestureInterpreterLibevdevCros::SetAllowedKeys(
@@ -419,6 +422,9 @@ void GestureInterpreterLibevdevCros::OnGestureMetrics(
void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int button,
bool down,
stime_t time) {
+ if (!SetMouseButtonState(button, down))
+ return; // No change.
+
bool allow_remap = is_mouse_;
dispatcher_->DispatchMouseButtonEvent(
MouseButtonEventParams(id_, cursor_->GetLocation(), button, down,
@@ -461,11 +467,34 @@ void GestureInterpreterLibevdevCros::DispatchChangedKeys(
prev_key_state_[i] = new_key_state[i];
}
-void GestureInterpreterLibevdevCros::ReleaseKeys() {
+void GestureInterpreterLibevdevCros::ReleaseKeys(stime_t timestamp) {
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());
+ DispatchChangedKeys(new_key_state, timestamp);
+}
+
+bool GestureInterpreterLibevdevCros::SetMouseButtonState(unsigned int button,
+ bool down) {
+ DCHECK(BTN_MOUSE <= button && button < BTN_JOYSTICK);
+ int button_offset = button - BTN_MOUSE;
+
+ if (mouse_button_state_.test(button_offset) == down)
+ return false;
+
+ // State transition: !(down) -> (down)
+ if (down)
+ mouse_button_state_.set(button_offset);
+ else
+ mouse_button_state_.reset(button_offset);
+
+ return true;
+}
+
+void GestureInterpreterLibevdevCros::ReleaseMouseButtons(stime_t timestamp) {
+ DispatchMouseButton(BTN_LEFT, false /* down */, timestamp);
+ DispatchMouseButton(BTN_MIDDLE, false /* down */, timestamp);
+ DispatchMouseButton(BTN_RIGHT, false /* down */, timestamp);
}
} // namespace ui
« no previous file with comments | « ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698