触摸屏
如果你曾尝试在 Linux 中设置触摸屏设备,你可能会发现它要么开箱即用(除了某些校准),要么非常麻烦,尤其是当它不被 内核 支持时。
简介
本文假设你的触摸屏设备由内核支持(例如通过 usbtouchscreen 模块)。这意味着你的设备存在一个 /dev/input/event* 节点。请检查
$ less /proc/bus/input/devices
以查看你的设备是否在列表中,或者尝试
# cat /dev/input/eventn
在触摸屏幕的同时检查每个 event 节点。如果你找到了相应的节点,那么你很有可能能让设备正常工作。
可用的 X11 驱动程序
目前有许多适用于 X11 的触摸屏输入驱动程序。最常见的一些位于 extra 仓库中:
- xf86-input-evdev (如果你插入触摸屏后它能“直接工作”,这很可能是默认驱动)
- xf86-input-libinput;另请参阅 libinput
- xf86-input-elographics
一些不包含在仓库中的较少见的驱动程序有:
- xf86-input-magictouch
- xf86-input-mutouch
- xf86-input-plpevtch
- xf86-input-palmax
某些设备的专有驱动程序(例如 xf86-input-egalax)曾一度可用,但现在已不再维护:请使用开源驱动程序。
根据你的触摸屏设备选择合适的驱动程序。再次强调,如果你的触摸屏能“直接工作”,evdev 很可能是默认选项。
双指滚动
双指滚动必须在应用程序端实现(见 此链接)。对于 Firefox,请参阅 Firefox/Tweaks#Enable touchscreen gestures。
在 #Touchegg 中有一个黑科技可以为每个应用程序模拟这种滚动行为,但 X 服务器仍然将其处理为文本选择(至少在 Plasma 中如此)。
evdev 驱动程序
校准
安装 xinput_calibratorAUR (AUR)。然后,运行 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 规则。校准触摸屏 页面提供了一个 udev 规则示例,适用于手动计算变换矩阵并需要自动应用的情况。
使用 xrandr-watch-git 自动化 map-to-output
我们可以通过脚本捕获 xrandr 事件。安装 xrandr-watch-gitAUR,创建一个具有执行权限的脚本 ~/.xrandr-changed 来执行 map-to-output,例如:
~/.xrandr-changed
#!/bin/sh xinput --map-to-output "Wacom HID 4861 Finger touch" "eDP1"
然后启动、测试并启用 systemd/User 服务 xrandr-watcher.service。
Wayland/Weston
在运行 sway(或基于 wlroots 的支持合成器)和 KDE Plasma 的 Wayland 上,触摸屏可以映射到特定屏幕。此外还有 weston-touch-calibrator 等工具,但 Gnome Wayland 使用 Xwayland,导致校准器无法定位任何触摸屏。
Wayland/Xwayland 还会遮蔽 xinput 列表,将其漏斗式地传递给通用的 xwayland 设备,如 "xwayland-pointer"、"xwayland-relative-pointer"、"xwayland-touch-pointer" 等。Wayland 版本的 "Xinput" 是 "Libinput",但并没有完全相同的功能。目前已知在多显示器设置中使用触摸屏的方法是强制 Gnome 或 KDE 使用 X11。libinput 目前假设触摸屏覆盖所有可用监视器。
有关 sway 中的设置,请参阅 Sway#Touch display mapping。
对于 KDE Plasma,如果自动映射未能获得正确结果,可以使用系统设置中的“触摸屏”菜单将触摸屏映射到屏幕。
Touchegg
Touchegg 是一个多点触控手势程序,仅兼容 X,以用户身份在后台运行,识别手势并将其转换为更常规的事件(如鼠标滚轮移动),以便你可以例如使用双指滚动。但它也会干扰那些已经拥有自身手势识别的应用程序或窗口管理器。如果你同时拥有触控板和触摸屏,且触控板驱动程序(如 synaptics 或 libinput)被配置为不自行识别手势而是透传多点触控事件,那么 Touchegg 将在两者上都识别手势:这无法单独配置。事实上,它在识别手势方面比 synaptics 或 libinput 触控板驱动做得更好;但在触摸屏上,通常更好的做法是让应用程序以其独特的方式响应触摸。一些 Qt 和 GTK 应用程序可以做到这一点,但如果你让 Touchegg “吞掉”触摸事件,它们就无法实现。因此,当你主要运行不支持触摸事件的旧版应用程序时,Touchegg 非常有用。
在最近重写的 touchegg 2.0 中,双指滚动已被禁用。要启用它,请安装 xdotool 并参阅 此已关闭的问题。