输入上下文状态知识

本文只记录状态缓存的 key 选择、懒分配和清理时序。显示组归属规则见 display-group-model.md

缓存 key 选择

会影响目标、坐标、焦点、绘制或分发隔离的状态,应以已解析运行时上下文为 key,而不是用早期阶段的偶然标识。

状态 推荐 key 清理触发
鼠标位置/坐标 已解析显示组;物理坐标再加 display 显示/组变化、序列结束、服务重启
光标范围/当前显示 已解析显示组和显示布局 显示拓扑或绑定变化
光标样式/大小/颜色/可见性 用户加已解析组/窗口 用户切换、窗口销毁、样式重置
鼠标捕获模式 已解析组/窗口 捕获释放、窗口销毁、取消
指针序列快照 sequence id 或 pointer id 加已解析上下文 end/cancel 分发、绘制、上报完成后
键盘焦点/重发 已解析显示组 焦点转移、组/窗口更新
UDS 分发目标 已解析目标/窗口上下文 分发完成、目标失效

不要对同一行为使用不同 key 读写,例如 group id 写入、display id 读取。

懒分配

可选上下文状态只在事件、显式上下文操作或测试设置需要时创建。服务构造、普通默认输入处理、只读遗留查询、dump 或查询路径不应隐式创建分发或渲染上下文,除非 API 明确记录该副作用。

序列清理时序

指针序列上下文应保留到所有目标敏感消费者完成:

  1. 解析或恢复序列上下文。
  2. 计算目标窗口和 pointer item 更新。
  3. 刷新绘制或光标状态。
  4. 尝试 UDS 分发和相关事件投递。
  5. 通知渲染或上报组件。
  6. 清除序列快照和不再存活的可选状态。

cancel、axis-end、redispatch 和合成 end 事件即使晚于原始输入生成,也应使用原始已解析上下文或序列快照。

测试指引

序列快照使用 PointerDispatchEventCacheStandaloneTest;焦点/目标/捕获状态使用 InputWindowsManager*;光标和绘制状态使用 PointerDrawingManager*CursorDrawingComponent*;显示绑定缓存使用 InputDisplayBindHelper*。带作用域行为至少覆盖一个非默认或多作用域场景。