| Index: ui/events/ozone/evdev/touch_event_converter_evdev.cc
|
| diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev.cc b/ui/events/ozone/evdev/touch_event_converter_evdev.cc
|
| index c46608d938577b8a3ec79c290e71ab7be7ddf89b..fd57301dd96c13cd514b14324be83f5b2ce712e9 100644
|
| --- a/ui/events/ozone/evdev/touch_event_converter_evdev.cc
|
| +++ b/ui/events/ozone/evdev/touch_event_converter_evdev.cc
|
| @@ -167,7 +167,7 @@ void TouchEventConverterEvdev::Initialize(const EventDeviceInfo& info) {
|
| // TODO(denniskempin): Use EVIOCGKEY to synchronize key state.
|
|
|
| events_.resize(touch_points_);
|
| -
|
| + bool cancelled_state = false;
|
| if (has_mt_) {
|
| for (size_t i = 0; i < events_.size(); ++i) {
|
| events_[i].x = info.GetAbsMtSlotValueWithDefault(ABS_MT_POSITION_X, i, 0);
|
| @@ -188,7 +188,9 @@ void TouchEventConverterEvdev::Initialize(const EventDeviceInfo& info) {
|
| info.GetAbsMtSlotValueWithDefault(ABS_MT_TOUCH_MINOR, i, 0) / 2.0f;
|
| events_[i].pressure = ScalePressure(
|
| info.GetAbsMtSlotValueWithDefault(ABS_MT_PRESSURE, i, 0));
|
| - events_[i].cancelled = (major_max_ > 0 && touch_major == major_max_);
|
| + events_[i].cancelled = major_max_ > 0 && touch_major == major_max_;
|
| + if (events_[i].cancelled)
|
| + cancelled_state = true;
|
| }
|
| } else {
|
| // TODO(spang): Add key state to EventDeviceInfo to allow initial contact.
|
| @@ -204,6 +206,8 @@ void TouchEventConverterEvdev::Initialize(const EventDeviceInfo& info) {
|
| events_[0].tool_code = 0;
|
| events_[0].cancelled = false;
|
| }
|
| + if (cancelled_state)
|
| + CancelAllTouches();
|
| }
|
|
|
| void TouchEventConverterEvdev::Reinitialize() {
|
| @@ -445,6 +449,18 @@ void TouchEventConverterEvdev::ReportTouchEvent(
|
| gfx::PointF(event.x, event.y), details, timestamp));
|
| }
|
|
|
| +void TouchEventConverterEvdev::CancelAllTouches() {
|
| + // TODO(denniskempin): Remove once upper layers properly handle single
|
| + // cancelled touches.
|
| + for (size_t i = 0; i < events_.size(); i++) {
|
| + InProgressTouchEvdev* event = &events_[i];
|
| + if (event->was_touching || event->touching) {
|
| + event->cancelled = true;
|
| + event->altered = true;
|
| + }
|
| + }
|
| +}
|
| +
|
| void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) {
|
| if (dropped_events_) {
|
| Reinitialize();
|
| @@ -456,15 +472,22 @@ void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) {
|
|
|
| for (size_t i = 0; i < events_.size(); i++) {
|
| InProgressTouchEvdev* event = &events_[i];
|
| + if (event->altered && (event->cancelled ||
|
| + (touch_noise_finder_ &&
|
| + touch_noise_finder_->SlotHasNoise(event->slot)))) {
|
| + CancelAllTouches();
|
| + break;
|
| + }
|
| + }
|
| +
|
| + for (size_t i = 0; i < events_.size(); i++) {
|
| + InProgressTouchEvdev* event = &events_[i];
|
| if (!event->altered)
|
| continue;
|
|
|
| if (enable_palm_suppression_callback_)
|
| enable_palm_suppression_callback_.Run(event->tool_code > 0);
|
|
|
| - if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot))
|
| - event->cancelled = true;
|
| -
|
| EventType event_type = GetEventTypeForTouch(*event);
|
| // The tool type is fixed with the touch pressed event and does not change.
|
| if (event_type == ET_TOUCH_PRESSED)
|
|
|