一把伞南星 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
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)
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)
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
fanlusky
9f5572c525
fix(build): 所有 MSVC 目标显式按 UTF-8 编译源文件
...
#548 修了 ngram,同类问题还有几处:源文件或头文件是无 BOM 的 UTF-8,
目标却没有 /utf-8,在代码页 936 的系统上注释会吞掉换行。
- ui:Controls.h 让 msimeui 与各 demo 单独构建失败,/utf-8 设为 PUBLIC
- server/tests/portable:input_key_policy.h 让 MSVC 构建失败
- engine test_windows_ipc_contract、tests/pipe-probe、windows/tests:C4819
- windows DLL:此前只靠 fmt 的 INTERFACE 选项带来 /utf-8,改为显式设置,
否则 L"“" 等宽字符标点会在去掉 fmt 后静默变成乱码
2026-09-30 15:37:13 +08:00
fanlusky
806a4b1977
feat(ui): 新增 PagerArrows 翻页箭头控件
...
两个用线条绘制的「上一页 / 下一页」小按钮,不依赖字体;支持置灰、悬停与按下态,
按钮贴在槽位右下角,并提供 GlyphWidth 供调用方对齐箭头。
2026-09-30 12:42:14 +08:00
fanlusky
c3bfa69a29
refactor(ui): 按控件拆分 Controls.cpp
...
Controls.cpp 有 4200 行,Image、Button、CheckBox、ProgressBar、Slider、Separator、
Popup 及其宿主、菜单行、ComboBox、ListView、CandidateList、TreeView、TabControl、
Accordion 的实现,连同它们共用的文字测量与绘制工具全挤在一个文件里。沿用
TextBox.cpp 的做法,按控件拆成以控件命名的翻译单元:
- Image.cpp:Image(含只它用到的 WIC 读图尺寸)
- Button.cpp:Button 与 CheckBox(含只 Button 用到的 DrawTextBlock)
- RangeControls.cpp:ProgressBar 与 Slider
- Separator.cpp:Separator
- Popup.cpp:Popup(含 LayoutOverlay)、PopupHost、ContextMenuHost,以及只有
Popup 用到的 DeflateSizeLocal / DeflateRectLocal 和 DrawPopupShadow
- Menu.cpp:MenuFlyoutItem 与 MenuSeparator(含托盘菜单字号常量和
EstimateTrayLabelWidth)
- ComboBox.cpp:ComboBox 与下拉列表 ComboBoxPopupContent
- ListView.cpp:ListView
- CandidateList.cpp:CandidateList 及其文字度量缓存(含 FillRoundedRectCorners
和彩色字体裁剪选项)
- TreeView.cpp、TabControl.cpp、Accordion.cpp:各自的控件
- ControlsInternal.h / ControlsInternal.cpp:多个控件共用的 GetSharedDWriteFactory、
PointInRect、PointInRoundedRect、MeasureText、CreateCachedTextLayout、
FillRoundedRect、DrawLabel 和两个共用圆角常量,只给 src/ 下的实现文件包含
纯搬移,不改行为:函数体、注释和格式都没动。多个文件共用的工具放进
msimeui::controls_detail 命名空间,声明在 ControlsInternal.h、定义只在
ControlsInternal.cpp 里有一份——CreateCachedTextLayout 的函数内静态
formatCache 和 GetSharedDWriteFactory 的静态工厂因此仍是全库唯一的一份,
不会按翻译单元各复制一份。只被一个控件用到的工具和常量仍留在该文件的匿名
命名空间。原来没人用的 MakeInsetRect 和 kCandidateItemGap 原样保留,分别放在
ControlsInternal.cpp 和 CandidateList.cpp 的匿名命名空间里。
using Microsoft::WRL::ComPtr 挪进内部头文件。Controls.cpp 已经没有剩余内容,
删除;ui/CMakeLists.txt 的源文件列表相应更新,Server 通过 add_subdirectory
引入 msimeui,不需要改。
非搬移改动只有两处:CreateCachedTextLayout 和 DrawLabel 的默认实参从定义挪到了
头文件里的声明上,DrawLabel 定义的形参因此由 clang-format 重新折行。
ui/scripts/check-boundary.py 仍然通过,没有新增对产品的依赖。用脚本比对了原文件
与拆分后全部文件的非空、非 #include 行多重集:除上述两个函数签名外,差异只有
新增的声明、命名空间包装、using 指令、#pragma once 和文件头注释。可用
git diff --color-moved 复核。
2026-09-27 17:28:16 +08:00
Evan Hu
b8ac8e0b00
test: cover the layout core with unit tests
...
本仓库此前没有任何测试,CI 只能证明它编译得过。布局系统是这个框架里被所有控件依赖、也最容易在重构中被改坏的部分,而且是纯几何计算,不需要 D2D 设备即可测。
新增 13 个用例,覆盖 Visual 的测量与排列语义(margin 收缩可用尺寸并回填外框、显式尺寸覆盖测量值、min/max 夹取、可用空间封顶、测量缓存的命中与失效、Stretch/Center/Trailing 对齐定位),以及 StackPanel 与 HorizontalStackPanel 的堆叠、间距和 padding 行为。
断言值全部按 src/Layout.cpp 的现有实现推导,用于锁定当前行为,不是按我认为应该如何来写。测试框架沿用 MSIME-Server 的极简写法,但去掉了 fmt 依赖,本仓库不引入任何新依赖。
Grid、WrapPanel 和 ScrollViewer 本次未覆盖,留作后续。
2026-09-05 17:21:10 +09:00
Evan Hu
798ff3c90c
fix(build): compile the handwriting demo as C++20
...
新加的 CI 在 windows-2025 上暴露出 msimeui-handwriting-demo 编译失败:MSVC 14.51 的 STL 对 <experimental/coroutine> 直接 static_assert 报错(STL1011)。
根因是这个 demo 用 C++/WinRT(winrt/Windows.UI.Input.Inking.h)做墨迹识别,而项目全局是 C++17;C++/WinRT 在 C++17 下走 <experimental/coroutine> 回退路径,新版 MSVC STL 已经不再允许。把这一个 target 提到 C++20 即可,库和其余三个 demo 不受影响。
2026-09-05 14:13:40 +09:00
fanlusky
5421c1dd1b
Add SVG icon rendering, toggle switch, and font fallback for MenuFlyoutItem
...
MenuFlyoutItem gains leading SVG icons (ID2D1SvgDocument), an optional
trailing toggle switch, and content-based width measurement so tray-style
menu items match the HTML menu layout. Default UI font is now Noto Sans SC
with Microsoft YaHei fallback via IDWriteFontFallback; CreateTextFormat
gracefully falls back when the primary family is missing.
2026-09-02 16:03:57 +08:00
fanlusky
d16f9f3fea
Add DirectComposition hosting and candidate-list chrome for the IME window
...
Adopt an existing HWND, render through D3D11/DXGI/DirectComposition, and
extend CandidateList with horizontal layout, skin colors, click-to-commit,
and a D2D context menu. Preedit TextBlock draws a caret in a fixed insert
slot so neighboring glyphs reflow instead of using letter-spacing; the
default end caret sits slightly after the last character.
2026-09-02 15:29:14 +08:00
fanlusky
4e8e85afd8
Make handwriting recognize demo
2026-07-20 01:32:31 +08:00
fanlusky
548330b8cf
Make a demo of an on-screen keyboard.
2026-07-15 18:22:50 +08:00
fanlusky
604cf987b1
emoji panel demo step01
2026-07-15 14:49:36 +08:00
fanlusky
4f62123699
Support image render
2026-07-15 14:39:55 +08:00
fanlusky
d6fde30b88
Add theme system and optimize dirty layout routing
2026-06-14 19:29:15 +08:00
fanlusky
8a77d2ebcb
Add app icon
2026-06-12 23:01:32 +08:00
fanlusky
f183070834
Add some basic controls
2026-06-12 22:42:35 +08:00
fanlusky
88f36a0ed9
Fix the issue with DPI conversion.
2026-06-12 15:03:39 +08:00
fanlusky
f58839114c
Build the basic framework of the project.
2026-06-12 10:03:15 +08:00