mousedev: Fix scrollwheel thingy on IBM ScrollPoint mice
PATCH 1/1 mousedev: Fix scrollwheel thingy on IBM ScrollPoint mice
The scrollwheel thingy (stick) on IBM ScrollPoint mice returns extremely aggressive values even when touched lightly. This confuses XFree which assumes the wheel values can only be 1 or -1. Incidently, it also confuses Windows' default mouse driver which proves the problem is in the mouse itself.
This patch limits the scroll wheel movements to be either +1 or -1 on the event -> emulated PS/2 level. I chose to implement it there because mousedev emulates Microsoft mice but the real ones almoust never return a bigger value than 1 (or -1).
Kim
drivers/input/Kconfig +11 -0
@@ -72,6 +72,17 @@ screen resolution you are using to correctly scale the data. If you're not using a digitizer, this value is ignored. +config INPUT_MOUSEDEV_WHEELFIX + bool "Limit too fast wheel movement" + depends on INPUT_MOUSEDEV + default n + help + Say Y here if your mouse wheel only works randomly or if it scrolls + too fast. Some mice, like IBM's scrollpoints, return too big wheel + movement values which confuse programs like XFree. + + If your mouse wheel thingy works as advertised, say N. + config INPUT_JOYDEV tristate "Joystick interface" depends on INPUT
drivers/input/mousedev.c +5 -1
@@ -137,7 +137,11 @@switch (code) {case REL_X : mousedev->packet.dx += value;break ;case REL_Y : mousedev->packet.dy -= value;break ; -case REL_WHEEL : mousedev->packet.dz -= value;break ; +case REL_WHEEL : +#ifdef CONFIG_INPUT_MOUSEDEV_WHEELFIX +if (value) { value = (value <0 ?-1 :1 ); } +#endif /* CONFIG_INPUT_MOUSEDEV_WHEELFIX */ + mousedev->packet.dz -= value;break ; } }
Quoted 12 lines · Kim Holviala
The scrollwheel thingy (stick) on IBM ScrollPoint mice returns extremely aggressive values even when touched lightly. This confuses XFree which assumes the wheel values can only be 1 or -1. Incidently, it also confuses Windows' default mouse driver which proves the problem is in the mouse itself.
This patch limits the scroll wheel movements to be either +1 or -1 on the event -> emulated PS/2 level. I chose to implement it there because mousedev emulates Microsoft mice but the real ones almoust never return a bigger value than 1 (or -1).
...
drivers/input/mousedev.c line 143
Quoted 3 lines
drivers/input/mousedev.c +3
-0+#ifdef CONFIG_INPUT_MOUSEDEV_WHEELFIX +if (value) { value = (value <0 ?-1 :1 ); } +#endif /* CONFIG_INPUT_MOUSEDEV_WHEELFIX */
This is really not a thing which we can put behind compile-time config.
Can we come up with a fix which works correctly on all hardware? If not, this workaround will need to be enabled by some sort of runtime detection.
Quoted 19 lines · Andrew Morton
Quoted 12 lines · Kim Holviala
The scrollwheel thingy (stick) on IBM ScrollPoint mice returns extremely aggressive values even when touched lightly. This confuses XFree which assumes the wheel values can only be 1 or -1. Incidently, it also confuses Windows' default mouse driver which proves the problem is in the mouse itself.
This patch limits the scroll wheel movements to be either +1 or -1 on the event -> emulated PS/2 level. I chose to implement it there because mousedev emulates Microsoft mice but the real ones almoust never return a bigger value than 1 (or -1).
...drivers/input/mousedev.c line 143
Quoted 3 lines
drivers/input/mousedev.c +3
-0+#ifdef CONFIG_INPUT_MOUSEDEV_WHEELFIX +if (value) { value = (value <0 ?-1 :1 ); } +#endif /* CONFIG_INPUT_MOUSEDEV_WHEELFIX */ This is really not a thing which we can put behind compile-time config.
Quoted 3 lines
Can we come up with a fix which works correctly on all hardware? If not, this workaround will need to be enabled by some sort of runtime detection.
Unless someone (Vojtech?) has an objection I think we should always have this workaround activated - after all mousedev provides legacy emulation mostly for XFree/XOrg benefit anyway. Clients accessing data through evdev will see the full picture regardless.
Signature · 1 line
Dmitry
Quoted 11 lines · Dmitry Torokhov
Quoted 11 lines
drivers/input/mousedev.c line 143
Quoted 8 lines
This patch limits the scroll wheel movements to be either +1 or -1 on the event -> emulated PS/2 level. I chose to implement it there because mousedev emulates Microsoft mice but the real ones almoust never return a bigger value than 1 (or -1).
...drivers/input/mousedev.c +3
-0+#ifdef CONFIG_INPUT_MOUSEDEV_WHEELFIX +if (value) { value = (value <0 ?-1 :1 ); } +#endif /* CONFIG_INPUT_MOUSEDEV_WHEELFIX */ This is really not a thing which we can put behind compile-time config.
Quoted 8 lines
Quoted 3 lines
Can we come up with a fix which works correctly on all hardware? If not, this workaround will need to be enabled by some sort of runtime detection.
Unless someone (Vojtech?) has an objection I think we should always have this workaround activated - after all mousedev provides legacy emulation mostly for XFree/XOrg benefit anyway. Clients accessing data through evdev will see the full picture regardless.
We can have a workaround for XOrg, but not one like this. This will make fast scrolling unreliable. I have standard Microsoft-compatible mice which do report more than one scroll tick per report, if you scroll the wheel fast enough, and this throws away the extra ticks.
We would have to split the value into multiple events which would each report a 1 or -1.
Signature · 2 lines
Vojtech Pavlik SuSE Labs, SuSE CR
Quoted 22 lines · Vojtech Pavlik
Quoted 11 lines · Dmitry Torokhov
Quoted 11 lines
drivers/input/mousedev.c line 143
Quoted 8 lines
This patch limits the scroll wheel movements to be either +1 or -1 on the event -> emulated PS/2 level. I chose to implement it there because mousedev emulates Microsoft mice but the real ones almoust never return a bigger value than 1 (or -1).
...drivers/input/mousedev.c +3
-0+#ifdef CONFIG_INPUT_MOUSEDEV_WHEELFIX +if (value) { value = (value <0 ?-1 :1 ); } +#endif /* CONFIG_INPUT_MOUSEDEV_WHEELFIX */ This is really not a thing which we can put behind compile-time config.
Quoted 8 lines
Quoted 3 lines
Can we come up with a fix which works correctly on all hardware? If not, this workaround will need to be enabled by some sort of runtime detection.
Unless someone (Vojtech?) has an objection I think we should always have this workaround activated - after all mousedev provides legacy emulation mostly for XFree/XOrg benefit anyway. Clients accessing data through evdev will see the full picture regardless.
Quoted 8 lines
We can have a workaround for XOrg, but not one like this. This will make fast scrolling unreliable. I have standard Microsoft-compatible mice which do report more than one scroll tick per report, if you scroll the wheel fast enough, and this throws away the extra ticks.
We would have to split the value into multiple events which would each report a 1 or -1.
I have taken a look at XFree/XOrg sources and it seems that they should not have -1/1 problem but values outside of limits allowed for Intellimouse or Explorer protocols will cause re-evaluation of protocol mode. We probably just clamp values to protocol limits (-8/+7 for intellimouse and explorer modes) and be done with it.
Signature · 1 line
Dmitry
Quoted 21 lines · Vojtech Pavlik
Quoted 11 lines
Quoted 11 lines
drivers/input/mousedev.c line 143
Quoted 8 lines
This patch limits the scroll wheel movements to be either +1 or -1 on the event -> emulated PS/2 level. I chose to implement it there because mousedev emulates Microsoft mice but the real ones almoust never return a bigger value than 1 (or -1).
...drivers/input/mousedev.c +3
-0+#ifdef CONFIG_INPUT_MOUSEDEV_WHEELFIX +if (value) { value = (value <0 ?-1 :1 ); } +#endif /* CONFIG_INPUT_MOUSEDEV_WHEELFIX */ This is really not a thing which we can put behind compile-time config.
Quoted 8 lines
Quoted 3 lines
Can we come up with a fix which works correctly on all hardware? If not, this workaround will need to be enabled by some sort of runtime detection.
Unless someone (Vojtech?) has an objection I think we should always have this workaround activated - after all mousedev provides legacy emulation mostly for XFree/XOrg benefit anyway. Clients accessing data through evdev will see the full picture regardless.
Quoted 4 lines
We can have a workaround for XOrg, but not one like this. This will make fast scrolling unreliable. I have standard Microsoft-compatible mice which do report more than one scroll tick per report, if you scroll the wheel fast enough, and this throws away the extra ticks.
It wasn't an optimal solution, but just a quick hack that made the scrollpoint usable. BTW, I've tried with about a dozen wheelmice and all of them needed real misuse to get a packet where the scroll amount was more than 1....
Not that I'm claiming that those kind of mice don't exist. They do, one of them is this ScrollPoint that I'm using now.
Quoted 2 lines
We would have to split the value into multiple events which would each report a 1 or -1.
That would be the right solution - I thought about it but deciced not to steal any more of my employers time.... Besides, I needed to slow the wheel/stick action down anyway since a light touch of the stick generates insane scroll events. In Windows with the default driver the stick operated like Home/End...
Kim
Quoted 10 lines · Kim Holviala
Quoted 10 lines
Quoted 9 lines
Quoted 9 lines
Quoted 8 lines
This patch limits the scroll wheel movements to be either +1 or -1 on the event -> emulated PS/2 level. I chose to implement it there because mousedev emulates Microsoft mice but the real ones almoust never return a bigger value than 1 (or -1).
...drivers/input/mousedev.c +3
-0+#ifdef CONFIG_INPUT_MOUSEDEV_WHEELFIX +if (value) { value = (value <0 ?-1 :1 ); } +#endif /* CONFIG_INPUT_MOUSEDEV_WHEELFIX */
Quoted 4 lines
Quoted 4 lines
We can have a workaround for XOrg, but not one like this. This will make fast scrolling unreliable. I have standard Microsoft-compatible mice which do report more than one scroll tick per report, if you scroll the wheel fast enough, and this throws away the extra ticks.
One more comment to the scrollpoint issue: if they haven't fixed it after 4.3.something XFree throws away all scroll events where the scroll amount is more than 1. So "fast scrolling" is already unreliable, this patch just made it work somehow instead of what it's doing now: not working at all.
Kim