Commit Graph
1941 Commits
Author SHA1 Message Date
fanlusky f87809cf59 perf(windows): 换语言热键不再每次按键重读 config.toml
_MatchChordInputHotkey 和 _MatchModifierReleaseHotkey 在 OnTestKeyDown、
OnKeyDown、OnTestKeyUp、OnKeyUp 里都要调 ReadConfiguredSwitchLanguageHotkeys,
每次都查注册表 DataDir、再逐行解析整个 config.toml,一次按键最多四遍,
全在宿主 UI 线程上,不在组合里的按键也照付。

配置路径每个进程只解析一次(环境变量固定,DataDir 只在重装时变);解析
结果按文件修改时间和大小缓存,最多每秒检查一次时间戳,设置页改了热键一秒
内生效。缓存全部常量初始化,路径对象按需分配且不释放,不引入全局构造器。
2026-09-27 15:03:16 +08:00
Lu Fan(SonnyCalcr) e3b4f432fe Merge pull request #488 from fanlusky/fix/candidate-sticky-per-input
fix(server): 候选卡片只在同一输入内保留尺寸,换键或翻页后不再留空白
2026-09-27 14:40:10 +08:00
fanlusky e829a1b1ab fix(server): 候选卡片只在同一输入内保留尺寸,换键或翻页后不再留空白
3a7beb18 让卡片在整次组合内只增不减,自然尺寸低于保留值 70% 才收回。
这本是为了吸收同一输入下陆续到达的译文、云/AI 候选和混输英文,但换键
后候选本就换了一页,也沿用了旧尺寸:gw(4 行)→ gw'r(3 行)时自然高度
约为 80%,卡片保持旧高度,底部留出一行空白;翻到末页同理。

保留尺寸改为按输入计算,键为 preedit(含光标标记)+ 页码。键不变时仍只
增不减;换键、移动光标或翻页后从自然尺寸开始。WebView2 由 C++ 把键传给
MsimeStickyCandidateCard,D2D 用 stickyCardKey_,两端逻辑一致。
2026-09-27 14:36:48 +08:00
Lu Fan(SonnyCalcr) 3e7a8cc19d Merge pull request #487 from fanlusky/fix/y-mode-english-flicker
fix(server): Y 模式临时英文查询返回前不再绘制占位页
2026-09-27 12:48:51 +08:00
fanlusky 661c622c49 fix(server): Y 模式临时英文查询返回前不再绘制占位页
中文模式下用 Y 触发临时英文时,PrepareCandidateList 会先发布一个只有原样输入
这一行的占位页并请求显示,英文词典的结果回来后再换成完整一页。每次按键卡片都
先缩成一行再撑开,高度明显闪动;缩小幅度远超 30%,会话内只增不减的规则也拦不
住。英文模式此前只处理了「页面为空」这一种占位形态。

改成由 PrepareCandidateList 在每次发出专用英文查询(英文模式、Y 模式)时标记
「回应未到」,ApplyEnglishCandidates 应用回应时清除,期间的显示请求交给回应去
触发。英文 worker 对非空输入一定会回应。造词和译文页状态下回应会被拒绝,不做
推迟;ClearState 也会清除标记。
2026-09-27 12:25:55 +08:00
Lu Fan(SonnyCalcr) cdd47db07e Merge pull request #486 from fanlusky/fix/tray-menu-corner-radius
fix: 托盘菜单项圆角与外框同心对齐,放宽 D2D 菜单间距
2026-09-27 11:40:11 +08:00
fanlusky 1348ca8eb7 fix(server): D2D 托盘菜单项圆角与外框同心对齐,放宽行高与内边距 2026-09-27 11:19:07 +08:00
fanlusky 4ae5b842b7 fix(ui-html): WebView2 托盘菜单项圆角与外框同心对齐 2026-09-27 11:19:06 +08:00
Lu Fan(SonnyCalcr) b322b32321 Merge pull request #485 from fanlusky/fix/webview2-commit-render-sync
fix(server): WebView2 选词不再白等渲染同步超时
2026-09-27 10:32:22 +08:00
fanlusky 42cff6de4a fix(server): WebView2 选词不再白等渲染同步超时
WebView2 下几乎每次空格/数字选词都等满渲染同步上限(日志 waited_ms 82-94,
rendered 恒比 current 小 1),体感为上屏顿一下。

每个按键 worker 会以相同内容发布两次页面:第一次走 content-only,回显在
异步 DOM 回调里;第二次命中 dedup,立即回显新代数。随后迟到的 DOM 回调把
回显改回旧代数,选词就一直等到超时。D2D 同步回显,不受影响。

- 渲染回显代数只进不退(AdvanceRenderedCandidateGeneration),迟到的旧回显
  不再覆盖新回显。
- folded-inflight 分支补上回显:进行中的 FineTune 只回显它捕获的那一页,
  之后折叠进来的页面此前永远没有回显。
2026-09-27 10:24:50 +08:00
Lu Fan(SonnyCalcr) 4192ce8a05 Merge pull request #484 from fanlusky/fix/caret-state-below-candidate
fix(server): 状态提示窗层级置于候选框之下,避免打字时重叠闪烁
2026-09-27 09:56:19 +08:00
fanlusky 7e4ffc2dcf fix(server): 状态提示窗层级置于候选框之下,避免打字时重叠闪烁
状态提示窗每次显示和跟随光标移动都用 HWND_TOPMOST 把自己提到置顶带最上层,打字时光标持续移动,会反复盖过候选框,两窗重叠处出现闪烁。改为插在候选框宿主窗口正下方;仅在两者处于同一 z-band 时这样做,否则保持原来的 HWND_TOPMOST / HWND_TOP。
2026-09-27 09:52:30 +08:00
Lu Fan(SonnyCalcr) 49748ea9bc Merge pull request #483 from fanlusky/fix/candidate-flicker
fix(server): 减少候选框闪烁与右缘越界
2026-09-27 09:34:03 +08:00
fanlusky 6a172d448d fix(server): D2D 候选宿主窗口不再越过当前显示器工作区
卡片本身已经被夹在工作区内,但宿主窗口还带着阴影内边距和 64px 取整余量,贴近
右缘或下缘时会伸到相邻显示器上。DWM 分别应用窗口移动和交换链呈现,而且先后不
固定,某一帧可能把新卡片配上旧的宿主原点(或反过来),落在卡片外侧的内容就闪
到了旁边的屏幕上。诊断日志显示每次放置时卡片都在屏幕内(右缘 3837 < 3840),
但宿主一直延伸到 3927 左右。

宿主的宽高现在截到工作区的右缘和下缘,不管 DWM 怎么配对,都不会在光标所在显示器
之外画出任何东西。卡片完整保留,只裁掉伸出边缘的那部分阴影。移窗与呈现的先后
排序保留,它只决定哪种中间帧更常见。
2026-09-27 09:13:15 +08:00
fanlusky dcf1b6e2d3 fix(server): D2D 候选窗隐藏时清空交换链,避免重新显示时闪出上一张卡片
Hide() 只把宿主窗口 cloak 起来,交换链里还留着最后一帧。下次显示时先呈现、再
取消 cloak,但 DWM 可能在拿到新帧之前就先合成了已取消 cloak 的窗口,于是有一帧
在新位置画出了上一张卡片。上一张卡片较宽时,新的窄卡片贴屏幕右缘,位置更靠右,
旧画面就会越过边缘落到右侧扩展屏上。删光输入后重新打字、或上屏后开始下一次输入
时最容易出现。

隐藏前先呈现一帧透明画面,交换链里不再留下旧卡片。同时在 candidate-d2d place
诊断日志里补上最终宿主位置、先移动到的位置、卡片像素矩形和显示器工作区。
2026-09-27 09:06:49 +08:00
fanlusky 3a7beb18ab fix(server): 同一次输入内候选卡片只增不减
译文、云/AI 候选、混输英文等内容是陆续到达的,每一批都让卡片在两帧之间改变
宽高。每一帧本身画得完整,但尺寸来回变化看起来就是闪烁。

同一次组合内卡片只增大;自然尺寸低于保留尺寸的 70% 时(页面确实变小了)才跟着
收回,候选窗隐藏后重新开始。D2D 给 card 设置 MinWidth/MinHeight 后重新排版;
WebView2 在更新内容的同一个 JS 任务里给 #realContainer 和 #measureContainer
设置最小宽高,绘制前就是最终尺寸,原生区域测量的也是同一个盒子。两端的收回比例
常量互相注明了对应关系。
2026-09-27 09:00:47 +08:00
fanlusky 444b015a02 fix(server): 候选译文改为跨页缓存,换页时不再先丢后补
译文原先只是当前页的查询结果:每次按键换页、页面为空(英文模式两次按键之间)
或一次输入结束都会清空。新页第一帧因此不带任何译文,行宽先缩回去,查询返回后
再撑开,候选框在两帧之间来回改变大小。

现在 g_candidate_translation_glosses 按 TranslationIdentity 缓存,跨页、跨组合
保留,新页第一帧直接带上已知译文。上限 2048 条;关闭译文或翻译服务商开关变化
时清空;权威查询确认没有译文的词会从缓存中剔除。
2026-09-27 09:00:47 +08:00
fanlusky 5fc9485abf fix(server): D2D 候选窗按移动方向决定移窗与呈现的先后
DWM 分别合成窗口移动和交换链呈现,窗口可见时总有一帧只完成了其中一步。原先
总是先移窗后呈现:卡片在屏幕右缘变窄时要向右挪,上一帧更宽的画面会先出现在新
位置,越过屏幕边缘落到右侧扩展屏上,下一帧再弹回来。

现在按轴分别处理:向左或向上移动的轴先移窗再呈现,向右或向下移动的轴先呈现再
移窗,这样中间帧不会超出新旧两张卡片覆盖的范围。DPI override 提前到调整窗口
尺寸之前,因为 WM_SIZE 里已经会呈现一次。
2026-09-27 09:00:35 +08:00
fanlusky 7802777d06 fix(server): 英文模式查询返回前不再绘制空候选页
专用英文模式在词典查询返回前会发布一个空页。原先照常请求显示,卡片先缩成只剩
预编辑行,查询结果回来后再撑开,每次按键都会闪一下,D2D 与 WebView2 都受影响。

英文 worker 对非空输入一定会回应(无匹配时回退为原样输入),回应本身会请求显示,
因此查询进行中、页面为空时跳过这次显示请求。选词仍按已绘制的页面代次等待,
不会上屏未显示的内容。
2026-09-27 09:00:19 +08:00
Lu Fan(SonnyCalcr) c894eb1062 Merge pull request #482 from fanlusky/fix/sentence-badge-source
fix(engine,server): 整句来源标签只挂在整句联想候选上
2026-09-27 08:28:20 +08:00
fanlusky 57dd0fc2f3 fix(engine,server): 整句来源标签只挂在整句联想候选上
候选窗按 CandidateSource 挂〔Trigram〕/〔Unigram〕,但 Generated/Fallback 同时被
原样上屏兜底、英文模式原文、日期、Unicode、假名、译文义项等合成候选借用,导致
输入 E 等特殊模式前缀时原样候选被误标为〔Unigram〕。

WordItem 新增 sentence_association 标记,只由 Google 解码器整句(全拼、双拼)与
kenlm 词格整句置位;Server 挂标签时同时要求来源与标记。source 本身不变,落库与
学习策略不受影响。
2026-09-27 08:25:51 +08:00
Lu Fan(SonnyCalcr) 390c941b32 Merge pull request #481 from fanlusky/fix/selection-timeout-replay
fix(windows,server): 选词回复超时不再上屏未显示的候选
2026-09-27 00:51:52 +08:00
fanlusky d852a05687 fix(windows,server): 选词回复超时不再上屏未显示的候选
电池模式下数字选词常上屏与所见不同的候选。链路是:TSF 只等 50ms
回复;Server 在回复前同步写调频,渲染同步 30ms 到点后按未绘制的页面
选词;超时后 TSF 断管重放按键,Server 又调一次频。

- server:选词调频(拼音/五笔/英文)改为 worker 队列任务,在回复之后、
  下一键之前执行,不再占用回复时间。
- server:渲染同步改为条件变量,绘制回显即唤醒;上限 30ms 提到 80ms。
- windows:上屏类回复等待 300ms;请求已送达仍超时时视为投递不确定,
  只重建前缀并丢弃上屏键,不再无条件重放。
- server:同一选择 3s 内在新连接上再次到达时跳过调频,避免重放重复计数。
2026-09-27 00:47:36 +08:00
Lu Fan(SonnyCalcr) da0a065377 Merge pull request #480 from fanlusky/feat/translation-color-ftb-iconfont
feat(server,ui,ui-html): 翻译文本单独配色、WebView2 工具栏改用图标字体
2026-09-26 23:49:16 +08:00
fanlusky 573169105f fix(ui): D2D 预编辑光标不再贴住首项高亮
光标原先取整行高度并下移 8%,底部越过预编辑行、碰到候选列表首项的
高亮背景。改为与 CSS 相同的几何:高 1.2em,底边在基线下 0.12em。
2026-09-26 23:38:37 +08:00
fanlusky cb75ac8383 feat(ui-html): WebView2 悬浮工具栏改用与 D2D 相同的图标字体
工具栏按钮由 SVG 改为 Segoe Fluent Icons / Segoe MDL2 Assets 码位,与
D2D 工具栏逐一对应;两者都缺某个字形时换成与 D2D 相同的回退文字
(issue #232)。图标颜色因此跟随各皮肤的 .icon color,石墨皮肤的
图标色此前被 SVG 写死的描边覆盖,现在生效。设置页的工具栏与皮肤
预览同步改用图标字体和相同的回退。
2026-09-26 23:38:37 +08:00
fanlusky 7d66b2556c feat(server,ui,ui-html): 候选翻译文本支持在皮肤中单独配色
外部皮肤 skin.toml 的 [candidate.dark] / [candidate.light] 新增 translation 键。
不写时沿用候选文字色叠 62% 不透明度;写了就按原值绘制(含选中行)。
D2D(CandidateList::Appearance::translationColor)、WebView2 注入 CSS
和设置页外部皮肤预览三处一致;预览顺带补上此前漏掉的 number 配色。
2026-09-26 23:38:37 +08:00
Lu Fan(SonnyCalcr) 89bee3a49e Merge pull request #479 from fanlusky/perf/settings-window-startup
perf: 设置窗口冷启动提速到约 0.7 秒,驻留时长可配置并降低驻留内存
2026-09-26 23:01:48 +08:00
fanlusky c539d0cf2a feat(server,ui-html): 设置窗口驻留时长可配置,驻留期间降低内存占用
- 关闭设置窗口后隐藏驻留时,把 WebView2 内存目标设为 LOW 并 TrySuspend 冻结页面;
  重新打开时恢复 NORMAL、Resume 后再显示。本机驻留 60 秒后整棵进程树的工作集
  由约 408 MB 降到约 62 MB,重开仍是瞬间恢复。
- 新增配置项 appearance.settings_window_linger,可选 off / 1m / 5m / 10m / 30m /
  60m / forever,默认 10m。off 表示关闭即退出,forever 表示一直驻留。
- 同步出厂模板、开发配置、ime_config 读写校验和两个设置宿主的快照字段与写入分发;
  设置页“外观 → 界面渲染”新增“设置窗口后台驻留”下拉框。
- 新增测试覆盖模板默认值、缺键、非法值、setter 拒绝和逐值往返。
2026-09-26 22:57:18 +08:00
fanlusky 14815e2f43 perf(server,ui-html): 设置窗口冷启动从约 2.6 秒缩短到约 0.7 秒
- 设置页虚拟主机名改为 imesettings.example / candidate-skins.example:
  不带点的单标签主机名会先走一轮网络名称解析,导航后要空等约 2 秒才开始加载。
- 写 WebView2 用户数据目录和配置目录的 ACL 前先检查:已有 Users 完全控制(可继承)
  和 Medium 标签时跳过 SetNamedSecurityInfoW,避免每次启动都把 ACE 传播到整棵缓存树
  (本机约 120 ms 降到 1.5 ms)。
- 先显示窗口和 splash,再准备 WebView2。
- 显示前最多等 150 ms 取得配置里的主题,浅色主题不再先闪一下深色。
- 新增 METASEQUOIA_IME_SETTINGS_TRACE=1 冷启动打点,写入
  %TEMP%\metasequoia-settings-startup.log。
2026-09-26 22:57:18 +08:00
Lu Fan(SonnyCalcr) 47ffe02330 Merge pull request #478 from fanlusky/feat/autumn-osmanthus-skin
feat: 新增内置皮肤秋桂,杨柳青与 D2D 工具栏对齐 WebView2
2026-09-26 21:58:03 +08:00
fanlusky 030f2d4db8 feat(server): D2D 悬浮工具栏跟随候选窗皮肤配色
此前 D2D 工具栏只按明暗切换默认配色,不看皮肤。新增 floating_toolbar_skin,
按 ui-html/webview2/ftb/<skin>(_light).html 给出背景、边框、图标、悬停、分隔线、
拖动条颜色与圆角;外部皮肤沿用其 base 皮肤,因为 toolbar.css 只作用于 WebView2。
2026-09-26 21:49:04 +08:00
fanlusky 8278c065c9 feat(server,ui-html): 新增内置皮肤秋桂,杨柳青 D2D 高亮对齐 WebView2
秋桂 Autumn osmanthus(autumn_osmanthus):暗色底 #7D929F、高亮 #F97D0A,
亮色底 #D6ECF0、高亮 #FFE399。高亮内缩于外框,首项顶部两角与尾项底部两角
和外框同为 10px;预编辑行隐藏时首项才贴顶。WebView2 候选窗与工具栏、D2D
候选窗、设置页卡片与预览一并提供。

ApplyCandidateFrame 只隐藏多余的候选行,:last-child 找不到最后一个可见行,
因此为其加上 .last-visible,杨柳青的 CSS 同步改用它,候选不满一页时尾项的
补边与贴边高亮才会生效。

杨柳青在 D2D 下改为直角、左右贴边的整行高亮,只在外框四角处用 9px 贴合,
行距、行内边距与预编辑行边距按 CSS 对齐。
2026-09-26 21:49:04 +08:00
fanlusky 0b4d9172f8 feat(ui): CandidateList 让贴着列表四角的项使用外框圆角
Appearance 新增 outerCornerRadius 与 outerTopCornersEnabled:选中或悬停的
填充里,真正落在列表四角上的角改用外框半径,其余角保持 cornerRadius。
既支持内缩高亮与外框同 R,也支持整行铺满、只在外框四角处贴合的皮肤。
2026-09-26 21:49:04 +08:00
Lu Fan(SonnyCalcr) 4375d80414 feat: 支持导入自定义辅助码,内置“加加”更名为“拼音加加” (#477)
* feat(engine): 支持 helpcodes/custom 下的自定义辅助码

custom 目录里的每个 .txt 都是一套方案,方案名为 custom/<文件名>。
文件开头的 "# name:" / "# name_en:" 注释给出中英文显示名,缺省用文件名;
兼容 BOM、CRLF 和全角冒号。方案名不能跳出 custom 目录。

* feat(engine): WebView 契约新增 openHelpcodeDirectory

设置页请求打开自定义辅助码目录,仅允许 settings 页发送。同步 ui-html/webview2/shared。

* feat(server): 设置页列出自定义辅助码并可打开其目录

配置快照带上 helpcode.custom_schemas 与 helpcode.custom_directory,每次都会重新扫描;
方案文件被删除或改名后回退到 lantian。两个设置宿主都会处理 openHelpcodeDirectory。

* feat(ui-html): 辅助码设置显示拼音加加与自定义方案

内置方案“加加”改名为“拼音加加”。自定义方案追加在内置方案之后;新增说明区,
提供“打开目录”和“刷新方案”两个按钮,刷新完成后弹出提示。

* feat(installer): 升级与迁移数据目录时保留自定义辅助码

升级清理时只清掉 helpcodes 里的内置表,保留 custom 子目录;更换数据目录时一并迁移;
安装时建出 helpcodes\custom。
2026-09-26 20:21:55 +08:00
Lu Fan(SonnyCalcr) 8b72f0d8da Merge pull request #476 from fanlusky/feat/caret-state-focus-announcement
feat(windows): 焦点切换到另一个输入框时提示当前中英文状态
2026-09-26 18:02:31 +08:00
fanlusky 625310a314 feat(ui-html): 光标状态提示卡片改为分组标题
“光标状态提示”改为整个卡片的分组标题,不再自带开关;原来的开关改名为
“切换输入法状态时提示”,与“切换输入框时提示”“提示位置”并列在标题
之下,标题下用分隔线区分层级。开关 id 与配置项不变。

各行沿用 section-title 的字号与颜色,字重介于常规与分组标题之间。中文
回退到的微软雅黑只有 Light / Regular / Bold 三档,400–500 都落在
Regular、550 以上都落在 Bold,因此在 Regular 上加 0.25px 描边模拟中等
字重(设置页只运行在 WebView2 上)。
2026-09-26 17:37:13 +08:00
fanlusky b3b3b3303c feat(windows): 焦点切换到另一个输入框时提示当前中英文状态
新增开关 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 开启时为“英”);
  配置项同步写入两份模板和两个设置窗口宿主的读写映射
- 设置页在光标状态提示卡片中增加“切换输入框时提示”开关
2026-09-26 17:09:34 +08:00
MSIME(MetaSequoia IME) daf346f1a2 Merge pull request #475 from fanlusky/feat/caret-state-bottom-positions
feat(server): 光标状态提示补全左下方、正下方、右下方
2026-09-26 16:25:04 +08:00
fanlusky d99aaa0d7d feat(server): 光标状态提示补全左下方、正下方、右下方
提示位置原先只有左上方、正上方、右上方和“下方”四种,且“下方”在设置页
预览里居中显示,Server 却把它放在光标左侧。

- 新增 bottom-left(左下方)与 bottom-right(右下方)
- bottom 保留原配置值、改名为“正下方”,并改为与 top 对称地居中,
  使运行时位置与预览一致;已选“下方”的用户升级后不会被重置
- 合法位置与“是否在光标下方”的判断集中到 caret_state_indicator_policy.h,
  配置读取、写入与定位共用一份定义
- 同步两份配置模板的注释、设置页下拉项、aria 文案与预览样式,并补充测试
2026-09-26 16:00:59 +08:00
fanlusky 2ca7414e5c fix(windows): lcompile-release 以 generate.stamp 判断是否需要重新配置
配置失败(例如 vcpkg 安装出错)时 CMakeCache.txt 依然会留下,导致之后
直接跳过 configure、在残缺的构建目录上编译。改为检查只有项目生成成功才
会写入的 CMakeFiles/generate.stamp。
2026-09-26 16:00:59 +08:00
Lu Fan(SonnyCalcr) b4d60c7872 Merge pull request #448 from AaGMix/feat/issue-229-ime-status-indicator
feat: 添加光标输入状态提示
2026-09-26 15:07:04 +08:00
fanlusky 8b6bdb4acd fix(ui-html): 配置同步测试等待懒加载模块完成再恢复全局
configSnapshot 处理器通过 fire-and-forget 的动态 import 把各段配置交给
skin、appearance 等模块。测试同步结束后 afterEach 立即撤销 document
桩,CI 上较慢的 import 随后回调,抛出 document is not defined 的未处理
拒绝。现在为这些模块提供无副作用的桩,并在恢复全局前等待动态 import
全部完成。
2026-09-26 14:07:52 +08:00
fanlusky 59973a9c14 fix(ui-html): 修正下拉菜单键盘焦点与确认键目标
从按钮进入菜单时向下键聚焦第一项、向上键聚焦最后一项;
Enter/空格只作用于菜单内的可用项。
2026-09-26 13:58:22 +08:00
fanlusky 597d087580 fix(server): 光标状态提示仅由用户快捷键触发并收紧协议边界
- DLL 只在 Shift/Ctrl 切换、Shift+Space、Ctrl+.、Caps Lock 与
  Ctrl+Shift+F 处显式请求提示;Server 下发的模式同步、宿主转换模式
  同步和激活初始化不再弹出提示,移除 compartment 回调里的推断逻辑
- 恢复文档切换时候选窗的 OnKillThreadFocus,改用 COM 身份比较
- 能力位改名为 CaretStateIndicator,DLL 仅在 Server 确认后发送切换
  事件;Server 端这些事件只驱动提示,不再改写工具栏或状态快照
- 标点提示的中英模式由 DLL 随 PuncSwitch 携带
- UILess 宿主不显示提示,会话转为 UILess 时隐藏已显示的提示
- Ctrl+Shift+F 的锚点就地读取,不再覆盖 Global::Point,且只采信
  协商了该能力的客户端
- 撤回对所有包默认 point 的修改;提示窗口创建失败不再阻断 Server
  启动;提示内容改为结构化 CaretStateBadge
- Caps Lock 在同一按键重复进入 TestKeyDown 时只处理一次
2026-09-26 13:58:22 +08:00
fanlusky dc7cfa0354 Merge branch 'develop' into feat/issue-229-ime-status-indicator 2026-09-26 13:58:03 +08:00
Lu Fan(SonnyCalcr) 39d992c376 Merge pull request #473 from fanlusky/chore/prepare-package-inputs
chore(installer): 新增 prepare-package-inputs.ps1 一键准备模型与词库
2026-09-26 01:23:59 +08:00
fanlusky 52af935d41 chore(installer): 新增 prepare-package-inputs.ps1 一键准备模型与词库
本地打完整测试包需要神经整句模型、sc.lm 和词库。该脚本依次调用 fetch-neural-model.ps1、build-language-model.ps1,并按 product-lock.json 从公开 release 直接下载词库、用 product_lock.py verify-dictionaries 校验,免去本机登录 gh。各步骤均幂等。
2026-09-26 01:12:11 +08:00
Lu Fan(SonnyCalcr) 436c71b80b Merge pull request #467 from metasequoiaime/feat/backspace-restore-selected-word
feat(server,windows): 造词中的退格优先撤销最近一次选词
2026-09-26 00:01:43 +08:00
Jia Sui 6506a7a07f fix(server): 退格删空 raw 不再吞掉已选词
输入 nihaoya、选「你好」、再敲一个字符后连按退格,删掉最后一个 raw 字符
的那一次会把造词态连同已选词一起清掉(尾部「raw 空即清」规则),用户看到
「你好」被直接删掉。这条规则的前提是「客户端会随空 raw 取消组合」,但协商
过 CompositionRestored 的客户端会应用帧、把组合留在「只有已选词」的状态
(与 R3 段删除一致),此时清态反而丢字。

- 新增 ShouldKeepCreatingWordAfterRawEmptied:仅协商过组合恢复、非 UILess
  且有快照时保留造词态与快照;普通退格与 Ctrl+Backspace 段删除共用该谓词。
- 普通退格删空 raw 时置 keep:帧里 word 非空,DLL 走
  _ApplyCreatingWordPayload 的「只有已选词」分支继续组合,不再 _HandleCancel;
  下一次退格由「raw 为空时退格只能是撤销」把最近一次选词撤回,而不是丢整句。
- 未协商与 UILess 客户端维持原行为(本地取消 + 清态),避免两侧状态分叉。
- 测试补 deleting_the_last_raw_character_keeps_the_created_word。
2026-09-25 15:59:05 +08:00