<p>Interesting approach, similar to GL using a series of matricies.</p>
<p>This would fit perfectly into an event driven input infrastructure I&#39;m researching, with the low level protocol drivers handling that end and a series of filters or chains processing and transforming the input before handing it off to the internal event system.</p>

<p>--<br>
Timothy Meade<br>
tmzt on freenode</p>
<div class="gmail_quote">On Apr 5, 2011 7:08 AM, &quot;Simon Thum&quot; &lt;<a href="mailto:simon.thum@gmx.de">simon.thum@gmx.de</a>&gt; wrote:<br type="attribution">&gt; Hi Orhan,<br>&gt; <br>&gt; please answer to all, makes life easier for everyone. I just saw that<br>
&gt; mail by incident.<br>&gt; <br>&gt; On 03/29/2011 04:41 PM, Orhan Kavrakoglu wrote:<br>&gt;&gt; On 03/29/2011 02:56 PM, Simon Thum wrote:<br>&gt;&gt;&gt; It&#39;s technically correct, and I welcome people to patch it into distros,<br>
&gt;&gt;&gt; but for master I&#39;d prefer a conceptually clean solution. But if it turns<br>&gt;&gt;&gt; out there&#39;s no support for the concept as described, we should probably<br>&gt;&gt;&gt; add it to master (given you provide a man page entry).<br>
&gt;&gt;&gt;<br>&gt;&gt; <br>&gt;&gt; I see. Unfortunately, I&#39;m nowhere near familiar enough with the input<br>&gt;&gt; code to implement this. Though I&#39;m willing to try, it will take some<br>&gt;&gt; time, to say the least. (Some reading pointers would be great, at this<br>
&gt;&gt; point.)<br>&gt; Well, it&#39;s an RFC by Peter at the moment, AFAIK not much to read. I&#39;ll<br>&gt; add a bit to my idea FYC. The concept would probably use pixman and<br>&gt; list.h-lists and look something like:<br>
&gt; <br>&gt; struct TransformChain {<br>&gt;    Bool is_dirty;<br>&gt;    Bool is_unit;<br>&gt;    struct TransformNode* chain;<br>&gt;    pixman_f_matrix transform;<br>&gt; }<br>&gt; <br>&gt; struct TransformNode{<br>&gt;    pixman_f_matrix transform;<br>
&gt;    struct list *prev, *next; /* see list.h */<br>&gt; }<br>&gt; <br>&gt; /* prepare matrices, don&#39;t malloc as we call this from the event loop */<br>&gt; Bool PrepareTransform(TransformChain* tc) {<br>&gt;   if (tc-&gt;is_dirty) {<br>
&gt;     // squash chained matrices together (pixman_f_matrix_multiply or<br>&gt; so), supply unit if no matrices are there<br>&gt;     tc-&gt;transform = result;<br>&gt;     tc-&gt;is_unit = pixman_f_matrix_is_unit(tc-&gt;transform);<br>
&gt;     tc-&gt;is_dirty = false;<br>&gt;   }<br>&gt;   return !tc-&gt;is_unit;<br>&gt; }<br>&gt; <br>&gt; // ... helpers to prepend and append transforms, setting the dirty flag,<br>&gt; init etc.<br>&gt; <br>&gt; struct DeviceInt {<br>
&gt;   ...<br>&gt;   TransformChain raw_transform; /* the transform from driver input<br>&gt; (&quot;raw&quot; in XI2) to nice-and-friendly XI/core X coordinates */<br>&gt;   ...<br>&gt; }<br>&gt; <br>&gt; In GetPointerEvents(), we&#39;d apply the transform like<br>
&gt; <br>&gt; if (PrepareTransform(&amp;dev-&gt;raw_transform)) {<br>&gt;    // apply<br>&gt; } else {<br>&gt;    // fast path: just copy over<br>&gt; }<br>&gt; <br>&gt; Drivers could use that or have an own chain if they like to.<br>
&gt; Each linear transform we want to have could simply be modeled as a node<br>&gt; in this chain. Due to affinity, this would even include the transform<br>&gt; matrix we have in place for abs mode already.<br>&gt; <br>
&gt; Technically, we&#39;d first need to resolve how<br>&gt; dev-&gt;valuators-&gt;last.remainder is handled, but that&#39;s not really hard.<br>&gt; Mostly we&#39;d need to kick it by streamlining the sub-pixel processing.<br>
&gt; <br>&gt; Peter, do you have any plans in that direction (subpixel)?<br>&gt; <br>&gt; <br>&gt;&gt; <br>&gt;&gt; There&#39;s another thing: The profile I posted is equivalent to the &quot;none&quot;<br>&gt;&gt; profile (-1) when acc = 1.0. Do you think it is feasible to merge the two?<br>
&gt; I don&#39;t really see a point in that. In a sense, &quot;flat&quot; _is_ &quot;none&quot;, but<br>&gt; there&#39;s more gain from an approach as outlined above. Acceleration does<br>&gt; scaling as a historical necessity, but that doesn&#39;t means it&#39;s a good idea.<br>
&gt; <br>&gt;&gt; <br>&gt;&gt; As this was my first patch, there was bound to be something missing. I<br>&gt;&gt; will update the man entry in any case.<br>&gt; Just go ahead. As said, it&#39;s probably suitable for anything but master.<br>
&gt; <br>&gt; Cheers,<br>&gt; <br>&gt; Simon<br>&gt; <br>&gt;&gt; <br>&gt;&gt; Thanks for your help,<br>&gt;&gt; Orhan<br>&gt;&gt; <br>&gt;&gt; _______________________________________________<br>&gt;&gt; <a href="mailto:xorg-devel@lists.x.org">xorg-devel@lists.x.org</a>: X.Org development<br>
&gt;&gt; Archives: <a href="http://lists.x.org/archives/xorg-devel">http://lists.x.org/archives/xorg-devel</a><br>&gt;&gt; Info: <a href="http://lists.x.org/mailman/listinfo/xorg-devel">http://lists.x.org/mailman/listinfo/xorg-devel</a><br>
&gt;&gt; <br>&gt; <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>