aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZephaniah E. Hull <warp@agamemnon.b5>2006-07-23 22:40:51 -0400
committerZephaniah E. Hull <warp@agamemnon.b5>2006-07-23 22:40:51 -0400
commit771eee968282e308d997adfa78bd39e7429d2c1c (patch)
tree3317db6078e4272ec69dc072a49df37f28c5fddc
parentMove the axis to button map code back into the rel code. (diff)
downloadxf86-input-evdev-771eee968282e308d997adfa78bd39e7429d2c1c.tar.gz
xf86-input-evdev-771eee968282e308d997adfa78bd39e7429d2c1c.tar.bz2
xf86-input-evdev-771eee968282e308d997adfa78bd39e7429d2c1c.zip
Replace the old two buffer approach to handling rel emulation of abs axes,
should help with some of the reported jitter problems.
-rw-r--r--src/evdev.h4
-rw-r--r--src/evdev_axes.c24
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++;