触摸屏

来自 ArchWiki

如果您曾经尝试在 Linux 中设置触摸屏设备,您可能已经注意到它要么开箱即用(除了一些校准),要么非常繁琐,尤其是在内核不支持的情况下。

简介

本文假设您的触摸屏设备受内核支持(例如,通过 usbtouchscreen 模块)。这意味着您的设备存在一个 /dev/input/event* 节点。查看

$ less /proc/bus/input/devices

以查看您的设备是否已列出,或尝试

# cat /dev/input/event? # replace ? with the event numbers

在触摸显示屏的同时,针对您的每个事件节点。如果您找到了相应的节点,则很可能您可以使该设备正常工作。

可用的 X11 驱动

有很多适用于 X11 的触摸屏输入驱动程序。最常见的驱动程序位于 extra 仓库中

不太常见的驱动程序,未包含在仓库中,包括

  • 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 非常有用。

双指滚动已在最近重写的 touchegg 2.0 中禁用。要启用它,请安装 xdotool 并参阅 此已关闭的问题