显示组模型知识

本文记录输入目标作用域的权威模型。设备分类差异见 input-device-scope.md,缓存键和清理见 input-context-state.md

作用域模型

一个用户空间可以有多个前台显示组。每个显示组包含一组物理显示,并拥有独立的焦点、窗口、坐标边界、光标、捕获和活跃输入序列。

属于某个显示组的指针、键盘、触控板、手写笔、轴事件、摇杆或合成事件,不应读取或更新其他显示组的目标敏感状态。

不要混用的身份

身份 用途 常见误用
用户 选择当前用户空间和前台显示组集合 当成窗口或显示缓存键
显示组 焦点、窗口状态、光标状态、坐标边界、捕获和序列归属 被物理 display id 替代
物理显示 表示显示组内的一块屏幕和布局信息 单独作为焦点/光标/窗口状态归属
窗口/窗口组 在用户和显示组解析完成后参与目标选择 反向推导显示组状态

函数只收到 display id、window id 或 device id 时,先确认所属用户和显示组在哪里解析,再读写目标敏感状态。

默认组边界

默认显示组只适合:

  • 服务启动和默认初始化。
  • 明确记录为仅默认组的遗留 helper。
  • 不分配可选上下文状态的只读默认查询。
  • 专门验证遗留默认行为的测试。

非默认事件链已经解析出用户/显示组或捕获序列快照后,目标选择、焦点、光标、捕获、合成事件、取消、axis-end、重分发和绘制都应继续使用已解析上下文或序列快照。

修改前检查

  • 事件或查询属于哪个用户和显示组?
  • 物理显示只是解析输入,还是最终行为作用域?
  • 被触碰状态是否影响焦点、目标、坐标、光标、捕获、序列、重分发或绘制?
  • 另一个显示组拥有不同焦点或指针状态时会怎样?
  • 显示、用户、窗口或设备归属变化时是否会清理?

代码和测试

显示/窗口目标选择从 service/window_manager/InputWindowsManagerInputDisplayBindHelperPointerDispatchEventCache 开始追踪。显示生命周期从 service/display_state_manager/ 开始追踪。

焦点、目标、捕获、取消、axis-end 和重分发使用 InputWindowsManager*;显示绑定使用 InputDisplayBindHelper*;光标、绘制和序列使用 PointerDrawingManager*CursorDrawingComponent*PointerDispatchEventCacheStandaloneTest