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: