Skip to content

fix(hid): CH9329 在 macOS 下无法持续拖拽 #303

Description

@drgnchan

问题描述

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

取证结果

从客户端到目标机完整检查了拖拽状态:

  1. RustDesk 按下为 mask=9,移动期间持续为 mask=8,仅在用户实际松手时出现 mask=10;
  2. One-KVM 在拖拽期间持续保持 mouse_buttons=0x01;
  3. CH9329 串口命令均收到成功应答;
  4. 在目标 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 目标机验证可持续拖拽:

  1. 未按键时,仍发送 CH9329 绝对鼠标报告;
  2. Button Down 使用绝对 report ID 2;
  3. 按住期间,将连续绝对坐标的差值换算为相对位移,通过 report ID 1 发送;
  4. Button Up 再使用绝对 report ID 2;
  5. 默认模式与现有 Linux 混合模式保持不变。

即:绝对报告负责定位和按钮边沿,相对报告负责按住期间的移动。

建议实现

新增独立、默认关闭的 CH9329 macOS 拖拽兼容选项(例如 ch9329_macos_drag),不要复用或改变 ch9329_hybrid_mouse 的既有语义。

建议测试覆盖:

  • 小于一个像素的换算结果不吞掉非零移动;
  • 相对位移限制在 CH9329 i8 范围;
  • 默认模式行为不变;
  • Linux 混合模式行为不变;
  • macOS 兼容模式下按钮边沿为绝对报告,按住移动为相对报告。

我会提交对应 PR。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions