问题描述
CH9329 作为 HID 后端连接 macOS 目标机时:
- 绝对模式可以移动、单击,但拖拽只移动一小段便失效;
- 相对模式可以移动,但 macOS 不接受按钮点击;
- 浏览器控制台与 RustDesk 入口均可复现。
这不是上游输入事件提前松键,也不是 One-KVM 串口队列丢包。
环境
- One-KVM:
0.2.6
- CH9329 芯片版本:
V3.0
- USB 设备:
WCH UART TO KB-MS_V2.0
- VID/PID:
1A86:E12A
- 串口:9600 baud
- 目标系统:macOS 26.5.2(Apple Silicon)
- 控制入口:RustDesk 1.4.9、One-KVM Web Console
取证结果
从客户端到目标机完整检查了拖拽状态:
- RustDesk 按下为
mask=9,移动期间持续为 mask=8,仅在用户实际松手时出现 mask=10;
- One-KVM 在拖拽期间持续保持
mouse_buttons=0x01;
- CH9329 串口命令均收到成功应答;
- 在目标 macOS 上通过
IOHIDManager 捕获 CH9329 原始 USB Report:
- 首个按下报告:report ID 2,
02 01 ...;
- 随后 107 个绝对鼠标报告全部保持
buttons=0x01;
- 约 6.36 秒后用户实际松手,才出现
02 00 ...;
- 不存在中途
buttons=0x00。
因此,按键状态在 One-KVM、串口协议及 CH9329 USB 输出侧均正确保持。问题发生在 macOS 对 CH9329 绝对鼠标 HID 集合的处理上。
现有 ch9329_hybrid_mouse 是 Linux 绝对鼠标兼容策略:按钮走相对报告、移动走绝对报告。它无法解决 macOS 问题,因为该目标上的相对报告按钮不生效,启用后反而会导致点击失效。
已验证的兼容策略
以下发送策略已在真实 macOS 目标机验证可持续拖拽:
- 未按键时,仍发送 CH9329 绝对鼠标报告;
- Button Down 使用绝对 report ID 2;
- 按住期间,将连续绝对坐标的差值换算为相对位移,通过 report ID 1 发送;
- Button Up 再使用绝对 report ID 2;
- 默认模式与现有 Linux 混合模式保持不变。
即:绝对报告负责定位和按钮边沿,相对报告负责按住期间的移动。
建议实现
新增独立、默认关闭的 CH9329 macOS 拖拽兼容选项(例如 ch9329_macos_drag),不要复用或改变 ch9329_hybrid_mouse 的既有语义。
建议测试覆盖:
- 小于一个像素的换算结果不吞掉非零移动;
- 相对位移限制在 CH9329
i8 范围;
- 默认模式行为不变;
- Linux 混合模式行为不变;
- macOS 兼容模式下按钮边沿为绝对报告,按住移动为相对报告。
我会提交对应 PR。
问题描述
CH9329 作为 HID 后端连接 macOS 目标机时:
这不是上游输入事件提前松键,也不是 One-KVM 串口队列丢包。
环境
0.2.6V3.0WCH UART TO KB-MS_V2.01A86:E12A取证结果
从客户端到目标机完整检查了拖拽状态:
mask=9,移动期间持续为mask=8,仅在用户实际松手时出现mask=10;mouse_buttons=0x01;IOHIDManager捕获 CH9329 原始 USB Report:02 01 ...;buttons=0x01;02 00 ...;buttons=0x00。因此,按键状态在 One-KVM、串口协议及 CH9329 USB 输出侧均正确保持。问题发生在 macOS 对 CH9329 绝对鼠标 HID 集合的处理上。
现有
ch9329_hybrid_mouse是 Linux 绝对鼠标兼容策略:按钮走相对报告、移动走绝对报告。它无法解决 macOS 问题,因为该目标上的相对报告按钮不生效,启用后反而会导致点击失效。已验证的兼容策略
以下发送策略已在真实 macOS 目标机验证可持续拖拽:
即:绝对报告负责定位和按钮边沿,相对报告负责按住期间的移动。
建议实现
新增独立、默认关闭的 CH9329 macOS 拖拽兼容选项(例如
ch9329_macos_drag),不要复用或改变ch9329_hybrid_mouse的既有语义。建议测试覆盖:
i8范围;我会提交对应 PR。