Re: [DIGImend-devel] [PATCH v3] Use kernel-reported tilt range and resolution
Brought to you by:
spb_nick
|
From: Jason G. <kil...@gm...> - 2012-09-05 16:56:49
|
Pushed into the repo.
Jason
---
Day xee-nee-svsh duu-'ushtlh-ts'it;
nuu-wee-ya' duu-xan' 'vm-nvshtlh-ts'it.
Huu-chan xuu naa~-gha.
On Tue, Aug 28, 2012 at 1:17 PM, Nikolai Kondrashov <sp...@gm...> wrote:
> Use tilt range and, optionally, resolution reported by the kernel for event
> devices.
>
> Add a constant for resolution currently expected by applications: TILT_RES,
> 1 point per degree in kernel units (points/radian). Scale values to this
> resolution for compatibility and specify it for corresponding valuators
> (instead of 1) for future use by applications.
>
> Add constants for currently reported value limits: TILT_MIN and TILT_MAX,
> -64 and 63 respectively. Continue clamping values to [TILT_MIN, TILT_MAX]
> for compatibility.
>
> Values and ranges reported by currently supported tablets should remain
> unchanged.
>
> Signed-off-by: Nikolai Kondrashov <sp...@gm...>
> ---
>
> Renamed wcmTilt[XY]<Noun> to wcmTilt<Noun>[XY] to better match the
> conventions.
> Clarified range-centering comments.
> Replaced TODO items with a cleaner one in the header.
>
> src/wcmCommon.c | 2 --
> src/wcmFilter.c | 16 +++++-----
> src/wcmISDV4.c | 14 +++++++--
> src/wcmUSB.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++--
> src/xf86Wacom.c | 10 ++++---
> src/xf86WacomDefs.h | 20 +++++++++++--
> 6 files changed, 124 insertions(+), 20 deletions(-)
>
> diff --git a/src/wcmCommon.c b/src/wcmCommon.c
> index d10c1d1..650f8f5 100644
> --- a/src/wcmCommon.c
> +++ b/src/wcmCommon.c
> @@ -1431,8 +1431,6 @@ WacomCommonPtr wcmNewCommon(void)
> common->wcmMaxTouchY = 1024; /* max touch Y value */
> common->wcmMaxStripX = 4096; /* Max fingerstrip X */
> common->wcmMaxStripY = 4096; /* Max fingerstrip Y */
> - common->wcmMaxtiltX = 128; /* Max tilt in X directory */
> - common->wcmMaxtiltY = 128; /* Max tilt in Y directory */
> common->wcmCursorProxoutDistDefault = PROXOUT_INTUOS_DISTANCE;
> /* default to Intuos */
> common->wcmSuppress = DEFAULT_SUPPRESS;
> diff --git a/src/wcmFilter.c b/src/wcmFilter.c
> index 47e958a..e55ef0f 100644
> --- a/src/wcmFilter.c
> +++ b/src/wcmFilter.c
> @@ -298,16 +298,16 @@ int wcmFilterCoord(WacomCommonPtr common, WacomChannelPtr pChannel,
> ds->device_type == ERASER_ID))
> {
> ds->tiltx = tx / common->wcmRawSample;
> - if (ds->tiltx > common->wcmMaxtiltX/2-1)
> - ds->tiltx = common->wcmMaxtiltX/2-1;
> - else if (ds->tiltx < -common->wcmMaxtiltX/2)
> - ds->tiltx = -common->wcmMaxtiltX/2;
> + if (ds->tiltx > common->wcmTiltMaxX)
> + ds->tiltx = common->wcmTiltMaxX;
> + else if (ds->tiltx < common->wcmTiltMinX)
> + ds->tiltx = common->wcmTiltMinX;
>
> ds->tilty = ty / common->wcmRawSample;
> - if (ds->tilty > common->wcmMaxtiltY/2-1)
> - ds->tilty = common->wcmMaxtiltY/2-1;
> - else if (ds->tilty < -common->wcmMaxtiltY/2)
> - ds->tilty = -common->wcmMaxtiltY/2;
> + if (ds->tilty > common->wcmTiltMaxY)
> + ds->tilty = common->wcmTiltMaxY;
> + else if (ds->tilty < common->wcmTiltMinY)
> + ds->tilty = common->wcmTiltMinY;
> }
>
> return 0; /* lookin' good */
> diff --git a/src/wcmISDV4.c b/src/wcmISDV4.c
> index 37c8ee3..2528254 100644
> --- a/src/wcmISDV4.c
> +++ b/src/wcmISDV4.c
> @@ -405,8 +405,18 @@ static int isdv4GetRanges(InputInfoPtr pInfo)
> common->wcmMaxY = reply.y_max;
> if (reply.tilt_x_max && reply.tilt_y_max)
> {
> - common->wcmMaxtiltX = reply.tilt_x_max;
> - common->wcmMaxtiltY = reply.tilt_y_max;
> + common->wcmTiltOffX = 0 - reply.tilt_x_max / 2;
> + common->wcmTiltFactX = 1.0;
> + common->wcmTiltMinX = 0 + common->wcmTiltOffX;
> + common->wcmTiltMaxX = reply.tilt_x_max +
> + common->wcmTiltOffX;
> +
> + common->wcmTiltOffY = 0 - reply.tilt_y_max / 2;
> + common->wcmTiltFactY = 1.0;
> + common->wcmTiltMinY = 0 + common->wcmTiltOffY;
> + common->wcmTiltMaxY = reply.tilt_y_max +
> + common->wcmTiltOffY;
> +
> common->wcmFlags |= TILT_ENABLED_FLAG;
> }
>
> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
> index 1a1951d..f25116b 100644
> --- a/src/wcmUSB.c
> +++ b/src/wcmUSB.c
> @@ -572,6 +572,82 @@ int usbWcmGetRanges(InputInfoPtr pInfo)
> common->wcmMaxStripX = absinfo.maximum;
> }
>
> + /* X tilt range */
> + if (ISBITSET(abs, ABS_TILT_X) &&
> + !ioctl(pInfo->fd, EVIOCGABS(ABS_TILT_X), &absinfo))
> + {
> +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
> + /* If resolution is specified */
> + if (absinfo.resolution > 0)
> + {
> + /* Assume the range is centered on zero */
> + common->wcmTiltOffX = 0;
> + /* Convert to resolution expected by applications */
> + common->wcmTiltFactX = TILT_RES /
> + (double)absinfo.resolution;
> + }
> + else
> +#endif
> + {
> + /*
> + * Center the reported range on zero to support
> + * kernel drivers still reporting non-zero-centered
> + * values.
> + */
> + common->wcmTiltOffX = - (absinfo.minimum +
> + absinfo.maximum) / 2;
> + /*
> + * Assume reported resolution is the one expected by
> + * applications
> + */
> + common->wcmTiltFactX = 1.0;
> + }
> + common->wcmTiltMinX = round((absinfo.minimum +
> + common->wcmTiltOffX) *
> + common->wcmTiltFactX);
> + common->wcmTiltMaxX = round((absinfo.maximum +
> + common->wcmTiltOffX) *
> + common->wcmTiltFactX);
> + }
> +
> + /* Y tilt range */
> + if (ISBITSET(abs, ABS_TILT_Y) &&
> + !ioctl(pInfo->fd, EVIOCGABS(ABS_TILT_Y), &absinfo))
> + {
> +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
> + /* If resolution is specified */
> + if (absinfo.resolution > 0)
> + {
> + /* Assume the range is centered on zero */
> + common->wcmTiltOffY = 0;
> + /* Convert to resolution expected by applications */
> + common->wcmTiltFactY = TILT_RES /
> + (double)absinfo.resolution;
> + }
> + else
> +#endif
> + {
> + /*
> + * Center the reported range on zero to support
> + * kernel drivers still reporting non-zero-centered
> + * values.
> + */
> + common->wcmTiltOffY = - (absinfo.minimum +
> + absinfo.maximum) / 2;
> + /*
> + * Assume reported resolution is the one expected by
> + * applications
> + */
> + common->wcmTiltFactY = 1.0;
> + }
> + common->wcmTiltMinY = round((absinfo.minimum +
> + common->wcmTiltOffY) *
> + common->wcmTiltFactY);
> + common->wcmTiltMaxY = round((absinfo.maximum +
> + common->wcmTiltOffY) *
> + common->wcmTiltFactY);
> + }
> +
> /* max finger strip Y for tablets with Expresskeys
> * or physical Y for touch devices in hundredths of a mm */
> if (ISBITSET(abs, ABS_RY) &&
> @@ -1045,10 +1121,12 @@ static int usbParseAbsEvent(WacomCommonPtr common,
> ds->rotation = event->value;
> break;
> case ABS_TILT_X:
> - ds->tiltx = event->value - common->wcmMaxtiltX/2;
> + ds->tiltx = round((event->value + common->wcmTiltOffX) *
> + common->wcmTiltFactX);
> break;
> case ABS_TILT_Y:
> - ds->tilty = event->value - common->wcmMaxtiltY/2;
> + ds->tilty = round((event->value + common->wcmTiltOffY) *
> + common->wcmTiltFactY);
> break;
> case ABS_PRESSURE:
> ds->pressure = event->value;
> diff --git a/src/xf86Wacom.c b/src/xf86Wacom.c
> index 6581ab5..c52db8d 100644
> --- a/src/xf86Wacom.c
> +++ b/src/xf86Wacom.c
> @@ -223,8 +223,9 @@ static int wcmInitAxes(DeviceIntPtr pWcm)
> if (IsPen(priv))
> {
> label = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_TILT_X),
> - min = -64;
> - max = 63;
> + min_res = max_res = res = round(TILT_RES);
> + min = TILT_MIN;
> + max = TILT_MAX;
> }
> else if (IsCursor(priv))
> {
> @@ -251,8 +252,9 @@ static int wcmInitAxes(DeviceIntPtr pWcm)
> if (IsPen(priv))
> {
> label = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_TILT_Y);
> - min = -64;
> - max = 63;
> + min_res = max_res = res = round(TILT_RES);
> + min = TILT_MIN;
> + max = TILT_MAX;
> }
> else if (IsCursor(priv))
> {
> diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
> index c978243..e6f8757 100644
> --- a/src/xf86WacomDefs.h
> +++ b/src/xf86WacomDefs.h
> @@ -43,6 +43,11 @@
> #define MAX_ROTATION_RANGE 1800 /* the maximum range of the marker pen rotation */
> #define MAX_ABS_WHEEL 1023 /* the maximum value of absolute wheel */
>
> +#define TILT_RES (180/M_PI) /* Reported tilt resolution in points/radian
> + (1/degree) */
> +#define TILT_MIN -64 /* Minimum reported tilt value */
> +#define TILT_MAX 63 /* Maximum reported tilt value */
> +
> #define MIN_PAD_RING 0 /* I4 absolute scroll ring min value */
> #define MAX_PAD_RING 71 /* I4 absolute scroll ring max value */
>
> @@ -440,8 +445,19 @@ struct _WacomCommonRec
> /* tablet Z resolution is equivalent
> * to wcmMaxZ which is equal to 100% pressure */
> int wcmMaxDist; /* tablet max distance value */
> - int wcmMaxtiltX; /* styli max tilt in X directory */
> - int wcmMaxtiltY; /* styli max tilt in Y directory */
> +
> + /*
> + * TODO Remove wcmTiltOff*, once the kernel drivers reporting
> + * non-zero-centered tilt values are no longer in use.
> + */
> + int wcmTiltOffX; /* styli tilt offset in X direction */
> + int wcmTiltOffY; /* styli tilt offset in Y direction */
> + double wcmTiltFactX; /* styli tilt factor in X direction */
> + double wcmTiltFactY; /* styli tilt factor in Y direction */
> + int wcmTiltMinX; /* styli min reported tilt in X direction */
> + int wcmTiltMinY; /* styli min reported tilt in Y direction */
> + int wcmTiltMaxX; /* styli max reported tilt in X direction */
> + int wcmTiltMaxY; /* styli max reported tilt in Y direction */
>
> int wcmMaxStripX; /* Maximum fingerstrip X */
> int wcmMaxStripY; /* Maximum fingerstrip Y */
> --
> 1.7.10.4
>
|