v0.2.0-beta.9
What's Changed
Full Changelog: v0.2.0-beta.8...v0.2.0-beta.9
[0.2.0-beta.9] — 2026-08-02
新增
- ext/ui(
ext/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)、Label、TextBox(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需图形环境)
- 底层依赖:内置 sokol C 库源码(sokol_app/sokol_gfx/sokol_glue/sokol_log/sokol_time),位于