On Thu, Jul 18, 2013 at 09:23:00PM +0100, Edd Barrett wrote:
> After applying your diff:
> Touchpad: smooth lines.
> Nipple: smooth lines.
> Pen: jagged lines.
>
> I wonder if it is because the pen is an absolute pointing device. You
> probably need extra magic in the WSCONS_EVENT_MOUSE_ABSOLUTE_* cases.
The following diff fixes the jagged diagonal lines for absolute pointing
devices. I think I might be able to simplify some of the relative pointer
code here too, but that should be a separate diff.
Tested on my x230t and will continue to test. No regrssions noticed on
relative pointing devices.
OK?
Index: src/ws.c
===================================================================
RCS file: /home/edd/cvsync/cvs/xenocara/driver/xf86-input-ws/src/ws.c,v
retrieving revision 1.58
diff -u -p -u -r1.58 ws.c
--- src/ws.c 20 Jul 2013 13:24:50 -0000 1.58
+++ src/ws.c 16 Oct 2013 22:36:21 -0000
@@ -474,7 +474,7 @@ wsReadInput(InputInfoPtr pInfo)
{
WSDevicePtr priv = (WSDevicePtr)pInfo->private;
static struct wscons_event eventList[NUMEVENTS];
- int n, c, dx, dy;
+ int n, c, dx, dy, ax, ay;
struct wscons_event *event = eventList;
unsigned char *pBuf;
@@ -488,11 +488,11 @@ wsReadInput(InputInfoPtr pInfo)
if (n == 0)
return;
- dx = dy = 0;
+ dx = dy = ax = ay = 0;
n /= sizeof(struct wscons_event);
while (n--) {
int buttons = priv->lastButtons;
- int newdx = 0, newdy = 0, dz = 0, dw = 0, ax = 0, ay = 0;
+ int newdx = 0, newdy = 0, dz = 0, dw = 0;
int zbutton = 0, wbutton = 0;
switch (event->type) {
@@ -595,25 +595,17 @@ wsReadInput(InputInfoPtr pInfo)
ax = ay;
ay = tmp;
}
- if (ax) {
+ if (ax && ay) {
int xdelta = ax - priv->old_ax;
- priv->old_ax = ax;
- if (wsWheelEmuFilterMotion(pInfo, xdelta, 0))
- continue;
-
- /* absolute position event */
- DBG(3, ErrorF("postMotionEvent X %d\n", ax));
- xf86PostMotionEvent(pInfo->dev, 1, 0, 1, ax);
- }
- if (ay) {
int ydelta = ay - priv->old_ay;
+ priv->old_ax = ax;
priv->old_ay = ay;
- if (wsWheelEmuFilterMotion(pInfo, 0, ydelta))
+ if (wsWheelEmuFilterMotion(pInfo, xdelta, ydelta))
continue;
-
/* absolute position event */
- DBG(3, ErrorF("postMotionEvent y %d\n", ay));
- xf86PostMotionEvent(pInfo->dev, 1, 1, 1, ay);
+ DBG(3, ErrorF("postMotionEvent X %d Y %d\n", ax, ay));
+ xf86PostMotionEvent(pInfo->dev, 1, 0, 2, ax, ay);
+ ax = ay = 0; /* prevent second post below */
}
}
if (dx || dy) {
@@ -624,6 +616,24 @@ wsReadInput(InputInfoPtr pInfo)
DBG(3, ErrorF("postMotionEvent dX %d dY %d\n",
dx, dy));
xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy);
+ }
+ if (ax) {
+ int xdelta = ax - priv->old_ax;
+ priv->old_ax = ax;
+ if (wsWheelEmuFilterMotion(pInfo, xdelta, 0))
+ return;
+ /* absolute position event */
+ DBG(3, ErrorF("postMotionEvent X %d\n", ax));
+ xf86PostMotionEvent(pInfo->dev, 1, 0, 1, ax);
+ }
+ if (ay) {
+ int ydelta = ay - priv->old_ay;
+ priv->old_ay = ay;
+ if (wsWheelEmuFilterMotion(pInfo, 0, ydelta))
+ return;
+ /* absolute position event */
+ DBG(3, ErrorF("postMotionEvent Y %d\n", ay));
+ xf86PostMotionEvent(pInfo->dev, 1, 1, 1, ay);
}
return;
}
--
Best Regards
Edd Barrett
http://www.theunixzoo.co.uk