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

Side by Side Diff: ui/events/ozone/evdev/touch_event_converter_evdev.cc

Issue 2507503002: Use touch events to report stylus events (Closed)
Patch Set: I should pay attention... Created 4 years 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 unified diff | Download patch
OLDNEW
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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 return ABS_MT_POSITION_Y; 71 return ABS_MT_POSITION_Y;
72 case ABS_PRESSURE: 72 case ABS_PRESSURE:
73 return ABS_MT_PRESSURE; 73 return ABS_MT_PRESSURE;
74 case ABS_DISTANCE: 74 case ABS_DISTANCE:
75 return ABS_MT_DISTANCE; 75 return ABS_MT_DISTANCE;
76 default: 76 default:
77 return -1; 77 return -1;
78 } 78 }
79 } 79 }
80 80
81 ui::PointerDetails GetEventPointerDetails( 81 ui::EventPointerType GetEventPointerType(int tool_code) {
82 const ui::InProgressTouchEvdev& event) { 82 switch (tool_code) {
83 ui::EventPointerType type;
84 switch (event.tool_code) {
85 case BTN_TOOL_PEN: 83 case BTN_TOOL_PEN:
86 type = ui::EventPointerType::POINTER_TYPE_PEN; 84 return ui::EventPointerType::POINTER_TYPE_PEN;
87 break;
88 case BTN_TOOL_RUBBER: 85 case BTN_TOOL_RUBBER:
89 type = ui::EventPointerType::POINTER_TYPE_ERASER; 86 return ui::EventPointerType::POINTER_TYPE_ERASER;
90 break;
91 default: 87 default:
92 type = ui::EventPointerType::POINTER_TYPE_TOUCH; 88 return ui::EventPointerType::POINTER_TYPE_TOUCH;
93 } 89 }
94 return ui::PointerDetails(type, event.radius_x, event.radius_y,
95 event.pressure,
96 /* tilt_x */ 0.0f,
97 /* tilt_y */ 0.0f);
98 } 90 }
99 91
100 const int kTrackingIdForUnusedSlot = -1; 92 const int kTrackingIdForUnusedSlot = -1;
101 93
102 } // namespace 94 } // namespace
103 95
104 namespace ui { 96 namespace ui {
105 97
106 TouchEventConverterEvdev::TouchEventConverterEvdev( 98 TouchEventConverterEvdev::TouchEventConverterEvdev(
107 int fd, 99 int fd,
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 313
322 void TouchEventConverterEvdev::EmulateMultitouchEvent( 314 void TouchEventConverterEvdev::EmulateMultitouchEvent(
323 const input_event& event) { 315 const input_event& event) {
324 input_event emulated_event = event; 316 input_event emulated_event = event;
325 317
326 if (event.type == EV_ABS) { 318 if (event.type == EV_ABS) {
327 emulated_event.code = AbsCodeToMtCode(event.code); 319 emulated_event.code = AbsCodeToMtCode(event.code);
328 if (emulated_event.code >= 0) 320 if (emulated_event.code >= 0)
329 ProcessMultitouchEvent(emulated_event); 321 ProcessMultitouchEvent(emulated_event);
330 } else if (event.type == EV_KEY) { 322 } else if (event.type == EV_KEY) {
331 if (event.code == BTN_TOUCH || 323 if (event.code == BTN_TOUCH || event.code == BTN_0 ||
332 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) { 324 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) {
333 emulated_event.type = EV_ABS; 325 emulated_event.type = EV_ABS;
334 emulated_event.code = ABS_MT_TRACKING_ID; 326 emulated_event.code = ABS_MT_TRACKING_ID;
335 emulated_event.value = 327 emulated_event.value =
336 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot; 328 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot;
337 ProcessMultitouchEvent(emulated_event); 329 ProcessMultitouchEvent(emulated_event);
338 } 330 }
339 } 331 }
340 } 332 }
341 333
342 void TouchEventConverterEvdev::ProcessKey(const input_event& input) { 334 void TouchEventConverterEvdev::ProcessKey(const input_event& input) {
343 switch (input.code) { 335 switch (input.code) {
344 case BTN_TOUCH: 336 case BTN_TOUCH:
345 case BTN_LEFT: 337 case BTN_LEFT:
346 case BTN_0: 338 case BTN_0:
347 events_[current_slot_].btn_left.down = input.value; 339 events_[current_slot_].btn_left.down = input.value;
348 events_[current_slot_].btn_left.changed = true; 340 events_[current_slot_].btn_left.changed = true;
349 break; 341 break;
350 case BTN_STYLUS: 342 case BTN_STYLUS:
351 events_[current_slot_].btn_right.down = input.value; 343 events_[current_slot_].btn_right.down = input.value;
352 events_[current_slot_].btn_right.changed = true; 344 events_[current_slot_].btn_right.changed = true;
353 break; 345 break;
354 case BTN_STYLUS2: 346 case BTN_STYLUS2:
355 events_[current_slot_].btn_middle.down = input.value; 347 events_[current_slot_].btn_middle.down = input.value;
356 events_[current_slot_].btn_middle.changed = true; 348 events_[current_slot_].btn_middle.changed = true;
357 break; 349 break;
358 case BTN_TOOL_PEN: 350 case BTN_TOOL_PEN:
359 case BTN_TOOL_RUBBER: 351 case BTN_TOOL_RUBBER:
360 // Do not change tool types while touching to prevent inconsistencies
361 // from switching between Mouse and TouchEvents.
362 if (events_[current_slot_].was_touching)
363 break;
364
365 if (input.value > 0) { 352 if (input.value > 0) {
366 events_[current_slot_].tool_code = input.code; 353 events_[current_slot_].tool_code = input.code;
367 } else { 354 } else {
368 events_[current_slot_].tool_code = 0; 355 events_[current_slot_].tool_code = 0;
369 } 356 }
370 events_[current_slot_].altered = true; 357 events_[current_slot_].altered = true;
371 break; 358 break;
372 default: 359 default:
373 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code; 360 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code;
374 } 361 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 430
444 if (touch.touching) 431 if (touch.touching)
445 return touch.was_touching ? ET_TOUCH_MOVED : ET_TOUCH_PRESSED; 432 return touch.was_touching ? ET_TOUCH_MOVED : ET_TOUCH_PRESSED;
446 return touch.was_touching ? ET_TOUCH_RELEASED : ET_UNKNOWN; 433 return touch.was_touching ? ET_TOUCH_RELEASED : ET_UNKNOWN;
447 } 434 }
448 435
449 void TouchEventConverterEvdev::ReportTouchEvent( 436 void TouchEventConverterEvdev::ReportTouchEvent(
450 const InProgressTouchEvdev& event, 437 const InProgressTouchEvdev& event,
451 EventType event_type, 438 EventType event_type,
452 base::TimeTicks timestamp) { 439 base::TimeTicks timestamp) {
453 dispatcher_->DispatchTouchEvent(TouchEventParams( 440 ui::PointerDetails details(event.reported_tool_type, event.radius_x,
454 input_device_.id, event.slot, event_type, gfx::PointF(event.x, event.y), 441 event.radius_y, event.pressure,
455 GetEventPointerDetails(event), timestamp)); 442 /* tilt_x */ 0.0f, /* tilt_y */ 0.0f);
456 } 443 dispatcher_->DispatchTouchEvent(
457 444 TouchEventParams(input_device_.id, event.slot, event_type,
458 void TouchEventConverterEvdev::ReportStylusEvent( 445 gfx::PointF(event.x, event.y), details, timestamp));
459 const InProgressTouchEvdev& event,
460 base::TimeTicks timestamp) {
461 if (event.btn_left.changed)
462 ReportButton(BTN_LEFT, event.btn_left.down, event, timestamp);
463 if (event.btn_right.changed)
464 ReportButton(BTN_RIGHT, event.btn_right.down, event, timestamp);
465 if (event.btn_middle.changed)
466 ReportButton(BTN_MIDDLE, event.btn_middle.down, event, timestamp);
467
468 dispatcher_->DispatchMouseMoveEvent(MouseMoveEventParams(
469 input_device_.id, EF_DIRECT_INPUT, gfx::PointF(event.x, event.y),
470 GetEventPointerDetails(event), timestamp));
471 }
472
473 void TouchEventConverterEvdev::ReportButton(unsigned int button,
474 bool down,
475 const InProgressTouchEvdev& event,
476 base::TimeTicks timestamp) {
477 dispatcher_->DispatchMouseButtonEvent(MouseButtonEventParams(
478 input_device_.id, EF_DIRECT_INPUT, gfx::PointF(event.x, event.y), button,
479 down, false /* allow_remap */, GetEventPointerDetails(event), timestamp));
480 } 446 }
481 447
482 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) { 448 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) {
483 if (dropped_events_) { 449 if (dropped_events_) {
484 Reinitialize(); 450 Reinitialize();
485 dropped_events_ = false; 451 dropped_events_ = false;
486 } 452 }
487 453
488 if (touch_noise_finder_) 454 if (touch_noise_finder_)
489 touch_noise_finder_->HandleTouches(events_, timestamp); 455 touch_noise_finder_->HandleTouches(events_, timestamp);
490 456
491 for (size_t i = 0; i < events_.size(); i++) { 457 for (size_t i = 0; i < events_.size(); i++) {
492 InProgressTouchEvdev* event = &events_[i]; 458 InProgressTouchEvdev* event = &events_[i];
493 if (!event->altered) 459 if (!event->altered)
494 continue; 460 continue;
495 461
496 if (enable_palm_suppression_callback_) 462 if (enable_palm_suppression_callback_)
497 enable_palm_suppression_callback_.Run(event->tool_code > 0); 463 enable_palm_suppression_callback_.Run(event->tool_code > 0);
498 464
499 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot)) 465 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot))
500 event->cancelled = true; 466 event->cancelled = true;
501 467
502 if (event->tool_code > 0) { 468 EventType event_type = GetEventTypeForTouch(*event);
503 ReportStylusEvent(*event, timestamp); 469 // The tool type is fixed with the touch pressed event and does not change.
504 } else { 470 if (event_type == ET_TOUCH_PRESSED)
505 EventType event_type = GetEventTypeForTouch(*event); 471 event->reported_tool_type = GetEventPointerType(event->tool_code);
506 if (event_type != ET_UNKNOWN) 472 if (event_type != ET_UNKNOWN)
507 ReportTouchEvent(*event, event_type, timestamp); 473 ReportTouchEvent(*event, event_type, timestamp);
508 }
509 474
510 event->was_cancelled = event->cancelled; 475 event->was_cancelled = event->cancelled;
511 event->was_touching = event->touching; 476 event->was_touching = event->touching;
512 event->altered = false; 477 event->altered = false;
513 event->btn_left.changed = false; 478 event->btn_left.changed = false;
514 event->btn_right.changed = false; 479 event->btn_right.changed = false;
515 event->btn_middle.changed = false; 480 event->btn_middle.changed = false;
516 } 481 }
517 } 482 }
518 483
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 if (pressure_max_ - pressure_min_) 532 if (pressure_max_ - pressure_min_)
568 pressure /= pressure_max_ - pressure_min_; 533 pressure /= pressure_max_ - pressure_min_;
569 return pressure; 534 return pressure;
570 } 535 }
571 536
572 int TouchEventConverterEvdev::NextTrackingId() { 537 int TouchEventConverterEvdev::NextTrackingId() {
573 return next_tracking_id_++ & kMaxTrackingId; 538 return next_tracking_id_++ & kMaxTrackingId;
574 } 539 }
575 540
576 } // namespace ui 541 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/ozone/evdev/touch_event_converter_evdev.h ('k') | ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698