<p>Why does this need to be a SYNAPTICS property, synclient does not respect XInput properties? Are they changing the same thing on the backend and using the same semantics? (On the last, no, I believe the min/max have to be changed and axes swapped on evdev devices)</p>

<p>--<br>
Timothy Meade<br>
tmzt on freenode</p>
<div class="gmail_quote">On Mar 18, 2011 2:42 AM, &quot;Peter Hutterer&quot; &lt;<a href="mailto:peter.hutterer@who-t.net">peter.hutterer@who-t.net</a>&gt; wrote:<br type="attribution">&gt; Hi Aapo,<br>&gt; <br>&gt; I noticed this patch in the synaptics repo today. Unfortunately, it needs<br>
&gt; a bit more work, so I&#39;ve reverted it for now. Please find my comments<br>&gt; inline.<br>&gt; <br>&gt; fwiw, patches to synatics should go to the xorg-devel list first for public<br>&gt; review.<br>&gt; <br>&gt; On Fri, Mar 18, 2011 at 04:26:46PM +1000, Peter Hutterer wrote:<br>
&gt;&gt; This patch allows usage of &quot;synclient Orientation=0&quot; (values from 0 to<br>&gt;&gt; 3). It will rotate the touchpad similar to &quot;xrandr -o&quot;. Original patch<br>&gt;&gt; was extended for alps and ps2.<br>
&gt;&gt; <br>&gt;&gt; Signed-off-by: Christoph Brill &lt;<a href="mailto:egore911@egore911.de">egore911@egore911.de</a>&gt;<br>&gt;&gt; ---<br>&gt;&gt;  include/synaptics-properties.h |    3 +++<br>&gt;&gt;  man/synaptics.man              |    6 ++++++<br>
&gt;&gt;  src/alpscomm.c                 |   29 +++++++++++++++++++++++++----<br>&gt;&gt;  src/eventcomm.c                |   22 ++++++++++++++++++++--<br>&gt;&gt;  src/properties.c               |    8 ++++++++<br>&gt;&gt;  src/ps2comm.c                  |   36 +++++++++++++++++++++++++++++-------<br>
&gt;&gt;  src/synaptics.c                |    2 ++<br>&gt;&gt;  src/synapticsstr.h             |    1 +<br>&gt;&gt;  tools/synclient.c              |    1 +<br>&gt;&gt;  9 files changed, 95 insertions(+), 13 deletions(-)<br>
&gt;&gt; <br>&gt;&gt; diff --git a/include/synaptics-properties.h b/include/synaptics-properties.h<br>&gt;&gt; index bdb2112..0b4e570 100644<br>&gt;&gt; --- a/include/synaptics-properties.h<br>&gt;&gt; +++ b/include/synaptics-properties.h<br>
&gt;&gt; @@ -158,4 +158,7 @@<br>&gt;&gt;  /* 32 Bit Integer, 2 values, horizontal hysteresis, vertical hysteresis */<br>&gt;&gt;  #define SYNAPTICS_PROP_NOISE_CANCELLATION &quot;Synaptics Noise Cancellation&quot;<br>&gt;&gt;  <br>
&gt;&gt; +/* 32 bit, 4 values, normal, inverted, left, right */<br>&gt;&gt; +#define SYNAPTICS_ORIENTATION &quot;Synaptics Orientation&quot;<br>&gt; <br>&gt; why not use degrees here?<br>&gt; this opens the way for a unified rotation property for devices that need a<br>
&gt; rotation outside of 90 degree values.<br>&gt; <br>&gt; &quot;left&quot; doesn&#39;t have a clear meaning. &quot;90 degrees clockwise&quot; is less<br>&gt; ambiguous<br>&gt; <br>&gt; &quot;orientation&quot; vs &quot;rotation&quot;?<br>
&gt; I&#39;m more of a fan of the latter, but can be convinced otherwise.<br>&gt; <br>&gt; <br>&gt;&gt; +<br>&gt;&gt;  #endif /* _SYNAPTICS_PROPERTIES_H_ */<br>&gt;&gt; diff --git a/man/synaptics.man b/man/synaptics.man<br>
&gt;&gt; index 0a35883..44d1c27 100644<br>&gt;&gt; --- a/man/synaptics.man<br>&gt;&gt; +++ b/man/synaptics.man<br>&gt;&gt; @@ -510,6 +510,12 @@ AreaBottomEdge option to any integer value other than zero. If supported by the<br>
&gt;&gt;  server (version 1.9 and later), the edge may be specified in percent of<br>&gt;&gt;  the total height of the touchpad. Property: &quot;Synaptics Area&quot;<br>&gt;&gt;  .<br>&gt;&gt; +.TP<br>&gt;&gt; +.BI &quot;Option \*qOrientation\*q \*q&quot; integer \*q<br>
&gt;&gt; +Rotate the touchpad similar to xrandr -o.<br>&gt;&gt; +.<br>&gt;&gt; +The orientation can be 0 (normal), 1(left), 2 (inverted) or 3(right).<br>&gt;&gt; +.<br>&gt; <br>&gt; same here, just because xrandr uses 0-3 doesn&#39;t make it a good idea ;)<br>
&gt; <br>&gt;&gt;  <br>&gt;&gt;  .SH CONFIGURATION DETAILS<br>&gt;&gt;  .SS Area handling<br>&gt;&gt; diff --git a/src/alpscomm.c b/src/alpscomm.c<br>&gt;&gt; index dc76655..7d5cda2 100644<br>&gt;&gt; --- a/src/alpscomm.c<br>
&gt;&gt; +++ b/src/alpscomm.c<br>&gt;&gt; @@ -149,11 +149,12 @@ ALPS_get_packet(struct CommData *comm, InputInfoPtr pInfo)<br>&gt;&gt;   * reflects left,right,down,up in lef1,rig1,mid1,up1.<br>&gt;&gt;   */<br>&gt;&gt;  static void<br>
&gt;&gt; -ALPS_process_packet(unsigned char *packet, struct SynapticsHwState *hw)<br>&gt;&gt; +ALPS_process_packet(SynapticsPrivate *priv, unsigned char *packet, struct SynapticsHwState *hw)<br>&gt;&gt;  {<br>&gt;&gt;      int x = 0, y = 0, z = 0;<br>
&gt;&gt;      int left = 0, right = 0, middle = 0;<br>&gt;&gt;      int i;<br>&gt;&gt; +    SynapticsParameters *para = &amp;priv-&gt;synpara;<br>&gt;&gt;  <br>&gt;&gt;      x = (packet[1] &amp; 0x7f) | ((packet[2] &amp; 0x78) &lt;&lt; (7-3));<br>
&gt;&gt;      y = (packet[4] &amp; 0x7f) | ((packet[3] &amp; 0x70) &lt;&lt; (7-4));<br>&gt;&gt; @@ -172,8 +173,27 @@ ALPS_process_packet(unsigned char *packet, struct SynapticsHwState *hw)<br>&gt;&gt;          hw-&gt;multi[i] = FALSE;<br>
&gt;&gt;  <br>&gt;&gt;      if (z &gt; 0) {<br>&gt;&gt; -        hw-&gt;x = x;<br>&gt;&gt; -        hw-&gt;y = y;<br>&gt;&gt; +        if (para-&gt;orientation==0)<br>&gt;&gt; +            hw-&gt;x = x;<br>&gt;&gt; +        else if (para-&gt;orientation==2)<br>
&gt; <br>&gt; self-explanatory enums please, not magic numbers.<br>&gt;         else if (para-&gt;orientation == ROTATION_90CW)<br>&gt; is much easier to read.<br>&gt; <br>&gt; (also, spaces before/after ==)<br>&gt; <br>&gt;&gt; +            hw-&gt;x = priv-&gt;maxx + priv-&gt;minx - x;<br>
&gt;&gt; +        else if (para-&gt;orientation==3)<br>&gt;&gt; +            hw-&gt;y = (priv-&gt;maxx - x) * (priv-&gt;maxy - priv-&gt;miny) / (priv-&gt;maxx - priv-&gt;minx) + priv-&gt;miny;<br>&gt;&gt; +        else if (para-&gt;orientation==1)<br>
&gt;&gt; +            hw-&gt;y = (x - priv-&gt;minx) * (priv-&gt;maxy - priv-&gt;miny) / (priv-&gt;maxx - priv-&gt;minx) + priv-&gt;miny;<br>&gt;&gt; +        else<br>&gt;&gt; +            hw-&gt;x = x;<br>&gt;&gt; +<br>&gt;&gt; +        if (para-&gt;orientation==0)<br>
&gt;&gt; +            hw-&gt;y = y;<br>&gt;&gt; +        else if (para-&gt;orientation==2)<br>&gt;&gt; +            hw-&gt;y = priv-&gt;maxy + priv-&gt;miny - y;<br>&gt;&gt; +        else if (para-&gt;orientation==3)<br>&gt;&gt; +            hw-&gt;x = (y - priv-&gt;miny) * (priv-&gt;maxx - priv-&gt;minx) / (priv-&gt;maxy - priv-&gt;miny) + priv-&gt;minx;<br>
&gt;&gt; +        else if (para-&gt;orientation==1)<br>&gt;&gt; +            hw-&gt;x = (priv-&gt;maxy - y) * (priv-&gt;maxx - priv-&gt;minx) / (priv-&gt;maxy - priv-&gt;miny) + priv-&gt;minx;<br>&gt;&gt; +        else<br>&gt;&gt; +            hw-&gt;y = y;<br>
&gt; <br>&gt; this needs to be done in a function to avoid duplicating the code.<br>&gt; <br>&gt;&gt;      }<br>&gt;&gt;      hw-&gt;z = z;<br>&gt;&gt;      hw-&gt;numFingers = (z &gt; 0) ? 1 : 0;<br>&gt;&gt; @@ -210,11 +230,12 @@ ALPSReadHwState(InputInfoPtr pInfo,<br>
&gt;&gt;  {<br>&gt;&gt;      unsigned char *buf = comm-&gt;protoBuf;<br>&gt;&gt;      struct SynapticsHwState *hw = &amp;(comm-&gt;hwState);<br>&gt;&gt; +    SynapticsPrivate *priv = (SynapticsPrivate *)pInfo-&gt;private;<br>
&gt;&gt;  <br>&gt;&gt;      if (!ALPS_get_packet(comm, pInfo))<br>&gt;&gt;          return FALSE;<br>&gt;&gt;  <br>&gt;&gt; -    ALPS_process_packet(buf, hw);<br>&gt;&gt; +    ALPS_process_packet(priv, buf, hw);<br>&gt;&gt;  <br>
&gt;&gt;      *hwRet = *hw;<br>&gt;&gt;      return TRUE;<br>&gt;&gt; diff --git a/src/eventcomm.c b/src/eventcomm.c<br>&gt;&gt; index d394d3f..3d550f1 100644<br>&gt;&gt; --- a/src/eventcomm.c<br>&gt;&gt; +++ b/src/eventcomm.c<br>
&gt;&gt; @@ -400,10 +400,28 @@ EventReadHwState(InputInfoPtr pInfo,<br>&gt;&gt;          case EV_ABS:<br>&gt;&gt;              switch (ev.code) {<br>&gt;&gt;              case ABS_X:<br>&gt;&gt; -                hw-&gt;x = ev.value;<br>&gt;&gt; +                if (para-&gt;orientation==0)<br>
&gt;&gt; +                    hw-&gt;x = ev.value;<br>&gt;&gt; +                else if (para-&gt;orientation==2)<br>&gt;&gt; +                    hw-&gt;x = priv-&gt;maxx + priv-&gt;minx - ev.value;<br>&gt;&gt; +                else if (para-&gt;orientation==3)<br>&gt;&gt; +                    hw-&gt;y = (priv-&gt;maxx - ev.value) * (priv-&gt;maxy - priv-&gt;miny) / (priv-&gt;maxx - priv-&gt;minx) + priv-&gt;miny;<br>
&gt;&gt; +                else if (para-&gt;orientation==1)<br>&gt;&gt; +                    hw-&gt;y = (ev.value - priv-&gt;minx) * (priv-&gt;maxy - priv-&gt;miny) / (priv-&gt;maxx - priv-&gt;minx) + priv-&gt;miny;<br>&gt;&gt; +                else<br>&gt;&gt; +                    hw-&gt;x = ev.value;<br>
&gt;&gt;                  break;<br>&gt;&gt;              case ABS_Y:<br>&gt;&gt; -                hw-&gt;y = ev.value;<br>&gt;&gt; +                if (para-&gt;orientation==0)<br>&gt;&gt; +                    hw-&gt;y = ev.value;<br>&gt;&gt; +                else if (para-&gt;orientation==2)<br>
&gt;&gt; +                    hw-&gt;y = priv-&gt;maxy + priv-&gt;miny - ev.value;<br>&gt;&gt; +                else if (para-&gt;orientation==3)<br>&gt;&gt; +                    hw-&gt;x = (ev.value - priv-&gt;miny) * (priv-&gt;maxx - priv-&gt;minx) / (priv-&gt;maxy - priv-&gt;miny) + priv-&gt;minx;<br>
&gt;&gt; +                else if (para-&gt;orientation==1)<br>&gt;&gt; +                    hw-&gt;x = (priv-&gt;maxy - ev.value) * (priv-&gt;maxx - priv-&gt;minx) / (priv-&gt;maxy - priv-&gt;miny) + priv-&gt;minx;<br>&gt;&gt; +                else<br>&gt;&gt; +                    hw-&gt;y = ev.value;<br>
&gt;&gt;                  break;<br>&gt;&gt;              case ABS_PRESSURE:<br>&gt;&gt;                  hw-&gt;z = ev.value;<br>&gt;&gt; diff --git a/src/properties.c b/src/properties.c<br>&gt;&gt; index 23b5a6a..06909ed 100644<br>&gt;&gt; --- a/src/properties.c<br>
&gt;&gt; +++ b/src/properties.c<br>&gt;&gt; @@ -83,6 +83,7 @@ Atom prop_capabilities          = 0;<br>&gt;&gt;  Atom prop_resolution            = 0;<br>&gt;&gt;  Atom prop_area                  = 0;<br>&gt;&gt;  Atom prop_noise_cancellation    = 0;<br>
&gt;&gt; +Atom prop_orientation           = 0;<br>&gt;&gt;  <br>&gt;&gt;  static Atom<br>&gt;&gt;  InitAtom(DeviceIntPtr dev, char *name, int format, int nvalues, int *values)<br>&gt;&gt; @@ -285,6 +286,8 @@ InitDeviceProperties(InputInfoPtr pInfo)<br>
&gt;&gt;      prop_noise_cancellation = InitAtom(pInfo-&gt;dev,<br>&gt;&gt;              SYNAPTICS_PROP_NOISE_CANCELLATION, 32, 2, values);<br>&gt;&gt;  <br>&gt;&gt; +    prop_orientation = InitAtom(pInfo-&gt;dev, SYNAPTICS_ORIENTATION, 32, 1, &amp;para-&gt;orientation);<br>
&gt;&gt; +<br>&gt;&gt;  }<br>&gt;&gt;  <br>&gt;&gt;  int<br>&gt;&gt; @@ -666,6 +669,11 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,<br>&gt;&gt;              return BadValue;<br>&gt;&gt;          para-&gt;hyst_x = hyst[0];<br>
&gt;&gt;          para-&gt;hyst_y = hyst[1];<br>&gt;&gt; +    } else if (property == prop_orientation)<br>&gt;&gt; +    {<br>&gt;&gt; +        if (prop-&gt;size != 1 || prop-&gt;format != 32 || prop-&gt;type != XA_INTEGER)<br>
&gt;&gt; +            return BadMatch;<br>&gt;&gt; +        para-&gt;orientation = *(INT32*)prop-&gt;data;<br>&gt;&gt;      }<br>&gt;&gt;  <br>&gt;&gt;      return Success;<br>&gt;&gt; diff --git a/src/ps2comm.c b/src/ps2comm.c<br>
&gt;&gt; index 0e9b861..1c2bbc3 100644<br>&gt;&gt; --- a/src/ps2comm.c<br>&gt;&gt; +++ b/src/ps2comm.c<br>&gt;&gt; @@ -524,7 +524,7 @@ PS2ReadHwStateProto(InputInfoPtr pInfo,<br>&gt;&gt;      SynapticsParameters *para = &amp;priv-&gt;synpara;<br>
&gt;&gt;      struct PS2SynapticsHwInfo *synhw;<br>&gt;&gt;      int newabs;<br>&gt;&gt; -    int w, i;<br>&gt;&gt; +    int w, i, x, y;<br>&gt;&gt;  <br>&gt;&gt;      synhw = (struct PS2SynapticsHwInfo*)priv-&gt;proto_data;<br>
&gt;&gt;      if (!synhw)<br>&gt;&gt; @@ -541,17 +541,17 @@ PS2ReadHwStateProto(InputInfoPtr pInfo,<br>&gt;&gt;          return FALSE;<br>&gt;&gt;  <br>&gt;&gt;      /* Handle normal packets */<br>&gt;&gt; -    hw-&gt;x = hw-&gt;y = hw-&gt;z = hw-&gt;numFingers = hw-&gt;fingerWidth = 0;<br>
&gt;&gt; +    hw-&gt;x = hw-&gt;y = hw-&gt;z = hw-&gt;numFingers = hw-&gt;fingerWidth = x = y = 0;<br>&gt; <br>&gt; urgh, just add a new line.<br>&gt; <br>&gt;&gt;      hw-&gt;left = hw-&gt;right = hw-&gt;up = hw-&gt;down = hw-&gt;middle = FALSE;<br>
&gt;&gt;      for (i = 0; i &lt; 8; i++)<br>&gt;&gt;          hw-&gt;multi[i] = FALSE;<br>&gt;&gt;  <br>&gt;&gt;      if (newabs) {                            /* newer protos...*/<br>&gt;&gt;          DBG(7, &quot;using new protocols\n&quot;);<br>&gt;&gt; -        hw-&gt;x = (((buf[3] &amp; 0x10) &lt;&lt; 8) |<br>
&gt;&gt; +        x = (((buf[3] &amp; 0x10) &lt;&lt; 8) |<br>&gt;&gt;                   ((buf[1] &amp; 0x0f) &lt;&lt; 8) |<br>&gt;&gt;                   buf[4]);<br>&gt;&gt; -        hw-&gt;y = (((buf[3] &amp; 0x20) &lt;&lt; 7) |<br>&gt;&gt; +        y = (((buf[3] &amp; 0x20) &lt;&lt; 7) |<br>
&gt;&gt;                   ((buf[1] &amp; 0xf0) &lt;&lt; 4) |<br>&gt;&gt;                   buf[5]);<br>&gt;&gt;  <br>&gt;&gt; @@ -598,9 +598,9 @@ PS2ReadHwStateProto(InputInfoPtr pInfo,<br>&gt;&gt;          }<br>&gt;&gt;      } else {                            /* old proto...*/<br>
&gt;&gt;          DBG(7, &quot;using old protocol\n&quot;);<br>&gt;&gt; -        hw-&gt;x = (((buf[1] &amp; 0x1F) &lt;&lt; 8) |<br>&gt;&gt; +        x = (((buf[1] &amp; 0x1F) &lt;&lt; 8) |<br>&gt;&gt;                   buf[2]);<br>&gt;&gt; -        hw-&gt;y = (((buf[4] &amp; 0x1F) &lt;&lt; 8) |<br>
&gt;&gt; +        y = (((buf[4] &amp; 0x1F) &lt;&lt; 8) |<br>&gt;&gt;                   buf[5]);<br>&gt;&gt;  <br>&gt;&gt;          hw-&gt;z = (((buf[0] &amp; 0x30) &lt;&lt; 2) |<br>&gt;&gt; @@ -612,7 +612,29 @@ PS2ReadHwStateProto(InputInfoPtr pInfo,<br>
&gt;&gt;          hw-&gt;right = (buf[0] &amp; 0x02) ? 1 : 0;<br>&gt;&gt;      }<br>&gt;&gt;  <br>&gt;&gt; -    hw-&gt;y = YMAX_NOMINAL + YMIN_NOMINAL - hw-&gt;y;<br>&gt;&gt; +    y = YMAX_NOMINAL + YMIN_NOMINAL - y;<br>&gt;&gt; +<br>
&gt;&gt; +    if (para-&gt;orientation==0)<br>&gt;&gt; +        hw-&gt;x = x;<br>&gt;&gt; +    else if (para-&gt;orientation==2)<br>&gt;&gt; +        hw-&gt;x = priv-&gt;maxx + priv-&gt;minx - x;<br>&gt;&gt; +    else if (para-&gt;orientation==3)<br>
&gt;&gt; +        hw-&gt;y = (priv-&gt;maxx - x) * (priv-&gt;maxy - priv-&gt;miny) / (priv-&gt;maxx - priv-&gt;minx) + priv-&gt;miny;<br>&gt;&gt; +    else if (para-&gt;orientation==1)<br>&gt;&gt; +        hw-&gt;y = (x - priv-&gt;minx) * (priv-&gt;maxy - priv-&gt;miny) / (priv-&gt;maxx - priv-&gt;minx) + priv-&gt;miny;<br>
&gt;&gt; +    else<br>&gt;&gt; +        hw-&gt;x = x;<br>&gt;&gt; +<br>&gt;&gt; +    if (para-&gt;orientation==0)<br>&gt;&gt; +        hw-&gt;y = y;<br>&gt;&gt; +    else if (para-&gt;orientation==2)<br>&gt;&gt; +        hw-&gt;y = priv-&gt;maxy + priv-&gt;miny - y;<br>
&gt;&gt; +    else if (para-&gt;orientation==3)<br>&gt;&gt; +        hw-&gt;x = (y - priv-&gt;miny) * (priv-&gt;maxx - priv-&gt;minx) / (priv-&gt;maxy - priv-&gt;miny) + priv-&gt;minx;<br>&gt;&gt; +    else if (para-&gt;orientation==1)<br>
&gt;&gt; +        hw-&gt;x = (priv-&gt;maxy - y) * (priv-&gt;maxx - priv-&gt;minx) / (priv-&gt;maxy - priv-&gt;miny) + priv-&gt;minx;<br>&gt;&gt; +    else<br>&gt;&gt; +        hw-&gt;y = y;<br>&gt; <br>&gt; duplication again, needs abstraction.<br>
&gt; <br>&gt;&gt;  <br>&gt;&gt;      if (hw-&gt;z &gt;= para-&gt;finger_high) {<br>&gt;&gt;          int w_ok = 0;<br>&gt;&gt; diff --git a/src/synaptics.c b/src/synaptics.c<br>&gt;&gt; index 1233917..03a9f60 100644<br>&gt;&gt; --- a/src/synaptics.c<br>
&gt;&gt; +++ b/src/synaptics.c<br>&gt;&gt; @@ -574,6 +574,8 @@ static void set_default_parameters(InputInfoPtr pInfo)<br>&gt;&gt;      pars-&gt;resolution_horiz = xf86SetIntOption(opts, &quot;HorizResolution&quot;, horizResolution);<br>
&gt;&gt;      pars-&gt;resolution_vert = xf86SetIntOption(opts, &quot;VertResolution&quot;, vertResolution);<br>&gt;&gt;  <br>&gt;&gt; +    pars-&gt;orientation = xf86SetIntOption(opts, &quot;Orientation&quot;, 0);<br>&gt;&gt; +<br>
&gt;&gt;      /* Warn about (and fix) incorrectly configured TopEdge/BottomEdge parameters */<br>&gt;&gt;      if (pars-&gt;top_edge &gt; pars-&gt;bottom_edge) {<br>&gt;&gt;          int tmp = pars-&gt;top_edge;<br>&gt;&gt; diff --git a/src/synapticsstr.h b/src/synapticsstr.h<br>
&gt;&gt; index 8f6593e..90640f7 100644<br>&gt;&gt; --- a/src/synapticsstr.h<br>&gt;&gt; +++ b/src/synapticsstr.h<br>&gt;&gt; @@ -161,6 +161,7 @@ typedef struct _SynapticsParameters<br>&gt;&gt;      unsigned int resolution_vert;           /* vertical resolution of touchpad in units/mm */<br>
&gt;&gt;      int area_left_edge, area_right_edge, area_top_edge, area_bottom_edge; /* area coordinates absolute */<br>&gt;&gt;      int hyst_x, hyst_y;                     /* x and y width of hysteresis box */<br>&gt;&gt; +    int orientation;                        /* orientation of the touchpad */<br>
&gt;&gt;  } SynapticsParameters;<br>&gt;&gt;  <br>&gt;&gt;  <br>&gt;&gt; diff --git a/tools/synclient.c b/tools/synclient.c<br>&gt;&gt; index 9776d23..1ac5502 100644<br>&gt;&gt; --- a/tools/synclient.c<br>&gt;&gt; +++ b/tools/synclient.c<br>
&gt;&gt; @@ -143,6 +143,7 @@ static struct Parameter params[] = {<br>&gt;&gt;      {&quot;AreaRightEdge&quot;,         PT_INT,    0, 10000, SYNAPTICS_PROP_AREA,        32,        1},<br>&gt;&gt;      {&quot;AreaTopEdge&quot;,           PT_INT,    0, 10000, SYNAPTICS_PROP_AREA,        32,        2},<br>
&gt;&gt;      {&quot;AreaBottomEdge&quot;,        PT_INT,    0, 10000, SYNAPTICS_PROP_AREA,        32,        3},<br>&gt;&gt; +    {&quot;Orientation&quot;,           PT_INT,    0, 3,     SYNAPTICS_ORIENTATION, 32,   0},<br>&gt;                                                                             ^ tab missing?<br>
&gt; <br>&gt; Cheers,<br>&gt;   Peter<br>&gt; <br>&gt;&gt;      { NULL, 0, 0, 0, 0 }<br>&gt;&gt;  };<br>&gt;&gt;  <br>&gt;&gt; -- <br>&gt;&gt; 1.7.4<br>&gt; _______________________________________________<br>&gt; <a href="mailto:xorg-devel@lists.x.org">xorg-devel@lists.x.org</a>: X.Org development<br>
&gt; Archives: <a href="http://lists.x.org/archives/xorg-devel">http://lists.x.org/archives/xorg-devel</a><br>&gt; Info: <a href="http://lists.x.org/mailman/listinfo/xorg-devel">http://lists.x.org/mailman/listinfo/xorg-devel</a><br>
</div>