For what it's worth, this fixes the issue on my laptop. I still can't highlight a portion of a line, but at least I can copy / paste a word now \o/
Thanks a *LOT* as it was plenty annoying Gilles On Wed, Jul 11, 2012 at 12:53:00AM +0600, Alexandr Shadchin wrote: > Now in clickpad mode the pointer moves to [1,1] (upper left corner) > even on a single tap. These patches fixes it. > > On issue pointed gilles@ and matthieu@ > > * cd /sys > * patch < 01_kernel.diff > * build and install new kernel > * cd /usr/src > * (if need - make obj) > * make includes > * cd /usr/xenocara/driver/xf86-input-synaptics > * patch < 02_xenocara.diff > * make -f Makefile.bsd-wrapper obj build > * reboot and test > > Also need check on other touchpad. > > Comments ? OK ? > > -- > Alexandr Shadchin > Index: dev/pckbc/pms.c > =================================================================== > RCS file: /cvs/src/sys/dev/pckbc/pms.c,v > retrieving revision 1.30 > diff -u -p -r1.30 pms.c > --- dev/pckbc/pms.c 1 Jul 2012 12:59:34 -0000 1.30 > +++ dev/pckbc/pms.c 10 Jul 2012 18:17:14 -0000 > @@ -782,6 +782,9 @@ int > synaptics_get_hwinfo(struct pms_softc *sc) > { > struct synaptics_softc *syn = sc->synaptics; > +#ifdef DEBUG > + int i, val; > +#endif > > if (synaptics_query(sc, SYNAPTICS_QUE_IDENTIFY, &syn->identify)) > return (-1); > @@ -817,6 +820,15 @@ synaptics_get_hwinfo(struct pms_softc *s > if (SYNAPTICS_EXT_MODEL_BUTTONS(syn->ext_model) > 8) > syn->ext_model &= ~0xf000; > > +#ifdef DEBUG > + for (i = 0; i < 16; i++) { > + if (synaptics_query(sc, i, &val)) > + printf("%s: querie %2d: fail\n", DEVNAME(sc), i); > + else > + printf("%s: querie %2d: 0x%06x\n", DEVNAME(sc), i, val); > + } > +#endif > + > return (0); > } > > @@ -1026,7 +1038,8 @@ pms_proc_synaptics(struct pms_softc *sc) > if (syn->wsmode == WSMOUSE_NATIVE) { > wsmouse_input(sc->sc_wsmousedev, buttons, x, y, z, w, > WSMOUSE_INPUT_ABSOLUTE_X | WSMOUSE_INPUT_ABSOLUTE_Y | > - WSMOUSE_INPUT_ABSOLUTE_Z | WSMOUSE_INPUT_ABSOLUTE_W); > + WSMOUSE_INPUT_ABSOLUTE_Z | WSMOUSE_INPUT_ABSOLUTE_W | > + WSMOUSE_INPUT_SYNC); > } else { > dx = dy = 0; > if (z > SYNAPTICS_PRESSURE) { > @@ -1335,7 +1348,8 @@ pms_proc_alps(struct pms_softc *sc) > > wsmouse_input(sc->sc_wsmousedev, buttons, x, y, z, w, > WSMOUSE_INPUT_ABSOLUTE_X | WSMOUSE_INPUT_ABSOLUTE_Y | > - WSMOUSE_INPUT_ABSOLUTE_Z | WSMOUSE_INPUT_ABSOLUTE_W); > + WSMOUSE_INPUT_ABSOLUTE_Z | WSMOUSE_INPUT_ABSOLUTE_W | > + WSMOUSE_INPUT_SYNC); > > alps->old_fin = fin; > } else { > Index: dev/wscons/wsconsio.h > =================================================================== > RCS file: /cvs/src/sys/dev/wscons/wsconsio.h,v > retrieving revision 1.65 > diff -u -p -r1.65 wsconsio.h > --- dev/wscons/wsconsio.h 17 Apr 2012 08:51:24 -0000 1.65 > +++ dev/wscons/wsconsio.h 10 Jul 2012 18:17:14 -0000 > @@ -80,6 +80,7 @@ struct wscons_event { > /* 12-15, see below */ > #define WSCONS_EVENT_MOUSE_DELTA_W 16 /* W delta amount */ > #define WSCONS_EVENT_MOUSE_ABSOLUTE_W 17 /* W location */ > +#define WSCONS_EVENT_SYNC 18 > /* > * Following events are not real wscons_event but are used as parameters of > the > * WSDISPLAYIO_WSMOUSED ioctl > Index: dev/wscons/wsmouse.c > =================================================================== > RCS file: /cvs/src/sys/dev/wscons/wsmouse.c,v > retrieving revision 1.22 > diff -u -p -r1.22 wsmouse.c > --- dev/wscons/wsmouse.c 17 Aug 2011 16:10:27 -0000 1.22 > +++ dev/wscons/wsmouse.c 10 Jul 2012 18:17:14 -0000 > @@ -455,6 +455,14 @@ wsmouse_input(struct device *wsmousedev, > ub ^= d; > } > > + if (flags & WSMOUSE_INPUT_SYNC) { > + NEXT; > + ev->type = WSCONS_EVENT_SYNC; > + ev->value = 0; > + TIMESTAMP; > + ADVANCE; > + } > + > /* XXX fake wscons_event notifying wsmoused(8) to close mouse device */ > if (flags & WSMOUSE_INPUT_WSMOUSED_CLOSE) { > NEXT; > Index: dev/wscons/wsmousevar.h > =================================================================== > RCS file: /cvs/src/sys/dev/wscons/wsmousevar.h,v > retrieving revision 1.5 > diff -u -p -r1.5 wsmousevar.h > --- dev/wscons/wsmousevar.h 10 Apr 2007 22:37:17 -0000 1.5 > +++ dev/wscons/wsmousevar.h 10 Jul 2012 18:17:14 -0000 > @@ -72,6 +72,7 @@ int wsmousedevprint(void *, const char * > #define WSMOUSE_INPUT_ABSOLUTE_Y (1<<1) > #define WSMOUSE_INPUT_ABSOLUTE_Z (1<<2) > #define WSMOUSE_INPUT_ABSOLUTE_W (1<<4) > +#define WSMOUSE_INPUT_SYNC (1<<5) > #define WSMOUSE_INPUT_WSMOUSED_CLOSE (1<<3) /* notify wsmoused(8) to close > mouse device */ > Index: src/wsconscomm.c > =================================================================== > RCS file: /cvs/xenocara/driver/xf86-input-synaptics/src/wsconscomm.c,v > retrieving revision 1.5 > diff -u -p -r1.5 wsconscomm.c > --- src/wsconscomm.c 12 Jun 2012 18:59:42 -0000 1.5 > +++ src/wsconscomm.c 10 Jul 2012 18:16:24 -0000 > @@ -131,88 +131,94 @@ WSConsReadHwState(InputInfoPtr pInfo, > struct wscons_event event; > Bool v; > > - if (WSConsReadEvent(pInfo, &event) == FALSE) > - return FALSE; > + /* Reset cumulative values if buttons were not previously pressed */ > + if (!hw->left && !hw->right && !hw->middle) { > + hw->cumulative_dx = hw->x; > + hw->cumulative_dy = hw->y; > + } > > - switch (event.type) { > - case WSCONS_EVENT_MOUSE_UP: > - case WSCONS_EVENT_MOUSE_DOWN: > - v = (event.type == WSCONS_EVENT_MOUSE_DOWN) ? TRUE : FALSE; > - switch (event.value) { > - case 0: > - hw->left = v; > - break; > - case 1: > - hw->middle = v; > - break; > - case 2: > - hw->right = v; > - break; > - case 3: > - hw->up = v; > - break; > - case 4: > - hw->down = v; > - break; > - case 5: > - hw->multi[0] = v; > - break; > - case 6: > - hw->multi[1] = v; > - break; > - case 7: > - hw->multi[2] = v; > - break; > - case 8: > - hw->multi[3] = v; > - break; > - case 9: > - hw->multi[4] = v; > - break; > - case 10: > - hw->multi[5] = v; > - break; > - case 11: > - hw->multi[6] = v; > - break; > - case 12: > - hw->multi[7] = v; > - break; > + while (WSConsReadEvent(pInfo, &event)) { > + switch (event.type) { > + case WSCONS_EVENT_MOUSE_UP: > + case WSCONS_EVENT_MOUSE_DOWN: > + v = (event.type == WSCONS_EVENT_MOUSE_DOWN) ? TRUE : FALSE; > + switch (event.value) { > + case 0: > + hw->left = v; > + break; > + case 1: > + hw->middle = v; > + break; > + case 2: > + hw->right = v; > + break; > + case 3: > + hw->up = v; > + break; > + case 4: > + hw->down = v; > + break; > + case 5: > + hw->multi[0] = v; > + break; > + case 6: > + hw->multi[1] = v; > + break; > + case 7: > + hw->multi[2] = v; > + break; > + case 8: > + hw->multi[3] = v; > + break; > + case 9: > + hw->multi[4] = v; > + break; > + case 10: > + hw->multi[5] = v; > + break; > + case 11: > + hw->multi[6] = v; > + break; > + case 12: > + hw->multi[7] = v; > + break; > + } > + break; > + case WSCONS_EVENT_MOUSE_ABSOLUTE_X: > + hw->x = event.value; > + break; > + case WSCONS_EVENT_MOUSE_ABSOLUTE_Y: > + hw->y = priv->maxy - event.value + priv->miny; > + break; > + case WSCONS_EVENT_MOUSE_ABSOLUTE_Z: > + hw->z = event.value; > + break; > + case WSCONS_EVENT_MOUSE_ABSOLUTE_W: > + switch (event.value) { > + case 0: > + hw->fingerWidth = 5; > + hw->numFingers = 2; > + break; > + case 1: > + hw->fingerWidth = 5; > + hw->numFingers = 3; > + break; > + case 4 ... 5: > + hw->fingerWidth = event.value; > + hw->numFingers = 1; > + break; > + } > + break; > + case WSCONS_EVENT_SYNC: > + hw->millis = 1000 * event.time.tv_sec + event.time.tv_nsec / > 1000000; > + SynapticsCopyHwState(hwRet, hw); > + return TRUE; > + default: > + return FALSE; > } > - break; > - case WSCONS_EVENT_MOUSE_ABSOLUTE_X: > - hw->x = event.value; > - break; > - case WSCONS_EVENT_MOUSE_ABSOLUTE_Y: > - hw->y = priv->maxy - event.value + priv->miny; > - break; > - case WSCONS_EVENT_MOUSE_ABSOLUTE_Z: > - hw->z = event.value; > - break; > - case WSCONS_EVENT_MOUSE_ABSOLUTE_W: > - switch (event.value) { > - case 0: > - hw->fingerWidth = 5; > - hw->numFingers = 2; > - break; > - case 1: > - hw->fingerWidth = 5; > - hw->numFingers = 3; > - break; > - case 4 ... 5: > - hw->fingerWidth = event.value; > - hw->numFingers = 1; > - break; > - } > - break; > - default: > - return FALSE; > } > > - hw->millis = GetTimeInMillis(); > - > - SynapticsCopyHwState(hwRet, hw); > - return TRUE; > + return FALSE; > } > > static Bool > -- Gilles Chehade https://www.poolp.org @poolpOrg