3 Commits
Author SHA1 Message Date
AkaneIwasaandfanlusky 568d07f513 feat(windows): 添加中日英三语轮换 (#717)
* feat(windows): 添加中日英三语轮换

* fix(windows): 三语轮换改为快捷键开关并修复两端状态不同步

- 开关移到「快捷键 → 中英文切换」下的「允许中日英循环切换」,配置键改为
  [keybindings] trilingual_cycle;输入模式恢复为中文/日文,二者互不影响
- 循环请求带显式标记位和请求方自身的中英/日文状态,Server 据此计算目标语言;
  普通 VK_SHIFT 仍是中英切换,不再被误当成循环
- Server 开关在请求途中被关闭时仍回复,按中英切换处理,TSF 只丢弃后续排队按键,
  不再超时重连
- 已发出的循环回复未被应用(含 Superseded)时走完整重连,避免日文状态两端不一致
- 循环切换补上光标处状态提示和标点同步
- 切换语言时复用暂存的另一语言会话,不在按键路径上重建引擎和打开 msime.db
- 配置读取的语言与开关改为原子量;TrilingualCycleChanged 的能力过滤移到发送方
- 中日切换不再重发 TrilingualCycleChanged;结束组合被拒绝时不计入统计

---------

Co-authored-by: fanlusky <1730976608@qq.com>
2026-10-09 15:44:41 +08:00
fanlusky f7064eb7c7 refactor(windows): 翻页与高亮移动的回复缺失改为软错过
WM_AsyncServerCandidateKey 对所有候选键都用 300 ms 提交预算,回复缺失即按
「可能已上屏」处理:丢键并完整重置传输。可对 PageUp/PageDown/Up/Down/Tab(含
Shift+Tab)来说,Server 只翻页或移动高亮,回复本来就只是确认(处理函数原先的
注释也这么写),永远不会上屏。把一次慢确认升级成拆管道、清组合,代价完全不对等。

现在这几颗键走普通的 50 ms 软读取:超时只是软错过,不拆管道、不清队列,迟到
的回复按 request id 缓存;只有真正的读失败/坏帧(TransportUnavailable)才按传输
失败处理。回复内容一律不应用,因为 Server 对这些键从不提交文本。

逗号、句号、括号、减号/等号(可配置翻页,也可能以词定字或随标点上屏)、
Ctrl+Enter 译文上屏和选词键仍保留 300 ms 提交预算与「歧义即丢键 + 传输重置」。
判定放在 IsCandidateNavigationOnlyKey 里并补了单元测试。
2026-09-27 19:02:17 +08:00
fanlusky 18cf3efe0a refactor(windows): 引入按键失败策略与本地重同步
新增 DeferredKeyFailurePolicy.h:把「按键为什么没能应用」映射成四种代价,
Stale(只丢这颗键)、Offline(离线原始通道,丢键并吞掉队列,保留本地组合)、
Resync(管道健康,但本地组合与 Server 可能不一致)、Transport(传输坏了或
状态未知,走完整重置)。纯函数,不依赖 TSF/COM,配套 tests/deferred_key_failure_policy.cpp。

新增 _RequestLocalResync:复用本地重置闸门取消组合,保持「先重置再排空」的
顺序,但不轮换 focus token、不关任何管道;闸门重新打开时在同一个 token 上补发
HideCandidateWnd,让 Server 清掉自己的组合(闸门关着时取消路径发出的 Hide 会被
挡下,所以必须补发)。重同步期间不清 _workerCommitReady,否则 WM_IpcReconnect
会把一次重同步等成 150 ms 超时并升级成完整重置。

_ResetSessionAfterFailure 统一处理失败后的会话丢弃:清空延迟队列(队列里的键
是按即将丢弃的组合分类的,一律吞掉,既不交还宿主也不重发),保留退格长按
守卫(#347),再按类别触发重置;重置期间把投影设为空组合,重置结束且队列为空
时释放投影,健康路径(包括 Excel 首键的同步排空)不会被残留的屏障挡住。

非按键路径里原本走完整传输重置、但管道其实没坏的几处改走重同步:OnEndEdit 的
组合属性检查与 EndComposition 失败、OnSetFocus 文档不匹配、WM_CheckGlobalCompartment
切换提交失败、_PostServerTextDelivery 投递失败。
2026-09-27 18:50:07 +08:00