aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/tablet/aiptek.c97
1 files changed, 46 insertions, 51 deletions
diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c
index 54c8d6f49833..292eb507e5d3 100644
--- a/drivers/input/tablet/aiptek.c
+++ b/drivers/input/tablet/aiptek.c
@@ -509,6 +509,11 @@ static void aiptek_irq(struct urb *urb)
509 aiptek->curSetting.wheel); 509 aiptek->curSetting.wheel);
510 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE; 510 aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE;
511 } 511 }
512 if (aiptek->lastMacro != -1) {
513 input_report_key(inputdev,
514 macroKeyEvents[aiptek->lastMacro], 0);
515 aiptek->lastMacro = -1;
516 }
512 input_sync(inputdev); 517 input_sync(inputdev);
513 } 518 }
514 } 519 }
@@ -589,6 +594,11 @@ static void aiptek_irq(struct urb *urb)
589 } 594 }
590 } 595 }
591 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_STYLUS); 596 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_STYLUS);
597 if (aiptek->lastMacro != -1) {
598 input_report_key(inputdev,
599 macroKeyEvents[aiptek->lastMacro], 0);
600 aiptek->lastMacro = -1;
601 }
592 input_sync(inputdev); 602 input_sync(inputdev);
593 } 603 }
594 } 604 }
@@ -647,6 +657,11 @@ static void aiptek_irq(struct urb *urb)
647 } 657 }
648 } 658 }
649 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_MOUSE); 659 input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_MOUSE);
660 if (aiptek->lastMacro != -1) {
661 input_report_key(inputdev,
662 macroKeyEvents[aiptek->lastMacro], 0);
663 aiptek->lastMacro = -1;
664 }
650 input_sync(inputdev); 665 input_sync(inputdev);
651 } 666 }
652 } 667 }
@@ -662,10 +677,10 @@ static void aiptek_irq(struct urb *urb)
662 bs = (data[1] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0; 677 bs = (data[1] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0;
663 pck = (data[1] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0; 678 pck = (data[1] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0;
664 679
665 macro = data[3]; 680 macro = dv && p && tip && !(data[3] & 1) ? (data[3] >> 1) : -1;
666 z = le16_to_cpu(get_unaligned((__le16 *) (data + 4))); 681 z = le16_to_cpu(get_unaligned((__le16 *) (data + 4)));
667 682
668 if (dv != 0) { 683 if (dv) {
669 /* If the selected tool changed, reset the old 684 /* If the selected tool changed, reset the old
670 * tool key, and set the new one. 685 * tool key, and set the new one.
671 */ 686 */
@@ -679,30 +694,20 @@ static void aiptek_irq(struct urb *urb)
679 aiptek->previousToolMode = 694 aiptek->previousToolMode =
680 aiptek->curSetting.toolMode; 695 aiptek->curSetting.toolMode;
681 } 696 }
697 }
682 698
683 if (p != 0) { 699 if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) {
684 input_report_key(inputdev, BTN_TOUCH, tip); 700 input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0);
685 input_report_key(inputdev, BTN_STYLUS, bs); 701 aiptek->lastMacro = -1;
686 input_report_key(inputdev, BTN_STYLUS2, pck); 702 }
687 input_report_abs(inputdev, ABS_PRESSURE, z);
688 }
689 703
690 /* For safety, we're sending key 'break' codes for the 704 if (macro != -1 && macro != aiptek->lastMacro) {
691 * neighboring macro keys. 705 input_report_key(inputdev, macroKeyEvents[macro], 1);
692 */ 706 aiptek->lastMacro = macro;
693 if (macro > 0) {
694 input_report_key(inputdev,
695 macroKeyEvents[macro - 1], 0);
696 }
697 if (macro < 25) {
698 input_report_key(inputdev,
699 macroKeyEvents[macro + 1], 0);
700 }
701 input_report_key(inputdev, macroKeyEvents[macro], p);
702 input_report_abs(inputdev, ABS_MISC,
703 p | AIPTEK_REPORT_TOOL_STYLUS);
704 input_sync(inputdev);
705 } 707 }
708 input_report_abs(inputdev, ABS_MISC,
709 p | AIPTEK_REPORT_TOOL_STYLUS);
710 input_sync(inputdev);
706 } 711 }
707 /* Report 5s come from the macro keys when pressed by mouse 712 /* Report 5s come from the macro keys when pressed by mouse
708 */ 713 */
@@ -714,46 +719,35 @@ static void aiptek_irq(struct urb *urb)
714 left = (data[1]& aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0; 719 left = (data[1]& aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0;
715 right = (data[1] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0; 720 right = (data[1] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0;
716 middle = (data[1] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0; 721 middle = (data[1] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0;
717 macro = data[3]; 722 macro = dv && p && left && !(data[3] & 1) ? (data[3] >> 1) : 0;
718 723
719 if (dv != 0) { 724 if (dv) {
720 /* If the selected tool changed, reset the old 725 /* If the selected tool changed, reset the old
721 * tool key, and set the new one. 726 * tool key, and set the new one.
722 */ 727 */
723 if (aiptek->previousToolMode != 728 if (aiptek->previousToolMode !=
724 aiptek->curSetting.toolMode) { 729 aiptek->curSetting.toolMode) {
725 input_report_key(inputdev, 730 input_report_key(inputdev,
726 aiptek->previousToolMode, 0); 731 aiptek->previousToolMode, 0);
727 input_report_key(inputdev, 732 input_report_key(inputdev,
728 aiptek->curSetting.toolMode, 733 aiptek->curSetting.toolMode, 1);
729 1); 734 aiptek->previousToolMode = aiptek->curSetting.toolMode;
730 aiptek->previousToolMode =
731 aiptek->curSetting.toolMode;
732 }
733
734 if (p != 0) {
735 input_report_key(inputdev, BTN_LEFT, left);
736 input_report_key(inputdev, BTN_MIDDLE, middle);
737 input_report_key(inputdev, BTN_RIGHT, right);
738 } 735 }
736 }
739 737
740 /* For safety, we're sending key 'break' codes for the 738 if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) {
741 * neighboring macro keys. 739 input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0);
742 */ 740 aiptek->lastMacro = -1;
743 if (macro > 0) { 741 }
744 input_report_key(inputdev,
745 macroKeyEvents[macro - 1], 0);
746 }
747 if (macro < 25) {
748 input_report_key(inputdev,
749 macroKeyEvents[macro + 1], 0);
750 }
751 742
743 if (macro != -1 && macro != aiptek->lastMacro) {
752 input_report_key(inputdev, macroKeyEvents[macro], 1); 744 input_report_key(inputdev, macroKeyEvents[macro], 1);
753 input_report_rel(inputdev, ABS_MISC, 745 aiptek->lastMacro = macro;
754 p | AIPTEK_REPORT_TOOL_MOUSE);
755 input_sync(inputdev);
756 } 746 }
747
748 input_report_abs(inputdev, ABS_MISC,
749 p | AIPTEK_REPORT_TOOL_MOUSE);
750 input_sync(inputdev);
757 } 751 }
758 /* We have no idea which tool can generate a report 6. Theoretically, 752 /* We have no idea which tool can generate a report 6. Theoretically,
759 * neither need to, having been given reports 4 & 5 for such use. 753 * neither need to, having been given reports 4 & 5 for such use.
@@ -1710,6 +1704,7 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id)
1710 aiptek->inDelay = 0; 1704 aiptek->inDelay = 0;
1711 aiptek->endDelay = 0; 1705 aiptek->endDelay = 0;
1712 aiptek->previousJitterable = 0; 1706 aiptek->previousJitterable = 0;
1707 aiptek->lastMacro = -1;
1713 1708
1714 /* Set up the curSettings struct. Said struct contains the current 1709 /* Set up the curSettings struct. Said struct contains the current
1715 * programmable parameters. The newSetting struct contains changes 1710 * programmable parameters. The newSetting struct contains changes