Some hardware out there appears to report Y coordinates in reverse. I fixed this by adding an configurable parameter to drivers config in xorg.conf and while I was at it I also added the same functionality for X axis as well in case there are similarly "broken" implmentations in use.
Signed-off-by: Antti Peltonen <[email protected]> --- man/elographics.man | 6 ++++++ src/xf86Elo.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/man/elographics.man b/man/elographics.man index 32efda4..e260644 100644 --- a/man/elographics.man +++ b/man/elographics.man @@ -71,6 +71,12 @@ Delay between report packets. Default: 1 (10ms). .TP .BI "Option \*qModel\*q \*q" string \*q The touchscreen model. Default: unset. Supported models: "Sunit dSeries". +.TP +.BI "Option \*qMirrorX\*q \*q" boolean \*q +Mirror coordinates read from device on X axis. eg. Down becomes up +.TP +.BI "Option \*qMirrorY\*q \*q" boolean \*q +Mirror coordinates read from device on Y axis. eg. Left becomes right .SH "SEE ALSO" __xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__). .SH AUTHORS diff --git a/src/xf86Elo.c b/src/xf86Elo.c index c37cf9a..dea4f48 100644 --- a/src/xf86Elo.c +++ b/src/xf86Elo.c @@ -194,6 +194,8 @@ typedef struct _EloPrivateRec { int checksum; /* Current checksum of data in assembly buffer */ int packet_buf_p; /* Assembly buffer pointer */ int swap_axes; /* Swap X an Y axes if != 0 */ + int mirror_x; /* Mirror X axis input if != 0 */ + int mirror_y; /* Mirror Y axis input if != 0 */ unsigned char packet_buf[ELO_PACKET_SIZE]; /* Assembly buffer */ int model; /* one of MODEL_... */ } EloPrivateRec, *EloPrivatePtr; @@ -336,6 +338,9 @@ xf86EloReadInput(InputInfoPtr pInfo) int cur_x, cur_y; int state; + int eff_max_x, eff_max_y; + int eff_min_x, eff_min_y; + DBG(4, ErrorF("Entering ReadInput\n")); /* @@ -365,16 +370,35 @@ xf86EloReadInput(InputInfoPtr pInfo) (state == ELO_PRESS) ? "Press" : ((state == ELO_RELEASE) ? "Release" : "Stream"))); + eff_max_y = priv->max_y; + eff_min_y = priv->min_y; if (priv->min_y > priv->max_y) { /* inverted y axis */ cur_y = priv->max_y - cur_y + priv->min_y; + /* change effective values */ + eff_max_y = priv->min_y; + eff_min_y = priv->max_y; } if (priv->min_x > priv->max_x) { /* inverted x axis */ cur_x = priv->max_x - cur_x + priv->min_x; + /* change effective values */ + eff_max_x = priv->min_x; + eff_min_x = priv->max_x; } + /* + * Mirror axis coordinates if so configured + */ + if (priv->mirror_x) + { + cur_x = abs(cur_x - eff_max_x) + eff_min_x; + } + if (priv->mirror_y) + { + cur_y = abs(cur_y - eff_max_y) + eff_min_y; + } /* * Send events. @@ -912,6 +936,8 @@ xf86EloAllocate(InputDriverPtr drv, InputInfoPtr pInfo) priv->checksum = ELO_INIT_CHECKSUM; priv->packet_buf_p = 0; priv->swap_axes = 0; + priv->mirror_x = 0; + priv->mirror_y = 0; pInfo->device_control = xf86EloControl; pInfo->read_input = xf86EloReadInput; @@ -1018,6 +1044,14 @@ xf86EloInit(InputDriverPtr drv, if (priv->swap_axes) { xf86Msg(X_CONFIG, "Elographics device will work with X and Y axes swapped\n"); } + priv->mirror_x = xf86SetBoolOption(pInfo->options, "MirrorX", 0); + if (priv->mirror_x) { + xf86Msg(X_CONFIG, "Elographics device will work with X axis coordinates mirrored\n"); + } + priv->mirror_y = xf86SetBoolOption(pInfo->options, "MirrorY", 0); + if (priv->mirror_y) { + xf86Msg(X_CONFIG, "Elographics device will work with Y axis coordinates mirrored\n"); + } debug_level = xf86SetIntOption(pInfo->options, "DebugLevel", 0); if (debug_level) { #if DEBUG -- 1.8.1.4 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
