Index: ui/events/ozone/evdev/event_converter_evdev_impl.cc |
diff --git a/ui/events/ozone/evdev/event_converter_evdev_impl.cc b/ui/events/ozone/evdev/event_converter_evdev_impl.cc |
index 561b393319fe4200d719dacaa8f0abded6b5650e..f6bb26687c8bb09642852fb21f4da93bec2c8a81 100644 |
--- a/ui/events/ozone/evdev/event_converter_evdev_impl.cc |
+++ b/ui/events/ozone/evdev/event_converter_evdev_impl.cc |
@@ -109,6 +109,7 @@ void EventConverterEvdevImpl::AllowAllKeys() { |
void EventConverterEvdevImpl::OnStopped() { |
ReleaseKeys(); |
+ ReleaseMouseButtons(); |
} |
void EventConverterEvdevImpl::ProcessEvents(const input_event* inputs, |
@@ -175,10 +176,7 @@ void EventConverterEvdevImpl::OnKeyChange(unsigned int key, |
return; |
// State transition: !(down) -> (down) |
- if (down) |
- key_state_.set(key); |
- else |
- key_state_.reset(key); |
+ key_state_.set(key, down); |
dispatcher_->DispatchKeyEvent(KeyEventParams(id_, key, down, timestamp)); |
} |
@@ -189,21 +187,45 @@ void EventConverterEvdevImpl::ReleaseKeys() { |
OnKeyChange(key, false /* down */, timestamp); |
} |
+void EventConverterEvdevImpl::ReleaseMouseButtons() { |
+ base::TimeDelta timestamp = ui::EventTimeForNow(); |
+ for (int code = BTN_MOUSE; code < BTN_JOYSTICK; ++code) |
+ OnButtonChange(code, false /* down */, timestamp); |
+} |
+ |
void EventConverterEvdevImpl::OnLostSync() { |
LOG(WARNING) << "kernel dropped input events"; |
// We may have missed key releases. Release everything. |
// TODO(spang): Use EVIOCGKEY to avoid releasing keys that are still held. |
ReleaseKeys(); |
+ ReleaseMouseButtons(); |
} |
void EventConverterEvdevImpl::DispatchMouseButton(const input_event& input) { |
if (!cursor_) |
return; |
- dispatcher_->DispatchMouseButtonEvent(MouseButtonEventParams( |
- id_, cursor_->GetLocation(), input.code, input.value, |
- /* allow_remap */ true, TimeDeltaFromInputEvent(input))); |
+ OnButtonChange(input.code, input.value, TimeDeltaFromInputEvent(input)); |
+} |
+ |
+void EventConverterEvdevImpl::OnButtonChange(int code, |
+ bool down, |
+ const base::TimeDelta& timestamp) { |
+ if (code == BTN_SIDE) |
+ code = BTN_BACK; |
+ else if (code == BTN_EXTRA) |
+ code = BTN_FORWARD; |
+ |
+ int button_offset = code - BTN_MOUSE; |
+ if (mouse_button_state_.test(button_offset) == down) |
+ return; |
+ |
+ mouse_button_state_.set(button_offset, down); |
+ |
+ dispatcher_->DispatchMouseButtonEvent( |
+ MouseButtonEventParams(id_, cursor_->GetLocation(), code, down, |
+ /* allow_remap */ true, timestamp)); |
} |
void EventConverterEvdevImpl::FlushEvents(const input_event& input) { |