Synaptics style multi-touch and cursor jumps
Chris Bagwell
chris at cnpbagwell.com
Wed Aug 18 20:03:46 PDT 2010
Has it been discussed about cursor jumps caused by limitations of
synpatics style multi-touch support?
By synaptics style I mean when you only have 1 set of X/Y to report
regardless of how many fingers are reported touching the pad and the
confusion of what X/Y values should represent.
I've seen a few bugzilla's that I suspect are related to this issue.
Following scenarios may sound strange but are pretty easy to occur
from cramped netbook spaces and one finger mistakenly touching pad in
random orders.
Two scenarios:
1) Real jump occuring from 2nd finger release.
Usecase: 1st finger on touchpad (away from scroll areas), second
finger slightly away (but away from scroll areas). Release 1st finger.
Newer synaptics hw will jump to new X and Y values related to only
remaining finger; causing a cursor jump upon 1st finger release.
At least thats what I'm seeing with my synaptics hardware and seems
most likely hw design. Can others reproduce if they disable scroller
features and palm detection?
Older synaptics hw presumably jumps as well but less in size because
averaging causes it to already be closer to new X and Y.
Most linux-input emulates newer synatpics hw and so should see similar jump.
2) Theoretical jumps from 2nd finger touch.
Usecase: 1st finger on touchpad (away from scroll areas), second
finger farest possible away (away from scroll areas though).
Newer synaptics hw will track close to original X and Y values the
whole time; per their specs. Older synaptics will start tracking in
middle of two points; also per their specs. Presumable this will cause
a cursor jump right at 2nd finger touch time but I have no "older"
hardware to verify and they do not give date ranges.
Some linux-input drivers convert real multi-touch data into syaptics
style to be backwards compatible with xf86-input-synaptics. I've seen
debate on linux-input if its OK to emulate averaging behaviour because
it allows scrolling with moving 2nd finger only and could
theoretically support synaptic's style rotate gesture.
Should this usecase even be considered?
My guess at why jumps not reported as bugs so much:
Modern xf86-input-synaptics is defaulting to 2-finger scrolling when
possible; which hide issue. Also, I'm guessing most mistaken touches
are at edge of pad which can kick in edge scrolling which also masks.
ComputeDelta() seems to be debouncing most jumps I think even though
its not intentionally.
When Palm detection enabled, its logic debounces #1 by clearing out
history that delta is computed against.
Entering any type of supported scroll mode debounces #2 because cursor
doesn't move until exiting scroll mode. Thats side touches or
2-finger scrolling.
Any edge scrolling or 2-finger scrolling debounces #1.
Suggested xf86-input-synaptics behaviour change:
Its not a terrible problem but I think could stand to be improved. I
propose following change to help further get rid of jumps:
Start tracking previous finger count. Modify ComputeDelta() to be
even more aggressive in resetting delta history on finger transitions.
* When previousNumFingers < numFingers then require 4 new samples to
debounce theoretical jumps in #2 on old Synpatics hw and allow
flexibility of newer hardware as we. Low priority and debatable.
* When previousNumFingers > numFingers then require 4 new samples to
debounce real jump in #1 from real synaptics hw and presumably most
other HW. High priority since I can see this easily and why I started
looking into basic issue.
I've tested this change and seens to fix my usecase #1. Some
additional issue still exists that allows jumps when I touch two
extremes of touchpad and lift 1st finger only. Probably unrelated to
above I'm guessing.
Chris
More information about the xorg-devel
mailing list