I'm trying to implement some functions for GTK4 custom types in Zig, due to Zig being unable to translate the gtk.h macros:
// src/demowidget.h
#pragma once
#include <gtk/gtk.h>
#define DEMO_TYPE_WIDGET demo_widget_get_type()
G_DECLARE_FINAL_TYPE(DemoWidget, demo_widget, DEMO, WIDGET, GtkWidget)
GtkWidget *demo_widget_new(void);
// src/demowidget.c
#include "demowidget.h"
struct _DemoWidget {
GtkWidget parent_instance;
GtkWidget *button;
};
G_DEFINE_TYPE(DemoWidget, demo_widget, GTK_TYPE_WIDGET)
GtkWidget *demo_widget_new(void) {
return g_object_new(DEMO_TYPE_WIDGET, NULL);
}
// src/demowidget.zig
const c = @cImport(@cInclude("demowidget.h"));
// ...
export fn demo_widget_init(self: *c.DemoWidget) void {
const widget = ptrCastAlign(*c.GtkWidget, self);
self.button = c.gtk_button_new_with_label("Hello, world!");
}
// ...
This gives the following error: src/demowidget.zig:9:9: error: type '*.home.ubuntu.work.zig-debug.zig-cache.o.1cd51e0688c994fa4839928440c40ab8.cimport.struct__DemoWidget' does not support field access self.button = c.gtk_button_new_with_label("Hello, world!");
Is there a way to access fields in Zig for opaque types? G_DEFINE_TYPE() basically expands to typedef _DemoWidget DemoWidget; among other things like the demo_widget_init() function declaration.