71 lines
1.9 KiB
Markdown
71 lines
1.9 KiB
Markdown
# screen_ds.c - 显示器信息持续监控程序
|
|
|
|
## 概述
|
|
一个基于Xrandr的显示器状态持续监控程序。持续监听显示器的连接/断开事件,当检测到变化时(防抖3秒后)输出所有显示器的当前信息。
|
|
|
|
## 程序结构
|
|
|
|
### 数据结构
|
|
```c
|
|
typedef struct {
|
|
char* output_name; // 输出接口名(如HDMI-1)
|
|
int width, height; // 分辨率
|
|
int x, y; // 位置坐标
|
|
int rotation; // 旋转方向
|
|
} MonitorInfo;
|
|
|
|
typedef struct {
|
|
MonitorInfo* monitors; // 显示器数组
|
|
int count; // 显示器数量
|
|
} MonitorList;
|
|
```
|
|
|
|
### 旋转方向编码
|
|
| 值 | 字母 | 说明 |
|
|
|----|------|------|
|
|
| RR_Rotate_0 | N | 正常方向 |
|
|
| RR_Rotate_90 | L | 左旋转90度 |
|
|
| RR_Rotate_180 | I | 翻转180度 |
|
|
| RR_Rotate_270 | R | 右旋转90度 |
|
|
|
|
## 工作原理
|
|
|
|
1. **初始化**: 打开X显示连接,注册RandR事件监听
|
|
2. **首次输出**: 获取并输出当前所有显示器信息
|
|
3. **事件循环**:
|
|
- 监听`RRScreenChangeNotify`和`RRNotify`事件
|
|
- 检测到事件后设置`need_update`标志
|
|
- 防抖3秒后(`DEBOUNCE_TIME`)重新获取并输出显示器信息
|
|
4. **无事件时**: 休眠100ms减少CPU占用
|
|
|
|
## 输出格式
|
|
```
|
|
HDMI-1|1920x1080|0x0|N
|
|
DP-2|1920x1080|1920x0|N
|
|
```
|
|
每行格式: `接口名|分辨率|位置|旋转方向`
|
|
|
|
## 关键函数
|
|
|
|
| 函数 | 功能 |
|
|
|------|------|
|
|
| `get_monitor_info()` | 获取所有连接的显示器信息 |
|
|
| `output_monitor_info()` | 输出显示器信息到文件或stdout |
|
|
| `rotation_to_char()` | 旋转值转字母表示 |
|
|
| `current_timestamp()` | 获取毫秒级时间戳 |
|
|
|
|
## 调用方式
|
|
```bash
|
|
./screen_ds [输出文件路径]
|
|
# 例: ./screen_ds /tmp/screen.txt
|
|
# 不指定参数则输出到标准输出
|
|
```
|
|
|
|
## 特性
|
|
- 3秒防抖:避免频繁热插拔导致的重复输出
|
|
- 持续运行,直到Ctrl+C退出
|
|
- 支持输出到文件或标准输出
|
|
|
|
## 依赖
|
|
- X11 + Xrandr扩展
|