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