Files
msime-windows/server
fanlusky c01327cc0b feat(server): 设置窗口关闭后先隐藏,十分钟后才真正退出
设置是独立进程,每次关闭都销毁窗口,于是每次打开都要重新建 WebView2 并等首屏
导航,冷启动的等待完整地落在用户那一侧。现在用户关闭窗口只隐藏,进程继续持有
已经导航完成的 WebView2,十分钟内重新打开直接显示,超时后才走原来的退出路径。

隐藏期间停掉 300ms 的配置轮询并把 controller 置为不可见,让页面被浏览器降频,
免得一个看不见的窗口白占 CPU。重新露面时在 CancelLinger 里对称地恢复,并调用
WM_ACTIVATE 早就接好、此前一直是空操作的 Resume()。

窗口隐藏时保留的那一帧会在下次打开时先显示出来,所以隐藏前要清掉标题栏按钮的
悬停高亮,复用 WM_SIZE 在最小化/还原时已经用的那个 helper。页面自己的关闭按钮
在点击时清,这里覆盖 Alt+F4、启动图关闭按钮等不经过页面的路径。顺带清掉本地的
g_maximize_button_hover:隐藏的窗口收不到 WM_NCMOUSELEAVE,那个标志会一直是脏
的,下次真的移进去时不再发 enter。

两个边界:

首帧之前被关掉直接真退出,不留半初始化的进程——那种进程重新打开时启动图已经
dismiss 过,用户会对着一个空窗口等。这条同时覆盖启动图自己的关闭按钮,它发的
也是 WM_CLOSE。

CloseSettingsApplication() 是 Ctrl+Shift+Alt+T 的终止通道,紧接着 Server 自己
也要退出。它原来发 WM_CLOSE,而 WM_CLOSE 现在只隐藏,会把设置进程留在 Server
之后,所以改发新的 kQuitSettings 直通真正的退出。

OpenSettingsApplication() 不再自己 ShowWindow,改为投 kActivateSettings 让设置
进程自己处理:在这边直接显示不会取消延迟退出定时器,窗口会在用户面前被销毁,
而且 SW_SHOWNORMAL 还会把之前最大化的窗口还原掉。
2026-09-12 22:48:31 +08:00
..
2026-03-12 01:34:41 +08:00
2025-04-16 02:03:11 +08:00
2025-11-10 21:10:36 +08:00

Metasequoia IME Server(水杉输入法 Server 端)

This is the server end of MSIME-Windows.

How to build

Prerequisites

  • Visual Studio 2026
  • CMake
  • vcpkg
  • Python3.10+
  • Boost
  • Node.js and pnpm 10 (settings page build)

Make sure vcpkg and Boost are installed by Scoop.

Build steps(For Dev)

Clone the product and provision the reviewed dictionary release from its root:

git clone --recursive https://github.com/metasequoiaime/MSIME-Windows.git
cd MSIME-Windows
python scripts/product_lock.py fetch-dictionaries --staging-root .
if ($LASTEXITCODE -ne 0) { throw 'Dictionary verification failed' }
$devLocalData = Join-Path $PWD 'build/dev-local'
$devData = Join-Path $devLocalData 'metasequoiaime'
New-Item -ItemType Directory -Force $devData | Out-Null
Copy-Item MetasequoiaImeDict/out/* $devData -Force
Copy-Item engine/helpcode/helpcodes $devData -Recurse -Force
Copy-Item server/assets/tables/* $devData -Force
Copy-Item server/assets/config/config.toml $devData -Force
Push-Location ui-html/webview2/settings/ime-settings
try {
    pnpm install --frozen-lockfile
    if ($LASTEXITCODE -ne 0) { throw 'Settings dependencies failed' }
    pnpm build
    if ($LASTEXITCODE -ne 0) { throw 'Settings page build failed' }
} finally { Pop-Location }
$devWebview = Join-Path $devData 'html/webview2'
New-Item -ItemType Directory -Force $devWebview | Out-Null
foreach ($part in @('shared', 'candwnd', 'ftb', 'menu')) {
    Copy-Item "ui-html/webview2/$part" $devWebview -Recurse -Force
}
$devSettings = Join-Path $devWebview 'settings/ime-settings'
New-Item -ItemType Directory -Force $devSettings | Out-Null
Copy-Item ui-html/webview2/settings/ime-settings/dist $devSettings -Recurse -Force
python server/scripts/prepare_env.py
if ($LASTEXITCODE -ne 0) { throw 'Server environment setup failed' }
$env:LOCALAPPDATA = $devLocalData
$env:METASEQUOIA_IME_DATA_DIR = $devData
cd server

Use a dedicated PowerShell terminal. These steps stage the same locked data as CI and the current product pages in a separate development directory. Both LOCALAPPDATA (Windows config/pages) and METASEQUOIA_IME_DATA_DIR (Engine data) are set for that terminal; setting only the latter would still use installed Windows configuration and pages. Close the terminal after development. Dictionary source changes belong in Engine's dictionary/; use its root build_profile.py to build data instead of calling internal stages in the archived Dict repository.

Then, build and run,

.\scripts\lcompile.ps1
.\scripts\lrun.ps1

If you want to build and run in one step, run the following command,

.\scripts\llaunch.ps1

Watchdog

MetasequoiaImeWatchdog.exe is built next to the server. Starting the server directly also starts the watchdog, which monitors the server from the same directory and restarts it after an unexpected exit. Repeated early crashes use an exponential restart delay (up to 30 seconds) to avoid a restart storm.

The developer terminate shortcut stops both processes. The restart shortcut asks the watchdog to start a fresh server after the current process exits.

English prefix candidates

Place english.db next to msime.db in %LOCALAPPDATA%\metasequoiaime. Set general.cn_en_mixed_input = true in config.toml to enable asynchronous English prefix candidates for Quanpin and Shuangpin.

Developer Shortcuts

The server process includes a few built-in global shortcuts that are useful during development:

  • Ctrl + Shift + Alt + T
    • terminate MetasequoiaImeServer immediately
  • Ctrl + Shift + Alt + R
    • restart MetasequoiaImeServer
    • Settings exposes the same restart under 外观 → 重启输入法进程; it reaches the server over the Aux pipe because Settings runs in its own process
  • Ctrl + Shift + Alt + C
    • clear IME engine cache
  • Ctrl + Shift + Alt + 1 to Ctrl + Shift + Alt + 8
    • delete candidate 1 to 8 from the current candidate window
    • this only works while the candidate window is visible

Screenshots

Shared voice providers

The server links Engine VoiceCapture and Voice. WAV encoding and batch transcription/polish codecs come from the public library; Windows keeps provider configuration, SiliconFlow padding/retry behavior and Doubao streaming. Batch uploads are bounded to 20 MiB and responses to 1 MiB. Failed or empty polish responses retain the original transcript.

本地 Release 构建脚本可通过 -ManifestTool <mt.exe 路径> 使用其他 Windows SDK;未指定时沿用现有 SDK 路径。配置、编译或 manifest 嵌入失败都会中止,避免安装器收集旧产物。