输入上下文状态知识
本文只记录状态缓存的 key 选择、懒分配和清理时序。显示组归属规则见 display-group-model.md。
缓存 key 选择
会影响目标、坐标、焦点、绘制或分发隔离的状态,应以已解析运行时上下文为 key,而不是用早期阶段的偶然标识。
| 状态 | 推荐 key | 清理触发 |
|---|---|---|
| 鼠标位置/坐标 | 已解析显示组;物理坐标再加 display | 显示/组变化、序列结束、服务重启 |
| 光标范围/当前显示 | 已解析显示组和显示布局 | 显示拓扑或绑定变化 |
| 光标样式/大小/颜色/可见性 | 用户加已解析组/窗口 | 用户切换、窗口销毁、样式重置 |
| 鼠标捕获模式 | 已解析组/窗口 | 捕获释放、窗口销毁、取消 |
| 指针序列快照 | sequence id 或 pointer id 加已解析上下文 | end/cancel 分发、绘制、上报完成后 |
| 键盘焦点/重发 | 已解析显示组 | 焦点转移、组/窗口更新 |
| UDS 分发目标 | 已解析目标/窗口上下文 | 分发完成、目标失效 |
不要对同一行为使用不同 key 读写,例如 group id 写入、display id 读取。
懒分配
可选上下文状态只在事件、显式上下文操作或测试设置需要时创建。服务构造、普通默认输入处理、只读遗留查询、dump 或查询路径不应隐式创建分发或渲染上下文,除非 API 明确记录该副作用。
序列清理时序
指针序列上下文应保留到所有目标敏感消费者完成:
- 解析或恢复序列上下文。
- 计算目标窗口和 pointer item 更新。
- 刷新绘制或光标状态。
- 尝试 UDS 分发和相关事件投递。
- 通知渲染或上报组件。
- 清除序列快照和不再存活的可选状态。
cancel、axis-end、redispatch 和合成 end 事件即使晚于原始输入生成,也应使用原始已解析上下文或序列快照。
测试指引
序列快照使用 PointerDispatchEventCacheStandaloneTest;焦点/目标/捕获状态使用 InputWindowsManager*;光标和绘制状态使用 PointerDrawingManager*、CursorDrawingComponent*;显示绑定缓存使用 InputDisplayBindHelper*。带作用域行为至少覆盖一个非默认或多作用域场景。