mirror of
https://github.com/X11Libre/xf86-input-evdev.git
synced 2026-03-28 11:29:16 +00:00
Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/driver/xf86-input-evdev into input-hotplug
This commit is contained in:
5
.cvsignore → .gitignore
vendored
5
.cvsignore → .gitignore
vendored
@@ -1,9 +1,13 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
ChangeLog
|
||||
xf86-input-evdev-*.tar.bz2
|
||||
xf86-input-evdev-*.tar.gz
|
||||
*.la
|
||||
*.lo
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
compile
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
@@ -17,3 +21,4 @@ libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
stamp-h1
|
||||
.*.swp
|
||||
368
ChangeLog
368
ChangeLog
@@ -1,368 +0,0 @@
|
||||
2006-06-22 Adam Jackson <ajax@freedesktop.org>
|
||||
|
||||
* src/inotify-syscalls.h:
|
||||
MIPS support. (Joshua Kinard)
|
||||
|
||||
2006-06-02 Adam Jackson <ajax@freedesktop.org>
|
||||
|
||||
* src/evdev_axes.c:
|
||||
Fix an obvious bogon to avoid crashing on absolute axis setup.
|
||||
|
||||
2006-05-15 Zephaniah E. Hull,,, <warp@aehallh.com>
|
||||
|
||||
* src/evdev.h:
|
||||
Hopefully fix the bitops stuff to actually _work_.
|
||||
|
||||
2006-05-14 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* man/evdev.man:
|
||||
Tweak credits and references.
|
||||
* src/evdev.c: (EvdevParseBits), (EvdevParseBitOption),
|
||||
(EvdevCorePreInit):
|
||||
Change the longs to unsigned longs in the bitfields.
|
||||
|
||||
Cleanup our includes.
|
||||
* src/evdev.h:
|
||||
Stop pulling in asm/types.h and asm/bitops.h.
|
||||
|
||||
Conditionally define the stuff that used to come from
|
||||
the above, including our own test_bit, set_bit and clear_bit.
|
||||
|
||||
Change the longs to unsigned longs in the bitfields.
|
||||
* src/evdev_axes.c: (EvdevAxisAbsNew), (EvdevAxisRelNew):
|
||||
Change the longs to unsigned longs in the bitfields.
|
||||
|
||||
Use the bitop defines in evdev.h properly.
|
||||
* src/evdev_brain.c: (MatchAll), (MatchNot), (MatchAny):
|
||||
Change the longs to unsigned longs in the bitfields.
|
||||
* src/evdev_btn.c: (EvdevBtnNew):
|
||||
Change the longs to unsigned longs in the bitfields.
|
||||
|
||||
Use the bitop defines in evdev.h properly.
|
||||
* src/evdev_key.c: (EvdevKeyNew):
|
||||
Change the longs to unsigned longs in the bitfields.
|
||||
|
||||
Use the bitop defines in evdev.h properly.
|
||||
* src/inotify-syscalls.h:
|
||||
Add HPPA/HPPA64 entries. (Thanks to Fabio M. Di Nitto
|
||||
<fabbione@ubuntu.com>)
|
||||
|
||||
2006-04-30 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* configure.ac:
|
||||
xf86-input-evdev v1.1.2
|
||||
* src/evdev_brain.c: (evdevControl):
|
||||
Bugzilla #6734 <https://bugs.freedesktop.org/show_bug.cgi=6734>
|
||||
Apply patch from Philip Langdale which causes us to make sure that
|
||||
O_NONBLOCK is set on the inotify device.
|
||||
|
||||
2006-04-15 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* configure.ac:
|
||||
* src/Makefile.am:
|
||||
xf86-input-evdev v1.1.1
|
||||
|
||||
2006-04-14 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev.h:
|
||||
evdevAbsRec: Remove the scale bool, rename scale_x and scale_y
|
||||
to scale[2].
|
||||
evdevAxesRec: Make btnMap an int array instead of a Card8 array.
|
||||
* src/evdev_axes.c: (EvdevAxesAbsSyn), (EvdevAxesAbsProcess),
|
||||
(EvdevAxisAbsNew), (EvdevAxesInit):
|
||||
Make abs support and non-core stuff actually work.
|
||||
|
||||
Relative emulation for abs mode is still a bit broken, but that's far
|
||||
less critical.
|
||||
|
||||
* src/evdev_btn.c: (EvdevBtnInit):
|
||||
How many buttons we've registered is configuration information, not an
|
||||
error message.
|
||||
|
||||
2006-04-08 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev.c: (EvdevCorePreInit):
|
||||
Remove a debugging message.
|
||||
* src/evdev_axes.c: (EvdevAxesNew), (EvdevAxesInit):
|
||||
Actually, well, _work_.
|
||||
Note, abs support still segfaults, I'll debug it after I've slept.
|
||||
But I should get it tomorrow.
|
||||
|
||||
2006-04-08 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* configure.ac:
|
||||
Dropped the xorg-xserver 1.0.99.901 requirement.
|
||||
(Things were tweaked to mostly work for older servers again.)
|
||||
* src/evdev.c: (EvdevReadInput):
|
||||
Close the device properly on read errer.
|
||||
* src/evdev_brain.c: (evdevReadInput), (evdevControl):
|
||||
Minimal inotify support, not ideal yet, but...
|
||||
* src/inotify-syscalls.h:
|
||||
Minimal inotify support, not ideal yet, but...
|
||||
* src/inotify.h:
|
||||
Minimal inotify support, not ideal yet, but...
|
||||
|
||||
2006-04-08 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/Makefile.am:
|
||||
Remove evdev_abs.c and evdev_rel.c.
|
||||
Added evdev_axes.c.
|
||||
* src/evdev.c: (EvdevReadInput), (EvdevProc), (EvdevNew),
|
||||
(EvdevPtrCtrlProc):
|
||||
Change the calls to refer to EvdevAxes instead of Abs and Rel.
|
||||
Include mipointer.h. (Fixes a compile error.)
|
||||
Remove an unused variable from EvdevReadInput.
|
||||
* src/evdev.h:
|
||||
Removed evdev_abs.c and evdev_rel.c, added evdev_axes.c.
|
||||
Added count to rel and abs.
|
||||
Moved btnMap from rel to the new axes.
|
||||
Shuffle some includes, and include stdarg.h.
|
||||
* src/evdev_abs.c:
|
||||
Removed.
|
||||
* src/evdev_axes.c: (EvdevConvert), (EvdevAxesRealSyn),
|
||||
(EvdevAxesAbsSyn), (EvdevAxesRelSyn), (EvdevAxesSyn),
|
||||
(EvdevAxesAbsProcess), (EvdevAxesRelProcess), (EvdevAxesOn),
|
||||
(EvdevAxesOff), (EvdevAxisAbsNew), (EvdevAxisRelNew),
|
||||
(EvdevAxesNew), (EvdevPtrCtrlProc), (EvdevAxesInit):
|
||||
New, a mix of rel and abs that should actually work in the
|
||||
rel case.
|
||||
* src/evdev_btn.c: (EvdevBtnCalcRemap):
|
||||
Rearrange include order.
|
||||
btnMap was moved from being part of rel to being part of axes.
|
||||
* src/evdev_rel.c:
|
||||
Removed.
|
||||
* src/evdev_brain.c:
|
||||
Rearrange include order.
|
||||
* src/evdev_key.c:
|
||||
Rearrange include order.
|
||||
|
||||
NOTE: This commit has been compile tested, not run tested.
|
||||
|
||||
I have some other changes to make before I can do more heavy testing.
|
||||
|
||||
2006-04-06 Adam Jackson <ajax@freedesktop.org>
|
||||
|
||||
* configure.ac:
|
||||
* src/evdev.c:
|
||||
* src/evdev.h:
|
||||
* src/evdev_abs.c:
|
||||
* src/evdev_btn.c:
|
||||
* src/evdev_key.c:
|
||||
* src/evdev_rel.c:
|
||||
Unlibcwrap. Bump server version requirement. Bump to 1.1.0.
|
||||
|
||||
2006-03-31 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev_brain.c: (FillDevInfo), (evdevRescanDevices):
|
||||
Fix the fd pointer leak reported by primer. (Not the same patch.)
|
||||
* src/evdev_key.c: (EvdevKeyNew):
|
||||
Disable the undocumented xkb guts options in the key driver.
|
||||
(Requested by Daniel Stone.)
|
||||
|
||||
2006-03-16 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev_brain.c: (MatchDriver):
|
||||
Switch from my own globbing function to fnmatch.
|
||||
|
||||
* src/evdev_key.c: (EvdevKeyNew):
|
||||
Detect keys numbered higher then buttons.
|
||||
Remove the (depreciated since long before xkb support was added to
|
||||
evdev) XkbKeymap option.
|
||||
|
||||
2006-03-16 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* man/evdev.man:
|
||||
Update to include all the new device matching options.
|
||||
|
||||
2006-02-27 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev_key.c: (EvdevKeyOff):
|
||||
Don't leave keys in the down state when we get turned off.
|
||||
(VT switching, getting unplugged, that sort of stuff.)
|
||||
|
||||
2006-02-27 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev.c: (EvdevReadInput):
|
||||
Better error reporting if the read fails.
|
||||
|
||||
* src/evdev_brain.c: (evdevNewDriver):
|
||||
Work properly if we're defining entirely by capability maps.
|
||||
|
||||
2006-02-24 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/Makefile.am:
|
||||
Compile with -Wall now.
|
||||
Add evdev.h to the sources so that make distcheck gets it.
|
||||
|
||||
* src/evdev.h:
|
||||
Bugzilla #5943 <https://bugs.freedesktop.org/show_bug.cgi=5943>
|
||||
Make sure we include errno.h.
|
||||
|
||||
Reduce EVDEV_MAXBUTTONS to 96.
|
||||
|
||||
Split up evdevStateRec into a struct with pointers to new structs
|
||||
for btn, abs, rel, and key.
|
||||
|
||||
New structure type for handling the device capability bitmaps.
|
||||
|
||||
Add device bits and struct input_id to evdevDeviceRec.
|
||||
|
||||
Add matching device bits, struct input_id, and pass number to
|
||||
evdevDriverRec.
|
||||
|
||||
Prototype for evdevGetBits from evdev_brain.c.
|
||||
|
||||
* src/evdev.c: (EvdevProc), (EvdevSwitchMode), (EvdevNew),
|
||||
(EvdevParseBits), (EvdevParseBitOption), (EvdevCorePreInit):
|
||||
Conversion for the evdevStateRec split.
|
||||
|
||||
Remove the errno.h include, it's in evdev.h for now.
|
||||
|
||||
Move the bit getting from the drivers to here, into evdevDeviceRec.
|
||||
|
||||
Fix a rare case of fd leakage.
|
||||
|
||||
Add several new (and somewhat ugly) device matching options:
|
||||
<map>Bits: Where map is one of ev, key, rel, abs, msc, led, snd, or
|
||||
ff.
|
||||
In the format of '+0 +3 -1-2 ~5-10', requires bits 0 and 3 be set,
|
||||
bits 1 and 2 to not be set, and at least one bit in the range of 5 to
|
||||
10 be set.
|
||||
bustype, vendor, product, and version: Simple integer options for
|
||||
matching the struct device_id fields, must be 0 (the default) or the
|
||||
exact value you wish to match against.
|
||||
pass: Bounded to 0-3, devices are matched to the first matching entry
|
||||
found, order for multiple matching entries in the same pass is
|
||||
undefined, but it starts with pass 0 and goes to pass 3.
|
||||
|
||||
* src/evdev_abs.c: (EvdevAbsSyn), (EvdevAbsProcess),
|
||||
(EvdevAbsInit), (EvdevAbsNew):
|
||||
Adaptation for the evdevStateRec split and the change in capability
|
||||
bitmap handling.
|
||||
|
||||
* src/evdev_brain.c: (MatchAll), (MatchNot), (MatchAny),
|
||||
(MatchDriver), (MatchDevice), (evdevScanDevice), (FillDevInfo),
|
||||
(evdevRescanDevices), (evdevGetBits):
|
||||
Add evdevGetBits to fill the new evdevBitsRec struct type.
|
||||
|
||||
Lots of somewhat ugly code for matching by capability bits.
|
||||
|
||||
Split out of evdevRescanDevices to smaller handling functions.
|
||||
The new design should be better if I decide to handle arbitrary Device
|
||||
fields again.
|
||||
|
||||
* src/evdev_btn.c: (EvdevBtnInit), (EvdevBtnOn),
|
||||
(EvdevBtnCalcRemap), (EvdevBtnNew), (EvdevBtnProcess):
|
||||
Adaptation for the evdevStateRec split and the change in capability
|
||||
bitmap handling.
|
||||
|
||||
Handle all buttons, no button compression at this time, however we
|
||||
reorder things so that BTN_MOUSE comes before BTN_MISC, somewhat
|
||||
evily.
|
||||
|
||||
Support for the new btn->state[] array of int pointers.
|
||||
|
||||
* src/evdev_key.c: (EvdevKeyInit), (SetXkbOption), (EvdevKeyNew):
|
||||
Adaptation for the evdevStateRec split and the change in capability
|
||||
bitmap handling.
|
||||
|
||||
* src/evdev_rel.c: (EvdevRelSyn), (EvdevRelProcess),
|
||||
(EvdevRelInit), (EvdevRelNew):
|
||||
Adaptation for the evdevStateRec split and the change in capability
|
||||
bitmap handling.
|
||||
|
||||
2006-02-20 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev_btn.c: (EvdevBtnInit):
|
||||
Bugzilla #5950 <https://bugs.freedesktop.org/show_bug.cgi=5950>
|
||||
Possible (maybe) fix for bug #5950.
|
||||
Though, I'm not convinced and still don't see how this bug could
|
||||
be happening, especially if this doesn't do it.
|
||||
|
||||
2006-02-19 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev_key.c: (EvdevKbdBell):
|
||||
Add bell support.
|
||||
|
||||
2006-02-16 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* src/evdev_btn.c: (EvdevBtnCalcRemap):
|
||||
Bugzilla #5914 <https://bugs.freedesktop.org/show_bug.cgi?id=5914>
|
||||
Stupid little bug, properly handle wheels on 3 button mice.
|
||||
|
||||
2006-02-14 Zephaniah E. Hull <warp@aehallh.com>
|
||||
|
||||
* configure.ac:
|
||||
* man/evdev.man:
|
||||
* src/Makefile.am:
|
||||
* src/evdev.c: (EvdevReadInput), (EvdevSigioReadInput),
|
||||
(EvdevProc), (EvdevSwitchMode), (EvdevNew), (EvdevCorePreInit):
|
||||
* src/evdev.h:
|
||||
* src/evdev_abs.c: (EvdevPtrCtrlProc), (EvdevConvert),
|
||||
(EvdevAbsSyn), (EvdevAbsProcess), (EvdevAbsInit), (EvdevAbsOn),
|
||||
(EvdevAbsOff), (EvdevAbsNew):
|
||||
* src/evdev_brain.c: (glob_match), (evdevGetFDForDevice),
|
||||
(evdevRescanDevices), (evdevReadInput), (evdevControl),
|
||||
(evdevStart), (evdevNewDriver):
|
||||
* src/evdev_btn.c: (EvdevBtnPostFakeClicks), (EvdevBtnInit),
|
||||
(EvdevBtnOn), (EvdevBtnOff), (EvdevBtnCalcRemap), (EvdevBtnNew),
|
||||
(EvdevBtnProcess):
|
||||
* src/evdev_key.c: (EvdevKbdBell), (EvdevKbdCtrl), (EvdevKeyInit),
|
||||
(SetXkbOption), (EvdevKeyNew), (EvdevKeyOn), (EvdevKeyOff),
|
||||
(EvdevKeyProcess):
|
||||
* src/evdev_rel.c: (EvdevPtrCtrlProc), (EvdevConvert),
|
||||
(EvdevRelSyn), (EvdevRelProcess), (EvdevRelInit), (EvdevRelOn),
|
||||
(EvdevRelOff), (EvdevRelNew):
|
||||
Bugzilla #5696 <https://bugs.freedesktop.org/show_bug.cgi?id=5696>
|
||||
Slightly updated version of the patch listed.
|
||||
Basicly a rewrite of the driver, with a few pieces of the old.
|
||||
XKB support, proper device matching, basic absolute pointer support.
|
||||
Lots more, will require some user config changes.
|
||||
|
||||
2006-01-09 David Nusinow,,, <set EMAIL_ADDRESS environment variable>
|
||||
|
||||
* man/Makefile.am:
|
||||
* man/evdev.man:
|
||||
Bugzilla #968 <https://bugs.freedesktop.org/show_bug.cgi?id=968>
|
||||
Patch #4301 <https://bugs.freedesktop.org/attachment.cgi?id=4301>
|
||||
Add evdev manpage
|
||||
|
||||
2005-12-20 Kevin E. Martin <kem-at-freedesktop-dot-org>
|
||||
|
||||
* configure.ac:
|
||||
Update package version for X11R7 release.
|
||||
|
||||
2005-12-14 Kevin E. Martin <kem-at-freedesktop-dot-org>
|
||||
|
||||
* configure.ac:
|
||||
Update package version number for final X11R7 release candidate.
|
||||
|
||||
2005-12-06 Kevin E. Martin <kem-at-freedesktop-dot-org>
|
||||
|
||||
* man/Makefile.am:
|
||||
Change *man_SOURCES ==> *man_PRE to fix autotools warnings.
|
||||
|
||||
2005-12-03 Kevin E. Martin <kem-at-freedesktop-dot-org>
|
||||
|
||||
* configure.ac:
|
||||
Update package version number for X11R7 RC3 release.
|
||||
|
||||
2005-12-01 Kevin E. Martin <kem-at-freedesktop-dot-org>
|
||||
|
||||
* configure.ac:
|
||||
Remove extraneous AC_MSG_RESULT.
|
||||
|
||||
2005-11-29 Adam Jackson <ajax@freedesktop.org>
|
||||
|
||||
* configure.ac:
|
||||
Only build dlloader modules by default.
|
||||
|
||||
2005-11-09 Kevin E. Martin <kem-at-freedesktop-dot-org>
|
||||
|
||||
* configure.ac:
|
||||
Update package version number for X11R7 RC2 release.
|
||||
|
||||
2005-11-01 Kevin E. Martin <kem-at-freedesktop-dot-org>
|
||||
|
||||
* configure.ac:
|
||||
Update pkgcheck dependencies to work with separate build roots.
|
||||
11
Makefile.am
11
Makefile.am
@@ -20,3 +20,14 @@
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
SUBDIRS = src man
|
||||
|
||||
EXTRA_DIST=ChangeLog
|
||||
|
||||
CLEANFILES=ChangeLog
|
||||
|
||||
.PHONY: ChangeLog
|
||||
|
||||
ChangeLog:
|
||||
git-log > ChangeLog
|
||||
|
||||
dist-hook: ChangeLog
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT([xf86-input-evdev],
|
||||
1.1.2,
|
||||
1.1.3,
|
||||
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
|
||||
xf86-input-evdev)
|
||||
|
||||
|
||||
1
man/.cvsignore → man/.gitignore
vendored
1
man/.cvsignore → man/.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
evdev.4
|
||||
0
src/.cvsignore → src/.gitignore
vendored
0
src/.cvsignore → src/.gitignore
vendored
24
src/evdev.c
24
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;
|
||||
}
|
||||
@@ -200,6 +204,7 @@ EvdevProc(DeviceIntPtr device, int what)
|
||||
RemoveEnabledDevice (pInfo->fd);
|
||||
xf86RemoveSIGIOHandler (pInfo->fd);
|
||||
close (pInfo->fd);
|
||||
pInfo->fd = -1;
|
||||
|
||||
if (pEvdev->state.axes)
|
||||
EvdevAxesOff (device);
|
||||
@@ -230,6 +235,7 @@ EvdevSwitchMode (ClientPtr client, DeviceIntPtr device, int mode)
|
||||
{
|
||||
case Absolute:
|
||||
case Relative:
|
||||
xf86Msg(X_INFO, "%s: Switching mode to %d.\n", pInfo->name, mode);
|
||||
if (state->abs)
|
||||
state->mode = mode;
|
||||
else
|
||||
@@ -302,9 +308,13 @@ EvdevNew(evdevDriverPtr driver, evdevDevicePtr device)
|
||||
}
|
||||
|
||||
|
||||
/* XXX: Note, the order of these is important. */
|
||||
EvdevAxesNew (pInfo);
|
||||
EvdevBtnNew (pInfo);
|
||||
/* XXX: Note, the order of these is (maybe) still important. */
|
||||
EvdevAxesNew0 (pInfo);
|
||||
EvdevBtnNew0 (pInfo);
|
||||
|
||||
EvdevAxesNew1 (pInfo);
|
||||
EvdevBtnNew1 (pInfo);
|
||||
|
||||
if (device->state.can_grab)
|
||||
EvdevKeyNew (pInfo);
|
||||
|
||||
@@ -475,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,
|
||||
|
||||
28
src/evdev.h
28
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
|
||||
@@ -151,19 +157,22 @@ typedef struct {
|
||||
int real_buttons;
|
||||
int buttons;
|
||||
CARD8 map[EVDEV_MAXBUTTONS];
|
||||
int *state[EVDEV_MAXBUTTONS];
|
||||
void (*callback[EVDEV_MAXBUTTONS])(InputInfoPtr pInfo, int button, int value);
|
||||
} evdevBtnRec, *evdevBtnPtr;
|
||||
|
||||
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];
|
||||
int map[ABS_MAX];
|
||||
int scale[2];
|
||||
int screen; /* Screen number for this device. */
|
||||
Bool use_touch;
|
||||
Bool touch;
|
||||
Bool reset_x, reset_y;
|
||||
} evdevAbsRec, *evdevAbsPtr;
|
||||
|
||||
typedef struct {
|
||||
@@ -171,12 +180,12 @@ typedef struct {
|
||||
int v[REL_MAX];
|
||||
int count;
|
||||
int map[REL_MAX];
|
||||
int btnMap[REL_MAX][2];
|
||||
} evdevRelRec, *evdevRelPtr;
|
||||
|
||||
typedef struct {
|
||||
int axes;
|
||||
int v[ABS_MAX];
|
||||
int btnMap[ABS_MAX][2];
|
||||
} evdevAxesRec, *evdevAxesPtr;
|
||||
|
||||
typedef struct {
|
||||
@@ -248,17 +257,22 @@ void evdevRemoveDevice (evdevDevicePtr device);
|
||||
int EvdevBtnInit (DeviceIntPtr device);
|
||||
int EvdevBtnOn (DeviceIntPtr device);
|
||||
int EvdevBtnOff (DeviceIntPtr device);
|
||||
int EvdevBtnNew(InputInfoPtr pInfo);
|
||||
int EvdevBtnNew0(InputInfoPtr pInfo);
|
||||
int EvdevBtnNew1(InputInfoPtr pInfo);
|
||||
void EvdevBtnProcess (InputInfoPtr pInfo, struct input_event *ev);
|
||||
void EvdevBtnPostFakeClicks(InputInfoPtr pInfo, int button, int count);
|
||||
int EvdevBtnFind (InputInfoPtr pInfo, const char *button);
|
||||
int EvdevBtnExists (InputInfoPtr pInfo, int button);
|
||||
|
||||
int EvdevAxesInit (DeviceIntPtr device);
|
||||
int EvdevAxesOn (DeviceIntPtr device);
|
||||
int EvdevAxesOff (DeviceIntPtr device);
|
||||
int EvdevAxesNew(InputInfoPtr pInfo);
|
||||
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);
|
||||
|
||||
323
src/evdev_axes.c
323
src/evdev_axes.c
@@ -49,6 +49,8 @@
|
||||
|
||||
#include <xf86_OSproc.h>
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
static char *rel_axis_names[] = {
|
||||
"X",
|
||||
"Y",
|
||||
@@ -136,6 +138,8 @@ static char *abs_axis_names[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static void EvdevAxesTouchCallback (InputInfoPtr pInfo, int button, int value);
|
||||
|
||||
static Bool
|
||||
EvdevConvert(InputInfoPtr pInfo, int first, int num, int v0, int v1, int v2,
|
||||
int v3, int v4, int v5, int *x, int *y)
|
||||
@@ -149,106 +153,187 @@ EvdevConvert(InputInfoPtr pInfo, int first, int num, int v0, int v1, int v2,
|
||||
}
|
||||
|
||||
static void
|
||||
EvdevAxesRealSyn (InputInfoPtr pInfo, int absolute)
|
||||
EvdevAxesRealSyn (InputInfoPtr pInfo, int absolute, int skip_xy)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
evdevAxesPtr axes = state->axes;
|
||||
int i, btn;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < state->axes->axes; i++) {
|
||||
if ((state->axes->v[i] > 0) && (btn = state->axes->btnMap[i][0]))
|
||||
EvdevBtnPostFakeClicks (pInfo, btn, state->axes->v[i]);
|
||||
else if ((state->axes->v[i] < 0) && (btn = state->axes->btnMap[i][1]))
|
||||
EvdevBtnPostFakeClicks (pInfo, btn, -state->axes->v[i]);
|
||||
}
|
||||
#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
|
||||
|
||||
xf86PostMotionEvent(pInfo->dev, absolute, 0,
|
||||
state->axes->axes,
|
||||
axes->v[0x00], axes->v[0x01], axes->v[0x02], axes->v[0x03],
|
||||
axes->v[0x04], axes->v[0x05], axes->v[0x06], axes->v[0x07],
|
||||
axes->v[0x08], axes->v[0x09], axes->v[0x0a], axes->v[0x0b],
|
||||
axes->v[0x0c], axes->v[0x0d], axes->v[0x0e], axes->v[0x0f],
|
||||
axes->v[0x10], axes->v[0x11], axes->v[0x12], axes->v[0x13],
|
||||
axes->v[0x14], axes->v[0x15], axes->v[0x16], axes->v[0x17],
|
||||
axes->v[0x18], axes->v[0x19], axes->v[0x1a], axes->v[0x1b],
|
||||
axes->v[0x1c], axes->v[0x1d], axes->v[0x1e], axes->v[0x1f],
|
||||
axes->v[0x20], axes->v[0x21], axes->v[0x22], axes->v[0x23],
|
||||
axes->v[0x24], axes->v[0x25], axes->v[0x26], axes->v[0x27],
|
||||
axes->v[0x28], axes->v[0x29], axes->v[0x2a], axes->v[0x2b],
|
||||
axes->v[0x2c], axes->v[0x2d], axes->v[0x2e], axes->v[0x2f],
|
||||
axes->v[0x30], axes->v[0x31], axes->v[0x32], axes->v[0x33],
|
||||
axes->v[0x34], axes->v[0x35], axes->v[0x36], axes->v[0x37],
|
||||
axes->v[0x38], axes->v[0x39], axes->v[0x3a], axes->v[0x3b],
|
||||
axes->v[0x3c], axes->v[0x3d], axes->v[0x3e], axes->v[0x3f]);
|
||||
/* FIXME: This is a truly evil kluge. */
|
||||
if (skip_xy == 1 && state->axes->axes >= 2)
|
||||
xf86PostMotionEvent(pInfo->dev, absolute, 2,
|
||||
state->axes->axes - 2,
|
||||
axes->v[0x02], axes->v[0x03],
|
||||
axes->v[0x04], axes->v[0x05], axes->v[0x06], axes->v[0x07],
|
||||
axes->v[0x08], axes->v[0x09], axes->v[0x0a], axes->v[0x0b],
|
||||
axes->v[0x0c], axes->v[0x0d], axes->v[0x0e], axes->v[0x0f],
|
||||
axes->v[0x10], axes->v[0x11], axes->v[0x12], axes->v[0x13],
|
||||
axes->v[0x14], axes->v[0x15], axes->v[0x16], axes->v[0x17],
|
||||
axes->v[0x18], axes->v[0x19], axes->v[0x1a], axes->v[0x1b],
|
||||
axes->v[0x1c], axes->v[0x1d], axes->v[0x1e], axes->v[0x1f],
|
||||
axes->v[0x20], axes->v[0x21], axes->v[0x22], axes->v[0x23],
|
||||
axes->v[0x24], axes->v[0x25], axes->v[0x26], axes->v[0x27],
|
||||
axes->v[0x28], axes->v[0x29], axes->v[0x2a], axes->v[0x2b],
|
||||
axes->v[0x2c], axes->v[0x2d], axes->v[0x2e], axes->v[0x2f],
|
||||
axes->v[0x30], axes->v[0x31], axes->v[0x32], axes->v[0x33],
|
||||
axes->v[0x34], axes->v[0x35], axes->v[0x36], axes->v[0x37],
|
||||
axes->v[0x38], axes->v[0x39], axes->v[0x3a], axes->v[0x3b],
|
||||
axes->v[0x3c], axes->v[0x3d], axes->v[0x3e], axes->v[0x3f]);
|
||||
else
|
||||
xf86PostMotionEvent(pInfo->dev, absolute, 0,
|
||||
state->axes->axes,
|
||||
axes->v[0x00], axes->v[0x01], axes->v[0x02], axes->v[0x03],
|
||||
axes->v[0x04], axes->v[0x05], axes->v[0x06], axes->v[0x07],
|
||||
axes->v[0x08], axes->v[0x09], axes->v[0x0a], axes->v[0x0b],
|
||||
axes->v[0x0c], axes->v[0x0d], axes->v[0x0e], axes->v[0x0f],
|
||||
axes->v[0x10], axes->v[0x11], axes->v[0x12], axes->v[0x13],
|
||||
axes->v[0x14], axes->v[0x15], axes->v[0x16], axes->v[0x17],
|
||||
axes->v[0x18], axes->v[0x19], axes->v[0x1a], axes->v[0x1b],
|
||||
axes->v[0x1c], axes->v[0x1d], axes->v[0x1e], axes->v[0x1f],
|
||||
axes->v[0x20], axes->v[0x21], axes->v[0x22], axes->v[0x23],
|
||||
axes->v[0x24], axes->v[0x25], axes->v[0x26], axes->v[0x27],
|
||||
axes->v[0x28], axes->v[0x29], axes->v[0x2a], axes->v[0x2b],
|
||||
axes->v[0x2c], axes->v[0x2d], axes->v[0x2e], axes->v[0x2f],
|
||||
axes->v[0x30], axes->v[0x31], axes->v[0x32], axes->v[0x33],
|
||||
axes->v[0x34], axes->v[0x35], axes->v[0x36], axes->v[0x37],
|
||||
axes->v[0x38], axes->v[0x39], axes->v[0x3a], axes->v[0x3b],
|
||||
axes->v[0x3c], axes->v[0x3d], axes->v[0x3e], axes->v[0x3f]);
|
||||
|
||||
for (i = 0; i < ABS_MAX; i++)
|
||||
state->axes->v[i] = 0;
|
||||
if (!skip_xy)
|
||||
for (i = 0; i < ABS_MAX; i++)
|
||||
state->axes->v[i] = 0;
|
||||
else if (skip_xy == 1)
|
||||
for (i = 2; i < ABS_MAX; i++)
|
||||
state->axes->v[i] = 0;
|
||||
else if (skip_xy == 2)
|
||||
for (i = 0; i < 2; i++)
|
||||
state->axes->v[i] = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
EvdevAxesAbsSyn (InputInfoPtr pInfo)
|
||||
EvdevAxesAbsSynCfg (InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
int i, n;
|
||||
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;
|
||||
int i = 0;
|
||||
Bool skip_xy = 0;
|
||||
|
||||
if (!state->axes || !state->abs || !state->abs->count)
|
||||
return;
|
||||
|
||||
n = state->abs->n & 1;
|
||||
state->abs->n++;
|
||||
i = 0;
|
||||
|
||||
if (state->mode == Relative && state->abs->axes >= 2) {
|
||||
for (i = 0; i < 2; i++)
|
||||
state->axes->v[i] = state->abs->v[n][i] - state->abs->v[!n][i];
|
||||
EvdevAxesRealSyn (pInfo, 0);
|
||||
} else if (state->mode == Absolute && state->abs->screen >= 0 && state->abs->axes >= 2) {
|
||||
if (!state->abs->use_touch || state->abs->touch) {
|
||||
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);
|
||||
}
|
||||
skip_xy = 1;
|
||||
} else if (state->mode == Absolute && state->abs->screen != -1 && state->abs->axes >= 2) {
|
||||
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);
|
||||
EvdevAxesRealSyn (pInfo, 1, skip_xy);
|
||||
state->abs->count = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
EvdevAxesRelSyn (InputInfoPtr pInfo)
|
||||
EvdevAxesRelSynRep (InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
int i;
|
||||
evdevRelPtr rel = state->rel;
|
||||
int i, btn;
|
||||
|
||||
if (!state->axes || !state->rel || !state->rel->count)
|
||||
return;
|
||||
|
||||
for (i = 0; i < REL_MAX; i++) {
|
||||
state->axes->v[i] = state->rel->v[i];
|
||||
state->rel->v[i] = 0;
|
||||
if (rel->btnMap[i][0] || rel->btnMap[i][1]) {
|
||||
if ((rel->v[i] > 0) && (btn = rel->btnMap[i][0]))
|
||||
EvdevBtnPostFakeClicks (pInfo, btn, rel->v[i]);
|
||||
else if ((rel->v[i] < 0) && (btn = rel->btnMap[i][1]))
|
||||
EvdevBtnPostFakeClicks (pInfo, btn, -rel->v[i]);
|
||||
}
|
||||
|
||||
state->axes->v[i] = rel->v[i];
|
||||
rel->v[i] = 0;
|
||||
}
|
||||
|
||||
EvdevAxesRealSyn (pInfo, 0);
|
||||
state->rel->count = 0;
|
||||
EvdevAxesRealSyn (pInfo, 0, 0);
|
||||
rel->count = 0;
|
||||
}
|
||||
|
||||
void
|
||||
EvdevAxesSyn (InputInfoPtr pInfo)
|
||||
EvdevAxesSynRep (InputInfoPtr pInfo)
|
||||
{
|
||||
EvdevAxesAbsSyn (pInfo);
|
||||
EvdevAxesRelSyn (pInfo);
|
||||
EvdevAxesAbsSynRep (pInfo);
|
||||
EvdevAxesRelSynRep (pInfo);
|
||||
}
|
||||
|
||||
void
|
||||
EvdevAxesSynCfg (InputInfoPtr pInfo)
|
||||
{
|
||||
EvdevAxesAbsSynCfg (pInfo);
|
||||
/* EvdevAxesRelSynCfg (pInfo);*/
|
||||
}
|
||||
|
||||
void
|
||||
@@ -256,7 +341,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)
|
||||
@@ -265,14 +349,14 @@ 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++;
|
||||
|
||||
if (!state->sync)
|
||||
EvdevAxesAbsSyn (pInfo);
|
||||
EvdevAxesAbsSynRep (pInfo);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -294,7 +378,7 @@ EvdevAxesRelProcess (InputInfoPtr pInfo, struct input_event *ev)
|
||||
state->rel->count++;
|
||||
|
||||
if (!state->sync)
|
||||
EvdevAxesRelSyn (pInfo);
|
||||
EvdevAxesRelSynRep (pInfo);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -310,12 +394,12 @@ EvdevAxesOff (DeviceIntPtr device)
|
||||
}
|
||||
|
||||
static int
|
||||
EvdevAxisAbsNew(InputInfoPtr pInfo)
|
||||
EvdevAxisAbsNew0(InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
struct input_absinfo absinfo;
|
||||
char *s, option[64];
|
||||
char option[64];
|
||||
int i, j, k = 0, real_axes;
|
||||
|
||||
real_axes = 0;
|
||||
@@ -365,9 +449,41 @@ EvdevAxisAbsNew(InputInfoPtr pInfo)
|
||||
state->abs->axes = state->abs->map[i];
|
||||
}
|
||||
|
||||
if (state->abs->axes != real_axes)
|
||||
xf86Msg(X_CONFIG, "%s: Configuring %d absolute axes.\n", pInfo->name,
|
||||
state->abs->axes);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
EvdevAxisAbsNew1(InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
char *s;
|
||||
int k = 0;
|
||||
|
||||
if (!state->abs)
|
||||
return !Success;
|
||||
|
||||
xf86Msg(X_CONFIG, "%s: Configuring %d absolute axes.\n", pInfo->name,
|
||||
state->abs->axes);
|
||||
|
||||
{
|
||||
int btn;
|
||||
|
||||
s = xf86SetStrOption(pInfo->options, "AbsoluteTouch", "DIGI_Touch");
|
||||
btn = EvdevBtnFind (pInfo, s);
|
||||
if (btn != -1) {
|
||||
if (EvdevBtnExists (pInfo, btn)) {
|
||||
state->abs->use_touch = 1;
|
||||
xf86Msg(X_ERROR, "%s: Button: %d.\n", pInfo->name, btn);
|
||||
xf86Msg(X_ERROR, "%s: state->btn: %p.\n", pInfo->name, state->btn);
|
||||
state->btn->callback[btn] = &EvdevAxesTouchCallback;
|
||||
} else {
|
||||
xf86Msg(X_ERROR, "%s: AbsoluteTouch: '%s' does not exist.\n", pInfo->name, s);
|
||||
}
|
||||
} else {
|
||||
xf86Msg(X_ERROR, "%s: AbsoluteTouch: '%s' is not a valid button name.\n", pInfo->name, s);
|
||||
}
|
||||
}
|
||||
|
||||
s = xf86SetStrOption(pInfo->options, "Mode", "Absolute");
|
||||
if (!strcasecmp(s, "Absolute")) {
|
||||
@@ -388,19 +504,20 @@ EvdevAxisAbsNew(InputInfoPtr pInfo)
|
||||
if (k < screenInfo.numScreens && k >= 0) {
|
||||
state->abs->screen = k;
|
||||
xf86Msg(X_CONFIG, "%s: AbsoluteScreen: %d.\n", pInfo->name, k);
|
||||
} else {
|
||||
state->abs->screen = 0;
|
||||
xf86Msg(X_CONFIG, "%s: AbsoluteScreen: %d is not a valid screen.\n", pInfo->name, k);
|
||||
}
|
||||
|
||||
state->abs->scale[0] = screenInfo.screens[state->abs->screen]->width;
|
||||
state->abs->scale[1] = screenInfo.screens[state->abs->screen]->height;
|
||||
state->abs->scale[0] = screenInfo.screens[state->abs->screen]->width;
|
||||
state->abs->scale[1] = screenInfo.screens[state->abs->screen]->height;
|
||||
} else {
|
||||
if (k != -1)
|
||||
xf86Msg(X_CONFIG, "%s: AbsoluteScreen: %d is not a valid screen.\n", pInfo->name, k);
|
||||
state->abs->screen = -1;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
EvdevAxisRelNew(InputInfoPtr pInfo)
|
||||
EvdevAxisRelNew0(InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
@@ -450,13 +567,13 @@ EvdevAxisRelNew(InputInfoPtr pInfo)
|
||||
|
||||
k = state->rel->map[i];
|
||||
|
||||
if (!s || (sscanf(s, "%d %d", &state->axes->btnMap[k][0],
|
||||
&state->axes->btnMap[k][1]) != 2))
|
||||
state->axes->btnMap[k][0] = state->axes->btnMap[k][1] = 0;
|
||||
if (!s || (sscanf(s, "%d %d", &state->rel->btnMap[k][0],
|
||||
&state->rel->btnMap[k][1]) != 2))
|
||||
state->rel->btnMap[k][0] = state->rel->btnMap[k][1] = 0;
|
||||
|
||||
if (state->axes->btnMap[k][0] || state->axes->btnMap[k][1])
|
||||
if (state->rel->btnMap[k][0] || state->rel->btnMap[k][1])
|
||||
xf86Msg(X_CONFIG, "%s: %s: %d %d.\n", pInfo->name, option,
|
||||
state->axes->btnMap[k][0], state->axes->btnMap[k][1]);
|
||||
state->rel->btnMap[k][0], state->rel->btnMap[k][1]);
|
||||
|
||||
j++;
|
||||
}
|
||||
@@ -467,26 +584,57 @@ EvdevAxisRelNew(InputInfoPtr pInfo)
|
||||
state->rel->axes = state->rel->map[i];
|
||||
|
||||
if (state->abs && (state->abs->axes >= 2) && (state->rel->axes < 2))
|
||||
state->rel->axes = 2;
|
||||
state->rel->axes += 2;
|
||||
|
||||
if (state->rel->axes != real_axes)
|
||||
xf86Msg(X_CONFIG, "%s: Configuring %d relative axes.\n", pInfo->name,
|
||||
state->rel->axes);
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
EvdevAxisRelNew1(InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
|
||||
if (!state->rel)
|
||||
return !Success;
|
||||
|
||||
xf86Msg(X_CONFIG, "%s: Configuring %d relative axes.\n", pInfo->name,
|
||||
state->rel->axes);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
int
|
||||
EvdevAxesNew (InputInfoPtr pInfo)
|
||||
EvdevAxesNew0 (InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
int ret = Success;
|
||||
|
||||
state->axes = Xcalloc (sizeof (evdevAxesRec));
|
||||
if (EvdevAxisAbsNew(pInfo) != Success)
|
||||
if (EvdevAxisAbsNew0(pInfo) != Success)
|
||||
ret = !Success;
|
||||
if (EvdevAxisRelNew(pInfo) != Success)
|
||||
if (EvdevAxisRelNew0(pInfo) != Success)
|
||||
ret = !Success;
|
||||
if (!state->abs && !state->rel) {
|
||||
Xfree (state->axes);
|
||||
state->axes = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
EvdevAxesNew1 (InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
int ret = Success;
|
||||
|
||||
state->axes = Xcalloc (sizeof (evdevAxesRec));
|
||||
if (EvdevAxisAbsNew1(pInfo) != Success)
|
||||
ret = !Success;
|
||||
if (EvdevAxisRelNew1(pInfo) != Success)
|
||||
ret = !Success;
|
||||
if (!state->abs && !state->rel) {
|
||||
Xfree (state->axes);
|
||||
@@ -541,3 +689,18 @@ EvdevAxesInit (DeviceIntPtr device)
|
||||
return Success;
|
||||
}
|
||||
|
||||
static void
|
||||
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_x = state->abs->reset_y = 1;
|
||||
}
|
||||
}
|
||||
|
||||
150
src/evdev_btn.c
150
src/evdev_btn.c
@@ -51,6 +51,91 @@
|
||||
|
||||
#include <xf86Module.h>
|
||||
|
||||
static char *button_names[] = {
|
||||
"MISC_0",
|
||||
"MISC_1",
|
||||
"MISC_2",
|
||||
"MISC_3",
|
||||
"MISC_4",
|
||||
"MISC_5",
|
||||
"MISC_6",
|
||||
"MISC_7",
|
||||
"MISC_8",
|
||||
"MISC_9",
|
||||
"MISC_10",
|
||||
"MISC_11",
|
||||
"MISC_12",
|
||||
"MISC_13",
|
||||
"MISC_14",
|
||||
"MISC_15",
|
||||
"MOUSE_LEFT",
|
||||
"MOUSE_RIGHT",
|
||||
"MOUSE_MIDDLE",
|
||||
"MOUSE_SIDE",
|
||||
"MOUSE_EXTRA",
|
||||
"MOUSE_FORWARD",
|
||||
"MOUSE_BACK",
|
||||
"MOUSE_TASK",
|
||||
"MOUSE_8",
|
||||
"MOUSE_9",
|
||||
"MOUSE_10",
|
||||
"MOUSE_12",
|
||||
"MOUSE_13",
|
||||
"MOUSE_14",
|
||||
"MOUSE_15",
|
||||
"JOY_TRIGGER",
|
||||
"JOY_THUMB",
|
||||
"JOY_THUMB2",
|
||||
"JOY_TOP",
|
||||
"JOY_TOP2",
|
||||
"JOY_PINKIE",
|
||||
"JOY_BASE",
|
||||
"JOY_BASE2",
|
||||
"JOY_BASE3",
|
||||
"JOY_BASE4",
|
||||
"JOY_BASE5",
|
||||
"JOY_BASE6",
|
||||
"JOY_12",
|
||||
"JOY_13",
|
||||
"JOY_14",
|
||||
"JOY_DEAD",
|
||||
"GAME_A",
|
||||
"GAME_B",
|
||||
"GAME_C",
|
||||
"GAME_X",
|
||||
"GAME_Y",
|
||||
"GAME_Z",
|
||||
"GAME_TL",
|
||||
"GAME_TR",
|
||||
"GAME_TL2",
|
||||
"GAME_TR2",
|
||||
"GAME_SELECT",
|
||||
"GAME_START",
|
||||
"GAME_MODE",
|
||||
"GAME_THUMBL",
|
||||
"GAME_THUMBR",
|
||||
"GAME_15",
|
||||
"DIGI_TOOL_PEN",
|
||||
"DIGI_TOOL_RUBBER",
|
||||
"DIGI_TOOL_BRUSH",
|
||||
"DIGI_TOOL_PENCIL",
|
||||
"DIGI_TOOL_AIRBRUSH",
|
||||
"DIGI_TOOL_FINGER",
|
||||
"DIGI_TOOL_MOUSE",
|
||||
"DIGI_TOOL_LENS",
|
||||
"DIGI_8",
|
||||
"DIGI_9",
|
||||
"DIGI_TOUCH",
|
||||
"DIGI_STYLUS",
|
||||
"DIGI_STYLUS2",
|
||||
"DIGI_TOOL_DOUBLETAP",
|
||||
"DIGI_TOOL_TRIPLETAP",
|
||||
"DIGI_15",
|
||||
"WHEEL_GEAR_UP",
|
||||
"WHEEL_GEAR_DOWN",
|
||||
NULL
|
||||
};
|
||||
|
||||
void
|
||||
EvdevBtnPostFakeClicks(InputInfoPtr pInfo, int button, int count)
|
||||
{
|
||||
@@ -130,12 +215,12 @@ EvdevBtnCalcRemap (InputInfoPtr pInfo)
|
||||
do {
|
||||
clear = 1;
|
||||
for (j = 0; j < REL_MAX; j++) {
|
||||
if (state->axes->btnMap[j][0] == (i + base)) {
|
||||
if (state->rel->btnMap[j][0] == (i + base)) {
|
||||
base++;
|
||||
clear = 0;
|
||||
break;
|
||||
}
|
||||
if (state->axes->btnMap[j][1] == (i + base)) {
|
||||
if (state->rel->btnMap[j][1] == (i + base)) {
|
||||
base++;
|
||||
clear = 0;
|
||||
break;
|
||||
@@ -158,17 +243,17 @@ EvdevBtnCalcRemap (InputInfoPtr pInfo)
|
||||
|
||||
if (state->rel) {
|
||||
for (i = 0; i < REL_MAX; i++) {
|
||||
if (state->axes->btnMap[i][0] > state->btn->buttons)
|
||||
state->btn->buttons = state->axes->btnMap[i][0];
|
||||
if (state->axes->btnMap[i][1] > state->btn->buttons)
|
||||
state->btn->buttons = state->axes->btnMap[i][1];
|
||||
if (state->rel->btnMap[i][0] > state->btn->buttons)
|
||||
state->btn->buttons = state->rel->btnMap[i][0];
|
||||
if (state->rel->btnMap[i][1] > state->btn->buttons)
|
||||
state->btn->buttons = state->rel->btnMap[i][1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
EvdevBtnNew(InputInfoPtr pInfo)
|
||||
EvdevBtnNew0(InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
@@ -191,6 +276,18 @@ EvdevBtnNew(InputInfoPtr pInfo)
|
||||
if (state->btn->real_buttons)
|
||||
xf86Msg(X_INFO, "%s: Found %d mouse buttons\n", pInfo->name, state->btn->real_buttons);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
int
|
||||
EvdevBtnNew1(InputInfoPtr pInfo)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
evdevStatePtr state = &pEvdev->state;
|
||||
|
||||
if (!state->btn)
|
||||
return !Success;
|
||||
|
||||
EvdevBtnCalcRemap (pInfo);
|
||||
|
||||
if (state->btn->buttons)
|
||||
@@ -221,7 +318,7 @@ EvdevBtnProcess (InputInfoPtr pInfo, struct input_event *ev)
|
||||
if (!state->btn)
|
||||
return;
|
||||
|
||||
button = ev->code - BTN_MISC;
|
||||
button = ev->code;
|
||||
|
||||
if ((ev->code >= BTN_MOUSE) && (ev->code < BTN_JOYSTICK)) {
|
||||
button -= BTN_MOUSE - BTN_MISC;
|
||||
@@ -229,9 +326,42 @@ EvdevBtnProcess (InputInfoPtr pInfo, struct input_event *ev)
|
||||
button += BTN_MOUSE - BTN_MISC;
|
||||
}
|
||||
|
||||
if (state->btn->state[button])
|
||||
*state->btn->state[button] = ev->value;
|
||||
button -= BTN_MISC;
|
||||
|
||||
if (state->btn->callback[button])
|
||||
state->btn->callback[button](pInfo, button, ev->value);
|
||||
|
||||
button = state->btn->map[button];
|
||||
xf86PostButtonEvent (pInfo->dev, 0, button, ev->value, 0, 0);
|
||||
}
|
||||
|
||||
int
|
||||
EvdevBtnFind (InputInfoPtr pInfo, const char *button)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; button_names[i]; i++)
|
||||
if (!strcasecmp(button, button_names[i]))
|
||||
return i + 1;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
EvdevBtnExists (InputInfoPtr pInfo, int button)
|
||||
{
|
||||
evdevDevicePtr pEvdev = pInfo->private;
|
||||
|
||||
button += BTN_MISC;
|
||||
|
||||
xf86Msg(X_INFO, "%s: Checking button %s (%d)\n", pInfo->name, button_names[button - BTN_MISC], button);
|
||||
|
||||
if ((button >= BTN_MOUSE) && (button < BTN_JOYSTICK)) {
|
||||
button -= BTN_MOUSE - BTN_MISC;
|
||||
} else if ((button >= BTN_MISC) && (button < BTN_MOUSE)) {
|
||||
button += BTN_MOUSE - BTN_MISC;
|
||||
}
|
||||
|
||||
xf86Msg(X_INFO, "%s: Checking bit %d\n", pInfo->name, button);
|
||||
return test_bit(button, pEvdev->bits.key);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user