本指南介绍了将鼠标设备的事件传输到界面 (UI) 客户端的非常高级的事件管道和政策旋钮。如需详细了解输入(非鼠标)的输入,请参阅用户输入架构 RFC。
背景
鼠标设备通常具有移动传感器、多个按钮和一个滚轮。有很多变体和配置,但本页面仅讨论基本信息。
当用户沿平坦的表面移动鼠标时,鼠标的物理动作用于控制屏幕上光标的移动。当用户点击按钮时,其状态变化(向下/向上)用于在界面中推动互动。当用户移动滚轮时,其运动用于驱动图形内容在界面中移动。
协议和事件流
鼠标事件从鼠标设备开始并向上流向堆栈,直到到达对鼠标事件作出响应的界面客户端。界面客户端通常在界面框架之上实现,因此当鼠标事件达到此级别时,它会以特定于框架的方式公开。
设备
鼠标设备连接到“主机”(您的计算机),并说出 USB HID 协议。HID 用法表中定义了协议细节。主机会等待中断以获取来自设备的 HID 报告。鼠标会静止不动,直到有内容要报告给主机,例如动作、按钮按下或滚动。
输入驱动程序
在主机端,Fucsia 的输入驱动程序堆栈会读取鼠标的 HID 报告,并将其转换为 FIDL MouseInputReport
。这种转换改进了 Fuchsia 平台上层的工效学设计:上层中的组件可以处理 FIDL 而不是 HID 专属数据格式的事件。
输入驱动程序允许较高级别的组件通过 Zircon 通道从每台设备读取报告。每个设备最初都作为 /dev/class/input-report
中的一个文件显示。
输入管道
输入流水线库通过 /dev/class/input-report
目录中的发现连接到鼠标设备。只有平台组件才能使用此敏感功能。
此组件提供了一个集中位置,用于路由鼠标事件和执行政策决策。
鼠标的物理运动通常会被解读为光标移动,而这些移动数据会通过敏感的指针注入器 API 发送到景观组件。按钮事件和滚轮事件也会在同一注入器通道上传输。
输入流水线实现以下集中式政策决策:
- 选择要针对鼠标事件注入的目标视图树。
- 定义如何解读鼠标的物理运动。例如,您可以设置鼠标的物理运动来控制光标的移动,也可以设置代替光标控制,作为相对运动数据报告给界面客户端。
- 定义鼠标的动作分辨率。
- 定义按钮的优先级顺序(主要、次要等)。例如,重新排序优先级可让用户将鼠标的右键设为主按钮。
- 定义滚轮的行程(每个定位点)和方向。
通常,这些字段可能会在将来扩展,以支持更丰富或更精确地解释用户对鼠标的使用意图。
风景
景区组件按照注入器(输入流水线)定义的政策,将注入的鼠标事件转发到界面客户端。在视图树中执行点击测试,以确定哪个界面客户端应接收鼠标事件。
当识别出鼠标目标时,Sce 通过 MouseSource
API 将鼠标事件分派给该界面客户端。界面客户端使用 hanging-get FIDL 模式监听鼠标事件。
界面客户端和界面框架
界面客户端可以自由使用从 Views 收到的鼠标事件。在创建用户体验的过程中,它可以读取光标动作、按钮事件和滚动事件。
如果界面客户端是在界面框架(例如 Flutter 或 Chromium)之上实现的,则框架代码将负责实现面向 Fuchsia 的代码以接收鼠标事件。然后,它必须以特定于框架的方式将这些鼠标事件呈现到基于该框架实现的界面客户端。例如,在 Flutter 框架中,鼠标事件通过 PointerEvent
Dart 类呈现给 Flutter 程序。