触摸屏
如果您曾经尝试在 Linux 中设置触摸屏设备,您可能已经注意到它要么开箱即用(除了一些校准),要么非常繁琐,尤其是在内核不支持的情况下。
简介
本文假设您的触摸屏设备受内核支持(例如,通过 usbtouchscreen 模块)。这意味着您的设备存在一个 /dev/input/event*
节点。查看
$ less /proc/bus/input/devices
以查看您的设备是否已列出,或尝试
# cat /dev/input/event? # replace ? with the event numbers
在触摸显示屏的同时,针对您的每个事件节点。如果您找到了相应的节点,则很可能您可以使该设备正常工作。
可用的 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-egalaxAUR),但建议首先尝试开源驱动程序。
根据您的触摸屏设备选择合适的驱动程序。同样,如果您的触摸屏“可以正常工作”,则 evdev 可能是默认驱动程序。
双指滚动
双指滚动必须在应用程序端实现(请参阅 此链接)。对于 Firefox,请参阅 Firefox/Tweaks#启用触摸屏手势。
在 #Touchegg 中有一个 hack 可以模拟每个应用程序的滚动行为,但 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
Wayland 目前除了 sway(或基于 wlroots 的受支持的合成器)之外,在任何环境中都没有已知的方法可以将触摸锁定到特定显示器。有一些工具,例如 weston-touch-calibrator,但 Gnome Wayland 使用 Xwayland,导致校准器无法找到任何触摸屏。
Wayland/Xwayland 还屏蔽了 xinput 列表,并将它们 funnel 到通用 xwayland 设备,例如“xwayland-pointer”、“xwayland-relative-pointer”、“xwayland-touch-pointer”等。Wayland 的“Xinput”方法是“Libinput”,但并不具备所有相同的功能。当前在多显示器设置中使用触摸屏的已知方法是强制 Gnome 或 KDE 使用 X11。libinput 当前假设触摸屏覆盖所有可用的监视器。
有关 sway 中的设置,请参阅 Sway#触摸显示器映射。
Touchegg
Touchegg 是一个多点触控手势程序,仅与 X 兼容,它作为用户在后台运行,识别手势,并将它们转换为更传统的事件,例如鼠标滚轮移动,这样您就可以例如使用两根手指滚动。但它也会干扰已经进行自己的手势识别的应用程序或窗口管理器。如果您同时拥有触摸板和触摸屏,并且如果触摸板驱动程序(例如 synaptics 或 libinput)已配置为不识别手势本身,而是传递多点触控事件,则 Touchegg 将识别两者上的手势:这是无法配置的。事实上,它在识别手势方面比 synaptics 或 libinput 触摸板驱动程序做得更好;但在触摸屏上,通常最好让应用程序以自己独特的方式响应触摸。一些 Qt 和 GTK 应用程序会这样做,但如果您让 Touchegg “吃掉”触摸事件,它们将无法做到这一点。因此,当您主要运行不自行使用触摸事件的旧版应用程序时,Touchegg 非常有用。