V2-202509
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# 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扩展
|
||||
Reference in New Issue
Block a user