summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2016-01-25 10:11:30 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2016-01-25 11:31:35 +1000
commitf0fa09c73f2cc782c6dc0d0d399fbf3d2183182d (patch)
tree92e3c7c38510e621c2c82cf4b18fe4cf1b4c0e73 /src
parent25ab3d4615c6628eacddbb3705913a1a78a67ae1 (diff)
parent28205d6f29f9661d19a805640d98bdc61210c506 (diff)
Merge branch 'wip/disable-semi-mt-gestures'
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'src')
-rw-r--r--src/evdev-mt-touchpad-gestures.c44
-rw-r--r--src/evdev-mt-touchpad.c24
2 files changed, 27 insertions, 41 deletions
diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c
index 93581f4d..6c489c36 100644
--- a/src/evdev-mt-touchpad-gestures.c
+++ b/src/evdev-mt-touchpad-gestures.c
@@ -182,18 +182,7 @@ tp_gesture_get_direction(struct tp_dispatch *tp, struct tp_touch *touch)
{
struct normalized_coords normalized;
struct device_float_coords delta;
- double move_threshold;
-
- /*
- * Semi-mt touchpads have somewhat inaccurate coordinates when
- * 2 fingers are down, so use a slightly larger threshold.
- * Elantech semi-mt touchpads are accurate enough though.
- */
- if (tp->semi_mt &&
- (tp->device->model_flags & EVDEV_MODEL_ELANTECH_TOUCHPAD) == 0)
- move_threshold = TP_MM_TO_DPI_NORMALIZED(4);
- else
- move_threshold = TP_MM_TO_DPI_NORMALIZED(1);
+ double move_threshold = TP_MM_TO_DPI_NORMALIZED(1);
delta = device_delta(touch->point, touch->gesture.initial);
@@ -219,11 +208,7 @@ tp_gesture_get_pinch_info(struct tp_dispatch *tp,
delta = device_delta(first->point, second->point);
normalized = tp_normalize_delta(tp, delta);
*distance = normalized_length(normalized);
-
- if (!tp->semi_mt)
- *angle = atan2(normalized.y, normalized.x) * 180.0 / M_PI;
- else
- *angle = 0.0;
+ *angle = atan2(normalized.y, normalized.x) * 180.0 / M_PI;
*center = device_average(first->point, second->point);
}
@@ -285,7 +270,9 @@ tp_gesture_handle_state_none(struct tp_dispatch *tp, uint64_t time)
if (first == second)
return GESTURE_STATE_NONE;
- }
+
+ } else if (!tp->gesture.enabled)
+ return GESTURE_STATE_SCROLL;
tp->gesture.initial_time = time;
first->gesture.initial = first->point;
@@ -362,7 +349,7 @@ tp_gesture_handle_state_unknown(struct tp_dispatch *tp, uint64_t time)
} else if (tp->gesture.enabled) {
return GESTURE_STATE_SWIPE;
}
- } else if (tp->gesture.enabled) {
+ } else {
tp_gesture_init_pinch(tp);
return GESTURE_STATE_PINCH;
}
@@ -378,16 +365,7 @@ tp_gesture_handle_state_scroll(struct tp_dispatch *tp, uint64_t time)
if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_2FG)
return GESTURE_STATE_SCROLL;
- /* On some semi-mt models slot 0 is more accurate, so for semi-mt
- * we only use slot 0. */
- if (tp->semi_mt) {
- if (!tp->touches[0].dirty)
- return GESTURE_STATE_SCROLL;
-
- delta = tp_get_delta(&tp->touches[0]);
- } else {
- delta = tp_get_average_touches_delta(tp);
- }
+ delta = tp_get_average_touches_delta(tp);
/* scroll is not accelerated */
delta = tp_filter_motion_unaccelerated(tp, &delta, time);
@@ -633,10 +611,10 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t time)
int
tp_init_gesture(struct tp_dispatch *tp)
{
- if (tp->device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT)
- tp->gesture.enabled = false;
- else
- tp->gesture.enabled = true;
+ /* two-finger scrolling is always enabled, this flag just
+ * decides whether we detect pinch. semi-mt devices are too
+ * unreliable to do pinch gestures. */
+ tp->gesture.enabled = !tp->semi_mt && tp->num_slots > 1;
tp->gesture.state = GESTURE_STATE_NONE;
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index aa65ab40..a995e225 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -751,6 +751,9 @@ tp_unhover_abs_distance(struct tp_dispatch *tp, uint64_t time)
for (i = 0; i < tp->ntouches; i++) {
t = tp_get_touch(tp, i);
+ if (!t->dirty)
+ continue;
+
if (t->state == TOUCH_HOVERING) {
if (t->distance == 0) {
/* avoid jumps when landing a finger */
@@ -1495,17 +1498,22 @@ tp_init_slots(struct tp_dispatch *tp,
tp->semi_mt = libevdev_has_property(device->evdev, INPUT_PROP_SEMI_MT);
- /* This device has a terrible resolution when two fingers are down,
+ /* Semi-mt devices are not reliable for true multitouch data, so we
+ * simply pretend they're single touch touchpads with BTN_TOOL bits.
+ * Synaptics:
+ * Terrible resolution when two fingers are down,
* causing scroll jumps. The single-touch emulation ABS_X/Y is
* accurate but the ABS_MT_POSITION touchpoints report the bounding
- * box and that causes jumps. So we simply pretend it's a single
- * touch touchpad with the BTN_TOOL bits.
- * See https://bugzilla.redhat.com/show_bug.cgi?id=1235175 for an
- * explanation.
+ * box and that causes jumps. See https://bugzilla.redhat.com/1235175
+ * Elantech:
+ * On three-finger taps/clicks, one slot doesn't get a coordinate
+ * assigned. See https://bugs.freedesktop.org/show_bug.cgi?id=93583
+ * Alps:
+ * If three fingers are set down in the same frame, one slot has the
+ * coordinates 0/0 and may not get updated for several frames.
+ * See https://bugzilla.redhat.com/show_bug.cgi?id=1295073
*/
- if (tp->semi_mt &&
- (device->model_flags &
- (EVDEV_MODEL_JUMPING_SEMI_MT|EVDEV_MODEL_ELANTECH_TOUCHPAD))) {
+ if (tp->semi_mt) {
tp->num_slots = 1;
tp->slot = 0;
tp->has_mt = false;