Package: xserver-xorg-input-tslib Version: 0.0.5-1 Severity: normal Tags: patch
When the variance module is enabled in ts.conf, the tslib input driver will emit a ButtonRelease event only when the pen is pressed the next time. This is because the variance module caches samples and will produce two samples on a release event, but the input driver is only prepared to receive one sample each time there is data available in the fd. A solution is to open the touchscreen in non-blocking mode and read as long as samples are available. -- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (500, 'unstable'), (500, 'testing'), (1, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.6.26.2 (SMP w/2 CPU cores) Locale: LANG=en_US.utf8, LC_CTYPE=fi_FI.utf8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash
--- xf86-input-tslib-0.0.5/src/tslib.c 2008-08-19 09:48:11.000000000 +0300 +++ xf86-input-tslib-0.0.5.mod/src/tslib.c 2008-10-04 00:29:23.000000000 +0300 @@ -123,52 +123,50 @@ int ret; int x,y; - ret = ts_read(priv->ts, &samp, 1); + while((ret = ts_read(priv->ts, &samp, 1)) == 1) { + if(samp.pressure) { + int tmp_x = samp.x; + + switch(priv->rotate) { + case TSLIB_ROTATE_CW: samp.x = samp.y; + samp.y = priv->width - tmp_x; + break; + case TSLIB_ROTATE_UD: samp.x = priv->width - samp.x; + samp.y = priv->height - samp.y; + break; + case TSLIB_ROTATE_CCW: samp.x = priv->height - samp.y; + samp.y = tmp_x; + break; + default: break; + } + + priv->lastx = samp.x; + priv->lasty = samp.y; + x = samp.x; + y = samp.y; + + xf86XInputSetScreen(local, priv->screen_num, + samp.x, + samp.y); - if (ret < 0) { - ErrorF("ts_read failed\n"); - return; - } + xf86PostMotionEvent (local->dev, TRUE, 0, 2, + x, y); -// ErrorF("%ld.%06ld: %6d %6d %6d\n", samp.tv.tv_sec, samp.tv.tv_usec, samp.x, samp.y, samp.pressure); - - if(samp.pressure) { - int tmp_x = samp.x; - - switch(priv->rotate) { - case TSLIB_ROTATE_CW: samp.x = samp.y; - samp.y = priv->width - tmp_x; - break; - case TSLIB_ROTATE_UD: samp.x = priv->width - samp.x; - samp.y = priv->height - samp.y; - break; - case TSLIB_ROTATE_CCW: samp.x = priv->height - samp.y; - samp.y = tmp_x; - break; - default: break; } - priv->lastx = samp.x; - priv->lasty = samp.y; - x = samp.x; - y = samp.y; - - xf86XInputSetScreen(local, priv->screen_num, - samp.x, - samp.y); - - xf86PostMotionEvent (local->dev, TRUE, 0, 2, - x, y); + if(!!priv->lastp != !!samp.pressure) { + priv->lastp = samp.pressure; + xf86PostButtonEvent(local->dev, TRUE, + 1, !!samp.pressure, 0, 2, + priv->lastx, + priv->lasty); + } } - if(priv->lastp != samp.pressure) { - priv->lastp = samp.pressure; - - xf86PostButtonEvent(local->dev, TRUE, - 1, !!samp.pressure, 0, 2, - priv->lastx, - priv->lasty); + if (ret < 0) { + ErrorF("ts_read failed\n"); + return; } } @@ -183,7 +181,7 @@ { InputInfoPtr pInfo; unsigned char map[MAXBUTTONS + 1]; - int i; + int i, axiswidth, axisheight; struct ts_priv *priv; ErrorF("%s\n", __FUNCTION__); @@ -212,17 +210,29 @@ return !Success; } + switch(priv->rotate) { + case TSLIB_ROTATE_CW: + case TSLIB_ROTATE_CCW: + axiswidth = priv->height; + axisheight = priv->width; + break; + default: + axiswidth = priv->width; + axisheight = priv->height; + break; + } + InitValuatorAxisStruct(device, 0, 0, /* min val */ - priv->width - 1, /* max val */ - priv->width, /* resolution */ + axiswidth - 1, /* max val */ + axiswidth, /* resolution */ 0, /* min_res */ - priv->width); /* max_res */ + axiswidth); /* max_res */ InitValuatorAxisStruct(device, 1, 0, /* min val */ - priv->height - 1,/* max val */ - priv->height, /* resolution */ + axisheight - 1, /* max val */ + axisheight, /* resolution */ 0, /* min_res */ - priv->height); /* max_res */ + axisheight); /* max_res */ if (InitProximityClassDeviceStruct (device) == FALSE) { ErrorF ("Unable to allocate EVTouch touchscreen ProximityClassDeviceStruct\n"); @@ -336,7 +346,7 @@ s = xf86SetStrOption(pInfo->options, "TslibDevice", NULL); - priv->ts = ts_open(s, 0); + priv->ts = ts_open(s, 1); if (!priv->ts) { ErrorF("ts_open failed (device=%s)\n",s); return NULL;