]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Input: Make sure we follow all EV_KEY events
authorHenrik Rydberg <rydberg@euromail.se>
Fri, 10 Aug 2012 19:39:38 +0000 (21:39 +0200)
committerHenrik Rydberg <rydberg@euromail.se>
Mon, 10 Sep 2012 17:59:57 +0000 (19:59 +0200)
For some EV_KEY types, sending a larger-than-one value causes the
input state to oscillate. This patch makes sure this cannot happen,
clearing up the autorepeat bypass logic in the process.

Tested-by: Benjamin Tissoires <benjamin.tissoires@enac.fr>
Tested-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
drivers/input/input.c

index 8ebf116c81a7eb53a119900ebf354a173882f83e..4d645002d6e7299bb5e4de41cdfa406021a0e94b 100644 (file)
@@ -239,24 +239,30 @@ static void input_handle_event(struct input_dev *dev,
                break;
 
        case EV_KEY:
-               if (is_event_supported(code, dev->keybit, KEY_MAX) &&
-                   !!test_bit(code, dev->key) != value) {
+               if (is_event_supported(code, dev->keybit, KEY_MAX)) {
+
+                       /* auto-repeat bypasses state updates */
+                       if (value == 2) {
+                               disposition = INPUT_PASS_TO_HANDLERS;
+                               break;
+                       }
+
+                       if (!!test_bit(code, dev->key) != !!value) {
 
-                       if (value != 2) {
                                __change_bit(code, dev->key);
+                               disposition = INPUT_PASS_TO_HANDLERS;
+
                                if (value)
                                        input_start_autorepeat(dev, code);
                                else
                                        input_stop_autorepeat(dev);
                        }
-
-                       disposition = INPUT_PASS_TO_HANDLERS;
                }
                break;
 
        case EV_SW:
                if (is_event_supported(code, dev->swbit, SW_MAX) &&
-                   !!test_bit(code, dev->sw) != value) {
+                   !!test_bit(code, dev->sw) != !!value) {
 
                        __change_bit(code, dev->sw);
                        disposition = INPUT_PASS_TO_HANDLERS;
@@ -283,7 +289,7 @@ static void input_handle_event(struct input_dev *dev,
 
        case EV_LED:
                if (is_event_supported(code, dev->ledbit, LED_MAX) &&
-                   !!test_bit(code, dev->led) != value) {
+                   !!test_bit(code, dev->led) != !!value) {
 
                        __change_bit(code, dev->led);
                        disposition = INPUT_PASS_TO_ALL;