touchpad: make gestures optional
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 30 Jul 2015 00:48:39 +0000 (10:48 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 3 Aug 2015 01:40:12 +0000 (11:40 +1000)
Not all multi-finger touchpads are able to reliably produce gestures, so make
it optional. This patch just adds a boolean (currently always true) that gets
set on touchpad init time, i.e. it is not run-time configurable.

Three and four-finger gestures are filtered out in gesture_notify(), if the
cap isn't set the event is discarded.

For two-finger gestures we prevent a transition to PINCH, so we don't
inadvertently detect a pinch gesture and then not send events. This way, a 2fg
gesture is always scroll.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad-gestures.c
src/evdev-mt-touchpad.c
src/evdev-mt-touchpad.h

index 3b1839e46f50546edc1658a3d6a85740ff0804ad..da03c262690cb1d2579f9f5a310afb1049eb1cd2 100644 (file)
@@ -295,7 +295,7 @@ tp_gesture_twofinger_handle_state_unknown(struct tp_dispatch *tp, uint64_t time)
            ((dir2 & 0x80) && (dir1 & 0x01))) {
                tp_gesture_set_scroll_buildup(tp);
                return GESTURE_2FG_STATE_SCROLL;
-       } else {
+       } else if (tp->gesture.enabled) {
                tp_gesture_get_pinch_info(tp,
                                          &tp->gesture.initial_distance,
                                          &tp->gesture.angle,
@@ -303,6 +303,8 @@ tp_gesture_twofinger_handle_state_unknown(struct tp_dispatch *tp, uint64_t time)
                tp->gesture.prev_scale = 1.0;
                return GESTURE_2FG_STATE_PINCH;
        }
+
+       return GESTURE_2FG_STATE_UNKNOWN;
 }
 
 static enum tp_gesture_2fg_state
@@ -563,6 +565,7 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time)
 int
 tp_init_gesture(struct tp_dispatch *tp)
 {
+       tp->gesture.enabled = true;
        tp->gesture.twofinger_state = GESTURE_2FG_STATE_NONE;
 
        libinput_timer_init(&tp->gesture.finger_count_switch_timer,
index e110b9aea6dbd0aeb0f9412f813b284991c3de10..af1cd47a806193dddbcc565b20f215c2dddf725e 100644 (file)
@@ -1918,7 +1918,8 @@ tp_init(struct tp_dispatch *tp,
                return -1;
 
        device->seat_caps |= EVDEV_DEVICE_POINTER;
-       device->seat_caps |= EVDEV_DEVICE_GESTURE;
+       if (tp->gesture.enabled)
+               device->seat_caps |= EVDEV_DEVICE_GESTURE;
 
        return 0;
 }
index a7961e75666fe43d9001cc59357ffe77a0e55fa5..3bd84258dd08c86a0c52cdc7661f02a0d48d9e74 100644 (file)
@@ -246,6 +246,7 @@ struct tp_dispatch {
        } accel;
 
        struct {
+               bool enabled;
                bool started;
                unsigned int finger_count;
                unsigned int finger_count_pending;