Touchscreen (简体中文)
若您曾尝试过在Linux内配置一个触摸屏设备,你可能会发现这个设备要么开箱即用(除去一些简单的配置过程),要么拥有非常繁琐的配置,特别是它不被内核支持的情况下。
介绍
本文假定你的触摸屏设备被内核支持(例如USB触摸屏模块),这意味着你的计算机上会有目录/dev/input/event*/
。执行
$ less /proc/bus/input/devices
以查看你的设备是否被列出;或尝试
# cat /dev/input/event‘’?‘’ # 以您设备的事件编号代替"?"
以查看每一个事件节点。若你找到了设备相应的节点,那么您的设备可能能正常工作。
驱动程序
有很多适用于触摸屏的X11驱动程序。最常见的驱动程序包是在extra软件仓库中:
- xf86-input-evdev (在您的设备可以使用的情况下,这通常是默认的驱动程序)
- xf86-input-libinput;(参见 libinput)
- xf86-input-elographics
也有一些仓库或AUR中没有包括的较不常见的驱动程序包,例如:
- xf86-input-magictouch
- xf86-input-mutouch
- xf86-input-plpevtch
- xf86-input-palmax
某些触摸屏 (例如xf86-input-egalaxAUR)存在专有驱动程序,这些驱动程序一般包含在AUR中。
请根据您的触摸屏的品牌、型号等参数选择适当的驱动程序。同样地,若您的触摸屏已经可以正常使用,那么xf86-input-evdev可能是首选驱动程序。
evdev驱动程序的校准
运行xinput_calibratorAUR包内的xinput_calibrator
,并遵循说明进行操作。
在多显示器情景下使用触摸屏
若要在多显示器的情况下使用触摸屏(其中一部分不是触摸屏),你需要配置Xorg对触摸位置和屏幕之间的映射。可以通过xinput
实现。接下来的例子以具有wacom数位板和外接显示器的配置为例。
运行xrandr
显示两个显示器的参数:
$ 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
可见这里有两个显示器:LVDS1与VGA1。LVDS1是笔记本电脑自带的显示器,VGA1是外接显示器。我们将要将手写笔输入映射到LVDS1,所以我们需要知道手写笔输入的ID:
$ 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)]
我们可以看见有两个手写笔输入被识别出来,我们需要分别映射输入到屏幕输出,如下:
$ xinput --map-to-output 'Serial Wacom Tablet WACf004 stylus' LVDS1 $ xinput --map-to-output 'Serial Wacom Tablet WACf004 eraser' LVDS1
你可以通过将它们添加到~/xinitrc
或类似的文件中以自动执行这些命令。若你断开了屏幕并重新连接(比如通过KVM切换显示器时),那么映射将会失效。你可以使用udev规则来避免这种情况下可能出现的繁琐的配置过程。(请参见Calibrating Touchscreen#Do it automatically via a udev rule)
使用xrandr-watch-git软件包自动映射
我们可以通过xrandr-watch-gitAUR软件包配置一些xrandr事件的捕获并自动执行脚本。安装xrandr-watch-gitAUR,创建一个具有执行权限的脚本 ~/.xrandr-changed
,以执行映射到输出,例如:
~/.xrandr-changed
#!/bin/sh xinput --map-to-output "Wacom HID 4861 Finger touch" "eDP1"
并启动,测试并启用systemd/User服务xrandr-watcher.service
。
Touchegg
Touchegg 是一个多点触摸手势程序,可在后台以用户身份运行,识别手势并响应,例如将双指滑动映射为鼠标滚轮移动。但它也会使已经拥有自己的手势识别功能的应用程序或窗口管理器的手势功能不正常。如果您同时使用触摸板和触摸屏,并且已配置触摸板驱动程序(例如Synaptics或libinput)为不识别手势本身,而是通过多点触摸事件触发,那么Touchegg将抢先识别这些手势并让Synaptics与libinput无法识别。实际上,与Synaptics或libinput触摸板驱动程序相比,它能更好地识别手势。但是对于触摸屏,软件自己拥有的手势功能一般会更加好用。一些Qt和GTK应用程序拥有自己独有的手势系统,但是如果Touchegg覆盖了触摸事件,它们将无法识别。因此,当您主要运行较古老的应用程序时,Touchegg很有用,它们通常没有自己的手势功能。