Comment 8 for bug 381884

Revision history for this message
Blaine (frikker) wrote :

Hey everyone.
  I have been hacking away at appletouch.c for a little while now and have had minor success on various fronts. The reason I am looking at appletouch, not synaptics, is because ideally we want the driver to not 'average' the mouse position when > 2 fingers are being used. Synaptics only gets the scroll x,y position and finger count. It would be tough to "unaverage" out the x,y params in the higher level driver.

  So far I have had success in disabling scrolling altogether, to allow for a fully stable right click. This means that as soon as I put > 1 finger on the track pad, the cursor will not move, allowing a right click functionality. However, the way I implemented it does not allow for any kind of cursor movement, at all, with more than 1 finger on the pad. The side-scrolling feature still works, and in fact this configuration is pretty nice. However, ideally we want 2-finger scrolling.

  My second pseudo-success has come in that I can get 2-finger scrolling to work without jumpiness, but only if the first finger to touch the pad is on "top" of the bottom finger (closer to the keyboard). If the first finger is furthest from the keyboard, however, jumpy behaviour comes back.

  I have a few ideas I'm going to try out today. I'll post back here with success. I see, at a minimum, a patch for people who do not want 2-finger scrolling but DO want 2-finger right clicking.

Blaine

PATCH for stable right click, disables 2-finger scrolling. Edit /etc/hal/fdi/policy/appletouch.fdi and turn on vertical edge scrolling.
/drivers/input/mouse/appletouch.c

620,623c620,629
< x = (dev->x_old * 3 + x) >> 2;
< y = (dev->y_old * 3 + y) >> 2;
< dev->x_old = x;
< dev->y_old = y;
---
> // *** Fixes the right-click instability problem, but disables 2-finger scrolling ***
> if ((max(x_f, y_f)) == 2) {
> x = dev->x_old;
> y = dev->y_old;
> } else {
> x = (dev->x_old * 3 + x) >> 2;
> y = (dev->y_old * 3 + y) >> 2;
> dev->x_old = x;
> dev->y_old = y;
> }