跳转至内容

触摸屏

来自 ArchWiki

如果你曾尝试在 Linux 中设置触摸屏设备,你可能会发现它要么开箱即用(除了某些校准),要么非常麻烦,尤其是当它不被 内核 支持时。

简介

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

$ less /proc/bus/input/devices

以查看你的设备是否在列表中,或者尝试

# cat /dev/input/eventn

在触摸屏幕的同时检查每个 event 节点。如果你找到了相应的节点,那么你很有可能能让设备正常工作。

可用的 X11 驱动程序

目前有许多适用于 X11 的触摸屏输入驱动程序。最常见的一些位于 extra 仓库中:

一些不包含在仓库中的较少见的驱动程序有:

  • 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 并参阅 此已关闭的问题

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.