122 lines
3.9 KiB
Diff
122 lines
3.9 KiB
Diff
From b715f96e1c7457015f048ea76026e3360c27f3f9 Mon Sep 17 00:00:00 2001
|
|
From: Peter Hutterer <peter.hutterer@who-t.net>
|
|
Date: Tue, 23 Jun 2015 15:36:05 +1000
|
|
Subject: [PATCH libinput 3/4] touchpad: improve trackpoint palm detection
|
|
responsiveness
|
|
|
|
The touchpad is disabled for 500ms after a trackpoint event to avoid
|
|
erroneous palm touches. This is currently refreshed on every trackpoint event
|
|
and thus forces a delay of 500ms when switching between the two.
|
|
|
|
Instead, reduce the timeout to 300ms but ignore any touches started while the
|
|
trackpoint was active (i.e. before the last trackpoint event). A touch started
|
|
after the last event is released once the timeout expires.
|
|
|
|
This is the same logic used for disable-while-typing.
|
|
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=1233844
|
|
|
|
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
|
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
|
|
---
|
|
src/evdev-mt-touchpad.c | 34 ++++++++++++++++++++++++++++++++--
|
|
src/evdev-mt-touchpad.h | 2 ++
|
|
2 files changed, 34 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
|
|
index 877e667..fa7d06b 100644
|
|
--- a/src/evdev-mt-touchpad.c
|
|
+++ b/src/evdev-mt-touchpad.c
|
|
@@ -34,7 +34,7 @@
|
|
* TP_MAGIC_SLOWDOWN in filter.c */
|
|
#define DEFAULT_ACCEL_NUMERATOR 3000.0
|
|
#define DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR 700.0
|
|
-#define DEFAULT_TRACKPOINT_ACTIVITY_TIMEOUT 500 /* ms */
|
|
+#define DEFAULT_TRACKPOINT_ACTIVITY_TIMEOUT 300 /* ms */
|
|
#define DEFAULT_KEYBOARD_ACTIVITY_TIMEOUT_1 200 /* ms */
|
|
#define DEFAULT_KEYBOARD_ACTIVITY_TIMEOUT_2 500 /* ms */
|
|
#define FAKE_FINGER_OVERFLOW (1 << 7)
|
|
@@ -515,6 +515,31 @@ tp_palm_detect_dwt(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time)
|
|
return 0;
|
|
}
|
|
|
|
+static int
|
|
+tp_palm_detect_trackpoint(struct tp_dispatch *tp,
|
|
+ struct tp_touch *t,
|
|
+ uint64_t time)
|
|
+{
|
|
+ if (t->palm.state == PALM_NONE &&
|
|
+ t->state == TOUCH_BEGIN &&
|
|
+ tp->palm.trackpoint_active) {
|
|
+ t->palm.state = PALM_TRACKPOINT;
|
|
+ return 1;
|
|
+ } else if (t->palm.state == PALM_TRACKPOINT &&
|
|
+ t->state == TOUCH_UPDATE &&
|
|
+ !tp->palm.trackpoint_active) {
|
|
+
|
|
+ if (t->palm.time == 0 ||
|
|
+ t->palm.time > tp->palm.trackpoint_last_event_time) {
|
|
+ t->palm.state = PALM_NONE;
|
|
+ log_debug(tp_libinput_context(tp),
|
|
+ "palm: touch released, timeout after trackpoint\n");
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static void
|
|
tp_palm_detect(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time)
|
|
{
|
|
@@ -526,6 +551,9 @@ tp_palm_detect(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time)
|
|
if (tp_palm_detect_dwt(tp, t, time))
|
|
goto out;
|
|
|
|
+ if (tp_palm_detect_trackpoint(tp, t, time))
|
|
+ goto out;
|
|
+
|
|
/* If labelled a touch as palm, we unlabel as palm when
|
|
we move out of the palm edge zone within the timeout, provided
|
|
the direction is within 45 degrees of the horizontal.
|
|
@@ -568,7 +596,8 @@ tp_palm_detect(struct tp_dispatch *tp, struct tp_touch *t, uint64_t time)
|
|
out:
|
|
log_debug(tp_libinput_context(tp),
|
|
"palm: palm detected (%s)\n",
|
|
- t->palm.state == PALM_EDGE ? "edge" : "typing");
|
|
+ t->palm.state == PALM_EDGE ? "edge" :
|
|
+ t->palm.state == PALM_TYPING ? "typing" : "trackpoint");
|
|
}
|
|
|
|
static void
|
|
@@ -948,6 +977,7 @@ tp_trackpoint_event(uint64_t time, struct libinput_event *event, void *data)
|
|
tp->palm.trackpoint_active = true;
|
|
}
|
|
|
|
+ tp->palm.trackpoint_last_event_time = time;
|
|
libinput_timer_set(&tp->palm.trackpoint_timer,
|
|
time + DEFAULT_TRACKPOINT_ACTIVITY_TIMEOUT);
|
|
}
|
|
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
|
|
index 3b5cff5..dcf6319 100644
|
|
--- a/src/evdev-mt-touchpad.h
|
|
+++ b/src/evdev-mt-touchpad.h
|
|
@@ -64,6 +64,7 @@ enum touch_palm_state {
|
|
PALM_NONE = 0,
|
|
PALM_EDGE,
|
|
PALM_TYPING,
|
|
+ PALM_TRACKPOINT,
|
|
};
|
|
|
|
enum button_event {
|
|
@@ -279,6 +280,7 @@ struct tp_dispatch {
|
|
bool trackpoint_active;
|
|
struct libinput_event_listener trackpoint_listener;
|
|
struct libinput_timer trackpoint_timer;
|
|
+ uint64_t trackpoint_last_event_time;
|
|
} palm;
|
|
|
|
struct {
|
|
--
|
|
2.4.3
|
|
|