When compiling from Debian the program works as intended, while compiling using
zig build -Dtarget=x86_64-windows-gnu
on debian or just zig build
on windows gives me lld linker errors.
On windows I followed the official gtk4 installation guide using msys2. However while compiling i noticed some linking issues were easily fixed by changing the file endings of some library files from .dll.a to .a.
Can someone help me find a way to compile to windows.
Build.zig
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe = b.addExecutable(.{
.name = "src",
.root_source_file = .{ .path = "src/main.zig" },
.target = target,
.optimize = optimize,
});
exe.linkSystemLibrary("c");
exe.linkSystemLibrary("gtk4");
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}
error on debian 12 without any tweaks:
zig build -Dtarget=x86_64-windows-gnu
zig build-exe src Debug x86_64-windows-gnu: error: error: unable to find Dynamic system library 'gtk-4' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'pangocairo-1.0' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'pango-1.0' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'harfbuzz' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'gdk_pixbuf-2.0' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'cairo-gobject' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'cairo' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'graphene-1.0' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'gio-2.0' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'gobject-2.0' using strategy 'paths_first'. searched paths: none
error: unable to find Dynamic system library 'glib-2.0' using strategy 'paths_first'. searched paths: none
zig build-exe src Debug x86_64-windows-gnu: error: the following command exited with error code 1:
/home/user/Downloads/try random things/zig-linux-x86_64-0.12.0-dev.1769+bf5ab5451/zig build-exe /home/user/Downloads/try random things/zmt_old/src/main.zig -I/usr/include/gtk-4.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/x86_64-linux-gnu -I/usr/include/graphene-1.0 -I/usr/lib/x86_64-linux-gnu/graphene-1.0/include -lgtk-4 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lc --cache-dir /home/user/Downloads/try random things/zmt_old/zig-cache --global-cache-dir /home/user/.cache/zig --name src -target x86_64-windows-gnu -mcpu x86_64 --listen=-
Build Summary: 0/3 steps succeeded; 1 failed (disable with --summary none)
install transitive failure
└─ install src transitive failure
└─ zig build-exe src Debug x86_64-windows-gnu failure
error: the following build command failed with exit code 1:
/home/user/Downloads/try random things/zmt_old/zig-cache/o/7b118b16cc63251b4b4ee0ee9f73ed13/build /home/user/Downloads/try random things/zig-linux-x86_64-0.12.0-dev.1769+bf5ab5451/zig /home/user/Downloads/try random things/zmt_old /home/user/Downloads/try random things/zmt_old/zig-cache /home/user/.cache/zig --seed 0x39560fec -Dtarget=x86_64-windows-gnu
error after changing library filenames from .dll.a to .a on windows:
zig build-exe src Debug native: error: the following command failed with 73 compilation errors:
C:\Users\user\Downloads\zig-windows-x86_64-0.12.0-dev.1482+e74ced21b\zig.exe build-exe C:\Users\user\Downloads\zmt-de2025202e9f6d3a7803ded3ad17088eeac90d6b\zmt\src\main.zig -IC:/msys64/
mingw64/bin/../include/gtk-4.0 -IC:/msys64/mingw64/bin/../include/pango-1.0 -IC:/msys64/mingw64/bin/../include/gdk-pixbuf-2.0 -IC:/msys64/mingw64/bin/../include/cairo -IC:/msys64/mingw64/
bin/../include/harfbuzz -IC:/msys64/mingw64/bin/../include/freetype2 -IC:/msys64/mingw64/bin/../include/graphene-1.0 -IC:/msys64/mingw64/bin/../lib/graphene-1.0/include -IC:/msys64/mingw6
4/bin/../include -IC:/msys64/mingw64/bin/../include/glib-2.0 -IC:/msys64/mingw64/bin/../lib/glib-2.0/include -IC:/msys64/mingw64/bin/../include/fribidi -IC:/msys64/mingw64/bin/../include/
webp -DLIBDEFLATE_DLL -IC:/msys64/mingw64/bin/../include/libpng16 -IC:/msys64/mingw64/bin/../include/pixman-1 -LC:/msys64/mingw64/bin/../lib -lgtk-4 -lpangowin32-1.0 -lpangocairo-1.0 -lpa
ngo-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl -lc --cache-dir C:\Users\user\Downloads\zmt-de2025202e9f6d3a7803ded3a
d17088eeac90d6b\zmt\zig-cache --global-cache-dir C:\Users\user\AppData\Local\zig --name src --listen=-
Build Summary: 0/3 steps succeeded; 1 failed (disable with --summary none)
install transitive failure
└─ install src transitive failure
└─ zig build-exe src Debug native 73 errors
error: lld-link: undefined symbol: glib_win32_init
note: referenced by libgobject-2.0.a(gtype.c.obj):(.text.startup)
note: referenced by libgio-2.0.a(giomodule.c.obj):(.text.startup)
error: lld-link: undefined symbol: ffi_prep_cif
note: referenced by libgobject-2.0.a(gclosure.c.obj):(g_cclosure_marshal_generic)
note: referenced by libgobject-2.0.a(gclosure.c.obj):(g_cclosure_marshal_generic_va)
error: lld-link: undefined symbol: ffi_call
note: referenced by libgobject-2.0.a(gclosure.c.obj):(g_cclosure_marshal_generic)
note: referenced by libgobject-2.0.a(gclosure.c.obj):(g_cclosure_marshal_generic_va)
error: lld-link: undefined symbol: ffi_type_void
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_void)
error: lld-link: undefined symbol: ffi_type_double
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_double)
error: lld-link: undefined symbol: ffi_type_float
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_float)
error: lld-link: undefined symbol: ffi_type_pointer
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_pointer)
error: lld-link: undefined symbol: ffi_type_sint64
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_sint64)
error: lld-link: undefined symbol: ffi_type_uint32
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_uint32)
error: lld-link: undefined symbol: ffi_type_uint64
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_uint64)
error: lld-link: undefined symbol: ffi_type_sint32
note: referenced by libgobject-2.0.a(gclosure.c.obj):(.refptr.ffi_type_sint32)
error: lld-link: undefined symbol: __declspec(dllimport) CoTaskMemFree
note: referenced by libgio-2.0.a(gwin32appinfo.c.obj):(make_item_array)
note: referenced by libgio-2.0.a(gwin32file-sync-stream.c.obj):(_file_sync_stream_stat)
note: referenced by libgio-2.0.a(gwin32mount.c.obj):(g_win32_mount_get_icon)
note: referenced 4 more times
error: lld-link: undefined symbol: __declspec(dllimport) SHLoadIndirectString
note: referenced by libgio-2.0.a(gwin32appinfo.c.obj):(grab_registry_string)
error: lld-link: undefined symbol: __declspec(dllimport) CoInitializeEx
note: referenced by libgio-2.0.a(gwin32appinfo.c.obj):(g_win32_app_info_launch_internal)
note: referenced by libgio-2.0.a(gwin32packageparser.c.obj):(g_win32_package_parser_enum_packages)
error: lld-link: undefined symbol: __declspec(dllimport) CoCreateInstance
note: referenced by libgio-2.0.a(gwin32appinfo.c.obj):(g_win32_app_info_launch_internal)
error: lld-link: undefined symbol: __declspec(dllimport) CoUninitialize
note: referenced by libgio-2.0.a(gwin32appinfo.c.obj):(g_win32_app_info_launch_internal)
note: referenced by libgio-2.0.a(gwin32packageparser.c.obj):(g_win32_package_parser_enum_packages)
error: lld-link: undefined symbol: g_module_close
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_module_unload_module)
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_module_load_module)
error: lld-link: undefined symbol: g_module_open_full
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_module_load_module)
error: lld-link: undefined symbol: g_module_symbol
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_module_load_module)
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_module_load_module)
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_module_load_module)
note: referenced 1 more times
error: lld-link: undefined symbol: g_module_error
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_module_load_module)
error: lld-link: undefined symbol: g_module_supported
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_modules_load_all_in_directory_with_scope)
note: referenced by libgio-2.0.a(giomodule.c.obj):(g_io_modules_scan_all_in_directory_with_scope)
error: lld-link: undefined symbol: inflate
note: referenced by libgio-2.0.a(gzlibdecompressor.c.obj):(g_zlib_decompressor_convert)
error: lld-link: undefined symbol: inflateEnd
note: referenced by libgio-2.0.a(gzlibdecompressor.c.obj):(g_zlib_decompressor_finalize)
error: lld-link: undefined symbol: inflateGetHeader
note: referenced by libgio-2.0.a(gzlibdecompressor.c.obj):(g_zlib_decompressor_set_gzheader.part.0)
error: lld-link: undefined symbol: inflateReset
note: referenced by libgio-2.0.a(gzlibdecompressor.c.obj):(g_zlib_decompressor_reset)
error: lld-link: undefined symbol: inflateInit_
note: referenced by libgio-2.0.a(gzlibdecompressor.c.obj):(g_zlib_decompressor_constructed)
error: lld-link: undefined symbol: inflateInit2_
note: referenced by libgio-2.0.a(gzlibdecompressor.c.obj):(g_zlib_decompressor_constructed)
note: referenced by libgio-2.0.a(gzlibdecompressor.c.obj):(g_zlib_decompressor_constructed)
error: lld-link: undefined symbol: CancelMibChangeNotify2
note: referenced by libgio-2.0.a(gwin32networkmonitor.c.obj):(g_win32_network_monitor_finalize)
error: lld-link: undefined symbol: GetIpForwardTable2
note: referenced by libgio-2.0.a(gwin32networkmonitor.c.obj):(g_win32_network_monitor_initable_init)
error: lld-link: undefined symbol: NotifyRouteChange2
note: referenced by libgio-2.0.a(gwin32networkmonitor.c.obj):(g_win32_network_monitor_initable_init)
error: lld-link: undefined symbol: __declspec(dllimport) inet_pton
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_w32_get_adapter_ipv4_addr)
note: referenced by libgio-2.0.a(ginetaddress.c.obj):(g_inet_address_new_from_string)
error: lld-link: undefined symbol: __declspec(dllimport) recv
note: referenced by libgio-2.0.a(gsocket.c.obj):(update_condition_unlocked)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_get_available_bytes)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_receive_with_timeout)
error: lld-link: undefined symbol: __declspec(dllimport) WSAEnumNetworkEvents
note: referenced by libgio-2.0.a(gsocket.c.obj):(update_condition_unlocked)
error: lld-link: undefined symbol: __declspec(dllimport) WSAGetLastError
note: referenced by libgio-2.0.a(gsocket.c.obj):(update_condition_unlocked)
note: referenced by libgio-2.0.a(gsocket.c.obj):(socket_set_nonblock)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_multicast_group_operation)
note: referenced 22 more times
error: lld-link: undefined symbol: __declspec(dllimport) WSAEventSelect
note: referenced by libgio-2.0.a(gsocket.c.obj):(update_select_events.part.0)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_accept)
error: lld-link: undefined symbol: __declspec(dllimport) WSACreateEvent
note: referenced by libgio-2.0.a(gsocket.c.obj):(update_select_events.part.0)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_create_source)
error: lld-link: undefined symbol: __declspec(dllimport) ioctlsocket
note: referenced by libgio-2.0.a(gsocket.c.obj):(socket_set_nonblock)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_get_available_bytes)
error: lld-link: undefined symbol: __declspec(dllimport) setsockopt
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_multicast_group_operation)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_multicast_group_operation)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_multicast_group_operation_ssm)
note: referenced 2 more times
error: lld-link: undefined symbol: __declspec(dllimport) socket
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket)
error: lld-link: undefined symbol: __declspec(dllimport) WSAIoctl
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_get_credentials)
error: lld-link: undefined symbol: __declspec(dllimport) getsockname
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_get_local_address)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_constructed)
error: lld-link: undefined symbol: __declspec(dllimport) listen
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_listen)
error: lld-link: undefined symbol: __declspec(dllimport) shutdown
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_shutdown)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_shutdown)
error: lld-link: undefined symbol: __declspec(dllimport) closesocket
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_close)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_accept)
error: lld-link: undefined symbol: __declspec(dllimport) WSACloseEvent
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_finalize)
error: lld-link: undefined symbol: __declspec(dllimport) WSAWaitForMultipleEvents
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_condition_timed_wait)
error: lld-link: undefined symbol: __declspec(dllimport) WSARecvFrom
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_receive_message_with_timeout)
error: lld-link: undefined symbol: __declspec(dllimport) WSARecv
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_receive_message_with_timeout)
error: lld-link: undefined symbol: __declspec(dllimport) send
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_send_with_timeout)
error: lld-link: undefined symbol: __declspec(dllimport) accept
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_accept)
error: lld-link: undefined symbol: __declspec(dllimport) WSASendTo
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_send_message_with_timeout)
error: lld-link: undefined symbol: __declspec(dllimport) WSASend
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_send_message_with_timeout)
error: lld-link: undefined symbol: __declspec(dllimport) getsockopt
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_get_option)
error: lld-link: undefined symbol: __declspec(dllimport) getpeername
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_constructed)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_get_remote_address)
error: lld-link: undefined symbol: __declspec(dllimport) connect
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_connect)
error: lld-link: undefined symbol: __declspec(dllimport) bind
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_bind)
error: lld-link: undefined symbol: if_nametoindex
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_w32_get_adapter_ipv4_addr)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_multicast_group_operation)
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_multicast_group_operation_ssm)
error: lld-link: undefined symbol: GetAdaptersAddresses
note: referenced by libgio-2.0.a(gsocket.c.obj):(g_socket_w32_get_adapter_ipv4_addr)
error: lld-link: undefined symbol: __declspec(dllimport) CoTaskMemAlloc
note: referenced by libgio-2.0.a(gwin32file-sync-stream.c.obj):(_file_sync_stream_stat)
error: lld-link: undefined symbol: libiconv_open
note: referenced by libintl.a(dcigettext.o):(_libintl_find_msg)
note: referenced by libintl.a(dcigettext.o):(_libintl_find_msg)
error: lld-link: undefined symbol: libiconv
note: referenced by libintl.a(dcigettext.o):(_libintl_find_msg)
error: lld-link: undefined symbol: __declspec(dllimport) StrRetToStrW
note: referenced by libgio-2.0.a(gwin32mount.c.obj):(get_mount_display_name)
error: lld-link: undefined symbol: __declspec(dllimport) inet_ntop
note: referenced by libgio-2.0.a(ginetaddress.c.obj):(g_inet_address_to_string)
note: referenced by libgio-2.0.a(ginetaddress.c.obj):(g_inet_address_to_string)
error: lld-link: undefined symbol: in6addr_any
note: referenced by libgio-2.0.a(ginetaddress.c.obj):(.refptr.in6addr_any)
error: lld-link: undefined symbol: in6addr_loopback
note: referenced by libgio-2.0.a(ginetaddress.c.obj):(.refptr.in6addr_loopback)
error: lld-link: undefined symbol: WspiapiGetAddrInfo
note: referenced by libgio-2.0.a(ginetsocketaddress.c.obj):(g_inet_socket_address_new_from_string)
note: referenced by libgio-2.0.a(gthreadedresolver.c.obj):(threaded_resolver_worker_cb)
error: lld-link: undefined symbol: WspiapiFreeAddrInfo
note: referenced by libgio-2.0.a(ginetsocketaddress.c.obj):(g_inet_socket_address_new_from_string)
note: referenced by libgio-2.0.a(gthreadedresolver.c.obj):(threaded_resolver_worker_cb)
note: referenced by libgio-2.0.a(gthreadedresolver.c.obj):(threaded_resolver_worker_cb)
error: lld-link: undefined symbol: __declspec(dllimport) WSAStartup
note: referenced by libgio-2.0.a(gnetworking.c.obj):(.text)
error: lld-link: undefined symbol: __declspec(dllimport) getservbyname
note: referenced by libgio-2.0.a(gnetworking.c.obj):(g_getservbyname_ntohs)
error: lld-link: undefined symbol: WspiapiGetNameInfo
note: referenced by libgio-2.0.a(gthreadedresolver.c.obj):(do_lookup_by_address.constprop.0)
error: lld-link: undefined symbol: DnsQuery_A
note: referenced by libgio-2.0.a(gthreadedresolver.c.obj):(threaded_resolver_worker_cb)
error: lld-link: undefined symbol: DnsFree
note: referenced by libgio-2.0.a(gthreadedresolver.c.obj):(threaded_resolver_worker_cb)
error: lld-link: undefined symbol: libiconv_set_relocation_prefix
note: referenced by libintl.a(relocatable.o):(.text)
main.zig:
const std = @import("std");
const c = @cImport({
@cInclude("gtk/gtk.h");
});
// reimplementation of c.g_signal_connect
pub fn _g_signal_connect(instance: c.gpointer, detailed_signal: [*c]const c.gchar, c_handler: c.GCallback, data: c.gpointer) c.gulong {
var zero: u32 = 0;
const flags: *c.GConnectFlags = @as(*c.GConnectFlags, @ptrCast(&zero));
return c.g_signal_connect_data(instance, detailed_signal, c_handler, data, null, flags.*);
}
pub fn _g_signal_connect_swapped(instance: c.gpointer, detailed_signal: [*c]const c.gchar, c_handler: c.GCallback, data: c.gpointer) c.gulong {
return c.g_signal_connect_data(
instance,
detailed_signal,
c_handler,
data,
null,
c.G_CONNECT_SWAPPED,
);
}
pub fn buttonHandler(text: [*c]const u8, windowName: [*c]const u8, callBack: c.GCallback) !void {
c.g_print(text);
const window = c.gtk_application_new(windowName, c.G_APPLICATION_FLAGS_NONE);
defer c.g_object_unref(window);
// using reimplementation
_ = _g_signal_connect(window, "activate", callBack, null);
const windowStatus: c_int = c.g_application_run(@as(*c.GApplication, @ptrCast(window)), 0, null);
if (windowStatus != 0) return error.Error;
}
// pq button handler
pub fn loadPq(_: *c.GtkWidget, _: c.gpointer) !void {
try buttonHandler("Hello PQ", "main.pq", @as(c.GCallback, @ptrCast(&activatePq)));
}
// pq button handler
pub fn loadLinjar(_: *c.GtkWidget, _: c.gpointer) !void {
try buttonHandler("Hello Linjar", "main.linjar", @as(c.GCallback, @ptrCast(&activateLinjar)));
}
// pq button handler
pub fn loadHeron(_: *c.GtkWidget, _: c.gpointer) !void {
try buttonHandler("Hello Heron", "main.heron", @as(c.GCallback, @ptrCast(&activateHeron)));
}
// pq button handler
pub fn loadPyth(_: *c.GtkWidget, _: c.gpointer) !void {
try buttonHandler("Hello Pythagoras", "main.pyth", @as(c.GCallback, @ptrCast(&activatePyth)));
}
// pq button handler
pub fn loadDisk(_: *c.GtkWidget, _: c.gpointer) !void {
try buttonHandler("Hello Diskriminant", "main.disk", @as(c.GCallback, @ptrCast(&activateDisk)));
}
// calculate pq button handler
pub fn calcPq(widget: *c.GtkWidget, data: c.gpointer) !void {
_ = widget;
_ = data;
c.g_print("calculated PQ\n");
}
pub fn initButton(buttonLabel: [*c]const u8, callBack: c.GCallback) *c.GtkWidget {
// using reimplementations
const button: *c.GtkWidget = c.gtk_button_new_with_label(buttonLabel);
_ = _g_signal_connect(button, "clicked", callBack, null);
return button;
}
// initialize menu window
pub fn activateMenu(app: *c.GtkApplication, _: c.gpointer) void {
// init window constants: width height and context
const window: *c.GtkWidget = c.gtk_application_window_new(app);
c.gtk_window_set_title(@as(*c.GtkWindow, @ptrCast(window)), "Menu");
c.gtk_window_set_default_size(@as(*c.GtkWindow, @ptrCast(window)), 400, 200);
// init box context
const box: *c.GtkWidget = c.gtk_box_new(c.GTK_ORIENTATION_VERTICAL, 0);
c.gtk_widget_set_halign(box, c.GTK_ALIGN_CENTER);
c.gtk_widget_set_valign(box, c.GTK_ALIGN_CENTER);
c.gtk_window_set_child(@as(*c.GtkWindow, @ptrCast(window)), box);
// init pqButton
const pqButton = initButton("Kalkulera PQ", @as(c.GCallback, @ptrCast(&loadPq)));
// init linjarButton
const linjarButton = initButton("Kalkulera Linjar Ekvation", @as(c.GCallback, @ptrCast(&loadLinjar)));
// init heronButton
const heronButton = initButton("Kalkulera Herons Formel", @as(c.GCallback, @ptrCast(&loadHeron)));
// init pythButton
const pythButton = initButton("Kalkulera Pythagoras Sats", @as(c.GCallback, @ptrCast(&loadPyth)));
// init diskButton
const diskButton = initButton("Kalkulera Diskriminanten", @as(c.GCallback, @ptrCast(&loadDisk)));
// add buttons do window context
c.gtk_box_append(@as(*c.GtkBox, @ptrCast(box)), pqButton);
c.gtk_box_append(@as(*c.GtkBox, @ptrCast(box)), linjarButton);
c.gtk_box_append(@as(*c.GtkBox, @ptrCast(box)), heronButton);
c.gtk_box_append(@as(*c.GtkBox, @ptrCast(box)), pythButton);
c.gtk_box_append(@as(*c.GtkBox, @ptrCast(box)), diskButton);
// display buttons
c.gtk_widget_show(window);
}
pub fn windowInit(app: *c.GtkApplication, title: [*c]const u8, buttonLabel: [*c]const u8, callBack: c.GCallback) void {
const window: *c.GtkWidget = c.gtk_application_window_new(app);
c.gtk_window_set_title(@as(*c.GtkWindow, @ptrCast(window)), title);
c.gtk_window_set_default_size(@as(*c.GtkWindow, @ptrCast(window)), 200, 200);
const box: *c.GtkWidget = c.gtk_box_new(c.GTK_ORIENTATION_VERTICAL, 0);
c.gtk_widget_set_halign(box, c.GTK_ALIGN_CENTER);
c.gtk_widget_set_valign(box, c.GTK_ALIGN_CENTER);
c.gtk_window_set_child(@as(*c.GtkWindow, @ptrCast(window)), box);
const button: *c.GtkWidget = c.gtk_button_new_with_label(buttonLabel);
// using reimplementations
_ = _g_signal_connect(button, "clicked", callBack, null);
c.gtk_box_append(@as(*c.GtkBox, @ptrCast(box)), button);
c.gtk_widget_show(window);
}
// initialize pq window
pub fn activatePq(app: *c.GtkApplication, _: c.gpointer) void {
windowInit(app, "Pq", "Pq Formel", @as(c.GCallback, @ptrCast(&calcPq)));
}
// initialize linjar window
pub fn activateLinjar(app: *c.GtkApplication, _: c.gpointer) void {
windowInit(app, "Linjar", "Hello Linjar!", @as(c.GCallback, @ptrCast(&calcPq)));
}
// initialize heron window
pub fn activateHeron(app: *c.GtkApplication, _: c.gpointer) void {
windowInit(app, "Heron", "Hello Heron!", @as(c.GCallback, @ptrCast(&calcPq)));
}
// initialize pythagoras window
pub fn activatePyth(app: *c.GtkApplication, _: c.gpointer) void {
windowInit(app, "Pythagoras", "Hello Pythagoras!", @as(c.GCallback, @ptrCast(&calcPq)));
}
// initialize discriminant window
pub fn activateDisk(app: *c.GtkApplication, _: c.gpointer) void {
windowInit(app, "Diskriminant", "Hello Diskriminant!", @as(c.GCallback, @ptrCast(&calcPq)));
}
pub fn main() !void {
const menu = c.gtk_application_new("main.menu", c.G_APPLICATION_FLAGS_NONE);
defer c.g_object_unref(menu);
// using reimplementation
_ = _g_signal_connect(menu, "activate", @as(c.GCallback, @ptrCast(&activateMenu)), null);
const menuStatus: c_int = c.g_application_run(@as(*c.GApplication, @ptrCast(menu)), 0, null);
if (menuStatus != 0) return error.Error;
}