Improved User Interface
A cross-platform UI toolkit for Rust based on libui
iui
is a simple (about 4 kLOC of Rust), small (about 800kb, including libui
), easy to distribute (one shared library) GUI library, providing a Rusty user interface library that binds to native APIs via the libui and the ui-sys
bindings crate.
iui
wraps native retained mode GUI libraries, like Win32API on Windows, Cocoa on Mac OS X, and GTK+ on Linux and elsewhere. Thus all iui
apps have a native look and feel and start from a highly performant base which is well integrated with the native ecosystem on each platform. Because it implements only the least common subset of these platform APIs, your apps will work on all platforms and won't have significant behavioral inconsistencies, with no additional effort on your part.
Using
Add iui
to your project with:
iui = "0.3"
Then, in your code, all you have to do is:
- create a
UI
handle, initializing the UI library and guarding against memory unsafety - make a window, or a few, with title and platform-native decorations, into which your app will be drawn
- add all your controls, like buttons and text inputs, laid out with both axial and grid layout options
- implement some callbacks for user input, taking full advantage of Rust's concurrency protections
- call
UI::main
, or take control over the event processing with anEventLoop
, and voÃla! A GUI!
Or, you can track the trunk
branch, which may be broken and whose API often changes, with:
iui = { git = "https://github.com/rust-native-ui/libui-rs.git" branch="trunk" }
We have documentation on docs.rs for released versions and on github for trunk
.
Examples
Check out the examples/
directory from the latest release for these examples and more.
Organization
This repository contains multiple Rust crates:
iui
is the safe Rust wrapper, to be used by most users.ui-sys
is the raw unsafe bindings to thelibui
C code.libui
is included as a submodule.
Also be sure to look at our changelog and learn how to contribute.
Building ui-sys
ui-sys
includes libui
as a sub-module and allows it to be built on-the-fly with the
default features fetch
and build
. With fetch
disabled, it will simply build the
existing sources without updating them, and with build
disabled it will build nothing,
assuming either a system or local (in ./lib/
) version of libui
is available.
Note that most of the time, building libui
on the fly is what you want.
Acknowledgments
Based on work by @pcwalton.