DerryAlex/zig-gir-ffi
GObject Introspection for zig
refs
GObject Introspection for zig. Generated GTK4 binding can be downloaded.
Warning Before zig 1.0 is released, only pre-releases targeting latest zig stable are guarenteed to be kept.
# generate bindings for Gtk
zig build run -- -N Gtk
# generate bindings for Gtk-3.0
zig build run -- -N Gtk -V 3.0
# display help
zig build run -- --help
Note: This project relies on field_info_get_size
to work properly.
Due to an issue in gobject-introspection, a patched version of g-ir-compiler
(or gi-compile-repository
) may be required.
As bitfields are not commonly found in GIR files, users can use typelibs from their package manager (e.g., apt
, msys2
) without recompiling.
For notable exceptions (glib
, gobject
and pango
), this project ships patched typelibs (for LP64 model), which can be enabled by --includedir lib/girepository-1.0
option.
For example, zig build run -- -N Adw --includedir lib/girepository-1.0
should work perfectly if you have installed gir1.2-adw-1
package or its equivalent.
Run zig fetch --save https://url/to/bindings.tar.gz
and add the following lines to your build.zig
. For more information, refer to Zig Build System.
const gtk = b.dependency("gtk4", .{});
exe.root_module.addImport("gtk", gtk.module("gtk"));
application : Port of Gtk - 4.0: Getting Started with GTK, a relatively comprehensive example
hello : A simple example
pub fn printHello() void {
std.log.info("Hello World", .{});
}
pub fn activate(app: *GApplication) void {
var window = ApplicationWindow.new(app.tryInto(Application).?).into(Window);
window.setTitle("Window");
window.setDefaultSize(200, 200);
var box = Box.new(.vertical, 0);
var box_as_widget = box.into(Widget);
box_as_widget.setHalign(.center);
box_as_widget.setValign(.center);
window.setChild(box_as_widget);
var button = Button.newWithLabel("Hello, World");
_ = button.connectClicked(printHello, .{}, .{});
_ = button.connectClicked(Window.destroy, .{window}, .{ .swapped = true });
box.append(button.into(Widget));
window.present();
}
pub fn main() u8 {
var app = Application.new("org.gtk.example", .{}).into(GApplication);
defer app.__call("unref", .{});
_ = app.connectActivate(activate, .{}, .{});
return @intCast(app.run(std.os.argv));
}
clock : (Implicit) use of the main context
custom : Custom widget
interface : Define interface
Read docs/design.md and docs/hacking.md.