On Wed, Feb 12, 2014 at 08:04:07PM +0100, Egbert Eich wrote: > From: Egbert Eich <e...@suse.com> > > If the initial pressure of a device is != 0 the driver recalibrates > the pressure range. This is to account for worn out devices. > The downside is that when the user hits the tablet very hard the > initial pressure reading may be unequal to zero even for a perfectly > good pen. If the consecutive pressure readings are not higher than > the initial pressure by a threshold no button event will be generated. > This option allows to disable the recalibration.
can we be smarter about this? e.g. disable worn-out pen detection once a tool has shown that it repeatedly sent events below the threshold. I don't think an option is the right way to go here, with the driver and desktop environments repeatedly interfering with each other I'm hesitant to add options for something that we could probably solve for the >90% use-case. Cheers, Peter > Signed-off-by: Egbert Eich <e...@suse.com> > --- > include/wacom-properties.h | 4 ++++ > man/wacom.man | 10 ++++++++++ > man/xsetwacom.man | 9 +++++++++ > src/wcmCommon.c | 8 +++++--- > src/wcmValidateDevice.c | 6 ++++++ > src/wcmXCommand.c | 23 +++++++++++++++++++++++ > src/xf86WacomDefs.h | 2 ++ > tools/xsetwacom.c | 11 ++++++++++- > 8 files changed, 69 insertions(+), 4 deletions(-) > > diff --git a/include/wacom-properties.h b/include/wacom-properties.h > index dd7e7f3..cb94ffc 100644 > --- a/include/wacom-properties.h > +++ b/include/wacom-properties.h > @@ -103,6 +103,10 @@ > */ > #define WACOM_PROP_DEBUGLEVELS "Wacom Debug Levels" > > +/* BOOL, 1 value, > + TRUE == pressure renormalization enabled, FALSE == pressure > renormalization disabled > +*/ > +#define WACOM_PROP_PRESSURE_RECAL "Wacom Pressure Recalibration" > > /* The following are tool types used by the driver in WACOM_PROP_TOOL_TYPE > * or in the 'type' field for XI1 clients. Clients may check for one of > diff --git a/man/wacom.man b/man/wacom.man > index 98dec37..ae042f6 100644 > --- a/man/wacom.man > +++ b/man/wacom.man > @@ -257,6 +257,16 @@ recognized as tap. A press and release event shorter than > generates button press and release events. Presses longer than > .B TapTime > do not generate button events, only motion events. > +.TP 4 > +.B Option \fI"PressureRecalibration"\fP \fI"bool"\fP > +Allows to disable pressure recalibration. Default: true. > +If the initial pressure of a device is != 0 the driver recalibrates > +the pressure range. This is to account for worn out devices. > +The downside is that when the user hits the tablet very hard the > +initial pressure reading may be unequal to zero even for a perfectly > +good pen. If the consecutive pressure readings are not higher than > +the initial pressure by a threshold no button event will be generated. > +This option allows to disable the recalibration. > .RE > .SH "TOUCH GESTURES" > .SS Single finger (1FG) > diff --git a/man/xsetwacom.man b/man/xsetwacom.man > index 978b104..6255352 100644 > --- a/man/xsetwacom.man > +++ b/man/xsetwacom.man > @@ -227,6 +227,15 @@ code paths that are specific to a given tool. A higher > level means more > fine-grained debug messages, a level of 0 turns debugging off for this > tool. Requires the driver to be built with debugging enabled. See also > TabletDebugLevel. Default: 0, range of 0 to 12. > +.TP > +\fBPressureRecalibration\fR on|off > +If the initial pressure of a device is != 0 the driver recalibrates > +the pressure range. This is to account for worn out devices. > +The downside is that when the user hits the tablet very hard the > +initial pressure reading may be unequal to zero even for a perfectly > +good pen. If the consecutive pressure readings are not higher than > +the initial pressure by a threshold no button event will be generated. > +This option allows to disable the recalibration. Default: on > > > .SH "AUTHORS" > diff --git a/src/wcmCommon.c b/src/wcmCommon.c > index 0ea7be8..5fa2ef9 100644 > --- a/src/wcmCommon.c > +++ b/src/wcmCommon.c > @@ -1266,8 +1266,10 @@ static void commonDispatchDevice(WacomCommonPtr > common, unsigned int channel, > if ((IsPen(priv) || IsTouch(priv)) && common->wcmMaxZ) > { > detectPressureIssue(priv, common, &filtered); > - priv->minPressure = rebasePressure(priv, &filtered); > - filtered.pressure = normalizePressure(priv, &filtered); > + if (common->wcmPressureRecalibration) { > + priv->minPressure = rebasePressure(priv, &filtered); > + filtered.pressure = normalizePressure(priv, &filtered); > + } > if (IsPen(priv)) > filtered.buttons = setPressureButton(priv, &filtered); > filtered.pressure = applyPressureCurve(priv,&filtered); > @@ -1501,7 +1503,7 @@ WacomCommonPtr wcmNewCommon(void) > /* transmit position if increment is superior */ > common->wcmRawSample = DEFAULT_SAMPLES; > /* number of raw data to be used to for filtering */ > - > + common->wcmPressureRecalibration = 1; > return common; > } > > diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c > index cc0b807..2f3b7b7 100644 > --- a/src/wcmValidateDevice.c > +++ b/src/wcmValidateDevice.c > @@ -965,6 +965,12 @@ Bool wcmPreInitParseOptions(InputInfoPtr pInfo, Bool > is_primary, > common->wcmGestureParameters.wcmTapTime); > } > > + if (IsStylus(priv) || IsEraser(priv)) { > + common->wcmPressureRecalibration > + = xf86SetBoolOption(pInfo->options, > + "PressureRecalibration", 1); > + } > + > /* Swap stylus buttons 2 and 3 for Tablet PCs */ > if (TabletHasFeature(common, WCM_TPC) && IsStylus(priv)) > { > diff --git a/src/wcmXCommand.c b/src/wcmXCommand.c > index b2ba5a5..3596a8e 100644 > --- a/src/wcmXCommand.c > +++ b/src/wcmXCommand.c > @@ -98,6 +98,7 @@ Atom prop_hover; > Atom prop_tooltype; > Atom prop_btnactions; > Atom prop_product_id; > +Atom prop_pressure_recal; > #ifdef DEBUG > Atom prop_debuglevels; > #endif > @@ -300,6 +301,13 @@ void InitWcmDeviceProperties(InputInfoPtr pInfo) > wcmResetWheelAction(pInfo, i); > } > > + if (IsStylus(priv) || IsEraser(priv)) { > + values[0] = !common->wcmPressureRecalibration; > + prop_pressure_recal = InitWcmAtom(pInfo->dev, > + WACOM_PROP_PRESSURE_RECAL, > + XA_INTEGER, 8, 1, values); > + } > + > values[0] = common->vendor_id; > values[1] = common->tablet_id; > prop_product_id = InitWcmAtom(pInfo->dev, XI_PROP_PRODUCT_ID, > XA_INTEGER, 32, 2, values); > @@ -848,6 +856,21 @@ int wcmSetProperty(DeviceIntPtr dev, Atom property, > XIPropertyValuePtr prop, > { > int nbuttons = priv->nbuttons < 4 ? priv->nbuttons : > priv->nbuttons + 4; > return wcmSetActionsProperty(dev, property, prop, checkonly, > nbuttons, priv->btn_actions, priv->keys); > + } else if (property == prop_pressure_recal) > + { > + CARD8 *values = (CARD8*)prop->data; > + > + if (prop->size != 1 || prop->format != 8) > + return BadValue; > + > + if ((values[0] != 0) && (values[0] != 1)) > + return BadValue; > + > + if (!IsStylus(priv) && !IsEraser(priv)) > + return BadMatch; > + > + if (!checkonly) > + common->wcmPressureRecalibration = !values[0]; > } else > { > Atom *handler = NULL; > diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h > index 6de9645..8a46c9b 100644 > --- a/src/xf86WacomDefs.h > +++ b/src/xf86WacomDefs.h > @@ -486,6 +486,8 @@ struct _WacomCommonRec > int wcmCursorProxoutDistDefault; /* Default max mouse distance for > proxy-out */ > int wcmSuppress; /* transmit position on delta > > supress */ > int wcmRawSample; /* Number of raw data used to filter an > event */ > + int wcmPressureRecalibration; /* Determine if pressure recalibration of > + worn pens should be performed */ > > int bufpos; /* position with buffer */ > unsigned char buffer[BUFFER_SIZE]; /* data read from device */ > diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c > index bbe25ea..4e062e8 100644 > --- a/tools/xsetwacom.c > +++ b/tools/xsetwacom.c > @@ -433,6 +433,15 @@ static param_t parameters[] = > .prop_flags = PROP_FLAG_READONLY > }, > { > + .name = "PressureRecalibration", > + .desc = "Turns on/off Tablet pressure recalibration", > + .prop_name = WACOM_PROP_PRESSURE_RECAL, > + .prop_format = 8, > + .prop_offset = 0, > + .arg_count = 1, > + .prop_flags = PROP_FLAG_BOOLEAN | PROP_FLAG_INVERTED > + }, > + { > .name = "MapToOutput", > .desc = "Map the device to the given output. ", > .set_func = set_output, > @@ -2791,7 +2800,7 @@ static void test_parameter_number(void) > * deprecated them. > * Numbers include trailing NULL entry. > */ > - assert(ARRAY_SIZE(parameters) == 37); > + assert(ARRAY_SIZE(parameters) == 38); > assert(ARRAY_SIZE(deprecated_parameters) == 17); > } > > -- > 1.8.1.4 > > > ------------------------------------------------------------------------------ > Android apps run on BlackBerry 10 > Introducing the new BlackBerry 10.2.1 Runtime for Android apps. > Now with support for Jelly Bean, Bluetooth, Mapview and more. > Get your Android app in front of a whole new audience. Start now. > http://pubads.g.doubleclick.net/gampad/clk?id=124407151&iu=/4140/ostg.clktrk > _______________________________________________ > Linuxwacom-devel mailing list > Linuxwacom-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel > ------------------------------------------------------------------------------ Android apps run on BlackBerry 10 Introducing the new BlackBerry 10.2.1 Runtime for Android apps. Now with support for Jelly Bean, Bluetooth, Mapview and more. Get your Android app in front of a whole new audience. Start now. http://pubads.g.doubleclick.net/gampad/clk?id=124407151&iu=/4140/ostg.clktrk _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel