diff --git a/doc/user/touchpad-jumping-cursors.rst b/doc/user/touchpad-jumping-cursors.rst index d09cd4445a827132f18b9cd1707a56b2aa06a456..50df67150039cae6e91f29b49ee7442d1ae814d3 100644 --- a/doc/user/touchpad-jumping-cursors.rst +++ b/doc/user/touchpad-jumping-cursors.rst @@ -14,6 +14,9 @@ position. 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. +.. 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 that the touch point moves from its previous position. The pointer jump can usually be seen in the :ref:`libinput record ` output for the device: diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index c3da8f9dd5ecac658e89703b96cb5ae4b8c89ea2..38745cdfb6590963c30439d674be5a4b10704b73 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1718,10 +1718,11 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time) if (tp_detect_jumps(tp, t, time)) { if (!tp->semi_mt) - evdev_log_bug_kernel(tp->device, - "Touch jump detected and discarded.\n" - "See %stouchpad-jumping-cursors.html for details\n", - HTTP_DOC_LINK); + evdev_log_bug_kernel_ratelimit(tp->device, + &tp->jump.warning, + "Touch jump detected and discarded.\n" + "See %stouchpad-jumping-cursors.html for details\n", + HTTP_DOC_LINK); tp_motion_history_reset(t); } @@ -3581,6 +3582,9 @@ tp_init(struct tp_dispatch *tp, if (!use_touch_size) 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 to when needed*/ device->dpi = device->abs.absinfo_x->resolution * 25.4; diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 0099c0ae275349ac9732bd24537704ceb18ef818..b981a61092ea03716054dd9880486d746ba792b4 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -279,6 +279,10 @@ struct tp_dispatch { */ unsigned int fake_touches; + struct { + struct ratelimit warning; + } jump; + /* if pressure goes above high -> touch down, if pressure then goes below low -> touch up */ struct {