A single-header ANSI C immediate mode cross-platform GUI library; Micha Mettke (2015).
npm install nuklear.csh
$ npm i nuklear.c
`
And then include nuklear.h as follows:
`c
// main.c
#define NUKLEAR_IMPLEMENTATION
#include
int main() { / ... / }
`
Finally, compile while adding the path node_modules/nuklear.c to your compiler's include paths.
`bash
$ clang -I./node_modules/nuklear.c main.c # or, use gcc
$ gcc -I./node_modules/nuklear.c main.c
`
You may also use a simpler approach with the cpoach tool, which automatically adds the necessary include paths of all the installed dependencies for your project.
`bash
$ cpoach clang main.c # or, use gcc
$ cpoach gcc main.c
`
Building
This library is self-contained in one single header file and can be used either
in header-only mode or in implementation mode. The header-only mode is used
by default when included and allows including this header in other headers
and does not contain the actual implementation.
The implementation mode requires defining the preprocessor macro
NUKLEAR_IMPLEMENTATION in one .c/.cpp file before #includeing this file, e.g.:
`c
#define NUKLEAR_IMPLEMENTATION
#include "nuklear.h"
`
IMPORTANT: Every time you include "nuklear.h" you have to define the same optional flags.
This is very important; not doing it either leads to compiler errors, or even worse, stack corruptions.
Gallery
!screenshot
!screen
!screen2
!node
!skinning
!gamepad
Example
`c
/ init gui state /
struct nk_context ctx;
nk_init_fixed(&ctx, calloc(1, MAX_MEMORY), MAX_MEMORY, &font);
enum {EASY, HARD};
static int op = EASY;
static float value = 0.6f;
static int i = 20;
if (nk_begin(&ctx, "Show", nk_rect(50, 50, 220, 220),
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) {
/ fixed widget pixel width /
nk_layout_row_static(&ctx, 30, 80, 1);
if (nk_button_label(&ctx, "button")) {
/ event handling /
}
/ fixed widget window ratio width /
nk_layout_row_dynamic(&ctx, 30, 2);
if (nk_option_label(&ctx, "easy", op == EASY)) op = EASY;
if (nk_option_label(&ctx, "hard", op == HARD)) op = HARD;
/ custom widget pixel width /
nk_layout_row_begin(&ctx, NK_STATIC, 30, 2);
{
nk_layout_row_push(&ctx, 50);
nk_label(&ctx, "Volume:", NK_TEXT_LEFT);
nk_layout_row_push(&ctx, 110);
nk_slider_float(&ctx, 0, &value, 1.0f, 0.1f);
}
nk_layout_row_end(&ctx);
}
nk_end(&ctx);
`
!example
Bindings
There are a number of nuklear bindings for different languages created by other authors.
I cannot attest for their quality since I am not necessarily proficient in any of these
languages. Furthermore there are no guarantee that all bindings will always be kept up to date:
- Java by Guillaume Legris
- D by Mateusz Muszyński
- Golang by golang-ui@github.com
- Rust by snuk182@github.com
- Chicken by wasamasa@github.com
- Nim by zacharycarter@github.com
- Lua
- LÖVE-Nuklear by Kevin Harrison
- MoonNuklear by Stefano Trettel
- Python
- pyNuklear by William Emerison Six (ctypes-based wrapper)
- pynk by nathanrw@github.com (cffi binding)
- CSharp/.NET by cartman300@github.com
- V by Nicolas Sauzede
Credits
Developed by Micha Mettke and every direct or indirect contributor to the GitHub.
Embeds stb_texedit, stb_truetype and stb_rectpack by Sean Barrett (public domain)
Embeds ProggyClean.ttf font by Tristan Grimmer (MIT license).
Big thank you to Omar Cornut (ocornut@github) for his imgui library and
giving me the inspiration for this library, Casey Muratori for handmade hero
and his original immediate-mode graphical user interface idea and Sean
Barrett for his amazing single-header libraries which restored my faith
in libraries and brought me to create some of my own. Finally Apoorva Joshi for his single-header file packer.
License
Nuklear is avaliable under either the MIT License or public domain.
See LICENSE for more info.
Reviewers guide
When reviewing pull request there are common things a reviewer should keep
in mind.
Reviewing changes to src/* and nuklear.h:
* Ensure C89 compatibility.
* The code should work for several backends to an acceptable degree.
* Check no other parts of nuklear.h are related to the PR and thus nothing is missing.
* Recommend simple optimizations.
* Pass small structs by value instead of by pointer.
* Use local buffers over heap allocation when possible.
* Check that the coding style is consistent with code around it.
* Variable/function name casing.
* Indentation.
* Curly bracket ({}) placement.
* Ensure that the contributor has bumped the appropriate version in
clib.json
and added their changes to the
CHANGELOG.
* Have at least one other person review the changes before merging.
Reviewing changes to demo/, example/ and other files in the repo:
* Focus on getting working code merged.
* We want to make it easy for people to get started with Nuklear, and any
demo and example improvements helps in this regard.
* Use of newer C features, or even other languages is not discouraged.
* If another language is used, ensure that the build process is easy to figure out.
* Messy or less efficient code can be merged so long as these outliers are pointed out
and easy to find.
* Version shouldn't be bumped for these changes.
* Changes that improves code to be more inline with nuklear.h` are ofc always welcome.