Skip to content

v0.2.0-beta.9

Choose a tag to compare

@KingBes KingBes released this 02 Aug 15:47
· 29 commits to main since this release
2d181da

What's Changed

Full Changelog: v0.2.0-beta.8...v0.2.0-beta.9

[0.2.0-beta.9] — 2026-08-02

新增

  • ext/uiext/ui/):基于 sokol C 库的跨平台图形界面扩展(纯 phpc 模式)。9 个 PHP 类 + 9 个枚举,覆盖窗口管理、2D 绘图、控件体系、布局系统和事件处理。
    • 底层依赖:内置 sokol C 库源码(sokol_app/sokol_gfx/sokol_glue/sokol_log/sokol_time),位于 ext/ui/sokol/,零运行时依赖
    • 平台后端:Windows/Linux = OpenGL (SOKOL_GLCORE),macOS = Metal (SOKOL_METAL)。TCC 缺失 windowsx.h,故 Windows 使用 OpenGL 而非 D3D11
    • 核心类App(窗口生命周期 + onInit/onFrame/onEvent 回调)、Window(静态:width/height/dpiScale/setCursor)、Event(fromPtr 解析 sapp_event 指针)、Color(RGBA + toUint 0xAABBGGRR)、Rect(contains 命中测试)、Graphics(静态:clear/fillRect/drawText/drawLine/drawRect/drawCircle)
    • 控件体系Widget 抽象基类(init/draw/setPos/proposeSize/pointInside + 事件方法)、WidgetContainer(addChild/drawAll/hitTestIndex/dispatch*)、Button(press/release/click + onClick)、LabelTextBox(focus/blur/handleKeyDown/handleChar)、CheckBox(toggle/setChecked + onChange)、Slider(beginDrag/drag/endDrag/setValue + 值夹紧)
    • 布局系统Layout 抽象基类(addWidget/updateLayout/asWidget)、Stack(flex 风格,row/column 静态方法,Compact/Stretch/Fixed 尺寸模式)、CanvasLayout(绝对定位)
    • 软键盘桥接SoftInput 静态类(show/hide/isVisible/onInput/dispatch/clear),桌面端 show/hide 为 no-op,移动端未来支持
    • 枚举:EventType(22 值)/ Key(ASCII+VK_*)/ MouseButton / KeyMod / Cursor / Direction / WidgetState / LayoutAlign / ChildSize
    • 绘图契约:所有 Graphics::* 方法必须在 onFrame 回调内调用,否则抛 Exception("drawing outside frame callback")
    • 事件契约:sokol sapp_event* 指针以 t_int 流转(intptr_t 转换),PHP 侧通过 Event::fromPtr($evPtr) 解析
    • 回调安全onInit/onFrame/onEvent/SoftInput::onInput 注册的闭包通过 phpc_env_pin 钉在全局 pin 表,防异步回调 UAF
    • TCC Windows 兼容RegisterRawInputDevices/GetRawInputData 在 user32.def 缺失,提供 stub 满足链接器(仅 mouse_lock 时调用,UI 测试不使用)
    • 测试:test/ui/ui_color_test.php(Color 单元测试)+ test/ui/ui_widget_smoke_test.php(Widget/Layout 冒烟测试)+ 4 个集成测试(ui_basic.php/ui_events.php/ui_widget_render.php/ui_layout_render.php,标记 @skip 需图形环境)