diff -urN linuxwacom-0.7.2-orig/src/wcmCommon.c linuxwacom-0.7.2/src/wcmCommon.c --- linuxwacom-0.7.2-orig/src/wcmCommon.c 2006-02-23 21:13:25.830907000 +0000 +++ linuxwacom-0.7.2/src/wcmCommon.c 2006-02-23 21:15:31.350907000 +0000 @@ -432,6 +432,11 @@ y = x; x = common->wcmMaxX - tmp_coord; } + else if (common->wcmRotate == ROTATE_HALF) + { + x = common->wcmMaxX - x; + y = common->wcmMaxY - y; + } is_absolute = (priv->flags & ABSOLUTE_FLAG); is_core_pointer = xf86IsCorePointer(local->dev); diff -urN linuxwacom-0.7.2-orig/src/xf86Wacom.c linuxwacom-0.7.2/src/xf86Wacom.c --- linuxwacom-0.7.2-orig/src/xf86Wacom.c 2006-02-23 21:13:25.800907000 +0000 +++ linuxwacom-0.7.2/src/xf86Wacom.c 2006-02-23 21:29:30.554133000 +0000 @@ -203,7 +203,7 @@ LocalDevicePtr local = (LocalDevicePtr)pWcm->public.devicePrivate; WacomDevicePtr priv = (WacomDevicePtr)PRIVATE(pWcm); WacomCommonPtr common = priv->common; - int totalWidth = 0, maxHeight = 0, tabletSize = 0; + int totalWidth = 0, maxHeight = 0; double screenRatio, tabletRatio; char m1[32], m2[32]; @@ -339,23 +339,13 @@ } /* end bounding rect */ /* x and y axes */ - if (priv->twinview == TV_LEFT_RIGHT) - tabletSize = 2*(priv->bottomX - priv->topX - 2*priv->tvoffsetX); - else - tabletSize = priv->bottomX - priv->topX; - - InitValuatorAxisStruct(pWcm, 0, 0, tabletSize, /* max val */ - common->wcmResolX, /* tablet resolution */ - 0, common->wcmResolX); /* max_res */ - - if (priv->twinview == TV_ABOVE_BELOW) - tabletSize = 2*(priv->bottomY - priv->topY - 2*priv->tvoffsetY); - else - tabletSize = priv->bottomY - priv->topY; - - InitValuatorAxisStruct(pWcm, 1, 0, tabletSize, /* max val */ - common->wcmResolY, /* tablet resolution */ - 0, common->wcmResolY); /* max_res */ + InitValuatorAxisStruct(pWcm, 0, priv->topX, priv->bottomX, /* max val */ + common->wcmResolX, /* tablet resolution */ + 0, common->wcmResolX); /* max_res */ + + InitValuatorAxisStruct(pWcm, 1, priv->topY, priv->bottomY, /* max val */ + common->wcmResolY, /* tablet resolution */ + 0, common->wcmResolY); /* max_res */ /* pressure */ InitValuatorAxisStruct(pWcm, 2, 0, @@ -663,25 +653,40 @@ static int xf86WcmSetParam(LocalDevicePtr local, int param, int value) { WacomDevicePtr priv = (WacomDevicePtr)local->private; + WacomDevicePtr tmppriv; char st[32]; + int oldRotation, dev; + int tmpTopX, tmpTopY, tmpBottomX, tmpBottomY, oldMaxX, oldMaxY; switch (param) { case XWACOM_PARAM_TOPX: xf86ReplaceIntOption(local->options, "TopX", value); priv->topX = xf86SetIntOption(local->options, "TopX", 0); + InitValuatorAxisStruct(local->dev, 0, priv->topX, priv->bottomX, + priv->common->wcmResolX, /* tablet resolution */ + 0, priv->common->wcmResolX); /* max_res */ break; case XWACOM_PARAM_TOPY: xf86ReplaceIntOption(local->options, "TopY", value); priv->topY = xf86SetIntOption(local->options, "TopY", 0); + InitValuatorAxisStruct(local->dev, 1, priv->topY, priv->bottomY, /* max val */ + priv->common->wcmResolY, /* tablet resolution */ + 0, priv->common->wcmResolY); /* max_res */ break; case XWACOM_PARAM_BOTTOMX: xf86ReplaceIntOption(local->options, "BottomX", value); priv->bottomX = xf86SetIntOption(local->options, "BottomX", 0); + InitValuatorAxisStruct(local->dev, 0, priv->topX, priv->bottomX, + priv->common->wcmResolX, /* tablet resolution */ + 0, priv->common->wcmResolX); /* max_res */ break; case XWACOM_PARAM_BOTTOMY: xf86ReplaceIntOption(local->options, "BottomY", value); priv->bottomY = xf86SetIntOption(local->options, "BottomY", 0); + InitValuatorAxisStruct(local->dev, 1, priv->topY, priv->bottomY, /* max val */ + priv->common->wcmResolY, /* tablet resolution */ + 0, priv->common->wcmResolY); /* max_res */ break; case XWACOM_PARAM_BUTTON1: if ((value < 0) || (value > 19)) return BadValue; @@ -788,6 +793,12 @@ "BottomY", priv->common->wcmMaxY); priv->bottomY = xf86SetIntOption(local->options, "BottomY", priv->common->wcmMaxY); + InitValuatorAxisStruct(local->dev, 0, priv->topX, priv->bottomX, + priv->common->wcmResolX, /* tablet resolution */ + 0, priv->common->wcmResolX); /* max_res */ + InitValuatorAxisStruct(local->dev, 1, priv->topY, priv->bottomY, /* max val */ + priv->common->wcmResolY, /* tablet resolution */ + 0, priv->common->wcmResolY); /* max_res */ break; case XWACOM_PARAM_GIMP: if ((value != 0) && (value != 1)) return BadValue; @@ -801,6 +812,103 @@ xf86ReplaceStrOption(local->options, "Gimp", "off"); } break; + case XWACOM_PARAM_ROTATE: + if ((value < 0) || (value > 3)) return BadValue; + switch(value) { + case ROTATE_NONE: + xf86ReplaceStrOption(local->options, "Rotate", "NONE"); + break; + case ROTATE_CW: + xf86ReplaceStrOption(local->options, "Rotate", "CW"); + break; + case ROTATE_CCW: + xf86ReplaceStrOption(local->options, "Rotate", "CCW"); + break; + case ROTATE_HALF: + xf86ReplaceStrOption(local->options, "Rotate", "HALF"); + break; + default: + return BadValue; + } + oldRotation = priv->common->wcmRotate; + oldMaxX = priv->common->wcmMaxX; + oldMaxY = priv->common->wcmMaxY; + priv->common->wcmRotate = value; + if (((oldRotation == ROTATE_NONE || oldRotation == ROTATE_HALF) && (value == ROTATE_CW || value == ROTATE_CCW)) || + ((oldRotation == ROTATE_CW || oldRotation == ROTATE_CCW) && (value == ROTATE_NONE || value == ROTATE_HALF))) + { + priv->common->wcmMaxX = oldMaxY; + priv->common->wcmMaxY = oldMaxX; + } + + /* rotate all devices at once! else they get misaligned */ + for (dev=0; dev < priv->common->wcmNumDevices; dev++) + { + tmppriv = (WacomDevicePtr)priv->common->wcmDevices[dev]->private; + /* recover the unrotated xy-rectangles */ + switch (oldRotation) { + case ROTATE_CW: + tmpTopX = oldMaxY - tmppriv->bottomY; + tmpBottomX = oldMaxY - tmppriv->topY; + tmpTopY = tmppriv->topX; + tmpBottomY = tmppriv->bottomX; + break; + case ROTATE_CCW: + tmpTopX = tmppriv->topY; + tmpBottomX = tmppriv->bottomY; + tmpTopY = oldMaxX - tmppriv->bottomX; + tmpBottomY = oldMaxX - tmppriv->topX; + break; + case ROTATE_HALF: + tmpTopX = oldMaxX - tmppriv->bottomX; + tmpBottomX = oldMaxX - tmppriv->topX; + tmpTopY = oldMaxY - tmppriv->bottomY; + tmpBottomY = oldMaxY - tmppriv->topY; + break; + default: /* ROTATE_NONE */ + tmpTopX = tmppriv->topX; + tmpBottomX = tmppriv->bottomX; + tmpTopY = tmppriv->topY; + tmpBottomY = tmppriv->bottomY; + break; + } + /* and rotate them back */ + switch (value) { + case ROTATE_CW: + tmppriv->topX = tmpTopY; + tmppriv->bottomX = tmpBottomY; + tmppriv->topY = priv->common->wcmMaxY - tmpBottomX; + tmppriv->bottomY = priv->common->wcmMaxY - tmpTopX; + break; + case ROTATE_CCW: + tmppriv->topX = priv->common->wcmMaxX - tmpBottomY; + tmppriv->bottomX = priv->common->wcmMaxX - tmpTopY; + tmppriv->topY = tmpTopX; + tmppriv->bottomY = tmpBottomX; + break; + case ROTATE_HALF: + tmppriv->topX = priv->common->wcmMaxX - tmpBottomX; + tmppriv->bottomX = priv->common->wcmMaxX - tmpTopX; + tmppriv->topY= priv->common->wcmMaxY - tmpBottomY; + tmppriv->bottomY = priv->common->wcmMaxY - tmpTopY; + break; + default: /* ROTATE_NONE */ + tmppriv->topX = tmpTopX; + tmppriv->bottomX = tmpBottomX; + tmppriv->topY = tmpTopY; + tmppriv->bottomY = tmpBottomY; + break; + } + + InitValuatorAxisStruct(priv->common->wcmDevices[dev]->dev, + 0, tmppriv->topX, tmppriv->bottomX, priv->common->wcmResolX, /* tablet resolution */ + 0, priv->common->wcmResolX); /* max_res */ + + InitValuatorAxisStruct(priv->common->wcmDevices[dev]->dev, + 1, tmppriv->topY, tmppriv->bottomY, priv->common->wcmResolY, /* tablet resolution */ + 0, priv->common->wcmResolY); /* max_res */ + } + break; case XWACOM_PARAM_MMT: if ((value != 0) && (value != 1)) return BadValue; priv->common->wcmMMonitor = value; diff -urN linuxwacom-0.7.2-orig/src/xf86Wacom.h linuxwacom-0.7.2/src/xf86Wacom.h --- linuxwacom-0.7.2-orig/src/xf86Wacom.h 2006-02-23 21:13:25.800907000 +0000 +++ linuxwacom-0.7.2/src/xf86Wacom.h 2006-02-23 21:35:14.244133000 +0000 @@ -150,6 +150,11 @@ #define ERASER_PROX 4 #define OTHER_PROX 1 +#define ROTATE_NONE XWACOM_VALUE_ROTATE_NONE +#define ROTATE_CW XWACOM_VALUE_ROTATE_CW +#define ROTATE_CCW XWACOM_VALUE_ROTATE_CCW +#define ROTATE_HALF XWACOM_VALUE_ROTATE_HALF + /****************************************************************************** * Forward Declarations *****************************************************************************/ @@ -414,10 +419,6 @@ #define DEVICE_ISDV4 0x000C -#define ROTATE_NONE 0 -#define ROTATE_CW 1 -#define ROTATE_CCW 2 - #define MAX_CHANNELS 2 #define MAX_USB_EVENTS 32 diff -urN linuxwacom-0.7.2-orig/src/xsetwacom.c linuxwacom-0.7.2/src/xsetwacom.c --- linuxwacom-0.7.2-orig/src/xsetwacom.c 2006-02-23 21:13:25.790907000 +0000 +++ linuxwacom-0.7.2/src/xsetwacom.c 2006-02-23 21:42:27.264133000 +0000 @@ -186,6 +186,13 @@ XWACOM_PARAM_MMT, VALUE_OPTIONAL, RANGE, 0, 1, BOOLEAN_VALUE, 1 }, + { "Rotate", + "Sets the rotation of the tablet. " + "Values = NONE, CW, CCW, HALF (default is NONE).", + XWACOM_PARAM_ROTATE, VALUE_OPTIONAL, + RANGE, XWACOM_VALUE_ROTATE_NONE, XWACOM_VALUE_ROTATE_HALF, SINGLE_VALUE, + XWACOM_VALUE_ROTATE_NONE }, + { "TPCButton", "Turns on/off Tablet PC buttons." "default is off for regular tablets, " @@ -406,6 +413,23 @@ !strcasecmp(pszValues[i],"false") || !strcasecmp(pszValues[i],"relative"))) nValues[i] = 0; + else if (p->nParamID == XWACOM_PARAM_ROTATE) + { + if (!strcasecmp(pszValues[i],"none")) + nValues[i] = XWACOM_VALUE_ROTATE_NONE; + else if (!strcasecmp(pszValues[i],"cw")) + nValues[i] = XWACOM_VALUE_ROTATE_CW; + else if (!strcasecmp(pszValues[i],"ccw")) + nValues[i] = XWACOM_VALUE_ROTATE_CCW; + else if (!strcasecmp(pszValues[i],"half")) + nValues[i] = XWACOM_VALUE_ROTATE_HALF; + else + { + fprintf(stderr,"Set: Value '%s' is " + "invalid.\n",pszValues[i]); + return 1; + } + } else { fprintf(stderr,"Set: Value '%s' is " diff -urN linuxwacom-0.7.2-orig/src/Xwacom.h linuxwacom-0.7.2/src/Xwacom.h --- linuxwacom-0.7.2-orig/src/Xwacom.h 2006-02-23 21:13:25.790907000 +0000 +++ linuxwacom-0.7.2/src/Xwacom.h 2006-02-23 21:40:45.804133000 +0000 @@ -44,5 +44,11 @@ #define XWACOM_PARAM_GIMP 102 #define XWACOM_PARAM_MMT 103 #define XWACOM_PARAM_TPCBUTTON 104 +#define XWACOM_PARAM_ROTATE 105 + +#define XWACOM_VALUE_ROTATE_NONE 0 +#define XWACOM_VALUE_ROTATE_CW 1 +#define XWACOM_VALUE_ROTATE_CCW 2 +#define XWACOM_VALUE_ROTATE_HALF 3 #endif /* __XF86_XWACOM_H */