2019-11-16 21:38:25 -05:00
|
|
|
# notcurses
|
|
|
|
cleanroom TUI library for modern terminal emulators. definitely not curses.
|
2019-11-17 05:04:41 -05:00
|
|
|
|
|
|
|
[](https://drone.dsscaw.com:4443/dankamongmen/notcurses)
|
2019-11-17 23:09:06 -05:00
|
|
|
|
2019-11-18 00:05:32 -05:00
|
|
|
* **What it is**: a library facilitating complex TUIs on modern terminal
|
2019-11-17 23:09:06 -05:00
|
|
|
emulators, supporting vivid colors and wide characters to the
|
|
|
|
maximum degree possible. Many tasks delegated to Curses can be
|
|
|
|
achieved using notcurses (and vice versa).
|
|
|
|
|
2019-11-18 00:05:32 -05:00
|
|
|
* **What it is not**: a source-compatible X/Open Curses implementation, nor a
|
2019-11-17 23:09:06 -05:00
|
|
|
replacement for NCURSES on existing systems, nor a widely-ported and -tested
|
|
|
|
bedrock of Open Source, nor a battle-proven, veteran library.
|
|
|
|
|
|
|
|
notcurses abandons the X/Open Curses API bundled as part of the Single UNIX
|
2019-11-19 06:53:50 -05:00
|
|
|
Specification. The latter shows its age, and seems not capable of making use of
|
2019-11-18 00:05:32 -05:00
|
|
|
terminal functionality such as unindexed 24-bit color ("DirectColor", not to be
|
|
|
|
confused with 8-bit indexed 24-bit color, aka "TrueColor"). For some necessary
|
|
|
|
background, consult Thomas E. Dickey's superb and authoritative [NCURSES
|
|
|
|
FAQ](https://invisible-island.net/ncurses/ncurses.faq.html#xterm_16MegaColors).
|
2019-11-17 23:09:06 -05:00
|
|
|
As such, it is not a drop-in Curses replacement. notcurses furthermore makes
|
|
|
|
use of the Terminfo library shipped with NCURSES. It is almost certainly less
|
|
|
|
portable, and definitely tested on less hardware.
|
|
|
|
|
|
|
|
notcurses opens up advanced functionality for the interactive user on
|
|
|
|
workstations, phones, laptops, and tablets, at the expense of e.g.
|
|
|
|
industrial and retail terminals (or even the Linux virtual console,
|
2019-11-18 12:16:26 -05:00
|
|
|
which offers only eight colors and limited glyphs).
|
2019-11-17 23:09:06 -05:00
|
|
|
|
|
|
|
Why use this non-standard library?
|
|
|
|
|
|
|
|
* A svelter design than that codified in X/Open. All exported identifiers
|
|
|
|
are prefixed with `notcurses_` to avoid namespace pollution. Fewer
|
|
|
|
identifiers overall. All APIs natively suport wide characters and
|
|
|
|
24-bit RGB color.
|
|
|
|
|
|
|
|
* Visual features not directly available via NCURSES, including images,
|
|
|
|
fonts, and video.
|
|
|
|
|
2019-11-18 12:16:26 -05:00
|
|
|
* Thread safety, and use in parallel programs, has been a design consideration
|
|
|
|
from the beginning.
|
|
|
|
|
2019-11-17 23:09:06 -05:00
|
|
|
On the other hand, if you're targeting industrial or critical applications,
|
|
|
|
or wish to benefit from the time-tested reliability and portability of Curses,
|
|
|
|
you should by all means use that fine library.
|
2019-11-21 09:06:36 -05:00
|
|
|
|
|
|
|
## Basic use
|
|
|
|
|
|
|
|
A program wishing to use notcurses will need to link it, ideally using the
|
|
|
|
output of `pkg-config --libs notcurses`. It is advised to compile with the
|
|
|
|
output of `pkg-config --cflags notcurses`. If using CMake, a support file is
|
|
|
|
provided, and can be accessed as `notcurses`.
|
|
|
|
|
|
|
|
Before calling into notcurses—and usually as one of the first calls of the
|
|
|
|
program—be sure to call `setlocale(3)` with an appropriate UTF-8 `LC_ALL`
|
|
|
|
locale. It is usually appropriate to pass `NULL` to `setlocale()`, relying on
|
|
|
|
the user to properly set the `LANG` environment variable.
|
|
|
|
|
|
|
|
notcurses requires an available `terminfo(5)` definition appropriate for the
|
|
|
|
terminal. It is usually appropriate to pass `NULL` in the `termtype` field of a
|
|
|
|
`notcurses_options` struct, relying on the user to properly set the `TERM`
|
|
|
|
environment variable. This variable is usually set by the terminal itself. It
|
|
|
|
might be necessary to manually select a higher-quality definition for your
|
|
|
|
terminal, i.e. `xterm-direct` as opposed to `xterm` or `xterm-256color`.
|
|
|
|
|
|
|
|
Each terminal can be prepared via a call to `notcurses_init()`, which is
|
|
|
|
supplied a struct of type `notcurses_options`:
|
|
|
|
|
|
|
|
```c
|
|
|
|
// Configuration for notcurses_init().
|
|
|
|
typedef struct notcurses_options {
|
|
|
|
// The name of the terminfo database entry describing this terminal. If NULL,
|
|
|
|
// the environment variable TERM is used. Failure to open the terminal
|
|
|
|
// definition will result in failure to initialize notcurses.
|
|
|
|
const char* termtype;
|
|
|
|
// A file descriptor for this terminal on which we will generate output.
|
|
|
|
// Must be a valid file descriptor attached to a terminal, or notcurses will
|
|
|
|
// refuse to start. You'll usually want STDOUT_FILENO.
|
|
|
|
int outfd;
|
|
|
|
// If smcup/rmcup capabilities are indicated, notcurses defaults to making
|
|
|
|
// use of the "alternate screen." This flag inhibits use of smcup/rmcup.
|
|
|
|
bool inhibit_alternate_screen;
|
|
|
|
} notcurses_options;
|
|
|
|
|
|
|
|
// Initialize a notcurses context, corresponding to a connected terminal.
|
|
|
|
// Returns NULL on error, including any failure to initialize terminfo.
|
|
|
|
struct notcurses* notcurses_init(const notcurses_options* opts);
|
|
|
|
|
|
|
|
// Destroy a notcurses context.
|
|
|
|
int notcurses_stop(struct notcurses* nc);
|
|
|
|
```
|
|
|
|
|
|
|
|
`notcurses_stop` should be called before exiting your program to restore the
|
|
|
|
terminal settings and free resources.
|