Files
2026-06-12 16:54:32 +08:00

90 lines
3.2 KiB
Markdown

# screen_binder.c - 触摸屏与显示器绑定程序
## 概述
核心模块之一,用于将触摸屏设备与显示器进行一一绑定。程序在每个显示器上依次弹出校准窗口,用户点击触摸屏后,程序记录触摸设备与当前显示器的对应关系,最终保存到`touch_dis_table.txt`文件。
## 程序结构
### 数据结构
```c
// 屏幕信息
int *screen_widths, *screen_heights; // 屏幕宽高
int *screen_x_offsets, *screen_y_offsets; // 屏幕坐标
char **screen_names; // 屏幕接口名
// 触摸绑定信息
int *touch_bindings; // 每个屏幕绑定的触摸设备ID
char **touch_names; // 触摸设备名称
char **touch_paths; // 触摸设备路径
```
### 线程模型
| 线程 | 功能 |
|------|------|
| 主线程 | GTK事件循环,窗口管理 |
| `touch_thread` | 触摸事件监听线程 |
| `enter_thread` | 全局回车键监听线程(X11) |
### 原子变量(线程安全)
```c
_Atomic int global_enter_pressed; // 全局回车键按下标志
_Atomic int program_active; // 程序活动状态
_Atomic int calibration_active; // 校准进行中标志
```
## 工作原理
1. **屏幕枚举**: 通过Xrandr获取所有已连接显示器
2. **触摸初始化**: 初始化触摸监听器,启动触摸事件监听线程
3. **全局回车监听**: 启动独立线程监听全局回车键(用于跳过非触摸屏)
4. **信息窗口创建**: 依次为每个非当前校准屏幕创建提示窗口
5. **校准流程**:
- 在当前屏幕创建全屏校准窗口
- 等待用户点击触摸屏(60秒超时)
- 记录触摸设备ID、名称、路径
- 用户按回车键可跳过当前屏幕
6. **保存结果**: 将绑定关系保存到`touch_dis_table.txt`
## 校准窗口交互
```
┌─────────────────────────────────────┐
│ 请在触摸屏上点击此屏幕。 │
│ │
│ 屏幕接口: HDMI-1 │
│ │
│ 如果此屏幕不是触摸屏, │
│ 那么请敲击回车或者等待60秒。 │
└─────────────────────────────────────┘
```
## 关键函数
| 函数 | 功能 |
|------|------|
| `get_screen_info()` | Xrandr获取屏幕信息 |
| `init_touch_listener()` | 初始化触摸监听 |
| `touch_callback()` | 触摸事件回调,记录绑定 |
| `global_enter_listener_thread()` | X11全局回车键监听 |
| `show_next_screen()` | 显示下一个校准屏幕 |
| `save_mapping_table()` | 保存绑定关系到文件 |
| `create_calibration_window()` | 创建校准窗口 |
| `create_info_window()` | 创建信息提示窗口 |
## 输出格式
文件`touch_dis_table.txt`格式:
```
屏幕接口名|触摸设备名|触摸设备ID|设备路径
HDMI-1|USB Touchscreen|12345|/dev/input/event5
```
## 调用方式
```bash
sudo ./screen_binder # 需要sudo权限访问触摸设备
```
## 依赖
- GTK+ 3.x
- X11 + Xrandr扩展
- touch_listen模块(触摸事件监听)
- 需要root权限访问`/dev/input/`设备