新增开关 general.caret_state_indicator_on_focus(默认关闭,需同时开启光标 状态提示)。 - DLL 把以下情况视为“换了输入框”:焦点窗口变化(Win32 编辑框、对话框、 其他应用各有自己的窗口);焦点经过一段没有可编辑文档的间隙后落到可 编辑文档上(Chromium、WPF 等单窗口宿主在字段之间就是先失焦再聚焦); 焦点会话真正结束后重新开始。Chromium 打字时在两个可编辑文档之间直接 替换文档管理器,不会触发。从 Win+. 面板返回不计入;线程焦点在真正的 应用切换后返回计入。一次切换的多次回调由定时器合并为一次提示;组字 过程中、以及没有光标的控件都保持静默。每次判断在 TSF 诊断日志里记录 判定标志,不含任何文本 - 协议复用 IMESwitch:wch 改为 FanyImeCaretStateTrigger(UserToggle / CapsLockEdge / FocusEntered),CapsLockEdge 保持首发时的 VK_CAPITAL 取值,Server 对未知值按 UserToggle 处理 - Server 在开关打开时显示当前的有效模式(Caps Lock 开启时为“英”); 配置项同步写入两份模板和两个设置窗口宿主的读写映射 - 设置页在光标状态提示卡片中增加“切换输入框时提示”开关
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 只引用这些头文件,不链接引擎运行库。