2026-03-21 17:16:49 +00:00
2026-02-27 01:11:57 +00:00
2026-02-25 18:01:39 +00:00
2026-02-25 18:01:39 +00:00
2026-02-25 18:01:39 +00:00
2026-02-25 18:01:39 +00:00
2026-02-25 18:01:39 +00:00
2026-03-21 17:16:49 +00:00

Wayland Protocol Code Generator

Code generation for Wayland protocols, for use without libwayland. Generated code is NOT ABI compatible with libwayland.

I wrote this to use in my own projects to avoid the callback-heavy interface provided by libwayland and the standard wayland-scanner.

This generator currently only supports generating Zig code, but I plan to add an option to emit the code as a single-header C library too.

I'll probably also give this all a cleanup pass soon. This code was all written rather quickly and probably can be tidied up.

Note

This program currently only generates client-compatible code. Support for server-compatible codegen may come later if I feel like it.

Usage

CLI

The binary can be produced by invoking zig build in the project root and protocols.zig can be generated by running the program as below:

# The program can be run with as many input protocols as you'd like
$ ./zig-out/bin/wayland-protocol-generator -o protocols.zig path/to/wayland.xml path/to/protocol1.xml path/to/protocolN.xml

This will read in all provided xml files and produce a single protocols.zig which will include the code for each protocol.

The core wayland protocol can be found at https://gitlab.freedesktop.org/wayland/wayland and additional protocol specifications can be found at https://gitlab.freedesktop.org/wayland/wayland-protocols

Generation Via Build.zig

You can use the zig build system to generate protocols.zig and expose it as a module as follows:

Add this repo as a dependency. You can do this manually or by invoking:

$ zig fetch --save git+https://github.com/ptrToLiam/wayland-protocol-codegen

Then add some lines such as the following to your build.zig:

const wayland_protocol_specifications = [_]std.Build.LazyPath{
  b.path("path/to/wayland.xml"),
  b.path("path/to/protocol1.xml"),
  b.path("path/to/protocolN.xml"),
  ...,
};

const wayland_protocols = b.dependency("wayland_protocol_codegen", .{
  .protocols = &wayland_protocol_specifications,
}).module("wayland-protocols");
exe.root_module.addImport("wayland-protocols", wayland_protocols);

This will allow you to import the protocol code with @import("wayland-protocols") in your executable module's source code.

S
Description
No description provided
Readme 87 KiB
Languages
Zig 99.1%
Nix 0.9%