wio:窗口化输入/输出

Lobsters Hottest 工具

摘要

wio 是一个 Zig 平台抽象库,负责处理窗口管理、事件、剪贴板、音频以及图形上下文创建(OpenGL、Vulkan),支持 Windows、macOS、Linux、Android 和 WebAssembly。

<p><a href="https://lobste.rs/s/ldq5mm/wio_windowed_i_o">评论</a></p>
查看原文
查看缓存全文

缓存时间: 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_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_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 中的 CFBundleExecutableCFBundleName 值进行适配。

Unix

messageBox 通过调用 kdialogzenity 实现。

openUri 通过调用 xdg-open 实现。

类 Unix 系统在同一可执行文件中支持不同的后端。默认情况下所有后端都启用,可以使用 unix_backends 构建选项来限制选择。

当构建使用 wio 的项目时,向 zig build 传递 -fsys=wio 将显式链接库(而不是使用 dlopen)。

为方便打包您的项目,建议在构建脚本中暴露 unix_backends 并记录 -fsys=wio

X11 后端会加载以下库:

  • libX11.so.6
  • libXcursor.so.1
  • libGL.so.1(如果启用了 OpenGL)
  • libXext.so.6(如果启用了 Vulkan,作为此问题的临时解决方法)

Wayland 后端会加载以下库:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-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 模块导入 createContextmakeContextCurrent。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 的 display
  • Window.backend.x11.window 是 Xlib 的 window

.wayland

  • wio.backend.wayland.display 是 Wayland 的 wl_display
  • Window.backend.wayland.surface 是 Wayland 的 wl_surface

WebAssembly

  • Window.backend.id 是 JavaScript 窗口数组中的索引

Haiku

  • Window.backend.window 是 InterfaceKit 的 BWindow

相似文章

oioi

Product Hunt

一款快速、透明的剪贴板管理器,适用于 macOS、Windows 和 Linux。

Gooey:面向 Zig 的 GPU 加速 UI 框架

Hacker News Top

Gooey 是一个面向 Zig 的 GPU 加速 UI 框架,通过 Metal、Vulkan/Wayland 和 WebGPU/WASM 支持 macOS、Linux 和浏览器。它提供声明式 UI、动画、主题、无障碍和零外部依赖。

Zig 0.16 中的异步 I/O:今日视角

Lobsters Hottest

Zig 0.16 推出了新的 std.Io 接口,用于跨平台 I/O。zio 库通过栈式协程和操作系统级异步 API 提供了完整的异步实现,无需每个任务一个线程即可实现高效的并发任务。

@wsl8297: 逛 GitHub 时挖到一个狠角色:niri。它直接绕开传统桌面“窗口一多就被挤变形”的老毛病,把窗口管理方式彻底重做了一遍。 niri 采用可滚动的平铺思路:窗口按列铺在一条“无限延伸”的水平条带上。你开新窗口,不会强行压缩现有窗口;多…

X AI KOLs Timeline

文章介绍了开源项目 niri,这是一款基于 Wayland 的新型桌面合成器,通过可滚动平铺布局避免传统窗口拥挤问题,并支持动态工作区、多显示器独立管理及自定义着色器动画等特性。

WSL 2 正在提升 Windows 文件系统访问速度

Hacker News Top

WSL 2 迎来一项性能改进:每个 virtio 设备将获得独立的 DMA(SWIOTLB)内存池,从而消除了 virtiofs 路径上的资源竞争,提升 Windows 与 Linux 之间跨系统文件访问的效率。此项更改已于 2026 年 5 月合并,是 WSL 2 持续优化 Windows/Linux 文件 I/O 性能系列改进中的最新进展。