Ubuntu – Mouse pointer jumps to lower left just before left clicking when using touchpad

16.04asussynapticstouchpadunity

I have an Asus Zenbook UX305 with 16.04 and Unity installed. When using the trackpad ("Elan touchpad" identified by xinput), I use my right hand for maneuvering the mouse pointer, and my left for performing left-clicks in the bottom left of the touchpad. Unfortunately, often the mouse jumps towards the bottom left of the screen just before my click is completed. Initially I thought the jump was entirely to the bottom left, but subsequently I have discovered the jump is only in that direction (by adjusting the speed of the mouse pointer).

I have tried various settings in the Mouse and touchpad settings, and also fiddling with various settings in synclient (e.g. FingerHigh), to no avail.

Generally, I remove my right hand from the touchpad before clicking with the left hand; however, sometimes perhaps the interval between the release and the click is too small, or nonexistent. My feeling is that somehow the initial pressure from my left hand is seen as pressure from a very fast motion to the lower right from the position of my right hand as I am releasing it.

I would really like to resolve this irritating behaviour.

Additional information:

$ xinput --list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Elan Touchpad id=10 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Sleep Button id=8 [slave keyboard (3)]
↳ USB2.0 UVC HD Webcam id=9 [slave keyboard (3)]
↳ Asus WMI hotkeys id=11 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=12 [slave keyboard (3)]

$ xinput --list-props "Elan Touchpad"
Device 'Elan Touchpad':
Device Enabled (137): 1
Coordinate Transformation Matrix (139): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (265): 1
Device Accel Constant Deceleration (266): 2.500000
Device Accel Adaptive Deceleration (267): 1.000000
Device Accel Velocity Scaling (268): 12.500000
Synaptics Edges (269): 123, 2974, 114, 2005
Synaptics Finger (270): 25, 30, 0
Synaptics Tap Time (271): 180
Synaptics Tap Move (272): 165
Synaptics Tap Durations (273): 180, 100, 100
Synaptics ClickPad (274): 1
Synaptics Middle Button Timeout (275): 0
Synaptics Two-Finger Pressure (276): 282
Synaptics Two-Finger Width (277): 7
Synaptics Scrolling Distance (278): 75, 75
Synaptics Edge Scrolling (279): 0, 0, 0
Synaptics Two-Finger Scrolling (280): 1, 1
Synaptics Move Speed (281): 1.000000, 1.750000, 0.053305, 0.000000
Synaptics Off (282): 2
Synaptics Locked Drags (283): 0
Synaptics Locked Drags Timeout (284): 5000
Synaptics Tap Action (285): 2, 3, 0, 0, 1, 3, 0
Synaptics Click Action (286): 1, 3, 0
Synaptics Circular Scrolling (287): 0
Synaptics Circular Scrolling Distance (288): 0.100000
Synaptics Circular Scrolling Trigger (289): 0
Synaptics Circular Pad (290): 0
Synaptics Palm Detection (291): 0
Synaptics Palm Dimensions (292): 10, 200
Synaptics Coasting Speed (293): 20.000000, 50.000000
Synaptics Pressure Motion (294): 30, 160
Synaptics Pressure Motion Factor (295): 1.000000, 1.000000
Synaptics Resolution Detect (296): 1
Synaptics Grab Event Device (297): 0
Synaptics Gestures (298): 1
Synaptics Capabilities (299): 1, 0, 0, 1, 1, 1, 1
Synaptics Pad Resolution (300): 33, 32
Synaptics Area (301): 0, 0, 0, 0
Synaptics Soft Button Areas (302): 1548, 0, 1737, 0, 0, 0, 0, 0
Synaptics Noise Cancellation (303): 18, 18
Device Product ID (257): 1267, 5
Device Node (258): "/dev/input/event7"

[Disclaimer: this is very similar to How do I stop the cursor jumping from desired location to the far left of the screen? , but we could not establish if it was the same or a different issue because the original poster stopped responding on the question.]

Best Answer

The event sequence you described is:

  • right hand finger drag, followed by
  • right hand finger lift, followed by
  • left hand finger touch and release (tap).

When you click using yr particular method (w/ fingers from 2 hands on the pad), make sure to tap with yr left hand finger after releasing the right hand finger contact. That should help the kernel recognize a quick tap as a left click and (I hope) differentiate between that and a trajectory sensed as continuous on the pad, going from right hand to left hand according to the sequence above.

Experiment various avenues at length or possibly change the way you work with yr touch-pad.

1) Coasting: First read the doc and make sure that "conventional coasting" is disabled. If you want coasting, make sure it is enabled as "edge coasting" only. Otherwise the type of sequence described above will lead to what I call "pointer movement leak" ("conventional coasting"), a behavior that consist in the fact that the pointer continues its rectilinear movement even after you have stopped driving it on the pad. Conventional coasting stops with a tap. "Edge-coasting" on the other hand is only activated when you apply finger pressure on a pad-edge. It stops immediately as finger pressure goes below a given value.

2) Second, tweak Synaptics Tap Durations (273): 180, 100, 100:

The 3 values are:

   Option "MaxTapTime" "integer"
          Single touch timeout or maximum time (in milliseconds) for detecting a tap.

   Option "MaxDoubleTapTime" "integer"
          Maximum time (in milliseconds) for detecting a double  tap.

   Option "ClickTime" "integer"
          Duration  of  the  mouse  click  generated  by tapping.

Try lowering the value of MaxTapTime (touch and release time) from 180 to, say, 90. It will make yr pad more sensitive to taps, hopefully helping the kernel discriminate between a quick tap and a change of finger during pointer movement. That will certainly have side effects, which you can gauge by referring to this.

If this does not give you satisfactory results, try to:

3) Turn off Synaptics Pressure Motion (294): 30, 160:

  • Synaptics Pressure Motion: 32 bit, 2 values, min, max.

All the tools and documentation you need are referenced and demonstrated in this answer as well as in a previous one already cited by you.

NOTE: I am not sure anybody can help you anymore than that, as the solution is very much dependent on trial and error and yr personal taste. For that reason this type of question does not elicit that much interest. This is understandably important to you, but I am afraid that getting into such particulars and specifics may fall outside the scope of general interest.