From 771eee968282e308d997adfa78bd39e7429d2c1c Mon Sep 17 00:00:00 2001 From: "Zephaniah E. Hull" Date: Sun, 23 Jul 2006 22:40:51 -0400 Subject: Replace the old two buffer approach to handling rel emulation of abs axes, should help with some of the reported jitter problems. --- src/evdev.h | 4 ++-- src/evdev_axes.c | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/evdev.h b/src/evdev.h index 161978d..db33546 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -156,8 +156,8 @@ typedef struct { typedef struct { int axes; - int n; /* Which abs_v is current, and which is previous. */ - int v[2][ABS_MAX]; + int v[ABS_MAX]; + int old_x, old_y; int count; int min[ABS_MAX]; int max[ABS_MAX]; diff --git a/src/evdev_axes.c b/src/evdev_axes.c index cc1c24d..df6eb4b 100644 --- a/src/evdev_axes.c +++ b/src/evdev_axes.c @@ -219,7 +219,7 @@ EvdevAxesAbsSyn (InputInfoPtr pInfo) { evdevDevicePtr pEvdev = pInfo->private; evdevStatePtr state = &pEvdev->state; - int i = 0, n = state->abs->n++ & 1; + int i = 0; Bool skip_xy = 0; if (!state->axes || !state->abs || !state->abs->count) @@ -232,11 +232,12 @@ EvdevAxesAbsSyn (InputInfoPtr pInfo) state->axes->v[i] = 0; xf86Msg(X_INFO, "%s: Resetting.\n", pInfo->name); state->abs->reset = 0; - } else - for (i = 0; i < 2; i++) { - state->axes->v[i] = state->abs->v[n][i] - state->abs->v[!n][i]; - state->axes->v[i] /= 4; - } + } else { + state->axes->v[0] = state->abs->v[0] - state->abs->old_x; + state->axes->v[1] = state->abs->v[1] - state->abs->old_y; + } + state->abs->old_x = state->abs->v[0]; + state->abs->old_y = state->abs->v[1]; EvdevAxesRealSyn (pInfo, 0, 2); } skip_xy = 1; @@ -244,18 +245,18 @@ EvdevAxesAbsSyn (InputInfoPtr pInfo) int conv_x, conv_y; for (i = 0; i < 2; i++) - state->axes->v[i] = xf86ScaleAxis (state->abs->v[n][i], + state->axes->v[i] = xf86ScaleAxis (state->abs->v[i], 0, state->abs->scale[i], state->abs->min[i], state->abs->max[i]); - EvdevConvert (pInfo, 0, 2, state->abs->v[n][0], state->abs->v[n][1], + EvdevConvert (pInfo, 0, 2, state->abs->v[0], state->abs->v[1], 0, 0, 0, 0, &conv_x, &conv_y); xf86XInputSetScreen (pInfo, state->abs->screen, conv_x, conv_y); } for (; i < ABS_MAX; i++) - state->axes->v[i] = state->abs->v[n][i]; + state->axes->v[i] = state->abs->v[i]; EvdevAxesRealSyn (pInfo, 1, skip_xy); state->abs->count = 0; @@ -300,7 +301,6 @@ EvdevAxesAbsProcess (InputInfoPtr pInfo, struct input_event *ev) { evdevDevicePtr pEvdev = pInfo->private; evdevStatePtr state = &pEvdev->state; - int n = state->abs->n & 1; int map; if (ev->code >= ABS_MAX) @@ -309,9 +309,9 @@ EvdevAxesAbsProcess (InputInfoPtr pInfo, struct input_event *ev) /* FIXME: Handle inverted axes properly. */ map = state->abs->map[ev->code]; if (map >= 0) - state->abs->v[n][map] = ev->value; + state->abs->v[map] = ev->value; else - state->abs->v[n][-map] = ev->value; + state->abs->v[-map] = ev->value; state->abs->count++; -- cgit v1.2.3