aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorRene van Paassen <rene.vanpaassen@gmail.com>2007-05-21 00:32:07 -0400
committerDmitry Torokhov <dtor@insightbb.com>2007-07-10 00:35:16 -0400
commitb3b6cf1d47508a04de859d357789a3fc0cf8c690 (patch)
tree4b6fa11aa3a59e6f3cdcf1d7ab363f1b4412cf3a /drivers/input
parentda9fda434cde76dfb8174548a63b685b4ac00a9c (diff)
Input: aiptek - correct the tool switching code
Now the old tool is remembered, and reset when a new tool is selected via the sysfs files. Signed-off-by: Rene van Paassen <rene.vanpaassen@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/tablet/aiptek.c94
1 files changed, 52 insertions, 42 deletions
diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c
index c7db623682d..0c78dc4ed5c 100644
--- a/drivers/input/tablet/aiptek.c
+++ b/drivers/input/tablet/aiptek.c
@@ -218,15 +218,9 @@
218#define AIPTEK_WHEEL_DISABLE (-10101) 218#define AIPTEK_WHEEL_DISABLE (-10101)
219 219
220 /* ToolCode values, which BTW are 0x140 .. 0x14f 220 /* ToolCode values, which BTW are 0x140 .. 0x14f
221 * We have things set up such that if TOOL_BUTTON_FIRED_BIT is 221 * We have things set up such that if the tool button has changed,
222 * not set, we'll send one instance of AIPTEK_TOOL_BUTTON_xxx. 222 * the tools get reset.
223 *
224 * Whenever the user resets the value, TOOL_BUTTON_FIRED_BIT will
225 * get reset.
226 */ 223 */
227#define TOOL_BUTTON(x) ((x) & 0x14f)
228#define TOOL_BUTTON_FIRED(x) ((x) & 0x200)
229#define TOOL_BUTTON_FIRED_BIT 0x200
230 /* toolMode codes 224 /* toolMode codes
231 */ 225 */
232#define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN 226#define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN
@@ -326,6 +320,9 @@ struct aiptek {
326 int inDelay; /* jitter: in jitter delay? */ 320 int inDelay; /* jitter: in jitter delay? */
327 unsigned long endDelay; /* jitter: time when delay ends */ 321 unsigned long endDelay; /* jitter: time when delay ends */
328 int previousJitterable; /* jitterable prev value */ 322 int previousJitterable; /* jitterable prev value */
323
324 int lastMacro; /* macro key to reset */
325 int previousToolMode; /* pen, pencil, brush, etc. tool */
329 unsigned char *data; /* incoming packet data */ 326 unsigned char *data; /* incoming packet data */
330}; 327};
331 328
@@ -542,16 +539,18 @@ static void aiptek_irq(struct urb *urb)
542 * all 'bad' reports... 539 * all 'bad' reports...
543 */ 540 */
544 if (dv != 0) { 541 if (dv != 0) {
545 /* If we've not already sent a tool_button_?? code, do 542 /* If the selected tool changed, reset the old
546 * so now. Then set FIRED_BIT so it won't be resent unless 543 * tool key, and set the new one.
547 * the user forces FIRED_BIT off.
548 */ 544 */
549 if (TOOL_BUTTON_FIRED 545 if (aiptek->previousToolMode !=
550 (aiptek->curSetting.toolMode) == 0) { 546 aiptek->curSetting.toolMode) {
547 input_report_key(inputdev,
548 aiptek->previousToolMode, 0);
551 input_report_key(inputdev, 549 input_report_key(inputdev,
552 TOOL_BUTTON(aiptek->curSetting.toolMode), 550 aiptek->curSetting.toolMode,
553 1); 551 1);
554 aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 552 aiptek->previousToolMode =
553 aiptek->curSetting.toolMode;
555 } 554 }
556 555
557 if (p != 0) { 556 if (p != 0) {
@@ -612,16 +611,18 @@ static void aiptek_irq(struct urb *urb)
612 middle = (data[5] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0; 611 middle = (data[5] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0;
613 612
614 if (dv != 0) { 613 if (dv != 0) {
615 /* If we've not already sent a tool_button_?? code, do 614 /* If the selected tool changed, reset the old
616 * so now. Then set FIRED_BIT so it won't be resent unless 615 * tool key, and set the new one.
617 * the user forces FIRED_BIT off.
618 */ 616 */
619 if (TOOL_BUTTON_FIRED 617 if (aiptek->previousToolMode !=
620 (aiptek->curSetting.toolMode) == 0) { 618 aiptek->curSetting.toolMode) {
619 input_report_key(inputdev,
620 aiptek->previousToolMode, 0);
621 input_report_key(inputdev, 621 input_report_key(inputdev,
622 TOOL_BUTTON(aiptek->curSetting.toolMode), 622 aiptek->curSetting.toolMode,
623 1); 623 1);
624 aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 624 aiptek->previousToolMode =
625 aiptek->curSetting.toolMode;
625 } 626 }
626 627
627 if (p != 0) { 628 if (p != 0) {
@@ -662,15 +663,18 @@ static void aiptek_irq(struct urb *urb)
662 z = le16_to_cpu(get_unaligned((__le16 *) (data + 4))); 663 z = le16_to_cpu(get_unaligned((__le16 *) (data + 4)));
663 664
664 if (dv != 0) { 665 if (dv != 0) {
665 /* If we've not already sent a tool_button_?? code, do 666 /* If the selected tool changed, reset the old
666 * so now. Then set FIRED_BIT so it won't be resent unless 667 * tool key, and set the new one.
667 * the user forces FIRED_BIT off.
668 */ 668 */
669 if (TOOL_BUTTON_FIRED(aiptek->curSetting.toolMode) == 0) { 669 if (aiptek->previousToolMode !=
670 aiptek->curSetting.toolMode) {
671 input_report_key(inputdev,
672 aiptek->previousToolMode, 0);
670 input_report_key(inputdev, 673 input_report_key(inputdev,
671 TOOL_BUTTON(aiptek->curSetting.toolMode), 674 aiptek->curSetting.toolMode,
672 1); 675 1);
673 aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 676 aiptek->previousToolMode =
677 aiptek->curSetting.toolMode;
674 } 678 }
675 679
676 if (p != 0) { 680 if (p != 0) {
@@ -710,15 +714,18 @@ static void aiptek_irq(struct urb *urb)
710 macro = data[3]; 714 macro = data[3];
711 715
712 if (dv != 0) { 716 if (dv != 0) {
713 /* If we've not already sent a tool_button_?? code, do 717 /* If the selected tool changed, reset the old
714 * so now. Then set FIRED_BIT so it won't be resent unless 718 * tool key, and set the new one.
715 * the user forces FIRED_BIT off.
716 */ 719 */
717 if (TOOL_BUTTON_FIRED(aiptek->curSetting.toolMode) == 0) { 720 if (aiptek->previousToolMode !=
721 aiptek->curSetting.toolMode) {
722 input_report_key(inputdev,
723 aiptek->previousToolMode, 0);
718 input_report_key(inputdev, 724 input_report_key(inputdev,
719 TOOL_BUTTON(aiptek->curSetting.toolMode), 725 aiptek->curSetting.toolMode,
720 1); 726 1);
721 aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 727 aiptek->previousToolMode =
728 aiptek->curSetting.toolMode;
722 } 729 }
723 730
724 if (p != 0) { 731 if (p != 0) {
@@ -762,15 +769,18 @@ static void aiptek_irq(struct urb *urb)
762 0); 769 0);
763 } 770 }
764 771
765 /* If we've not already sent a tool_button_?? code, do 772 /* If the selected tool changed, reset the old
766 * so now. Then set FIRED_BIT so it won't be resent unless 773 tool key, and set the new one.
767 * the user forces FIRED_BIT off. 774 */
768 */ 775 if (aiptek->previousToolMode !=
769 if (TOOL_BUTTON_FIRED(aiptek->curSetting.toolMode) == 0) { 776 aiptek->curSetting.toolMode) {
777 input_report_key(inputdev,
778 aiptek->previousToolMode, 0);
770 input_report_key(inputdev, 779 input_report_key(inputdev,
771 TOOL_BUTTON(aiptek->curSetting. 780 aiptek->curSetting.toolMode,
772 toolMode), 1); 781 1);
773 aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 782 aiptek->previousToolMode =
783 aiptek->curSetting.toolMode;
774 } 784 }
775 785
776 input_report_key(inputdev, macroKeyEvents[macro], 1); 786 input_report_key(inputdev, macroKeyEvents[macro], 1);