V2-202509
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# 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/`设备
|
||||
Reference in New Issue
Block a user