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.