diff options
Diffstat (limited to 'src/evdev_axes.c')
-rw-r--r-- | src/evdev_axes.c | 81 |
1 files changed, 61 insertions, 20 deletions
diff --git a/src/evdev_axes.c b/src/evdev_axes.c index 81dd772..6879ab1 100644 --- a/src/evdev_axes.c +++ b/src/evdev_axes.c @@ -49,6 +49,8 @@ #include <xf86_OSproc.h> +#undef DEBUG + static char *rel_axis_names[] = { "X", "Y", @@ -158,10 +160,10 @@ EvdevAxesRealSyn (InputInfoPtr pInfo, int absolute, int skip_xy) evdevAxesPtr axes = state->axes; int i; - /* - if (skip_xy && (axes->v[0] || axes->v[1])) +#if DEBUG + if (skip_xy == 2 && (axes->v[0] || axes->v[1])) xf86Msg(X_INFO, "%s: skip_xy: %d, x: %d, y: %d.\n", pInfo->name, skip_xy, axes->v[0], axes->v[1]); - */ +#endif /* FIXME: This is a truly evil kluge. */ if (skip_xy == 1 && state->axes->axes >= 2) @@ -215,7 +217,29 @@ EvdevAxesRealSyn (InputInfoPtr pInfo, int absolute, int skip_xy) } static void -EvdevAxesAbsSyn (InputInfoPtr pInfo) +EvdevAxesAbsSynCfg (InputInfoPtr pInfo) +{ + evdevDevicePtr pEvdev = pInfo->private; + evdevStatePtr state = &pEvdev->state; + struct input_absinfo absinfo; + int i; + + for (i = 0; i < ABS_MAX; i++) { + if (!test_bit (i, pEvdev->bits.abs)) + continue; + + if (ioctl (pInfo->fd, EVIOCGABS(i), &absinfo) < 0) { + xf86Msg(X_ERROR, "ioctl EVIOCGABS (%d) failed: %s\n", i, strerror(errno)); + continue; + } + state->abs->min[state->abs->map[i]] = absinfo.minimum; + state->abs->max[state->abs->map[i]] = absinfo.maximum; + } + +} + +static void +EvdevAxesAbsSynRep (InputInfoPtr pInfo) { evdevDevicePtr pEvdev = pInfo->private; evdevStatePtr state = &pEvdev->state; @@ -227,15 +251,24 @@ EvdevAxesAbsSyn (InputInfoPtr pInfo) if (state->mode == Relative && state->abs->axes >= 2) { if (!state->abs->use_touch || state->abs->touch) { - if (state->abs->reset) { - for (i = 0; i < 2; i++) - state->axes->v[i] = 0; - xf86Msg(X_INFO, "%s: Resetting.\n", pInfo->name); - state->abs->reset = 0; - } else { + if (state->abs->reset_x && state->abs->v[0] != state->abs->old_x) { + state->axes->v[0] = 0; + state->abs->reset_x = 0; +#if DEBUG + xf86Msg(X_INFO, "%s: Resetting X.\n", pInfo->name); +#endif + } else state->axes->v[0] = state->abs->v[0] - state->abs->old_x; + + if (state->abs->reset_y && state->abs->v[1] != state->abs->old_y) { + state->axes->v[1] = 0; + state->abs->reset_y = 0; +#if DEBUG + xf86Msg(X_INFO, "%s: Resetting Y.\n", pInfo->name); +#endif + } else 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); @@ -263,7 +296,7 @@ EvdevAxesAbsSyn (InputInfoPtr pInfo) } static void -EvdevAxesRelSyn (InputInfoPtr pInfo) +EvdevAxesRelSynRep (InputInfoPtr pInfo) { evdevDevicePtr pEvdev = pInfo->private; evdevStatePtr state = &pEvdev->state; @@ -290,10 +323,17 @@ EvdevAxesRelSyn (InputInfoPtr pInfo) } void -EvdevAxesSyn (InputInfoPtr pInfo) +EvdevAxesSynRep (InputInfoPtr pInfo) +{ + EvdevAxesAbsSynRep (pInfo); + EvdevAxesRelSynRep (pInfo); +} + +void +EvdevAxesSynCfg (InputInfoPtr pInfo) { - EvdevAxesAbsSyn (pInfo); - EvdevAxesRelSyn (pInfo); + EvdevAxesAbsSynCfg (pInfo); +/* EvdevAxesRelSynCfg (pInfo);*/ } void @@ -316,7 +356,7 @@ EvdevAxesAbsProcess (InputInfoPtr pInfo, struct input_event *ev) state->abs->count++; if (!state->sync) - EvdevAxesAbsSyn (pInfo); + EvdevAxesAbsSynRep (pInfo); } void @@ -338,7 +378,7 @@ EvdevAxesRelProcess (InputInfoPtr pInfo, struct input_event *ev) state->rel->count++; if (!state->sync) - EvdevAxesRelSyn (pInfo); + EvdevAxesRelSynRep (pInfo); } int @@ -633,8 +673,7 @@ EvdevAxesInit (DeviceIntPtr device) if (!InitValuatorClassDeviceStruct(device, axes, miPointerGetMotionEvents, - miPointerGetMotionBufferSize(), 0, - axes)) + miPointerGetMotionBufferSize(), 0)) return !Success; for (i = 0; i < axes; i++) { @@ -656,10 +695,12 @@ EvdevAxesTouchCallback (InputInfoPtr pInfo, int button, int value) evdevDevicePtr pEvdev = pInfo->private; evdevStatePtr state = &pEvdev->state; +#if DEBUG xf86Msg(X_INFO, "%s: Touch callback; %d.\n", pInfo->name, value); +#endif if (state->abs->use_touch) { state->abs->touch = !!value; if (value) - state->abs->reset = 1; + state->abs->reset_x = state->abs->reset_y = 1; } } |