Lines of code GitHub code size in bytes made with Zig made with Zig
A Zig language idiomatic and type-checked bindings for IUP Portable User Interface Toolkit
A simple hello world example looks like this:
const iup = @import("iup.zig"); pub fn main() !void { try iup.MainLoop.open(); defer iup.MainLoop.close(); var main_dialog = try (iup.Dialog.init() .setTitle("Hello World") .setChildren( .{ iup.VBox.init() .setMargin(10, 10) .setGap(10) .setAlignment(.ACenter) .setChildren( .{ iup.Label.init() .setTitle("Hello World from IUPforZig"), iup.Button.init() .setTitle("OK") .setActionCallback(exit), }, ), }, ).unwrap()); defer main_dialog.deinit(); try main_dialog.showXY(.Center, .Center); try iup.MainLoop.beginLoop(); } fn exit(button: *iup.Button) !void { iup.MainLoop.exitLoop(); }
Resulting in this:
This project contains source-code automatically generated by The IUP Metadata Project.
Most of the hard/repetitive work was done by code-gen tool, however, the API guidelines and all the interop code belongs here on this project.
Zig does not require any special treatment to use C libraries, so to use IUP in Zig, it is as simple as adding @cInclude("iup.h") in your source code, no need for special bindings!
This project attempts to create Zig bindings for IUP Toolkit with idiomatic and type-checked API, where none of the original IUP's declarations are exposed in the public interface, only names and concepts are kept as close as possible.
- IUP simple example in C:
#include <stdlib.h> #include <iup.h> int main(int argc, char **argv) { Ihandle *dlg, *multitext, *vbox; IupOpen(&argc, &argv); multitext = IupText(NULL); vbox = IupVbox( multitext, NULL); IupSetAttribute(multitext, "MULTILINE", "YES"); IupSetAttribute(multitext, "EXPAND", "YES"); dlg = IupDialog(vbox); IupSetAttribute(dlg, "TITLE", "Simple Notepad"); IupSetAttribute(dlg, "SIZE", "QUARTERxQUARTER"); IupShowXY(dlg, IUP_CENTER, IUP_CENTER); IupSetAttribute(dlg, "USERSIZE", NULL); IupMainLoop(); IupClose(); return EXIT_SUCCESS; }
- Equivalent example in Zig:
const iup = @import("iup.zig"); pub fn main() !void { try iup.MainLoop.open(); defer iup.MainLoop.close(); var main_dialog = try (iup.Dialog.init() .setTitle("Simple Notepad") .setSize(.Quarter, .Quarter) .setChildren( .{ iup.VBox.init() .setChildren( .{ iup.Text.init() .setMultiline(true) .setExpand(.Yes), }, ), }, ).unwrap()); defer main_dialog.deinit(); try main_dialog.showXY(.Center, .Center); try iup.MainLoop.beginLoop(); }
-
Download Zig;
-
Install IUP shared libraries and run:
NOTE: curl is needed to download IUP binaries.
Linux
./install_iup.sh zig build run
Windows
.\install_iup.bat zig build run
For more information, please visit IUP's download page for your platform: https://sourceforge.net/projects/iup/files/3.30/
Dependencies for
libimandlibcdmay be required: https://sourceforge.net/projects/imtoolkit/files/3.15/ https://sourceforge.net/projects/canvasdraw/files/5.14/
-
Support for collections and indexed attributes (list items for example)
-
Complete the Simple Notepad example.
-
Support Linux and Windows (using shared libs)
-
Investigate how to build IUP from C sources in Zig.
-
More tests, and sanitize failing tests.
-
Additional controls (image library, matrix, GLCanvas, scintilla, plot, etc)
Feel free to place any comments/issues/PRs, it will be very nice to receive any feedback π.
Some great projects that served as inspiration.
-
This project is a free and unencumbered software released into the public domain. Plese visit unlicense.org for more details.
-
IUP is a Tecgraf/PUC-Rio project licensed under the terms of the MIT license. Please visit https://www.tecgraf.puc-rio.br/iup/ for more details.