Updated with your comments and merged "Update property description for
left click threshold" patch as well.
Instead of reporting the raw pressure, the normalized pressure from
0 to FILTER_PRESSURE_RES (which is 2048) is reported. This is mainly
to deal with the case where heavily used stylus may have a "pre-loaded"
initial pressure. This patch checks the in-prox pressure and subtract
it from the raw pressure to prevent a potential left-click before the
pen touches the tablet.
Left click threshold and pressure curve are updated accordingly.
Signed-off-by: Ping Cheng <[email protected]>
From c0919ad91f129d50bfd47d34bfd3664912b65a8f Mon Sep 17 00:00:00 2001
From: Ping Cheng <[email protected]>
Date: Wed, 14 Apr 2010 13:37:08 -0700
Subject: [PATCH] xf86-input-wacom: Normalize pressure sensitivity
Instead of reporting the raw pressure, the normalized pressure from
0 to FILTER_PRESSURE_RES (which is 2048) is reported. This is mainly
to deal with the case where heavily used stylus may have a "pre-loaded"
initial pressure. This patch checks the in-prox pressure and subtract
it from the raw pressure to prevent a potential left-click before the
pen touches the tablet.
Left click threshold and pressure curve are updated accordingly.
Signed-off-by: Ping Cheng <[email protected]>
---
src/wcmCommon.c | 71 +++++++++++++++++++++++++++++++++-----------------
src/wcmXCommand.c | 2 +-
src/xf86Wacom.c | 4 +-
src/xf86WacomDefs.h | 1 +
tools/xsetwacom.c | 4 +-
5 files changed, 53 insertions(+), 29 deletions(-)
diff --git a/src/wcmCommon.c b/src/wcmCommon.c
index f5a91d4..1d4a90e 100644
--- a/src/wcmCommon.c
+++ b/src/wcmCommon.c
@@ -26,6 +26,10 @@
#include <xkbsrv.h>
#include <xf86_OSproc.h>
+/* Tested result for setting the pressure threshold to a reasonable value */
+#define THRESHOLD_TOLERANCE 125
+#define RATIO_FOR_THRESHOLD 75
+
/*****************************************************************************
* Static functions
****************************************************************************/
@@ -1445,18 +1449,47 @@ static void commonDispatchDevice(WacomCommonPtr common, unsigned int channel,
if (IsStylus(priv) || IsEraser(priv))
{
+ /* Instead of reporting the raw pressure, we normalize
+ * the pressure from 0 to FILTER_PRESSURE_RES. This is
+ * mainly to deal with the case where heavily used
+ * stylus may have a "pre-loaded" initial pressure. To
+ * do so, we keep the in-prox pressure and subtract it
+ * from the raw pressure to prevent a potential
+ * left-click before the pen touches the tablet.
+ */
+ double tmpP;
+
+ /* set the minimum pressure when in prox */
+ if (!priv->oldProximity)
+ priv->minPressure = filtered.pressure;
+ else if (priv->minPressure > filtered.pressure)
+ priv->minPressure = filtered.pressure;
+
+ /* normalize pressure to FILTER_PRESSURE_RES */
+ tmpP = (filtered.pressure - priv->minPressure)
+ * FILTER_PRESSURE_RES;
+ tmpP /= common->wcmMaxZ - priv->minPressure;
+ filtered.pressure = (int)tmpP;
+
/* set button1 (left click) on/off */
- if (filtered.pressure >= common->wcmThreshold)
- filtered.buttons |= button;
- else
+ if (filtered.pressure < common->wcmThreshold)
{
- /* threshold tolerance */
- int tol = common->wcmMaxZ / 250;
- if (strstr(common->wcmModel->name, "Intuos4"))
- tol = common->wcmMaxZ / 125;
- if (filtered.pressure < common->wcmThreshold - tol)
- filtered.buttons &= ~button;
+ filtered.buttons &= ~button;
+ if (priv->oldButtons & button) /* left click was on */
+ {
+ /* threshold tolerance */
+ int tol = FILTER_PRESSURE_RES / THRESHOLD_TOLERANCE;
+
+ /* don't set it off if it is within the tolerance
+ and the tolerance is larger than threshold */
+ if ((common->wcmThreshold > tol) &&
+ (filtered.pressure > common->wcmThreshold - tol))
+ filtered.buttons |= button;
+ }
}
+ else
+ filtered.buttons |= button;
+
/* transform pressure */
transPressureCurve(priv,&filtered);
}
@@ -1601,10 +1634,8 @@ int wcmInitTablet(LocalDevicePtr local, const char* id, float version)
if (common->wcmThreshold <= 0)
{
/* Threshold for counting pressure as a button */
- if (strstr(common->wcmModel->name, "Intuos4"))
- common->wcmThreshold = common->wcmMaxZ * 3 / 25;
- else
- common->wcmThreshold = common->wcmMaxZ * 3 / 50;
+ common->wcmThreshold = FILTER_PRESSURE_RES / RATIO_FOR_THRESHOLD;
+
xf86Msg(X_PROBED, "%s: using pressure threshold of %d for button 1\n",
local->name, common->wcmThreshold);
}
@@ -1645,21 +1676,13 @@ static void transPressureCurve(WacomDevicePtr pDev, WacomDeviceStatePtr pState)
{
if (pDev->pPressCurve)
{
- int p = pState->pressure;
+ /* clip the pressure */
+ int p = max(0, pState->pressure);
- /* clip */
- p = (p < 0) ? 0 : (p > pDev->common->wcmMaxZ) ?
- pDev->common->wcmMaxZ : p;
-
- /* rescale pressure to FILTER_PRESSURE_RES */
- p = (p * FILTER_PRESSURE_RES) / pDev->common->wcmMaxZ;
+ p = min(FILTER_PRESSURE_RES, p);
/* apply pressure curve function */
p = pDev->pPressCurve[p];
-
- /* scale back to wcmMaxZ */
- pState->pressure = (p * pDev->common->wcmMaxZ) /
- FILTER_PRESSURE_RES;
}
}
diff --git a/src/wcmXCommand.c b/src/wcmXCommand.c
index c8e4f5f..40207a3 100644
--- a/src/wcmXCommand.c
+++ b/src/wcmXCommand.c
@@ -636,7 +636,7 @@ int wcmSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
value = *(CARD32*)prop->data;
- if ((value < 1) || (value > common->wcmMaxZ))
+ if ((value < 1) || (value > FILTER_PRESSURE_RES))
return BadValue;
if (!checkonly)
diff --git a/src/xf86Wacom.c b/src/xf86Wacom.c
index efca491..3f951df 100644
--- a/src/xf86Wacom.c
+++ b/src/xf86Wacom.c
@@ -767,12 +767,12 @@ static int wcmRegisterX11Devices (LocalDevicePtr local)
/* Rotation rotates the Max X and Y */
wcmRotateTablet(local, common->wcmRotate);
- /* pressure */
+ /* pressure normalized to FILTER_PRESSURE_RES */
InitValuatorAxisStruct(local->dev, 2,
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
XIGetKnownProperty(AXIS_LABEL_PROP_ABS_PRESSURE),
#endif
- 0, common->wcmMaxZ, 1, 1, 1);
+ 0, FILTER_PRESSURE_RES, 1, 1, 1);
if (IsCursor(priv))
{
diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
index 2f9e827..da5e2cf 100644
--- a/src/xf86WacomDefs.h
+++ b/src/xf86WacomDefs.h
@@ -242,6 +242,7 @@ struct _WacomDeviceRec
/* JEJ - filters */
int* pPressCurve; /* pressure curve */
int nPressCtrl[4]; /* control points for curve */
+ int minPressure; /* the minimum pressure a pen may hold */
WacomToolPtr tool; /* The common tool-structure for this device */
WacomToolAreaPtr toolarea; /* The area defined for this device */
diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c
index 03a820a..ae3adf1 100644
--- a/tools/xsetwacom.c
+++ b/tools/xsetwacom.c
@@ -495,8 +495,8 @@ static param_t parameters[] =
},
{
.name = "ClickForce",
- .desc = "Sets tip/eraser pressure threshold = ClickForce*MaxZ/100 "
- "(default is 6)",
+ .desc = "Sets tip/eraser pressure threshold "
+ "(default is FILTER_PRESSURE_RES / 75 )",
.prop_name = WACOM_PROP_PRESSURE_THRESHOLD,
.prop_format = 32,
.prop_offset = 0,
--
1.6.6.1
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel