| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/ozone/evdev/touch_event_converter_evdev.h" | 5 #include "ui/events/ozone/evdev/touch_event_converter_evdev.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <linux/input.h> | 9 #include <linux/input.h> |
| 10 #include <poll.h> | 10 #include <poll.h> |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "base/strings/string_number_conversions.h" | 23 #include "base/strings/string_number_conversions.h" |
| 24 #include "base/strings/string_util.h" | 24 #include "base/strings/string_util.h" |
| 25 #include "base/strings/stringprintf.h" | 25 #include "base/strings/stringprintf.h" |
| 26 #include "ui/events/event.h" | 26 #include "ui/events/event.h" |
| 27 #include "ui/events/event_constants.h" | 27 #include "ui/events/event_constants.h" |
| 28 #include "ui/events/event_switches.h" | 28 #include "ui/events/event_switches.h" |
| 29 #include "ui/gfx/screen.h" | 29 #include "ui/gfx/screen.h" |
| 30 | 30 |
| 31 namespace { | 31 namespace { |
| 32 | 32 |
| 33 // Number is determined empirically. | |
| 34 // TODO(rjkroege): Configure this per device. | |
| 35 const float kFingerWidth = 25.f; | |
| 36 | |
| 37 struct TouchCalibration { | 33 struct TouchCalibration { |
| 38 int bezel_left; | 34 int bezel_left; |
| 39 int bezel_right; | 35 int bezel_right; |
| 40 int bezel_top; | 36 int bezel_top; |
| 41 int bezel_bottom; | 37 int bezel_bottom; |
| 42 }; | 38 }; |
| 43 | 39 |
| 44 void GetTouchCalibration(TouchCalibration* cal) { | 40 void GetTouchCalibration(TouchCalibration* cal) { |
| 45 std::vector<std::string> parts; | 41 std::vector<std::string> parts; |
| 46 if (Tokenize(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 42 if (Tokenize(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 61 float TuxelsToPixels(float val, | 57 float TuxelsToPixels(float val, |
| 62 float min_tuxels, | 58 float min_tuxels, |
| 63 float num_tuxels, | 59 float num_tuxels, |
| 64 float min_pixels, | 60 float min_pixels, |
| 65 float num_pixels) { | 61 float num_pixels) { |
| 66 // Map [min_tuxels, min_tuxels + num_tuxels) to | 62 // Map [min_tuxels, min_tuxels + num_tuxels) to |
| 67 // [min_pixels, min_pixels + num_pixels). | 63 // [min_pixels, min_pixels + num_pixels). |
| 68 return min_pixels + (val - min_tuxels) * num_pixels / num_tuxels; | 64 return min_pixels + (val - min_tuxels) * num_pixels / num_tuxels; |
| 69 } | 65 } |
| 70 | 66 |
| 67 float TuxelToPixelSize(float val, float num_tuxels, float num_pixels) { |
| 68 return val * num_pixels / num_tuxels; |
| 69 } |
| 70 |
| 71 } // namespace | 71 } // namespace |
| 72 | 72 |
| 73 namespace ui { | 73 namespace ui { |
| 74 | 74 |
| 75 TouchEventConverterEvdev::TouchEventConverterEvdev( | 75 TouchEventConverterEvdev::TouchEventConverterEvdev( |
| 76 int fd, | 76 int fd, |
| 77 base::FilePath path, | 77 base::FilePath path, |
| 78 const EventDeviceInfo& info, | 78 const EventDeviceInfo& info, |
| 79 const EventDispatchCallback& callback) | 79 const EventDispatchCallback& callback) |
| 80 : EventConverterEvdev(callback), | 80 : EventConverterEvdev(callback), |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 } | 194 } |
| 195 } else { | 195 } else { |
| 196 NOTIMPLEMENTED() << "invalid type: " << input.type; | 196 NOTIMPLEMENTED() << "invalid type: " << input.type; |
| 197 } | 197 } |
| 198 } | 198 } |
| 199 | 199 |
| 200 void TouchEventConverterEvdev::ProcessAbs(const input_event& input) { | 200 void TouchEventConverterEvdev::ProcessAbs(const input_event& input) { |
| 201 switch (input.code) { | 201 switch (input.code) { |
| 202 case ABS_MT_TOUCH_MAJOR: | 202 case ABS_MT_TOUCH_MAJOR: |
| 203 altered_slots_.set(current_slot_); | 203 altered_slots_.set(current_slot_); |
| 204 events_[current_slot_].major_ = input.value; | 204 // TODO(spang): If we have all of major, minor, and orientation, |
| 205 // we can scale the ellipse correctly. However on the Pixel we get |
| 206 // neither minor nor orientation, so this is all we can do. |
| 207 events_[current_slot_].radius_x_ = |
| 208 TuxelToPixelSize(input.value, x_num_tuxels_, x_num_pixels_) / 2.0f; |
| 209 break; |
| 210 case ABS_MT_TOUCH_MINOR: |
| 211 altered_slots_.set(current_slot_); |
| 212 events_[current_slot_].radius_y_ = |
| 213 TuxelToPixelSize(input.value, y_num_tuxels_, y_num_pixels_) / 2.0f; |
| 205 break; | 214 break; |
| 206 case ABS_MT_POSITION_X: | 215 case ABS_MT_POSITION_X: |
| 207 altered_slots_.set(current_slot_); | 216 altered_slots_.set(current_slot_); |
| 208 events_[current_slot_].x_ = TuxelsToPixels(input.value, | 217 events_[current_slot_].x_ = TuxelsToPixels(input.value, |
| 209 x_min_tuxels_, | 218 x_min_tuxels_, |
| 210 x_num_tuxels_, | 219 x_num_tuxels_, |
| 211 x_min_pixels_, | 220 x_min_pixels_, |
| 212 x_num_pixels_); | 221 x_num_pixels_); |
| 213 break; | 222 break; |
| 214 case ABS_MT_POSITION_Y: | 223 case ABS_MT_POSITION_Y: |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 | 287 |
| 279 void TouchEventConverterEvdev::ReportEvents(base::TimeDelta delta) { | 288 void TouchEventConverterEvdev::ReportEvents(base::TimeDelta delta) { |
| 280 for (int i = 0; i < MAX_FINGERS; i++) { | 289 for (int i = 0; i < MAX_FINGERS; i++) { |
| 281 if (altered_slots_[i]) { | 290 if (altered_slots_[i]) { |
| 282 // TODO(rikroege): Support elliptical finger regions. | 291 // TODO(rikroege): Support elliptical finger regions. |
| 283 TouchEvent evt(events_[i].type_, | 292 TouchEvent evt(events_[i].type_, |
| 284 gfx::PointF(events_[i].x_, events_[i].y_), | 293 gfx::PointF(events_[i].x_, events_[i].y_), |
| 285 /* flags */ 0, | 294 /* flags */ 0, |
| 286 /* touch_id */ events_[i].finger_, | 295 /* touch_id */ events_[i].finger_, |
| 287 delta, | 296 delta, |
| 288 events_[i].pressure_ * kFingerWidth, | 297 /* radius_x */ events_[i].radius_x_, |
| 289 events_[i].pressure_ * kFingerWidth, | 298 /* radius_y */ events_[i].radius_y_, |
| 290 /* angle */ 0., | 299 /* angle */ 0., |
| 291 events_[i].pressure_); | 300 events_[i].pressure_); |
| 292 DispatchEventToCallback(&evt); | 301 DispatchEventToCallback(&evt); |
| 293 | 302 |
| 294 // Subsequent events for this finger will be touch-move until it | 303 // Subsequent events for this finger will be touch-move until it |
| 295 // is released. | 304 // is released. |
| 296 events_[i].type_ = ET_TOUCH_MOVED; | 305 events_[i].type_ = ET_TOUCH_MOVED; |
| 297 } | 306 } |
| 298 } | 307 } |
| 299 altered_slots_.reset(); | 308 altered_slots_.reset(); |
| 300 } | 309 } |
| 301 | 310 |
| 302 } // namespace ui | 311 } // namespace ui |
| OLD | NEW |