3.2 KiB
3.2 KiB
screen_binder.c - 触摸屏与显示器绑定程序
概述
核心模块之一,用于将触摸屏设备与显示器进行一一绑定。程序在每个显示器上依次弹出校准窗口,用户点击触摸屏后,程序记录触摸设备与当前显示器的对应关系,最终保存到touch_dis_table.txt文件。
程序结构
数据结构
// 屏幕信息
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) |
原子变量(线程安全)
_Atomic int global_enter_pressed; // 全局回车键按下标志
_Atomic int program_active; // 程序活动状态
_Atomic int calibration_active; // 校准进行中标志
工作原理
- 屏幕枚举: 通过Xrandr获取所有已连接显示器
- 触摸初始化: 初始化触摸监听器,启动触摸事件监听线程
- 全局回车监听: 启动独立线程监听全局回车键(用于跳过非触摸屏)
- 信息窗口创建: 依次为每个非当前校准屏幕创建提示窗口
- 校准流程:
- 在当前屏幕创建全屏校准窗口
- 等待用户点击触摸屏(60秒超时)
- 记录触摸设备ID、名称、路径
- 用户按回车键可跳过当前屏幕
- 保存结果: 将绑定关系保存到
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
调用方式
sudo ./screen_binder # 需要sudo权限访问触摸设备
依赖
- GTK+ 3.x
- X11 + Xrandr扩展
- touch_listen模块(触摸事件监听)
- 需要root权限访问
/dev/input/设备