[PATCH elographics] Configurable mirroring of X,Y input coordinates.

Peter Hutterer peter.hutterer at who-t.net
Sun Jul 28 17:03:33 PDT 2013


On Thu, Jul 25, 2013 at 07:59:10PM +0300, Antti Peltonen wrote:
> 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.

there's already a check to see if min > max. we can use that to detect
whether to mirror the axis instead of adding another parameter, saving us a
bit of complexity.

you need to use an xorg.conf section already anyway, so seems like we don't
lose anything by forcing the user to put in min/max in reverse.

Cheers,
   Peter

> ---
>  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
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list