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

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: Created 4 years, 1 month 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 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 321
322 void TouchEventConverterEvdev::EmulateMultitouchEvent( 322 void TouchEventConverterEvdev::EmulateMultitouchEvent(
323 const input_event& event) { 323 const input_event& event) {
324 input_event emulated_event = event; 324 input_event emulated_event = event;
325 325
326 if (event.type == EV_ABS) { 326 if (event.type == EV_ABS) {
327 emulated_event.code = AbsCodeToMtCode(event.code); 327 emulated_event.code = AbsCodeToMtCode(event.code);
328 if (emulated_event.code >= 0) 328 if (emulated_event.code >= 0)
329 ProcessMultitouchEvent(emulated_event); 329 ProcessMultitouchEvent(emulated_event);
330 } else if (event.type == EV_KEY) { 330 } else if (event.type == EV_KEY) {
331 if (event.code == BTN_TOUCH || 331 if (event.code == BTN_TOUCH || event.code == BTN_0 ||
332 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) { 332 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) {
333 emulated_event.type = EV_ABS; 333 emulated_event.type = EV_ABS;
334 emulated_event.code = ABS_MT_TRACKING_ID; 334 emulated_event.code = ABS_MT_TRACKING_ID;
335 emulated_event.value = 335 emulated_event.value =
336 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot; 336 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot;
337 ProcessMultitouchEvent(emulated_event); 337 ProcessMultitouchEvent(emulated_event);
338 } 338 }
339 } 339 }
340 } 340 }
341 341
342 void TouchEventConverterEvdev::ProcessKey(const input_event& input) { 342 void TouchEventConverterEvdev::ProcessKey(const input_event& input) {
343 switch (input.code) { 343 switch (input.code) {
344 case BTN_TOUCH: 344 case BTN_TOUCH:
345 case BTN_LEFT: 345 case BTN_LEFT:
346 case BTN_0: 346 case BTN_0:
347 events_[current_slot_].btn_left.down = input.value; 347 events_[current_slot_].btn_left.down = input.value;
348 events_[current_slot_].btn_left.changed = true; 348 events_[current_slot_].btn_left.changed = true;
349 break; 349 break;
350 case BTN_STYLUS: 350 case BTN_STYLUS:
351 events_[current_slot_].btn_right.down = input.value; 351 events_[current_slot_].btn_right.down = input.value;
352 events_[current_slot_].btn_right.changed = true; 352 events_[current_slot_].btn_right.changed = true;
353 break; 353 break;
354 case BTN_STYLUS2: 354 case BTN_STYLUS2:
355 events_[current_slot_].btn_middle.down = input.value; 355 events_[current_slot_].btn_middle.down = input.value;
356 events_[current_slot_].btn_middle.changed = true; 356 events_[current_slot_].btn_middle.changed = true;
357 break; 357 break;
358 case BTN_TOOL_PEN: 358 case BTN_TOOL_PEN:
359 case BTN_TOOL_RUBBER: 359 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) { 360 if (input.value > 0) {
366 events_[current_slot_].tool_code = input.code; 361 events_[current_slot_].tool_code = input.code;
367 } else { 362 } else {
368 events_[current_slot_].tool_code = 0; 363 events_[current_slot_].tool_code = 0;
369 } 364 }
370 events_[current_slot_].altered = true; 365 events_[current_slot_].altered = true;
371 break; 366 break;
372 default: 367 default:
373 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code; 368 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code;
374 } 369 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 443
449 void TouchEventConverterEvdev::ReportTouchEvent( 444 void TouchEventConverterEvdev::ReportTouchEvent(
450 const InProgressTouchEvdev& event, 445 const InProgressTouchEvdev& event,
451 EventType event_type, 446 EventType event_type,
452 base::TimeTicks timestamp) { 447 base::TimeTicks timestamp) {
453 dispatcher_->DispatchTouchEvent(TouchEventParams( 448 dispatcher_->DispatchTouchEvent(TouchEventParams(
454 input_device_.id, event.slot, event_type, gfx::PointF(event.x, event.y), 449 input_device_.id, event.slot, event_type, gfx::PointF(event.x, event.y),
455 GetEventPointerDetails(event), timestamp)); 450 GetEventPointerDetails(event), timestamp));
456 } 451 }
457 452
458 void TouchEventConverterEvdev::ReportStylusEvent(
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, 453 void TouchEventConverterEvdev::ReportButton(unsigned int button,
474 bool down, 454 bool down,
475 const InProgressTouchEvdev& event, 455 const InProgressTouchEvdev& event,
476 base::TimeTicks timestamp) { 456 base::TimeTicks timestamp) {
477 dispatcher_->DispatchMouseButtonEvent(MouseButtonEventParams( 457 // todo(denniskempin): Report buttons via pointer events
spang 2016/11/17 18:36:17 All caps - TODO()
478 input_device_.id, EF_DIRECT_INPUT, gfx::PointF(event.x, event.y), button,
479 down, false /* allow_remap */, GetEventPointerDetails(event), timestamp));
480 } 458 }
481 459
482 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) { 460 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) {
483 if (dropped_events_) { 461 if (dropped_events_) {
484 Reinitialize(); 462 Reinitialize();
485 dropped_events_ = false; 463 dropped_events_ = false;
486 } 464 }
487 465
488 if (touch_noise_finder_) 466 if (touch_noise_finder_)
489 touch_noise_finder_->HandleTouches(events_, timestamp); 467 touch_noise_finder_->HandleTouches(events_, timestamp);
490 468
491 for (size_t i = 0; i < events_.size(); i++) { 469 for (size_t i = 0; i < events_.size(); i++) {
492 InProgressTouchEvdev* event = &events_[i]; 470 InProgressTouchEvdev* event = &events_[i];
493 if (!event->altered) 471 if (!event->altered)
494 continue; 472 continue;
495 473
496 if (enable_palm_suppression_callback_) 474 if (enable_palm_suppression_callback_)
497 enable_palm_suppression_callback_.Run(event->tool_code > 0); 475 enable_palm_suppression_callback_.Run(event->tool_code > 0);
498 476
499 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot)) 477 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot))
500 event->cancelled = true; 478 event->cancelled = true;
501 479
502 if (event->tool_code > 0) { 480 if (event->btn_left.changed)
503 ReportStylusEvent(*event, timestamp); 481 ReportButton(BTN_LEFT, event->btn_left.down, *event, timestamp);
spang 2016/11/17 18:36:17 This doesn't seem right to me, even considering th
504 } else { 482 if (event->btn_right.changed)
505 EventType event_type = GetEventTypeForTouch(*event); 483 ReportButton(BTN_RIGHT, event->btn_right.down, *event, timestamp);
506 if (event_type != ET_UNKNOWN) 484 if (event->btn_middle.changed)
507 ReportTouchEvent(*event, event_type, timestamp); 485 ReportButton(BTN_MIDDLE, event->btn_middle.down, *event, timestamp);
508 } 486
487 EventType event_type = GetEventTypeForTouch(*event);
488 if (event_type != ET_UNKNOWN)
489 ReportTouchEvent(*event, event_type, timestamp);
509 490
510 event->was_cancelled = event->cancelled; 491 event->was_cancelled = event->cancelled;
511 event->was_touching = event->touching; 492 event->was_touching = event->touching;
512 event->altered = false; 493 event->altered = false;
513 event->btn_left.changed = false; 494 event->btn_left.changed = false;
514 event->btn_right.changed = false; 495 event->btn_right.changed = false;
515 event->btn_middle.changed = false; 496 event->btn_middle.changed = false;
516 } 497 }
517 } 498 }
518 499
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 if (pressure_max_ - pressure_min_) 548 if (pressure_max_ - pressure_min_)
568 pressure /= pressure_max_ - pressure_min_; 549 pressure /= pressure_max_ - pressure_min_;
569 return pressure; 550 return pressure;
570 } 551 }
571 552
572 int TouchEventConverterEvdev::NextTrackingId() { 553 int TouchEventConverterEvdev::NextTrackingId() {
573 return next_tracking_id_++ & kMaxTrackingId; 554 return next_tracking_id_++ & kMaxTrackingId;
574 } 555 }
575 556
576 } // namespace ui 557 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698