Rust bindings and wrappers for GLib, GDK 3, GTK+ 3 and Cairo. Online documentation.
gtk expects GTK+, GLib and Cairo development files to be installed on your system. Optionally, it is recommended to install the debug packages containing helpful debug symbols.
```Shell
sudo apt-get install libgtk-3-dev sudo apt-get install libgtk-3-0-dbg libglib2.0-0-dbg libcairo2-dbg ```
```Shell
sudo dnf install gtk3-devel glib2-devel
sudo yum install gtk3-devel glib2-devel ```
```Shell
brew install gtk+3 ```
Install mingw-w64 (select the win32 threading model) and download a GTK+ SDK: * The GNOME project has an official distribution of GTK+ 3.6: x86, x64. * GTK+ for Windows Runtime Environment Installer: 64-bit supports GTK+ 3.14, its SDK downloads can currently be found here.
Make sure both mingw's and the sdk's bin
directories are in your PATH
e.g. (assuming mingw is installed in C:\mingw-w64
and the SDK unpacked into C:\gtk
)
C:\> set PATH="C:\mingw-w64\bin;C:\gtk\bin;%PATH%"
If your Rust installation has gcc.exe
and ld.exe
in its bin
directory, you may
get a linking error ld: cannot find -limm32
. In that case remove those executables,
they will be provided by mingw instead.
The build script will query the installed library versions from pkg-config
and instruct rustc
via cfg
arguments to compile the appropriate set of APIs.
All the APIs available in the installed library will just work but if you attempt to use newer ones, the build will fail. Presently, Rust doesn't allow to generate custom error messages so there doesn't appear to be a way to make such errors more friendly.
Examples are providing in the gtk-rs/examples repository, you can find some tests showing off the functionality, these can be built and run as follows:
```Shell
cargo build --release ./target/release/gtktest ./target/release/cairotest ```
Browse the documentation at our website.
To include gtk as a cargo dependency you have to add it to your Cargo.toml:
Toml
[dependencies]
gtk = "0.0.4"
To implement GTK+ inheritance in rust, we implemented gtk superclasses as traits located in gtk::gtk::traits::*
. The various widgets implement these traits and live in gtk::gtk::*
.
For your convenience the various traits are reexported in the gtk::*
namespace as Gtk{trait_name}Trait
so you can just use...
```Rust extern crate gtk;
use gtk::*; ```
...to easily access all the gtk widgets and all traits methods:
Rust
let button = gtk::Button:new(); // You have access to the struct methods of gtk::Button aswell
// as the trait methods from gtk::traits::Button as GtkButtonTrait.
If you want yours to be added to this list, please create a Pull Request for it!
Contributor you're welcome!
You probably know but Gtk+ uses its own GObject system: inherited class and interface.
To respect this design, I follow a special design on gtk:
Example for GtkOrientable, GtkBox, GtkButtonBox:
GtkOrientable is an interface with all methods implemented as default method of the trait gtk::traits::Orientable.
GtkBox is a class with constructors implemented on the struct gtk::Box
, and the other method as default methods of the trait gtk::traits::Box
. So gtk::Box
implements gtk::traits::Orientable
and gtk::traits::Box
.
GtkButtonBox is a sub-class of GtkBox, the struct gtk::ButtonBox
implements all the methods of GtkButtonBox and the traits gtk::traits::Orientable
and gtk::traits::Box
.
Finally, all the gtk widgets implement the trait gtk::traits::Widget.
gtk is available under the MIT License, please refer to it.