aboutsummaryrefslogtreecommitdiff
path: root/src/evdev_axes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evdev_axes.c')
-rw-r--r--src/evdev_axes.c81
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;
}
}