Calibrate a Touchscreen
To use multiple displays (some of which are touchscreens), you need to tell Xorg the mapping between the touch surface and the screen. This can be done using
xinput to set the touchscreen's coordinate transformation matrix, as described in the X.Org Wiki.
This shall be a guide to do that.
You will need to run the
xinput command every time you attach the monitor. You can use Udev to automate this; more details to follow once I get it working myself.
Using nVidia's TwinView
Get to know your system
Using TwinView, X will see all your Screens as one big screen. You can get your total height and width by executing
. You should see a line like this:
what means, your total width is 3600 and your total height is 1230.
Your touch device
Your next job is to get your device's name. Execute
$ xinput list
and find it by it's name. E.g. if the line can look like this
⎜ ↳ Acer T230H id=24 [slave pointer (2)]
your device name is
xinput list-props "Device Name"
and make sure there is a property called
Coordinate Transformation Matrix
(If not, you may probably selected the wrong device)
You need to shrink your touch area into a rectangle which is smaller than the total screen. This means, you have to know four values:
- Height of touch area
- Width of touch area
- horizontal offset (x offset) (amount of pixels between the left edge of your total screen and the left edge of your touch area)
- vertical offset (y offset) (amount of pixels between the top edge of your total screen and the top edge of your touch area)
Calculate the Coordinate Transformation Matrix
Now, calculate these as accurate as possible:
- c0 = touch_area_width / total_width
- c4 = touch_area_height / total_height
- c2 = touch_area_x_offset / total_width
- c5 = touch_area_y_offset / total_height
The matrix is
[ c0 0 c2 ] [ 0 c3 c4 ] [ 0 0 1 ]
which is represented as a row-by-row array:
c0 0 c2 0 c3 c4 0 0 1
Apply the Matrix
xinput set-prop "Device Name" --type=float "Coordinate Transformation Matrix" c0 0 c2 0 c4 c5 0 0 1
xinput set-prop "Acer T230H" --type=float "Coordinate Transformation Matrix" 0.533333333 0 0 0 0.87804878 0.12195122 0 0 1
to calibrate your touchscreen device. Now, it should work properly.