Touchscreen (简体中文)

From ArchWiki
翻译状态:本文是 Touchscreen翻译。上次翻译日期:2022-09-04。如果英文版本有所更改,则您可以帮助同步翻译。

若您曾尝试过在Linux内配置一个触摸屏设备,你可能会发现这个设备要么开箱即用(除去一些简单的配置过程),要么拥有非常繁琐的配置,特别是它不被内核支持的情况下。

介绍

本文假定你的触摸屏设备被内核支持(例如USB触摸屏模块),这意味着你的计算机上会有目录/dev/input/event*/。执行

$ less /proc/bus/input/devices

以查看你的设备是否被列出;或尝试

# cat /dev/input/event‘’?‘’ # 以您设备的事件编号代替"?"

以查看每一个事件节点。若你找到了设备相应的节点,那么您的设备可能能正常工作。

驱动程序

有很多适用于触摸屏的X11驱动程序。最常见的驱动程序包是在extra软件仓库中:

也有一些仓库或AUR中没有包括的较不常见的驱动程序包,例如:

  • xf86-input-magictouch
  • xf86-input-mutouch
  • xf86-input-plpevtch
  • xf86-input-palmax

某些设备存在专有驱动程序(例如:xf86-input-egalaxAUR),但建议先尝试开源驱动程序。

请根据您的触摸屏的品牌、型号等参数选择适当的驱动程序。同样地,若您的触摸屏已经可以正常使用,那么xf86-input-evdev可能是首选驱动程序。

两指滚动

必须在应用程序端实现两指滚动(参见 此链接)。

对于 Firefox,见 Firefox/Tweaks#Enable touchscreen gestures

#Touchegg 中,有一个 hack 可以模拟每个应用程序的这种滚动行为,但 X 服务器仍将其作为文本选择处理(至少在 Plasma 中)。

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  

可见这里有两个显示器:LVDS1VGA1LVDS1是笔记本电脑自带的显示器,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,以执行 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 目前没有已知的方法来将触摸锁定到特定显示器。有诸如 weston-touch-calibrator 之类的工具,但 Gnome Wayland 使用 XWayland,使校准器无法定位任何触摸屏。

Wayland/XWayland 也掩盖了 xinput 列表,并将它们下放到通用的 xwayland 设备,如 "xwayland-pointer"、"xwayland-relative-pointer"、"xwayland-touch-pointer"等等。"Xinput"的Wayland方法是"Libinput",但不具备所有相同的功能。 目前已知的在多头设置中使用触摸屏的方法是强制 Gnome 或 KDE 使用 X11。libinput 目前假设触摸屏覆盖所有可用的显示器。

Touchegg

Touchegg 是一个多点触摸手势程序,仅与 X 兼容,可在后台以用户身份运行,识别手势并响应,例如将双指滑动映射为鼠标滚轮移动。但它也会使已经拥有自己的手势识别功能的应用程序或窗口管理器的手势功能不正常。如果您同时使用触摸板和触摸屏,并且已配置触摸板驱动程序(例如Synaptics或libinput)为不识别手势本身,而是通过多点触摸事件触发,那么Touchegg将抢先识别这些手势并让Synaptics与libinput无法识别。实际上,与Synaptics或libinput触摸板驱动程序相比,它能更好地识别手势。但是对于触摸屏,软件自己拥有的手势功能一般会更加好用。一些Qt和GTK应用程序拥有自己独有的手势系统,但是如果Touchegg覆盖了触摸事件,它们将无法识别。因此,当您主要运行较古老的应用程序时,Touchegg很有用,它们通常没有自己的手势功能。

在最近对 touchegg 2.0 的重写中,双指滚动已被禁用。

要启用它,请安装 xdotool 并查看 这个关闭的问题