From 5212aa9d2cd43ba1d3fd8b8fcc0dfed19f8091fb Mon Sep 17 00:00:00 2001 From: matthieu Date: Sat, 24 Nov 2007 21:02:37 +0000 Subject: [PATCH] xf86-input-acecad 1.2.1 --- driver/xf86-input-acecad/ChangeLog | 499 ++++++++- driver/xf86-input-acecad/Makefile.am | 11 + driver/xf86-input-acecad/autogen.sh | 12 + driver/xf86-input-acecad/configure.ac | 8 +- driver/xf86-input-acecad/depcomp | 64 +- driver/xf86-input-acecad/install-sh | 342 +++++-- driver/xf86-input-acecad/missing | 61 +- driver/xf86-input-acecad/src/acecad.c | 1366 ++++++++++++++----------- driver/xf86-input-acecad/src/acecad.h | 20 +- 9 files changed, 1658 insertions(+), 725 deletions(-) create mode 100644 driver/xf86-input-acecad/autogen.sh diff --git a/driver/xf86-input-acecad/ChangeLog b/driver/xf86-input-acecad/ChangeLog index 7399bd06c..9110b079c 100644 --- a/driver/xf86-input-acecad/ChangeLog +++ b/driver/xf86-input-acecad/ChangeLog @@ -1,45 +1,488 @@ -2006-04-06 Adam Jackson +commit 38ba390f775e2f6001c8887328c5b925f623308a +Author: Julien Cristau +Date: Fri Sep 7 02:17:29 2007 +0200 - * configure.ac: - * src/acecad.c: - Unlibcwrap and bump server version requirement. Bump to 1.1.0. + Bump to 1.2.1 -2005-12-20 Kevin E. Martin +commit 8bcc6d22889cc40c6b7d1582f87d4b2a816167ab +Author: Alan Coopersmith +Date: Tue Aug 28 17:31:54 2007 -0700 - * configure.ac: - Update package version for X11R7 release. + Make compatible with new input ABI -2005-12-14 Kevin E. Martin +commit 171d4c8dc6136aa8c14aedd0ee107d6ba957de04 +Author: Giuseppe Bilotta +Date: Mon Jul 9 11:03:00 2007 +0200 - * configure.ac: - Update package version number for final X11R7 release candidate. + Don't crash X when the tablet wasn't found. + + X would crash when switching to console if the acecad module was loaded but the tablet had not been configured. + + Fix by properly freeing structures before returning NULL in PreInit() -2005-12-06 Kevin E. Martin +commit c69e2c95b9eb2381709c9de14957d24ab919b5bc +Author: Matthieu Herrb +Date: Wed May 30 23:34:13 2007 -0600 - * man/Makefile.am: - Change *man_SOURCES ==> *man_PRE to fix autotools warnings. + fix build on BSD systems. -2005-12-03 Kevin E. Martin +commit 62bce174e7a3c896fabe40813639e479d9652452 +Author: Matthieu Herrb +Date: Wed May 30 23:33:56 2007 -0600 - * configure.ac: - Update package version number for X11R7 RC3 release. + Add .gitignore -2005-12-01 Kevin E. Martin +commit 1af7e022be2bcbcf50d12c0c3847a853a911347c +Author: Paul Vojta +Date: Mon Apr 30 11:45:53 2007 -0700 - * configure.ac: - Remove extraneous AC_MSG_RESULT. + Off-by-one (and comment) fix. + + Just a quick patch: -2005-11-29 Adam Jackson +commit cc6bc3b848dfa312baf0cf4037b3e600d59a8f7e +Author: Giuseppe Bilotta +Date: Sun Apr 29 05:09:41 2007 +0200 - * configure.ac: - Only build dlloader modules by default. + Bump to 1.2.0. -2005-11-09 Kevin E. Martin +commit 405fac1dd34bbbfa8a2dd1a0ac2664871d914e1f +Author: Giuseppe Bilotta +Date: Sun Apr 29 05:02:03 2007 +0200 - * configure.ac: - Update package version number for X11R7 RC2 release. + Simplify flag setup. -2005-11-01 Kevin E. Martin +commit ac08aacf4693e2ed824c15c9d243e7e9c5750cc3 +Author: Giuseppe Bilotta +Date: Sun Apr 29 04:44:27 2007 +0200 - * configure.ac: - Update pkgcheck depedencies to work with separate build roots. + More whitespace/coding style cleanups. + +commit 9b9b1d03609996dc3220870fa6e226c46c888c83 +Author: Giuseppe Bilotta +Date: Sun Apr 29 04:42:04 2007 +0200 + + Centralize the success code for the probe routine. + +commit 93736ac2bf92ad342255a64120c2685f4074a0e9 +Author: Giuseppe Bilotta +Date: Sat Apr 28 15:32:32 2007 +0200 + + Keep track of device availability. + + Don't spam the log with errors about the device not being available, just inform the user when the device is available again. + +commit c471639adfba3e7c24c95b24da287147f86bd3d1 +Author: Giuseppe Bilotta +Date: Sat Apr 28 15:10:25 2007 +0200 + + NOTAVAIL macro to check if errno means device not available. + + Define (and use) a NOTAVAIL macro that checks errno against ENODEV, ENXIO and ENOENT, instead of checking manually against ENODEV only. + +commit 81e37b4b042b824654b4bf2353732741cf49bce7 +Author: Giuseppe Bilotta +Date: Sat Apr 28 14:42:20 2007 +0200 + + Make acecadAutoDev into a flag. + + Introduce AUTODEV_FLAG for the flags field in AceCadPrivateRec to tell if we are autodetecting devices or not, instead of having a separate acecadAutoDev field. + +commit bda0ee988acbae97dc908574c1247cf1ceb5b3c9 +Author: Giuseppe Bilotta +Date: Sat Apr 28 14:36:12 2007 +0200 + + Make acecadUSB into a flag. + + Introduce USB_FLAG for the flags field in AceCadPrivateRec to tell if we have a USB device or not, instead of having a separate acecadUSB field. + +commit 2b88cc3642a94a58e777d8a931f7bbe9f16e9b93 +Author: Giuseppe Bilotta +Date: Sat Apr 28 14:27:58 2007 +0200 + + More whitespace cleanup. + +commit 1d8e61f461fef959212d5a05cac70a590927ec20 +Author: Giuseppe Bilotta +Date: Sat Apr 28 14:25:22 2007 +0200 + + More coding style cleanups. + +commit e5704a3484bb8cc3f295431ff2e50e3e628db0c7 +Author: Giuseppe Bilotta +Date: Sat Apr 28 14:19:49 2007 +0200 + + Add missing newlines in a couple of messages. + +commit a8350a018d50f2a0e2adcf6ec8c76f6ab412dd16 +Author: Giuseppe Bilotta +Date: Sat Apr 28 05:29:41 2007 +0200 + + Whitespace cleanup. + +commit 46b34bec71949b815b1372464b887da134378ae8 +Author: Giuseppe Bilotta +Date: Sat Apr 28 05:10:39 2007 +0200 + + De-spammify AceCadAutoDevProbe(). + + Demote X_ERRORs in AceCadAutoDevProbe() to X_WARNINGs, and add an X-style + verbosity parameter. This is set to 0 during initial probe, and to 4 during + runtime probes. + +commit 41941cb9e2365b27196805c22424dc9ad694806f +Author: Giuseppe Bilotta +Date: Sat Apr 28 04:55:26 2007 +0200 + + Re-probe on device not found on input if auto-dev is active. + + If USBReadInput() fails because the device is not being found, and auto-dev is + active, try re-probing for the device. The only downside of this procedure is + that the log may get spammed a lot as long as no device can be found. + +commit 838980da1cf5073ce0d532f94358cfc951e3b1c4 +Author: Giuseppe Bilotta +Date: Sat Apr 28 03:43:04 2007 +0200 + + Re-probe for device if DeviceOn fails and auto-dev is active. + + If DeviceOn does not find the device and auto-dev is active, run the probe + again to try to find the new location of the device (if present). + +commit dba3190cb5e5c041c6b5811fa9efd1f0a5931fb6 +Author: Giuseppe Bilotta +Date: Sat Apr 28 03:09:17 2007 +0200 + + Device autodetection via sysfs. + + If support for sysfs is compiled in and the libsysfs library is found, the + acecad driver will now try to autodetect the device via sysfs at first. If this + fails, it will probe /dev/input/eventX devices. + + Currently the Name option is ignored during sysfs detection: the first possibly + valid candidate is accepted without further checks. + +commit 4f738d5eee947d5e4bd27f4ecdf198c5718ca53a +Author: Giuseppe Bilotta +Date: Fri Apr 27 14:40:43 2007 +0200 + + "Name" option to configure autodev detection string. + + The string we look for when probing event devices can now be configured with + the "Name" option. + +commit 947aa75cf284b651c77ae1f0431cae0c3c3d3d05 +Merge: 581635e... 805ccfb... +Author: Giuseppe Bilotta +Date: Fri Apr 27 12:23:44 2007 +0200 + + Merge branch 'master' into autodev + +commit 805ccfb003d7e8d71da18210186217583df710b1 +Author: Giuseppe Bilotta +Date: Fri Apr 27 00:30:58 2007 +0200 + + Add autogen.sh and autogenerate ChangeLog to dist + + Get rid of the manually maintained ChangeLog and put in some rules to + autogenerate it from git logs, following the xorg/lib/libXi example. + + Also add ChangeLog and autogen.sh to the dist files. + +commit 558f80d3d4c21ddd5fa1981574c449bc4d86ddfa +Author: Giuseppe Bilotta +Date: Fri Apr 27 00:01:54 2007 +0200 + + Add autoconf check for linux/input.h + + Since X went modular, we cannot rely on LINUX_INPUT being defined even when the + Linux input subsystem is available. Fix: add an autoconf rule that checks for + linux/input.h and define LINUX_INPUT if the header is found. + +commit 581635e2fc5563b2697d51e3aeec046918d8caee +Author: Giuseppe Bilotta +Date: Thu Apr 26 13:33:51 2007 +0200 + + Initial support for device autodetection. + + When the "Device" option is missing or set to "auto-dev" the acecad module will + attempt autodetection of the correct device. + + Currently, it will probe all /dev/input/eventX nodes until one is found that + reports a device name that begins with "ACECAD". + +commit c6b21d102908104ffe9b6103894f8c8fcf2ae7f4 +Author: Giuseppe Bilotta +Date: Thu Apr 26 03:04:06 2007 +0200 + + Uniformize messages. + + Use xf86Msg, prepending local->name when possible and upcasing ACECAD (as per + their site, and to differentiate from the software company). + + Also reduce verbosity by using xf86MsgVerb with verbosity 4 for messages which + are not of interest for users. + +commit 4fb81ff8b0828294b3e1d0c63c67dca318ee7959 +Author: Giuseppe Bilotta +Date: Thu Apr 26 02:16:10 2007 +0200 + + We always have config.h. + + Quoting Alan Coopersmith from http://lists.x.org/archives/xorg/2007-April/024058.html + + > Now that we are no longer sharing source with the monolith, should + > all the #ifdef HAVE_CONFIG_H's be removed and just always include + > config.h now? + +commit e3499189b91725e09e25a468f21612e805dfa89d +Author: Giuseppe Bilotta +Date: Tue Apr 24 22:00:47 2007 +0200 + + Use autoconfigured package version if possible. + +commit 7fe06dc37595a39e0298d9123a669d06df934c35 +Author: Giuseppe Bilotta +Date: Tue Apr 24 15:28:51 2007 +0200 + + Bump to 1.1.1. + +commit 7665457d70a37c3187b3dfcc54a7f15058e8acba +Author: Giuseppe Bilotta +Date: Tue Apr 24 13:35:52 2007 +0200 + + Support 2.6.x kernels. + +commit 1eae0e35655ffddb8a203a51bb1e2aa53928a87e +Author: Giuseppe Bilotta +Date: Tue Apr 24 12:44:58 2007 +0200 + + Use the proper MessageType for probed, default, info and error messages. + +commit 9ab58ae1001a399907458d236b1f725e3503ee90 +Author: Giuseppe Bilotta +Date: Tue Apr 24 12:38:38 2007 +0200 + + Clean up defines, and add an include to fix compilation when LINUX_INPUT is defined + +commit 190e38f513ed645b1662441a4b90eaf778878316 +Author: Adam Jackson +Date: Fri Apr 7 16:16:33 2006 +0000 + + Bump to 1.1.0. + +commit a128e04d9240409cf8c9a9c92671f374959c60d0 +Author: Adam Jackson +Date: Fri Apr 7 16:13:56 2006 +0000 + + Unlibcwrap and bump server version requirement. + +commit aaec49a8e42193e0d7f68132f01e8d802ecee27c +Author: Kevin E Martin +Date: Wed Dec 21 02:29:55 2005 +0000 + + Update package version for X11R7 release. + +commit e5dd84c88172873a99f12798cc00e59c5185afc7 +Author: Adam Jackson +Date: Mon Dec 19 16:25:49 2005 +0000 + + Stub COPYING files + +commit 2e050d849b72a5119790641fe6b7a83f5e6f15f0 +Author: Kevin E Martin +Date: Thu Dec 15 00:24:13 2005 +0000 + + Update package version number for final X11R7 release candidate. + +commit 8df008ad5451a0afc4576be121e112ae43c5a4bf +Author: Kevin E Martin +Date: Tue Dec 6 22:48:27 2005 +0000 + + Change *man_SOURCES ==> *man_PRE to fix autotools warnings. + +commit a3e290213ce7ce920145a4a7368e052f09768164 +Author: Kevin E Martin +Date: Sat Dec 3 05:49:29 2005 +0000 + + Update package version number for X11R7 RC3 release. + +commit 31963eae0d36ca43f103a885430b39626021aa94 +Author: Kevin E Martin +Date: Fri Dec 2 02:16:04 2005 +0000 + + Remove extraneous AC_MSG_RESULT. + +commit 295f696a950f0883c040969a7381be1b16275674 +Author: Adam Jackson +Date: Tue Nov 29 23:29:53 2005 +0000 + + Only build dlloader modules by default. + +commit b8075ef13db08347876dd74b06bd5d05be00d9ff +Author: Alan Coopersmith +Date: Mon Nov 28 22:04:05 2005 +0000 + + Change *mandir targets to use new *_MAN_DIR variables set by xorg-macros.m4 + update to fix bug #5167 (Linux prefers *.1x man pages in man1 subdir) + +commit cab1f00c4f2d2b2a12260c078b06a30bd03b8d35 +Author: Eric Anholt +Date: Mon Nov 21 10:49:00 2005 +0000 + + Add .cvsignores for drivers. + +commit 9f164337b4c0ff7f3189f50033f5635550fbe598 +Author: Kevin E Martin +Date: Wed Nov 9 21:15:10 2005 +0000 + + Update package version number for X11R7 RC2 release. + +commit 37f29b066c955b9ef85b95f39ed4ca9c4c799da9 +Author: Kevin E Martin +Date: Tue Nov 1 15:08:48 2005 +0000 + + Update pkgcheck depedencies to work with separate build roots. + +commit 0d5c65828cbda96688234ca98de51748cc6a7a9c +Author: Kevin E Martin +Date: Wed Oct 19 02:47:59 2005 +0000 + + Update package version number for RC1 release. + +commit 48e99a4438d6e4c869cae23f2bcf17504b36f12b +Author: Alan Coopersmith +Date: Tue Oct 18 00:01:50 2005 +0000 + + Use @DRIVER_MAN_SUFFIX@ instead of $(DRIVER_MAN_SUFFIX) in macro + substitutions to work better with BSD make + +commit 9cd8523d3047eb00e9d1f90158d932c8c9c8d511 +Author: Adam Jackson +Date: Mon Oct 17 22:57:25 2005 +0000 + + More 1.7 braindamage: define EXTRA_DIST in terms of @DRIVER_NAME@ instead + of indirectly + +commit 33d7ef77bdc4d55c01f50f9a29ac660703c0e380 +Author: Alan Coopersmith +Date: Mon Oct 17 00:08:53 2005 +0000 + + Use sed & cpp to substitute variables in driver man pages + +commit 262151fd3f961ee1dc065943eff62e7c27823340 +Author: Daniel Stone +Date: Thu Aug 18 09:03:36 2005 +0000 + + Update autogen.sh to one that does objdir != srcdir. + +commit 3e83d76e4315468df9c85b7a917508e5e0adc8e6 +Author: Søren Sandmann Pedersen +Date: Wed Aug 10 14:07:21 2005 +0000 + + Don\'t lose existing CFLAGS in all the input drivers and some of the video + drivers + +commit 81612155b583e3fbaff7af662edf7353cfb0da8e +Author: Kevin E Martin +Date: Fri Jul 29 21:22:39 2005 +0000 + + Various changes preparing packages for RC0: + - Verify and update package version numbers as needed + - Implement versioning scheme + - Change bug address to point to bugzilla bug entry form + - Disable loadable i18n in libX11 by default (use --enable-loadable-i18n to + reenable it) + - Fix makedepend to use pkgconfig and pass distcheck + - Update build script to build macros first + - Update modular Xorg version + +commit 01f7b4b23a52439aab8262d3a500f3339be04eb3 +Author: Kevin E Martin +Date: Wed Jul 13 20:03:20 2005 +0000 + + Make the module dir configurable + +commit b458a723e098531da7dbfac39747dc34df431831 +Author: Kevin E Martin +Date: Wed Jul 13 02:20:57 2005 +0000 + + Update all input drivers to pass distcheck + +commit f603ac2e59944b7f75ff82803c67f2ce02321646 +Author: Adam Jackson +Date: Tue Jul 12 06:15:07 2005 +0000 + + Build skeletons for input drivers. Should basically work. + +commit 0b74a6722cf7c0e24bf31720cfa4ce0eb1a479d2 +Author: Adam Jackson +Date: Mon Jul 11 02:37:58 2005 +0000 + + Prep input drivers for modularizing by adding guarded #include "config.h" + +commit a02a441079feb7cc208c4d4e190d3c47819fd59f +Author: Adam Jackson +Date: Tue Jun 28 20:54:21 2005 +0000 + + Bug #1565: Don't delete the driver twice. (Stéphane VOLTZ) + +commit 0702e4b5b996f7ce959d2252318c5da86f6138a2 +Author: Adam Jackson +Date: Sat Jun 25 21:17:00 2005 +0000 + + Bug #3626: _X_EXPORT tags for video and input drivers. + +commit cb1938aa46fcab41ec663568fea22a89b32afe45 +Author: Markus Kuhn +Date: Sat Dec 4 00:43:10 2004 +0000 + + Encoding of numerous files changed to UTF-8 + +commit 08ad8a93ee169525543da9aa044939024122e67f +Author: Egbert Eich +Date: Fri Apr 23 19:54:02 2004 +0000 + + Merging XORG-CURRENT into trunk + +commit eeeab6dfebe29f84947449a2123afcf673f74cbf +Author: Egbert Eich +Date: Sun Mar 14 08:33:47 2004 +0000 + + Importing vendor version xf86-4_4_99_1 on Sun Mar 14 00:26:39 PST 2004 + +commit f45bf39ec0655879f922e30ce40a4d848bbe5c53 +Author: Egbert Eich +Date: Wed Mar 3 12:12:30 2004 +0000 + + Importing vendor version xf86-4_4_0 on Wed Mar 3 04:09:24 PST 2004 + +commit a4df6cf595d031007f7126d321350de13d6aaac2 +Author: Egbert Eich +Date: Thu Feb 26 13:36:00 2004 +0000 + + readding XFree86's cvs IDs + +commit 0a754ffa019f081a194cb28b3d12968bf4522bab +Author: Egbert Eich +Date: Thu Feb 26 09:23:33 2004 +0000 + + Importing vendor version xf86-4_3_99_903 on Wed Feb 26 01:21:00 PST 2004 + +commit e50d70f38e90bde903c91dcd6f47cf01165fe977 +Author: Kaleb Keithley +Date: Tue Nov 25 19:28:46 2003 +0000 + + XFree86 4.3.99.16 Bring the tree up to date for the Cygwin folks + +commit 350b2d1c6157e75ab8e5374164cd68f9b6b5eea7 +Author: Kaleb Keithley +Date: Fri Nov 14 16:48:56 2003 +0000 + + XFree86 4.3.0.1 + +commit 249fcdd8f49a8a922ee1eb88cbd8a01e8929328f +Author: Kaleb Keithley +Date: Fri Nov 14 16:48:56 2003 +0000 + + Initial revision diff --git a/driver/xf86-input-acecad/Makefile.am b/driver/xf86-input-acecad/Makefile.am index 7052905f3..af2effb3a 100644 --- a/driver/xf86-input-acecad/Makefile.am +++ b/driver/xf86-input-acecad/Makefile.am @@ -20,3 +20,14 @@ AUTOMAKE_OPTIONS = foreign SUBDIRS = src man + +EXTRA_DIST = autogen.sh ChangeLog + +CLEANFILES = ChangeLog + +.PHONY: ChangeLog + +ChangeLog: + (GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2) + +dist-hook: ChangeLog diff --git a/driver/xf86-input-acecad/autogen.sh b/driver/xf86-input-acecad/autogen.sh new file mode 100644 index 000000000..904cd6746 --- /dev/null +++ b/driver/xf86-input-acecad/autogen.sh @@ -0,0 +1,12 @@ +#! /bin/sh + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd $srcdir + +autoreconf -v --install || exit 1 +cd $ORIGDIR || exit $? + +$srcdir/configure --enable-maintainer-mode "$@" diff --git a/driver/xf86-input-acecad/configure.ac b/driver/xf86-input-acecad/configure.ac index c0ff6ada5..694e2c4b0 100644 --- a/driver/xf86-input-acecad/configure.ac +++ b/driver/xf86-input-acecad/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-input-acecad], - 1.1.0, + 1.2.1, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-input-acecad) @@ -85,6 +85,12 @@ AC_SUBST([CFLAGS]) # Checks for header files. AC_HEADER_STDC +AC_HEADER_CHECK([linux/input.h], + [AC_DEFINE([LINUX_INPUT], [1], [Using the Linux input subsystem])] + ) +AC_HEADER_CHECK([sysfs/libsysfs.h], + [AC_DEFINE([LINUX_SYSFS], [1], [Using sysfs to probe devices])] + ) XORG_MANPAGE_SECTIONS XORG_RELEASE_VERSION diff --git a/driver/xf86-input-acecad/depcomp b/driver/xf86-input-acecad/depcomp index 04701da53..ca5ea4e1e 100644 --- a/driver/xf86-input-acecad/depcomp +++ b/driver/xf86-input-acecad/depcomp @@ -1,9 +1,10 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2005-07-09.11 +scriptversion=2006-10-15.18 -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software +# Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -91,7 +92,20 @@ gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. - "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" stat=$? if test $stat -eq 0; then : else @@ -276,6 +290,46 @@ icc) rm -f "$tmpdepfile" ;; +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. @@ -288,13 +342,13 @@ tru64) if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a - # static library. This mecanism is used in libtool 1.4 series to + # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in in $dir.libs/$base.o.d and + # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is diff --git a/driver/xf86-input-acecad/install-sh b/driver/xf86-input-acecad/install-sh index 4d4a9519e..4fbbae7b7 100644 --- a/driver/xf86-input-acecad/install-sh +++ b/driver/xf86-input-acecad/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2005-05-14.22 +scriptversion=2006-10-14.15 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -39,15 +39,24 @@ scriptversion=2005-05-14.22 # when there is no Makefile. # # This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. +# from scratch. + +nl=' +' +IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi -# put in absolute paths if you don't have them in your path; or use env. vars. +# Put in absolute file names if you don't have them in your path; +# or use environment vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" @@ -58,7 +67,13 @@ stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" -chmodcmd="$chmodprog 0755" +posix_glob= +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chmodcmd=$chmodprog chowncmd= chgrpcmd= stripcmd= @@ -95,7 +110,7 @@ Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " -while test -n "$1"; do +while test $# -ne 0; do case $1 in -c) shift continue;; @@ -111,9 +126,15 @@ while test -n "$1"; do --help) echo "$usage"; exit $?;; - -m) chmodcmd="$chmodprog $2" + -m) mode=$2 shift shift + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac continue;; -o) chowncmd="$chownprog $2" @@ -136,25 +157,33 @@ while test -n "$1"; do --version) echo "$0 $scriptversion"; exit $?;; - *) # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - test -n "$dir_arg$dstarg" && break - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dstarg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dstarg" - shift # fnord - fi - shift # arg - dstarg=$arg - done + --) shift break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; esac done -if test -z "$1"; then +if test $# -ne 0 && test -z "$dir_arg$dstarg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done +fi + +if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 @@ -164,6 +193,33 @@ if test -z "$1"; then exit 0 fi +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + for src do # Protect names starting with `-'. @@ -173,15 +229,11 @@ do if test -n "$dir_arg"; then dst=$src - src= - - if test -d "$dst"; then - mkdircmd=: - chmodcmd= - else - mkdircmd=$mkdirprog - fi + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. @@ -208,53 +260,188 @@ do echo "$0: $dstarg: Is a directory" >&2 exit 1 fi - dst=$dst/`basename "$src"` + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? fi fi - # This sed command emulates the dirname command. - dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + obsolete_mkdir_used=false - # Make sure that the destination directory exists. + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - # Skip lots of stat calls in the usual case. - if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac - oIFS=$IFS - # Some sh's can't handle IFS=/ for some reason. - IFS='%' - set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` - shift - IFS=$oIFS + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi - pathcomp= + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - while test $# -ne 0 ; do - pathcomp=$pathcomp$1 + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix=/ ;; + -*) prefix=./ ;; + *) prefix= ;; + esac + + case $posix_glob in + '') + if (set -f) 2>/dev/null; then + posix_glob=true + else + posix_glob=false + fi ;; + esac + + oIFS=$IFS + IFS=/ + $posix_glob && set -f + set fnord $dstdir shift - if test ! -d "$pathcomp"; then - $mkdirprog "$pathcomp" - # mkdir can fail with a `File exist' error in case several - # install-sh are creating the directory concurrently. This - # is OK. - test -d "$pathcomp" || exit + $posix_glob && set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi - pathcomp=$pathcomp/ - done + fi fi if test -n "$dir_arg"; then - $doit $mkdircmd "$dst" \ - && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } - + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else - dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ @@ -262,10 +449,9 @@ do # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. - $doit $cpprog "$src" "$dsttmp" && + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -276,10 +462,10 @@ do { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # Now rename the file to the real destination. - { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not @@ -291,11 +477,12 @@ do # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { - if test -f "$dstdir/$dstfile"; then - $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ - || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + if test -f "$dst"; then + $doit $rmcmd -f "$dst" 2>/dev/null \ + || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ + && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ || { - echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } else @@ -304,16 +491,13 @@ do } && # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + $doit $mvcmd "$dsttmp" "$dst" } - } - fi || { (exit 1); exit 1; } -done + } || exit 1 -# The final little trick to "correctly" pass the exit status to the exit trap. -{ - (exit 0); exit 0 -} + trap '' 0 + fi +done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) diff --git a/driver/xf86-input-acecad/missing b/driver/xf86-input-acecad/missing index 894e786e1..1c8ff7049 100644 --- a/driver/xf86-input-acecad/missing +++ b/driver/xf86-input-acecad/missing @@ -1,9 +1,9 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. -scriptversion=2005-06-08.21 +scriptversion=2006-05-10.23 -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. @@ -33,6 +33,8 @@ if test $# -eq 0; then fi run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. @@ -44,7 +46,7 @@ fi msg="missing on your system" -case "$1" in +case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= @@ -77,6 +79,7 @@ Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c @@ -106,7 +109,7 @@ esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). -case "$1" in +case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; @@ -135,7 +138,7 @@ esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. -case "$1" in +case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if @@ -164,7 +167,7 @@ WARNING: \`$1' is $msg. You should only need it if test -z "$files" && files="config.h" touch_files= for f in $files; do - case "$f" in + case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; @@ -192,8 +195,8 @@ WARNING: \`$1' is needed, but is $msg. You can get \`$1' as part of \`Autoconf' from any GNU archive site." - file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` - test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else @@ -214,25 +217,25 @@ WARNING: \`$1' $msg. You should only need it if in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then + if test $# -ne 1; then eval LASTARG="\${$#}" - case "$LASTARG" in + case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi - if [ ! -f y.tab.h ]; then + if test ! -f y.tab.h; then echo >y.tab.h fi - if [ ! -f y.tab.c ]; then + if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; @@ -244,18 +247,18 @@ WARNING: \`$1' is $msg. You should only need it if in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c - if [ $# -ne 1 ]; then + if test $# -ne 1; then eval LASTARG="\${$#}" - case "$LASTARG" in + case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi - if [ ! -f lex.yy.c ]; then + if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; @@ -267,11 +270,9 @@ WARNING: \`$1' is $msg. You should only need it if \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` - fi - if [ -f "$file" ]; then + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then touch $file else test -z "$file" || exec >$file @@ -289,11 +290,17 @@ WARNING: \`$1' is $msg. You should only need it if DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi @@ -317,13 +324,13 @@ WARNING: \`$1' is $msg. You should only need it if fi firstarg="$1" if shift; then - case "$firstarg" in + case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac - case "$firstarg" in + case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 diff --git a/driver/xf86-input-acecad/src/acecad.c b/driver/xf86-input-acecad/src/acecad.c index 43ac6441e..9b14e48fa 100644 --- a/driver/xf86-input-acecad/src/acecad.c +++ b/driver/xf86-input-acecad/src/acecad.c @@ -1,8 +1,8 @@ -/* +/* * Copyright (c) 2001 Edouard TISSERANT * Parts inspired from Shane Watts XFree86 3 Acecad Driver * Thanks to Emily, from AceCad, For giving me documents. - * + * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation @@ -25,9 +25,7 @@ */ /* $XFree86: xc/programs/Xserver/hw/xfree86/input/acecad/acecad.c,v 1.4 2003/10/30 00:40:45 dawes Exp $ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #define _ACECAD_C_ /***************************************************************************** @@ -37,6 +35,10 @@ #ifdef LINUX_INPUT #include #include +#ifndef EV_SYN +#define EV_SYN EV_RST +#define SYN_REPORT 0 +#endif #ifdef BUS_PCI #undef BUS_PCI #endif @@ -47,7 +49,9 @@ #include #include +#ifndef NEED_XF86_TYPES #define NEED_XF86_TYPES +#endif #include #include #include @@ -57,6 +61,21 @@ #include #include +#include +#ifdef LINUX_INPUT +#include +#ifdef LINUX_SYSFS +#include +#include +#endif +#endif + +/* Previously found in xf86Xinput.h */ +#ifdef DBG +#undef DBG +#endif +#define DBG(lvl, f) {if ((lvl) <= xf86GetVerbosity()) f;} + /***************************************************************************** * Local Headers ****************************************************************************/ @@ -70,14 +89,13 @@ * Local Variables ****************************************************************************/ -#define SYSCALL(call) while(((call) == -1) && (errno == EINTR)) #undef read #define read(a,b,c) xf86ReadSerial((a),(b),(c)) /* max number of input events to read in one read call */ #define MAX_EVENTS 50 -_X_EXPORT InputDriverRec ACECAD = +_X_EXPORT InputDriverRec ACECAD = { 1, "acecad", @@ -96,7 +114,7 @@ static XF86ModuleVersionInfo VersionRec = MODINFOSTRING1, MODINFOSTRING2, XORG_VERSION_CURRENT, - 1, 1, 0, + PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL, ABI_CLASS_XINPUT, ABI_XINPUT_VERSION, MOD_CLASS_XINPUT, @@ -162,461 +180,639 @@ IsUSBLine(int fd) int err; SYSCALL(err = ioctl(fd, EVIOCGVERSION, &version)); - + if (!err) { - xf86Msg(X_CONFIG,"Kernel Input driver version is %d.%d.%d\n", - version >> 16, (version >> 8) & 0xff, version & 0xff); - return 1; + xf86MsgVerb(X_PROBED, 4, "Kernel Input driver version is %d.%d.%d\n", + version >> 16, (version >> 8) & 0xff, version & 0xff); + return 1; } else { - return 0; + xf86MsgVerb(X_PROBED, 4, "No Kernel Input driver found\n"); + return 0; } } + +/* Heavily inspired by synaptics/eventcomm.c */ + +#define DEV_INPUT_EVENT "/dev/input/event" +#define EV_DEV_NAME_MAXLEN 64 +#define SET_EVENT_NUM(str, num) \ + snprintf(str, EV_DEV_NAME_MAXLEN, "%s%d", DEV_INPUT_EVENT, num) + +static Bool +fd_query_acecad(int fd, char *ace_name) { + char name[256] = "Unknown"; + int cmp_at = strlen(ace_name); + if (cmp_at > 255) + cmp_at = 255; + ioctl(fd, EVIOCGNAME(sizeof(name)), name); + name[cmp_at] = '\0'; + if (xf86NameCmp(name, ace_name) == 0) + return TRUE; + return FALSE; +} + +static char ace_name_default[7] = "acecad"; + +#ifdef LINUX_SYSFS +static char usb_bus_name[4] = "usb"; +static char acecad_driver_name[11] = "usb_acecad"; +#endif + +static Bool +AceCadAutoDevProbe(LocalDevicePtr local, int verb) +{ + /* We are trying to find the right eventX device */ + int i = 0; + Bool have_evdev = FALSE; + int noent_cnt = 0; + const int max_skip = 10; + char *ace_name = xf86FindOptionValue(local->options, "Name"); + char fname[EV_DEV_NAME_MAXLEN]; + int np; + +#ifdef LINUX_SYSFS + struct sysfs_bus *usb_bus = NULL; + struct sysfs_driver *acecad_driver = NULL; + struct sysfs_device *candidate = NULL; + char *link = NULL; + struct dlist *devs = NULL; + struct dlist *links = NULL; + unsigned int major = 0, minor = 0; + void *libsysfs = NULL; + + if (libsysfs = dlopen("libsysfs.so", RTLD_NOW | RTLD_GLOBAL)) { + xf86MsgVerb(X_INFO, verb, "%s: querying sysfs for Acecad tablets\n", local->name); + usb_bus = sysfs_open_bus(usb_bus_name); + if (usb_bus) { + xf86MsgVerb(X_PROBED, 4, "%s: usb bus opened\n", local->name); + acecad_driver = sysfs_get_bus_driver(usb_bus, acecad_driver_name); + if (acecad_driver) { + xf86MsgVerb(X_PROBED, 4, "%s: usb_acecad driver opened\n", local->name); + devs = sysfs_get_driver_devices(acecad_driver); + if (devs) { + xf86MsgVerb(X_PROBED, 4, "%s: usb_acecad devices retrieved\n", local->name); + dlist_for_each_data(devs, candidate, struct sysfs_device) { + xf86MsgVerb(X_PROBED, 4, "%s: device %s at %s\n", local->name, candidate->name, candidate->path); + links = sysfs_open_link_list(candidate->path); + dlist_for_each_data(links, link, char) { + if (sscanf(link, "input:event%d", &i) == 1) { + xf86MsgVerb(X_PROBED, 4, "%s: device %s at %s: %s\n", local->name, candidate->name, candidate->path, link); + break; + } + } + sysfs_close_list(links); + if (i > 0) /* We found something */ + break; + } + } else + xf86MsgVerb(X_WARNING, 4, "%s: no usb_acecad devices found\n", local->name); + } else + xf86MsgVerb(X_WARNING, 4, "%s: usb_acecad driver not found\n", local->name); + } else + xf86MsgVerb(X_WARNING, 4, "%s: usb bus not found\n", local->name); + sysfs_close_bus(usb_bus); + dlclose(libsysfs); + + if (i > 0) { + /* We found something */ + np = SET_EVENT_NUM(fname, i); + if (np < 0 || np >= EV_DEV_NAME_MAXLEN) { + xf86MsgVerb(X_WARNING, verb, "%s: unable to manage event device %d\n", local->name, i); + } else { + goto ProbeFound; + } + } else + xf86MsgVerb(X_WARNING, verb, "%s: no Acecad devices found via sysfs\n", local->name); + } else + xf86MsgVerb(X_WARNING, 4, "%s: libsysfs not found\n", local->name); + +#endif + + if (!ace_name) + ace_name = ace_name_default; + + xf86MsgVerb(X_INFO, verb, "%s: probing event devices for Acecad tablets\n", local->name); + for (i = 0; ; i++) { + int fd = -1; + Bool is_acecad; + + np = SET_EVENT_NUM(fname, i); + if (np < 0 || np >= EV_DEV_NAME_MAXLEN) { + xf86MsgVerb(X_WARNING, verb, "%s: too many devices, giving up %d\n", local->name, i); + break; + } + SYSCALL(fd = open(fname, O_RDONLY)); + if (fd < 0) { + if (errno == ENOENT) { + if (++noent_cnt >= max_skip) + break; + else + continue; + } else { + continue; + } + } + noent_cnt = 0; + have_evdev = TRUE; + is_acecad = fd_query_acecad(fd, ace_name); + SYSCALL(close(fd)); + if (is_acecad) { + goto ProbeFound; + } + } + xf86MsgVerb(X_WARNING, verb, "%s: no Acecad event device found (checked %d nodes, no device name started with '%s')\n", + local->name, i + 1, ace_name); + if (i <= max_skip) + xf86MsgVerb(X_WARNING, verb, "%s: The /dev/input/event* device nodes seem to be missing\n", + local->name); + if (i > max_skip && !have_evdev) + xf86MsgVerb(X_WARNING, verb, "%s: The evdev kernel module seems to be missing\n", local->name); + return FALSE; + +ProbeFound: + xf86Msg(X_PROBED, "%s auto-dev sets device to %s\n", + local->name, fname); + xf86ReplaceStrOption(local->options, "Device", fname); + return TRUE; +} + #endif static InputInfoPtr AceCadPreInit(InputDriverPtr drv, IDevPtr dev, int flags) { - LocalDevicePtr local = xf86AllocateInput(drv, 0); - AceCadPrivatePtr priv = xcalloc (1, sizeof (AceCadPrivateRec)); - int speed; - char *s; + LocalDevicePtr local = xf86AllocateInput(drv, 0); + AceCadPrivatePtr priv = xcalloc (1, sizeof(AceCadPrivateRec)); + int speed; + int msgtype; + char *s; - if ((!local) || (!priv)) - goto SetupProc_fail; + if ((!local) || (!priv)) + goto SetupProc_fail; - memset(priv,0,sizeof (AceCadPrivateRec)); + memset(priv, 0, sizeof(AceCadPrivateRec)); - local->name = dev->identifier; - local->type_name = "AceCad Tablet"; - local->flags = XI86_POINTER_CAPABLE | XI86_SEND_DRAG_EVENTS; - local->motion_history_proc = xf86GetMotionEvents; - local->control_proc = NULL; - local->close_proc = CloseProc; - local->switch_mode = NULL; - local->conversion_proc = ConvertProc; - local->reverse_conversion_proc = ReverseConvertProc; - local->dev = NULL; - local->private = priv; - local->private_flags = 0; - local->conf_idev = dev; - local->device_control = DeviceControl; - /*local->always_core_feedback = 0;*/ - - xf86CollectInputOptions(local, default_options, NULL); + local->name = dev->identifier; + local->type_name = "ACECAD Tablet"; + local->flags = XI86_POINTER_CAPABLE | XI86_SEND_DRAG_EVENTS; +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0 + local->motion_history_proc = xf86GetMotionEvents; +#endif + local->control_proc = NULL; + local->close_proc = CloseProc; + local->switch_mode = NULL; + local->conversion_proc = ConvertProc; + local->reverse_conversion_proc = ReverseConvertProc; + local->dev = NULL; + local->private = priv; + local->private_flags = 0; + local->conf_idev = dev; + local->device_control = DeviceControl; + /*local->always_core_feedback = 0;*/ - xf86OptionListReport(local->options); + xf86CollectInputOptions(local, default_options, NULL); - priv->acecadInc = xf86SetIntOption(local->options, "Increment", 0 ); + xf86OptionListReport(local->options); - local->fd = xf86OpenSerial (local->options); - if (local->fd == -1) - { - xf86Msg(X_ERROR,"AceCad driver unable to open device\n"); - goto SetupProc_fail; - } - xf86ErrorFVerb( 6, "tty port opened successfully\n" ); + priv->acecadInc = xf86SetIntOption(local->options, "Increment", 0 ); + + s = xf86FindOptionValue(local->options, "Device"); + if (!s || (s && (xf86NameCmp(s, "auto-dev") == 0))) { +#ifdef LINUX_INPUT + priv->flags |= AUTODEV_FLAG; + if (!AceCadAutoDevProbe(local, 0)) + { + xf86Msg(X_ERROR, "%s: unable to find device\n", local->name); + goto SetupProc_fail; + } +#else + xf86Msg(X_NOT_IMPLEMENTED, "%s: device autodetection not implemented, sorry\n", local->name); + goto SetupProc_fail; +#endif + } + + local->fd = xf86OpenSerial (local->options); + if (local->fd == -1) + { + xf86Msg(X_ERROR, "%s: unable to open device\n", local->name); + goto SetupProc_fail; + } + xf86ErrorFVerb( 6, "tty port opened successfully\n" ); #ifdef LINUX_INPUT - if(IsUSBLine(local->fd)){ - priv->acecadUSB=1; + if (IsUSBLine(local->fd)) { + priv->flags |= USB_FLAG; - local->read_input = USBReadInput; + local->read_input = USBReadInput; - if (USBQueryHardware(local) != Success) - { - ErrorF ("Unable to query/initialize AceCad hardware.\n"); - goto SetupProc_fail; - } - } else + if (USBQueryHardware(local) != Success) + { + xf86Msg(X_ERROR, "%s: unable to query/initialize hardware (not an %s?).\n", local->name, local->type_name); + goto SetupProc_fail; + } + } else #endif - { - priv->acecadUSB=0; + { + local->read_input = ReadInput; - local->read_input = ReadInput; - - speed = xf86SetIntOption(local->options, "ReportSpeed", 85 ); + msgtype = X_DEFAULT; + if (xf86FindOptionValue(local->options, "ReportSpeed")) { + msgtype = X_CONFIG; + speed = xf86SetIntOption(local->options, "ReportSpeed", 85 ); + } else { + speed = 85; + } - switch (speed) - { - case 120: - priv->acecadReportSpeed = 'Q'; - break; - case 85: - priv->acecadReportSpeed = 'R'; - break; - case 10: - priv->acecadReportSpeed = 'S'; - break; - case 2: - priv->acecadReportSpeed = 'T'; - break; - default: - priv->acecadReportSpeed = 'R'; - speed = 85; - xf86Msg(X_CONFIG, "Acecad Tablet: ReportSpeed possible values:\n 120, 85, 10, 2 \n"); - } + switch (speed) + { + case 120: + priv->acecadReportSpeed = 'Q'; + break; + case 85: + priv->acecadReportSpeed = 'R'; + break; + case 10: + priv->acecadReportSpeed = 'S'; + break; + case 2: + priv->acecadReportSpeed = 'T'; + break; + default: + priv->acecadReportSpeed = 'R'; + speed = 85; + xf86Msg(X_ERROR, "%s: ReportSpeed value %d invalid. Possible values: 120, 85, 10, 2. Defaulting to 85\n", local->name, speed); + msgtype = X_DEFAULT; + } - xf86Msg(X_CONFIG, "Acecad Tablet report %d points/s\n", speed); + xf86Msg(msgtype, "%s report %d points/s\n", local->name, speed); - priv->buffer = XisbNew (local->fd, 200); + priv->buffer = XisbNew (local->fd, 200); - /* - * Verify that hardware is attached and fuctional - */ - if (QueryHardware(priv) != Success) - { - xf86Msg(X_ERROR,"Unable to query/initialize AceCad hardware.\n"); - goto SetupProc_fail; - } - } + /* + * Verify that hardware is attached and fuctional + */ + if (QueryHardware(priv) != Success) + { + xf86Msg(X_ERROR, "%s: unable to query/initialize hardware (not an %s?).\n", local->name, local->type_name); + goto SetupProc_fail; + } + } - s = xf86FindOptionValue(local->options, "Mode"); - if (s && (xf86NameCmp(s, "Relative") == 0)) - { - priv->flags = priv->flags & ~ABSOLUTE_FLAG; - } - else - { - priv->flags = priv->flags | ABSOLUTE_FLAG; - } + s = xf86FindOptionValue(local->options, "Mode"); + msgtype = s ? X_CONFIG : X_DEFAULT; + if (!(s && (xf86NameCmp(s, "relative") == 0))) + { + priv->flags |= ABSOLUTE_FLAG; + } - xf86Msg(X_CONFIG, "Acecad Tablet is in %s mode\n",(priv->flags & ABSOLUTE_FLAG) ? "absolute" : "relative"); - DBG (9, XisbTrace (priv->buffer, 1)); + xf86Msg(msgtype, "%s is in %s mode\n", local->name, (priv->flags & ABSOLUTE_FLAG) ? "absolute" : "relative"); + DBG (9, XisbTrace (priv->buffer, 1)); - local->history_size = xf86SetIntOption(local->options , "HistorySize", 0); + local->history_size = xf86SetIntOption(local->options , "HistorySize", 0); - xf86ProcessCommonOptions(local, local->options); + xf86ProcessCommonOptions(local, local->options); - local->flags |= XI86_CONFIGURED; - - if (local->fd != -1) - { - RemoveEnabledDevice (local->fd); - if (priv->buffer) - { - XisbFree(priv->buffer); - priv->buffer = NULL; - } - xf86CloseSerial(local->fd); - } - RemoveEnabledDevice (local->fd); - local->fd = -1; - return (local); + local->flags |= XI86_CONFIGURED; - /* - * If something went wrong, cleanup and return NULL - */ - SetupProc_fail: - if ((local) && (local->fd)) - xf86CloseSerial (local->fd); - if ((priv) && (priv->buffer)) - XisbFree (priv->buffer); - if (priv) - xfree (priv); - return (NULL); + if (local->fd != -1) + { + RemoveEnabledDevice (local->fd); + if (priv->buffer) + { + XisbFree(priv->buffer); + priv->buffer = NULL; + } + xf86CloseSerial(local->fd); + } + RemoveEnabledDevice (local->fd); + local->fd = -1; + return local; + + /* + * If something went wrong, cleanup and return NULL + */ +SetupProc_fail: + if ((local) && (local->fd)) + xf86CloseSerial (local->fd); + if ((priv) && (priv->buffer)) + XisbFree (priv->buffer); + if (priv) { + xfree (priv); + if (local) + local->private = NULL; + } + xf86DeleteInput(local, 0); + return NULL; } static Bool DeviceControl (DeviceIntPtr dev, int mode) { - Bool RetValue; + Bool RetValue; - switch (mode) - { - case DEVICE_INIT: - DeviceInit (dev); - RetValue = Success; - break; - case DEVICE_ON: - RetValue = DeviceOn( dev ); - break; - case DEVICE_OFF: - RetValue = DeviceOff( dev ); - break; - case DEVICE_CLOSE: - RetValue = DeviceClose( dev ); - break; - default: - RetValue = BadValue; - } + switch (mode) + { + case DEVICE_INIT: + DeviceInit(dev); + RetValue = Success; + break; + case DEVICE_ON: + RetValue = DeviceOn(dev); + break; + case DEVICE_OFF: + RetValue = DeviceOff(dev); + break; + case DEVICE_CLOSE: + RetValue = DeviceClose(dev); + break; + default: + RetValue = BadValue; + } - return( RetValue ); + return RetValue; } static Bool DeviceOn (DeviceIntPtr dev) { - char buffer[256]; - LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; - AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); + char buffer[256]; + LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; + AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); - xf86Msg(X_CONFIG, "Acecad Tablet Device On\n"); + xf86MsgVerb(X_INFO, 4, "%s Device On\n", local->name); - local->fd = xf86OpenSerial(local->options); - if (local->fd == -1) - { - xf86Msg(X_WARNING, "%s: cannot open input device\n", local->name); - return (!Success); - } + local->fd = xf86OpenSerial(local->options); + if (local->fd == -1) + { + xf86Msg(X_WARNING, "%s: cannot open input device %s: %s\n", local->name, xf86FindOptionValue(local->options, "Device"), strerror(errno)); + priv->flags &= ~AVAIL_FLAG; +#ifdef LINUX_INPUT + if ((priv->flags & AUTODEV_FLAG) && AceCadAutoDevProbe(local, 4)) + local->fd = xf86OpenSerial(local->options); + if (local->fd == -1) +#endif + return !Success; + } + priv->flags |= AVAIL_FLAG; - - if (priv->acecadUSB==0){ - priv->buffer = XisbNew(local->fd, 200); - if (!priv->buffer) - { - xf86CloseSerial(local->fd); - local->fd = -1; - return (!Success); - } - /*Rets qu'a l'envoyer a la tablette */ - sprintf(buffer, "%s%c%c%c%c", acecad_initstr, priv->acecadReportSpeed ,ACECAD_INCREMENT, 32 + priv->acecadInc, (priv->flags & ABSOLUTE_FLAG)? ACECAD_ABSOLUTE: ACECAD_RELATIVE); - XisbWrite (priv->buffer, (unsigned char *)buffer, strlen(buffer)); - } - - xf86FlushInput(local->fd); - xf86AddEnabledDevice (local); - dev->public.on = TRUE; - return (Success); + if (!(priv->flags & USB_FLAG)) { + priv->buffer = XisbNew(local->fd, 200); + if (!priv->buffer) + { + xf86CloseSerial(local->fd); + local->fd = -1; + return !Success; + } + + /* Rets qu'a l'envoyer a la tablette */ + sprintf(buffer, "%s%c%c%c%c", acecad_initstr, priv->acecadReportSpeed, ACECAD_INCREMENT, 32 + priv->acecadInc, (priv->flags & ABSOLUTE_FLAG)? ACECAD_ABSOLUTE: ACECAD_RELATIVE); + XisbWrite (priv->buffer, (unsigned char *)buffer, strlen(buffer)); + } + + xf86FlushInput(local->fd); + xf86AddEnabledDevice (local); + dev->public.on = TRUE; + return Success; } static Bool DeviceOff (DeviceIntPtr dev) { - LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; - AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); + LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; + AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); + + xf86MsgVerb(X_INFO, 4, "%s Device Off\n", local->name); + + if (local->fd != -1) + { + RemoveEnabledDevice (local->fd); + if (priv->buffer) + { + XisbFree(priv->buffer); + priv->buffer = NULL; + } + xf86CloseSerial(local->fd); + } - if (local->fd != -1) - { - RemoveEnabledDevice (local->fd); - if (priv->buffer) - { - XisbFree(priv->buffer); - priv->buffer = NULL; - } - xf86CloseSerial(local->fd); - } - - - xf86RemoveEnabledDevice (local); - dev->public.on = FALSE; - return (Success); + xf86RemoveEnabledDevice (local); + dev->public.on = FALSE; + return Success; } static Bool DeviceClose (DeviceIntPtr dev) { - xf86Msg(X_CONFIG, "Acecad Tablet Device Close\n"); - return (Success); + LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; + + xf86MsgVerb(X_INFO, 4, "%s Device Close\n", local->name); + + return Success; } -static void -ControlProc(DeviceIntPtr device, - PtrCtrl *ctrl) +static void +ControlProc(DeviceIntPtr dev, PtrCtrl *ctrl) { - xf86Msg(X_CONFIG, "Acecad Tablet Control Proc\n"); + LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; + + xf86MsgVerb(X_INFO, 4, "%s Control Proc\n", local->name); } static Bool DeviceInit (DeviceIntPtr dev) { - int rx, ry; - LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; - AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); - unsigned char map[] = - {0, 1, 2, 3}; + int rx, ry; + LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; + AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); + unsigned char map[] = + {0, 1, 2, 3}; - xf86Msg(X_CONFIG, "Acecad Tablet Device Init\n"); + xf86MsgVerb(X_INFO, 4, "%s Init\n", local->name); - /* 3 boutons */ - if (InitButtonClassDeviceStruct (dev, 3, map) == FALSE) - { - ErrorF ("Unable to allocate AceCad ButtonClassDeviceStruct\n"); - return !Success; - } + /* 3 boutons */ + if (InitButtonClassDeviceStruct (dev, 3, map) == FALSE) + { + xf86Msg(X_ERROR, "%s: unable to allocate ButtonClassDeviceStruct\n", local->name); + return !Success; + } - if (InitFocusClassDeviceStruct (dev) == FALSE) - { - ErrorF("Unable to allocate AceCad FocusClassDeviceStruct\n"); - return !Success; - } + if (InitFocusClassDeviceStruct (dev) == FALSE) + { + xf86Msg(X_ERROR, "%s: unable to allocate FocusClassDeviceStruct\n", local->name); + return !Success; + } - if (InitPtrFeedbackClassDeviceStruct(dev, - ControlProc) == FALSE) { - ErrorF("unable to init ptr feedback\n"); - return !Success; - } + if (InitPtrFeedbackClassDeviceStruct(dev, ControlProc) == FALSE) { + xf86Msg(X_ERROR, "%s: unable to init ptr feedback\n", local->name); + return !Success; + } - /* 3 axes */ - if (InitValuatorClassDeviceStruct (dev, 3, xf86GetMotionEvents, - local->history_size, - ((priv->flags & ABSOLUTE_FLAG)? Absolute: Relative)|OutOfProximity) - == FALSE) - { - ErrorF ("Unable to allocate AceCad ValuatorClassDeviceStruct\n"); - return !Success; - } - else - { + /* 3 axes */ + if (InitValuatorClassDeviceStruct (dev, 3, xf86GetMotionEvents, + local->history_size, + ((priv->flags & ABSOLUTE_FLAG)? Absolute: Relative)|OutOfProximity) + == FALSE) + { + xf86Msg(X_ERROR, "%s: unable to allocate ValuatorClassDeviceStruct\n", local->name); + return !Success; + } + else + { - InitValuatorAxisStruct(dev, - 0, - 0, /* min val */ - priv->acecadMaxX, /* max val */ - 1000, /* resolution */ - 0, /* min_res */ - 1000); /* max_res */ - InitValuatorAxisStruct(dev, - 1, - 0, /* min val */ - priv->acecadMaxY, /* max val */ - 1000, /* resolution */ - 0, /* min_res */ - 1000); /* max_res */ - InitValuatorAxisStruct(dev, - 2, - 0, /* min val */ - priv->acecadMaxZ, /* max val */ - 1000, /* resolution */ - 0, /* min_res */ - 1000); /* max_res */ + InitValuatorAxisStruct(dev, + 0, + 0, /* min val */ + priv->acecadMaxX, /* max val */ + 1000, /* resolution */ + 0, /* min_res */ + 1000); /* max_res */ + InitValuatorAxisStruct(dev, + 1, + 0, /* min val */ + priv->acecadMaxY, /* max val */ + 1000, /* resolution */ + 0, /* min_res */ + 1000); /* max_res */ + InitValuatorAxisStruct(dev, + 2, + 0, /* min val */ + priv->acecadMaxZ, /* max val */ + 1000, /* resolution */ + 0, /* min_res */ + 1000); /* max_res */ - } + } - if (InitProximityClassDeviceStruct (dev) == FALSE) - { - ErrorF ("Unable to allocate ProximityClassDeviceStruct\n"); - return !Success; - } + if (InitProximityClassDeviceStruct (dev) == FALSE) + { + xf86Msg(X_ERROR, "%s: unable to allocate ProximityClassDeviceStruct\n", local->name); + return !Success; + } - xf86MotionHistoryAllocate (local); + xf86MotionHistoryAllocate (local); - /* On ne peut pas calculer l'increment avant, faute d'ecran pour - connaitre la taille... */ + /* On ne peut pas calculer l'increment avant, faute d'ecran pour + connaitre la taille... */ - if (priv->acecadInc > 95) - priv->acecadInc = 95; - if (priv->acecadInc < 1) - { - /* guess the best increment value given video mode */ - rx=priv->acecadMaxX / screenInfo.screens[0]->width; - ry=priv->acecadMaxY / screenInfo.screens[0]->height; - if (rx < ry) - priv->acecadInc = rx; - else - priv->acecadInc = ry; - if (priv->acecadInc < 1) - priv->acecadInc = 1; - } + if (priv->acecadInc > 95) + priv->acecadInc = 95; + if (priv->acecadInc < 1) + { + /* guess the best increment value given video mode */ + rx = priv->acecadMaxX / screenInfo.screens[0]->width; + ry = priv->acecadMaxY / screenInfo.screens[0]->height; + if (rx < ry) + priv->acecadInc = rx; + else + priv->acecadInc = ry; + if (priv->acecadInc < 1) + priv->acecadInc = 1; + } - xf86Msg(X_CONFIG, "Acecad Tablet Increment: %d\n",priv->acecadInc); + xf86Msg(X_INFO, "%s Increment: %d\n", local->name, priv->acecadInc); - return (Success); + return Success; } static void ReadInput (LocalDevicePtr local) { - int x, y, z; - int prox, buttons; - int is_core_pointer, is_absolute; - AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); + int x, y, z; + int prox, buttons; + int is_core_pointer, is_absolute; + AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); - /*xf86Msg(X_CONFIG, "Acecad Tablet Read Input\n");*/ + /*xf86Msg(X_INFO, "ACECAD Tablet Read Input\n");*/ - is_absolute = (priv->flags & ABSOLUTE_FLAG); - is_core_pointer = xf86IsCorePointer(local->dev); + is_absolute = (priv->flags & ABSOLUTE_FLAG); + is_core_pointer = xf86IsCorePointer(local->dev); - /* - * set blocking to -1 on the first call because we know there is data to - * read. Xisb automatically clears it after one successful read so that - * succeeding reads are preceeded buy a select with a 0 timeout to prevent - * read from blocking indefinately. - */ - XisbBlockDuration (priv->buffer, -1); - - while (AceCadGetPacket (priv) == Success) - { - x = (int)priv->packet[1] | ((int)priv->packet[2] << 7); - y = (int)priv->packet[3] | ((int)priv->packet[4] << 7); + /* + * set blocking to -1 on the first call because we know there is data to + * read. Xisb automatically clears it after one successful read so that + * succeeding reads are preceeded buy a select with a 0 timeout to prevent + * read from blocking indefinately. + */ + XisbBlockDuration (priv->buffer, -1); - if (!(priv->flags & ABSOLUTE_FLAG)) - { - x = priv->packet[0] & XSIGN_BIT? x:-x; - y = priv->packet[0] & YSIGN_BIT? y:-y; - } - else - { - y = priv->acecadMaxY - y ; - } - + while (AceCadGetPacket (priv) == Success) + { + x = (int)priv->packet[1] | ((int)priv->packet[2] << 7); + y = (int)priv->packet[3] | ((int)priv->packet[4] << 7); - z = ((int)priv->packet[5] << 2) | - (((int)priv->packet[6] & 0x01) << 1) | - (((int)priv->packet[6] & 0x10) >> 4); + if (!(priv->flags & ABSOLUTE_FLAG)) + { + x = priv->packet[0] & XSIGN_BIT? x:-x; + y = priv->packet[0] & YSIGN_BIT? y:-y; + } + else + { + y = priv->acecadMaxY - y ; + } - buttons = ((int)priv->packet[0] & 0x07) | - ((int)priv->packet[6] & 0x02 << 2); - prox = (priv->packet[0] & PROXIMITY_BIT)? 0: 1; + z = ((int)priv->packet[5] << 2) | + (((int)priv->packet[6] & 0x01) << 1) | + (((int)priv->packet[6] & 0x10) >> 4); - if (prox) - { - if (!(priv->acecadOldProximity)) - if (!is_core_pointer) - { - /*xf86Msg(X_CONFIG, "Acecad Tablet ProxIN %d %d %d\n",x, y, z);*/ - xf86PostProximityEvent(local->dev, 1, 0, 3 , x, y, z); - } + buttons = ((int)priv->packet[0] & 0x07) | + ((int)priv->packet[6] & 0x02 << 2); - if ((is_absolute && ((priv->acecadOldX != x) || (priv->acecadOldY != y) || (priv->acecadOldZ != z))) - || (!is_absolute && (x || y))) - { - if (is_absolute || priv->acecadOldProximity) - { - /*xf86Msg(X_CONFIG, "Acecad Tablet Motion %d %d %d\n", x, y, z);*/ - xf86PostMotionEvent(local->dev, is_absolute, 0, 3, x, y, z); - } - } + prox = (priv->packet[0] & PROXIMITY_BIT)? 0: 1; - if (priv->acecadOldButtons != buttons) - { - int delta; + if (prox) + { + if (!(priv->acecadOldProximity)) + if (!is_core_pointer) + { + /*xf86Msg(X_INFO, "ACECAD Tablet ProxIN %d %d %d\n",x, y, z);*/ + xf86PostProximityEvent(local->dev, 1, 0, 3 , x, y, z); + } - delta = buttons ^ priv->acecadOldButtons; - while(delta) - { - int id; + if ((is_absolute && ((priv->acecadOldX != x) || (priv->acecadOldY != y) || (priv->acecadOldZ != z))) + || (!is_absolute && (x || y))) + { + if (is_absolute || priv->acecadOldProximity) + { + /*xf86Msg(X_INFO, "ACECAD Tablet Motion %d %d %d\n", x, y, z);*/ + xf86PostMotionEvent(local->dev, is_absolute, 0, 3, x, y, z); + } + } - id=ffs(delta); - delta &= ~(1 << (id-1)); + if (priv->acecadOldButtons != buttons) + { + int delta = buttons ^ priv->acecadOldButtons; + while (delta) + { + int id = ffs(delta); + delta &= ~(1 << (id-1)); - /*xf86Msg(X_CONFIG, "Acecad Tablet Button %d 0x%x\n",id,(buttons&(1<<(id-1))));*/ - xf86PostButtonEvent(local->dev, is_absolute, id, (buttons&(1<<(id-1))), 0, 3, x, y,z); - } - } + /*xf86Msg(X_INFO, "ACECAD Tablet Button %d 0x%x\n",id,(buttons&(1<<(id-1))));*/ + xf86PostButtonEvent(local->dev, is_absolute, id, (buttons&(1<<(id-1))), 0, 3, x, y,z); + } + } - priv->acecadOldButtons = buttons; - priv->acecadOldX = x; - priv->acecadOldY = y; - priv->acecadOldZ = z; - priv->acecadOldProximity = prox; - } - else - { - if (!is_core_pointer) - if (priv->acecadOldProximity) - { - /*xf86Msg(X_CONFIG, "Acecad Tablet ProxOUT %d %d %d\n",x, y, z);*/ - xf86PostProximityEvent(local->dev, 0, 0, 3, x,y,z); - } - priv->acecadOldProximity = 0; - } - } - /*xf86Msg(X_CONFIG, "Acecad Tablet Sortie Read Input\n");*/ + priv->acecadOldButtons = buttons; + priv->acecadOldX = x; + priv->acecadOldY = y; + priv->acecadOldZ = z; + priv->acecadOldProximity = prox; + } + else + { + if (!is_core_pointer) + if (priv->acecadOldProximity) + { + /*xf86Msg(X_INFO, "ACECAD Tablet ProxOUT %d %d %d\n",x, y, z);*/ + xf86PostProximityEvent(local->dev, 0, 0, 3, x,y,z); + } + priv->acecadOldProximity = 0; + } + } + /*xf86Msg(X_INFO, "ACECAD Tablet Sortie Read Input\n");*/ } #ifdef LINUX_INPUT @@ -624,122 +820,145 @@ ReadInput (LocalDevicePtr local) static void USBReadInput (LocalDevicePtr local) { - int len; - struct input_event * event; - char eventbuf[sizeof(struct input_event) * MAX_EVENTS]; - AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); - int x = priv->acecadOldX; - int y = priv->acecadOldY; - int z = priv->acecadOldZ; - int prox = priv->acecadOldProximity; - int buttons = priv->acecadOldButtons; - int is_core_pointer; + int len; + struct input_event * event; + char eventbuf[sizeof(struct input_event) * MAX_EVENTS]; + AceCadPrivatePtr priv = (AceCadPrivatePtr) (local->private); + int x = priv->acecadOldX; + int y = priv->acecadOldY; + int z = priv->acecadOldZ; + int prox = priv->acecadOldProximity; + int buttons = priv->acecadOldButtons; + int is_core_pointer = xf86IsCorePointer(local->dev); + /* Is autodev active? */ + int autodev = priv->flags & AUTODEV_FLAG; + /* Was the device available last time we checked? */ + int avail = priv->flags & AVAIL_FLAG; - is_core_pointer = xf86IsCorePointer(local->dev); + SYSCALL(len = read(local->fd, eventbuf, sizeof(eventbuf))); - SYSCALL(len = read(local->fd, eventbuf, sizeof(eventbuf))); + if (len <= 0) { + if (avail) { + xf86Msg(X_ERROR, "%s: error reading device %s: %s\n", local->name, xf86FindOptionValue(local->options, "Device"), strerror(errno)); + } + if (NOTAVAIL) { + priv->flags &= ~AVAIL_FLAG; + if(autodev) { + if (AceCadAutoDevProbe(local, 4)) { + DeviceOff(local->dev); + DeviceOn(local->dev); + } + } + } + return; + } else { + if (!avail) { + /* If the device wasn't available last time we checked */ + xf86Msg(X_INFO, "%s: device %s is available again\n", local->name, xf86FindOptionValue(local->options, "Device")); + priv->flags |= AVAIL_FLAG; + } + } - if (len <= 0) { - ErrorF("Error reading wacom device : %s\n", strerror(errno)); - return; - } + for (event = (struct input_event *)eventbuf; + event < (struct input_event *)(eventbuf+len); event++) { - for (event=(struct input_event *)eventbuf; - event<(struct input_event *)(eventbuf+len); event++) { - - switch (event->type) { - case EV_ABS: - switch (event->code) { - case ABS_X: - x = event->value; - break; + switch (event->type) { + case EV_SYN: /* 2.6.x */ + if (event->code != SYN_REPORT) + xf86Msg(X_ERROR, "%s: unknown EV_SYN code %d\n", local->name, event->code); + break; + case EV_ABS: + switch (event->code) { + case ABS_X: + x = event->value; + break; - case ABS_Y: - y = event->value; - break; + case ABS_Y: + y = event->value; + break; - case ABS_PRESSURE: - z = event->value; - break; + case ABS_PRESSURE: + z = event->value; + break; - case ABS_MISC: - break; + case ABS_MISC: + break; - } - break; /* EV_ABS */ + } + break; /* EV_ABS */ - case EV_KEY: - switch (event->code) { - case BTN_TOOL_PEN: - prox = event->value; - break; + case EV_KEY: + switch (event->code) { + case BTN_TOOL_PEN: + prox = event->value; + break; - case BTN_TOUCH: - buttons=set_bit(buttons,0,event->value); - break; + case BTN_TOUCH: + buttons = set_bit(buttons,0,event->value); + break; - case BTN_STYLUS: - buttons=set_bit(buttons,1,event->value); - break; + case BTN_STYLUS: + buttons = set_bit(buttons,1,event->value); + break; - case BTN_STYLUS2: - buttons=set_bit(buttons,2,event->value); - break; - } - break; /* EV_KEY */ - default: - xf86Msg(X_ERROR, "UNKNOWN event->code=%d\n", event->code); - } /* switch event->type */ + case BTN_STYLUS2: + buttons = set_bit(buttons,2,event->value); + break; + } + break; /* EV_KEY */ + default: + xf86Msg(X_ERROR, "%s: unknown event type/code %d/%d\n", local->name, event->type, event->code); + } /* switch event->type */ - /* ABS_MISC is the event terminator */ - if (event->type != EV_ABS || event->code != ABS_MISC) { - continue; - } + /* Linux Kernel 2.6.x sends EV_SYN/SYN_REPORT as an event terminator, + * whereas 2.4.x sends EV_ABS/ABS_MISC. We have to support both. + */ + if (!( (event->type == EV_SYN && event->code == SYN_REPORT) || + (event->type == EV_ABS && event->code == ABS_MISC) + )) { + continue; + } - if (prox) - { - if (!(priv->acecadOldProximity)) - if (!is_core_pointer) - { - xf86PostProximityEvent(local->dev, 1, 0, 3 , x, y, z); - } + if (prox) + { + if (!(priv->acecadOldProximity)) + if (!is_core_pointer) + { + xf86PostProximityEvent(local->dev, 1, 0, 3 , x, y, z); + } - xf86PostMotionEvent(local->dev, 1, 0, 3, x, y, z); + xf86PostMotionEvent(local->dev, 1, 0, 3, x, y, z); - if (priv->acecadOldButtons != buttons) - { - int delta; + if (priv->acecadOldButtons != buttons) + { + int delta = buttons ^ priv->acecadOldButtons; + while (delta) + { + int id = ffs(delta); + delta &= ~(1 << (id-1)); - delta = buttons ^ priv->acecadOldButtons; - while(delta) - { - int id; + xf86PostButtonEvent(local->dev, 1, id, (buttons&(1<<(id-1))), 0, 3, x, y,z); + } + } + } + else + { + if (!is_core_pointer) + if (priv->acecadOldProximity) + { + xf86PostProximityEvent(local->dev, 0, 0, 3, x,y,z); + } + priv->acecadOldProximity = 0; + } - id=ffs(delta); - delta &= ~(1 << (id-1)); - - xf86PostButtonEvent(local->dev, 1, id, (buttons&(1<<(id-1))), 0, 3, x, y,z); - } - } - } - else - { - if (!is_core_pointer) - if (priv->acecadOldProximity) - { - xf86PostProximityEvent(local->dev, 0, 0, 3, x,y,z); - } - priv->acecadOldProximity = 0; - } - - priv->acecadOldButtons = buttons; - priv->acecadOldX = x; - priv->acecadOldY = y; - priv->acecadOldZ = z; - priv->acecadOldProximity = prox; - } - /*xf86Msg(X_CONFIG, "Acecad Tablet Sortie Read Input\n");*/ + priv->acecadOldButtons = buttons; + priv->acecadOldX = x; + priv->acecadOldY = y; + priv->acecadOldZ = z; + priv->acecadOldProximity = prox; + } + /*xf86Msg(X_INFO, "ACECAD Tablet Sortie Read Input\n");*/ } #endif @@ -748,25 +967,17 @@ CloseProc (LocalDevicePtr local) { } -/* +/* * The ConvertProc function may need to be tailored for your device. * This function converts the device's valuator outputs to x and y coordinates * to simulate mouse events. */ static Bool -ConvertProc (LocalDevicePtr local, - int first, - int num, - int v0, - int v1, - int v2, - int v3, - int v4, - int v5, - int *x, - int *y) +ConvertProc (LocalDevicePtr local, int first, int num, + int v0, int v1, int v2, int v3, int v4, int v5, + int *x, int *y) { - AceCadPrivatePtr priv = (AceCadPrivatePtr)(local->private); + AceCadPrivatePtr priv = (AceCadPrivatePtr)(local->private); *x = v0 * screenInfo.screens[0]->width / priv->acecadMaxX; *y = v1 * screenInfo.screens[0]->height / priv->acecadMaxY; @@ -775,12 +986,11 @@ ConvertProc (LocalDevicePtr local, static Bool -ReverseConvertProc( LocalDevicePtr local, - int x, - int y, - int *valuators) +ReverseConvertProc (LocalDevicePtr local, + int x, int y, + int *valuators) { - AceCadPrivatePtr priv = (AceCadPrivatePtr)(local->private); + AceCadPrivatePtr priv = (AceCadPrivatePtr)(local->private); valuators[0] = x * priv->acecadMaxX / screenInfo.screens[0]->width; valuators[1] = y * priv->acecadMaxY / screenInfo.screens[0]->height; @@ -790,46 +1000,46 @@ ReverseConvertProc( LocalDevicePtr local, #define WriteString(str)\ -XisbWrite (priv->buffer, (unsigned char *)(str), strlen(str)) + XisbWrite (priv->buffer, (unsigned char *)(str), strlen(str)) static Bool QueryHardware (AceCadPrivatePtr priv) -{ - - /* Reset */ - WriteString("z0"); - - /* Wait */ - milisleep (250); - - /* Prompt Mode in order to not be disturbed */ - WriteString(ACECAD_PROMPT_MODE); - - /* Flush */ - while(XisbRead(priv->buffer)>=0); - - /* Ask for Config packet*/ - WriteString(ACECAD_CONFIG); - - /* Read the packet */ - XisbBlockDuration (priv->buffer, 1000000); - NewPacket (priv); +{ - /*xf86Msg(X_CONFIG, "Acecad Tablet init envoyé \n");*/ + /* Reset */ + WriteString("z0"); - if ((AceCadGetPacket (priv) == Success)) - { - priv->acecadMaxX = (int)priv->packet[1] + ((int)priv->packet[2] << 7); - priv->acecadMaxY = (int)priv->packet[3] + ((int)priv->packet[4] << 7); - priv->acecadMaxZ = 512; - xf86Msg(X_CONFIG, "Acecad Tablet MaxX:%d MaxY:%d\n",priv->acecadMaxX,priv->acecadMaxY); - } - else - return (!Success); - - /*xf86Msg(X_CONFIG, "Acecad Tablet query hardware fini \n");*/ - return (Success); + /* Wait */ + milisleep (250); + + /* Prompt Mode in order to not be disturbed */ + WriteString(ACECAD_PROMPT_MODE); + + /* Flush */ + while (XisbRead(priv->buffer) >= 0); + + /* Ask for Config packet*/ + WriteString(ACECAD_CONFIG); + + /* Read the packet */ + XisbBlockDuration (priv->buffer, 1000000); + NewPacket (priv); + + /*xf86Msg(X_CONFIG, "ACECAD Tablet init envoyé \n");*/ + + if ((AceCadGetPacket (priv) == Success)) + { + priv->acecadMaxX = (int)priv->packet[1] + ((int)priv->packet[2] << 7); + priv->acecadMaxY = (int)priv->packet[3] + ((int)priv->packet[4] << 7); + priv->acecadMaxZ = 512; + xf86Msg(X_PROBED, "ACECAD Tablet MaxX:%d MaxY:%d\n", priv->acecadMaxX, priv->acecadMaxY); + } + else + return !Success; + + /*xf86Msg(X_INFO, "ACECAD Tablet query hardware fini \n");*/ + return Success; } #define BITS_PER_LONG (sizeof(long) * 8) @@ -841,45 +1051,45 @@ QueryHardware (AceCadPrivatePtr priv) #ifdef LINUX_INPUT static Bool USBQueryHardware (LocalDevicePtr local) -{ - AceCadPrivatePtr priv = (AceCadPrivatePtr) local->private; - unsigned long bit[EV_MAX][NBITS(KEY_MAX)]; - int i, j; - int abs[5]; - char name[256] = "Unknown"; +{ + AceCadPrivatePtr priv = (AceCadPrivatePtr) local->private; + unsigned long bit[EV_MAX][NBITS(KEY_MAX)]; + int i, j; + int abs[5]; + char name[256] = "Unknown"; - ioctl(local->fd, EVIOCGNAME(sizeof(name)), name); - xf86Msg(X_CONFIG, "Kernel Input device name: \"%s\"\n", name); + ioctl(local->fd, EVIOCGNAME(sizeof(name)), name); + xf86MsgVerb(X_PROBED, 4, "Kernel Input device name: \"%s\"\n", name); - memset(bit, 0, sizeof(bit)); - ioctl(local->fd, EVIOCGBIT(0, EV_MAX), bit[0]); + memset(bit, 0, sizeof(bit)); + ioctl(local->fd, EVIOCGBIT(0, EV_MAX), bit[0]); for (i = 0; i < EV_MAX; i++) - if (test_bit(i, bit[0])) { - ioctl(local->fd, EVIOCGBIT(i, KEY_MAX), bit[i]); - for (j = 0; j < KEY_MAX; j++) - if (test_bit(j, bit[i])) { - if (i == EV_ABS) { - ioctl(local->fd, EVIOCGABS(j), abs); - switch (j) { - case ABS_X: - priv->acecadMaxX = abs[2]; - break; - - case ABS_Y: - priv->acecadMaxY = abs[2]; - break; - - case ABS_PRESSURE: - priv->acecadMaxZ = abs[2]; - break; - } - } - } - } - - xf86Msg(X_CONFIG, "Acecad Tablet MaxX:%d MaxY:%d MaxZ:%d\n",priv->acecadMaxX,priv->acecadMaxY,priv->acecadMaxZ); - return (Success); + if (test_bit(i, bit[0])) { + ioctl(local->fd, EVIOCGBIT(i, KEY_MAX), bit[i]); + for (j = 0; j < KEY_MAX; j++) + if (test_bit(j, bit[i])) { + if (i == EV_ABS) { + ioctl(local->fd, EVIOCGABS(j), abs); + switch (j) { + case ABS_X: + priv->acecadMaxX = abs[2]; + break; + + case ABS_Y: + priv->acecadMaxY = abs[2]; + break; + + case ABS_PRESSURE: + priv->acecadMaxZ = abs[2]; + break; + } + } + } + } + + xf86Msg(X_PROBED, "ACECAD Tablet MaxX:%d MaxY:%d MaxZ:%d\n", priv->acecadMaxX, priv->acecadMaxY, priv->acecadMaxZ); + return Success; } #endif @@ -892,39 +1102,39 @@ NewPacket (AceCadPrivatePtr priv) static Bool AceCadGetPacket (AceCadPrivatePtr priv) { - int count = 0; - int c = 0; + int count = 0; + int c = 0; - while((c = XisbRead(priv->buffer))>=0 ) - { - - /* - * fail after 500 bytes so the server doesn't hang forever if a - * device sends bad data. - */ - if (count++ > 500) - { - NewPacket (priv); - return (!Success); - } + while((c = XisbRead(priv->buffer)) >= 0 ) + { - if (c & PHASING_BIT) - { - NewPacket(priv); - - /*xf86Msg(X_CONFIG, "Push %2.2x\n",(char) c);*/ - XisbBlockDuration (priv->buffer, 10000); - priv->packet[priv->packeti++] = c; - count=ACECAD_PACKET_SIZE-1; - while(count-- && (c = XisbRead(priv->buffer))>=0) - { - /*xf86Msg(X_CONFIG, "Push %2.2x\n",(char) c);*/ - priv->packet[priv->packeti++] = c; - } - XisbBlockDuration (priv->buffer, 0); - if(c > 0) - return (Success); - } - } - return (!Success); + /* + * fail after 500 bytes so the server doesn't hang forever if a + * device sends bad data. + */ + if (count++ > 500) + { + NewPacket (priv); + return !Success; + } + + if (c & PHASING_BIT) + { + NewPacket(priv); + + /*xf86Msg(X_CONFIG, "Push %2.2x\n",(char) c);*/ + XisbBlockDuration (priv->buffer, 10000); + priv->packet[priv->packeti++] = c; + count = ACECAD_PACKET_SIZE - 1; + while (count-- && (c = XisbRead(priv->buffer)) >= 0) + { + /*xf86Msg(X_INFO, "Push %2.2x\n",(char) c);*/ + priv->packet[priv->packeti++] = c; + } + XisbBlockDuration (priv->buffer, 0); + if(c > 0) + return Success; + } + } + return !Success; } diff --git a/driver/xf86-input-acecad/src/acecad.h b/driver/xf86-input-acecad/src/acecad.h index efb7bfb3e..2f910ea0f 100644 --- a/driver/xf86-input-acecad/src/acecad.h +++ b/driver/xf86-input-acecad/src/acecad.h @@ -25,14 +25,14 @@ */ /* $XFree86: xc/programs/Xserver/hw/xfree86/input/acecad/acecad.h,v 1.2tsi Exp $ */ -#ifndef _ACECAD_H_ +#ifndef _ACECAD_H_ #define _ACECAD_H_ /****************************************************************************** * Definitions * structs, typedefs, #defines, enums *****************************************************************************/ -#define ACECAD_PACKET_SIZE 7 +#define ACECAD_PACKET_SIZE 7 #define ACECAD_CONFIG "a" /* Send configuration (max coords) */ @@ -44,12 +44,12 @@ #define ACECAD_PROMPT_MODE "B" /* Prompt mode */ #define ACECAD_STREAM_MODE "@" /* Stream mode */ #define ACECAD_INCREMENT 'I' /* Set increment */ -#define ACECAD_BINARY_FMT "zb" /* Binary reporting */ +#define ACECAD_BINARY_FMT "zb" /* Binary reporting */ #define ACECAD_PROMPT "P" /* Prompt for current position */ #define PHASING_BIT 0x80 -#define PROXIMITY_BIT 0x40 +#define PROXIMITY_BIT 0x40 #define TABID_BIT 0x20 #define XSIGN_BIT 0x10 #define YSIGN_BIT 0x08 @@ -57,6 +57,11 @@ #define COORD_BITS 0x7f #define ABSOLUTE_FLAG 1 +#define USB_FLAG 2 +#define AUTODEV_FLAG 4 +#define AVAIL_FLAG 8 + +#define NOTAVAIL ((errno == ENODEV) || (errno == ENXIO) || (errno == ENOENT)) #define milisleep(ms) xf86usleep (ms * 1000) @@ -66,7 +71,7 @@ static const char * acecad_initstr = ACECAD_BINARY_FMT ACECAD_STREAM_MODE; typedef struct { - XISBuffer *buffer; + XISBuffer *buffer; int acecadInc; /* increment between transmits */ int acecadOldX; /* previous X position */ int acecadOldY; /* previous Y position */ @@ -76,8 +81,7 @@ typedef struct int acecadMaxX; /* max X value */ int acecadMaxY; /* max Y value */ int acecadMaxZ; /* max Y value */ - char acecadReportSpeed; /* report speed */ - int acecadUSB; /*USB flag*/ + char acecadReportSpeed; /* report speed */ int flags; /* various flags */ int packeti; /* number of bytes read */ int PacketSize; /* number of bytes read */ @@ -109,6 +113,8 @@ static InputInfoPtr AceCadPreInit(InputDriverPtr, IDevPtr , int); static void USBReadInput (LocalDevicePtr); static Bool USBQueryHardware (LocalDevicePtr); static int IsUSBLine(int); +static Bool fd_query_acecad(int, char*); +static Bool AceCadAutoDevProbe(LocalDevicePtr, int); #endif