時崎 ギャラクシー
623d55b518
Merge pull request #1103 from Tokisaki-Galaxy/ci/dev-build-publish
...
ci: add the dev-build workflow for toolchain-free contributor builds
2026-10-20 23:08:48 +08:00
一把伞南星 and fanlusky
71960b8301
feat(server,ui): 悬浮工具栏图片模式与装饰图叠加候选词 ( #1046 )
...
* feat(server,ui): 悬浮工具栏图片模式与装饰图叠加候选词
在 #1046 的基础上按最新 develop 重做。
悬浮工具栏 [toolbar] mode = "image":一整张背景图,按钮按
[toolbar.buttons.<按钮>] 的 x_dip / y_dip / width_dip / height_dip 摆放,
可按状态换图([images]),没图时画矢量图标。窗口按背景图的透明区域裁成
异形,透明处点得穿;图上除按钮外都能拖动。v2 皮肤的动图会播放,工具栏
隐藏或淡出后停帧。
候选窗装饰图可用 candidate_overlay_* 叠加一个候选词,太宽时缩字号;
设置页的皮肤预览一并显示。
ui 新增 OverlayPanel(绝对定位)与 ImageMask(按 alpha 生成区域)。
* fix(ui): 动图工具栏的窗口形状取所有帧的并集
窗口区域连画面一起裁,只按首帧裁形状时,动画里伸出首帧轮廓的部分
(抬头、飞出的纸)会被裁掉。改为把所有帧的 alpha 合起来再生成区域。
* fix(server): 工具栏按钮框始终算在异形窗口里
窗口形状只取背景图不透明的部分时,摆在图片透明处的按钮会被一起裁掉、
点不到。形状改为背景图轮廓并上每个按钮的框,按钮可以放在人物旁边的空白处,
不必在背景图里垫底。
* feat(server): 工具栏按钮可单独设内置图标的字号
[toolbar.buttons.<按钮>] 新增 icon_size_dip,内置 Segoe Fluent Icons 图标的
字号不再只能跟着按钮框走:按钮框铺满背景图里的圆底、图标单独调大小。
不写时仍是按钮框短边的 0.82 倍。
* feat(server): 设置页按图片模式预览悬浮工具栏
皮肤页的卡片与悬浮工具栏页的预览原来只会画矩形条。皮肤是图片模式时,
改按工具栏的画法预览:背景图(v2 皮肤的动图会播放)、按皮肤坐标摆放的
按钮、按钮贴图或内置图标(含 icon_size_dip),设置页关掉的按钮不画,
缩放与图标尺寸设置一并生效。
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-20 23:08:01 +08:00
Jia Sui
6189765e13
feat(server): 支持在线更新万象模型
2026-10-20 18:22:01 +08:00
tokisaki galaxy
bb4c48505a
server: accept a semver prerelease suffix in the product version
...
The validation added in #1084 rejected anything but digits and dots, which is
narrower than semver: a prerelease suffix after a hyphen is part of the spec,
and the native about page's ParseVersion already strips such a suffix for the
update check while displaying it verbatim. Allow exactly one hyphen segment of
[0-9A-Za-z.-] after the numeric body, so dev builds can embed
0.7.1-dev.20261019.<hash> and the about page shows the full string.
version.txt itself stays bare MAJOR.MINOR.PATCH and every release passes
unchanged.
lcompile-release.ps1 feeds the same override locally, so its ValidatePattern
loosens in step.
2026-10-19 16:00:20 +08:00
小莫
dd018f7985
fix(server): 修复关于页显示旧版本 ( #1084 )
...
* fix(server): 从产品版本文件显示关于页版本
* fix(server): 使用发布版本更新关于页
2026-10-19 13:27:46 +08:00
Lu Fan(SonnyCalcr)
c0a9d371f0
feat(server,windows,engine): 横排候选时左右方向键移动高亮 ( #1080 )
...
- 快捷键页「翻页方式」新增「左 / 右(横排时移动候选项)」,与「上 / 下」各自独立,默认关闭,
只在候选窗为横排时生效。配置项 general.candidate_horizontal_arrow_navigation 已写入出厂模板。
- 光标在拼音串尾时右键移动高亮(到页末翻页),左键往回移高亮,高亮回到第一个候选后再按才移动光标;
光标在串中间时右键先把光标移回串尾,再按才移动高亮。Ctrl+左/右与 UILess 宿主不变。
- 新增 worker 消息 HorizontalArrowSelectionChanged(39)和按键标记 FanyImePipeFlags::HorizontalArrowSelection:
开关生效时 TSF 把候选态下的左右键交给 Server 决定,移光标时 Server 用 CompositionRestored 回光标,
移高亮时回 MoveSelection*,TSF 不再自己预测光标。旧 DLL 忽略新消息,保持原行为。
Closes #779
Closes #895
2026-10-19 02:11:25 +08:00
Lu Fan(SonnyCalcr)
6e15526e75
perf(server,ui,engine): 降低 Server 常驻内存并加快候选去重 ( #1078 )
...
- ui: 同一线程上的窗口共用一个 D3D11 设备。候选窗、悬浮工具栏、托盘菜单原先各建一个,
每多一个硬件设备约多占 10 MB 私有内存;设备被移除时下一次取用会换新的。
- engine: U 模式拆字表改为单块文本池加 16 字节定长条目,常驻内存从约 12.6 MB 降到约 3.9 MB,
查询结果不变。
- server: 未开启语音输入时,提示音播放器推迟到第一次播放才打开 miniaudio 引擎,
不再常驻 WASAPI 播放设备和音频线程;开启时行为不变。
- engine: append_unique_words 由逐条线性比对改为哈希集合去重,顺序与结果不变。
2026-10-19 00:55:46 +08:00
Lu Fan(SonnyCalcr)
efa0a2679e
fix(server): 悬浮工具栏与托盘菜单去掉重定向位图,避免阴影边距残留旧画面 ( #1073 )
...
两个宿主窗口改用 WS_EX_NOREDIRECTIONBITMAP,与候选窗一致,DComp 视觉是唯一内容。
原先的 layered 窗口底下有一层从未绘制的 GDI 重定向位图,改尺寸后可能带着旧显存内容,
从透明的阴影边距透出来。自动隐藏淡出改由 presenter 用图层不透明度绘制。
Ref #1072
2026-10-19 00:26:50 +08:00
Lu Fan(SonnyCalcr)
75d8c710a9
feat(server,windows,engine): 新增顿号自定义,翻页方式移到快捷键页 ( #1071 )
...
- 设置「输入」页在智能标点上方新增「顿号自定义」:\ 和 / 各一个勾,至少保留一个,
未勾选的键按原样输出。新装默认两个都开;升级用户的配置里没有 / 这一项,
模板合并时补成关,保持原来只有 \ 出顿号。
- 新增 worker 消息 EnumerationCommaKeysChanged(38),载荷见
engine/contracts/enumeration_comma.h;旧 DLL 忽略它,保持只用 \。
- 选候选时按 / 改为按配置上屏「候选 + 、」;未作顿号的 \ 或 / 跟在候选后原样上屏。
小键盘 / 与小键盘 . 一样始终输出原字符。
- 「翻页方式」从「输入」页移到「快捷键」页。
- AtLeastOneChecks 从辅助码页移到公共绑定,两页共用。
2026-10-18 23:49:41 +08:00
Lu Fan(SonnyCalcr)
58a27f3edb
fix(engine,server): 候选末页满页且无法再展开时置灰下一页箭头 ( #1070 )
...
下一页箭头原先在当前页满时一律可点,为首字母候选分批展开留口子;
但只有单个首字母且首字母候选恰好截在 24 条时才能展开,其余情况
末页满页的右箭头点了没反应也不会变灰。
引擎新增只判断不查库的 can_expand_initial_candidates,与实际展开
共用前置条件;Server 发布候选页快照时,满页只有在还能展开时才算
有下一页。
Refs #1069
2026-10-18 23:11:22 +08:00
Lu Fan(SonnyCalcr)
5de73de7a6
feat(engine,server,windows): 双拼末尾辅助码支持间接触发,句中辅助码单独成区 ( #1068 )
...
双拼辅助码新增「直接辅助码」开关(默认开,行为不变)。关掉后末尾辅助码改由引导键触发:
反引号、分号、大写字母可多选,触发键后接一到两个辅码(如 ulpb;xy、ulpbXy),一码重排、
两码筛选,只在输入末尾生效。触发键在 TSF 缓冲与 Server raw 里统一记成 |,与句中辅助码的
反引号段区分。
两组触发键互斥:一边勾上某个键会取消另一边的同一个键;手改配置两边都勾时归句中辅助码。
新增 Worker 消息 EndHelpcodeTriggersChanged(37),旧 DLL 忽略。
设置页把句中辅助码单独成区(仅双拼),其中间接(引导键)与直接(万象式)两种方式互斥。
新配置项同时写进出厂模板与开发配置。
2026-10-18 22:54:17 +08:00
Lu Fan(SonnyCalcr)
20ec94bba0
feat(server): AI 辅助页改名「AI 与云联想」并收纳云联想开关,模型下拉与输入框等宽 ( #1062 )
...
- 侧栏与页面标题改为「AI 与云联想」,引用该页名的提示同步更新
- 云候选开关从「输入」页移到「启用 AI 联想」下方,标题改为「启用云联想」,配置键不变
- 查询模型弹出的模型列表不再按视口宽度测量,宽度与模型选择框一致
2026-10-18 21:06:35 +08:00
Lu Fan(SonnyCalcr)
e701cebbe4
feat(server,ui,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤 ( #1061 )
...
* feat(ui): CandidateList 支持等宽网格列与关闭选中态
- Appearance::gridColumns:横排时按可用宽度均分成等宽列(列数不超过 gridColumns,每列不窄于
minItemWidth),放不下一列的项占多列。
- Appearance::selectable:为 false 时不画任何选中态,首项也能正常显示悬停与按下效果。
* feat(server,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤
内置皮肤数据化:
- skins/default/<id>/skin.toml 从只放开关改为完整的出厂清单(配色、圆角、版式、工具栏、名称与说明),
并新增 canvas 基底的清单。候选窗、悬浮工具栏、光标状态徽标不再在代码里写死任何内置皮肤的参数。
- 出厂清单在构建时编进程序;数据目录里的清单写了的键覆盖出厂值,缺失或写错时退回出厂外观。
安装包改为每次整份覆盖 skins\default。
- 皮肤清单新增版式键(padding、item_gap、number_inset 等,长度可写 DIP 或 "0.3em"),以及
[candidate_window.horizontal] / [candidate_window.vertical] 分排列覆盖、page_arrow_divider、
toolbar.icon_corner_radius_dip。
- test_candidate_skin_tokens 保留改动前的内置分支作参照,逐个皮肤、主题、排列与字号比对清单解析结果。
共用候选窗场景:
- 候选框的场景搭建与套皮肤抽成 CandidateSkinScene,候选窗与设置页的皮肤预览共用;设置页预览改用
真实的候选窗控件绘制,删除原先移植自网页样式的预览绘制与各皮肤硬编码。
卷轴展开(expand_panel)与微信绿(卷轴):
- 皮肤开关 expand_panel / expand_rows:横排候选行右端的展开按钮,展开后首行与后续候选网格一起滚动,
右侧细滚动条;展开与收起只认按钮,展开时滚轮上下滚动、不翻页。
- 网格点选按绝对下标上屏并在工作线程核对显示文字;滚到底部时自动再展开一批候选。
- 新增内置皮肤 wechat_scroll「微信绿(卷轴)」。
2026-10-18 20:42:06 +08:00
Neptrue_Lin
ce70cbdcf3
Merge pull request #1036 from Ten-Shine/feat/ctrl-num-translation
...
feat(server,windows): 译文快捷键增加 Ctrl+数字
2026-10-18 19:50:09 +08:00
Lu Fan(SonnyCalcr)
6784eb8ff8
feat(server): 外观新增横向候选强制单行开关 ( #1056 )
...
新增 appearance.candidate_window_single_line(默认关闭)。横向排列时开启后,候选窗宽度上限由半屏放开到
当前屏幕宽度,超出屏幕才换行;竖向排列不受影响。出厂模板、开发配置与设置页读写映射同步加入,候选窗
显示中切换时立即按新宽度重排。
Refs #805
2026-10-18 13:24:07 +08:00
Lu Fan(SonnyCalcr)
b9f37daab5
feat(server): 绿叶随包作为官方贴图皮肤,加入浅色面板;工具栏拖动条统一跟随强调色 ( #1055 )
...
- Canvas Demo 改名「绿叶」移到 skins/green_leaf 随安装包分发,设置页列在内置皮肤之后
- border_image 新增可选 light_source,浅色主题换用另一张面板图;绿叶补上浅色面板与配色
- Mica / Acrylic 样例移到 skins/mica、skins/acrylic 随包分发,名字去掉 Demo
- 外部皮肤没写 toolbar handle 时取同主题 accent;Fluent 拖动条改为强调色 #6B69D6,
首道-蓝、搜狗经典·石墨的拖动条改成各自的 accent,清单测试检查两者一致
- 「重启输入法进程」「设置窗口后台驻留」从外观页移到关于页
2026-10-18 13:03:39 +08:00
Lu Fan(SonnyCalcr)
23bfdd4d51
feat(engine,server): 符号混输放开拼音读音,emoji 混输改为整串精确匹配 ( #1050 )
...
- 符号混输不再挡读得成拼音的编码:混输本来就只认整串精确匹配,xi → ξ 也照样混入;单字母编码仍不混。
- 构建器读取 msime-dictionary 新增的 custom/symbols.txt(拼音<TAB>符号),把 dian → · 、、
shuminghao → 《》 〈〉 等标点读音写进 symbol_code,书名号、引号、括号成对给出。
- emoji 混输改用新的 query_mixed_emoji,只认整串精确等于关键词,不再按前缀带出 emoji;双拼下只查
展开后的全拼,并和符号一样只在光标位于末尾时查询。Shift+E 的 emoji 模式仍按前缀查。
- 同步更新设置页说明、出厂与开发配置注释和 README。
2026-10-18 11:23:26 +08:00
Lu Fan(SonnyCalcr)
692bed7d7c
fix(engine): 出厂词库换过时,回放不再用旧量级的调频权重压住新词频 ( #1049 )
...
用户词库日志存的是调频写下的绝对权重。词库升级换了权重量级后(msime-dictionary
把拼音词频对齐万象,「了 le」从 348 万变成 5200 万),安装时的回放仍把旧词库上
调出来的 650 万写回去,打 l 时「了」排到「来」「里」后面。
回放现在用数据目录里 dictionary-manifest.json 记的 msime.db SHA-256 认出厂词库,
并在日志新增的 dictionary_state 表记下回放到哪份。同一份词库照旧原样写回;换了
词库(或日志还没有记录)时,自动调频的行只在高过新出厂权重时写回,否则保留新
权重并把日志改记成新权重。用户手动加的词和删除不变。
设置页改权重改走新的 record_weight_edit,记在新增的 weight_edited 列里,换词库时
照写不让位;之后的自动调频覆盖同一行时清掉这个标记。
2026-10-18 10:40:59 +08:00
Lu Fan(SonnyCalcr)
2c7795ef4e
feat(server): 候选词翻译新增只显示单条释义开关 ( #1048 )
...
* feat(server): 候选词翻译新增只显示单条释义开关
新增 general.candidate_translation_single_sense(默认关闭)。开启后候选窗译文只显示第一条释义,
仅影响显示,Ctrl+Enter 仍按原始译文列出全部释义。出厂模板、开发配置与设置页读写映射同步加入,
切换后立即刷新当前候选页。
* fix(server): 单条释义同时按逗号截取词库同义词
english.db 的中译英释义在同一词性内用 ", " 分隔同义词("v. teach, instruct"),只按分号截断时
仍会显示多个词。译文缓存记录来源,单条释义模式下仅对词库译文在括号外的首个逗号处截断;
在线翻译是整句,逗号属于标点,保持原样。
2026-10-18 08:15:12 +08:00
Lu Fan(SonnyCalcr)
3cd429b19d
feat(server): 加入 S 模式符号输入与符号混输 ( #1047 )
...
符号数据改用 rime-wanxiang 的符号表与 typst/codex 符号名,源数据放在
msime-dictionary 的 sources/symbols/,替换原来的 piliapp 符号表。
- 建库:新增 symbols_db.py,生成表情面板用的 symbol_catalog(中文分类)和
S 模式、符号混输用的 symbol_code;剔除 wanxiang-unrenderable.txt 列出的
Windows 自带字体显示不了的符号,以及与 ① ❶ 看不出区别的 Dingbats 带圈数字
- 新增 scripts/check-symbol-rendering.py,用 Windows 字体生成上面的剔除清单
- Shift+S 进入符号模式,按万象分组码(xl、sx、szq)、数字读音(yi → 一 ① ⑴)
或符号名(alpha、infinity)检索
- 符号混输:整串精确等于编码时混入,首个紧跟首选;读得成拼音的编码只混数字
序号写法;双拼先按方案换算成全拼再查(小鹤 sj → san → ③)
- 表情面板符号页:中文分类,搜索把整词命中的符号列在「最佳匹配」
- 配置:utility.symbol_mode(默认开)、general.symbol_mixed_input(默认关)
Refs #795
2026-10-18 02:08:39 +08:00
Lu Fan(SonnyCalcr)
e9825a521f
feat(server): 优化设置窗口滚动手感并加入启动画面 ( #1045 )
...
* feat(ui): 滚轮平滑滚动贴近浏览器手感
- 每次滚轮的平滑滚动改为 cubic ease-out,接续当前速度,不再有指数逼近的长尾
- 滚动距离跟随系统「一次滚动的行数」,「一次滚动一屏」时按整页滚动
- 合成交换链的帧时间对齐到 DWM 的刷新网格,消除绘制开始时刻抖动带来的位移抖动
* fix(server): 设置页滚动到 Niya Demo 皮肤时不再卡顿
Niya Demo 的 background.png 实际是 1280x720 的 WebP,预览第一次滚入视野时在界面线程同步解码,首次加载 WebP 解码器要 100-200ms。皮肤预览的静态图改为打开页面时就在后台线程解码,界面线程只创建位图。
设置页与词库表格的滚轮步长同时调到 100(与 Chrome 一致),平滑时长 260ms。
* feat(server): 设置窗口加入启动画面与开关
打开设置时先在窗口中央显示齿轮图标(Win11 用 Segoe Fluent Icons U+E713,Win10 回退 Segoe MDL2 Assets),等首个 configSnapshot 填好控件后再淡入主界面,避免输入方案先显示全拼再跳到双拼。齿轮至少停留 200ms,淡出 140ms。
「关于」页新增「启动动画」开关(appearance.settings_launch_animation,默认开启),关闭后只短暂显示纯色背景。新键已写入出厂模板和开发配置,并补了默认值与读写往返测试。
2026-10-18 00:27:50 +08:00
Mista and fanlusky
a0da400ae0
feat(server): 支持 Jev 基础候选接入 ( #1030 )
...
* feat(server): 支持 Jev 本地候选推荐
接入 TypeSafe Choice API,并在 AI 辅助设置中提供独立凭据和模型配置。
从本地候选中选择推荐项,保留候选元数据和前两项位置,丢弃取消或过期结果。
补充离线回归测试与数据发送说明。
* fix(server): 修正 Jev 候选重排与配置默认值
- Promote 只在未固定的词库候选槽位之间重排,不再挪动同文字的快捷短语、
云候选、英文和日期等异步行,也不因列表里有任何固定候选就跳过却仍打标记
- 选择无法应用时清除 Jev 选择,〔Jev〕标记只给词库候选
- 少于两个候选时不发 Jev 请求
- 出厂模板和工作配置里 endpoint_jev / model_jev 留空,跟随代码默认值
- 设置页 Jev 的接口地址固定为官方地址,默认值改用 Jev::kEndpoint / kModel
- 查询模型不再列出未经验证的 jev-latest / jev-preview
- 免费函数 Jev::Fetch 直接委托 Client::Fetch,不重复检查
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-17 21:33:35 +08:00
古明四季 and fanlusky
6347f4903e
fix(server): 设置窗口跟随系统明暗主题变化 ( #1023 )
...
* fix(server): 设置窗口跟随系统明暗主题变化
* fix(server): 系统主题切换时强制同步设置页并合并重复广播
快照只含 theme_* 原始值,跟随系统时切换前后内容相同,ConfigCompletion
会因与上次一致而不推给页面,预览停在旧主题。改为强制推送快照。
一次切换会连发多条 ImmersiveColorSet 广播,在途期间只排一次;
worker 上的异常就地吞掉,不再弹出与用户操作无关的失败提示。
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-17 20:49:48 +08:00
古明四季 and fanlusky
26354ce0f4
fix(server): 选词期间保持候选顺序和高亮位置 ( #1022 )
...
* fix(server): 选词期间保持候选顺序和高亮位置
* fix(server): 收紧选词期间冻结候选顺序的触发与边界
- 鼠标操作改为界面线程记下页面代次、工作线程出队时认领,不再入队:排在悬停之前的异步结果也会被挡住,滚轮翻页任务的合并不再被打断
- 悬停只在指针停到某个候选上才算开始选词;右键按已画出的那一页认定
- 专用英文在候选窗显示前的方向键不算选词,答复照常换上候选并放行被扣下的显示
- 退出译文/日期子页恢复进入前的选词状态,而不是一律标记为已开始
- 选词后的翻页扩展按「词 + 拼音 + 来源」抵掉已显示的候选,没有新增时报告未变化
- 五处异步合并共用 CanMergeAsyncCandidates
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-17 19:27:52 +08:00
Ten-Shine
bf33d44751
refactor(server,windows): 译文快捷键只保留 Ctrl+Enter 与 Ctrl+数字
2026-10-17 18:43:40 +08:00
古明四季 and fanlusky
96b64d20bd
fix(server): 翻译失败后允许下次候选请求重试 ( #1021 )
...
* fix(server): 翻译失败后允许下次候选请求重试
* fix(server): 翻译失败项按次数退避,未发出的批次尾部不记失败
完全去掉失败缓存后,凭据错误、限流和确实没有译文的词会在每次候选刷新时被整批重发,
计费提供方会重复扣费;批次开头持续超时的词还会每次都耗尽预算,让尾部永远发不出去。
- 失败项按词退避:15 秒起步逐次翻倍,封顶 8 分钟,成功即清除
- 牛翻与自定义接口在批次预算耗尽时截短结果数组,共享层据此跳过未发出的尾部
- 退避时长抽成 CloudTranslation::FailureRetryDelay 并补单测
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-17 18:09:44 +08:00
古明四季 and fanlusky
0bad4c1aaa
fix(engine): 修复日语分段选词吞掉后续输入 ( #1020 )
...
* fix(engine): 修复日语分段选词吞掉后续输入
* fix(engine): 日语分段选词后重建混排候选并去掉剩余输入开头的分隔符
固定候选位打开时 candidates() 返回混排列表,分段选词后不重建就还是选词前整串的候选,
下一次选词会选到过期项。ka'ta 选「か」剩下 'ta,开头的分隔符转不出假名,剩余输入一个
候选都没有;现在和拼音路径一样去掉,去掉后为空就按整串上屏处理。
已转换部分的边界改用 segments,与整句候选同一来源。
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-17 17:41:01 +08:00
Ten-Shine
f46646234c
feat(server,windows): 译文快捷键增加 Ctrl/Shift+数字
2026-10-17 17:35:07 +08:00
Lu Fan(SonnyCalcr)
a98acfee24
feat: 候选窗支持系统亚克力与云母背景材质 ( #1033 )
...
皮肤在 candidate_window.backdrop 写 acrylic 或 mica 时,候选卡片圆角范围内垫一层系统材质:
acrylic 模糊后面的窗口,mica 模糊桌面壁纸(Windows 11,更早的系统按 acrylic)。材质按
Fluent 配方叠「模糊背景 → 亮度层 → 色调」,色调取 surface,深浅主题各自用
backdrop_opacity / backdrop_luminosity 调色调与亮度层的不透明度。
msimeui 的 DeviceResources 新增 backdrop composition:经 Windows.UI.Composition 把 D2D
画进 CompositionDrawingSurface,与材质的形状在同一次提交里更新,卡片伸缩时边缘不错位;
交换链 Present 与合成提交分属两条路径,实测会错开。没写 backdrop 的皮肤仍走交换链。
有材质时卡片阴影只画在卡片外,ShadowCache 改按 D2D 设备判断缓存是否可用。
系统关闭透明效果或建不起 Windows.UI.Composition 时退回交换链,surface 按不透明画。
附 acrylic-demo、mica-demo 两个样例皮肤。
2026-10-17 16:02:38 +08:00
Lu Fan(SonnyCalcr)
3c84848d8f
feat(server): 设置页预览 v2 动态皮肤,输入页移到外观页之前 ( #1028 )
...
外观页与皮肤页的候选窗预览补齐 v2:挂件按候选窗同一规则分面板下层与上层绘制,按 outer_insets_dip 给伸出面板的挂件留空间,line_gap_dip 决定预编辑行与候选的间距。v2 皮肤的 APNG/GIF 在预览里播放,v1 保持静态;设置窗口接管的 HWND 不由 msimeui 排换帧,改由窗口按下一次换帧时刻自己排定时器,不在屏幕上时自然停下,系统关闭动画效果时只显示首帧。
侧边栏把输入放在外观之前,并作为默认打开的页面,冷启动不再构建候选窗预览、解码皮肤图片和系统字体列表。
2026-10-17 14:07:15 +08:00
Lu Fan(SonnyCalcr)
9c45526cd2
fix: 缓存的皮肤图片不再一直占着文件 ( #1017 )
...
* fix(ui): 缓存的位图不再占着图片文件
GetBitmapFromFile 直接用 WIC 解码器建 D2D 位图,位图会一直引用解码器,缓存期间文件句柄不放:输入法运行时皮肤图删不掉、覆盖不了。改为先把像素解进内存里的 IWICBitmap 再建 D2D 位图,文件随解码器一起释放。补一条回归用例。
* fix(server): 设置页皮肤预览不再占着皮肤图文件
预览的位图缓存与 msimeui 同样直接用解码器建 D2D 位图,设置窗口开着时皮肤图同样被占用;改为经内存里的 IWICBitmap 中转。
2026-10-17 04:02:21 +08:00
Lu Fan(SonnyCalcr)
cc868151a8
feat: 新增 canvas 基底,D2D 候选窗支持 v2 九宫格、挂件分层与 APNG/GIF 动图 ( #1014 )
...
* feat(ui): 新增 APNG/GIF 动图解码与动画帧时钟
AnimatedImage 按 APNG 规范解析 acTL/fcTL/fdAT 并校验序号、CRC 与帧边界,逐帧重建 PNG 交给 WIC 解码后按 dispose_op/blend_op 合成;GIF 走 WIC 多帧解码。延时规则与浏览器一致,超限或损坏的动画退回静态首帧。
DeviceResources::GetImageFrame 按动画时钟取帧并汇报下一次换帧时刻,动图帧按 64 MB 预算缓存;Scene 与 Window 据此按需重绘,可整体关闭动画。DrawNineSlice 按 CSS border-image 语义区分源切片与目标边宽、支持 fill,并用夹取画刷消除接缝渗色。
* feat(server): 新增 canvas 基础皮肤并要求 v2 皮肤基于它
canvas 是全贴图基底:透明面板、无描边、无圆角、无阴影,外观来自九宫格面板图与挂件。它只能作为外部皮肤的 base,不进内置皮肤列表;v1 皮肤用它直接报错。
schema_version = 2 而 base 不是 canvas 的皮肤按 v1 加载、忽略全部 v2 字段,并在扫描结果里记一条问题。v2 字段补齐校验:图片限 .png/.apng/.gif/.webp,fill 必须是布尔,偏移与 z_index 有范围,挂件最多 32 层。
* feat(server): D2D 候选窗补齐 v2 九宫格、挂件分层与动图
canvas 皮肤在 D2D 候选窗里按 CSS border-image 语义绘制九宫格面板:切片以源图像素计、边宽以 DIP 计、fill = false 不画中心;有面板图时卡片的底色、描边、圆角与阴影让给贴图。content_insets_dip 从面板外缘量起且不小于边框宽度,line_gap_dip 只作用于预编辑行与候选之间。
挂件拆成卡片前后两层:z_index < 1 在面板之下,其余在面板之上,同层按 z_index 与声明顺序稳定排序;图片在框内等比居中。动图按场景给出的下一次换帧时刻排一次性定时器续帧,只在候选窗显示时运行,隐藏、换皮肤时停;系统关闭动画效果时只显示首帧,v1 皮肤保持静态。
设置页原生预览认得 canvas 基底并绘制面板图。
* feat(examples): 新增基于 canvas 的 v2 全贴图皮肤样例
canvas-demo 用 2 倍九宫格面板、面板下层的叶子挂件和面板上层循环播放的 APNG 星光演示 v2 皮肤,素材均为程序生成的几何图形,随目录以 MIT 授权。样例测试同步校验 schema 2 与 canvas 互为前提、v2 图片扩展名与数值范围。
* docs(examples): 说明 canvas 基底、v2 九宫格与挂件分层及动图规则
schema 说明去掉「仅 WebView2」,写明 v2 必须以 canvas 为 base、canvas 只能当 base;九宫格切片按源图像素、边宽按 DIP,content_insets_dip 不小于边宽,line_gap_dip 只管预编辑行与候选之间;挂件以 z_index 1 为界分在面板上下两层;动图格式、帧时长、上限与系统减少动画时的行为。server/docs/ui-backends.md 与 skins/README.md 同步更新。
* docs(server): 候选窗与皮肤目录的注释不再引用已删除的 WebView2 页面
2026-10-17 02:57:33 +08:00
Lu Fan(SonnyCalcr)
1b875267db
refactor: 移除 WebView2,界面只保留 Direct2D ( #1013 )
...
* refactor(engine): 语音独立工具改用原生托盘菜单,移除 WebView2
托盘菜单改用 Win32 弹出菜单,设置项改为用关联编辑器打开 config.toml,关于页改为消息框。删除 window_webview2 与两份 HTML 资源,windows-app 特性不再依赖 webview2 端口。
* refactor(server): 移除 WebView2,候选窗、工具栏、托盘菜单与设置窗口只保留 Direct2D
删除 src/webview2 与 webview_utils,小窗口的置顶、皮肤重载和工具栏状态缓存移到 window/small_windows,presenter 成为唯一路径,D2D 下的置顶时序与 cloak 行为保持不变。设置进程去掉 WebView2 宿主、鼠标转发与启动图,只构建原生窗口;旧快捷方式传入的 --d2d / --webview2 被忽略。删除 appearance.ui_backend 与 appearance.settings_ui_backend(读取、写入、设置页下拉框与两份配置模板),升级时由模板合并丢弃旧值。设置窗口的图片资源移到 server/assets/settings,安装到数据目录的 assets\settings。不再链接 WebView2Loader,vcpkg 去掉 webview2 端口。
* build(installer): 打包与 CI 不再处理 WebView2 页面和运行时
Prepare-PackageFiles 去掉 -UiHtmlDirectory 与 html 暂存,改为暂存 server/assets/settings;安装器不再检查 WebView2 Runtime、不再创建 ProgramData 下的 WebView2 用户数据目录,升级和卸载时清理旧版留下的 webview2 / webview2-settings 与数据目录里的 html。CI 删除设置页构建、契约同步检查和候选窗 DOM 测试,release 的打包任务不再依赖网页产物;dependabot 去掉 npm。第三方声明去掉 WebView2Loader。
* refactor(ui-html): 删除 WebView2 页面与设置页前端工程
候选窗、工具栏、托盘菜单、设置页、主题和契约副本都已没有使用者;设置窗口用到的图片资源已移到 server/assets/settings。sync-contracts.py 与 pnpm/Vite/TypeScript 工程一并删除,契约仍以 engine/contracts/webview 为唯一来源。
* docs(server): 文档改为只描述 Direct2D 界面
仓库地图去掉 ui-html,组件边界、uiAccess 与置顶时序、设置窗口和配置读写的说明改写为 Direct2D 唯一界面;安装说明去掉 WebView2 Runtime 检查,打包命令去掉 -UiHtmlDirectory;engine/contracts/webview 的说明改为设置窗口是唯一使用者,名字是历史遗留。
* docs(skins): 皮肤说明不再区分 WebView2 与 D2D 渲染器
v2 字段去掉「仅 WebView2」,改为说明由 Direct2D 原生渲染、部分字段仍在补全;颜色必须带 # 改为清单格式约定。随包的 skins/niya-demo/skin.toml 不改,免得用户机器上的同名皮肤在升级时被当成已修改而改名备份。
* docs(ui): demo 说明文字不再提 WebView2
2026-10-17 02:48:02 +08:00
Lu Fan(SonnyCalcr) and li shiyan
c67814caf8
feat(server): 改进中文模式下英文补全词形和首页候选 ( #1010 )
...
* feat(server): expand mixed English completion choices
* fix(server): count fixed English in the first-page English budget
- Fixed-position English never takes the slot, regardless of
first_page_count; fixed English on the first page counts toward the
budget and the page room, and the first-page emoji is placed so that
re-inserting fixed words returns it to the last slot.
- SlottedEnglishIndex returns the first unfixed English, so slot
learning keeps working when the top-ranked English is fixed.
- Drop the protected-prefix lower bound on the completion target: it
pushed the single default completion off the first page.
- Protect cloud/AI (and AI following English) from the extra English
even with a learned slot.
- Keep the legacy five-row prefix query for the default single English
candidate; only first_page_count > 1 uses the mixed distinct-word query.
- Let SetConfiguredEnglishMixedInputFirstPageCount own the range check.
---------
Co-authored-by: li shiyan <150001555+lsy9966303@users.noreply.github.com >
2026-10-16 23:00:06 +08:00
6072ae7784
fix(windows): 修复临时日语 R 模式无法输入长音符 ( #1000 )
...
* fix(windows): 修复临时日语 R 模式无法输入长音符
* fix(server,windows): 临时日语策略每键只算一次,并去掉多余的帧
- Server 在 HandleImeKey 开头按本次按键所属客户端算一次策略,不再每个谓词都查活动客户端、加锁、构造 payload 再解析回来。
- 普通激活只补发 TemporaryJapanesePolicyChanged;整套输入模式状态(含语言栏刷新)仍只在 FocusRestored 时发送。
- 配置重载时输入方案变了由 ApplyConfiguredInputScheme 统一广播,不再重复广播策略。
- TSF 的 WaitForProtocolReady 不再清零策略:worker 管道先于 Main 注册,可能已收到本次连接的策略;断开时已有清零路径。
---------
Co-authored-by: ranly <ran618ly210805@qq.com >
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 22:30:28 +08:00
26e6896c5f
fix(voice): dismissible overlay, silent no-speech handling, reasoning strip + provider registry with mainstream presets ( #996 )
...
* fix(server): keep vendor chat fields off foreign endpoints and strip reasoning from responses
* fix(engine): strip inline reasoning from polished text and assistant responses
* fix(server): never block the voice control loop with modal dialogs
* feat(server): provider registry for AI assistant with mainstream provider presets
* feat(ui-html): settings pages for the provider registry, model fetch everywhere and new ASR providers
* test(server): vendor detection, reasoning strip, provider store and expanded provider defaults
* fix(server): keep the voice overlay dismissible at all times
* fix(server,ui-html,installer): 服务商注册表与语音收尾的评审修正
- 加载配置时先读 ai_providers.json 再校验当前服务商,用户添加的服务商不再被重置为 deepseek
- Token 不再明文写进 ai_providers.json,统一存为 config.toml 的 token_<id>(DPAPI 加密、升级时按凭证保留);旧文件里的明文 token 读取时清掉
- 配置重载同时检查 ai_providers.json 的修改时间,只改注册表也能同步到 Server
- 删除当前服务商时按切换服务商的流程更新 token、地址和模型
- 内置服务商列表收敛到 ProviderStore::BuiltinProviderIds 一处,新增的六个预置服务商同样以 config.toml 为准;去掉未使用的 MakeProviderId,前端生成 id 时避开内置 id
- 出厂模板和开发配置补上六个新预置服务商的 token_/endpoint_/model_ 键
- 录音回调失败时走完整的取消收尾,恢复系统静音并关闭豆包连接;删除不可达的第二段 Esc 处理
- 语音转写地址查询模型时正确推出 /models
- 设置页补上语音识别和润色的 Custom 选项、新预置服务商的显示名,修正添加服务商的地址提示
---------
Co-authored-by: alayahbridge319-boop <246594988+alayahbridge319-boop@users.noreply.github.com >
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 21:46:41 +08:00
小莫 and fanlusky
ab0c14e1bb
fix(server): 兼容社区皮肤的共享基底 ( #1003 )
...
* fix(server): 兼容社区皮肤的共享基底
* fix(server): 共享基底的选中与悬停色跟随清单覆盖后的配色
- selected / hover 按上游 resolve 规则从覆盖后的 accent / text 派生,非十六进制写法退回基底原色
- system 并入共享基底表,校验与适配只用 FindSharedBase 一处判定
- 皮肤样例校验、schema 文档与 niya-demo 注释同步接受共享基底
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 20:56:06 +08:00
HowGeGe and fanlusky
1671c3a467
fix(engine): recognize complete umlaut aliases in quanpin ( #994 )
...
* fix(engine): recognize complete umlaut aliases in quanpin
* refactor(engine): 移除九键输入
九键会话只有引擎公共 Session 门面在用,Server 与 TSF 都没有接入。删掉
NineKeySession、Session 的九键入口与 SessionSnapshot::nine_key_spellings,
以及对应测试和注释。
* fix(engine,server): ü 别名共用一条归一规则,入库与纠错不再产出查不到的键
- 新增 quanpin::is_jqxy_v_alias / canonical_umlaut_spelling,替换 canonical_syllable
与 to_google_spelling 里各自手抄的别名表,normalize_umlaut_aliases 也改用它。
- 纠错表生成器与运行时生成式空间不再从 jqxy+v 别名派生纠错键(nvan -> jvan 之类),
手误只纠到 u 的标准写法;重新生成 autocorrect_table.h。
- 个人词库新写入的拼音词、设置页导入的全拼按词库写法入库(xvan -> xuan、lue -> lve),
否则查询归一后永远查不到;被替换的旧词保留原键,旧行仍可删除。
- 双拼音节集统一排除 jqxy+v 别名,round-trip 检查不再特判。
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 20:48:33 +08:00
Jia Sui and fanlusky
93f95d1245
fix(engine): emoji / 颜文字查询精确命中优先于前缀命中 ( #989 )
...
* fix(engine): emoji 查询精确命中优先于前缀命中 (#988 )
* fix(engine): 颜文字查询同样精确命中优先于前缀命中 (#988 )
* fix(engine): emoji / 颜文字精确提级只认全拼,并合并为单次排序查询
- 双拼下原始码只按目录顺序参与前缀命中,不再精确提级:小鹤 xl 精确命中简拼键时会压过展开后的 xiang。
- 颜文字只有全拼精确命中提级,简拼精确命中不提级:单音节条目的简拼只有一个字母,打 k 时会整批排到前面。
- 两级查询合并为每个查询码一条 SQL(精确行在 LIMIT 之前),语句只 prepare 一次,循环抽到 local_database 的 query_ranked_entries 共用。
- server 回归测试不再断言 ku 多个精确条目之间的目录顺序。
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 20:17:01 +08:00
Lu Fan(SonnyCalcr)
81fa7d10c8
fix(server): 关闭 Direct2D 设置窗口后悬浮工具栏不再消失 ( #1002 )
...
Direct2D 设置窗口是获得键盘焦点的 Win32 窗口,进程里的 TIP 会成为普通输入客户端。
正常退出时 DestroyWindow / CoUninitialize 让 TSF 反激活 TIP,发出终结性反激活,
Server 当成用户切走了输入法而隐藏工具栏;回到的窗口不一定重新激活,工具栏要等
点击别的窗口才回来。WebView2 前端的焦点在 WebView 子进程里,宿主线程从不持有路由,
所以没有这个问题。
Direct2D 前端在写入排空后不再销毁窗口、跳过 CoUninitialize,直接结束进程:
Server 只看到管道断开(仅挂起路由,不动工具栏),与 WebView2 前端一致。
2026-10-16 19:28:02 +08:00
Lu Fan(SonnyCalcr)
ef28cf690d
fix(server,ui,ui-html): 打磨 Direct2D 设置窗口:图标、检查更新、热力图、滚动与冷启动 ( #1001 )
...
* fix(ui): SVG 按整像素栅格化、滚动改为跟手的指数滑动,并可预热 D3D 设备
- GetSvgBitmap 按四舍五入的像素尺寸建位图,避免 D2D 向上取整后被挤压采样
- ScrollViewer 平滑滚动改为按帧时间逼近目标:连续滚轮不再每格从零速重起,
内容按整设备像素排布,滑动中文字不再抖动
- 新增 DeviceResources::PrewarmComposition,在后台线程提前创建 D3D11 设备,
首帧复用,省去约 200ms 的驱动初始化
* fix(server): 修复 Direct2D 设置窗口的图标、检查更新与热力图交互,加快冷启动
- 侧栏等 SVG 图标对齐设备像素绘制,不再发糊
- 关于页「检查更新」:页面持有状态,点击不再无反应;按钮加悬停描边与按下位移;
后台任务结果改为投递消息回窗口,窗口被遮挡时不再因 WM_TIMER 被压制而卡在「正在检查…」
- 弹窗按显式宽度测量内容,换行文字不再与下一行重叠
- 以 --about 打开时侧栏指示条落在「关于」
- 日历热力图可横向滚动(拖动滑块、点击轨道、Shift+滚轮),滚动条与竖向一致:
8px、无箭头、2px 圆角;悬停格子 500ms 后显示日期与字数
- 滚轮每格 60px;暗色主题首帧前不再闪白(按主题色擦底并在首帧前隐藏窗口)
- 启动时预热 D3D 设备,首帧从约 300ms 降到约 140ms
* fix(ui-html): 热力图滚动条与页面竖向滚动条一致,检查更新按钮加悬停与按下反馈
与 Direct2D 设置窗口的同步改动保持一致。
2026-10-16 18:51:21 +08:00
Lu Fan(SonnyCalcr)
53649d9d12
feat(server,ui,ui-html): 新增实验性的 Direct2D 设置窗口 ( #999 )
...
* feat(ui): 动画时钟、渲染剔除与文本框扩展,并优化 msimeui 性能
- 新增 Animation.h:cubic-bezier 缓动、Tween、颜色插值,Window 提供
RequestAnimationFrame / GetFrameTime,动画帧随显示刷新率推进
- Window 可选 DirectComposition 渲染(含不透明模式以支持 ClearType)、
双击按下、捕获丢失时结束按压、悬停刷新、可关闭销毁时退出消息循环
- Scene 把滚轮交给光标下最内层可滚动元素并逐级冒泡
- DeviceResources:裁剪栈驱动的离屏剔除、按帧回收的笔刷缓存、SVG 栅格缓存
- ScrollViewer 可配置外观与平滑滚动;Popup 支持阴影通道与出现动画;
卡片阴影缓存抽成可复用的 ShadowCache
- TextBox 支持 SetText、密码掩码、多行滚动、字重/字间距/行高与外观设置
- 调试日志默认关闭(MSIMEUI_DEBUG_LOG=1 才写文件),不再在每次点击和
TSF GetTextExt 时打开文件
- 字体回退在 CJK/emoji 映射之后保留系统回退,缺字不再显示方框
- 新增动画与剔除单元测试
* feat(server): 新增实验性的 Direct2D 设置窗口
设置窗口可通过 appearance.settings_ui_backend 选择渲染方式:默认 webview2,
d2d 为实验性的 msimeui 原生实现(server/src/settings/native/),1:1 复刻
网页设置页,包括侧栏切换时竖向高亮条的滑动动画。
- 两个前端共用同一套 webview 契约消息与 HandleClientMessage,配置读写
映射仍只在 settings_app.cpp
- 切换渲染方式后设置进程自动以新方式重新打开;--d2d / --webview2 可临时指定
- 新配置项写入出厂模板与开发配置,UiBackendPolicy 与测试同步更新
- METASEQUOIA_IME_SETTINGS_INSTANCE 允许开发版与已安装的设置窗口并存
- 更新 ui-backends 文档与 server/AGENTS.md
* feat(ui-html): 外观页新增设置窗口渲染方式选项
2026-10-16 16:13:13 +08:00
chr331 and fanlusky
1c3bd7cb83
feat(server,ui-html,windows): 支持自定义“输入状态切换”中的快捷键 ( #985 )
...
* fix(windows): 支持标点切换快捷键改绑与取消绑定
* fix(shortcut): 对齐虚拟键并处理语音与窗口快捷键冲突
* fix(ui-html): 绑定标点快捷键前提示应用快捷键占用
* fix(ui-html): 仅对已知快捷键冲突提示确认
* feat(shortcuts): 支持自定义输入状态切换快捷键
* fix: keep shortcut editor buttons on one row
* fix(shortcuts): 限定输入状态快捷键为 Ctrl 组合
* fix: clarify shortcut override and punctuation lock behavior
* perf(server,windows): 提前筛选输入状态快捷键
* fix(windows,server,ui-html): 修正输入状态快捷键的兼容与保存问题
- windows: 未协商 InputStateShortcuts 时回退到旧的 Ctrl+Shift+E KeyEvent,
新 DLL 配旧 Server 时英文候选快捷键不再失效
- windows: 全角快捷键与标点快捷键一样可在待处理按键后排队,不再漏给应用
- windows: Server 不可用时排队的英文候选切换按 FUNCTION_CANCEL 离线回放,
不再丢弃其后的按键
- server: 非字符串配置值不再以 "!invalid" 作为 binding 发给设置页
- server: 仅三个输入状态快捷键路径强制回传配置快照;去掉 worker 中与
reader 重复的协商检查;抽出 InputStateShortcutViews 去除重复转换
- ui-html: 保存后 5 秒未收到快照则恢复编辑器并提示重试
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 03:31:19 +08:00
Jia Sui and fanlusky
9beab473f4
fix(windows,server): 提交键慢响应改为分片让出等待,不再丢字或冻结宿主 ( #982 )
...
* fix(windows,server): 提交键慢响应改为分片让出等待,不再丢字或冻结宿主
* fix(windows): 提交回复轮询不阻塞宿主,补齐标点顶候选路径并保持结算顺序
- 标点顶高亮候选(WM_AsyncPunctuationCommit 无预取文本)也在处理函数里分片取回复,
edit session 不再在宿主 UI 线程上阻塞 300 ms
- 轮询改为不阻塞:先查缓存、PeekNamedPipe,有帧才以零超时读,不再每片阻塞 16 ms
- 定时器只重派已开始等待的请求,按请求 id 升序结算,较新的提交排在仍在等的旧提交之后
- 处理函数取到 TransportUnavailable 时直接按歧义丢键并重置,不再交给 edit session
- 已在等回复的提交键在同一焦点下被组合纪元取代时按 DeliveryAmbiguous 处理,避免两端分叉
- 回复缓存淘汰不再淘汰刚写入的条目;CachePendingReply 与提交回复缓存共用一份逻辑
- 停用时显式 KillTimer(TIMER_COMMIT_REPLY_POLL);windows/AGENTS.md 同步新的提交预算
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 02:48:58 +08:00
HowGeGe and fanlusky
64fdc775f0
fix(settings): preserve mouse capture during WebView drags ( #979 )
...
* fix(settings): preserve mouse capture during WebView drags
* fix(server): 设置窗口鼠标抓取丢失时补发抬起
把鼠标转发的抓取状态机从 settings_app.cpp 拆到 settings_mouse_input,
只做决策不调 Win32,测试直接链接它,不再在 configure 时切源码文本。
- WM_CAPTURECHANGED 时给仍按着的键补发抬起,标题栏拖动、
Alt+Tab、系统弹窗抢走抓取后页面不会卡在按下状态
- 抓取期间吞掉 WM_MOUSELEAVE,最后一个键抬起后再重新登记离开跟踪
- 隐藏或关闭设置窗口前释放抓取
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 01:56:02 +08:00
Jia Sui and fanlusky
d414268b5f
[Feat] U 模式重构为部件拆字反查 ( #973 )
...
* feat(engine,server,windows,ui-html,installer): U 模式重构为部件拆字反查 (#971 )
把 U 模式从 Unicode 十六进制码位输入改成部件拆字反查:Shift+U 后输入各
组成部分的拼音连写(晶 = ririri)即可出字,候选上反显注音。
- 引擎:新增 local_modes/radical_query(前缀匹配、字频降序),数据表
engine/radical/decomposition.txt 与生成脚本;LocalInputMode::Unicode
改为 Radical;删除 unicode_query。
- Server:g_radical_mode_triggered + IsRadicalCompositionActive + 候选分发,
用 cpp-pinyin 反显注音;删除 Unicode 码位路径。
- 前端 TSF:删除 U 模式的十六进制/数字特例与影子预判,按普通组合处理。
- 配置:utility.unicode_mode 改为 utility.radical_mode。
- 部署:assets 登记 radical_decomposition,安装器与 CI 拷表。
数据来源 mirtlecn/rime-radical-pinyin (GPL-3.0),授权见 engine/radical/NOTICE.md。
* feat(server): U 模式反显拼音改为带调风格(jīng)
* fix(server,installer): 修复 U 模式 CI(拆字表打包夹具与 clang-format)
* fix(engine,server): 修正 U 模式按键错位、重复候选与配置迁移
- Server 在 U 模式不再吞掉撇号、分号、斜杠、大写字母等键:TSF 已把它们记进按键缓冲,
吞掉又不重同步会让两侧串和光标错位。照常插入,含非 a-z 的码查不出候选
- 拆字查询全码命中排在仅前缀命中之前,同一个字的几种拆法只出一次
- 升级合并把旧键 utility.unicode_mode 的值带到 utility.radical_mode,读取时也兜底旧键
- 生成脚本只收汉字,重建拆字表去掉 abc 码下的 51 行数字、字母与符号
- 开着 U 模式时在后台预热拆字表与 cpp-pinyin 词典,避开首个按键的冷加载
- Server 按会话的 RuntimePaths 查拆字表,删掉走全局数据目录的便捷重载
- cpp-pinyin 初始化合并到 utils/hanzi_pinyin,设置页导入注音共用;U 模式与快捷短语的收键分支合并
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-16 01:01:18 +08:00
luo jiyin and fanlusky
f62b383851
fix(server): 适配 OpenAI 推理模型请求参数 ( #968 )
...
* fix(server): 适配 OpenAI 推理模型请求参数
OpenAI 请求使用 max_completion_tokens。推理模型省略 temperature,并增加输出上限。
增加请求 JSON 回归测试。DeepSeek 与自定义服务保持原有参数。
Refs #882
* fix(server): 修复 OpenAI 配置测试参数
设置页探测与 AI 联想共用 token 字段选择规则。
增加 OpenAI、DeepSeek、SiliconFlow 和自定义服务的请求 JSON 测试。
Refs #882
* fix(server): 增加 OpenAI 推理模型配置探测额度
设置页为 OpenAI 推理模型预留 32 个输出 token。
其他模型和服务商保持原有探测额度,并补充 JSON 断言。
Refs #882
* refactor(server): 明确配置探测请求函数名称
将 BuildChatRequestBody 改为 BuildChatProbeRequestBody。
更新设置页调用点和请求 JSON 测试。
Refs #882
* fix(server): 适配 AI 翻译的 OpenAI 推理模型参数
* fix(server): OpenAI 推理模型降低推理强度并放宽超时
默认 medium 推理常超过 8 秒,AI 联想与翻译会静默失败。
推理模型显式发送 reasoning_effort: low,超时与 DeepSeek thinking 一致用 30 秒;
设置页探测带上同样的参数。合并三处重复的推理请求判断。
Refs #882
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-15 22:48:04 +08:00
Jia Sui and fanlusky
2f7335be3e
统计增加首词命中率 ( #963 )
...
* feat(engine): webview 契约给统计概览增加首词命中率字段并支持 null 分支
* feat(server,ui-html): 统计新增首词命中率(决策点记录、stats v2 迁移与设置页展示)
* fix(server): 首词命中计数补日语标点排除与并发迁移复查
* fix(ui-html): 统计卡片改用自适应列宽,避免长数字被省略号截断
* fix(server,installer): 修复首词命中率随附测试在 CI 的失败
三条 server 用例是首词命中率改动新加、但从未跑绿:RawDb 在迁移用例里对尚不存在的库开只读写连接,补上 SQLITE_OPEN_CREATE;09-19 写了一次次选,按契约它是一次真实测量(0%),断言却要求 nullopt,改为断言 0.0,并把 nullopt 覆盖移到迁移用例(total==0 的那天)。安装器 preserve-user-data 从 stats_pipe.cpp 取库名,而 EnsureStatsStoreOpen 连同 stats.db 字面量已挪到 stats_candidate_capture.cpp,改到新位置。
* fix(server,ui-html): 首词命中率写库移出按键路径,修正迁移与统计口径
- 选词计数改由后台 SerialTaskRunner 写库,标点收尾与选词路径不再同步等 SQLite 锁
- 迁移以表结构为准,不再被版本号挡住;缺列时在 IMMEDIATE 事务里逐列补齐
- 标点在日期入口上收尾时按实际上屏的首条候选计数
- 五笔四码唯一自动上屏不计入;多段造词任一段非首位即不算命中
- 只有选词计数的日线不算打字日,不影响天数、日均与连续天数
- 卡片复用 formatFirstWordRatio 并展示累计命中率,概览复用 DailyRow::FirstWordRatio
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-15 22:09:50 +08:00
e56bfabdf2
feat(server,ui-html): AI 联想候选徽标支持切换 🤖 / 🐳 ( #948 )
...
* feat(server,ui-html): AI 联想候选徽标支持切换 🤖 / 🐳
AI 联想候选的来源角标此前硬编码为 🤖 ,用户无法更改。按固定排位徽标
(#463)的既有做法把它做成可配置项 appearance.candidate_ai_badge_style,
取值 "robot"(🤖 ,出厂默认)或 "whale"(🐳 )。
- 默认值保持 🤖 不变,升级不改变默认观感
- 与固定排位徽标一致,配置里存枚举名而不是字面 emoji,TOML/日志/diff
里不出现图形字符;新增样式只改白名单与展示层映射
- 非法取值一律回退到出厂 🤖 ,手改 TOML 写错不会让 AI 候选失去来源标识
- 展示层新增纯函数 AiSuggestionBadge(style),沿用既有 badge 字段通道,
D2D 与 WebView2 两个后端同时生效,不新增渲染路径
- 配置改动经既有 ConfigChanged → WM_APPLY_IME_CONFIG 链路即时生效,
无需重启输入法进程
- 出厂模板 config.default.toml 与开发配置 config.toml 同步补齐,
避免升级时用户选择被 MergeConfigIntoTemplate 静默丢弃
验证:
- server/tests/portable(Linux,g++,无 vcpkg):57 test(s), 0 failure(s)
- ui-html settings:vitest 167 passed,tsc --noEmit 通过,vite build 通过
- clang-format 18.1.8 --dry-run --Werror --style=file:改动文件全部通过
- scripts/ci/check-developer-paths.sh 通过;sync-contracts.py --check 通过
* fix(server): 补齐 IsValidCandidateAiBadgeStyle 的跨编译单元声明
ime_config_appearance.cpp 是独立编译单元,无法看到定义在 ime_config.cpp
里的 IsValidCandidateAiBadgeStyle,MSVC 报 C3861。补上 ime_config_internal.h
里的声明——IsValidCandidateFixedBadgeStyle 等同类校验函数都声明在那里。
* refactor(server,ui-html): AI 徽标样式改为单一映射表并精简测试
- AiSuggestionBadgeGlyph 作为样式到字形的唯一映射,配置层白名单
IsValidCandidateAiBadgeStyle 直接查它,新增样式不会两边漂移
- 测试去掉与首条断言重复的一行和恒真的 cloud 断言,改为检查映射表
对已知/未知样式的判定
- 设置页描述写明两种样式对应的 emoji
---------
Co-authored-by: Caiyi Liao <216114941+cxk1993@users.noreply.github.com >
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-15 02:44:27 +08:00
時崎 ギャラクシー and fanlusky
1b512c31d2
fix(server): 外部皮肤只在声明支持的布局与主题下生效 ( #946 )
...
* fix(server): 外部皮肤只在声明支持的布局与主题下生效
皮肤用 supports.layouts / supports.themes 声明适用范围。D2D 后端只 Load 不校验,横排皮肤在竖排也会被套用,退化成一张裸卡片;工具栏与光标徽标同样绕过这份声明。
把判定收成 CandidateSkinCatalog::LoadSupported,两个候选窗后端、工具栏、光标徽标四处共用,避免再出现某个使用方漏查。光标徽标的调色板缓存键补上布局,切换布局后徽标才会跟着回退。
补 LoadSupported 的用例:布局不支持、主题不支持、四种组合都声明、manifest 不可用。
* fix(server): 换布局时同步刷新工具栏,D2D 候选窗回退到 fluent
外部皮肤可能只声明部分布局,换布局后皮肤是否生效会变;工具栏跟随候选窗皮肤,
ApplyConfiguredCandidateWindowLayout 现在也重套 D2D 工具栏主题,WebView2 工具栏页面变了才重新导航。
D2D 候选窗在外部皮肤不生效或读不出来时,几何、配色与阴影都按 fluent 处理,
与 WebView2 端注入 fluent CSS 一致,不再拿外部皮肤 ID 去匹配内置分支。
光标徽标复用已解析的主题;注释改为回退 fluent;测试补上正常皮肤的对照断言,
并清理按进程号建的临时目录。
---------
Co-authored-by: fanlusky <1730976608@qq.com >
2026-10-15 02:29:08 +08:00