Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

wio

wio is a platform abstraction library, providing:

  • window management and events
  • clipboard access
  • alert dialogs
  • joystick input
  • audio
  • software framebuffer
  • OpenGL context creation
  • Vulkan WSI

Minimal example

conststd=@import("std");
constwio=@import("wio");
pubfnmain(init: std.process.Init) !void {
trywio.init(.{
.allocator=init.gpa,
.io=init.io,
.eventFn=wio.EventQueue.eventFn,
});
deferwio.deinit();
varevents: wio.EventQueue=.empty;
deferevents.deinit();
varwindow=trywio.Window.create(.{ .event_fn_data=&events });
deferwindow.destroy();
varframebuffer=trywindow.createFramebuffer(.{ .width=1, .height=1 });
deferframebuffer.destroy();
framebuffer.setPixel(0, 0, 0xF7A41D);
while (true) {
wio.update();
while (events.pop()) |event| {
switch (event) {
.close=>return,
.draw=>window.presentFramebuffer(&framebuffer),
else=> {},
}
}
}
}

Getting started

wio supports the latest Zig release, but compatibility with Zig master is maintained when possible.

The public API can be browsed in src/wio.zig.

The demo directory contains a test program which covers most functionality and uses OpenGL.

The examples directory contains small programs using other rendering APIs.

By default, only a subset of the API is available. The following build options enable additional features:

  • enable_drop
  • enable_framebuffer
  • enable_opengl
  • enable_vulkan
  • enable_audio
  • enable_joystick

Platform support

Actively tested:

  • Windows
  • macOS (10.13+)
  • Linux
  • Android (API 26+ / Android 8 and up)
  • WebAssembly

Not actively tested, but most code is shared with Linux:

  • OpenBSD
  • NetBSD
  • FreeBSD
  • DragonFlyBSD
  • illumos

Not actively tested:

  • Haiku

API support

The joystick API is not currently implemented for OpenBSD, NetBSD, FreeBSD, DragonFlyBSD, or illumos.

The audio API is not currently implemented for NetBSD, FreeBSD, DragonFlyBSD, or illumos.

Platform notes

Windows

wio embeds an application manifest by default. To use a custom manifest, set the win32_manifest build option to false.

If drag-and-drop or audio support is enabled, wio calls OleInitialize.

macOS

An application bundle is provided in demo/wio.app, which can be adapted by changing the CFBundleExecutable and CFBundleName values in Info.plist.

Unix

messageBox is implemented by spawning kdialog or zenity.

openUri is implemented by spawning xdg-open.

Unix-like systems support different backends in the same executable. By default all backends are enabled, the unix_backends build option can be used to limit the choices.

When building a project that uses wio, passing -fsys=wio to zig build will link libraries explicitly (rather than using dlopen).

To assist with packaging your project, it is recommended to expose unix_backends in your build script and document -fsys=wio.

The following libraries are loaded for the X11 backend:

  • libX11.so.6
  • libXrandr.so.2
  • libXcursor.so.1
  • libGL.so.1 (if OpenGL is enabled)
  • libXext.so.6 (if Vulkan is enabled, as a workaround for this issue)

The following libraries are loaded for the Wayland backend:

  • libwayland-client.so.0
  • libxkbcommon.so.0
  • libdecor-0.so.0
  • libwayland-egl.so.1 (if OpenGL is enabled)
  • libEGL.so.1 (if OpenGL is enabled)

The following libraries are loaded under Linux:

  • libudev.so.1 (if joysticks are enabled)
  • libpulse.so.0 (if audio is enabled)

Android

To ensure the entry point is exported from the shared library, the root source file should contain comptime { _ = wio; } at the top level.

demo/build.zig is an example of a build script supporting Android.

WebAssembly

If OpenGL is enabled, wio imports createContext and makeContextCurrent from the gl module. wio.glGetProcAddress always returns null.

If audio is enabled, memory must be imported and shared.

A basic WebAssembly example is provided in examples/framebuffer, whilst the demo is more advanced and includes audio support.

WebGL 1 bindings are provided in demo/wasm.js.

Platform-specific API

The following variables and fields may be considered part of the public API for a given platform:

Windows

  • Window.backend.window is the Win32 HWND

macOS

  • Window.backend.window is the AppKit NSWindow

Unix

wio.backend.active is an enum variable specifying the backend in use:

.x11

  • wio.backend.x11.globals.display is the Xlib display
  • Window.backend.x11.window is the Xlib window

.wayland

  • wio.backend.wayland.globals.display is the Wayland wl_display
  • Window.backend.wayland.surface is the Wayland wl_surface

WebAssembly

  • Window.backend.id is the index into the JavaScript window array

Haiku

  • Window.backend.window is the InterfaceKit BWindow

About

windowed i/o

Resources

Stars

139 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages