Chromium Code Reviews| 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 e0c9d2d2fa6a656c34ad10f7a2f0ab12df913874..574a540693edd242bdd2fa56c04d63a10a87054a 100644 |
| --- a/ui/events/ozone/evdev/touch_event_converter_evdev.cc |
| +++ b/ui/events/ozone/evdev/touch_event_converter_evdev.cc |
| @@ -31,6 +31,7 @@ |
| #include "ui/events/event_switches.h" |
| #include "ui/events/event_utils.h" |
| #include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h" |
| +#include "ui/events/ozone/evdev/palm_suppression_filter.h" |
| #include "ui/events/ozone/evdev/touch_evdev_types.h" |
| #include "ui/events/ozone/evdev/touch_noise/touch_noise_finder.h" |
| #include "ui/ozone/public/input_controller.h" |
| @@ -113,7 +114,8 @@ TouchEventConverterEvdev::TouchEventConverterEvdev( |
| devinfo.name(), |
| devinfo.vendor_id(), |
| devinfo.product_id()), |
| - dispatcher_(dispatcher) { |
| + dispatcher_(dispatcher), |
| + palm_filter_(nullptr) { |
| if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kExtraTouchNoiseFiltering)) { |
| touch_noise_finder_.reset(new TouchNoiseFinder); |
| @@ -126,6 +128,7 @@ TouchEventConverterEvdev::~TouchEventConverterEvdev() { |
| void TouchEventConverterEvdev::Initialize(const EventDeviceInfo& info) { |
| has_mt_ = info.HasMultitouch(); |
| + has_pen_ = info.HasKeyEvent(BTN_TOOL_PEN); |
| if (has_mt_) { |
| pressure_min_ = info.GetAbsMinimum(ABS_MT_PRESSURE); |
| @@ -205,6 +208,9 @@ void TouchEventConverterEvdev::Initialize(const EventDeviceInfo& info) { |
| events_[0].pressure = 0; |
| events_[0].tool_code = 0; |
| } |
| + |
| + if (palm_filter_) |
| + palm_filter_->Reset(); |
| } |
| void TouchEventConverterEvdev::Reinitialize() { |
| @@ -224,6 +230,10 @@ bool TouchEventConverterEvdev::HasTouchscreen() const { |
| return true; |
| } |
| +bool TouchEventConverterEvdev::HasPen() const { |
| + return has_pen_; |
| +} |
| + |
| gfx::Size TouchEventConverterEvdev::GetTouchscreenSize() const { |
| return gfx::Size(x_num_tuxels_, y_num_tuxels_); |
| } |
| @@ -239,6 +249,8 @@ void TouchEventConverterEvdev::OnEnabled() { |
| void TouchEventConverterEvdev::OnDisabled() { |
| ReleaseTouches(); |
| ReleaseButtons(); |
| + if (palm_filter_) |
| + palm_filter_->Reset(); |
| } |
| void TouchEventConverterEvdev::OnFileCanReadWithoutBlocking(int fd) { |
| @@ -281,6 +293,11 @@ void TouchEventConverterEvdev::SetTouchEventLoggingEnabled(bool enabled) { |
| touch_logging_enabled_ = enabled; |
| } |
| +void TouchEventConverterEvdev::SetPalmSuppressionFilter( |
| + PalmSuppressionFilter* palm_filter) { |
| + palm_filter_ = palm_filter; |
| +} |
| + |
| void TouchEventConverterEvdev::ProcessMultitouchEvent( |
| const input_event& input) { |
| if (touch_logging_enabled_) |
| @@ -352,6 +369,7 @@ void TouchEventConverterEvdev::ProcessKey(const input_event& input) { |
| } else { |
| events_[current_slot_].tool_code = 0; |
| } |
| + events_[current_slot_].altered = true; |
| break; |
| default: |
| NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code; |
| @@ -390,6 +408,9 @@ void TouchEventConverterEvdev::ProcessAbs(const input_event& input) { |
| return; |
| } |
| break; |
| + case ABS_MT_TOOL_TYPE: |
| + if (input.value == MT_TOOL_PALM) |
| + events_[current_slot_].is_palm = true; |
| default: |
| DVLOG(5) << "unhandled code for EV_ABS: " << input.code; |
| return; |
| @@ -417,6 +438,9 @@ EventType TouchEventConverterEvdev::GetEventTypeForTouch( |
| if (touch.cancelled) |
| return ET_UNKNOWN; |
| + if (touch.is_palm) |
| + return ET_TOUCH_CANCELLED; |
| + |
| if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(touch.slot)) { |
| if (touch.touching && !touch.was_touching) |
|
spang
2016/08/22 20:52:13
Do we need this same check so that a new slot does
denniskempin
2016/08/23 22:28:12
Done.
|
| return ET_UNKNOWN; |
| @@ -432,9 +456,11 @@ void TouchEventConverterEvdev::ReportTouchEvent( |
| const InProgressTouchEvdev& event, |
| EventType event_type, |
| base::TimeTicks timestamp) { |
| - dispatcher_->DispatchTouchEvent(TouchEventParams( |
| - input_device_.id, event.slot, event_type, gfx::PointF(event.x, event.y), |
| - GetEventPointerDetails(event), timestamp)); |
| + TouchEventParams params(input_device_.id, event.slot, event_type, |
| + gfx::PointF(event.x, event.y), |
| + GetEventPointerDetails(event), timestamp); |
| + if (!palm_filter_ || palm_filter_->FilterTouch(params)) |
| + dispatcher_->DispatchTouchEvent(params); |
| } |
| void TouchEventConverterEvdev::ReportStylusEvent( |
| @@ -475,6 +501,10 @@ void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) { |
| if (!event->altered) |
| continue; |
| + if (has_pen_ && palm_filter_) { |
| + palm_filter_->EnableSuppression(event->tool_code > 0, timestamp); |
| + } |
| + |
| if (event->tool_code > 0) { |
| ReportStylusEvent(*event, timestamp); |
| } else { |