libtty - a library for handling vt100-like pseudo-terminals
#include <tty.h>
Link with -ltty.
- tty tty_init(int
sx, int sy, int
resizable);
- Creates a new vt100 terminal, of size sxXsy. If you want
user input to be allowed to change that size, set resizable to
non-zero.
- int tty_resize(tty
vt, int nsx, int
nsy);
- Resizes the vt to nsxXnsy. This works even on
terminals marked as non-resizable since that prevents only user input from
resizing, not you.
- void tty_reset(tty
vt);
- Clears the screen and attributes.
- void tty_free(tty
vt);
- Deallocates the vt and all its internal structures.
- void tty_write(tty
vt, const char *buf, int
len);
- Writes len bytes into the terminal, parsing them as vt100
codes.
- void tty_printf(tty
vt, const char *fmt,
...);
- Does a printf into the terminal.
- tty tty_copy(tty
vt);
- Allocates a new vt100 terminal, making it an exact copy of an existing
one, including its internal state. Attached event callbacks are not
copied.
- uint32_t
tty_color_convert(uint32_t c, uint32_t
to);
- Converts color values between modes: VT100_COLOR_OFF, VT100_COLOR_16,
VT100_COLOR_256, VT100_COLOR_RGB.
TTY event callbacks
Well, you have written some data to the terminal. Now you probably
want to put it somewhere. What now? The tty structure has a number of
event hooks that you can attach your functions to.
These hooks are callbacks inside the tty structure that you
can set. The callback fields are:
- void
*l_data;
- it's a place to put your private data in
- void (*l_char)(tty
vt, int x, int y, ucs
ch, int attr, int
width);
- after a character has been written to the screen; the cursor advances by
width which might be 1 (regular) or 2 (CJK
"fullwidth")
- void (*l_cursor)(tty
vt, int x, int y);
- after the cursor has moved
- void (*l_clear)(tty
vt, int x, int y, int
len);
- after a chunk of screen has been cleared
If an endpoint spills outside of the current line, it will go
all the way to an end of screen.
If the cursor moves, you'll get a separate l_cursor,
although it is already in place during the l_clear call.
- void (*l_scroll)(tty
vt, int nl);
- after the region s1<=y<s2 is scrolled nl lines (nl<0 ->
backwards, nl>0 -> forward).
There's no separare l_cursor event, cx and
cy are already updated.
- void (*l_flag)(tty
vt, int f, int v);
- when a flag changes to v. Flags that are likely to be of interest
to you are:
- void (*l_osc)(tty
vt, int cmd, const char
*str);
- when a string command has been issued; most commands alter a color
palette, but the most interesting one is 0: "set window
title"
- void (*l_resize)(tty
vt, int sx, int sy);
- after the terminal has been resized
- void (*l_flush)(tty
vt);
- when a write chunk ends
- void (*l_bell)(tty
vt);
- upon a beep
- void (*l_free)(tty
vt);
- before the terminal is destroyed
For the case when you want the output go to a real terminal, there
are:
- void vtvt_attach(tty
vt, FILE *f, int
dump);
- Attaches the FILE stream f to terminal vt. Usually, f
will be stdout. Whenever the contents of vt changes,
appropriate data will be written to the stream as well. If dump is
non-zero, the current state will be drawn, otherwise, only subsequent
changes will be shown.
The redirection will last until the terminal is destroyed by
tty_free().
- void vtvt_resize(tty
vt, int sx, int sy);
- Tells libtty that the real terminal has been resized (for resizing
the virtual one, please use tty_resize()).
- void vtvt_dump(tty
vt);
- Forces a full-screen redraw of the current contents of vt.