If you ever tried to set up a touchscreen device in linux, you might have noticed that it's either working out of the box (besides some calibration) or is very tedious, especially when it is not supported by the kernel.
This article assumes that your touchscreen device is supported by the kernel (e.g. by the usbtouchscreen module). That means there exists a
/dev/input/event* node for your device. Check out
to see if your device is listed or try
cat /dev/input/event? # replace ? with the event numbers
for every of your event nodes while touching the display. If you found the corresponding node, it's likely that you will be able to get the device working.
Available X11 drivers
There are a lot of touchscreen input drivers for X11 out there. The most common ones are in the extra repository:
- (likely the default driver if you plug in your touchscreen and it "just works")
- libinput ; see also
Less common drivers, not contained in the repository, are:
Proprietary drivers exist for some devices (e.g.:AUR), but it's recommended to try the open source drivers first.
Depending on your touchscreen device choose an appropriate driver. Again, evdev is likely to be the default if your touchscreen "just works."
InstallAUR (AUR). Then, run xinput_calibrator and follow the instructions.
Using a touchscreen in a multi-head setup
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 very easily with xinput:
Take for example the setup of having a wacom tablet and an external monitor. When we type xrandr we get a list of our two displays:
$ xrandr Screen 0: minimum 320 x 200, current 2944 x 1080, maximum 8192 x 8192 LVDS1 connected 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm 1024x768 60.0*+ 800x600 60.3 56.2 640x480 59.9 VGA1 connected 1920x1080+1024+0 (normal left inverted right x axis y axis) 477mm x 268mm 1920x1080 60.0*+ 1600x1200 60.0 1680x1050 60.0 1680x945 60.0
You see we have two displays here. LVDS1 and VGA1. LVDS1 is the display internal to the tablet, and VGA1 is the external monitor. We wish to map our stylus input to LVDS1. So we have to find the ID of the stylus input:
$ xinput --list ⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ QUANTA OpticalTouchScreen id=9 [slave pointer (2)] ⎜ ↳ TPPS/2 IBM TrackPoint id=11 [slave pointer (2)] ⎜ ↳ Serial Wacom Tablet WACf004 stylus id=13 [slave pointer (2)] ⎜ ↳ Serial Wacom Tablet WACf004 eraser id=14 [slave pointer (2)] ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Video Bus id=7 [slave keyboard (3)] ↳ Sleep Button id=8 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=10 [slave keyboard (3)] ↳ ThinkPad Extra Buttons id=12 [slave keyboard (3)]
We see that we have two stylus inputs who's ID's are 13 and 14. We now need to simply map our inputs to our output like so:
xinput --map-to-output 13 LVDS1 xinput --map-to-output 14 LVDS1
Touchegg is a multitouch gesture program, that runs as a user in the background, and adds multitouch support to window managers.