# 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/`设备