notcurses/doc/man/man3/notcurses_init.3.ronn
2019-12-28 20:11:08 -05:00

120 lines
5.3 KiB
Markdown

notcurses_init(3) -- initialize a notcurses instance
====================================================
## SYNOPSIS
`#include <notcurses.h>`
<pre>typedef struct notcurses_options {
const char* termtype;
bool inhibit_alternate_screen;
bool retain_cursor;
bool clear_screen_start;
bool suppress_banner;
bool no_quit_sighandlers;
bool no_winch_sighandler;
FILE* renderfp;
} notcurses_options;</pre>
`struct notcurses*
notcurses_init(const struct notcurses_options* opts, FILE* fp);`
## DESCRIPTION
`notcurses_init` prepares the `FILE*` provided as `fp` (which must be attached
to a terminal) for cursor-addressable (multiline) mode. The `struct
notcurses_option` passed as `opts` controls behavior. Only one instance should
be associated with a given terminal at a time, though it is no problem to have
multiple instances in a given process. On success, a pointer to a valid `struct
notcurses` is returned. `NULL` is returned on failure. Before the process exits,
`notcurses_stop(3)` should be called to reset the terminal and free up
resources.
An appropriate `terminfo(5)` entry must exist for the terminal. This entry is
usually selected using the value of the `TERM` environment variable (see
`getenv(3)`), but a non-`NULL` value for `termtype` will override this. An
invalid terminfo specification can lead to reduced performance, reduced
display capabilities, and/or display errors. notcurses natively targets
24bpp/8bpc RGB color, and it is thus desirable to use a terminal with the
`rgb` capability (e.g. xterm's `xterm-direct`).
If the terminal advertises support for an "alternate screen" via the `smcup`
terminfo capability, notcurses will employ it by default. This can be prevented
by setting `inhibit_alternate_screen` to `true`. Users tend to have strong
opinions regarding the alternate screen, so it's often useful to expose this
via a command-line option.
notcurses furthermore hides the cursor by default, but `retain_cursor` can
prevent this (the cursor can be dynamically enabled or disabled during
execution via `notcurses_cursor_enable(3)` and `notcurses_cursor_disable(3)`.
If `clear_screen_start` is set to `true`, the screen will be cleared as part of
`notcurses_init`. Otherwise, whatever's on the screen at entry will remain
there until changed.
`notcurses_init` typically emits some diagnostics at startup, including version
information and some details of the configured terminal. This can be inhibited
with `suppress_banner`. This will also inhibit the performance summary normally
printed by `notcurses_stop`.
### Fatal signals
It is important to reset the terminal before exiting, whether terminating due
to intended operation or a received signal. This is usually accomplished by
explicitly calling `notcurses_stop` during shutdown. For convenience, notcurses
by default installs signal handlers for various signals typically resulting in
process termination (see `signal(7)`). These signal handlers call
`notcurses_stop` for each `struct notcurses` in the process, and then propagate
the signal to any previously-configured handler. These handlers are disabled
upon entry to `notcurses_stop`.
To prevent signal handler registration, set `no_quit_sighandlers` to `true`.
No means is provided to selectively register fatal signal handlers. If this is
done, the caller ought be sure to effect similar functionality themselves.
### Resize events
`SIGWINCH` (SIGnal WINdow CHange) is delivered to the process when the terminal
is resized. The default action is to ignore it (`SIG_IGN`). notcurses installs
a handler for this signal. The handler causes notcurses to update its idea of
the terminal's size using `TIOCGWINSZ` (see `ioctl_tty(2)`), and generates an
`NCKEY_RESIZE` input event (see `notcurses_input(3)`. This signal handler can be
inhibited by setting `no_winch_sighandler` to `true`. If this is done, the
caller should probably watch for the signal, and invoke `notcurses_resize()`
upon its receipt.
A resize event does not invalidate any references returned earlier by
notcurses. The content of any new screen area is undefined until the next call
to `notcurses_render(3)`, unless `clear_screen_start` is set `true`, in which
case new area is cleared. This is true even if an existing `struct ncplane`
(see `notcurses_ncplane(3)`) overlaps the new area, since the signal could
arrive while the ncplanes are being modified. Signal handlers are quite
restricted as to what actions they can perform, so minimal work is perfomed in
the handler proper.
Thus, in the absence of `no_winch_sighandler`, `SIGWINCH` results in:
* interruption of some thread to process the signal
* a `TIOCGWINSZ` `ioctl` to retrieve the new screen size
* queuing of a `NCKEY_RESIZE` input event (if there is space in the queue)
* blanking of the new screen area (if `clear_screen_start` is set)
Upon the next call to `notcurses_render` or `notcurses_resize`, the standard
plane (see `notcurses_stdplane(3)`) will be resized to the new screen size. The
next `notcurses_render` call will function as expected across the new screen
geometry.
## RETURN VALUES
`NULL` is returned on failure. Otherwise, the return value points at a valid
`struct notcurses`, which can be used until it is provided to `notcurses_stop`.
## AUTHORS
Nick Black <nickblack@linux.com>
## SEE ALSO
getenv(3), termios(3), notcurses(3), notcurses_input(3), notcurses_ncplane(3),
notcurses_render(3), notcurses_stop(3), terminfo(5), signal(7)