显示组模型知识
本文记录输入目标作用域的权威模型。设备分类差异见 input-device-scope.md,缓存键和清理见 input-context-state.md。
作用域模型
一个用户空间可以有多个前台显示组。每个显示组包含一组物理显示,并拥有独立的焦点、窗口、坐标边界、光标、捕获和活跃输入序列。
属于某个显示组的指针、键盘、触控板、手写笔、轴事件、摇杆或合成事件,不应读取或更新其他显示组的目标敏感状态。
不要混用的身份
| 身份 | 用途 | 常见误用 |
|---|---|---|
| 用户 | 选择当前用户空间和前台显示组集合 | 当成窗口或显示缓存键 |
| 显示组 | 焦点、窗口状态、光标状态、坐标边界、捕获和序列归属 | 被物理 display id 替代 |
| 物理显示 | 表示显示组内的一块屏幕和布局信息 | 单独作为焦点/光标/窗口状态归属 |
| 窗口/窗口组 | 在用户和显示组解析完成后参与目标选择 | 反向推导显示组状态 |
函数只收到 display id、window id 或 device id 时,先确认所属用户和显示组在哪里解析,再读写目标敏感状态。
默认组边界
默认显示组只适合:
- 服务启动和默认初始化。
- 明确记录为仅默认组的遗留 helper。
- 不分配可选上下文状态的只读默认查询。
- 专门验证遗留默认行为的测试。
非默认事件链已经解析出用户/显示组或捕获序列快照后,目标选择、焦点、光标、捕获、合成事件、取消、axis-end、重分发和绘制都应继续使用已解析上下文或序列快照。
修改前检查
- 事件或查询属于哪个用户和显示组?
- 物理显示只是解析输入,还是最终行为作用域?
- 被触碰状态是否影响焦点、目标、坐标、光标、捕获、序列、重分发或绘制?
- 另一个显示组拥有不同焦点或指针状态时会怎样?
- 显示、用户、窗口或设备归属变化时是否会清理?
代码和测试
显示/窗口目标选择从 service/window_manager/ 的 InputWindowsManager、InputDisplayBindHelper、PointerDispatchEventCache 开始追踪。显示生命周期从 service/display_state_manager/ 开始追踪。
焦点、目标、捕获、取消、axis-end 和重分发使用 InputWindowsManager*;显示绑定使用 InputDisplayBindHelper*;光标、绘制和序列使用 PointerDrawingManager*、CursorDrawingComponent* 或 PointerDispatchEventCacheStandaloneTest。