The module would previously log a message if min > max, but not do anything
about it. Keep the original min/max around, swap on-the-fly.

Signed-off-by: Jaska Kivela <[email protected]>
Reviewed-by: Peter Hutterer <[email protected]>
Signed-off-by: Peter Hutterer <[email protected]>
---
 src/xf86Elo.c | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/xf86Elo.c b/src/xf86Elo.c
index cb1699e..c37cf9a 100644
--- a/src/xf86Elo.c
+++ b/src/xf86Elo.c
@@ -360,6 +360,22 @@ xf86EloReadInput(InputInfoPtr      pInfo)
           cur_y = WORD_ASSEMBLY(priv->packet_buf[5], priv->packet_buf[6]);
           state = priv->packet_buf[2] & 0x07;
 
+          DBG(5, ErrorF("ELO got: x(%d), y(%d), %s\n",
+                      cur_x, cur_y,
+                      (state == ELO_PRESS) ? "Press" :
+                       ((state == ELO_RELEASE) ? "Release" : "Stream")));
+
+          if (priv->min_y > priv->max_y) {
+            /* inverted y axis */
+            cur_y = priv->max_y - cur_y + priv->min_y;
+          }
+
+          if (priv->min_x > priv->max_x) {
+            /* inverted x axis */
+            cur_x = priv->max_x - cur_x + priv->min_x;
+          }
+
+
           /*
            * Send events.
            *
@@ -676,6 +692,7 @@ xf86EloControl(DeviceIntPtr dev,
   unsigned char                reply[ELO_PACKET_SIZE];
   Atom btn_label;
   Atom axis_labels[2] = { 0, 0 };
+  int x0, x1, y0, y1;
 
   switch(mode) {
 
@@ -719,17 +736,27 @@ xf86EloControl(DeviceIntPtr       dev,
        return !Success;
       }
       else {
+
+       /* Correct the coordinates for possibly inverted axis.
+          Leave priv->variables untouched so we can check for
+          inversion on incoming events.
+        */
+       y0 = min(priv->min_y, priv->max_y);
+       y1 = max(priv->min_y, priv->max_y);
+       x0 = min(priv->min_x, priv->max_x);
+       x1 = max(priv->min_x, priv->max_x);
+
        /* I will map coordinates myself */
        InitValuatorAxisStruct(dev, 0,
                               axis_labels[0],
-                              priv->min_x, priv->max_x,
+                              x0, x1,
                               9500,
                               0     /* min_res */,
                               9500  /* max_res */,
                               Absolute);
        InitValuatorAxisStruct(dev, 1,
                               axis_labels[1],
-                              priv->min_y, priv->max_y,
+                              y0, y1,
                               10500,
                               0     /* min_res */,
                               10500 /* max_res */,
-- 
1.8.1

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to