四码(不论是否唯一)之后继续敲字母时,先上屏该码的首选候选,再把这个字母 保留为下一次组合的开头。根因是两侧对「组合里有几个字母」认知不一致:TSF 的 本地按键缓冲跟着敲键涨(raw 预编辑样式下 preedit 就是它),服务端的五笔 raw 被引擎裁在四码;空格提交时组合文本被整段替换成候选并清掉本地缓冲,多敲的 字母随之丢失。 - 新增 worker 消息 CommitCandidateAndContinue(27),payload "<consumed>\t<text>": TSF 按服务端给出的消费数裁**自己**的组合缓冲,而不是套用服务端按旧视图算好 的剩余串——快打时用户已多敲的字母因此不会被覆盖 - TSF 处理序列全部复用既有原语:_InsertTextToComposition + _HandleCompleteCommitFirst 真提交,_StartComposition + AddVirtualKey + _HandleCompositionInputWorker(NO_REQUEST_ID) 重建余下字母的组合;无组合时退化为直写 - 服务端顶字不看自动上屏开关:开关只决定唯一码要不要多敲一键才上屏, 不决定丢不丢输入;自动上屏那条路也改用同一消息,顺带收掉快打竞态 - 引擎新增 wubi_four_code_is_complete(完整四码、码表作答、不要求唯一; 空码不算——没有候选可提交时不触发顶字) 已知限制:光标在组合中间时的改码行为维持现状;空码继续敲字母仍会被忽略。
windows —— TSF 文本服务
水杉输入法在 Windows 上的前端:一个纯 TSF 方案的文本服务 DLL,注入宿主进程,负责按键预判、焦点与线程归属、composition 的 edit session 写入,以及与 Server 之间的命名管道协议。候选窗、工具栏、设置页和实际的候选计算都在 ../server/,本目录只做宿主适配。
产品介绍、安装和功能说明见仓库根目录的 README;本目录的代码地图、TSF/COM 硬约定和改动要求见 AGENTS.md。
构建
从仓库根目录配置,源码目录是本目录:
cmake -S windows -B windows/build -A x64 `
-DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" `
-DVCPKG_TARGET_TRIPLET=x64-windows-static
cmake --build windows/build --config Release --parallel
ctest --test-dir windows/build -C Release --output-on-failure
Win32 用 -A Win32 和 x86-windows-static;安装包两种架构都要。scripts/ 下是本机开发用的生成、构建、注册和签名脚本,从本目录运行。
引擎契约来自 ../engine/contracts/,是本仓的目录,普通检出就有。TSF 只引用这些头文件,不链接引擎运行库。