Input: synaptics - reset the ABS_X/Y fuzz after initializing MT axes
Subsystems (2)
PATCH 1/1 Input: synaptics - reset the ABS_X/Y fuzz after initializing MT axes
input_mt_init_slots() resets the ABS_X/Y fuzz to 0 and expects the driver to call input_mt_report_pointer_emulation(). That is based on the MT position bits which are already defuzzed - hence a fuzz of 0.
In the case of synaptics semi-mt devices, we report the ABS_X/Y axes manually. This results in the MT position being defuzzed but the single-touch emulation missing that defuzzing.
Work around this by re-initializing the ABS_X/Y axes after the MT axis to get the same fuzz value back.
https://bugs.freedesktop.org/show_bug.cgi?id=104533
---
Semi-mt devices are Dodos, so I'd rather go for the easy fix here than a big rewrite of that code.
drivers/input/mouse/synaptics.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/input/mouse/synaptics.c +8 -0
@@ -1280,6 +1280,14 @@ static void set_input_params(struct psmouse *psmouse,INPUT_MT_POINTER | (cr48_profile_sensor ? INPUT_MT_TRACK : INPUT_MT_SEMI_MT)); + +/* For semi-mt devices we send ABS_X/Y ourselves instead of +* input_mt_report_pointer_emulation. But +* input_mt_init_slots() resets the fuzz to 0, leading to a +* filtered ABS_MT_POSITION_X but an unfiltered ABS_X +* position. Let's re-initialize ABS_X/Y here. */ +if (!cr48_profile_sensor) +set_abs_position_params (dev, &priv->info,ABS_X ,ABS_Y ); }if (SYN_CAP_PALMDETECT (info->capabilities))
Signature · 1 line
2.14.3
Quoted 8 lines · Peter Hutterer
input_mt_init_slots()resets the ABS_X/Y fuzz to 0 and expects the driver to callinput_mt_report_pointer_emulation(). That is based on the MT position bits which are already defuzzed - hence a fuzz of 0.In the case of synaptics semi-mt devices, we report the ABS_X/Y axes manually. This results in the MT position being defuzzed but the single-touch emulation missing that defuzzing.
Quoted 6 lines
Work around this by re-initializing the ABS_X/Y axes after the MT axis to get the same fuzz value back.
https://bugs.freedesktop.org/show_bug.cgi?id=104533
Signed-off-by Peter Hutterer <[email protected]>
Applied, thank you.
Quoted 29 lines
---
Semi-mt devices are Dodos, so I'd rather go for the easy fix here than a big rewrite of that code.drivers/input/mouse/synaptics.c | 8 ++++++++ 1 file changed, 8 insertions(+)drivers/input/mouse/synaptics.c +8
-0@@ -1280,6 +1280,14 @@ static void set_input_params(struct psmouse *psmouse,INPUT_MT_POINTER | (cr48_profile_sensor ? INPUT_MT_TRACK : INPUT_MT_SEMI_MT)); + +/* For semi-mt devices we send ABS_X/Y ourselves instead of +* input_mt_report_pointer_emulation. But +* input_mt_init_slots() resets the fuzz to 0, leading to a +* filtered ABS_MT_POSITION_X but an unfiltered ABS_X +* position. Let's re-initialize ABS_X/Y here. */ +if (!cr48_profile_sensor) +set_abs_position_params (dev, &priv->info,ABS_X ,ABS_Y ); }if (SYN_CAP_PALMDETECT (info->capabilities))Signature · 1 line
2.14.3
Signature · 1 line
Dmitry