- Notifications
You must be signed in to change notification settings - Fork620
A single-header ANSI C immediate mode cross-platform GUI library
License
Immediate-Mode-UI/Nuklear
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This is a minimal-state, immediate-mode graphical user interface toolkitwritten in ANSI C and licensed under public domain. It was designed as a simpleembeddable user interface for application and does not have any dependencies,a default render backend or OS window/input handling but instead provides ahighly modular, library-based approach, with simple input state for input anddraw commands describing primitive shapes as output. So instead of providing alayered library that tries to abstract over a number of platform andrender backends, it focuses only on the actual UI.
- Immediate-mode graphical user interface toolkit
- Single-header library
- Written in C89 (ANSI C)
- Small codebase (~18kLOC)
- Focus on portability, efficiency and simplicity
- No dependencies (not even the standard library if not wanted)
- Fully skinnable and customizable
- Low memory footprint with total control of memory usage if needed / wanted
- UTF-8 support
- No global or hidden state
- Customizable library modules (you can compile and use only what you need)
- Optional font baker and vertex buffer output
- Documentation
This library is self-contained in one single header file and can be used eitherin header-only mode or in implementation mode. The header-only mode is usedby default when included and allows including this header in other headersand does not contain the actual implementation.
The implementation mode requires defining the preprocessor macroNK_IMPLEMENTATION
inone .c/.cpp file before#include
ing this file, e.g.:
#defineNK_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.
/* init gui state */structnk_contextctx;nk_init_fixed(&ctx,calloc(1,MAX_MEMORY),MAX_MEMORY,&font);enum {EASY,HARD};staticintop=EASY;staticfloatvalue=0.6f;staticinti=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);
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 theselanguages. 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 bygolang-ui@github.com
- Rust bysnuk182@github.com
- Chicken bywasamasa@github.com
- Nim byzacharycarter@github.com
- Lua
- LÖVE-Nuklear by Kevin Harrison
- MoonNuklear by Stefano Trettel
- Python
- pyNuklear by William Emerison Six (ctypes-based wrapper)
- pynk bynathanrw@github.com (cffi binding)
- CSharp/.NET bycartman300@github.com
- V by Nicolas Sauzede
Developed by Micha Mettke and every direct or indirect contributor to the GitHub.
Embedsstb_texedit
,stb_truetype
andstb_rectpack
by Sean Barrett (public domain)EmbedsProggyClean.ttf
font by Tristan Grimmer (MIT license).
Big thank you to Omar Cornut (ocornut@github) for hisimgui library andgiving me the inspiration for this library, Casey Muratori for handmade heroand his original immediate-mode graphical user interface idea and SeanBarrett for his amazing single-headerlibraries which restored my faithin libraries and brought me to create some of my own. Finally Apoorva Joshi for his single-headerfile packer.
Nuklear is avaliable under either the MIT License or public domain.SeeLICENSE for more info.
When reviewing pull request there are common things a reviewer should keepin mind.
Reviewing changes tosrc/*
andnuklear.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 inclib.jsonand added their changes to theCHANGELOG.
- Have at least one other person review the changes before merging.
Reviewing changes todemo/*
,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
andexample
improvements helps in this regard.
- We want to make it easy for people to get started with Nuklear, and any
- 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 outand 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.
About
A single-header ANSI C immediate mode cross-platform GUI library
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.