词库、用户配置和皮肤此前固定在 %LOCALAPPDATA%\metasequoiaime,整包几百 MB 全压在 C 盘。安装向导新增一页,允许把这部分数据放到任意盘。 程序本体仍固定装在 Program Files:MetasequoiaImeServer.exe 带 uiAccess=true, 只有在受信任目录里这个标志才生效。 运行期的权威来源是 HKLM\Software\Metasequoia\MetasequoiaIME 的 DataDir。 Server、TSF DLL 和引擎三个组件各自按同一顺序解析:METASEQUOIA_IME_DATA_DIR 环境变量 -> 该注册表值 -> %LOCALAPPDATA%\metasequoiaime。三处各持一份实现, 因为组件边界规则禁止 windows/ 与 server/ 互相 include。32 位 TSF DLL 用 KEY_WOW64_64KEY 读,避开 WOW64 重定向。 安全相关的两个约束: - 安装器在数据目录里写 .metasequoiaime-data 标记。覆盖安装的清理和卸载的整目录 删除只在看到这个标记(或目录就是历史默认位置)时才执行——用户可能把数据目录 指到一个本来就有自己文件的文件夹。 - 选择页与 /DATADIR= 走同一套校验:拒绝相对路径、盘符根目录、不存在的盘、程序 目录内部,以及 Windows/Program Files/各 AppData/用户主目录本身。 升级时改了位置,PrepareToInstall 在停掉输入法进程后用 robocopy /MOVE 搬运用户 拥有的数据(msime_user.db 及其 WAL/SHM/journal、config.toml、config.base.toml、 skins\),词库和前端资源由本次安装重新写入。跨卷移动目录 MoveFile 会失败,所以用 robocopy。用户词库搬运失败会中止安装:否则新版本对着空的 msime_user.db 启动, ssPostInstall 的回放只记一句 skipped,用户的自造词就静悄悄没了。 测试侧新增 METASEQUOIA_IME_CONFIG_DIR,只改 config.toml 的位置而不搬词库。原先 靠重定向 LOCALAPPDATA 做隔离的办法在装了正式版的机器上已不再成立——注册表值 的优先级高于它。
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 只引用这些头文件,不链接引擎运行库。