wio:窗口化输入/输出
摘要
wio 是一个 Zig 平台抽象库,负责处理窗口管理、事件、剪贴板、音频以及图形上下文创建(OpenGL、Vulkan),支持 Windows、macOS、Linux、Android 和 WebAssembly。
查看缓存全文
缓存时间: 2026/06/15 21:02
ypsvlq/wio
来源:https://github.com/ypsvlq/wio
wio
wio 是一个平台抽象库,提供以下功能:
- 窗口管理与事件
- 剪贴板访问
- 警告对话框
- 摇杆输入
- 音频
- 软件帧缓冲
- OpenGL 上下文创建
- Vulkan WSI
最小示例
``zig const std = @import(“std”); const wio = @import(“wio”);
pub fn main(init: std.process.Init) !void { try wio.init(init.gpa, init.io, wio.EventQueue.eventFn, .{}); defer wio.deinit();
var events: wio.EventQueue = .empty;
defer events.deinit();
var window = try wio.Window.create(.{ .event_fn_data = &events });
defer window.destroy();
var framebuffer = try window.createFramebuffer(.{ .width = 1, .height = 1 });
defer framebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close => return,
.draw => window.presentFramebuffer(&framebuffer),
else => {},
}
}
}
} ``
快速开始
wio 支持最新的 Zig 发布版本,但会尽可能保持与 Zig master 版本的兼容性。
可在 src/wio.zig 中浏览公共 API。
demo 目录包含一个测试程序,覆盖了大部分功能,并使用 OpenGL。
examples 目录包含使用其他渲染 API 的小型程序。
默认情况下,仅提供 API 的子集。以下构建选项可启用更多功能:
enable_dropenable_framebufferenable_openglenable_vulkanenable_audioenable_joystick
平台支持
主动测试:
- Windows
- macOS(10.13+)
- Linux
- Android
- WebAssembly
未主动测试,但大部分代码与 Linux 共享:
- OpenBSD
- NetBSD
- FreeBSD
- DragonFlyBSD
- illumos
未主动测试:
- Haiku
API 支持
摇杆 API 目前未在 Android、OpenBSD、NetBSD、FreeBSD、DragonFlyBSD 或 illumos 上实现。
音频 API 目前未在 Android、WebAssembly、NetBSD、FreeBSD、DragonFlyBSD 或 illumos 上实现。
平台说明
Windows
wio 默认嵌入了一个应用程序清单。要使用自定义清单,请将 win32_manifest 构建选项设置为 false。
如果启用了拖放或音频支持,wio 会调用 OleInitialize。
macOS
在 demo/wio.app 中提供了一个应用程序包,可通过修改 Info.plist 中的 CFBundleExecutable 和 CFBundleName 值进行适配。
Unix
messageBox 通过调用 kdialog 或 zenity 实现。
openUri 通过调用 xdg-open 实现。
类 Unix 系统在同一可执行文件中支持不同的后端。默认情况下所有后端都启用,可以使用 unix_backends 构建选项来限制选择。
当构建使用 wio 的项目时,向 zig build 传递 -fsys=wio 将显式链接库(而不是使用 dlopen)。
为方便打包您的项目,建议在构建脚本中暴露 unix_backends 并记录 -fsys=wio。
X11 后端会加载以下库:
libX11.so.6libXcursor.so.1libGL.so.1(如果启用了 OpenGL)libXext.so.6(如果启用了 Vulkan,作为此问题的临时解决方法)
Wayland 后端会加载以下库:
libwayland-client.so.0libxkbcommon.so.0libdecor-0.so.0libwayland-egl.so.1(如果启用了 OpenGL)libEGL.so.1(如果启用了 OpenGL)
Linux 下会加载以下库:
libudev.so.1(如果启用了摇杆)libpulse.so.0(如果启用了音频)
Android
为确保入口点从共享库中导出,根源文件应在顶层包含 comptime { _ = wio; }。
demo/build.zig 是一个支持 Android 的构建脚本示例。
WebAssembly
如果启用了 OpenGL,wio 会从 gl 模块导入 createContext 和 makeContextCurrent。WebGL 1 的绑定在 demo/wasm.js 中提供。
glGetProcAddress 总是返回 null。
特定平台的 API
以下变量和字段可视为特定平台公共 API 的一部分:
Windows
Window.backend.window是 Win32 的HWND
macOS
Window.backend.window是 AppKit 的NSWindow
Unix
wio.backend.active 是一个枚举变量,指定正在使用的后端:
.x11
wio.backend.x11.display是 Xlib 的 displayWindow.backend.x11.window是 Xlib 的 window
.wayland
wio.backend.wayland.display是 Wayland 的wl_displayWindow.backend.wayland.surface是 Wayland 的wl_surface
WebAssembly
Window.backend.id是 JavaScript 窗口数组中的索引
Haiku
Window.backend.window是 InterfaceKit 的BWindow
相似文章
oioi
一款快速、透明的剪贴板管理器,适用于 macOS、Windows 和 Linux。
Gooey:面向 Zig 的 GPU 加速 UI 框架
Gooey 是一个面向 Zig 的 GPU 加速 UI 框架,通过 Metal、Vulkan/Wayland 和 WebGPU/WASM 支持 macOS、Linux 和浏览器。它提供声明式 UI、动画、主题、无障碍和零外部依赖。
Zig 0.16 中的异步 I/O:今日视角
Zig 0.16 推出了新的 std.Io 接口,用于跨平台 I/O。zio 库通过栈式协程和操作系统级异步 API 提供了完整的异步实现,无需每个任务一个线程即可实现高效的并发任务。
@wsl8297: 逛 GitHub 时挖到一个狠角色:niri。它直接绕开传统桌面“窗口一多就被挤变形”的老毛病,把窗口管理方式彻底重做了一遍。 niri 采用可滚动的平铺思路:窗口按列铺在一条“无限延伸”的水平条带上。你开新窗口,不会强行压缩现有窗口;多…
文章介绍了开源项目 niri,这是一款基于 Wayland 的新型桌面合成器,通过可滚动平铺布局避免传统窗口拥挤问题,并支持动态工作区、多显示器独立管理及自定义着色器动画等特性。
WSL 2 正在提升 Windows 文件系统访问速度
WSL 2 迎来一项性能改进:每个 virtio 设备将获得独立的 DMA(SWIOTLB)内存池,从而消除了 virtiofs 路径上的资源竞争,提升 Windows 与 Linux 之间跨系统文件访问的效率。此项更改已于 2026 年 5 月合并,是 WSL 2 持续优化 Windows/Linux 文件 I/O 性能系列改进中的最新进展。