[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-input-fpit: Changes to 'upstream-unstable'



 .cvsignore      |   19 ----
 .gitignore      |   20 ++++
 configure.ac    |    2 
 man/.cvsignore  |    2 
 man/.gitignore  |    2 
 man/Makefile.am |    1 
 man/fpit.man    |   25 +++--
 readme.txt      |   89 ++++++++-----------
 src/.cvsignore  |    6 -
 src/.gitignore  |    6 +
 src/xf86Fpit.c  |  261 ++++++++++++++++++++++++++++++++++----------------------
 11 files changed, 248 insertions(+), 185 deletions(-)

New commits:
commit 95676d89c7954cc5550ed386b784b470034320cc
Author: Peter Hutterer <peter@cs.unisa.edu.au>
Date:   Wed Jan 30 13:30:59 2008 +1030

    Set is_core_pointer to 0 by default.
    
    Server 1.4 does not do physical core devices.

diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index 81d70a1..5b1d060 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -231,7 +231,7 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 {
 	FpitPrivatePtr priv = (FpitPrivatePtr) local->private;
 	int len, loop;
-	int is_core_pointer = 1;
+	int is_core_pointer = 0;
 	int x, y, buttons, prox;
 	DeviceIntPtr device;
 	int conv_x, conv_y;

commit 01a4da993a2ecd0f017baef49b6e57b82c05316d
Author: Julien Cristau <jcristau@debian.org>
Date:   Mon Jan 14 10:50:54 2008 +1030

    Don't crash with xserver 1.4
    
    xf86IsCorePointer() is gone.

diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index 531b0bd..81d70a1 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -231,7 +231,7 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 {
 	FpitPrivatePtr priv = (FpitPrivatePtr) local->private;
 	int len, loop;
-	int is_core_pointer;
+	int is_core_pointer = 1;
 	int x, y, buttons, prox;
 	DeviceIntPtr device;
 	int conv_x, conv_y;
@@ -319,7 +319,9 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 		prox = (priv->fpitData[loop] & PROXIMITY_BIT) ? 0 : 1;
 		buttons = (priv->fpitData[loop] & BUTTON_BITS);
 		device = local->dev;
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
 		is_core_pointer = xf86IsCorePointer(device);
+#endif
 
 		xf86FpitConvert(local, 0, 2, x, y, 0, 0, 0, 0, &conv_x, &conv_y);
 		xf86XInputSetScreen(local, priv->screen_no, conv_x, conv_y);

commit 2823f7c3f3784a1a398b8d5a9157c2e5263b6285
Author: Peter Hutterer <peter@cs.unisa.edu.au>
Date:   Tue Apr 8 16:00:36 2008 +0930

    Revert "Don't call xf86IsCorePointer."
    
    This reverts commit 9ea880913d5775454311b0257bbaebf773cd4285.

diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index 0378e37..531b0bd 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -231,6 +231,7 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 {
 	FpitPrivatePtr priv = (FpitPrivatePtr) local->private;
 	int len, loop;
+	int is_core_pointer;
 	int x, y, buttons, prox;
 	DeviceIntPtr device;
 	int conv_x, conv_y;
@@ -318,18 +319,15 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 		prox = (priv->fpitData[loop] & PROXIMITY_BIT) ? 0 : 1;
 		buttons = (priv->fpitData[loop] & BUTTON_BITS);
 		device = local->dev;
+		is_core_pointer = xf86IsCorePointer(device);
 
 		xf86FpitConvert(local, 0, 2, x, y, 0, 0, 0, 0, &conv_x, &conv_y);
 		xf86XInputSetScreen(local, priv->screen_no, conv_x, conv_y);
 
 		/* coordinates are ready we can send events */
 
-		if (prox!=priv->fpitOldProximity) { /* proximity changed */
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
-			if (xf86IsCorePointer(device) == 0)
-#endif
-			xf86PostProximityEvent(device, prox, 0, 2, x, y);
-		}
+		if (prox!=priv->fpitOldProximity) /* proximity changed */
+			if (!is_core_pointer) xf86PostProximityEvent(device, prox, 0, 2, x, y);
 
 		if (priv->fpitOldX != x || priv->fpitOldY != y) /* position changed */
 			xf86PostMotionEvent(device, 1, 0, 2, x, y);

commit 164eb7570b10add2087ce293995319798ca3c345
Author: Adam Jackson <ajax@redhat.com>
Date:   Thu Mar 20 15:36:01 2008 -0400

    fpit 1.2.0

diff --git a/configure.ac b/configure.ac
index 693ad9e..7ba075e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -22,7 +22,7 @@
 
 AC_PREREQ(2.57)
 AC_INIT([xf86-input-fpit],
-        1.1.0,
+        1.2.0,
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         xf86-input-fpit)
 

commit f69bd251763ce59102d999c14ee751d4283a73eb
Author: Matthieu Herrb <matthieu@bluenote.herrb.net>
Date:   Sat Mar 8 22:57:19 2008 +0100

    Makefile.am: nuke RCS Id

diff --git a/man/Makefile.am b/man/Makefile.am
index bf7ec17..f0eb29b 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -1,4 +1,3 @@
-# $Id$
 #
 # Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 # 

commit 9ea880913d5775454311b0257bbaebf773cd4285
Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com>
Date:   Tue Feb 5 02:45:34 2008 -0200

    Don't call xf86IsCorePointer.
    
    Check xinput abi version to know if the function is available,
    otherwise run code as if it had returned 0, what should match
    the new API.
    
    Signed-off-by: Peter Hutterer <peter@cs.unisa.edu.au>

diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index 531b0bd..0378e37 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -231,7 +231,6 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 {
 	FpitPrivatePtr priv = (FpitPrivatePtr) local->private;
 	int len, loop;
-	int is_core_pointer;
 	int x, y, buttons, prox;
 	DeviceIntPtr device;
 	int conv_x, conv_y;
@@ -319,15 +318,18 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 		prox = (priv->fpitData[loop] & PROXIMITY_BIT) ? 0 : 1;
 		buttons = (priv->fpitData[loop] & BUTTON_BITS);
 		device = local->dev;
-		is_core_pointer = xf86IsCorePointer(device);
 
 		xf86FpitConvert(local, 0, 2, x, y, 0, 0, 0, 0, &conv_x, &conv_y);
 		xf86XInputSetScreen(local, priv->screen_no, conv_x, conv_y);
 
 		/* coordinates are ready we can send events */
 
-		if (prox!=priv->fpitOldProximity) /* proximity changed */
-			if (!is_core_pointer) xf86PostProximityEvent(device, prox, 0, 2, x, y);
+		if (prox!=priv->fpitOldProximity) { /* proximity changed */
+#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
+			if (xf86IsCorePointer(device) == 0)
+#endif
+			xf86PostProximityEvent(device, prox, 0, 2, x, y);
+		}
 
 		if (priv->fpitOldX != x || priv->fpitOldY != y) /* position changed */
 			xf86PostMotionEvent(device, 1, 0, 2, x, y);

commit 47ecabff271fc1b8dfcc40656934fb70264b7a0e
Author: James Cloos <cloos@jhcloos.com>
Date:   Mon Sep 3 05:52:09 2007 -0400

    Add *~ to .gitignore to skip patch/emacs droppings

diff --git a/.gitignore b/.gitignore
index fb1befd..2df4a8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,4 @@ libtool
 ltmain.sh
 missing
 stamp-h1
+*~

commit e7fc5453728fe5991bef5b55f31319b677a91ce5
Author: James Cloos <cloos@jhcloos.com>
Date:   Thu Aug 23 19:25:26 2007 -0400

    Rename .cvsignore to .gitignore

diff --git a/.cvsignore b/.cvsignore
deleted file mode 100644
index fb1befd..0000000
--- a/.cvsignore
+++ /dev/null
@@ -1,19 +0,0 @@
-Makefile
-Makefile.in
-*.la
-*.lo
-aclocal.m4
-autom4te.cache
-config.guess
-config.h
-config.h.in
-config.log
-config.status
-config.sub
-configure
-depcomp
-install-sh
-libtool
-ltmain.sh
-missing
-stamp-h1
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..fb1befd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,19 @@
+Makefile
+Makefile.in
+*.la
+*.lo
+aclocal.m4
+autom4te.cache
+config.guess
+config.h
+config.h.in
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+libtool
+ltmain.sh
+missing
+stamp-h1
diff --git a/man/.cvsignore b/man/.cvsignore
deleted file mode 100644
index 282522d..0000000
--- a/man/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/man/.gitignore b/man/.gitignore
new file mode 100644
index 0000000..282522d
--- /dev/null
+++ b/man/.gitignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/src/.cvsignore b/src/.cvsignore
deleted file mode 100644
index 9730646..0000000
--- a/src/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.deps
-.libs
-Makefile
-Makefile.in
-*.la
-*.lo
diff --git a/src/.gitignore b/src/.gitignore
new file mode 100644
index 0000000..9730646
--- /dev/null
+++ b/src/.gitignore
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.la
+*.lo

commit 39a7bdaa21b792cf351fb361be0aa05a3012d620
Author: Brice Goglin <bgoglin@debian.org>
Date:   Mon Aug 6 23:16:37 2007 +0200

    Use PACKAGE_VERSION_MAJOR/MINOR/PATCHLEVEL in version_rec

diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index 99d8bdb..531b0bd 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -650,7 +650,15 @@ static void Unplug(pointer p)
 }
 
 static XF86ModuleVersionInfo version_rec = {
-	"fpit", MODULEVENDORSTRING, MODINFOSTRING1, MODINFOSTRING2, XORG_VERSION_CURRENT, 1, 1, 0, ABI_CLASS_XINPUT, ABI_XINPUT_VERSION, MOD_CLASS_XINPUT, 
+	"fpit",
+	MODULEVENDORSTRING,
+	MODINFOSTRING1,
+	MODINFOSTRING2,
+	XORG_VERSION_CURRENT,
+	PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL,
+	ABI_CLASS_XINPUT,
+	ABI_XINPUT_VERSION,
+	MOD_CLASS_XINPUT, 
 	{0, 0, 0, 0}
 };
 

commit cb6adfe32f929e57eedcab189e9f359fc9e970ab
Author: Justin Blanchard <justinb04@aim.com>
Date:   Tue Jan 30 20:15:50 2007 -0500

    update from Justin Blanchard - part 3
    
    * Adds support for detecting/responding to screen resize and rotate events
    (i.e., fixing bug 3421 for FPIT users). This corrects both cursor-related and
    extended events.
    * The fix is disabled unless the user adds 'Option "TrackRandR"' to the
    InputDevice section. This is to avoid breaking setups where some nightmarish
    workaround was already in place.
    * Use of RRGetRotation may break driver under XFree86. If this is a problem I
    think xf86GetRotation can be used instead.

diff --git a/man/fpit.man b/man/fpit.man
index 4964dbe..1809d2b 100644
--- a/man/fpit.man
+++ b/man/fpit.man
@@ -80,6 +80,7 @@ Swap the X and Y axis (after inversions).
 .B Option \fI"Rotate"\fP \fI"CWW"\fP
 Manipulate the invert and swap options to match screen
 rotations. (Will behave strangely if combined with invert or swap options.)
+New users should consider the \fI"TrackRandR"\fP option instead.
 .TP 4
 .B Option \fI"DeviceName"\fP \fI"name"\fP
 .B Option \fI"DeviceName"\fP \fI"name"\fP
@@ -101,6 +102,9 @@ changes the serial link speed.
 .TP 4
 .B Option \fI"Passive"\fP
 decodes the passive pen.
+.B Option \fI"TrackRandR"\fP
+automatically keeps the cursor synchronized with the pen's position, even when
+the screen is resized or rotated. (Recommended for tablet PC's.)
 .RE
 
 Example, for Stylistic LT setup is:
@@ -109,6 +113,7 @@ Example, for Stylistic LT setup is:
 .BI "  Identifier \*q" mouse0 \*q
 .B  "  Driver \*qfpit\*q"
 .BI "  Option \*qDevice\*q   \*q"/dev/ttyS3 \*q
+.BI "  # Option \*qTrackRandR\*q"
 .B EndSection
 .fi
 
@@ -124,6 +129,7 @@ And for other Stylistic devices try:
 .BI "  Option \*qMinimumXPosition\*q \*q"130 \*q
 .BI "  Option \*qMinimumYPosition\*q \*q"0 \*q
 .BI "  Option \*qInvertY\*q"
+.BI "  # Option \*qTrackRandR\*q"
 .B EndSection
 .fi
 
@@ -140,6 +146,7 @@ For Stylistic 3400:
 .BI "  Option \*qMinimumYPosition\*q \*q"0 \*q
 .BI "  Option \*qPassive\*q"
 .BI "  Option \*qSendCoreEvents\*q"
+.BI "  # Option \*qTrackRandR\*q"
 .B EndSection
 .fi
 
diff --git a/readme.txt b/readme.txt
index 075c52e..3e6051c 100644
--- a/readme.txt
+++ b/readme.txt
@@ -78,6 +78,9 @@ Section "InputDevice"
 	Option		"InvertY"
 	# For a passive pen, e.g. Stylistic 3400
 	Option		"Passive"
+	# To make the touchscreen respond automatically to
+	# resolution changes and screen rotation:
+	Option		"TrackRandR"
 EndSection
 
 6. Remember to add this Input Device to the server description (Near the end of the file.)
@@ -142,8 +145,6 @@ Bugs and Needed Work:
 
 (See above)
 
-X rotation (Portrait mode is not supported). -- I plan to add this soon.
-
 Adjusting the constants in the XF86Config(-4) is teedious and requires
 multiple restarts of the X Window system.  -- Somebody PLEASE write a
 calibration program !
diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index 636d6d0..99d8bdb 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -66,6 +66,7 @@
 #  include <xf86_OSproc.h>
 #  include <xf86Xinput.h>
 #  include <exevents.h>
+#  include <randrstr.h>
 
 #  include <xf86Module.h>
 
@@ -98,6 +99,20 @@
 /*
  ***************************************************************************
  *
+ * Screen orientation descriptors.
+ *
+ ***************************************************************************
+ */
+
+typedef enum {
+	FPIT_INVERT_X     = 0x01,
+	FPIT_INVERT_Y     = 0x02,
+	FPIT_THEN_SWAP_XY = 0x04
+} FpitOrientation;
+
+/*
+ ***************************************************************************
+ *
  * Device private records.
  *
  ***************************************************************************
@@ -106,6 +121,7 @@ typedef struct {
 	char *fpitDev;		/* device file name */
 	int screen_width;
 	int screen_height;
+	Rotation screen_rotation;
 	int screen_no;
 	int fpitOldX;		/* previous X position */
 	int fpitOldY;		/* previous Y position */
@@ -115,12 +131,14 @@ typedef struct {
 	int fpitMinY;		/* min Y value */
 	int fpitMaxX;		/* max X value */
 	int fpitMaxY;		/* max Y value */
-	int fpitInvX;		/* Invert X axis */
-	int fpitInvY;		/* Invert Y axis */
 	int fpitIndex;		/* number of bytes read */
 	unsigned char fpitData[BUFFER_SIZE];	/* data read on the device */
-	int fpitSwapXY;		/* swap X and Y values */
+	FpitOrientation fpitBaseOrientation;	/* read from X config */
+	FpitOrientation fpitTotalOrientation;	/* above + RandR */
 	int fpitPassive;	/* translate passive buttons */
+	int fpitTrackRandR;	/* check for, react to screen rotate/resize */
+	/* XXX when this last option is unset, we provide "compatibly stupid"
+	 * behavior. */
 } FpitPrivateRec, *FpitPrivatePtr;
 
 
@@ -139,21 +157,73 @@ typedef struct {
 static Bool xf86FpitConvert(LocalDevicePtr local, int first, int num, int v0, int v1, int v2, int v3, int v4, int v5, int *x, int *y)
 {
 	FpitPrivatePtr priv = (FpitPrivatePtr) local->private;
+	AxisInfoPtr axes = local->dev->valuator->axes;
 	if (first != 0 || num != 2) {
 		return FALSE;
 	}
 
-	if (priv->fpitSwapXY != 0) {
-		*x = xf86ScaleAxis(v1, 0, priv->screen_width, priv->fpitMinY, priv->fpitMaxY);
-		*y = xf86ScaleAxis(v0, 0, priv->screen_height, priv->fpitMinX, priv->fpitMaxX);
-	} else {
-		*x = xf86ScaleAxis(v0, 0, priv->screen_width, priv->fpitMinX, priv->fpitMaxX);
-		*y = xf86ScaleAxis(v1, 0, priv->screen_height, priv->fpitMinY, priv->fpitMaxY);
-	}
+	*x = xf86ScaleAxis(v0, 0, priv->screen_width, axes[0].min_value, axes[0].max_value);
+	*y = xf86ScaleAxis(v1, 0, priv->screen_height, axes[1].min_value, axes[1].max_value);
+
 	return TRUE;
 }
 
 /*
+ ***************************************************************************
+ *
+ * xf86FpitSetUpAxes --
+ *	Based on current screen resolution and, if RandR support is enabled,
+ *	current rotation state, set up the XInput axes and orientation info.
+ *
+ ***************************************************************************
+ */
+
+static void xf86FpitSetUpAxes(DeviceIntPtr dev, FpitPrivatePtr priv)
+{
+	/*
+	 * Device reports motions on 2 axes in absolute coordinates.
+	 * Axes min and max values are reported in raw coordinates.
+	 * Resolution is computed roughly by the difference between
+	 * max and min values scaled from the approximate size of the
+	 * screen to fit one meter.
+	 */
+	int quarter_turns;
+
+	priv->screen_width = screenInfo.screens[priv->screen_no]->width;
+	priv->screen_height = screenInfo.screens[priv->screen_no]->height;
+
+	priv->fpitTotalOrientation = priv->fpitBaseOrientation;
+	if (!priv->fpitTrackRandR)
+		return;
+
+	/* now apply transforms specified by RandR:
+	 * slightly complicated because invertX/Y and swapXY don't commute. */
+	priv->screen_rotation = RRGetRotation(screenInfo.screens[priv->screen_no]);
+	quarter_turns = (
+		(priv->screen_rotation & RR_Rotate_90  ? 1 : 0) +
+		(priv->screen_rotation & RR_Rotate_180 ? 2 : 0) +
+		(priv->screen_rotation & RR_Rotate_270 ? 3 : 0) ) % 4;
+	if (quarter_turns / 2 != 0)
+		priv->fpitTotalOrientation ^= FPIT_INVERT_X | FPIT_INVERT_Y;
+	if (quarter_turns % 2 != 0) {
+		priv->fpitTotalOrientation ^=
+		    (priv->fpitTotalOrientation & FPIT_THEN_SWAP_XY ? FPIT_INVERT_X : FPIT_INVERT_Y)
+		    | FPIT_THEN_SWAP_XY;
+	}
+
+	if (priv->fpitTotalOrientation & FPIT_THEN_SWAP_XY) {
+		InitValuatorAxisStruct(dev, 1, priv->fpitMinX, priv->fpitMaxX, 9500, 0 /* min_res */ ,
+				       9500 /* max_res */ );
+		InitValuatorAxisStruct(dev, 0, priv->fpitMinY, priv->fpitMaxY, 10500, 0 /* min_res */ ,
+				       10500 /* max_res */ );
+	} else {
+		InitValuatorAxisStruct(dev, 0, priv->fpitMinX, priv->fpitMaxX, 9500, 0 /* min_res */ ,
+				       9500 /* max_res */ );
+		InitValuatorAxisStruct(dev, 1, priv->fpitMinY, priv->fpitMaxY, 10500, 0 /* min_res */ ,
+				       10500 /* max_res */ );
+	}
+}
+/*
 ** xf86FpitReadInput
 ** Reads from the Fpit and posts any new events to the server.
 */
@@ -166,6 +236,13 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 	DeviceIntPtr device;
 	int conv_x, conv_y;
 	
+	if (priv->fpitTrackRandR && (
+		priv->screen_width  != screenInfo.screens[priv->screen_no]->width  ||
+		priv->screen_height != screenInfo.screens[priv->screen_no]->height ||
+		priv->screen_rotation != RRGetRotation(screenInfo.screens[priv->screen_no])
+	))
+		xf86FpitSetUpAxes(local->dev, priv);
+
   do { /* keep reading blocks until there are no more */
 
 	/* Read data into buffer */
@@ -230,11 +307,15 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 
 		x = (int) (priv->fpitData[loop + 1] & 0x7f) + ((int) (priv->fpitData[loop + 2] & 0x7f) << 7);
 		y = (int) (priv->fpitData[loop + 3] & 0x7f) + ((int) (priv->fpitData[loop + 4] & 0x7f) << 7);
-		/* Add in any offsets */
-		if (priv->fpitInvX)
+		/* Adjust to orientation */
+		if (priv->fpitTotalOrientation & FPIT_INVERT_X)
 			x = priv->fpitMaxX - x + priv->fpitMinX;
-		if (priv->fpitInvY)
+		if (priv->fpitTotalOrientation & FPIT_INVERT_Y)
 			y = priv->fpitMaxY - y + priv->fpitMinY;
+		if (priv->fpitTotalOrientation & FPIT_THEN_SWAP_XY) {
+			int z = x; x = y; y = z;
+		}
+
 		prox = (priv->fpitData[loop] & PROXIMITY_BIT) ? 0 : 1;
 		buttons = (priv->fpitData[loop] & BUTTON_BITS);
 		device = local->dev;
@@ -334,8 +415,6 @@ static Bool xf86FpitControl(DeviceIntPtr dev, int mode)
 			if (priv->screen_no >= screenInfo.numScreens || priv->screen_no < 0) {
 				priv->screen_no = 0;
 			}
-			priv->screen_width = screenInfo.screens[priv->screen_no]->width;
-			priv->screen_height = screenInfo.screens[priv->screen_no]->height;
 			/*
 			 * Device reports button press for up to 3 buttons.
 			 */
@@ -353,22 +432,11 @@ static Bool xf86FpitControl(DeviceIntPtr dev, int mode)
 				ErrorF("Unable to allocate PtrFeedBackClassDeviceStruct\n");
 			}
 	      
-			/*
-			 * Device reports motions on 2 axes in absolute coordinates.
-			 * Axes min and max values are reported in raw coordinates.
-			 * Resolution is computed roughly by the difference between
-			 * max and min values scaled from the approximate size of the
-			 * screen to fit one meter.
-			 */
 			if (InitValuatorClassDeviceStruct(dev, 2, xf86GetMotionEvents, local->history_size, Absolute) == FALSE) {
 				ErrorF("Unable to allocate Fpit touchscreen ValuatorClassDeviceStruct\n");
 				return !Success;
-			} else {
-				InitValuatorAxisStruct(dev, 0, priv->fpitMinX, priv->fpitMaxX, 9500, 0 /* min_res */ ,
-						       9500 /* max_res */ );
-				InitValuatorAxisStruct(dev, 1, priv->fpitMinY, priv->fpitMaxY, 10500, 0 /* min_res */ ,
-						       10500 /* max_res */ );
 			}
+			xf86FpitSetUpAxes(dev, priv);
 
 			if (InitFocusClassDeviceStruct(dev) == FALSE) {
 				ErrorF("Unable to allocate Fpit touchscreen FocusClassDeviceStruct\n");
@@ -451,6 +519,7 @@ static LocalDevicePtr xf86FpitAllocate(InputDriverPtr drv)
 	priv->screen_no = 0;
 	priv->screen_width = -1;
 	priv->screen_height = -1;
+	priv->screen_rotation = RR_Rotate_0;
 	priv->fpitMinX = FPIT_MIN_X;
 	priv->fpitMaxX = FPIT_MAX_X;
 	priv->fpitMinY = FPIT_MIN_Y;
@@ -459,7 +528,6 @@ static LocalDevicePtr xf86FpitAllocate(InputDriverPtr drv)
 	priv->fpitOldButtons = 0;
 	priv->fpitOldProximity = 0;
 	priv->fpitIndex = 0;
-	priv->fpitSwapXY = 0;
 	priv->fpitPassive = 0;
 	local->name = XI_TOUCHSCREEN;
 	local->flags = 0 /* XI86_NO_OPEN_ON_INIT */ ;
@@ -533,29 +601,33 @@ static InputInfoPtr xf86FpitInit(InputDriverPtr drv, IDevPtr dev, int flags)
 	xf86Msg(X_CONFIG, "FPIT maximum y position: %d\n", priv->fpitMaxY);
 	priv->fpitMinY = xf86SetIntOption(local->options, "MinimumYPosition", FPIT_MIN_Y);
 	xf86Msg(X_CONFIG, "FPIT minimum y position: %d\n", priv->fpitMinY);
-	priv->fpitInvX = xf86SetBoolOption(local->options, "InvertX", 0);
-	priv->fpitInvY = xf86SetBoolOption(local->options, "InvertY", 0);
-	priv->fpitSwapXY = xf86SetBoolOption(local->options, "SwapXY", 0);
+
+	priv->fpitBaseOrientation = 0;
+	if (xf86SetBoolOption(local->options, "InvertX", 0))
+		priv->fpitBaseOrientation |= FPIT_INVERT_X;
+	if (xf86SetBoolOption(local->options, "InvertY", 0))
+		priv->fpitBaseOrientation |= FPIT_INVERT_Y;
+	if (xf86SetBoolOption(local->options, "SwapXY", 0))
+		priv->fpitBaseOrientation |= FPIT_THEN_SWAP_XY;
 	priv->fpitPassive = xf86SetBoolOption(local->options, "Passive", 0);
+	priv->fpitTrackRandR = xf86SetBoolOption(local->options, "TrackRandR", 0);
+	/* XXX "Rotate" option provides compatibly stupid behavior. JEB. */
 	str = xf86SetStrOption(local->options, "Rotate", 0);
-	if (!xf86NameCmp(str, "CW")) {
-		priv->fpitInvX = 1;
-		priv->fpitInvY = 1;
-		priv->fpitSwapXY = 1;
-	} else if (!xf86NameCmp(str, "CCW")) {
-		priv->fpitInvX = 0;
-		priv->fpitInvY = 0;
-		priv->fpitSwapXY = 1;
-	}
-	xf86Msg(X_CONFIG, "FPIT invert X axis: %s\n", priv->fpitInvX ? "Yes" : "No");
-	xf86Msg(X_CONFIG, "FPIT invert Y axis: %s\n", priv->fpitInvY ? "Yes" : "No");
-	xf86Msg(X_CONFIG, "FPIT swap X and Y axis: %s\n", priv->fpitSwapXY ? "Yes" : "No");
+	if (!xf86NameCmp(str, "CW"))
+		priv->fpitBaseOrientation |= FPIT_INVERT_X | FPIT_INVERT_Y | FPIT_THEN_SWAP_XY;
+	else if (!xf86NameCmp(str, "CCW"))
+		priv->fpitBaseOrientation |= FPIT_THEN_SWAP_XY;
+	xf86Msg(X_CONFIG, "FPIT invert X axis: %s\n", priv->fpitBaseOrientation & FPIT_INVERT_X ? "Yes" : "No");
+	xf86Msg(X_CONFIG, "FPIT invert Y axis: %s\n", priv->fpitBaseOrientation & FPIT_INVERT_Y ? "Yes" : "No");
+	xf86Msg(X_CONFIG, "FPIT swap X and Y axis: %s\n", priv->fpitBaseOrientation & FPIT_THEN_SWAP_XY ? "Yes" : "No");
 	xf86Msg(X_CONFIG, "FPIT Passive button mode: %s\n", priv->fpitPassive ? "Yes" : "No");
+	xf86Msg(X_CONFIG, "FPIT RandR tracking: %s\n", priv->fpitTrackRandR ? "Yes" : "No");
 	/* mark the device configured */
 	local->flags |= XI86_CONFIGURED;
 	return local;
 }
 
+
 _X_EXPORT InputDriverRec FPIT = {
 	1,			/* driver version */
 	"fpit",			/* driver name */

commit 979c283a6ecb1ba718790a147b3e910a106cb473
Author: Justin Blanchard <justinb04@aim.com>
Date:   Tue Jan 30 20:13:52 2007 -0500

    update from Justin Blanchard - part 2
    
    * Fix a bug that prevents active-pen users from right-clicking while hovering.
    * Bug was introduced with passive pen support; fix is simple and has been
    recommended in forums since Oct 2006
    (http://ubuntuforums.org/showpost.php?p=1620646&postcount=15).
    For some reason I don't see a bug report for the issue.

diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index d0b9fe3..636d6d0 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -262,11 +262,9 @@ static void xf86FpitReadInput(LocalDevicePtr local)
 			if (buttons & SW2) buttons=0; /* the pen was lifted, so no buttons are pressed */
 			else if (buttons & SW3) buttons=SW3; /* the "right mouse" button was pressed, so send down event */
 			else if (prox) buttons=SW1; /* the "left mouse" button was pressed and we are not hovering, so send down event */
-			else buttons=0; /* We are in hover mode, so no buttons */
-		}
-		else { /* the active pen's buttons map directly to the mouse buttons */
-			if (!prox) buttons=0; /* We are in hover mode, so no buttons */
+			else buttons=0; /* We are in hover mode, so not left-clicking. */
 		}
+		/* the active pen's buttons map directly to the mouse buttons. Right-click may happen even in hover mode. */
 	
 		/* DBG(2, ErrorF("%02d/%02d Prox=%d SW:%x Buttons:%x->%x (%d, %d)\n",
 			loop,priv->fpitIndex,prox,priv->fpitData[loop]&BUTTON_BITS,priv->fpitOldButtons,buttons,x,y));*/

commit 4b06c8f70e8b1d6cfaeb41e1584f9efcfef83bb0
Author: Justin Blanchard <justinb04@aim.com>
Date:   Tue Jan 30 20:12:07 2007 -0500

    Updates from Justin Blanchard - patch 1
    
    * Make the docs reflect more accurately what the code actually does.
    * Update the docs: remove material specific to XFree86 3.x/4.0. Re-organize to
    reflect the wider variety of machines that use this device. Change the link to
    linuxslate.com. Expand troubleshooting section.
    * Code cleanup: assorted trivial changes.

diff --git a/man/fpit.man b/man/fpit.man
index fba0e6f..4964dbe 100644
--- a/man/fpit.man
+++ b/man/fpit.man
@@ -23,11 +23,15 @@ driver functions as a pointer input device, and may be used as the
 X server's core pointer.
 .SH SUPPORTED HARDWARE
 This driver supports the touchscreen of the Stylistic LT and (with
-special options) of the Stylistic 500, 1000 and 2300.
+special options) of the Stylistic 500, 1000, 1200, 2300, and 3400.
+Modern FinePoint MP800 devices will also work with this driver.
 
-Under Linux the Fujitsus serial port is not, by default, detected.
-Therefore the following must be added to one of your start-up scripts.
-(Either one of the X scripts, or to rc.local or similar).
+Under Linux the Fujitsu's serial port is not, by default, detected.
+Therefore the port must be configured manually as described in the
+accompanying readme.txt file.
+
+For example, add the following to your startup scripts for Stylistic xx00
+devices:
 
 .TP 4
 .B setserial /dev/ttyS3 autoconfig
@@ -70,12 +74,12 @@ Same as for X axis, but for Y axis.
 Invert the specified axis.
 .TP 4
 .B Option \fI"SwapXY"\fP
-Swap the X and Y axis.
+Swap the X and Y axis (after inversions).
 .TP 4
 .B Option \fI"Rotate"\fP \fI"CW"\fP
 .B Option \fI"Rotate"\fP \fI"CWW"\fP
 Manipulate the invert and swap options to match screen
-rotations.
+rotations. (Will behave strangely if combined with invert or swap options.)
 .TP 4
 .B Option \fI"DeviceName"\fP \fI"name"\fP
 .B Option \fI"DeviceName"\fP \fI"name"\fP
@@ -92,7 +96,7 @@ enabled for any other value.
 .B Option \fI"DebugLevel"\fP \fInumber \fP
 sets the level of debugging info reported.
 .TP 4
-.B Option \fI"BaudRate"\fP \fI"38400"\fP, \fI"19200"\fP or \fI"9600"\fP (default)
+.B Option \fI"BaudRate"\fP \fI"38400"\fP, \fI"19200"\fP (default) or \fI"9600"\fP
 changes the serial link speed.
 .TP 4
 .B Option \fI"Passive"\fP
diff --git a/readme.txt b/readme.txt
index fd0990c..075c52e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,15 +1,8 @@
 xf86Fpit.c
 (and associated files).
 
-Documentation updated by John Apfelbaum, linuxslate.com Oct 2001
-
-***    P L E A S E     N O T E    ***
-*  Due to a Hardrive failure, the version of this driver that was previously
-*  on the linuxslate.com website was lost. This is a version came from a
-*  directory on my development system that was marked "Works", and I belive it
-*  to be the latest version I worked on (about a year ago), but I have not had
-*  time to build from this source and verify this driver.
-***
+Last updated Jan 2007
+This information applies to version 1.1.0 of this driver.
 
 Supported Hardware:
 
@@ -19,6 +12,8 @@ Supported Hardware:
 	Fujistu Stylistic 1000  (Should Work)
 	Fujistu Stylistic 1200  (Should Work)
 	Fujistu Stylistic 2300  (Should Work)
+	Fujitsu Stylistic 3400  (and possibly other passive-pen systems)
+	FinePoint MP800
 
 History and Contributors:
 
@@ -30,9 +25,11 @@ History and Contributors:
    project into the XFree86 4.0.2 Elographics driver by Patrick Lecoanet.
 -  John Apfelbaum continuted the work to produce a working XFree86 4.0.x driver for the
    Stylistic 1200.  
--  David Clay added support for Stylistic 3400 passive pen.
+-  David Clay added support for Stylistic 3400 passive pen, and possibly
+   others. (Also fixed processing of all packets, and enabled right mouse button.)
 
-Please visit http://linuxslate.com for the latest information.
+Please visit http://webcvs.freedesktop.org/xorg/driver/xf86-input-fpit/ for the
+latest version of this driver.
 
 License:
 
@@ -52,73 +49,53 @@ Please visit http://XFree86.org for license information.
 
 Installation:
 
-THIS RELEASE IS FOR XFree86 Version 4.0.2. Hopefully it will also work
-with other Version 4 systems. The source is written so that hopefully
-it can be compiled under 3.3.6 - THIS HAS NOT BEEN TESTED (yet).
-
-Copied from original xf86fpit.c readme:
-
 1.  Install and configure Linux w/o consideration of the digitizer tablet.
 2.  Get X working the way you want it. 
-3.  Add or Change your appropriate startup scripts to include:
+3.  Set up a serial device to be initialized at startup.
+    Modify /etc/serial.conf if your distribution uses it. Otherwise
+    add or modify your appropriate startup scripts to include:
 
 setserial /dev/ttyS3 autoconfig
-setserial /dev/ttyS3 IRQ 15 baud_base 115200
-(Some models may also have to specify:  port 0xfce8)
+setserial /dev/ttyS3 port ??? IRQ ?? baud_base 115200 [uart 16450]
 
-
-New/Different for Ver 4.0.2
+The uart setting may be necessary for the device to work.
+See below for appropriate port/IRQ values.
 
 4.  Copy fpit_drv.o to /usr/X11R6/lib/modules/input
 
-5.  Add the following to your XF86Config(-4) file:
+5.  Add the following to your X config file (XF86Config/XF86Config-4/xorg.conf)
 
 Section "InputDevice"
 	Identifier	"mouse0"
 	Driver		"fpit"
 	Option		"Device"	"/dev/ttyS3"
+	# These may need tweaking; see below.
 	Option		"BaudRate"	"19200"
 	Option		"MaximumXPosition"	"6250"
 	Option		"MaximumYPosition"	"4950"
 	Option		"MinimumXPosition"	"130"
 	Option		"MinimumYPosition"	"0"
 	Option		"InvertY"
+	# For a passive pen, e.g. Stylistic 3400
+	Option		"Passive"
 EndSection
 
 6. Remember to add this Input Device to the server description (Near the end of the file.)
 
 7. Start or restart X.
 
-8. If required adjust the Min/Max X/Y positions so that the pointer
+8. If required adjust the baud rate and Min/Max X/Y positions so that the pointer
    tracks the pen correctly.
 
+For Fujitsu Stylistic xx00 models, try IRQ 15, with port either unspecified
+ or set to 0xfce8.
 
-New for Ver 4.5.0
-
- * supports Stylistic 3400 (and possibly other passive-pen systems)
- * Fixed processing of all packets
- * Fixed hover-mode pointer movement
- * Added Passive parameter for passive displays
- * Added switch 3 for "right" mouse button
-
-Try this serial configuration for the 3400:
+For Fujitsu Stylistic 3400 models, try IRQ 4 and port 0xfd68.
+ Recommended X config settings are BaudRate 9600, Min X/Y 0, MaxX 4070, MaxY 4020.
 
-setserial /dev/ttyS3 autoconfig
-setserial /dev/ttyS3 uart 16450 irq 5 port 0xfd68
-
-Try this config for the 3400:
-Section "InputDevice"
-    Identifier "mouse0"
-    Driver     "fpit"       
-    Option     "Device"   "/dev/ttyS3"
-    Option     "BaudRate" "9600"   
-    Option     "Passive"
-    Option     "MaximumXPosition" "4070"  
-    Option     "MaximumYPosition" "4020"  
-    Option     "MinimumXPosition" "0"     
-    Option     "MinimumYPosition" "0"  
-    Option     "SendCoreEvents"
-EndSection
+In general you may wish to consult /proc/ioports or /sys/devices/pnp0/*
+(under Linux 2.6) for serial information. BaudRate should generally be 9600,
+19200, or 38400.
 
 
 Hints if you are having problems (Thanks to Aron Hsiao):
@@ -135,6 +112,8 @@ This should be re-stating the defaults, but Aron Hsiao agrees that it appears
 to be an XFree86 4.x bug. 
 
 Problem 2:  X Server crash during GUI startup (Particularly Gnome). 
+            Or: programs using high-resolution pen tracking via XInput
+            don't work.
 
 Solution:   You must have a regular mouse defined as the default pointer
 	    even if no mouse is used.  During startup, Gnome attempts to
@@ -142,6 +121,10 @@ Solution:   You must have a regular mouse defined as the default pointer
 	    pendrivers are absolute pointers, and acceleration is meaningless,
 	    they do not take well to attempts to set it :-)
 
+	    Additionally, setting the tablet as a core pointer prevents X
+            from sending XInput events. This lowers the pen-tracking
+            resolution available to programs by 1 or 2 orders of magnitude!
+
 Problem 3:  Jittery cursor and undesired mouse clicks (both buttons),
             particuarly on the Stylistic 1200, and particuarly after the
 	    system has warmed up.
@@ -152,6 +135,9 @@ Solution:   (Not really a solution) This is a hardware problem.  Some
 	    actively using it extends battery life, and keeps the system from
 	    getting too hot.
 
+            If cursor movement seems completely random and mouse clicks seem
+            inexplicable, your baud rate may be set incorrectly.
+
 Bugs and Needed Work:
 
 (See above)
diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c
index b7a9a60..d0b9fe3 100644
--- a/src/xf86Fpit.c
+++ b/src/xf86Fpit.c
@@ -63,8 +63,6 @@
 
 #  include <misc.h>
 #  include <xf86.h>
-#  if !defined(DGUX)
-#  endif
 #  include <xf86_OSproc.h>
 #  include <xf86Xinput.h>
 #  include <exevents.h>
@@ -79,7 +77,6 @@
  *
  ***************************************************************************
  */
-#define FPIT_LINK_SPEED		B19200	/* 19200 Baud                           */
 #define FPIT_PORT		"/dev/ttyS3"
 
 #define FPIT_MAX_X		4100
@@ -87,19 +84,6 @@
 #define FPIT_MAX_Y		4100
 #define FPIT_MIN_Y		0
 
-#define PHASING_BIT	0x80
-#define PROXIMITY_BIT	0x20 /* DMC: This was 0x40 but the chart says its bit 5 which is 0x20 */
-/*#define TABID_BIT	0x20  */
-#define XSIGN_BIT	0x10
-#define YSIGN_BIT	0x08
-#define BUTTON_BITS	0x07
-#define COORD_BITS	0x7f
-
-/* DMC: Added these */
-#define SW1	0x01
-#define SW2	0x02
-#define SW3	0x04
-
 
 /*
  ***************************************************************************
@@ -123,8 +107,6 @@ typedef struct {
 	int screen_width;
 	int screen_height;
 	int screen_no;
-	int fpitInc;		/* increment between transmits */
-	int fpitButTrans;	/* button translation flags */
 	int fpitOldX;		/* previous X position */
 	int fpitOldY;		/* previous Y position */
 	int fpitOldProximity;	/* previous proximity */
@@ -135,10 +117,7 @@ typedef struct {


Reply to: