Commit d6eef77d authored by Peter Hutterer's avatar Peter Hutterer

touchpad: ratelimit the touch jump tests

In most cases these days touch jumps aren't actually fixable, they don't have
any good heuristics we can employ to remove them. And, luckily, in most cases
it doesn't matter because the users only notice the issue because of the error
message. To avoid spamming the user's log, let's ratelimit it.
Signed-off-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
parent bf5229a6
...@@ -14,6 +14,9 @@ position. ...@@ -14,6 +14,9 @@ position.
When libinput detects a cursor jump it prints a bug warning to the log with When libinput detects a cursor jump it prints a bug warning to the log with
the text **"Touch jump detected and discarded."** and a link to this page. the text **"Touch jump detected and discarded."** and a link to this page.
.. note:: This warning is ratelimited and will stop appearing after a few
times, even if the touchpad jumps continue.
In most cases, this is a bug in the kernel driver and to libinput it appears In most cases, this is a bug in the kernel driver and to libinput it appears
that the touch point moves from its previous position. The pointer jump can that the touch point moves from its previous position. The pointer jump can
usually be seen in the :ref:`libinput record <libinput-record>` output for the device: usually be seen in the :ref:`libinput record <libinput-record>` output for the device:
......
...@@ -1718,10 +1718,11 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time) ...@@ -1718,10 +1718,11 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
if (tp_detect_jumps(tp, t, time)) { if (tp_detect_jumps(tp, t, time)) {
if (!tp->semi_mt) if (!tp->semi_mt)
evdev_log_bug_kernel(tp->device, evdev_log_bug_kernel_ratelimit(tp->device,
"Touch jump detected and discarded.\n" &tp->jump.warning,
"See %stouchpad-jumping-cursors.html for details\n", "Touch jump detected and discarded.\n"
HTTP_DOC_LINK); "See %stouchpad-jumping-cursors.html for details\n",
HTTP_DOC_LINK);
tp_motion_history_reset(t); tp_motion_history_reset(t);
} }
...@@ -3581,6 +3582,9 @@ tp_init(struct tp_dispatch *tp, ...@@ -3581,6 +3582,9 @@ tp_init(struct tp_dispatch *tp,
if (!use_touch_size) if (!use_touch_size)
tp_init_pressure(tp, device); tp_init_pressure(tp, device);
/* 5 warnings per 2 hours should be enough */
ratelimit_init(&tp->jump.warning, s2us(2 * 60 * 60), 5);
/* Set the dpi to that of the x axis, because that's what we normalize /* Set the dpi to that of the x axis, because that's what we normalize
to when needed*/ to when needed*/
device->dpi = device->abs.absinfo_x->resolution * 25.4; device->dpi = device->abs.absinfo_x->resolution * 25.4;
......
...@@ -279,6 +279,10 @@ struct tp_dispatch { ...@@ -279,6 +279,10 @@ struct tp_dispatch {
*/ */
unsigned int fake_touches; unsigned int fake_touches;
struct {
struct ratelimit warning;
} jump;
/* if pressure goes above high -> touch down, /* if pressure goes above high -> touch down,
if pressure then goes below low -> touch up */ if pressure then goes below low -> touch up */
struct { struct {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment