# screentouch **Repository Path**: TimeRainStarSky/screentouch ## Basic Information - **Project Name**: screentouch - **Description**: 使触摸屏转换为触摸板使用。 - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-17 - **Last Updated**: 2025-11-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Screentouch 一个尝试使触摸屏在桌面程序中更加实用的项目(这些程序通常设计用于鼠标,也可能用于键盘)。 我不喜欢将手指放在 Raspberry Pi 触摸屏上时总是触发鼠标左键,并且无法使用其他鼠标按键。我编写了这个程序,将触摸屏输入转换成类似笔记本电脑触控板的行为。尽管我在 Raspberry Pi 上的官方触摸屏上完成了所有测试,但这个程序并不局限于该硬件。不过,它需要一个支持状态化接触报告的触摸屏,Linux 内核文档中称之为“多点触控协议 B”。某些屏幕(如 Raspberry Pi 的)如果多个手指靠得太近,可能只能检测到一个接触点。 该程序需要在调用时传入输入设备文件作为参数。它会检查每一个文件,直到找到一个看起来是触摸屏的设备,然后使用该输入设备。接下来,它使用 uinput(Linux 的用户空间输入设备支持)创建一个新的输入设备。程序试图获得触摸屏的独占访问权限,以防止其他软件直接响应触摸屏输入,因为这些软件可能也会响应新的 uinput 设备。然后它将触摸屏输入转换成看起来更像鼠标的行为。 --- ## 输入行为映射 | 动作 | 单指 | 双指 | 三指 |----------------------|------------------|--------------------|----------------- | 按下并移动 | 移动光标 | 一维滚动 | 二维滚动 | 按下并释放 | 左键 | 右键 | 中键 | 按下、释放再按下 | 拖动左键 | 拖动右键 | 拖动中键 一维滚动根据手指移动方向决定是横向还是纵向滚动。二维滚动同时滚动两个方向,但在 Firefox 中似乎不起作用。滚动操作不会移动鼠标光标。 双击动作目前尚不能很好地工作。 --- ## 支持的发行版 我已在以下系统上成功构建并运行: - Gentoo - Raspberry Pi OS / Raspbian - Ubuntu 我只测试过 Raspberry Pi 触摸屏的输入功能;一个在 Linux 下无法良好工作的触摸屏也无法与 Screentouch 配合使用。 --- ## 快速开始 - 满足构建前提条件(见下文)。 - 在源代码目录中运行 `scons`。 - 以 root 身份运行 `bin/*/screentouch /dev/input/event*`(可能需要使用 `sudo`,视系统配置而定)。 - 如果以上步骤失败,请继续阅读,可能有解决办法。 --- ## 构建说明 ### 前提条件: - 支持 C++17 的 gcc 编译器 - Boost 库,版本 1.67 及以上 - Exception(仅头文件) - Signals2(仅头文件) - Program options - libevdev,版本 1.57 可用,但旧版本可能也支持 - 如果你的 Linux 发行版区分开发库和非开发库,你需要安装开发库。这种区分在通常安装预编译二进制包的发行版中很常见,例如 Raspberry Pi OS 和 Ubuntu。 - Scons,版本 2.x 或 3.x 从包含 SConstruct 文件的目录运行 `scons`。如果构建成功,结果将位于 bin 目录下的平台相关子目录中。默认运行 `scons` 不带参数,将生成调试版本。要生成优化版本,请使用 `scons opt`。 构建有多个可选参数,如果默认参数导致问题,可以更改。运行 `scons -h` 可以查看这些选项。更改时在 `scons` 命令后添加 `OPTIONNAME=value`,例如: ```bash scons EVDEVINC=/usr/include/libevdev ``` --- ## 运行说明 Linux 内核的用户空间输入设备支持必须可用。许多内核将该支持编译为名为 `uinput` 的模块,包括 Raspbian 的。该模块会创建一个设备文件,通常为 `/dev/uinput`,也可能为 `/dev/input/uinput`。如果内核未默认加载该模块,则必须手动加载或将其编译进内核(非模块),否则 Screentouch 将无法工作。 运行 Screentouch 的用户账户必须对 `/dev/uinput` 和触摸屏设备文件有读写权限。在一些 Linux 发行版中,`input` 组的用户对 `/dev/input/event*` 文件具有读写权限,但对 `/dev/uinput` 文件可能没有。 输入设备文件编号可能每次启动时并不一致。在我的 Raspberry Pi 上,如果没有其他输入设备,它可能是 `/dev/input/event0`,否则会按顺序编号,比如连接了 USB 键盘的情况下。因此,程序会检查多个设备文件以找到触摸屏设备。 运行 Screentouch 时,将要尝试使用的输入设备文件作为参数传入。例如,在 Raspberry Pi 上从包含 SConstruct 文件的目录运行: ```bash bin/linux-armv7l-dbg/screentouch /dev/input/event* ``` Screentouch 可在 X 服务器启动后运行并达到预期效果。如果程序在 X 服务器运行期间终止,服务器将再次响应触摸屏设备的输入。X 服务器并非必需;只要 Screentouch 运行,就可以获得鼠标样式的输入,但绝对坐标始终以屏幕像素为单位。 --- ## Udev 配置 如今大多数 Linux 发行版使用 udev 来设置设备文件权限。在我的系统中,我通过添加 `/etc/udev/rules.d/uinput.rule` 文件并写入以下内容,使 `/dev/uinput` 可由 `input` 组用户读写: ``` KERNEL=="uinput", GROUP="input", MODE="0660" ``` 这将允许 `input` 组的用户创建输入设备并发送输入。这意味着该组的任何用户都可以向控制台发送输入,可能影响其他用户。建议创建另一个组或仅将该权限限制给要运行 Screentouch 的特定用户账户。