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

X Strike Force X.Org X11 SVN commit: r1009 - in trunk/debian: . patches/freebsd patches/general



Author: dnusinow
Date: 2006-01-04 22:25:49 -0500 (Wed, 04 Jan 2006)
New Revision: 1009

Modified:
   trunk/debian/changelog
   trunk/debian/patches/freebsd/002_gnu-kbsd_wacom.diff
   trunk/debian/patches/general/000_stolen_from_linuxwacom_wacom_driver.diff
Log:
* Update general/000_stolen_from_linuxwacom_wacom_driver.diff to bring
  driver to 0.6.8. Also remove obsolete hunk from
  freebsd/002_gnu-kbsd_wacom.diff. (closes: #333496)


Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2006-01-05 03:03:34 UTC (rev 1008)
+++ trunk/debian/changelog	2006-01-05 03:25:49 UTC (rev 1009)
@@ -28,6 +28,9 @@
     (closes: #345893)
   * Remove obsolete warning about cpp in the xbase-clients description. Thanks
     Adrian Bunk. (closes: #345578)
+  * Update general/000_stolen_from_linuxwacom_wacom_driver.diff to bring
+    driver to 0.6.8. Also remove obsolete hunk from
+    freebsd/002_gnu-kbsd_wacom.diff. (closes: #333496)
   * Translation Updates:
     + Italian thanks to Danilo Piazzalunga. (closes: #345789)
 
@@ -38,7 +41,7 @@
     Perrier (closes: #345609).  While at it, added whitespace that made all
     the translations gain 1 fuzzy string.
 
- -- David Nusinow <dnusinow@debian.org>  Wed,  4 Jan 2006 21:59:09 -0500
+ -- David Nusinow <dnusinow@debian.org>  Wed,  4 Jan 2006 22:23:27 -0500
 
 xorg-x11 (6.9.0.dfsg.1-1) unstable; urgency=low
 

Modified: trunk/debian/patches/freebsd/002_gnu-kbsd_wacom.diff
===================================================================
--- trunk/debian/patches/freebsd/002_gnu-kbsd_wacom.diff	2006-01-05 03:03:34 UTC (rev 1008)
+++ trunk/debian/patches/freebsd/002_gnu-kbsd_wacom.diff	2006-01-05 03:25:49 UTC (rev 1009)
@@ -1,32 +1,15 @@
 $Id$
 
-One of the hunks in this patch is merged in upstream production release
-(0.6.8 at the time of this writing). The other is merged in upstream CVS
-(both production and development branches). This will have to be removed in
-the future when we catch up with upstream.
+This is merged in upstream CVS (both production and development branches).
+This will have to be removed in the future when we catch up with upstream.
 
 This patch by Robert Millan
 
-diff -ur xc.old/programs/Xserver/hw/xfree86/input/wacom/wcmCommon.c xc/programs/Xserver/hw/xfree86/input/wacom/wcmCommon.c
---- xc.old/programs/Xserver/hw/xfree86/input/wacom/wcmCommon.c	2005-07-18 21:14:56.000000000 +0200
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmCommon.c	2005-07-18 21:21:35.000000000 +0200
-@@ -825,7 +825,11 @@
- 	if (pChannel->nSamples < 4) ++pChannel->nSamples;
- 
- 	/* don't send the first sample due to the first USB package issue*/
--	if ( (pChannel->nSamples != 1) || (common->wcmDevCls != &gWacomUSBDevice) )
-+	if ( (pChannel->nSamples != 1)
-+#ifdef LINUX_INPUT
-+             || (common->wcmDevCls != &gWacomUSBDevice)
-+#endif
-+           )
- 	{
- 		commonDispatchDevice(common,channel,pChannel);
- 		resetSampleCounter(pChannel);
-diff -ur xc.old/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h
---- xc.old/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h	2005-07-18 21:14:56.000000000 +0200
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h	2005-07-18 21:21:35.000000000 +0200
-@@ -453,7 +453,7 @@
+Index: xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h
+===================================================================
+--- xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h.orig	2006-01-04 22:15:07.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h	2006-01-04 22:19:59.000000000 -0500
+@@ -461,7 +461,7 @@
  	int bufpos;                        /* position with buffer */
  	unsigned char buffer[BUFFER_SIZE]; /* data read from device */
  

Modified: trunk/debian/patches/general/000_stolen_from_linuxwacom_wacom_driver.diff
===================================================================
--- trunk/debian/patches/general/000_stolen_from_linuxwacom_wacom_driver.diff	2006-01-05 03:03:34 UTC (rev 1008)
+++ trunk/debian/patches/general/000_stolen_from_linuxwacom_wacom_driver.diff	2006-01-05 03:25:49 UTC (rev 1009)
@@ -1,16 +1,25 @@
 $Id$
 
 This patch updates the wacom input driver from
-http://linuxwacom.sourceforge.net/ up to version 0.6.4.
+http://linuxwacom.sourceforge.net/ up to version 0.6.8.
 
-xf86Wacom.c tentatively brought up to 0.6.8 by David Nusinow
-
 This patch and changes to the Imakefile by Fabio M. Di Nitto.
+Updated to 0.6.8 by David Nusinow.
 
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.c
 ===================================================================
---- xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.c.orig	2005-12-24 16:43:08.000000000 -0500
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.c	2005-12-24 16:57:10.000000000 -0500
+--- xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.c.orig	2006-01-04 21:45:35.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.c	2006-01-04 22:14:58.000000000 -0500
+@@ -1,7 +1,7 @@
+-/* $XdotOrg: xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.c,v 1.7 2005/07/11 02:38:01 ajax Exp $ */
+ /* $XConsortium: xf86Wacom.c /main/20 1996/10/27 11:05:20 kaleb $ */
+ /*
+- * Copyright 1995-2001 by Frederic Lepied, France. <Lepied@XFree86.org>
++ * Copyright 1995-2002 by Frederic Lepied, France. <Lepied@XFree86.org> 
++ * Copyright 2002-2005 by Ping Cheng, Wacom Technology. <pingc@wacom.com>		
+  *                                                                            
+  * Permission to use, copy, modify, distribute, and sell this software and its
+  * documentation for any purpose is  hereby granted without fee, provided that
 @@ -23,10 +23,10 @@
   *
   */
@@ -6428,10 +6437,10 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h	2005-12-24 16:57:10.000000000 -0500
-@@ -0,0 +1,517 @@
++++ xc/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.h	2006-01-04 22:15:07.000000000 -0500
+@@ -0,0 +1,525 @@
 +/*
-+ * Copyright 1995-2004 by Frederic Lepied, France. <Lepied@XFree86.org>
++ * Copyright 1995-2005 by Frederic Lepied, France. <Lepied@XFree86.org>
 + *                                                                            
 + * Permission to use, copy, modify, distribute, and sell this software and its
 + * documentation for any purpose is  hereby granted without fee, provided that
@@ -6561,6 +6570,7 @@
 +#define XI_STYLUS "STYLUS"      /* X device name for the stylus */
 +#define XI_CURSOR "CURSOR"      /* X device name for the cursor */
 +#define XI_ERASER "ERASER"      /* X device name for the eraser */
++#define XI_PAD    "PAD"         /* X device name for the I3 Pad */
 +#define MAX_VALUE 100           /* number of positions */
 +#define MAXTRY 3                /* max number of try to receive magic number */
 +#define MAX_COORD_RES 1270.0    /* Resolution of the returned MaxX and MaxY */
@@ -6654,15 +6664,15 @@
 + * WacomDeviceRec
 + *****************************************************************************/
 +
-+#define DEVICE_ID(flags) ((flags) & 0x07)
++#define DEVICE_ID(flags) ((flags) & 0x0f)
 +
 +#define STYLUS_ID               1
 +#define CURSOR_ID               2
 +#define ERASER_ID               4
-+#define ABSOLUTE_FLAG           8
-+#define KEEP_SHAPE_FLAG         16
-+#define BAUD_19200_FLAG         32
-+#define BETA_FLAG               64
++#define PAD_ID                  8
++#define ABSOLUTE_FLAG           16
++#define KEEP_SHAPE_FLAG         32
++#define BAUD_19200_FLAG         64
 +#define BUTTONS_ONLY_FLAG       128
 +#define TPCBUTTONS_FLAG		256
 +#define TPCBUTTONONE_FLAG	512
@@ -6670,6 +6680,7 @@
 +#define IsCursor(priv) (DEVICE_ID((priv)->flags) == CURSOR_ID)
 +#define IsStylus(priv) (DEVICE_ID((priv)->flags) == STYLUS_ID)
 +#define IsEraser(priv) (DEVICE_ID((priv)->flags) == ERASER_ID)
++#define IsPad(priv)    (DEVICE_ID((priv)->flags) == PAD_ID)
 +
 +typedef int (*FILTERFUNC)(WacomDevicePtr pDev, WacomDeviceStatePtr pState);
 +
@@ -6679,7 +6690,7 @@
 +
 +#define FILTER_PRESSURE_RES 2048        /* maximum points in pressure curve */
 +
-+typedef enum { TV_NONE = 0, TV_ABOVE_BELOW = 1, TV_LEFT_RIGHT = 2 } tvMode;
++typedef enum { TV_NONE = 0, TV_ABOVE_BELOW = 1, TV_LEFT_RIGHT = 2 } tvMode;
 +
 +struct _WacomDeviceRec
 +{
@@ -6698,6 +6709,8 @@
 +	WacomCommonPtr common;  /* common info pointer */
 +    
 +	/* state fields */
++	int currentX;           /* current X position */
++	int currentY;           /* current Y position */
 +	int oldX;               /* previous X position */
 +	int oldY;               /* previous Y position */
 +	int oldZ;               /* previous pressure */
@@ -6705,6 +6718,8 @@
 +	int oldTiltY;           /* previous tilt in y direction */    
 +	int oldWheel;           /* previous wheel value */    
 +	int oldRot;             /* previous rotation value */
++	int oldStripX;          /* previous left strip value */
++	int oldStripY;          /* previous right strip value */
 +	int oldThrottle;        /* previous throttle value */
 +	int oldButtons;         /* previous buttons state */
 +	int oldProximity;       /* previous proximity */
@@ -6757,6 +6772,8 @@
 +	int pressure;
 +	int tiltx;
 +	int tilty;
++	int stripx;
++	int stripy;
 +	int rotation;
 +	int abswheel;
 +	int relwheel;
@@ -6950,7 +6967,7 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/Xwacom.h
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/Xwacom.h	2005-12-24 16:57:10.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/Xwacom.h	2006-01-04 22:15:07.000000000 -0500
 @@ -0,0 +1,48 @@
 +/*****************************************************************************
 + *
@@ -7003,10 +7020,10 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmCommon.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmCommon.c	2005-12-24 16:57:10.000000000 -0500
-@@ -0,0 +1,1084 @@
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmCommon.c	2006-01-04 22:14:58.000000000 -0500
+@@ -0,0 +1,1081 @@
 +/*
-+ * Copyright 1995-2004 by Frederic Lepied, France. <Lepied@XFree86.org>
++ * Copyright 1995-2005 by Frederic Lepied, France. <Lepied@XFree86.org>
 + *
 + * Permission to use, copy, modify, distribute, and sell this software and its
 + * documentation for any purpose is  hereby granted without fee, provided that
@@ -7016,8 +7033,8 @@
 + * advertising or publicity pertaining to distribution of the software without
 + * specific,  written      prior  permission.     Frederic  Lepied   makes  no
 + * representations about the suitability of this software for any purpose.  It
-+ * is provided "as is" without express or implied warranty.		   
-+ *									    
++ * is provided "as is" without express or implied warranty.
++ *
 + * FREDERIC  LEPIED DISCLAIMS ALL   WARRANTIES WITH REGARD  TO  THIS SOFTWARE,
 + * INCLUDING ALL IMPLIED   WARRANTIES OF MERCHANTABILITY  AND   FITNESS, IN NO
 + * EVENT  SHALL FREDERIC  LEPIED BE   LIABLE   FOR ANY  SPECIAL, INDIRECT   OR
@@ -7062,17 +7079,25 @@
 + *   combined horizontal and vertical setups
 + ****************************************************************************/
 +
-+static void xf86WcmSetScreen(LocalDevicePtr local, int *v0, int *v1)
++static void xf86WcmSetScreen(LocalDevicePtr local, int *value0, int *value1)
 +{
 +	WacomDevicePtr priv = (WacomDevicePtr) local->private;
 +	int screenToSet = 0;
 +	int totalWidth = 0, maxHeight = 0, leftPadding = 0;
-+	int i, x, y;
++	int i, x, y, v0 = *value0, v1 = *value1;
 +	double sizeX = priv->bottomX - priv->topX - 2*priv->tvoffsetX;
 +	double sizeY = priv->bottomY - priv->topY - 2*priv->tvoffsetY;
 +
-+	DBG(6, ErrorF("xf86WcmSetScreen\n"));
++	DBG(6, ErrorF("xf86WcmSetScreen v0=%d v1=%d\n", *value0, *value1));
 +
++	if (priv->twinview == TV_NONE && (priv->flags & ABSOLUTE_FLAG))
++	{
++		v0 = v0 > priv->bottomX ? priv->bottomX - priv->topX :
++			v0 < priv->topX ? 0 : v0 - priv->topX;
++		v1 = v1 > priv->bottomY ? priv->bottomY - priv->topY :
++			v1 < priv->topY ? 0 : v1 - priv->topY;
++	}
++
 +	/* set factorX and factorY for single screen setup since
 +	 * Top X Y and Bottom X Y can be changed while driver is running
 +	 */
@@ -7084,16 +7109,16 @@
 +			{
 +				if (priv->twinview == TV_LEFT_RIGHT)
 +				{
-+					if (*v0 > priv->bottomX - priv->tvoffsetX && *v0 <= priv->bottomX)
++					if (v0 > priv->bottomX - priv->tvoffsetX && v0 <= priv->bottomX)
 +						priv->currentScreen = 1;
-+					if (*v0 > priv->topX && *v0 <= priv->topX + priv->tvoffsetX)
++					if (v0 > priv->topX && v0 <= priv->topX + priv->tvoffsetX)
 +						priv->currentScreen = 0;
 +				}
 +				if (priv->twinview == TV_ABOVE_BELOW)
 +				{
-+					if (*v1 > priv->bottomY - priv->tvoffsetY && *v1 <= priv->bottomY)
++					if (v1 > priv->bottomY - priv->tvoffsetY && v1 <= priv->bottomY)
 +						priv->currentScreen = 1;
-+					if (*v1 > priv->topY && *v1 <= priv->topY + priv->tvoffsetY)
++					if (v1 > priv->topY && v1 <= priv->topY + priv->tvoffsetY)
 +						priv->currentScreen = 0;
 +				}
 +			}
@@ -7104,7 +7129,7 @@
 +		}
 +		else
 +		{
-+			/* puck is on the tablet when driver starts */
++			/* tool on the tablet when driver starts */
 +			if (miPointerCurrentScreen())
 +				priv->currentScreen = miPointerCurrentScreen()->myNum;
 +			priv->factorX = screenInfo.screens[priv->currentScreen]->width / sizeX;
@@ -7136,7 +7161,7 @@
 +	{
 +		for (i = 0; i < priv->numScreen; i++)
 +		{
-+			if (*v0 * totalWidth <= (leftPadding + 
++			if (v0 * totalWidth <= (leftPadding + 
 +				screenInfo.screens[i]->width) * sizeX)
 +			{
 +				screenToSet = i;
@@ -7151,10 +7176,10 @@
 +		screenToSet = priv->screen_no;
 +		for (i = 0; i < screenToSet; i++)
 +			leftPadding += screenInfo.screens[i]->width;
-+		*v0 = (sizeX * leftPadding + *v0
++		v0 = (sizeX * leftPadding + v0
 +			* screenInfo.screens[screenToSet]->width) /
 +			(double)totalWidth + 0.5;
-+		*v1 = *v1 * screenInfo.screens[screenToSet]->height /
++		v1 = v1 * screenInfo.screens[screenToSet]->height /
 +			(double)maxHeight + 0.5;
 +	}
 +
@@ -7162,9 +7187,9 @@
 +	{
 +		priv->factorX = totalWidth/sizeX;
 +		priv->factorY = maxHeight/sizeY;
-+		x = (*v0 - sizeX
++		x = (v0 - sizeX
 +			* leftPadding / totalWidth) * priv->factorX + 0.5;
-+		y = *v1 * priv->factorY + 0.5;
++		y = v1 * priv->factorY + 0.5;
 +		
 +		if (x >= screenInfo.screens[screenToSet]->width)
 +			x = screenInfo.screens[screenToSet]->width - 1;
@@ -7175,15 +7200,15 @@
 +#endif
 +	{
 +		if (priv->screen_no == -1)
-+			*v0 = (*v0 * totalWidth - sizeX * leftPadding)
++			v0 = (v0 * totalWidth - sizeX * leftPadding)
 +				/ screenInfo.screens[screenToSet]->width;
 +		else
 +			screenToSet = priv->screen_no;
 +		priv->factorX = screenInfo.screens[screenToSet]->width / sizeX;
 +		priv->factorY = screenInfo.screens[screenToSet]->height / sizeY;
 +
-+		x = *v0 * priv->factorX + 0.5;
-+		y = *v1 * priv->factorY + 0.5;
++		x = v0 * priv->factorX + 0.5;
++		y = v1 * priv->factorY + 0.5;
 +	}
 +
 +	xf86XInputSetScreen(local, screenToSet, x, y);
@@ -7208,7 +7233,7 @@
 +	DBG(6, ErrorF("xf86WcmSendButtons buttons=%d for %s\n", buttons, local->name));
 +
 +	/* Tablet PC buttons. */
-+	if ( common->wcmTPCButton && !IsCursor(priv))
++	if ( common->wcmTPCButton && !IsCursor(priv) && !IsPad(priv) )
 +	{
 +		if ( buttons & 1 )
 +		{
@@ -7402,49 +7427,31 @@
 +
 +	WacomDevicePtr priv = (WacomDevicePtr) local->private;
 +	WacomCommonPtr common = priv->common;
-+	int rx, ry, rz, rtx, rty, rrot, rth, rw;
-+	int is_core_pointer, is_absolute, doffsetX=0, doffsetY=0;
-+	int aboveBelowSwitch = (priv->twinview == TV_ABOVE_BELOW)
-+		? ((y < priv->topY) ? -1 : ((priv->bottomY < y) ? 1 : 0)) : 0;
-+	int leftRightSwitch = (priv->twinview == TV_LEFT_RIGHT)
-+		? ((x < priv->topX) ? -1 : ((priv->bottomX < x) ? 1 : 0)) : 0;
++	int rx, ry, rz, rtx, rty, rrot, rth, rw, no_jitter;
++	double param, relacc;
++	int is_core_pointer, is_absolute;
 +
++	/* use tx and ty to report stripx and stripy */
++	if (type == PAD_ID)
++	{
++		tx = ds->stripx;
++		ty = ds->stripy;
++	}
++
 +	DBG(7, ErrorF("[%s] prox=%s x=%d y=%d z=%d "
 +		"b=%s b=%d tx=%d ty=%d wl=%d rot=%d th=%d\n",
 +		(type == STYLUS_ID) ? "stylus" :
-+			(type == CURSOR_ID) ? "cursor" : "eraser",
++			(type == CURSOR_ID) ? "cursor" : 
++			(type == ERASER_ID) ? "eraser" : "pad",
 +		is_proximity ? "true" : "false",
 +		x, y, z, is_button ? "true" : "false", buttons,
 +		tx, ty, wheel, rot, throttle));
 +
 +	is_absolute = (priv->flags & ABSOLUTE_FLAG);
 +	is_core_pointer = xf86IsCorePointer(local->dev);
++	priv->currentX = x;
++	priv->currentY = y;
 +
-+	if ( is_proximity || x || y || z || buttons || tx || ty || wheel )
-+	{
-+		switch ( leftRightSwitch )
-+		{
-+			case -1:
-+				doffsetX = 0;
-+				break;
-+			case 1:
-+				doffsetX = priv->bottomX - priv->topX - 2*priv->tvoffsetX;
-+				break;
-+		}
-+		switch ( aboveBelowSwitch )
-+		{
-+			case -1:
-+				doffsetY = 0;
-+				break;
-+			case 1:
-+				doffsetY = priv->bottomY - priv->topY - 2*priv->tvoffsetY;
-+				break;
-+		}
-+	}
-+
-+	x += doffsetX;
-+	y += doffsetY;
-+
 +	DBG(6, ErrorF("[%s] %s prox=%d\tx=%d\ty=%d\tz=%d\t"
 +		"button=%s\tbuttons=%d\t on channel=%d\n",
 +		local->name,
@@ -7456,18 +7463,8 @@
 +	/* sets rx and ry according to the mode */
 +	if (is_absolute)
 +	{
-+		if (priv->twinview == TV_NONE)
-+		{
-+			rx = x > priv->bottomX ? priv->bottomX - priv->topX :
-+				x < priv->topX ? 0 : x - priv->topX;
-+			ry = y > priv->bottomY ? priv->bottomY - priv->topY :
-+				y < priv->topY ? 0 : y - priv->topY;
-+		}
-+		else
-+		{
-+			rx = x;
-+			ry = y;
-+		}
++		rx = x;
++		ry = y;
 +		rz = z;
 +		rtx = tx;
 +		rty = ty;
@@ -7481,6 +7478,8 @@
 +		{
 +			/* unify acceleration in both directions */
 +			rx = (x - priv->oldX) * priv->factorY / priv->factorX;
++
++			rx = (x - priv->oldX);
 +			ry = y - priv->oldY;
 +		}
 +		else
@@ -7488,10 +7487,10 @@
 +			rx = 0;
 +			ry = 0;
 +		}
++
 +		/* don't apply speed for fairly small increments */
-+		int no_jitter = priv->speed * 3;
-+		double param;
-+		double relacc = (MAX_ACCEL-priv->accel)*(MAX_ACCEL-priv->accel);
++		no_jitter = priv->speed * 3;
++		relacc = (MAX_ACCEL-priv->accel)*(MAX_ACCEL-priv->accel);
 +		if (ABS(rx) > no_jitter)
 +		{
 +			param = priv->speed;
@@ -7531,7 +7530,7 @@
 +
 +	/* for multiple monitor support, we need to set the proper 
 +	 * screen and modify the axes before posting events */
-+	if( !((priv->flags & BUTTONS_ONLY_FLAG) || channel) )
++	if( !(priv->flags & BUTTONS_ONLY_FLAG) )
 +	{
 +		xf86WcmSetScreen(local, &rx, &ry);
 +	}
@@ -7553,13 +7552,8 @@
 +					rw);
 +		}
 +
-+		/* don't move the cursor if it only supports buttons or
-+		 * if it's the second tool in dual input case.
-+		 * More complicated dual input, such as only sylus/puck moves 
-+		 * the cursor or both tools can move the cursor will be 
-+		 * supported when needed
-+		 */
-+		if( !((priv->flags & BUTTONS_ONLY_FLAG) || channel) )
++		/* don't move the cursor if it only supports buttons */
++		if( !(priv->flags & BUTTONS_ONLY_FLAG) )
 +		{
 +			if (IsCursor(priv))
 +				xf86PostMotionEvent(local->dev,
@@ -7584,13 +7578,13 @@
 +			int i;
 +			for (i=0; i<abs(ds->relwheel); i++)
 +			{
-+				xf86PostButtonEvent(local->dev, 
++				xf86PostButtonEvent(local->dev,
 +					is_absolute,
-+					fakeButton, 1, 0, 6, rx, ry, rz, 
++					fakeButton, 1, 0, 6, rx, ry, rz,
 +					rrot, rth, rw);
-+				xf86PostButtonEvent(local->dev, 
++				xf86PostButtonEvent(local->dev,
 +					is_absolute,
-+					fakeButton, 0, 0, 6, rx, ry, rz, 
++					fakeButton, 0, 0, 6, rx, ry, rz,
 +					rrot, rth, rw);
 +			}
 +		}
@@ -7614,10 +7608,8 @@
 +			{
 +				int macro = z / 2;
 +
-+				DBG(6, ErrorF("macro=%d buttons=%d "
-+					"wacom_map[%d]=%lx\n",
-+					macro, buttons, macro,
-+					gWacomModule.keymap[macro]));
++				DBG(6, ErrorF("macro=%d buttons=%d \n",
++					macro, buttons));
 +
 +				/* First available Keycode begins at 8
 +				 * therefore macro+7 */
@@ -7667,6 +7659,8 @@
 +	priv->oldZ = z;
 +	priv->oldTiltX = tx;
 +	priv->oldTiltY = ty;
++	priv->oldStripX = ds->stripx;
++	priv->oldStripY = ds->stripy;
 +	priv->oldRot = rot;
 +	priv->oldThrottle = throttle;
 +}
@@ -7686,11 +7680,15 @@
 +	if (dsOrig->proximity != dsNew->proximity) return 0;
 +	if (ABS(dsOrig->x - dsNew->x) > suppress) return 0;
 +	if (ABS(dsOrig->y - dsNew->y) > suppress) return 0;
++	if (ABS(dsOrig->tiltx - dsNew->tiltx) > suppress) return 0;
++	if (ABS(dsOrig->tilty - dsNew->tilty) > suppress) return 0;
++	if (ABS(dsOrig->stripx - dsNew->stripx) > suppress) return 0;
++	if (ABS(dsOrig->stripy - dsNew->stripy) > suppress) return 0;
 +	if (ABS(dsOrig->pressure - dsNew->pressure) > suppress) return 0;
 +	if (ABS(dsOrig->throttle - dsNew->throttle) > suppress) return 0;
 +
-+	if ((1800 + dsOrig->rotation - dsNew->rotation) % 1800 > suppress &&
-+		(1800 + dsNew->rotation - dsOrig->rotation) % 1800 > suppress)
++	if (ABS(dsOrig->rotation - dsNew->rotation) > suppress ||
++		(1800 - ABS(dsNew->rotation - dsOrig->rotation)) > suppress)
 +		return 0;
 +
 +	/* look for change in absolute wheel
@@ -7760,6 +7758,14 @@
 +	WacomDeviceState ds;
 +	WacomChannelPtr pChannel;
 +
++	/* tool on the tablet when driver starts */
++	if (!miPointerCurrentScreen())
++	{
++		DBG(6, ErrorF("xf86WcmEvent: Wacom driver can not get Current Screen ID\n"));
++		DBG(6, ErrorF("Please remove Wacom tool from the tablet.\n"));
++		return;
++	}
++
 +	/* sanity check the channel */
 +	if (channel >= MAX_CHANNELS)
 +		return;
@@ -7785,9 +7791,19 @@
 +		ds.tilty, ds.abswheel, ds.relwheel, ds.throttle,
 +		ds.discard_first, ds.proximity, ds.sample));
 +
-+	DBG(11, ErrorF("filter %d, %p\n",RAW_FILTERING(common),
-+		(void *)common->wcmModel->FilterRaw));
-+
++#ifdef LINUX_INPUT
++ 	/* Discard the first 2 USB packages due to events delay */
++	if ( (pChannel->nSamples < 2) && (common->wcmDevCls == &gWacomUSBDevice) )
++	{
++		DBG(11, ErrorF("discarded %dth USB data.\n", pChannel->nSamples));
++		/* store channel device state for later use */
++		memmove(pChannel->valid.states + 1,
++			pChannel->valid.states,
++			sizeof(WacomDeviceState) * (MAX_SAMPLES - 1));
++		++pChannel->nSamples;
++		return; /* discard */
++	}
++#endif
 +	/* Filter raw data, fix hardware defects, perform error correction */
 +	if (RAW_FILTERING(common) && common->wcmModel->FilterRaw)
 +	{
@@ -7800,7 +7816,7 @@
 +	}
 +
 +	/* Discard unwanted data */
-+	if (xf86WcmSuppress(common->wcmSuppress, pLast, &ds) && pChannel->nSamples == 4)
++	if (xf86WcmSuppress(common->wcmSuppress, pLast, &ds) && pChannel->rawFilter.npoints == 4)
 +	{
 +		/* If throttle is not in use, discard data. */
 +		if (ABS(ds.throttle) < common->wcmSuppress)
@@ -7829,14 +7845,10 @@
 +		pChannel->valid.states,
 +		sizeof(WacomDeviceState) * (MAX_SAMPLES - 1));
 +	pChannel->valid.state = ds; /*save last raw sample */
-+	if (pChannel->nSamples < 4) ++pChannel->nSamples;
++	if (pChannel->rawFilter.npoints < 4) ++pChannel->nSamples;
 +
-+	/* don't send the first sample due to the first USB package issue*/
-+	if ( (pChannel->nSamples != 1) || (common->wcmDevCls != &gWacomUSBDevice) )
-+	{
-+		commonDispatchDevice(common,channel,pChannel);
-+		resetSampleCounter(pChannel);
-+	}
++	commonDispatchDevice(common,channel,pChannel);
++	resetSampleCounter(pChannel);
 +}
 +
 +static void commonDispatchDevice(WacomCommonPtr common, unsigned int channel,
@@ -7845,12 +7857,27 @@
 +	int id, idx;
 +	WacomDevicePtr priv;
 +	LocalDevicePtr pDev = NULL;
-+	LocalDevicePtr pLastDev = pChannel->pDev;
 +	WacomDeviceState* ds = &pChannel->valid.states[0];
-+	WacomDeviceState* pLast = &pChannel->valid.states[1];
 +
 +	DBG(10, ErrorF("commonDispatchEvents\n"));
 +
++	if (!ds->device_type)
++	{
++		/* defaults to cursor if tool is on the tablet when X starts */
++		ds->device_type = CURSOR_ID;
++		ds->proximity = 1;
++		if (ds->serial_num)
++			for (idx=0; idx<common->wcmNumDevices; idx++)
++			{
++				priv = common->wcmDevices[idx]->private;
++				if (ds->serial_num == priv->serial)
++				{
++					ds->device_type = DEVICE_ID(priv->flags);
++					break;
++				}
++			}
++	}
++
 +	/* Find the device the current events are meant for */
 +	for (idx=0; idx<common->wcmNumDevices; idx++)
 +	{
@@ -7860,34 +7887,15 @@
 +		if (id == ds->device_type &&
 +			((!priv->serial) || (ds->serial_num == priv->serial)))
 +		{
-+			if ((priv->topX <= ds->x && priv->bottomX > ds->x &&
-+				priv->topY <= ds->y && priv->bottomY > ds->y))
-+			{
-+				DBG(11, ErrorF("tool id=%d for %s\n",
++			DBG(11, ErrorF("tool id=%d for %s\n",
 +					id, common->wcmDevices[idx]->name));
-+				pDev = common->wcmDevices[idx];
-+				break;
-+			}
-+			/* Fallback to allow the cursor to move
-+			 * smoothly along screen edges */
-+			else if (priv->oldProximity)
-+			{
-+				pDev = common->wcmDevices[idx];
-+			}
++			pDev = common->wcmDevices[idx];
++			break;
 +		}
 +	}
 +
-+	DBG(11, ErrorF("commonDispatchEvents: %p %p\n",(void *)pDev,(void *)pLastDev));
++	DBG(11, ErrorF("commonDispatchEvents: %p \n",(void *)pDev));
 +
-+	/* if the logical device of the same physical tool has changed,
-+	 * send proximity out to the previous one */
-+	if (pLastDev && (pLastDev != pDev) &&
-+		(pLast->serial_num == ds->serial_num))
-+	{
-+		pLast->proximity = 0;
-+		xf86WcmSendEvents(pLastDev, pLast, channel);
-+	}
-+
 +	/* if a device matched criteria, handle filtering per device
 +	 * settings, and send event to XInput */
 +	if (pDev)
@@ -7899,7 +7907,7 @@
 +
 +		/* button 1 Threshold test */
 +		int button = 1;
-+		if ( !IsCursor(priv) )
++		if ( IsStylus(priv) || IsEraser(priv))
 +		{
 +			if (filtered.pressure < common->wcmThreshold )
 +				filtered.buttons &= ~button;
@@ -7956,14 +7964,20 @@
 +
 +		#endif /* throttle */
 +
-+		/* force out-prox when height is greater than 112. 
-+		 * This only applies to USB protocol V tablets
++		/* force out-prox when height is greater than 13 
++		 * (use 112 for history reason for now) for GD & XD;
++		 * 28 for PTZ. This only applies to USB protocol V tablets
 +		 * which aimed at improving relative movement support. 
 +		 */
-+		if (filtered.distance > 112 && !(priv->flags & ABSOLUTE_FLAG) && !channel )
++		if (!(priv->flags & ABSOLUTE_FLAG) && IsCursor(priv))
 +		{
-+			ds->proximity = 0;
-+			filtered.proximity = 0;
++			DBG(11, ErrorF("Distance over the tablet: %d \n", filtered.distance));
++			if ((filtered.distance > 28 && strstr(common->wcmModel->name, "Intuos3")) 
++			|| (filtered.distance > 112 && !strstr(common->wcmModel->name, "Intuos3")) )
++			{
++				ds->proximity = 0;
++				filtered.proximity = 0;
++			}
 +		}
 +
 +		xf86WcmSendEvents(pDev, &filtered, channel);
@@ -8092,7 +8106,7 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmCompat.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmCompat.c	2005-12-24 16:57:10.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmCompat.c	2006-01-04 22:14:58.000000000 -0500
 @@ -0,0 +1,46 @@
 +/*
 + * Copyright 1995-2004 by Frederic Lepied, France. <Lepied@XFree86.org>
@@ -8143,10 +8157,11 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmConfig.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmConfig.c	2005-12-24 16:57:10.000000000 -0500
-@@ -0,0 +1,742 @@
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmConfig.c	2006-01-04 22:14:58.000000000 -0500
+@@ -0,0 +1,773 @@
 +/*
-+ * Copyright 1995-2004 by Frederic Lepied, France. <Lepied@XFree86.org>
++ * Copyright 1995-2002 by Frederic Lepied, France. <Lepied@XFree86.org>
++ * Copyright 2002-2005 by Ping Cheng, Wacom. <pingc@wacom.com>
 + *                                                                            
 + * Permission to use, copy, modify, distribute, and sell this software and its
 + * documentation for any purpose is  hereby granted without fee, provided that
@@ -8249,7 +8264,7 @@
 +	priv->tvoffsetX = 0;			/* none X edge offset for TwinView setup */
 +	priv->tvoffsetY = 0;			/* none Y edge offset for TwinView setup */
 +	for (i=0; i<4; i++)
-+		priv->tvResolution[i] = 0;	/* unconfigured twinview resolution */
++		priv->tvResolution[i] = 0;	/* unconfigured twinview resolution */
 +
 +	/* JEJ - throttle sampling code */
 +	priv->throttleValue = 0;
@@ -8315,8 +8330,7 @@
 +
 +LocalDevicePtr xf86WcmAllocateEraser(void)
 +{
-+	LocalDevicePtr local = xf86WcmAllocate(XI_ERASER,
-+			ABSOLUTE_FLAG|ERASER_ID);
++	LocalDevicePtr local = xf86WcmAllocate(XI_ERASER, ABSOLUTE_FLAG|ERASER_ID);
 +
 +	if (local)
 +		local->type_name = "Wacom Eraser";
@@ -8324,10 +8338,18 @@
 +	return local;
 +}
 +
-+/******************************************************************************
-+ * XFree86 V4 Module Configuration
-+ *****************************************************************************/
++/* xf86WcmAllocatePad */
 +
++LocalDevicePtr xf86WcmAllocatePad(void)
++{
++	LocalDevicePtr local = xf86WcmAllocate(XI_PAD, PAD_ID);
++
++	if (local)
++		local->type_name = "Wacom Pad";
++
++	return local;
++}
++
 +/* 
 + * Be sure to set vmin appropriately for your device's protocol. You want to
 + * read a full packet before returning
@@ -8440,6 +8462,8 @@
 +		local = xf86WcmAllocateCursor();
 +	else if (s && (xf86NameCmp(s, "eraser") == 0))
 +		local = xf86WcmAllocateEraser();
++	else if (s && (xf86NameCmp(s, "pad") == 0))
++		local = xf86WcmAllocatePad();
 +	else
 +	{
 +		xf86Msg(X_ERROR, "%s: No type or invalid type specified.\n"
@@ -8515,10 +8539,14 @@
 +		 */
 +		if (IsCursor(priv)) 
 +			priv->flags &= ~ABSOLUTE_FLAG;
-+		else
++		else 
 +			priv->flags |= ABSOLUTE_FLAG;
 +	}
 +
++	/* pad always in relative mode since it doesn't move the cursor */
++	if (IsPad(priv)) 
++			priv->flags &= ~ABSOLUTE_FLAG;
++
 +	xf86Msg(X_CONFIG, "%s is in %s mode\n", local->name,
 +		(priv->flags & ABSOLUTE_FLAG) ? "absolute" : "relative");
 +
@@ -8724,6 +8752,23 @@
 +			xf86Msg(X_CONFIG, "%s: Tablet PC buttons on \n", common->wcmDevice);
 +	}
 +
++	/* Turn on/off Gimp support in a multimonitor setup */
++	if ( !common->wcmGimp )
++	{
++		common->wcmGimp = xf86SetBoolOption(local->options, "Gimp", 1);
++		if ( !common->wcmGimp )
++			xf86Msg(X_CONFIG, "%s: Gimp multimonitor mapping isn't supported \n", common->wcmDevice);
++	}
++
++	/* Cursor stays in one monitor in a multimonitor setup */
++	if ( !common->wcmMMonitor )
++	{
++		common->wcmMMonitor = xf86SetBoolOption(local->options, "MMonitor", 1);
++		if ( !common->wcmMMonitor )
++			xf86Msg(X_CONFIG, "%s: Cursor will stay in one monitor \n", common->wcmDevice);
++	}
++
++
 +	for (i=0; i<16; i++)
 +	{
 +		sprintf(b, "Button%d", i+1);
@@ -8774,43 +8819,43 @@
 +		xf86Msg(X_CONFIG, "%s: Accel = %d\n", dev->identifier,
 +			priv->accel);
 +
-+	s = xf86FindOptionValue(local->options, "Twinview");
++	s = xf86FindOptionValue(local->options, "Twinview");
 +	if (s) xf86Msg(X_CONFIG, "%s: Twinview = %s\n", dev->identifier, s);
 +	if (s && xf86NameCmp(s, "none") == 0) 
-+	{
-+		priv->twinview = TV_NONE;
-+	}
++	{
++		priv->twinview = TV_NONE;
++	}
 +	else if (s && xf86NameCmp(s, "horizontal") == 0) 
-+	{
-+		priv->twinview = TV_LEFT_RIGHT;
++	{
++		priv->twinview = TV_LEFT_RIGHT;
 +		/* default resolution */
 +		if(!priv->tvResolution[0])
 +		{
 +			priv->tvResolution[0] = screenInfo.screens[0]->width/2;
-+			priv->tvResolution[1] = screenInfo.screens[0]->height;
-+			priv->tvResolution[2] = priv->tvResolution[0];
++			priv->tvResolution[1] = screenInfo.screens[0]->height;
++			priv->tvResolution[2] = priv->tvResolution[0];
 +			priv->tvResolution[3] = priv->tvResolution[1];
 +		}
-+	}
++	}
 +	else if (s && xf86NameCmp(s, "vertical") == 0) 
-+	{
-+		priv->twinview = TV_ABOVE_BELOW;
++	{
++		priv->twinview = TV_ABOVE_BELOW;
 +		/* default resolution */
 +		if(!priv->tvResolution[0])
 +		{
-+			priv->tvResolution[0] = screenInfo.screens[0]->width;
-+			priv->tvResolution[1] = screenInfo.screens[0]->height/2;
-+			priv->tvResolution[2] = priv->tvResolution[0];
++			priv->tvResolution[0] = screenInfo.screens[0]->width;
++			priv->tvResolution[1] = screenInfo.screens[0]->height/2;
++			priv->tvResolution[2] = priv->tvResolution[0];
 +			priv->tvResolution[3] = priv->tvResolution[1];
 +		}
-+	}
++	}
 +	else if (s) 
-+	{
-+		xf86Msg(X_ERROR, "%s: invalid Twinview (should be none, vertical or horizontal). Using none.\n",
-+			dev->identifier);
-+		priv->twinview = TV_NONE;
++	{
++		xf86Msg(X_ERROR, "%s: invalid Twinview (should be none, vertical or horizontal). Using none.\n",
++			dev->identifier);
++		priv->twinview = TV_NONE;
 +	}
-+
++
 +	/* mark the device configured */
 +	local->flags |= XI86_POINTER_CAPABLE | XI86_CONFIGURED;
 +
@@ -8890,8 +8935,8 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmFilter.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmFilter.c	2005-12-24 16:57:10.000000000 -0500
-@@ -0,0 +1,414 @@
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmFilter.c	2006-01-04 22:14:58.000000000 -0500
+@@ -0,0 +1,364 @@
 +/*
 + * Copyright 1995-2003 by Frederic Lepied, France. <Lepied@XFree86.org>
 + *                                                                            
@@ -8928,7 +8973,7 @@
 +		double a, double b);
 +static void filterLine(int* pCurve, int nMax, int x0, int y0, int x1, int y1);
 +static void filterIntuosStylus(WacomFilterStatePtr state, WacomDeviceStatePtr ds);
-+static void filterIntuosCoord(int* coord, int* current, int tilt, int* state);
++static void filterIntuosCoord(int* state, int* current);
 +static void filterIntuosTilt(int* state, int* tilt);
 +
 +/*****************************************************************************
@@ -9121,76 +9166,26 @@
 +	}
 +
 +	/* filter x */
-+	filterIntuosCoord(state->x, &ds->x, ds->tiltx, &state->statex);
++	filterIntuosCoord(state->x, &ds->x);
 +	/* filter y */
-+	filterIntuosCoord(state->y, &ds->y, ds->tilty, &state->statey);
++	filterIntuosCoord(state->y, &ds->y);
 +	/* filter tiltx */
 +	filterIntuosTilt(state->tiltx, &ds->tiltx);
 +	/* filter tilty */
 +	filterIntuosTilt(state->tilty, &ds->tilty);
 +}
 +
-+static void filterIntuosCoord(int* coord, int* current, int tilt, int* state)
++static void filterIntuosCoord(int* state, int* current)
 +{
-+	int ts;
-+	int x0_pred;
-+	int x0_pred1;
-+	int x0, x1, x2, x3;
++	int x;
 +
-+	x0 = *current;
-+	x1 = coord[0];
-+	x2 = coord[1];
-+	x3 = coord[2];
-+	coord[0] = x0;
-+	coord[1] = x1;
-+	coord[2] = x2;
-+    
-+	ts = tilt >= 0 ? 1 : -1;
-+    
-+	if (*state == 0 || *state == 3)
-+	{
-+		if (ts * (x0 - 2 * x1 - x2) > 12 && 
-+			ts * (x0 - 3 * x2 - 2 * x3) > 12)
-+		{
-+			/* detected a jump at x0 */
-+			*state = 1;
-+			*current = x1;
-+		}
-+		else if (*state == 0)
-+		{
-+			x0_pred = 7 * x0 + 14 * x1 + 15 * x2 + 16;
-+			x0_pred1 = 4 * x3;
-+			if (x0_pred > x0_pred1)
-+				*current = ((CARD32)(x0_pred - x0_pred1)) >> 5;
-+			else
-+				*current = 0;
-+		}
-+		else
-+		{
-+			/* state == 3 
-+			 * a jump at x3 was detected */
-+			*current = (x0 + 2 * x1 + x2 + 2) >> 2;
-+			*state = 0;
-+		}
-+	}
-+	else if (*state == 1)
-+	{
-+		/* a jump at x1 was detected */
-+		x0_pred = 3 * x0 + 7 * x2 + 4;
-+		x0_pred1 = 2 * x3;
-+		if (x0_pred > x0_pred1)
-+			*current = ((CARD32)(x0_pred - x0_pred1)) >> 3;
-+		else
-+			*current = 0;
-+		*state = 2;
-+	}
-+	else
-+	{
-+		/* state == 2 
-+		 * a jump at x2 was detected */
-+		*current = x1;
-+		*state = 3;
-+	}
++	x = *current + state[0] + state[1] + state[2];
++
++	state[2] = state[1];
++	state[1] = state[0];
++	state[0] = *current;
++
++	*current = x / MAX_SAMPLES;
 +}
 +
 +/*****************************************************************************
@@ -9309,7 +9304,7 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmFilter.h
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmFilter.h	2005-12-24 16:57:10.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmFilter.h	2006-01-04 22:15:07.000000000 -0500
 @@ -0,0 +1,41 @@
 +/*
 + * Copyright 1995-2003 by Frederic Lepied, France. <Lepied@XFree86.org>
@@ -9355,7 +9350,7 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmISDV4.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmISDV4.c	2005-12-24 16:57:10.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmISDV4.c	2006-01-04 22:14:58.000000000 -0500
 @@ -0,0 +1,288 @@
 +/*
 + * Copyright 1995-2003 by Frederic Lepied, France. <Lepied@XFree86.org>
@@ -9409,7 +9404,7 @@
 +		NULL,                 /* tilt automatically enabled */
 +		NULL,                 /* suppress implemented in software */
 +		NULL,                 /* link speed unsupported */
-+		isdv4StartTablet,     /* start not supported */
++		isdv4StartTablet,     /* start tablet */
 +		isdv4Parse,
 +		xf86WcmHysteresisFilter,   /* input filtering */
 +	};
@@ -9648,10 +9643,10 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmSerial.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmSerial.c	2005-12-24 16:57:10.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmSerial.c	2006-01-04 22:14:58.000000000 -0500
 @@ -0,0 +1,1321 @@
 +/*
-+ * Copyright 1995-2004 by Frederic Lepied, France. <Lepied@XFree86.org>
++ * Copyright 1995-2005 by Frederic Lepied, France. <Lepied@XFree86.org>
 + *                                                                            
 + * Permission to use, copy, modify, distribute, and sell this software and its
 + * documentation for any purpose is  hereby granted without fee, provided that
@@ -10357,7 +10352,7 @@
 +	const unsigned char* data)
 +{
 +	int n;
-+	int is_stylus=0, have_data=0;
++	int have_data=0;
 +	int channel;
 +	WacomDeviceState* ds;
 +
@@ -10418,7 +10413,6 @@
 +	else if (((data[0] & 0xb8) == 0xa0) ||
 +			((data[0] & 0xbe) == 0xb4))
 +	{
-+		is_stylus = 1;
 +		ds->x = (((data[1] & 0x7f) << 9) |
 +				((data[2] & 0x7f) << 2) |
 +				((data[3] & 0x60) >> 5));
@@ -10429,7 +10423,7 @@
 +		{
 +			ds->pressure = (((data[5] & 0x07) << 7) |
 +				(data[6] & 0x7f));
-+			ds->buttons = (((data[0]) & 0x06));
++			ds->buttons = (data[0] & 0x06);
 +		}
 +		else
 +		{
@@ -10451,7 +10445,6 @@
 +	else if (((data[0] & 0xbe) == 0xa8) ||
 +			((data[0] & 0xbe) == 0xb0))
 +	{
-+		is_stylus = 0;
 +		ds->x = (((data[1] & 0x7f) << 9) |
 +				((data[2] & 0x7f) << 2) |
 +				((data[3] & 0x60) >> 5));
@@ -10494,7 +10487,6 @@
 +	/* 4D mouse 2nd packet */
 +	else if ((data[0] & 0xbe) == 0xaa)
 +	{
-+		is_stylus = 0;
 +		ds->x = (((data[1] & 0x7f) << 9) |
 +			((data[2] & 0x7f) << 2) |
 +			((data[3] & 0x60) >> 5));
@@ -10639,7 +10631,7 @@
 +	common->wcmPktLength = 7;
 +	common->wcmVersion = version;
 +
-+	common->wcmMaxZ = 256;
++	common->wcmMaxZ = 255;
 +	common->wcmResolX = 1000; /* tablet X resolution in points/inch */
 +	common->wcmResolY = 1000; /* tablet Y resolution in points/inch */
 +}
@@ -10656,9 +10648,9 @@
 +	/* Graphire models don't answer WC_COORD requests */
 +	common->wcmMaxX = 5103;
 +	common->wcmMaxY = 3711;
-+	common->wcmMaxZ = 512;
-+	common->wcmResolX = 1000; /* tablet X resolution in points/inch */
-+	common->wcmResolY = 1000; /* tablet Y resolution in points/inch */
++	common->wcmMaxZ = 511;
++	common->wcmResolX = 1016; /* tablet X resolution in points/inch */
++	common->wcmResolY = 1016; /* tablet Y resolution in points/inch */
 +}
 +
 +static void serialInitProtocol4(WacomCommonPtr common, int fd,
@@ -10910,10 +10902,6 @@
 +	if (!last->proximity && ds->proximity) 
 +		ds->device_type = cur_type;
 +
-+	/* out of prox */
-+	else if (!ds->proximity)
-+		memset(ds,0,sizeof(*ds));
-+
 +	/* check on previous proximity */
 +	else if (is_stylus)
 +	{
@@ -10928,6 +10916,13 @@
 +			ds->device_type = cur_type;
 +		}
 +	}
++	else if (ds->device_type != cur_type) /* missed out-prox event*/
++	{
++		/* send a prox-out for old device */
++		WacomDeviceState out = { 0 };
++		xf86WcmEvent(common,0,&out);
++		ds->device_type = cur_type;
++	}
 +
 +	DBG(8, ErrorF("serialParseP4Common %s\n",
 +		ds->device_type == CURSOR_ID ? "CURSOR" :
@@ -10974,7 +10969,7 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmSerial.h
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmSerial.h	2005-12-24 16:57:10.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmSerial.h	2006-01-04 22:15:07.000000000 -0500
 @@ -0,0 +1,70 @@
 +/*
 + * Copyright 1995-2003 by Frederic Lepied, France. <Lepied@XFree86.org>
@@ -11049,10 +11044,10 @@
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/wcmUSB.c
 ===================================================================
 --- /dev/null	1970-01-01 00:00:00.000000000 +0000
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmUSB.c	2005-12-24 16:57:10.000000000 -0500
-@@ -0,0 +1,603 @@
++++ xc/programs/Xserver/hw/xfree86/input/wacom/wcmUSB.c	2006-01-04 22:14:58.000000000 -0500
+@@ -0,0 +1,718 @@
 +/*
-+ * Copyright 1995-2003 by Frederic Lepied, France. <Lepied@XFree86.org>
++ * Copyright 1995-2004 by Frederic Lepied, France. <Lepied@XFree86.org>
 + *                                                                            
 + * Permission to use, copy, modify, distribute, and sell this software and its
 + * documentation for any purpose is  hereby granted without fee, provided that
@@ -11233,6 +11228,21 @@
 +		xf86WcmFilterIntuos,  /* input filtering recommended */
 +	};
 +
++	static WacomModel usbIntuos3 =
++	{
++		"USB Intuos3",
++		usbInitProtocol5,
++		NULL,                 /* resolution not queried */
++		usbGetRanges,
++		NULL,                 /* reset not supported */
++		NULL,                 /* tilt automatically enabled */
++		NULL,                 /* suppress implemented in software */
++		NULL,                 /* link speed unsupported */
++		NULL,                 /* start not supported */
++		usbParse,
++		xf86WcmFilterIntuos,  /* input filtering recommended */
++	};
++
 +	static WacomModel usbVolito =
 +	{
 +		"USB Volito",
@@ -11248,6 +11258,20 @@
 +		xf86WcmFilterCoord,   /* input filtering */
 +	};
 +
++	static WacomModel usbCintiqV5 =
++	{
++		"USB Cintiq 21UX",
++		usbInitProtocol5,
++		NULL,                 /* resolution not queried */
++		usbGetRanges,
++		NULL,                 /* reset not supported */
++		NULL,                 /* tilt automatically enabled */
++		NULL,                 /* suppress implemented in software */
++		NULL,                 /* link speed unsupported */
++		NULL,                 /* start not supported */
++		usbParse,
++		xf86WcmFilterIntuos,  /* input filtering recommended */
++	};
 +
 +/*****************************************************************************
 + * usbDetect --
@@ -11265,12 +11289,23 @@
 +    
 +	if (!err)
 +	{
-+		ErrorF("%s Wacom Kernel Input driver version is %d.%d.%d\n",
++/*		ErrorF("%s Wacom Kernel Input driver version is %d.%d.%d\n",
 +				XCONFIG_PROBED, version >> 16,
 +				(version >> 8) & 0xff, version & 0xff);
-+		return 1;
++*/		return 1;
 +	}
 +
++	/* for kernel 2.6 or later */
++#ifdef EV_SYN
++	/* Try to grab the event device so that data don't leak to /dev/input/mice */
++	SYSCALL(err = ioctl(local->fd, EVIOCGRAB, (pointer)1));
++
++	if (err < 0) {
++		ErrorF("%s Wacom X driver can't grab event device, errno=%d\n",
++			local->name, errno);
++	}
++#endif
++
 +	return 0;
 +}
 +
@@ -11340,6 +11375,14 @@
 +
 +			case 0x60: /* Volito */
 +				model = &usbVolito; break;
++
++			case 0xB0: /* Intuos3 4x5 */
++			case 0xB1: /* Intuos3 6x8 */
++			case 0xB2: /* Intuos3 9x12 */
++				model = &usbIntuos3; break;
++
++			case 0x3F: /* Cintiq 21UX */
++				model = &usbCintiqV5; break;
 +		}
 +	}
 +
@@ -11353,9 +11396,17 @@
 +	float version)
 +{
 +	DBG(2, ErrorF("detected a protocol 5 model (%s)\n",id));
-+	common->wcmResolX = common->wcmResolY = 2540;
 +	common->wcmProtocolLevel = 5;
-+	common->wcmChannelCnt = 2;
++	if ( strstr(id, "Intuos3") || strstr(id, "21UX") )
++	{
++		common->wcmChannelCnt = 1;
++		common->wcmResolX = common->wcmResolY = 5080;
++	}
++	else
++	{
++		common->wcmChannelCnt = 2;
++		common->wcmResolX = common->wcmResolY = 2540;
++	}
 +	common->wcmPktLength = sizeof(struct input_event);
 +}
 +
@@ -11363,7 +11414,12 @@
 +	float version)
 +{
 +	DBG(2, ErrorF("detected a protocol 4 model (%s)\n",id));
-+	common->wcmResolX = common->wcmResolY = 1016;
++	if ( strstr(id, "Cintiq") )
++		common->wcmResolX = common->wcmResolY = 508;
++	else if ( strstr(id, "PenPartner") )
++		common->wcmResolX = common->wcmResolY = 1000;
++	else
++		common->wcmResolX = common->wcmResolY = 1016;
 +	common->wcmProtocolLevel = 4;
 +	common->wcmPktLength = sizeof(struct input_event);
 +}
@@ -11405,6 +11461,11 @@
 +				return !Success;
 +			}
 +			common->wcmMaxX = nValues[2];
++			if (common->wcmMaxX <= 0)
++			{
++				ErrorF("WACOM: xmax value is wrong.\n");
++				return !Success;
++			}
 +		}
 +
 +		/* max y */
@@ -11416,6 +11477,11 @@
 +				return !Success;
 +			}
 +			common->wcmMaxY = nValues[2];
++			if (common->wcmMaxY <= 0)
++			{
++				ErrorF("WACOM: ymax value is wrong.\n");
++				return !Success;
++			}
 +		}
 +
 +		/* max z cannot be configured */
@@ -11425,7 +11491,17 @@
 +			return !Success;
 +		}
 +		common->wcmMaxZ = nValues[2];
++		if (common->wcmMaxZ <= 0)
++		{
++			ErrorF("WACOM: press max value is wrong.\n");
++			return !Success;
++		}
 +	}
++	else
++	{
++		ErrorF("WACOM: unable to ioctl max values.\n");
++		return !Success;
++	}
 +
 +	return Success;
 +}
@@ -11458,12 +11534,13 @@
 +	/* save it for later */
 +	common->wcmEvents[common->wcmEventCnt++] = *event;
 +
-+	/* packet terminated by MSC_SERIAL on kernel 2.4 and SYN_REPORT on kernel 2.5 */
++	/* packet terminated by MSC_SERIAL on kernel 2.4 and SYN_REPORT on kernel 2.6 */
 +	if ((event->type != EV_MSC) || (event->code != MSC_SERIAL))
 +	{
 +#ifdef EV_SYN
 +		/* none serial number tools fall here */
-+		if ((event->type == EV_SYN) && (event->code == SYN_REPORT) && (common->wcmChannelCnt == 1))
++		if ((event->type == EV_SYN) && (event->code == SYN_REPORT) 
++			&& (common->wcmChannelCnt == 1))
 +		{
 +			usbParseChannel(common,0,0);
 +			common->wcmEventCnt = 0;
@@ -11475,9 +11552,26 @@
 +	serial = event->value;
 +	channel = -1;
 +
-+	/* one channel only? must be it. */
++	/* one channel only? */
 +	if (common->wcmChannelCnt == 1)
-+		channel = 0;
++	{
++		/* Intuos3 Pad */
++		if (serial == 0xffffffff)
++		{
++			channel = 1;
++			(&common->wcmChannel[channel].work)->device_type = PAD_ID;
++			(&common->wcmChannel[channel].work)->proximity = 1;
++		}
++		else   /* must be it. */
++		{
++			channel = 0;
++			if (common->wcmChannel[0].work.proximity == 0)
++			{
++				memset(&common->wcmChannel[0],0,
++						sizeof(WacomChannel));
++			}
++		}
++	}
 +
 +	/* otherwise, find the channel */
 +	else
@@ -11509,6 +11603,8 @@
 +				if (common->wcmChannel[i].work.proximity == 0)
 +				{
 +					channel = i;
++					/* the in-prox event was missing */
++					common->wcmChannel[i].work.proximity = 1;
 +					break;
 +				}
 +			}
@@ -11531,13 +11627,14 @@
 +
 +static void usbParseChannel(WacomCommonPtr common, int channel, int serial)
 +{
-+	int i;
++	int i, shift;
 +	WacomDeviceState* ds;
 +	struct input_event* event;
 +
 +	#define MOD_BUTTONS(bit, value) do { \
++		shift = 1<<bit; \
 +		ds->buttons = (((value) != 0) ? \
-+		(ds->buttons | (bit)) : (ds->buttons & ~(bit))); \
++		(ds->buttons | (shift)) : (ds->buttons & ~(shift))); \
 +		} while (0)
 +
 +	/* all USB data operates from previous context except relative values*/
@@ -11549,7 +11646,6 @@
 +	for (i=0; i<common->wcmEventCnt; ++i)
 +	{
 +		event = common->wcmEvents + i;
-+
 +		DBG(11, ErrorF("usbParseChannel event[%d]->type=%d "
 +			"code=%d value=%d\n", i, event->type,
 +			event->code, event->value));
@@ -11561,6 +11657,10 @@
 +				ds->x = event->value;
 +			else if (event->code == ABS_Y)
 +				ds->y = event->value;
++			else if (event->code == ABS_RX)
++				ds->stripx = event->value; 
++			else if (event->code == ABS_RY)
++				ds->stripy = event->value;
 +			else if (event->code == ABS_RZ)
 +				ds->rotation = event->value;
 +			else if (event->code == ABS_TILT_X)
@@ -11568,9 +11668,7 @@
 +			else if (event->code ==  ABS_TILT_Y)
 +				ds->tilty = event->value - 64;
 +			else if (event->code == ABS_PRESSURE)
-+			{
 +				ds->pressure = event->value;
-+			}
 +			else if (event->code == ABS_DISTANCE)
 +				ds->distance = event->value;
 +			else if (event->code == ABS_WHEEL)
@@ -11583,10 +11681,7 @@
 +			if (event->code == REL_WHEEL)
 +				ds->relwheel = event->value;
 +			else
-+			{
-+				ErrorF("wacom: rel event recv'd (%d)!\n",
-+					event->code);
-+			}
++				ErrorF("wacom: rel event recv'd (%d)!\n", event->code);
 +		}
 +
 +		else if (event->type == EV_KEY)
@@ -11618,6 +11713,13 @@
 +				ds->device_type = CURSOR_ID;
 +				ds->proximity = (event->value != 0);
 +			}
++			else if (event->code == BTN_TOOL_FINGER)
++			{
++				DBG(6, ErrorF("USB Intuos3 Pad detected %x\n",
++					event->code));
++				ds->device_type = PAD_ID;
++				ds->proximity = (event->value != 0);
++			}
 +			else if (event->code == BTN_TOUCH)
 +			{
 +				/* we use the pressure to determine the button 1 */
@@ -11625,30 +11727,38 @@
 +			else if ((event->code == BTN_STYLUS) ||
 +				(event->code == BTN_MIDDLE))
 +			{
-+				MOD_BUTTONS (2, event->value);
++				MOD_BUTTONS (1, event->value);
 +			}
 +			else if ((event->code == BTN_STYLUS2) ||
 +				(event->code == BTN_RIGHT))
 +			{
-+				MOD_BUTTONS (4, event->value);
++				MOD_BUTTONS (2, event->value);
 +			}
 +			else if (event->code == BTN_LEFT)
-+				MOD_BUTTONS (1, event->value);
++				MOD_BUTTONS (0, event->value);
 +			else if (event->code == BTN_SIDE)
++				MOD_BUTTONS (3, event->value);
++			else if (event->code == BTN_EXTRA)
++				MOD_BUTTONS (4, event->value);
++			else if (event->code == BTN_0)
 +				MOD_BUTTONS (8, event->value);
-+			else if (event->code == BTN_EXTRA)
-+				MOD_BUTTONS (16, event->value);
++			else if (event->code == BTN_1)
++				MOD_BUTTONS (9, event->value);
++			else if (event->code == BTN_2)
++				MOD_BUTTONS (10, event->value);
++			else if (event->code == BTN_3)
++				MOD_BUTTONS (11, event->value);
++			else if (event->code == BTN_4)
++				MOD_BUTTONS (12, event->value);
++			else if (event->code == BTN_5)
++				MOD_BUTTONS (13, event->value);
++			else if (event->code == BTN_6)
++				MOD_BUTTONS (14, event->value);
++			else if (event->code == BTN_7)
++				MOD_BUTTONS (15, event->value);
 +		}
-+	} /* next event */
++	} /* next event */	
 +
-+	if ( !ds->device_type ){
-+		DBG(6, ErrorF("USB tool type missing \n"));
-+
-+		/* defaults to puck and in prox */
-+		ds->device_type = CURSOR_ID;
-+		ds->proximity = 1;
-+	}
-+
 +	/* dispatch event */
 +	xf86WcmEvent(common, channel, ds);
 +}
@@ -11656,8 +11766,8 @@
 +#endif /* LINUX_INPUT */
 Index: xc/programs/Xserver/hw/xfree86/input/wacom/Imakefile
 ===================================================================
---- xc/programs/Xserver/hw/xfree86/input/wacom/Imakefile.orig	2005-12-24 16:43:08.000000000 -0500
-+++ xc/programs/Xserver/hw/xfree86/input/wacom/Imakefile	2005-12-24 16:57:10.000000000 -0500
+--- xc/programs/Xserver/hw/xfree86/input/wacom/Imakefile.orig	2006-01-04 21:45:35.000000000 -0500
++++ xc/programs/Xserver/hw/xfree86/input/wacom/Imakefile	2006-01-04 22:08:46.000000000 -0500
 @@ -7,8 +7,8 @@
  DEFINES = -DLINUX_INPUT
  #endif



Reply to: