touchpad: save the active clickfinger button
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 27 Mar 2014 05:51:12 +0000 (15:51 +1000)
committerHans de Goede <hdegoede@redhat.com>
Thu, 22 May 2014 12:39:01 +0000 (14:39 +0200)
To avoid having a button left press and a button right release if the number
of fingers changes.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad-buttons.c
src/evdev-mt-touchpad.h

index 640c699..21241de 100644 (file)
@@ -75,23 +75,27 @@ tp_post_clickfinger_buttons(struct tp_dispatch *tp, uint32_t time)
        if (current == old)
                return 0;
 
-       switch (tp->nfingers_down) {
+       if (current) {
+               switch (tp->nfingers_down) {
                case 1: button = BTN_LEFT; break;
                case 2: button = BTN_RIGHT; break;
                case 3: button = BTN_MIDDLE; break;
                default:
                        return 0;
-       }
-
-       if (current)
+               }
+               tp->buttons.active = button;
                state = LIBINPUT_POINTER_BUTTON_STATE_PRESSED;
-       else
+       } else {
+               button = tp->buttons.active;
+               tp->buttons.active = 0;
                state = LIBINPUT_POINTER_BUTTON_STATE_RELEASED;
+       }
 
-       pointer_notify_button(&tp->device->base,
-                             time,
-                             button,
-                             state);
+       if (button)
+               pointer_notify_button(&tp->device->base,
+                                     time,
+                                     button,
+                                     state);
        return 1;
 }
 
index d84c9e8..85cf7e5 100644 (file)
@@ -132,6 +132,7 @@ struct tp_dispatch {
                uint32_t state;
                uint32_t old_state;
                uint32_t motion_dist;           /* for pinned touches */
+               unsigned int active;            /* currently active button, for release event */
        } buttons;                              /* physical buttons */
 
        struct {