diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/evdev.c | 12 | ||||
-rw-r--r-- | src/evdev.h | 11 | ||||
-rw-r--r-- | src/evdev_axes.c | 81 | ||||
-rw-r--r-- | src/evdev_brain.c | 1 | ||||
-rw-r--r-- | src/evdev_key.c | 3 | ||||
-rw-r--r-- | src/inotify-syscalls.h | 4 |
6 files changed, 86 insertions, 26 deletions
diff --git a/src/evdev.c b/src/evdev.c index ba8f862..f2d61f6 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -117,9 +117,13 @@ EvdevReadInput(InputInfoPtr pInfo) case EV_SYN: if (ev.code == SYN_REPORT) { - EvdevAxesSyn (pInfo); - /* EvdevBtnSyn (pInfo); */ - /* EvdevKeySyn (pInfo); */ + EvdevAxesSynRep (pInfo); + /* EvdevBtnSynRep (pInfo); */ + /* EvdevKeySynRep (pInfo); */ + } else if (ev.code == SYN_CONFIG) { + EvdevAxesSynCfg (pInfo); + /* EvdevBtnSynCfg (pInfo); */ + /* EvdevKeySynCfg (pInfo); */ } break; } @@ -481,7 +485,7 @@ static XF86ModuleVersionInfo EvdevVersionRec = MODULEVENDORSTRING, MODINFOSTRING1, MODINFOSTRING2, - 0, /* Missing from SDK: XORG_VERSION_CURRENT, */ + XORG_VERSION_CURRENT, 1, 1, 0, ABI_CLASS_XINPUT, ABI_XINPUT_VERSION, diff --git a/src/evdev.h b/src/evdev.h index 97f02bf..ac4c364 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -117,6 +117,12 @@ #include <X11/extensions/XKB.h> #include <X11/extensions/XKBstr.h> +/* XInput 1.4+ compatability. */ +#ifndef SendCoreEvents +#define SendCoreEvents 59 +#define DontSendCoreEvents 60 +#endif + /* * Switch events @@ -166,7 +172,7 @@ typedef struct { int screen; /* Screen number for this device. */ Bool use_touch; Bool touch; - Bool reset; + Bool reset_x, reset_y; } evdevAbsRec, *evdevAbsPtr; typedef struct { @@ -265,7 +271,8 @@ int EvdevAxesNew0(InputInfoPtr pInfo); int EvdevAxesNew1(InputInfoPtr pInfo); void EvdevAxesAbsProcess (InputInfoPtr pInfo, struct input_event *ev); void EvdevAxesRelProcess (InputInfoPtr pInfo, struct input_event *ev); -void EvdevAxesSyn (InputInfoPtr pInfo); +void EvdevAxesSynRep (InputInfoPtr pInfo); +void EvdevAxesSynCfg (InputInfoPtr pInfo); int EvdevKeyInit (DeviceIntPtr device); int EvdevKeyNew (InputInfoPtr pInfo); 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; } } diff --git a/src/evdev_brain.c b/src/evdev_brain.c index 246666f..7e65935 100644 --- a/src/evdev_brain.c +++ b/src/evdev_brain.c @@ -472,6 +472,7 @@ evdevRemoveDevice (evdevDevicePtr pEvdev) for (device = &driver->devices; *device; device = &(*device)->next) { if (*device == pEvdev) { *device = pEvdev->next; + xf86DeleteInput(pEvdev->pInfo, 0); pEvdev->next = NULL; return; } diff --git a/src/evdev_key.c b/src/evdev_key.c index 8917c3b..577ae73 100644 --- a/src/evdev_key.c +++ b/src/evdev_key.c @@ -240,8 +240,11 @@ static KeySym map[] = { static void EvdevKbdBell (int percent, DeviceIntPtr device, pointer ctrl, int unused) { +/* OS keyboard layer has been removed. */ +#if 0 xf86SoundKbdBell(percent, ((KeybdCtrl*) ctrl)->bell_pitch, ((KeybdCtrl*) ctrl)->bell_duration); +#endif } static void diff --git a/src/inotify-syscalls.h b/src/inotify-syscalls.h index 7c68bc6..296da90 100644 --- a/src/inotify-syscalls.h +++ b/src/inotify-syscalls.h @@ -57,6 +57,10 @@ # define __NR_inotify_add_watch 5244 # define __NR_inotify_rm_watch 5245 # endif +#elif defined (__mc68000__) +# define __NR_inotify_init 284 +# define __NR_inotify_add_watch 285 +# define __NR_inotify_rm_watch 286 #else # error "Unsupported architecture!" #endif |