1/* 2 * Copyright © 2013-2015 Red Hat, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24#include "config.h" 25 26#include <assert.h> 27#include <stdbool.h> 28#include <stdio.h> 29 30#include "evdev-mt-touchpad.h" 31 32#define DEFAULT_TAP_TIMEOUT_PERIOD ms2us(180) 33#define DEFAULT_DRAG_TIMEOUT_PERIOD_BASE ms2us(160) 34#define DEFAULT_DRAG_TIMEOUT_PERIOD_PERFINGER ms2us(20) 35#define DEFAULT_DRAGLOCK_TIMEOUT_PERIOD ms2us(300) 36#define DEFAULT_TAP_MOVE_THRESHOLD 1.3 /* mm */ 37 38enum tap_event { 39 TAP_EVENT_TOUCH = 12, 40 TAP_EVENT_MOTION, 41 TAP_EVENT_RELEASE, 42 TAP_EVENT_BUTTON, 43 TAP_EVENT_TIMEOUT, 44 TAP_EVENT_THUMB, 45 TAP_EVENT_PALM, 46 TAP_EVENT_PALM_UP, 47}; 48 49/***************************************** 50 * DO NOT EDIT THIS FILE! 51 * 52 * Look at the state diagram in doc/touchpad-tap-state-machine.svg 53 * (generated with https://www.diagrams.net) 54 * 55 * Any changes in this file must be represented in the diagram. 56 */ 57 58static inline const char* 59tap_state_to_str(enum tp_tap_state state) 60{ 61 switch(state) { 62 CASE_RETURN_STRING(TAP_STATE_IDLE); 63 CASE_RETURN_STRING(TAP_STATE_HOLD); 64 CASE_RETURN_STRING(TAP_STATE_TOUCH); 65 CASE_RETURN_STRING(TAP_STATE_1FGTAP_TAPPED); 66 CASE_RETURN_STRING(TAP_STATE_2FGTAP_TAPPED); 67 CASE_RETURN_STRING(TAP_STATE_3FGTAP_TAPPED); 68 CASE_RETURN_STRING(TAP_STATE_TOUCH_2); 69 CASE_RETURN_STRING(TAP_STATE_TOUCH_2_HOLD); 70 CASE_RETURN_STRING(TAP_STATE_TOUCH_2_RELEASE); 71 CASE_RETURN_STRING(TAP_STATE_TOUCH_3); 72 CASE_RETURN_STRING(TAP_STATE_TOUCH_3_HOLD); 73 CASE_RETURN_STRING(TAP_STATE_TOUCH_3_RELEASE); 74 CASE_RETURN_STRING(TAP_STATE_TOUCH_3_RELEASE_2); 75 CASE_RETURN_STRING(TAP_STATE_1FGTAP_DRAGGING); 76 CASE_RETURN_STRING(TAP_STATE_2FGTAP_DRAGGING); 77 CASE_RETURN_STRING(TAP_STATE_3FGTAP_DRAGGING); 78 CASE_RETURN_STRING(TAP_STATE_1FGTAP_DRAGGING_WAIT); 79 CASE_RETURN_STRING(TAP_STATE_2FGTAP_DRAGGING_WAIT); 80 CASE_RETURN_STRING(TAP_STATE_3FGTAP_DRAGGING_WAIT); 81 CASE_RETURN_STRING(TAP_STATE_1FGTAP_DRAGGING_OR_DOUBLETAP); 82 CASE_RETURN_STRING(TAP_STATE_2FGTAP_DRAGGING_OR_DOUBLETAP); 83 CASE_RETURN_STRING(TAP_STATE_3FGTAP_DRAGGING_OR_DOUBLETAP); 84 CASE_RETURN_STRING(TAP_STATE_1FGTAP_DRAGGING_OR_TAP); 85 CASE_RETURN_STRING(TAP_STATE_2FGTAP_DRAGGING_OR_TAP); 86 CASE_RETURN_STRING(TAP_STATE_3FGTAP_DRAGGING_OR_TAP); 87 CASE_RETURN_STRING(TAP_STATE_1FGTAP_DRAGGING_2); 88 CASE_RETURN_STRING(TAP_STATE_2FGTAP_DRAGGING_2); 89 CASE_RETURN_STRING(TAP_STATE_3FGTAP_DRAGGING_2); 90 CASE_RETURN_STRING(TAP_STATE_DEAD); 91 } 92 return NULL; 93} 94 95static inline const char* 96tap_event_to_str(enum tap_event event) 97{ 98 switch(event) { 99 CASE_RETURN_STRING(TAP_EVENT_TOUCH); 100 CASE_RETURN_STRING(TAP_EVENT_MOTION); 101 CASE_RETURN_STRING(TAP_EVENT_RELEASE); 102 CASE_RETURN_STRING(TAP_EVENT_TIMEOUT); 103 CASE_RETURN_STRING(TAP_EVENT_BUTTON); 104 CASE_RETURN_STRING(TAP_EVENT_THUMB); 105 CASE_RETURN_STRING(TAP_EVENT_PALM); 106 CASE_RETURN_STRING(TAP_EVENT_PALM_UP); 107 } 108 return NULL; 109} 110 111static inline void 112log_tap_bug(struct tp_dispatch *tp, struct tp_touch *t, enum tap_event event) 113{ 114 evdev_log_bug_libinput(tp->device, 115 "%d: invalid tap event %s in state %s\n", 116 t->index, 117 tap_event_to_str(event), 118 tap_state_to_str(tp->tap.state)); 119 120} 121 122static void 123tp_tap_notify(struct tp_dispatch *tp, 124 uint64_t time, 125 int nfingers, 126 enum libinput_button_state state) 127{ 128 int32_t button; 129 int32_t button_map[2][3] = { 130 { BTN_LEFT, BTN_RIGHT, BTN_MIDDLE }, 131 { BTN_LEFT, BTN_MIDDLE, BTN_RIGHT }, 132 }; 133 134 assert(tp->tap.map < ARRAY_LENGTH(button_map)); 135 136 if (nfingers < 1 || nfingers > 3) 137 return; 138 139 button = button_map[tp->tap.map][nfingers - 1]; 140 141 if (state == LIBINPUT_BUTTON_STATE_PRESSED) 142 tp->tap.buttons_pressed |= bit(nfingers); 143 else 144 tp->tap.buttons_pressed &= ~bit(nfingers); 145 146 evdev_pointer_notify_button(tp->device, 147 time, 148 button, 149 state); 150} 151 152static void 153tp_tap_set_timer(struct tp_dispatch *tp, uint64_t time) 154{ 155 libinput_timer_set(&tp->tap.timer, time + DEFAULT_TAP_TIMEOUT_PERIOD); 156} 157 158static void 159tp_tap_set_drag_timer(struct tp_dispatch *tp, uint64_t time, 160 int nfingers_tapped) 161{ 162 libinput_timer_set(&tp->tap.timer, 163 time + DEFAULT_DRAG_TIMEOUT_PERIOD_BASE + 164 (nfingers_tapped * 165 DEFAULT_DRAG_TIMEOUT_PERIOD_PERFINGER)); 166} 167 168static void 169tp_tap_set_draglock_timer(struct tp_dispatch *tp, uint64_t time) 170{ 171 libinput_timer_set(&tp->tap.timer, 172 time + DEFAULT_DRAGLOCK_TIMEOUT_PERIOD); 173} 174 175static void 176tp_tap_clear_timer(struct tp_dispatch *tp) 177{ 178 libinput_timer_cancel(&tp->tap.timer); 179} 180 181static void 182tp_tap_move_to_dead(struct tp_dispatch *tp, struct tp_touch *t) 183{ 184 tp->tap.state = TAP_STATE_DEAD; 185 t->tap.state = TAP_TOUCH_STATE_DEAD; 186 tp_tap_clear_timer(tp); 187} 188 189static void 190tp_tap_idle_handle_event(struct tp_dispatch *tp, 191 struct tp_touch *t, 192 enum tap_event event, uint64_t time) 193{ 194 switch (event) { 195 case TAP_EVENT_TOUCH: 196 tp->tap.state = TAP_STATE_TOUCH; 197 tp->tap.saved_press_time = time; 198 tp_tap_set_timer(tp, time); 199 break; 200 case TAP_EVENT_RELEASE: 201 break; 202 case TAP_EVENT_MOTION: 203 log_tap_bug(tp, t, event); 204 break; 205 case TAP_EVENT_TIMEOUT: 206 break; 207 case TAP_EVENT_BUTTON: 208 tp->tap.state = TAP_STATE_DEAD; 209 break; 210 case TAP_EVENT_THUMB: 211 log_tap_bug(tp, t, event); 212 break; 213 case TAP_EVENT_PALM: 214 tp->tap.state = TAP_STATE_IDLE; 215 break; 216 case TAP_EVENT_PALM_UP: 217 break; 218 } 219} 220 221static void 222tp_tap_touch_handle_event(struct tp_dispatch *tp, 223 struct tp_touch *t, 224 enum tap_event event, uint64_t time) 225{ 226 227 switch (event) { 228 case TAP_EVENT_TOUCH: 229 tp->tap.state = TAP_STATE_TOUCH_2; 230 tp->tap.saved_press_time = time; 231 tp_tap_set_timer(tp, time); 232 break; 233 case TAP_EVENT_RELEASE: 234 tp_tap_notify(tp, 235 tp->tap.saved_press_time, 236 1, 237 LIBINPUT_BUTTON_STATE_PRESSED); 238 if (tp->tap.drag_enabled) { 239 tp->tap.state = TAP_STATE_1FGTAP_TAPPED; 240 tp->tap.saved_release_time = time; 241 tp_tap_set_drag_timer(tp, time, 1); 242 } else { 243 tp_tap_notify(tp, 244 time, 245 1, 246 LIBINPUT_BUTTON_STATE_RELEASED); 247 tp->tap.state = TAP_STATE_IDLE; 248 } 249 break; 250 case TAP_EVENT_MOTION: 251 tp_tap_move_to_dead(tp, t); 252 break; 253 case TAP_EVENT_TIMEOUT: 254 tp->tap.state = TAP_STATE_HOLD; 255 tp_tap_clear_timer(tp); 256 tp_gesture_tap_timeout(tp, time); 257 break; 258 case TAP_EVENT_BUTTON: 259 tp->tap.state = TAP_STATE_DEAD; 260 break; 261 case TAP_EVENT_THUMB: 262 tp->tap.state = TAP_STATE_IDLE; 263 t->tap.is_thumb = true; 264 tp->tap.nfingers_down--; 265 t->tap.state = TAP_TOUCH_STATE_DEAD; 266 tp_tap_clear_timer(tp); 267 break; 268 case TAP_EVENT_PALM: 269 tp->tap.state = TAP_STATE_IDLE; 270 tp_tap_clear_timer(tp); 271 break; 272 case TAP_EVENT_PALM_UP: 273 break; 274 } 275} 276 277static void 278tp_tap_hold_handle_event(struct tp_dispatch *tp, 279 struct tp_touch *t, 280 enum tap_event event, uint64_t time) 281{ 282 283 switch (event) { 284 case TAP_EVENT_TOUCH: 285 tp->tap.state = TAP_STATE_TOUCH_2; 286 tp->tap.saved_press_time = time; 287 tp_tap_set_timer(tp, time); 288 break; 289 case TAP_EVENT_RELEASE: 290 tp->tap.state = TAP_STATE_IDLE; 291 break; 292 case TAP_EVENT_MOTION: 293 tp_tap_move_to_dead(tp, t); 294 break; 295 case TAP_EVENT_TIMEOUT: 296 break; 297 case TAP_EVENT_BUTTON: 298 tp->tap.state = TAP_STATE_DEAD; 299 break; 300 case TAP_EVENT_THUMB: 301 tp->tap.state = TAP_STATE_IDLE; 302 t->tap.is_thumb = true; 303 tp->tap.nfingers_down--; 304 t->tap.state = TAP_TOUCH_STATE_DEAD; 305 break; 306 case TAP_EVENT_PALM: 307 tp->tap.state = TAP_STATE_IDLE; 308 break; 309 case TAP_EVENT_PALM_UP: 310 break; 311 } 312} 313 314static void 315tp_tap_tapped_handle_event(struct tp_dispatch *tp, 316 struct tp_touch *t, 317 enum tap_event event, uint64_t time, 318 int nfingers_tapped) 319{ 320 switch (event) { 321 case TAP_EVENT_MOTION: 322 case TAP_EVENT_RELEASE: 323 log_tap_bug(tp, t, event); 324 break; 325 case TAP_EVENT_TOUCH: { 326 enum tp_tap_state dest[3] = { 327 TAP_STATE_1FGTAP_DRAGGING_OR_DOUBLETAP, 328 TAP_STATE_2FGTAP_DRAGGING_OR_DOUBLETAP, 329 TAP_STATE_3FGTAP_DRAGGING_OR_DOUBLETAP, 330 }; 331 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 332 tp->tap.state = dest[nfingers_tapped - 1]; 333 tp->tap.saved_press_time = time; 334 tp_tap_set_timer(tp, time); 335 break; 336 } 337 case TAP_EVENT_TIMEOUT: 338 tp->tap.state = TAP_STATE_IDLE; 339 tp_tap_notify(tp, 340 tp->tap.saved_release_time, 341 nfingers_tapped, 342 LIBINPUT_BUTTON_STATE_RELEASED); 343 break; 344 case TAP_EVENT_BUTTON: 345 tp->tap.state = TAP_STATE_DEAD; 346 tp_tap_notify(tp, 347 tp->tap.saved_release_time, 348 nfingers_tapped, 349 LIBINPUT_BUTTON_STATE_RELEASED); 350 break; 351 case TAP_EVENT_THUMB: 352 log_tap_bug(tp, t, event); 353 break; 354 case TAP_EVENT_PALM: 355 log_tap_bug(tp, t, event); 356 break; 357 case TAP_EVENT_PALM_UP: 358 break; 359 } 360} 361 362static void 363tp_tap_touch2_handle_event(struct tp_dispatch *tp, 364 struct tp_touch *t, 365 enum tap_event event, uint64_t time) 366{ 367 368 switch (event) { 369 case TAP_EVENT_TOUCH: 370 tp->tap.state = TAP_STATE_TOUCH_3; 371 tp->tap.saved_press_time = time; 372 tp_tap_set_timer(tp, time); 373 break; 374 case TAP_EVENT_RELEASE: 375 tp->tap.state = TAP_STATE_TOUCH_2_RELEASE; 376 tp->tap.saved_release_time = time; 377 tp_tap_set_timer(tp, time); 378 break; 379 case TAP_EVENT_MOTION: 380 tp_tap_move_to_dead(tp, t); 381 break; 382 case TAP_EVENT_TIMEOUT: 383 tp->tap.state = TAP_STATE_TOUCH_2_HOLD; 384 tp_gesture_tap_timeout(tp, time); 385 break; 386 case TAP_EVENT_BUTTON: 387 tp->tap.state = TAP_STATE_DEAD; 388 break; 389 case TAP_EVENT_THUMB: 390 break; 391 case TAP_EVENT_PALM: 392 tp->tap.state = TAP_STATE_TOUCH; 393 break; 394 case TAP_EVENT_PALM_UP: 395 break; 396 } 397} 398 399static void 400tp_tap_touch2_hold_handle_event(struct tp_dispatch *tp, 401 struct tp_touch *t, 402 enum tap_event event, uint64_t time) 403{ 404 405 switch (event) { 406 case TAP_EVENT_TOUCH: 407 tp->tap.state = TAP_STATE_TOUCH_3; 408 tp->tap.saved_press_time = time; 409 tp_tap_set_timer(tp, time); 410 break; 411 case TAP_EVENT_RELEASE: 412 tp->tap.state = TAP_STATE_HOLD; 413 break; 414 case TAP_EVENT_MOTION: 415 tp_tap_move_to_dead(tp, t); 416 break; 417 case TAP_EVENT_TIMEOUT: 418 tp->tap.state = TAP_STATE_TOUCH_2_HOLD; 419 break; 420 case TAP_EVENT_BUTTON: 421 tp->tap.state = TAP_STATE_DEAD; 422 break; 423 case TAP_EVENT_THUMB: 424 break; 425 case TAP_EVENT_PALM: 426 tp->tap.state = TAP_STATE_HOLD; 427 break; 428 case TAP_EVENT_PALM_UP: 429 break; 430 } 431} 432 433static void 434tp_tap_touch2_release_handle_event(struct tp_dispatch *tp, 435 struct tp_touch *t, 436 enum tap_event event, uint64_t time) 437{ 438 439 switch (event) { 440 case TAP_EVENT_TOUCH: 441 tp->tap.state = TAP_STATE_TOUCH_2_HOLD; 442 t->tap.state = TAP_TOUCH_STATE_DEAD; 443 tp_tap_clear_timer(tp); 444 break; 445 case TAP_EVENT_RELEASE: 446 tp_tap_notify(tp, 447 tp->tap.saved_press_time, 448 2, 449 LIBINPUT_BUTTON_STATE_PRESSED); 450 if (tp->tap.drag_enabled) { 451 tp->tap.state = TAP_STATE_2FGTAP_TAPPED; 452 tp_tap_set_drag_timer(tp, time, 2); 453 } else { 454 tp_tap_notify(tp, 455 tp->tap.saved_release_time, 456 2, 457 LIBINPUT_BUTTON_STATE_RELEASED); 458 tp->tap.state = TAP_STATE_IDLE; 459 } 460 break; 461 case TAP_EVENT_MOTION: 462 tp_tap_move_to_dead(tp, t); 463 break; 464 case TAP_EVENT_TIMEOUT: 465 tp->tap.state = TAP_STATE_HOLD; 466 break; 467 case TAP_EVENT_BUTTON: 468 tp->tap.state = TAP_STATE_DEAD; 469 break; 470 case TAP_EVENT_THUMB: 471 break; 472 case TAP_EVENT_PALM: 473 /* There's only one saved press time and it's overwritten by 474 * the last touch down. So in the case of finger down, palm 475 * down, finger up, palm detected, we use the 476 * palm touch's press time here instead of the finger's press 477 * time. Let's wait and see if that's an issue. 478 */ 479 tp_tap_notify(tp, 480 tp->tap.saved_press_time, 481 1, 482 LIBINPUT_BUTTON_STATE_PRESSED); 483 if (tp->tap.drag_enabled) { 484 /* For a single-finger tap the timer delay is the same 485 * as for the release of the finger that became a palm, 486 * no reset necessary */ 487 tp->tap.state = TAP_STATE_1FGTAP_TAPPED; 488 } else { 489 tp_tap_notify(tp, 490 tp->tap.saved_release_time, 491 1, 492 LIBINPUT_BUTTON_STATE_RELEASED); 493 tp->tap.state = TAP_STATE_IDLE; 494 } 495 break; 496 case TAP_EVENT_PALM_UP: 497 break; 498 } 499} 500 501static void 502tp_tap_touch3_handle_event(struct tp_dispatch *tp, 503 struct tp_touch *t, 504 enum tap_event event, uint64_t time) 505{ 506 507 switch (event) { 508 case TAP_EVENT_TOUCH: 509 tp->tap.state = TAP_STATE_DEAD; 510 tp_tap_clear_timer(tp); 511 break; 512 case TAP_EVENT_MOTION: 513 tp_tap_move_to_dead(tp, t); 514 break; 515 case TAP_EVENT_TIMEOUT: 516 tp->tap.state = TAP_STATE_TOUCH_3_HOLD; 517 tp_tap_clear_timer(tp); 518 tp_gesture_tap_timeout(tp, time); 519 break; 520 case TAP_EVENT_RELEASE: 521 tp->tap.state = TAP_STATE_TOUCH_3_RELEASE; 522 tp->tap.saved_release_time = time; 523 tp_tap_set_timer(tp, time); 524 break; 525 case TAP_EVENT_BUTTON: 526 tp->tap.state = TAP_STATE_DEAD; 527 break; 528 case TAP_EVENT_THUMB: 529 break; 530 case TAP_EVENT_PALM: 531 tp->tap.state = TAP_STATE_TOUCH_2; 532 break; 533 case TAP_EVENT_PALM_UP: 534 break; 535 } 536} 537 538static void 539tp_tap_touch3_hold_handle_event(struct tp_dispatch *tp, 540 struct tp_touch *t, 541 enum tap_event event, uint64_t time) 542{ 543 544 switch (event) { 545 case TAP_EVENT_TOUCH: 546 tp->tap.state = TAP_STATE_DEAD; 547 tp_tap_set_timer(tp, time); 548 break; 549 case TAP_EVENT_RELEASE: 550 tp->tap.state = TAP_STATE_TOUCH_2_HOLD; 551 break; 552 case TAP_EVENT_MOTION: 553 tp_tap_move_to_dead(tp, t); 554 break; 555 case TAP_EVENT_TIMEOUT: 556 break; 557 case TAP_EVENT_BUTTON: 558 tp->tap.state = TAP_STATE_DEAD; 559 break; 560 case TAP_EVENT_THUMB: 561 break; 562 case TAP_EVENT_PALM: 563 tp->tap.state = TAP_STATE_TOUCH_2_HOLD; 564 break; 565 case TAP_EVENT_PALM_UP: 566 break; 567 } 568} 569 570static void 571tp_tap_touch3_release_handle_event(struct tp_dispatch *tp, 572 struct tp_touch *t, 573 enum tap_event event, uint64_t time) 574{ 575 576 switch (event) { 577 case TAP_EVENT_TOUCH: 578 tp_tap_notify(tp, 579 tp->tap.saved_press_time, 580 3, 581 LIBINPUT_BUTTON_STATE_PRESSED); 582 tp_tap_notify(tp, 583 tp->tap.saved_release_time, 584 3, 585 LIBINPUT_BUTTON_STATE_RELEASED); 586 tp->tap.state = TAP_STATE_TOUCH_3; 587 tp->tap.saved_press_time = time; 588 tp_tap_set_timer(tp, time); 589 break; 590 case TAP_EVENT_RELEASE: 591 tp->tap.state = TAP_STATE_TOUCH_3_RELEASE_2; 592 tp_tap_set_timer(tp, time); 593 break; 594 case TAP_EVENT_MOTION: 595 tp_tap_notify(tp, 596 tp->tap.saved_press_time, 597 3, 598 LIBINPUT_BUTTON_STATE_PRESSED); 599 tp_tap_notify(tp, 600 tp->tap.saved_release_time, 601 3, 602 LIBINPUT_BUTTON_STATE_RELEASED); 603 tp_tap_move_to_dead(tp, t); 604 break; 605 case TAP_EVENT_TIMEOUT: 606 tp_tap_notify(tp, 607 tp->tap.saved_press_time, 608 3, 609 LIBINPUT_BUTTON_STATE_PRESSED); 610 tp_tap_notify(tp, 611 tp->tap.saved_release_time, 612 3, 613 LIBINPUT_BUTTON_STATE_RELEASED); 614 tp->tap.state = TAP_STATE_TOUCH_2_HOLD; 615 break; 616 case TAP_EVENT_BUTTON: 617 tp_tap_notify(tp, 618 tp->tap.saved_press_time, 619 3, 620 LIBINPUT_BUTTON_STATE_PRESSED); 621 tp_tap_notify(tp, 622 tp->tap.saved_release_time, 623 3, 624 LIBINPUT_BUTTON_STATE_RELEASED); 625 tp->tap.state = TAP_STATE_DEAD; 626 break; 627 case TAP_EVENT_THUMB: 628 break; 629 case TAP_EVENT_PALM: 630 tp->tap.state = TAP_STATE_TOUCH_2_RELEASE; 631 break; 632 case TAP_EVENT_PALM_UP: 633 break; 634 } 635} 636 637static void 638tp_tap_touch3_release2_handle_event(struct tp_dispatch *tp, 639 struct tp_touch *t, 640 enum tap_event event, uint64_t time) 641{ 642 643 switch (event) { 644 case TAP_EVENT_TOUCH: 645 tp_tap_notify(tp, 646 tp->tap.saved_press_time, 647 3, 648 LIBINPUT_BUTTON_STATE_PRESSED); 649 tp_tap_notify(tp, 650 tp->tap.saved_release_time, 651 3, 652 LIBINPUT_BUTTON_STATE_RELEASED); 653 tp->tap.state = TAP_STATE_TOUCH_2; 654 tp->tap.saved_press_time = time; 655 tp_tap_set_timer(tp, time); 656 break; 657 case TAP_EVENT_RELEASE: 658 tp_tap_notify(tp, 659 tp->tap.saved_press_time, 660 3, 661 LIBINPUT_BUTTON_STATE_PRESSED); 662 if (tp->tap.drag_enabled) { 663 tp->tap.state = TAP_STATE_3FGTAP_TAPPED; 664 tp_tap_set_drag_timer(tp, time, 3); 665 } else { 666 tp_tap_notify(tp, 667 tp->tap.saved_release_time, 668 3, 669 LIBINPUT_BUTTON_STATE_RELEASED); 670 tp->tap.state = TAP_STATE_IDLE; 671 } 672 break; 673 case TAP_EVENT_MOTION: 674 tp_tap_notify(tp, 675 tp->tap.saved_press_time, 676 3, 677 LIBINPUT_BUTTON_STATE_PRESSED); 678 tp_tap_notify(tp, 679 tp->tap.saved_release_time, 680 3, 681 LIBINPUT_BUTTON_STATE_RELEASED); 682 tp_tap_move_to_dead(tp, t); 683 break; 684 case TAP_EVENT_TIMEOUT: 685 tp_tap_notify(tp, 686 tp->tap.saved_press_time, 687 3, 688 LIBINPUT_BUTTON_STATE_PRESSED); 689 tp_tap_notify(tp, 690 tp->tap.saved_release_time, 691 3, 692 LIBINPUT_BUTTON_STATE_RELEASED); 693 tp->tap.state = TAP_STATE_HOLD; 694 break; 695 case TAP_EVENT_BUTTON: 696 tp_tap_notify(tp, 697 tp->tap.saved_press_time, 698 3, 699 LIBINPUT_BUTTON_STATE_PRESSED); 700 tp_tap_notify(tp, 701 tp->tap.saved_release_time, 702 3, 703 LIBINPUT_BUTTON_STATE_RELEASED); 704 tp->tap.state = TAP_STATE_DEAD; 705 break; 706 case TAP_EVENT_THUMB: 707 break; 708 case TAP_EVENT_PALM: 709 tp_tap_notify(tp, 710 tp->tap.saved_press_time, 711 2, 712 LIBINPUT_BUTTON_STATE_PRESSED); 713 if (tp->tap.drag_enabled) { 714 /* Resetting the timer to the appropriate delay 715 * for a two-finger tap would be ideal, but the 716 * timestamp of the last real finger release is lost, 717 * so the in-progress similar delay for release 718 * of the finger which became a palm instead 719 * will have to do */ 720 tp->tap.state = TAP_STATE_2FGTAP_TAPPED; 721 } else { 722 tp_tap_notify(tp, 723 tp->tap.saved_release_time, 724 2, 725 LIBINPUT_BUTTON_STATE_RELEASED); 726 tp->tap.state = TAP_STATE_IDLE; 727 } 728 break; 729 case TAP_EVENT_PALM_UP: 730 break; 731 } 732} 733 734static void 735tp_tap_dragging_or_doubletap_handle_event(struct tp_dispatch *tp, 736 struct tp_touch *t, 737 enum tap_event event, uint64_t time, 738 int nfingers_tapped) 739{ 740 switch (event) { 741 case TAP_EVENT_TOUCH: { 742 tp_tap_notify(tp, 743 tp->tap.saved_release_time, 744 nfingers_tapped, 745 LIBINPUT_BUTTON_STATE_RELEASED); 746 tp->tap.state = TAP_STATE_TOUCH_2; 747 tp->tap.saved_press_time = time; 748 tp_tap_set_timer(tp, time); 749 break; 750 } 751 case TAP_EVENT_RELEASE: 752 tp->tap.state = TAP_STATE_1FGTAP_TAPPED; 753 tp_tap_notify(tp, 754 tp->tap.saved_release_time, 755 nfingers_tapped, 756 LIBINPUT_BUTTON_STATE_RELEASED); 757 tp_tap_notify(tp, 758 tp->tap.saved_press_time, 759 1, 760 LIBINPUT_BUTTON_STATE_PRESSED); 761 tp->tap.saved_release_time = time; 762 tp_tap_set_timer(tp, time); 763 break; 764 case TAP_EVENT_MOTION: 765 case TAP_EVENT_TIMEOUT: { 766 enum tp_tap_state dest[3] = { 767 TAP_STATE_1FGTAP_DRAGGING, 768 TAP_STATE_2FGTAP_DRAGGING, 769 TAP_STATE_3FGTAP_DRAGGING, 770 }; 771 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 772 tp->tap.state = dest[nfingers_tapped - 1]; 773 break; 774 } 775 case TAP_EVENT_BUTTON: 776 tp->tap.state = TAP_STATE_DEAD; 777 tp_tap_notify(tp, 778 tp->tap.saved_release_time, 779 nfingers_tapped, 780 LIBINPUT_BUTTON_STATE_RELEASED); 781 break; 782 case TAP_EVENT_THUMB: 783 break; 784 case TAP_EVENT_PALM: { 785 enum tp_tap_state dest[3] = { 786 TAP_STATE_1FGTAP_TAPPED, 787 TAP_STATE_2FGTAP_TAPPED, 788 TAP_STATE_3FGTAP_TAPPED, 789 }; 790 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 791 tp->tap.state = dest[nfingers_tapped - 1]; 792 break; 793 } 794 case TAP_EVENT_PALM_UP: 795 break; 796 } 797} 798 799static void 800tp_tap_dragging_handle_event(struct tp_dispatch *tp, 801 struct tp_touch *t, 802 enum tap_event event, uint64_t time, 803 int nfingers_tapped) 804{ 805 806 switch (event) { 807 case TAP_EVENT_TOUCH: { 808 enum tp_tap_state dest[3] = { 809 TAP_STATE_1FGTAP_DRAGGING_2, 810 TAP_STATE_2FGTAP_DRAGGING_2, 811 TAP_STATE_3FGTAP_DRAGGING_2, 812 }; 813 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 814 tp->tap.state = dest[nfingers_tapped - 1]; 815 break; 816 } 817 case TAP_EVENT_RELEASE: 818 if (tp->tap.drag_lock_enabled) { 819 enum tp_tap_state dest[3] = { 820 TAP_STATE_1FGTAP_DRAGGING_WAIT, 821 TAP_STATE_2FGTAP_DRAGGING_WAIT, 822 TAP_STATE_3FGTAP_DRAGGING_WAIT, 823 }; 824 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 825 tp->tap.state = dest[nfingers_tapped - 1]; 826 tp_tap_set_draglock_timer(tp, time); 827 } else { 828 tp_tap_notify(tp, 829 time, 830 nfingers_tapped, 831 LIBINPUT_BUTTON_STATE_RELEASED); 832 tp->tap.state = TAP_STATE_IDLE; 833 } 834 break; 835 case TAP_EVENT_MOTION: 836 case TAP_EVENT_TIMEOUT: 837 /* noop */ 838 break; 839 case TAP_EVENT_BUTTON: 840 tp->tap.state = TAP_STATE_DEAD; 841 tp_tap_notify(tp, 842 time, 843 nfingers_tapped, 844 LIBINPUT_BUTTON_STATE_RELEASED); 845 break; 846 case TAP_EVENT_THUMB: 847 break; 848 case TAP_EVENT_PALM: 849 tp_tap_notify(tp, 850 tp->tap.saved_release_time, 851 nfingers_tapped, 852 LIBINPUT_BUTTON_STATE_RELEASED); 853 tp->tap.state = TAP_STATE_IDLE; 854 break; 855 case TAP_EVENT_PALM_UP: 856 break; 857 } 858} 859 860static void 861tp_tap_dragging_wait_handle_event(struct tp_dispatch *tp, 862 struct tp_touch *t, 863 enum tap_event event, uint64_t time, 864 int nfingers_tapped) 865{ 866 867 switch (event) { 868 case TAP_EVENT_TOUCH: { 869 enum tp_tap_state dest[3] = { 870 TAP_STATE_1FGTAP_DRAGGING_OR_TAP, 871 TAP_STATE_2FGTAP_DRAGGING_OR_TAP, 872 TAP_STATE_3FGTAP_DRAGGING_OR_TAP, 873 }; 874 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 875 tp->tap.state = dest[nfingers_tapped - 1]; 876 tp_tap_set_timer(tp, time); 877 break; 878 } 879 case TAP_EVENT_RELEASE: 880 case TAP_EVENT_MOTION: 881 log_tap_bug(tp, t, event); 882 break; 883 case TAP_EVENT_TIMEOUT: 884 tp->tap.state = TAP_STATE_IDLE; 885 tp_tap_notify(tp, 886 time, 887 nfingers_tapped, 888 LIBINPUT_BUTTON_STATE_RELEASED); 889 break; 890 case TAP_EVENT_BUTTON: 891 tp->tap.state = TAP_STATE_DEAD; 892 tp_tap_notify(tp, 893 time, 894 nfingers_tapped, 895 LIBINPUT_BUTTON_STATE_RELEASED); 896 break; 897 case TAP_EVENT_THUMB: 898 case TAP_EVENT_PALM: 899 log_tap_bug(tp, t, event); 900 break; 901 case TAP_EVENT_PALM_UP: 902 break; 903 } 904} 905 906static void 907tp_tap_dragging_tap_handle_event(struct tp_dispatch *tp, 908 struct tp_touch *t, 909 enum tap_event event, uint64_t time, 910 int nfingers_tapped) 911{ 912 913 switch (event) { 914 case TAP_EVENT_TOUCH: { 915 tp_tap_notify(tp, 916 time, 917 nfingers_tapped, 918 LIBINPUT_BUTTON_STATE_RELEASED); 919 tp_tap_clear_timer(tp); 920 tp_tap_move_to_dead(tp, t); 921 break; 922 } 923 case TAP_EVENT_RELEASE: 924 tp->tap.state = TAP_STATE_IDLE; 925 tp_tap_notify(tp, 926 time, 927 nfingers_tapped, 928 LIBINPUT_BUTTON_STATE_RELEASED); 929 break; 930 case TAP_EVENT_MOTION: 931 case TAP_EVENT_TIMEOUT: { 932 enum tp_tap_state dest[3] = { 933 TAP_STATE_1FGTAP_DRAGGING, 934 TAP_STATE_2FGTAP_DRAGGING, 935 TAP_STATE_3FGTAP_DRAGGING, 936 }; 937 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 938 tp->tap.state = dest[nfingers_tapped - 1]; 939 break; 940 } 941 case TAP_EVENT_BUTTON: 942 tp->tap.state = TAP_STATE_DEAD; 943 tp_tap_notify(tp, 944 time, 945 nfingers_tapped, 946 LIBINPUT_BUTTON_STATE_RELEASED); 947 break; 948 case TAP_EVENT_THUMB: 949 break; 950 case TAP_EVENT_PALM: { 951 enum tp_tap_state dest[3] = { 952 TAP_STATE_1FGTAP_DRAGGING_WAIT, 953 TAP_STATE_2FGTAP_DRAGGING_WAIT, 954 TAP_STATE_3FGTAP_DRAGGING_WAIT, 955 }; 956 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 957 tp->tap.state = dest[nfingers_tapped - 1]; 958 break; 959 } 960 case TAP_EVENT_PALM_UP: 961 break; 962 } 963} 964 965static void 966tp_tap_dragging2_handle_event(struct tp_dispatch *tp, 967 struct tp_touch *t, 968 enum tap_event event, uint64_t time, 969 int nfingers_tapped) 970{ 971 972 switch (event) { 973 case TAP_EVENT_RELEASE: { 974 enum tp_tap_state dest[3] = { 975 TAP_STATE_1FGTAP_DRAGGING, 976 TAP_STATE_2FGTAP_DRAGGING, 977 TAP_STATE_3FGTAP_DRAGGING, 978 }; 979 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 980 tp->tap.state = dest[nfingers_tapped - 1]; 981 break; 982 } 983 case TAP_EVENT_TOUCH: 984 tp->tap.state = TAP_STATE_DEAD; 985 tp_tap_notify(tp, 986 time, 987 nfingers_tapped, 988 LIBINPUT_BUTTON_STATE_RELEASED); 989 break; 990 case TAP_EVENT_MOTION: 991 case TAP_EVENT_TIMEOUT: 992 /* noop */ 993 break; 994 case TAP_EVENT_BUTTON: 995 tp->tap.state = TAP_STATE_DEAD; 996 tp_tap_notify(tp, 997 time, 998 nfingers_tapped, 999 LIBINPUT_BUTTON_STATE_RELEASED); 1000 break; 1001 case TAP_EVENT_THUMB: 1002 break; 1003 case TAP_EVENT_PALM: { 1004 enum tp_tap_state dest[3] = { 1005 TAP_STATE_1FGTAP_DRAGGING, 1006 TAP_STATE_2FGTAP_DRAGGING, 1007 TAP_STATE_3FGTAP_DRAGGING, 1008 }; 1009 assert(nfingers_tapped >= 1 && nfingers_tapped <= 3); 1010 tp->tap.state = dest[nfingers_tapped - 1]; 1011 break; 1012 } 1013 case TAP_EVENT_PALM_UP: 1014 break; 1015 } 1016} 1017 1018static void 1019tp_tap_dead_handle_event(struct tp_dispatch *tp, 1020 struct tp_touch *t, 1021 enum tap_event event, 1022 uint64_t time) 1023{ 1024 1025 switch (event) { 1026 case TAP_EVENT_RELEASE: 1027 if (tp->tap.nfingers_down == 0) 1028 tp->tap.state = TAP_STATE_IDLE; 1029 break; 1030 case TAP_EVENT_TOUCH: 1031 case TAP_EVENT_MOTION: 1032 case TAP_EVENT_TIMEOUT: 1033 case TAP_EVENT_BUTTON: 1034 break; 1035 case TAP_EVENT_THUMB: 1036 break; 1037 case TAP_EVENT_PALM: 1038 case TAP_EVENT_PALM_UP: 1039 if (tp->tap.nfingers_down == 0) 1040 tp->tap.state = TAP_STATE_IDLE; 1041 break; 1042 } 1043} 1044 1045static void 1046tp_tap_handle_event(struct tp_dispatch *tp, 1047 struct tp_touch *t, 1048 enum tap_event event, 1049 uint64_t time) 1050{ 1051 enum tp_tap_state current; 1052 1053 current = tp->tap.state; 1054 1055 switch(tp->tap.state) { 1056 case TAP_STATE_IDLE: 1057 tp_tap_idle_handle_event(tp, t, event, time); 1058 break; 1059 case TAP_STATE_TOUCH: 1060 tp_tap_touch_handle_event(tp, t, event, time); 1061 break; 1062 case TAP_STATE_HOLD: 1063 tp_tap_hold_handle_event(tp, t, event, time); 1064 break; 1065 case TAP_STATE_1FGTAP_TAPPED: 1066 tp_tap_tapped_handle_event(tp, t, event, time, 1); 1067 break; 1068 case TAP_STATE_2FGTAP_TAPPED: 1069 tp_tap_tapped_handle_event(tp, t, event, time, 2); 1070 break; 1071 case TAP_STATE_3FGTAP_TAPPED: 1072 tp_tap_tapped_handle_event(tp, t, event, time, 3); 1073 break; 1074 case TAP_STATE_TOUCH_2: 1075 tp_tap_touch2_handle_event(tp, t, event, time); 1076 break; 1077 case TAP_STATE_TOUCH_2_HOLD: 1078 tp_tap_touch2_hold_handle_event(tp, t, event, time); 1079 break; 1080 case TAP_STATE_TOUCH_2_RELEASE: 1081 tp_tap_touch2_release_handle_event(tp, t, event, time); 1082 break; 1083 case TAP_STATE_TOUCH_3: 1084 tp_tap_touch3_handle_event(tp, t, event, time); 1085 break; 1086 case TAP_STATE_TOUCH_3_HOLD: 1087 tp_tap_touch3_hold_handle_event(tp, t, event, time); 1088 break; 1089 case TAP_STATE_TOUCH_3_RELEASE: 1090 tp_tap_touch3_release_handle_event(tp, t, event, time); 1091 break; 1092 case TAP_STATE_TOUCH_3_RELEASE_2: 1093 tp_tap_touch3_release2_handle_event(tp, t, event, time); 1094 break; 1095 case TAP_STATE_1FGTAP_DRAGGING_OR_DOUBLETAP: 1096 tp_tap_dragging_or_doubletap_handle_event(tp, t, event, time, 1097 1); 1098 break; 1099 case TAP_STATE_2FGTAP_DRAGGING_OR_DOUBLETAP: 1100 tp_tap_dragging_or_doubletap_handle_event(tp, t, event, time, 1101 2); 1102 break; 1103 case TAP_STATE_3FGTAP_DRAGGING_OR_DOUBLETAP: 1104 tp_tap_dragging_or_doubletap_handle_event(tp, t, event, time, 1105 3); 1106 break; 1107 case TAP_STATE_1FGTAP_DRAGGING: 1108 tp_tap_dragging_handle_event(tp, t, event, time, 1); 1109 break; 1110 case TAP_STATE_2FGTAP_DRAGGING: 1111 tp_tap_dragging_handle_event(tp, t, event, time, 2); 1112 break; 1113 case TAP_STATE_3FGTAP_DRAGGING: 1114 tp_tap_dragging_handle_event(tp, t, event, time, 3); 1115 break; 1116 case TAP_STATE_1FGTAP_DRAGGING_WAIT: 1117 tp_tap_dragging_wait_handle_event(tp, t, event, time, 1); 1118 break; 1119 case TAP_STATE_2FGTAP_DRAGGING_WAIT: 1120 tp_tap_dragging_wait_handle_event(tp, t, event, time, 2); 1121 break; 1122 case TAP_STATE_3FGTAP_DRAGGING_WAIT: 1123 tp_tap_dragging_wait_handle_event(tp, t, event, time, 3); 1124 break; 1125 case TAP_STATE_1FGTAP_DRAGGING_OR_TAP: 1126 tp_tap_dragging_tap_handle_event(tp, t, event, time, 1); 1127 break; 1128 case TAP_STATE_2FGTAP_DRAGGING_OR_TAP: 1129 tp_tap_dragging_tap_handle_event(tp, t, event, time, 2); 1130 break; 1131 case TAP_STATE_3FGTAP_DRAGGING_OR_TAP: 1132 tp_tap_dragging_tap_handle_event(tp, t, event, time, 3); 1133 break; 1134 case TAP_STATE_1FGTAP_DRAGGING_2: 1135 tp_tap_dragging2_handle_event(tp, t, event, time, 1); 1136 break; 1137 case TAP_STATE_2FGTAP_DRAGGING_2: 1138 tp_tap_dragging2_handle_event(tp, t, event, time, 2); 1139 break; 1140 case TAP_STATE_3FGTAP_DRAGGING_2: 1141 tp_tap_dragging2_handle_event(tp, t, event, time, 3); 1142 break; 1143 case TAP_STATE_DEAD: 1144 tp_tap_dead_handle_event(tp, t, event, time); 1145 break; 1146 } 1147 1148 if (tp->tap.state == TAP_STATE_IDLE || tp->tap.state == TAP_STATE_DEAD) 1149 tp_tap_clear_timer(tp); 1150 1151 if (current != tp->tap.state) 1152 evdev_log_debug(tp->device, 1153 "tap: touch %d (%s), tap state %s → %s → %s\n", 1154 t ? (int)t->index : -1, 1155 t ? touch_state_to_str(t->state) : "", 1156 tap_state_to_str(current), 1157 tap_event_to_str(event), 1158 tap_state_to_str(tp->tap.state)); 1159} 1160 1161static bool 1162tp_tap_exceeds_motion_threshold(struct tp_dispatch *tp, 1163 struct tp_touch *t) 1164{ 1165 struct phys_coords mm = 1166 tp_phys_delta(tp, device_delta(t->point, t->tap.initial)); 1167 1168 /* if we have more fingers down than slots, we know that synaptics 1169 * touchpads are likely to give us pointer jumps. 1170 * This triggers the movement threshold, making three-finger taps 1171 * less reliable (#101435) 1172 * 1173 * This uses the real nfingers_down, not the one for taps. 1174 */ 1175 if (tp->device->model_flags & EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD && 1176 (tp->nfingers_down > 2 || tp->old_nfingers_down > 2) && 1177 (tp->nfingers_down > tp->num_slots || 1178 tp->old_nfingers_down > tp->num_slots)) { 1179 return false; 1180 } 1181 1182 /* Semi-mt devices will give us large movements on finger release, 1183 * depending which touch is released. Make sure we ignore any 1184 * movement in the same frame as a finger change. 1185 */ 1186 if (tp->semi_mt && tp->nfingers_down != tp->old_nfingers_down) 1187 return false; 1188 1189 return length_in_mm(mm) > DEFAULT_TAP_MOVE_THRESHOLD; 1190} 1191 1192static bool 1193tp_tap_enabled(struct tp_dispatch *tp) 1194{ 1195 return tp->tap.enabled && !tp->tap.suspended; 1196} 1197 1198int 1199tp_tap_handle_state(struct tp_dispatch *tp, uint64_t time) 1200{ 1201 struct tp_touch *t; 1202 int filter_motion = 0; 1203 1204 if (!tp_tap_enabled(tp)) 1205 return 0; 1206 1207 /* Handle queued button pressed events from clickpads. For touchpads 1208 * with separate physical buttons, ignore button pressed events so they 1209 * don't interfere with tapping. */ 1210 if (tp->buttons.is_clickpad && tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS) 1211 tp_tap_handle_event(tp, NULL, TAP_EVENT_BUTTON, time); 1212 1213 tp_for_each_touch(tp, t) { 1214 if (!t->dirty || t->state == TOUCH_NONE) 1215 continue; 1216 1217 if (tp->buttons.is_clickpad && 1218 tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS) 1219 t->tap.state = TAP_TOUCH_STATE_DEAD; 1220 1221 /* If a touch was considered thumb for tapping once, we 1222 * ignore it for the rest of lifetime */ 1223 if (t->tap.is_thumb) 1224 continue; 1225 1226 /* A palm tap needs to be properly released because we might 1227 * be who-knows-where in the state machine. Otherwise, we 1228 * ignore any event from it. 1229 */ 1230 if (t->tap.is_palm) { 1231 if (t->state == TOUCH_END) 1232 tp_tap_handle_event(tp, 1233 t, 1234 TAP_EVENT_PALM_UP, 1235 time); 1236 continue; 1237 } 1238 1239 if (t->state == TOUCH_HOVERING) 1240 continue; 1241 1242 if (t->palm.state != PALM_NONE) { 1243 assert(!t->tap.is_palm); 1244 t->tap.is_palm = true; 1245 t->tap.state = TAP_TOUCH_STATE_DEAD; 1246 if (t->state != TOUCH_BEGIN) { 1247 tp_tap_handle_event(tp, t, TAP_EVENT_PALM, time); 1248 assert(tp->tap.nfingers_down > 0); 1249 tp->tap.nfingers_down--; 1250 } 1251 } else if (t->state == TOUCH_BEGIN) { 1252 /* The simple version: if a touch is a thumb on 1253 * begin we ignore it. All other thumb touches 1254 * follow the normal tap state for now */ 1255 if (tp_thumb_ignored_for_tap(tp, t)) { 1256 t->tap.is_thumb = true; 1257 continue; 1258 } 1259 1260 t->tap.state = TAP_TOUCH_STATE_TOUCH; 1261 t->tap.initial = t->point; 1262 tp->tap.nfingers_down++; 1263 tp_tap_handle_event(tp, t, TAP_EVENT_TOUCH, time); 1264 } else if (t->state == TOUCH_END) { 1265 if (t->was_down) { 1266 assert(tp->tap.nfingers_down >= 1); 1267 tp->tap.nfingers_down--; 1268 tp_tap_handle_event(tp, t, TAP_EVENT_RELEASE, time); 1269 } 1270 t->tap.state = TAP_TOUCH_STATE_IDLE; 1271 } else if (tp->tap.state != TAP_STATE_IDLE && 1272 tp_thumb_ignored(tp, t)) { 1273 tp_tap_handle_event(tp, t, TAP_EVENT_THUMB, time); 1274 } else if (tp->tap.state != TAP_STATE_IDLE && 1275 tp_tap_exceeds_motion_threshold(tp, t)) { 1276 struct tp_touch *tmp; 1277 1278 /* Any touch exceeding the threshold turns all 1279 * touches into DEAD */ 1280 tp_for_each_touch(tp, tmp) { 1281 if (tmp->tap.state == TAP_TOUCH_STATE_TOUCH) 1282 tmp->tap.state = TAP_TOUCH_STATE_DEAD; 1283 } 1284 1285 tp_tap_handle_event(tp, t, TAP_EVENT_MOTION, time); 1286 } 1287 } 1288 1289 /** 1290 * In any state where motion exceeding the move threshold would 1291 * move to the next state, filter that motion until we actually 1292 * exceed it. This prevents small motion events while we're waiting 1293 * on a decision if a tap is a tap. 1294 */ 1295 switch (tp->tap.state) { 1296 case TAP_STATE_TOUCH: 1297 case TAP_STATE_1FGTAP_TAPPED: 1298 case TAP_STATE_2FGTAP_TAPPED: 1299 case TAP_STATE_3FGTAP_TAPPED: 1300 case TAP_STATE_1FGTAP_DRAGGING_OR_DOUBLETAP: 1301 case TAP_STATE_2FGTAP_DRAGGING_OR_DOUBLETAP: 1302 case TAP_STATE_3FGTAP_DRAGGING_OR_DOUBLETAP: 1303 case TAP_STATE_1FGTAP_DRAGGING_OR_TAP: 1304 case TAP_STATE_2FGTAP_DRAGGING_OR_TAP: 1305 case TAP_STATE_3FGTAP_DRAGGING_OR_TAP: 1306 case TAP_STATE_TOUCH_2: 1307 case TAP_STATE_TOUCH_3: 1308 filter_motion = 1; 1309 break; 1310 1311 default: 1312 break; 1313 1314 } 1315 1316 assert(tp->tap.nfingers_down <= tp->nfingers_down); 1317 if (tp->nfingers_down == 0) 1318 assert(tp->tap.nfingers_down == 0); 1319 1320 return filter_motion; 1321} 1322 1323static inline void 1324tp_tap_update_map(struct tp_dispatch *tp) 1325{ 1326 if (tp->tap.state != TAP_STATE_IDLE) 1327 return; 1328 1329 if (tp->tap.map != tp->tap.want_map) 1330 tp->tap.map = tp->tap.want_map; 1331} 1332 1333void 1334tp_tap_post_process_state(struct tp_dispatch *tp) 1335{ 1336 tp_tap_update_map(tp); 1337} 1338 1339static void 1340tp_tap_handle_timeout(uint64_t time, void *data) 1341{ 1342 struct tp_dispatch *tp = data; 1343 struct tp_touch *t; 1344 1345 tp_tap_handle_event(tp, NULL, TAP_EVENT_TIMEOUT, time); 1346 1347 tp_for_each_touch(tp, t) { 1348 if (t->state == TOUCH_NONE || 1349 t->tap.state == TAP_TOUCH_STATE_IDLE) 1350 continue; 1351 1352 t->tap.state = TAP_TOUCH_STATE_DEAD; 1353 } 1354} 1355 1356static void 1357tp_tap_enabled_update(struct tp_dispatch *tp, bool suspended, bool enabled, uint64_t time) 1358{ 1359 bool was_enabled = tp_tap_enabled(tp); 1360 1361 tp->tap.suspended = suspended; 1362 tp->tap.enabled = enabled; 1363 1364 if (tp_tap_enabled(tp) == was_enabled) 1365 return; 1366 1367 if (tp_tap_enabled(tp)) { 1368 struct tp_touch *t; 1369 1370 /* On resume, all touches are considered palms */ 1371 tp_for_each_touch(tp, t) { 1372 if (t->state == TOUCH_NONE) 1373 continue; 1374 1375 t->tap.is_palm = true; 1376 t->tap.state = TAP_TOUCH_STATE_DEAD; 1377 } 1378 1379 tp->tap.state = TAP_STATE_IDLE; 1380 tp->tap.nfingers_down = 0; 1381 } else { 1382 tp_release_all_taps(tp, time); 1383 } 1384} 1385 1386static int 1387tp_tap_config_count(struct libinput_device *device) 1388{ 1389 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1390 struct tp_dispatch *tp = tp_dispatch(dispatch); 1391 1392 return min(tp->ntouches, 3U); /* we only do up to 3 finger tap */ 1393} 1394 1395static enum libinput_config_status 1396tp_tap_config_set_enabled(struct libinput_device *device, 1397 enum libinput_config_tap_state enabled) 1398{ 1399 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1400 struct tp_dispatch *tp = tp_dispatch(dispatch); 1401 1402 tp_tap_enabled_update(tp, tp->tap.suspended, 1403 (enabled == LIBINPUT_CONFIG_TAP_ENABLED), 1404 libinput_now(device->seat->libinput)); 1405 1406 return LIBINPUT_CONFIG_STATUS_SUCCESS; 1407} 1408 1409static enum libinput_config_tap_state 1410tp_tap_config_is_enabled(struct libinput_device *device) 1411{ 1412 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1413 struct tp_dispatch *tp = tp_dispatch(dispatch); 1414 1415 return tp->tap.enabled ? LIBINPUT_CONFIG_TAP_ENABLED : 1416 LIBINPUT_CONFIG_TAP_DISABLED; 1417} 1418 1419static enum libinput_config_tap_state 1420tp_tap_default(struct evdev_device *evdev) 1421{ 1422 /** 1423 * If we don't have a left button we must have tapping enabled by 1424 * default. 1425 */ 1426 if (!libevdev_has_event_code(evdev->evdev, EV_KEY, BTN_LEFT)) 1427 return LIBINPUT_CONFIG_TAP_ENABLED; 1428 1429 /** 1430 * Tapping is disabled by default for two reasons: 1431 * * if you don't know that tapping is a thing (or enabled by 1432 * default), you get spurious mouse events that make the desktop 1433 * feel buggy. 1434 * * if you do know what tapping is and you want it, you 1435 * usually know where to enable it, or at least you can search for 1436 * it. 1437 */ 1438 return LIBINPUT_CONFIG_TAP_DISABLED; 1439} 1440 1441static enum libinput_config_tap_state 1442tp_tap_config_get_default(struct libinput_device *device) 1443{ 1444 struct evdev_device *evdev = evdev_device(device); 1445 1446 return tp_tap_default(evdev); 1447} 1448 1449static enum libinput_config_status 1450tp_tap_config_set_map(struct libinput_device *device, 1451 enum libinput_config_tap_button_map map) 1452{ 1453 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1454 struct tp_dispatch *tp = tp_dispatch(dispatch); 1455 1456 tp->tap.want_map = map; 1457 1458 tp_tap_update_map(tp); 1459 1460 return LIBINPUT_CONFIG_STATUS_SUCCESS; 1461} 1462 1463static enum libinput_config_tap_button_map 1464tp_tap_config_get_map(struct libinput_device *device) 1465{ 1466 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1467 struct tp_dispatch *tp = tp_dispatch(dispatch); 1468 1469 return tp->tap.want_map; 1470} 1471 1472static enum libinput_config_tap_button_map 1473tp_tap_config_get_default_map(struct libinput_device *device) 1474{ 1475 return LIBINPUT_CONFIG_TAP_MAP_LRM; 1476} 1477 1478static enum libinput_config_status 1479tp_tap_config_set_drag_enabled(struct libinput_device *device, 1480 enum libinput_config_drag_state enabled) 1481{ 1482 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1483 struct tp_dispatch *tp = tp_dispatch(dispatch); 1484 1485 tp->tap.drag_enabled = enabled; 1486 1487 return LIBINPUT_CONFIG_STATUS_SUCCESS; 1488} 1489 1490static enum libinput_config_drag_state 1491tp_tap_config_get_drag_enabled(struct libinput_device *device) 1492{ 1493 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1494 struct tp_dispatch *tp = tp_dispatch(dispatch); 1495 1496 return tp->tap.drag_enabled; 1497} 1498 1499static inline enum libinput_config_drag_state 1500tp_drag_default(struct evdev_device *device) 1501{ 1502 return LIBINPUT_CONFIG_DRAG_ENABLED; 1503} 1504 1505static enum libinput_config_drag_state 1506tp_tap_config_get_default_drag_enabled(struct libinput_device *device) 1507{ 1508 struct evdev_device *evdev = evdev_device(device); 1509 1510 return tp_drag_default(evdev); 1511} 1512 1513static enum libinput_config_status 1514tp_tap_config_set_draglock_enabled(struct libinput_device *device, 1515 enum libinput_config_drag_lock_state enabled) 1516{ 1517 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1518 struct tp_dispatch *tp = tp_dispatch(dispatch); 1519 1520 tp->tap.drag_lock_enabled = enabled; 1521 1522 return LIBINPUT_CONFIG_STATUS_SUCCESS; 1523} 1524 1525static enum libinput_config_drag_lock_state 1526tp_tap_config_get_draglock_enabled(struct libinput_device *device) 1527{ 1528 struct evdev_dispatch *dispatch = evdev_device(device)->dispatch; 1529 struct tp_dispatch *tp = tp_dispatch(dispatch); 1530 1531 return tp->tap.drag_lock_enabled; 1532} 1533 1534static inline enum libinput_config_drag_lock_state 1535tp_drag_lock_default(struct evdev_device *device) 1536{ 1537 return LIBINPUT_CONFIG_DRAG_LOCK_DISABLED; 1538} 1539 1540static enum libinput_config_drag_lock_state 1541tp_tap_config_get_default_draglock_enabled(struct libinput_device *device) 1542{ 1543 struct evdev_device *evdev = evdev_device(device); 1544 1545 return tp_drag_lock_default(evdev); 1546} 1547 1548void 1549tp_init_tap(struct tp_dispatch *tp) 1550{ 1551 char timer_name[64]; 1552 1553 tp->tap.config.count = tp_tap_config_count; 1554 tp->tap.config.set_enabled = tp_tap_config_set_enabled; 1555 tp->tap.config.get_enabled = tp_tap_config_is_enabled; 1556 tp->tap.config.get_default = tp_tap_config_get_default; 1557 tp->tap.config.set_map = tp_tap_config_set_map; 1558 tp->tap.config.get_map = tp_tap_config_get_map; 1559 tp->tap.config.get_default_map = tp_tap_config_get_default_map; 1560 tp->tap.config.set_drag_enabled = tp_tap_config_set_drag_enabled; 1561 tp->tap.config.get_drag_enabled = tp_tap_config_get_drag_enabled; 1562 tp->tap.config.get_default_drag_enabled = tp_tap_config_get_default_drag_enabled; 1563 tp->tap.config.set_draglock_enabled = tp_tap_config_set_draglock_enabled; 1564 tp->tap.config.get_draglock_enabled = tp_tap_config_get_draglock_enabled; 1565 tp->tap.config.get_default_draglock_enabled = tp_tap_config_get_default_draglock_enabled; 1566 tp->device->base.config.tap = &tp->tap.config; 1567 1568 tp->tap.state = TAP_STATE_IDLE; 1569 tp->tap.enabled = tp_tap_default(tp->device); 1570 tp->tap.map = LIBINPUT_CONFIG_TAP_MAP_LRM; 1571 tp->tap.want_map = tp->tap.map; 1572 tp->tap.drag_enabled = tp_drag_default(tp->device); 1573 tp->tap.drag_lock_enabled = tp_drag_lock_default(tp->device); 1574 1575 snprintf(timer_name, 1576 sizeof(timer_name), 1577 "%s tap", 1578 evdev_device_get_sysname(tp->device)); 1579 libinput_timer_init(&tp->tap.timer, 1580 tp_libinput_context(tp), 1581 timer_name, 1582 tp_tap_handle_timeout, tp); 1583} 1584 1585void 1586tp_remove_tap(struct tp_dispatch *tp) 1587{ 1588 libinput_timer_cancel(&tp->tap.timer); 1589} 1590 1591void 1592tp_release_all_taps(struct tp_dispatch *tp, uint64_t now) 1593{ 1594 struct tp_touch *t; 1595 int i; 1596 1597 for (i = 1; i <= 3; i++) { 1598 if (tp->tap.buttons_pressed & bit(i)) 1599 tp_tap_notify(tp, now, i, LIBINPUT_BUTTON_STATE_RELEASED); 1600 } 1601 1602 /* To neutralize all current touches, we make them all palms */ 1603 tp_for_each_touch(tp, t) { 1604 if (t->state == TOUCH_NONE) 1605 continue; 1606 1607 if (t->tap.is_palm) 1608 continue; 1609 1610 t->tap.is_palm = true; 1611 t->tap.state = TAP_TOUCH_STATE_DEAD; 1612 } 1613 1614 tp->tap.state = TAP_STATE_IDLE; 1615 tp->tap.nfingers_down = 0; 1616} 1617 1618void 1619tp_tap_suspend(struct tp_dispatch *tp, uint64_t time) 1620{ 1621 tp_tap_enabled_update(tp, true, tp->tap.enabled, time); 1622} 1623 1624void 1625tp_tap_resume(struct tp_dispatch *tp, uint64_t time) 1626{ 1627 tp_tap_enabled_update(tp, false, tp->tap.enabled, time); 1628} 1629 1630bool 1631tp_tap_dragging(const struct tp_dispatch *tp) 1632{ 1633 switch (tp->tap.state) { 1634 case TAP_STATE_1FGTAP_DRAGGING: 1635 case TAP_STATE_2FGTAP_DRAGGING: 1636 case TAP_STATE_3FGTAP_DRAGGING: 1637 case TAP_STATE_1FGTAP_DRAGGING_2: 1638 case TAP_STATE_2FGTAP_DRAGGING_2: 1639 case TAP_STATE_3FGTAP_DRAGGING_2: 1640 case TAP_STATE_1FGTAP_DRAGGING_WAIT: 1641 case TAP_STATE_2FGTAP_DRAGGING_WAIT: 1642 case TAP_STATE_3FGTAP_DRAGGING_WAIT: 1643 case TAP_STATE_1FGTAP_DRAGGING_OR_TAP: 1644 case TAP_STATE_2FGTAP_DRAGGING_OR_TAP: 1645 case TAP_STATE_3FGTAP_DRAGGING_OR_TAP: 1646 return true; 1647 default: 1648 return false; 1649 } 1650} 1651 1652bool 1653tp_tap_dragging_or_double_tapping(const struct tp_dispatch *tp) 1654{ 1655 switch (tp->tap.state) { 1656 case TAP_STATE_1FGTAP_DRAGGING_OR_DOUBLETAP: 1657 case TAP_STATE_2FGTAP_DRAGGING_OR_DOUBLETAP: 1658 case TAP_STATE_3FGTAP_DRAGGING_OR_DOUBLETAP: 1659 return true; 1660 default: 1661 return false; 1662 } 1663} 1664