xserver/Xi
Peter Korsgaard 6cccf0131c dix: add 3x3 transformation matrix xinput property for multi-head handling
For absolute input devices (E.G. touchscreens) in multi-head setups,
we need a way to bind the device to an randr output. This adds the
infrastructure to the server to allow us to do so.

positionSprite() scales input coordinates to the dimensions of the shared
(total) screen frame buffer, so to restrict motion to an output we need to
scale/rotate/translate device coordinates to a subset of the frame buffer
before passing them on to positionSprite.

This is done here using a 3x3 transformation matrix, which is applied to
the device coordinates using homogeneous coordinates, E.G.:

[ c0 c1 c2 ]   [ x ]
[ c3 c4 c5 ] * [ y ]
[ c6 c7 c8 ]   [ 1 ]

Notice: As input devices have varying input ranges, the coordinates are
first scaled to the [0..1] range for generality, and afterwards scaled
back up.

E.G. for a dual head setup (using same resolution) next to each other, you
would want to scale the X coordinates of the touchscreen connected to the
both heads by 50%, and translate (offset) the coordinates of the rightmost
head by 50%, or in matrix form:

   left:            right:
[ 0.5 0 0 ]     [ 0.5 0 0.5 ]
[ 0   1 0 ]     [ 0   1 0   ]
[ 0   0 1 ]     [ 0   0 0   ]

Which can be done using xinput:

xinput set-prop <left> --type=float "Coordinate Transformation Matrix" \
       0.5 0 0 0 1 0 0 0 1

xinput set-prop <right> --type=float "Coordinate Transformation Matrix" \
       0.5 0 0.5 0 1 0 0 0 1

Likewise more complication setups involving more heads, rotation or
different resolution can be handled.

Signed-off-by: Peter Korsgaard <peter.korsgaard@barco.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2010-05-28 16:49:30 +10:00
..
Makefile.am Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00
allowev.c dix: remove un-used parameter "core" from AllowSome 2009-04-19 22:28:11 +10:00
allowev.h
chgdctl.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
chgdctl.h
chgfctl.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
chgfctl.h
chgkbd.c Remove #define NEED_EVENTS and NEED_REPLIES 2008-12-12 11:43:32 +10:00
chgkbd.h
chgkmap.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
chgkmap.h
chgprop.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
chgprop.h
chgptr.c Remove #define NEED_EVENTS and NEED_REPLIES 2008-12-12 11:43:32 +10:00
chgptr.h
closedev.c Remove #define NEED_EVENTS and NEED_REPLIES 2008-12-12 11:43:32 +10:00
closedev.h
devbell.c Remove #define NEED_EVENTS and NEED_REPLIES 2008-12-12 11:43:32 +10:00
devbell.h
exevents.c Return an appropriately-typed error from dixLookupResourceByType. 2010-05-19 12:32:48 -07:00
exglobals.h Xi: purge old device enter/leave masks. 2009-03-20 15:17:57 +10:00
extinit.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
getbmap.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
getbmap.h
getdctl.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
getdctl.h
getfctl.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
getfctl.h
getfocus.c Remove #define NEED_EVENTS and NEED_REPLIES 2008-12-12 11:43:32 +10:00
getfocus.h
getkmap.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
getkmap.h
getmmap.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
getmmap.h
getprop.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
getprop.h
getselev.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
getselev.h
getvers.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
getvers.h
grabdev.c Xi: remove obsolete comment. 2009-07-30 08:43:14 +10:00
grabdev.h
grabdevb.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
grabdevb.h
grabdevk.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
grabdevk.h
gtmotion.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
gtmotion.h
listdev.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
listdev.h Xi: Change ChangeMasterDeviceClasses to new XI2 events. 2009-03-20 15:17:55 +10:00
opendev.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
opendev.h
queryst.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
queryst.h
selectev.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
selectev.h
sendexev.c Xi: fix not reached code in XSendExtensionEvent 2010-04-21 18:07:16 +03:00
sendexev.h
setbmap.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
setbmap.h
setdval.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
setdval.h
setfocus.c Remove #define NEED_EVENTS and NEED_REPLIES 2008-12-12 11:43:32 +10:00
setfocus.h
setmmap.c Xi: use byte-counting macros instead of manual calculation. 2009-07-14 10:05:53 +10:00
setmmap.h
setmode.c Xi: assume BadMode for non-BadMatch errors returned from SetDeviceMode. 2010-02-22 12:04:36 +10:00
setmode.h
stubs.c Revert "Add a "flags" field to DeleteInputDeviceRequest." 2010-05-26 07:54:35 -07:00
ungrdev.c input: replace GrabRec's coreGrab field with grabtype. 2009-04-19 22:28:08 +10:00
ungrdev.h
ungrdevb.c input: ensure various ProcUngrabKey/Buttons have the right grabtype set. 2009-05-04 17:40:29 +10:00
ungrdevb.h
ungrdevk.c input: ensure various ProcUngrabKey/Buttons have the right grabtype set. 2009-05-04 17:40:29 +10:00
ungrdevk.h
xiallowev.c input: bump to ints for deviceids - XI2 requires 16-bit deviceids. 2009-06-18 14:40:54 +10:00
xiallowev.h Xi: standardise XI2 headers. 2009-09-03 08:39:27 +10:00
xichangecursor.c Return an appropriately-typed error from dixLookupResourceByType. 2010-05-19 12:32:48 -07:00
xichangecursor.h Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00
xichangehierarchy.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
xichangehierarchy.h Xi: standardise XI2 headers. 2009-09-03 08:39:27 +10:00
xigetclientpointer.c Xi: fix up access modes for calls to dixLookupDevice(). 2009-06-23 20:50:29 -04:00
xigetclientpointer.h Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00
xigrabdev.c Xi: Unify checking for invalid bits in grab masks. 2009-09-03 08:39:27 +10:00
xigrabdev.h Xi: standardise XI2 headers. 2009-09-03 08:39:27 +10:00
xipassivegrab.c Return an appropriately-typed error from dixLookupResourceByType. 2010-05-19 12:32:48 -07:00
xipassivegrab.h Xi: standardise XI2 headers. 2009-09-03 08:39:27 +10:00
xiproperty.c dix: add 3x3 transformation matrix xinput property for multi-head handling 2010-05-28 16:49:30 +10:00
xiproperty.h Xi: reset the known properties at the end of the server generation. 2010-05-07 12:16:43 -07:00
xiquerydevice.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
xiquerydevice.h xace: Fake return values on denials in input polling requests. 2009-10-14 19:19:19 -04:00
xiquerypointer.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
xiquerypointer.h Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00
xiqueryversion.c Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00
xiqueryversion.h Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00
xiselectev.c Replace X-allocation functions with their C89 counterparts 2010-05-13 00:22:37 +07:00
xiselectev.h Xi: standardise XI2 headers. 2009-09-03 08:39:27 +10:00
xisetclientpointer.c Xi: check for Use permission on the device in SetClientPointer(). 2009-06-23 20:50:29 -04:00
xisetclientpointer.h Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00
xisetdevfocus.c Xi: add swapping hook for XIGetFocus reply. 2009-08-24 10:09:05 +10:00
xisetdevfocus.h Xi: standardise XI2 headers. 2009-09-03 08:39:27 +10:00
xiwarppointer.c Xi: return BadDevice for master kbds and attached slaves in XIWarpPointer 2009-09-03 10:00:34 +10:00
xiwarppointer.h Xi: namespace XI2 files. 2009-06-17 09:05:22 +10:00