                         Writing Programs with NCURSES

     by Eric S. Raymond and Zeyd M. Ben-Halim
     updates since release 1.9.9e by Thomas Dickey

                                   Contents

     * Introduction
          + A Brief History of Curses
          + Scope of This Document
          + Terminology
     * The Curses Library
          + An Overview of Curses
               o Compiling Programs using Curses
               o Updating the Screen
               o Standard Windows and Function Naming Conventions
               o Variables
          + Using the Library
               o Starting up
               o Output
               o Input
               o Using Forms Characters
               o Character Attributes and Color
               o Mouse Interfacing
               o Finishing Up
          + Function Descriptions
               o Initialization and Wrapup
               o Causing Output to the Terminal
               o Low-Level Capability Access
               o Debugging
          + Hints, Tips, and Tricks
               o Some Notes of Caution
               o Temporarily Leaving ncurses Mode
               o Using ncurses under xterm
               o Handling Multiple Terminal Screens
               o Testing for Terminal Capabilities
               o Tuning for Speed
               o Special Features of ncurses
          + Compatibility with Older Versions
               o Refresh of Overlapping Windows
               o Background Erase
          + XSI Curses Conformance
     * The Panels Library
          + Compiling With the Panels Library
          + Overview of Panels
          + Panels, Input, and the Standard Screen
          + Hiding Panels
          + Miscellaneous Other Facilities
     * The Menu Library
          + Compiling with the menu Library
          + Overview of Menus
          + Selecting items
          + Menu Display
          + Menu Windows
          + Processing Menu Input
          + Miscellaneous Other Features
     * The Forms Library
          + Compiling with the forms Library
          + Overview of Forms
          + Creating and Freeing Fields and Forms
          + Fetching and Changing Field Attributes
               o Fetching Size and Location Data
               o Changing the Field Location
               o The Justification Attribute
               o Field Display Attributes
               o Field Option Bits
               o Field Status
               o Field User Pointer
          + Variable-Sized Fields
          + Field Validation
               o TYPE_ALPHA
               o TYPE_ALNUM
               o TYPE_ENUM
               o TYPE_INTEGER
               o TYPE_NUMERIC
               o TYPE_REGEXP
          + Direct Field Buffer Manipulation
          + Attributes of Forms
          + Control of Form Display
          + Input Processing in the Forms Driver
               o Page Navigation Requests
               o Inter-Field Navigation Requests
               o Intra-Field Navigation Requests
               o Scrolling Requests
               o Field Editing Requests
               o Order Requests
               o Application Commands
          + Field Change Hooks
          + Field Change Commands
          + Form Options
          + Custom Validation Types
               o Union Types
               o New Field Types
               o Validation Function Arguments
               o Order Functions For Custom Types
               o Avoiding Problems
     _________________________________________________________________

                                 Introduction

   This document is an introduction to programming with curses. It is not
   an   exhaustive  reference  for  the  curses  Application  Programming
   Interface  (API);  that  role  is  filled  by the curses manual pages.
   Rather,  it  is  intended  to  help  C programmers ease into using the
   package.

   This   document  is  aimed  at  C  applications  programmers  not  yet
   specifically  familiar with ncurses. If you are already an experienced
   curses  programmer, you should nevertheless read the sections on Mouse
   Interfacing,  Debugging, Compatibility with Older Versions, and Hints,
   Tips,  and  Tricks.  These  will  bring you up to speed on the special
   features  and  quirks of the ncurses implementation. If you are not so
   experienced, keep reading.

   The  curses  package  is a subroutine library for terminal-independent
   screen-painting  and  input-event handling which presents a high level
   screen  model  to  the programmer, hiding differences between terminal
   types  and doing automatic optimization of output to change one screen
   full  of  text into another. Curses uses terminfo, which is a database
   format  that  can  describe the capabilities of thousands of different
   terminals.

   The  curses  API  may  seem  something of an archaism on UNIX desktops
   increasingly  dominated  by  X,  Motif, and Tcl/Tk. Nevertheless, UNIX
   still  supports  tty lines and X supports xterm(1); the curses API has
   the advantage of (a) back-portability to character-cell terminals, and
   (b)  simplicity.  For  an application that does not require bit-mapped
   graphics  and multiple fonts, an interface implementation using curses
   will  typically  be  a  great deal simpler and less expensive than one
   using an X toolkit.

A Brief History of Curses

   Historically, the first ancestor of curses was the routines written to
   provide   screen-handling   for   the   game  rogue;  these  used  the
   already-existing  termcap  database  facility  for describing terminal
   capabilities. These routines were abstracted into a documented library
   and first released with the early BSD UNIX versions.

   System  III UNIX from Bell Labs featured a rewritten and much-improved
   curses  library.  It introduced the terminfo format. Terminfo is based
   on  Berkeley's termcap database, but contains a number of improvements
   and  extensions.  Parameterized  capabilities strings were introduced,
   making  it  possible to describe multiple video attributes, and colors
   and  to  handle far more unusual terminals than possible with termcap.
   In  the  later  AT&T  System  V  releases,  curses evolved to use more
   facilities and offer more capabilities, going far beyond BSD curses in
   power and flexibility.

Scope of This Document

   This document describes ncurses, a free implementation of the System V
   curses  API  with  some  clearly  marked  extensions.  It includes the
   following System V curses features:
     * Support  for  multiple  screen  highlights  (BSD curses could only
       handle one `standout' highlight, usually reverse-video).
     * Support for line- and box-drawing using forms characters.
     * Recognition of function keys on input.
     * Color support.
     * Support  for pads (windows of larger than screen size on which the
       screen or a subwindow defines a viewport).

   Also,  this  package  makes  use  of  the  insert  and delete line and
   character  features  of  terminals  so equipped, and determines how to
   optimally  use  these  features  with  no help from the programmer. It
   allows  arbitrary  combinations  of  video attributes to be displayed,
   even  on  terminals that leave ``magic cookies'' on the screen to mark
   changes in attributes.

   The  ncurses  package  can  also  capture and use event reports from a
   mouse in some environments (notably, xterm under the X window system).
   This document includes tips for using the mouse.

   The  ncurses  package  was  originated  by  Pavel Curtis. The original
   maintainer  of  this  package is Zeyd Ben-Halim <zmbenhal@netcom.com>.
   Eric S. Raymond <esr@snark.thyrsus.com> wrote many of the new features
   in  versions  after 1.8.1 and wrote most of this introduction. Juergen
   Pfeifer  wrote  all  of  the  menu and forms code as well as the Ada95
   binding.  Ongoing  work  is  being done by Thomas Dickey (maintainer).
   Contact the current maintainers at bug-ncurses@gnu.org.

   This  document  also describes the panels extension library, similarly
   modeled  on  the  SVr4  panels  facility.  This  library allows you to
   associate  backing  store  with each of a stack or deck of overlapping
   windows,  and  provides  operations  for  moving windows around in the
   stack that change their visibility in the natural way (handling window
   overlaps).

   Finally,  this  document  describes  in  detail  the  menus  and forms
   extension  libraries,  also  cloned  from System V, which support easy
   construction and sequences of menus and fill-in forms.

Terminology

   In  this  document,  the following terminology is used with reasonable
   consistency:

   window
          A  data  structure  describing  a  sub-rectangle  of the screen
          (possibly  the  entire  screen).  You  can write to a window as
          though  it  were a miniature screen, scrolling independently of
          other windows on the physical screen.

   screens
          A  subset of windows which are as large as the terminal screen,
          i.e.,  they  start  at the upper left hand corner and encompass
          the   lower  right  hand  corner.  One  of  these,  stdscr,  is
          automatically provided for the programmer.

   terminal screen
          The package's idea of what the terminal display currently looks
          like, i.e., what the user sees now. This is a special screen.

                              The Curses Library

An Overview of Curses

  Compiling Programs using Curses

   In order to use the library, it is necessary to have certain types and
   variables defined. Therefore, the programmer must have a line:
          #include <curses.h>

   at the top of the program source. The screen package uses the Standard
   I/O   library,  so  <curses.h>  includes  <stdio.h>.  <curses.h>  also
   includes  <termios.h>,  <termio.h>,  or  <sgtty.h>  depending  on your
   system.  It is redundant (but harmless) for the programmer to do these
   includes,  too.  In  linking with curses you need to have -lncurses in
   your  LDFLAGS  or  on the command line. There is no need for any other
   libraries.

  Updating the Screen

   In  order  to  update  the  screen  optimally, it is necessary for the
   routines  to  know  what  the screen currently looks like and what the
   programmer  wants  it to look like next. For this purpose, a data type
   (structure)  named WINDOW is defined which describes a window image to
   the  routines,  including its starting position on the screen (the (y,
   x)  coordinates  of  the  upper left hand corner) and its size. One of
   these  (called  curscr,  for current screen) is a screen image of what
   the  terminal currently looks like. Another screen (called stdscr, for
   standard screen) is provided by default to make changes on.

   A  window is a purely internal representation. It is used to build and
   store  a potential image of a portion of the terminal. It doesn't bear
   any  necessary relation to what is really on the terminal screen; it's
   more like a scratchpad or write buffer.

   To  make  the  section  of  physical  screen corresponding to a window
   reflect  the  contents  of the window structure, the routine refresh()
   (or wrefresh() if the window is not stdscr) is called.

   A  given physical screen section may be within the scope of any number
   of  overlapping  windows.  Also, changes can be made to windows in any
   order,  without  regard  to  motion  efficiency.  Then,  at  will, the
   programmer can effectively say ``make it look like this,'' and let the
   package implementation determine the most efficient way to repaint the
   screen.

  Standard Windows and Function Naming Conventions

   As  hinted  above,  the  routines can use several windows, but two are
   automatically given: curscr, which knows what the terminal looks like,
   and  stdscr,  which  is what the programmer wants the terminal to look
   like  next.  The  user  should  never actually access curscr directly.
   Changes  should  be  made  to  through  the  API, and then the routine
   refresh() (or wrefresh()) called.

   Many  functions  are  defined  to  use stdscr as a default screen. For
   example,  to  add  a  character  to stdscr, one calls addch() with the
   desired character as argument. To write to a different window. use the
   routine  waddch()  (for  `w'indow-specific  addch()) is provided. This
   convention of prepending function names with a `w' when they are to be
   applied  to specific windows is consistent. The only routines which do
   not follow it are those for which a window must always be specified.

   In  order  to  move  the  current (y, x) coordinates from one point to
   another,  the routines move() and wmove() are provided. However, it is
   often  desirable to first move and then perform some I/O operation. In
   order  to  avoid  clumsiness, most I/O routines can be preceded by the
   prefix  'mv'  and  the  desired  (y,  x)  coordinates prepended to the
   arguments to the function. For example, the calls
          move(y, x);
          addch(ch);

   can be replaced by
          mvaddch(y, x, ch);

   and
          wmove(win, y, x);
          waddch(win, ch);

   can be replaced by
          mvwaddch(win, y, x, ch);

   Note  that the window description pointer (win) comes before the added
   (y,  x)  coordinates.  If  a function requires a window pointer, it is
   always the first parameter passed.

  Variables

   The  curses  library  sets  some  variables  describing  the  terminal
   capabilities.
      type   name      description
      ------------------------------------------------------------------
      int    LINES     number of lines on the terminal
      int    COLS      number of columns on the terminal

   The  curses.h  also  introduces  some  #define  constants and types of
   general usefulness:

   bool
          boolean type, actually a `char' (e.g., bool doneit;)

   TRUE
          boolean `true' flag (1).

   FALSE
          boolean `false' flag (0).

   ERR
          error flag returned by routines on a failure (-1).

   OK
          error flag returned by routines when things go right.

Using the Library

   Now  we  describe  how  to  actually use the screen package. In it, we
   assume  all  updating,  reading,  etc.  is  applied  to  stdscr. These
   instructions  will  work  on  any  window,  providing  you  change the
   function names and parameters as mentioned above.

   Here is a sample program to motivate the discussion:
#include <curses.h>
#include <signal.h>

static void finish(int sig);

int
main(int argc, char *argv[])
{
    int num = 0;

    /* initialize your non-curses data structures here */

    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */

    (void) initscr();      /* initialize the curses library */
    keypad(stdscr, TRUE);  /* enable keyboard mapping */
    (void) nonl();         /* tell curses not to do NL->CR/NL on output */
    (void) cbreak();       /* take input chars one at a time, no wait for \n */
    (void) echo();         /* echo input - in color */

    if (has_colors())
    {
        start_color();

        /*
         * Simple color assignment, often all we need.  Color pair 0 cannot
         * be redefined.  This example uses the same value for the color
         * pair as for the foreground color, though of course that is not
         * necessary:
         */
        init_pair(1, COLOR_RED,     COLOR_BLACK);
        init_pair(2, COLOR_GREEN,   COLOR_BLACK);
        init_pair(3, COLOR_YELLOW,  COLOR_BLACK);
        init_pair(4, COLOR_BLUE,    COLOR_BLACK);
        init_pair(5, COLOR_CYAN,    COLOR_BLACK);
        init_pair(6, COLOR_MAGENTA, COLOR_BLACK);
        init_pair(7, COLOR_WHITE,   COLOR_BLACK);
    }

    for (;;)
    {
        int c = getch();     /* refresh, accept single keystroke of input */
        attrset(COLOR_PAIR(num % 8));
        num++;

        /* process the command keystroke */
    }

    finish(0);               /* we're done */
}

static void finish(int sig)
{
    endwin();

    /* do your non-curses wrapup here */

    exit(0);
}

  Starting up

   In  order  to  use  the  screen  package, the routines must know about
   terminal  characteristics, and the space for curscr and stdscr must be
   allocated.  These  function initscr() does both these things. Since it
   must  allocate  space  for  the  windows,  it can overflow memory when
   attempting  to  do  so.  On the rare occasions this happens, initscr()
   will  terminate  the  program  with  an  error message. initscr() must
   always  be  called before any of the routines which affect windows are
   used.  If  it  is  not,  the  program will core dump as soon as either
   curscr  or  stdscr are referenced. However, it is usually best to wait
   to  call  it  until  after  you  are sure you will need it, like after
   checking  for  startup  errors. Terminal status changing routines like
   nl() and cbreak() should be called after initscr().

   Once  the  screen windows have been allocated, you can set them up for
   your  program.  If  you  want  to,  say, allow a screen to scroll, use
   scrollok().  If you want the cursor to be left in place after the last
   change,  use  leaveok().  If  this isn't done, refresh() will move the
   cursor to the window's current (y, x) coordinates after updating it.

   You  can  create new windows of your own using the functions newwin(),
   derwin(), and subwin(). The routine delwin() will allow you to get rid
   of  old windows. All the options described above can be applied to any
   window.

  Output

   Now  that  we  have set things up, we will want to actually update the
   terminal.  The basic functions used to change what will go on a window
   are addch() and move(). addch() adds a character at the current (y, x)
   coordinates. move() changes the current (y, x) coordinates to whatever
   you want them to be. It returns ERR if you try to move off the window.
   As  mentioned above, you can combine the two into mvaddch() to do both
   things at once.

   The  other  output  functions, such as addstr() and printw(), all call
   addch() to add characters to the window.

   After  you  have  put on the window what you want there, when you want
   the  portion  of the terminal covered by the window to be made to look
   like  it,  you  must  call  refresh().  In  order  to optimize finding
   changes,  refresh()  assumes  that  any part of the window not changed
   since  the  last  refresh() of that window has not been changed on the
   terminal,  i.e., that you have not refreshed a portion of the terminal
   with  an  overlapping  window.  If  this  is not the case, the routine
   touchwin() is provided to make it look like the entire window has been
   changed,  thus  making  refresh()  check  the  whole subsection of the
   terminal for changes.

   If  you  call wrefresh() with curscr as its argument, it will make the
   screen  look  like  curscr  thinks  it  looks like. This is useful for
   implementing  a  command  which would redraw the screen in case it get
   messed up.

  Input

   The  complementary  function  to  addch() is getch() which, if echo is
   set, will call addch() to echo the character. Since the screen package
   needs  to know what is on the terminal at all times, if characters are
   to  be  echoed, the tty must be in raw or cbreak mode. Since initially
   the  terminal  has echoing enabled and is in ordinary ``cooked'' mode,
   one or the other has to changed before calling getch(); otherwise, the
   program's output will be unpredictable.

   When you need to accept line-oriented input in a window, the functions
   wgetstr() and friends are available. There is even a wscanw() function
   that  can  do  scanf()(3)-style  multi-field  parsing on window input.
   These  pseudo-line-oriented  functions  turn  on  echoing  while  they
   execute.

   The  example  code  above uses the call keypad(stdscr, TRUE) to enable
   support  for function-key mapping. With this feature, the getch() code
   watches  the  input  stream for character sequences that correspond to
   arrow   and   function   keys.   These   sequences   are  returned  as
   pseudo-character values. The #define values returned are listed in the
   curses.h The mapping from sequences to #define values is determined by
   key_ capabilities in the terminal's terminfo entry.

  Using Forms Characters

   The  addch()  function (and some others, including box() and border())
   can accept some pseudo-character arguments which are specially defined
   by  ncurses.  These  are #define values set up in the curses.h header;
   see there for a complete list (look for the prefix ACS_).

   The  most  useful of the ACS defines are the forms-drawing characters.
   You  can  use  these to draw boxes and simple graphs on the screen. If
   the  terminal does not have such characters, curses.h will map them to
   a recognizable (though ugly) set of ASCII defaults.

  Character Attributes and Color

   The  ncurses  package  supports  screen highlights including standout,
   reverse-video,  underline, and blink. It also supports color, which is
   treated as another kind of highlight.

   Highlights   are   encoded,   internally,   as   high   bits   of  the
   pseudo-character  type  (chtype)  that  curses.h uses to represent the
   contents of a screen cell. See the curses.h header file for a complete
   list of highlight mask values (look for the prefix A_).

   There  are two ways to make highlights. One is to logical-or the value
   of  the  highlights you want into the character argument of an addch()
   call, or any other output call that takes a chtype argument.

   The other is to set the current-highlight value. This is logical-or'ed
   with  any  highlight  you  specify the first way. You do this with the
   functions attron(), attroff(), and attrset(); see the manual pages for
   details.  Color  is  a special kind of highlight. The package actually
   thinks  in  terms  of  color  pairs,  combinations  of  foreground and
   background  colors.  The  sample code above sets up eight color pairs,
   all  of the guaranteed-available colors on black. Note that each color
   pair  is, in effect, given the name of its foreground color. Any other
   range  of  eight  non-conflicting  values  could have been used as the
   first arguments of the init_pair() values.

   Once you've done an init_pair() that creates color-pair N, you can use
   COLOR_PAIR(N)  as  a  highlight  that  invokes  that  particular color
   combination.  Note  that  COLOR_PAIR(N),  for  constant N, is itself a
   compile-time constant and can be used in initializers.

  Mouse Interfacing

   The ncurses library also provides a mouse interface.

     NOTE:  this  facility  is  specific  to  ncurses, it is not part of
     either  the XSI Curses standard, nor of System V Release 4, nor BSD
     curses.  System  V  Release  4  curses  contains  code with similar
     interface  definitions, however it is not documented. Other than by
     disassembling  the library, we have no way to determine exactly how
     that   mouse   code   works.  Thus,  we  recommend  that  you  wrap
     mouse-related   code   in   an   #ifdef  using  the  feature  macro
     NCURSES_MOUSE_VERSION  so  it  will  not  be compiled and linked on
     non-ncurses systems.

   Presently, mouse event reporting works in the following environments:
     * xterm and similar programs such as rxvt.
     * Linux  console,  when  configured with gpm(1), Alessandro Rubini's
       mouse server.
     * FreeBSD sysmouse (console)
     * OS/2 EMX

   The  mouse  interface  is  very  simple.  To  activate it, you use the
   function  mousemask(),  passing  it  as first argument a bit-mask that
   specifies  what  kinds  of  events you want your program to be able to
   see.  It  will  return  the  bit-mask  of  events that actually become
   visible, which may differ from the argument if the mouse device is not
   capable of reporting some of the event types you specify.

   Once the mouse is active, your application's command loop should watch
   for  a  return  value of KEY_MOUSE from wgetch(). When you see this, a
   mouse  event report has been queued. To pick it off the queue, use the
   function  getmouse()  (you  must  do  this  before  the next wgetch(),
   otherwise  another  mouse  event  might come in and make the first one
   inaccessible).

   Each call to getmouse() fills a structure (the address of which you'll
   pass  it)  with mouse event data. The event data includes zero-origin,
   screen-relative  character-cell  coordinates  of the mouse pointer. It
   also  includes  an  event  mask.  Bits  in  this  mask  will  be  set,
   corresponding to the event type being reported.

   The  mouse  structure  contains  two  additional  fields  which may be
   significant  in  the  future  as  ncurses  interfaces  to new kinds of
   pointing  device.  In addition to x and y coordinates, there is a slot
   for  a  z coordinate; this might be useful with touch-screens that can
   return  a  pressure  or  duration parameter. There is also a device ID
   field,  which  could  be used to distinguish between multiple pointing
   devices.

   The   class  of  visible  events  may  be  changed  at  any  time  via
   mousemask().  Events  that  can be reported include presses, releases,
   single-,   double-   and   triple-clicks  (you  can  set  the  maximum
   button-down  time  for clicks). If you don't make clicks visible, they
   will  be  reported  as  press-release pairs. In some environments, the
   event  mask  may  include  bits reporting the state of shift, alt, and
   ctrl keys on the keyboard during the event.

   A  function  to check whether a mouse event fell within a given window
   is  also  supplied.  You  can  use  this to see whether a given window
   should consider a mouse event relevant to it.

   Because   mouse   event   reporting  will  not  be  available  in  all
   environments,  it  would  be unwise to build ncurses applications that
   require  the  use  of  a  mouse. Rather, you should use the mouse as a
   shortcut  for point-and-shoot commands your application would normally
   accept  from  the  keyboard.  Two  of  the  test  games in the ncurses
   distribution  (bs  and  knight) contain code that illustrates how this
   can be done.

   See   the   manual   page  curs_mouse(3X)  for  full  details  of  the
   mouse-interface functions.

  Finishing Up

   In  order to clean up after the ncurses routines, the routine endwin()
   is  provided.  It  restores tty modes to what they were when initscr()
   was  first called, and moves the cursor down to the lower-left corner.
   Thus,  anytime  after  the  call to initscr, endwin() should be called
   before exiting.

Function Descriptions

   We  describe  the detailed behavior of some important curses functions
   here, as a supplement to the manual page descriptions.

  Initialization and Wrapup

   initscr()
          The  first  function  called should almost always be initscr().
          This  will  determine  the  terminal type and initialize curses
          data structures. initscr() also arranges that the first call to
          refresh()  will  clear the screen. If an error occurs a message
          is  written  to standard error and the program exits. Otherwise
          it  returns  a pointer to stdscr. A few functions may be called
          before  initscr (slk_init(), filter(), ripoffline(), use_env(),
          and, if you are using multiple terminals, newterm().)

   endwin()
          Your  program  should  always  call  endwin() before exiting or
          shelling  out  of  the  program. This function will restore tty
          modes,  move the cursor to the lower left corner of the screen,
          reset  the  terminal  into  the proper non-visual mode. Calling
          refresh()  or  doupdate()  after  a  temporary  escape from the
          program will restore the ncurses screen from before the escape.

   newterm(type, ofp, ifp)
          A  program  which  outputs to more than one terminal should use
          newterm() instead of initscr(). newterm() should be called once
          for each terminal. It returns a variable of type SCREEN * which
          should  be  saved  as  a  reference  to that terminal. (NOTE: a
          SCREEN  variable is not a screen in the sense we are describing
          in  this  introduction,  but a collection of parameters used to
          assist  in  optimizing the display.) The arguments are the type
          of the terminal (a string) and FILE pointers for the output and
          input  of  the  terminal.  If type is NULL then the environment
          variable  $TERM  is used. endwin() should called once at wrapup
          time for each terminal opened using this function.

   set_term(new)
          This  function  is  used  to  switch  to  a  different terminal
          previously  opened  by  newterm(). The screen reference for the
          new  terminal is passed as the parameter. The previous terminal
          is  returned  by  the function. All other calls affect only the
          current terminal.

   delscreen(sp)
          The  inverse  of  newterm();  deallocates  the  data structures
          associated with a given SCREEN reference.

  Causing Output to the Terminal

   refresh() and wrefresh(win)
          These  functions  must  be called to actually get any output on
          the   terminal,   as  other  routines  merely  manipulate  data
          structures.  wrefresh() copies the named window to the physical
          terminal  screen,  taking into account what is already there in
          order  to do optimizations. refresh() does a refresh of stdscr.
          Unless  leaveok()  has been enabled, the physical cursor of the
          terminal is left at the location of the window's cursor.

   doupdate() and wnoutrefresh(win)
          These two functions allow multiple updates with more efficiency
          than  wrefresh.  To use them, it is important to understand how
          curses  works. In addition to all the window structures, curses
          keeps  two  data structures representing the terminal screen: a
          physical screen, describing what is actually on the screen, and
          a  virtual screen, describing what the programmer wants to have
          on the screen. wrefresh works by first copying the named window
          to  the  virtual  screen (wnoutrefresh()), and then calling the
          routine  to  update  the screen (doupdate()). If the programmer
          wishes  to output several windows at once, a series of calls to
          wrefresh will result in alternating calls to wnoutrefresh() and
          doupdate(),  causing several bursts of output to the screen. By
          calling  wnoutrefresh() for each window, it is then possible to
          call  doupdate()  once,  resulting in only one burst of output,
          with  fewer  total  characters  transmitted (this also avoids a
          visually annoying flicker at each update).

  Low-Level Capability Access

   setupterm(term, filenum, errret)
          This  routine is called to initialize a terminal's description,
          without setting up the curses screen structures or changing the
          tty-driver mode bits. term is the character string representing
          the  name  of the terminal being used. filenum is the UNIX file
          descriptor  of  the terminal to be used for output. errret is a
          pointer to an integer, in which a success or failure indication
          is  returned. The values returned can be 1 (all is well), 0 (no
          such  terminal),  or  -1  (some  problem  locating the terminfo
          database).

          The  value  of  term can be given as NULL, which will cause the
          value of TERM in the environment to be used. The errret pointer
          can  also be given as NULL, meaning no error code is wanted. If
          errret is defaulted, and something goes wrong, setupterm() will
          print  an  appropriate  error  message  and  exit,  rather than
          returning.  Thus,  a simple program can call setupterm(0, 1, 0)
          and not worry about initialization errors.

          After  the call to setupterm(), the global variable cur_term is
          set to point to the current structure of terminal capabilities.
          By  calling  setupterm()  for  each  terminal,  and  saving and
          restoring  cur_term, it is possible for a program to use two or
          more  terminals  at  once.  Setupterm()  also  stores the names
          section  of  the  terminal  description in the global character
          array ttytype[]. Subsequent calls to setupterm() will overwrite
          this array, so you'll have to save it yourself if need be.

  Debugging

     NOTE: These functions are not part of the standard curses API!

   trace()
          This  function  can be used to explicitly set a trace level. If
          the  trace  level  is  nonzero,  execution of your program will
          generate a file called `trace' in the current working directory
          containing  a  report  on  the  library's actions. Higher trace
          levels  enable  more  detailed  (and  verbose) reporting -- see
          comments  attached  to  TRACE_ defines in the curses.h file for
          details. (It is also possible to set a trace level by assigning
          a trace level value to the environment variable NCURSES_TRACE).

   _tracef()
          This  function  can  be  used  to  output  your  own  debugging
          information.  It  is  only  available  only  if  you  link with
          -lncurses_g.  It  can be used the same way as printf(), only it
          outputs  a  newline after the end of arguments. The output goes
          to a file called trace in the current directory.

   Trace  logs  can  be difficult to interpret due to the sheer volume of
   data dumped in them. There is a script called tracemunch included with
   the  ncurses distribution that can alleviate this problem somewhat; it
   compacts  long  sequences  of  similar  operations  into more succinct
   single-line  pseudo-operations.  These pseudo-ops can be distinguished
   by the fact that they are named in capital letters.

Hints, Tips, and Tricks

   The ncurses manual pages are a complete reference for this library. In
   the remainder of this document, we discuss various useful methods that
   may not be obvious from the manual page descriptions.

  Some Notes of Caution

   If  you  find yourself thinking you need to use noraw() or nocbreak(),
   think  again  and  move  carefully. It's probably better design to use
   getstr()  or one of its relatives to simulate cooked mode. The noraw()
   and  nocbreak() functions try to restore cooked mode, but they may end
   up   clobbering   some  control  bits  set  before  you  started  your
   application.  Also,  they  have always been poorly documented, and are
   likely   to  hurt  your  application's  usability  with  other  curses
   libraries.

   Bear  in  mind that refresh() is a synonym for wrefresh(stdscr). Don't
   try  to  mix use of stdscr with use of windows declared by newwin(); a
   refresh()  call will blow them off the screen. The right way to handle
   this  is  to  use  subwin(),  or not touch stdscr at all and tile your
   screen  with  declared windows which you then wnoutrefresh() somewhere
   in  your  program event loop, with a single doupdate() call to trigger
   actual repainting.

   You  are  much  less  likely  to  run into problems if you design your
   screen   layouts   to  use  tiled  rather  than  overlapping  windows.
   Historically,  curses  support  for overlapping windows has been weak,
   fragile,  and  poorly  documented.  The  ncurses library is not yet an
   exception to this rule.

   There  is  a  panels library included in the ncurses distribution that
   does  a  pretty  good  job  of  strengthening  the overlapping-windows
   facilities.

   Try to avoid using the global variables LINES and COLS. Use getmaxyx()
   on  the stdscr context instead. Reason: your code may be ported to run
   in  an  environment with window resizes, in which case several screens
   could be open with different sizes.

  Temporarily Leaving NCURSES Mode

   Sometimes  you  will  want  to write a program that spends most of its
   time  in  screen  mode,  but occasionally returns to ordinary `cooked'
   mode.  A common reason for this is to support shell-out. This behavior
   is simple to arrange in ncurses.

   To  leave  ncurses  mode,  call  endwin()  as  you  would  if you were
   intending  to terminate the program. This will take the screen back to
   cooked  mode;  you  can  do your shell-out. When you want to return to
   ncurses  mode,  simply call refresh() or doupdate(). This will repaint
   the screen.

   There  is  a  boolean function, isendwin(), which code can use to test
   whether ncurses screen mode is active. It returns TRUE in the interval
   between an endwin() call and the following refresh(), FALSE otherwise.

   Here is some sample code for shellout:
    addstr("Shelling out...");
    def_prog_mode();           /* save current tty modes */
    endwin();                  /* restore original tty modes */
    system("sh");              /* run shell */
    addstr("returned.\n");     /* prepare return message */
    refresh();                 /* restore save modes, repaint screen */

  Using NCURSES under XTERM

   A  resize  operation  in  X  sends SIGWINCH to the application running
   under  xterm.  The  easiest way to handle SIGWINCH is to do an endwin,
   followed  by  an  refresh  and a screen repaint you code yourself. The
   refresh will pick up the new screen size from the xterm's environment.

   That  is the standard way, of course (it even works with some vendor's
   curses  implementations). Its drawback is that it clears the screen to
   reinitialize the display, and does not resize subwindows which must be
   shrunk.   Ncurses  provides  an  extension  which  works  better,  the
   resizeterm  function.  That  function  ensures  that  all  windows are
   limited  to  the new screen dimensions, and pads stdscr with blanks if
   the screen is larger.

   The ncurses library provides a SIGWINCH signal handler, which pushes a
   KEY_RESIZE  via the wgetch() calls. When ncurses returns that code, it
   calls  resizeterm  to update the size of the standard screen's window,
   repainting that (filling with blanks or truncating as needed). It also
   resizes other windows, but its effect may be less satisfactory because
   it  cannot  know  how you want the screen re-painted. You will usually
   have to write special-purpose code to handle KEY_RESIZE yourself.

  Handling Multiple Terminal Screens

   The initscr() function actually calls a function named newterm() to do
   most  of  its  work.  If you are writing a program that opens multiple
   terminals, use newterm() directly.

   For  each call, you will have to specify a terminal type and a pair of
   file  pointers;  each  call will return a screen reference, and stdscr
   will be set to the last one allocated. You will switch between screens
   with  the  set_term  call.  Note  that  you  will  also  have  to call
   def_shell_mode and def_prog_mode on each tty yourself.

  Testing for Terminal Capabilities

   Sometimes you may want to write programs that test for the presence of
   various  capabilities before deciding whether to go into ncurses mode.
   An  easy way to do this is to call setupterm(), then use the functions
   tigetflag(), tigetnum(), and tigetstr() to do your testing.

   A  particularly  useful  case  of this often comes up when you want to
   test  whether  a  given  terminal  type  should  be treated as `smart'
   (cursor-addressable) or `stupid'. The right way to test this is to see
   if the return value of tigetstr("cup") is non-NULL. Alternatively, you
   can  include  the  term.h  file  and  test  the  value  of  the  macro
   cursor_address.

  Tuning for Speed

   Use  the  addchstr()  family  of functions for fast screen-painting of
   text  when  you  know the text doesn't contain any control characters.
   Try  to  make  attribute changes infrequent on your screens. Don't use
   the immedok() option!

  Special Features of NCURSES

   The  wresize()  function  allows  you to resize a window in place. The
   associated   resizeterm()  function  simplifies  the  construction  of
   SIGWINCH handlers, for resizing all windows.

   The define_key() function allows you to define at runtime function-key
   control  sequences  which  are  not  in  the terminal description. The
   keyok()   function   allows  you  to  temporarily  enable  or  disable
   interpretation of any function-key control sequence.

   The use_default_colors() function allows you to construct applications
   which  can use the terminal's default foreground and background colors
   as  an  additional "default" color. Several terminal emulators support
   this feature, which is based on ISO 6429.

   Ncurses  supports  up 16 colors, unlike SVr4 curses which defines only
   8. While most terminals which provide color allow only 8 colors, about
   a quarter (including XFree86 xterm) support 16 colors.

Compatibility with Older Versions

   Despite  our  best efforts, there are some differences between ncurses
   and  the  (undocumented!)  behavior  of  older curses implementations.
   These  arise from ambiguities or omissions in the documentation of the
   API.

  Refresh of Overlapping Windows

   If  you  define two windows A and B that overlap, and then alternately
   scribble  on  and  refresh  them,  the changes made to the overlapping
   region  under  historic  curses  versions  were  often  not documented
   precisely.

   To  understand why this is a problem, remember that screen updates are
   calculated  between  two  representations  of  the entire display. The
   documentation  says that when you refresh a window, it is first copied
   to  the  virtual screen, and then changes are calculated to update the
   physical  screen (and applied to the terminal). But "copied to" is not
   very specific, and subtle differences in how copying works can produce
   different behaviors in the case where two overlapping windows are each
   being refreshed at unpredictable intervals.

   What  happens to the overlapping region depends on what wnoutrefresh()
   does  with  its  argument  --  what portions of the argument window it
   copies  to  the virtual screen. Some implementations do "change copy",
   copying  down  only locations in the window that have changed (or been
   marked  changed  with wtouchln() and friends). Some implementations do
   "entire  copy",  copying  all  window  locations to the virtual screen
   whether or not they have changed.

   The  ncurses  library  itself  has  not always been consistent on this
   score.  Due  to  a  bug,  versions  1.8.7  to  1.9.8a did entire copy.
   Versions  1.8.6  and  older,  and  versions 1.9.9 and newer, do change
   copy.

   For  most  commercial curses implementations, it is not documented and
   not  known  for sure (at least not to the ncurses maintainers) whether
   they  do  change  copy or entire copy. We know that System V release 3
   curses  has  logic in it that looks like an attempt to do change copy,
   but  the  surrounding  logic and data representations are sufficiently
   complex,  and  our  knowledge sufficiently indirect, that it's hard to
   know  whether  this  is  reliable.  It  is  not  clear  what  the SVr4
   documentation  and XSI standard intend. The XSI Curses standard barely
   mentions  wnoutrefresh();  the  SVr4  documents  seem to be describing
   entire-copy, but it is possible with some effort and straining to read
   them the other way.

   It  might  therefore  be unwise to rely on either behavior in programs
   that  might  have  to  be  linked  with  other curses implementations.
   Instead,  you  can do an explicit touchwin() before the wnoutrefresh()
   call to guarantee an entire-contents copy anywhere.

   The  really clean way to handle this is to use the panels library. If,
   when  you want a screen update, you do update_panels(), it will do all
   the  necessary  wnoutrefresh() calls for whatever panel stacking order
   you  have  defined. Then you can do one doupdate() and there will be a
   single burst of physical I/O that will do all your updates.

  Background Erase

   If you have been using a very old versions of ncurses (1.8.7 or older)
   you  may be surprised by the behavior of the erase functions. In older
   versions,  erased  areas of a window were filled with a blank modified
   by  the  window's  current attribute (as set by wattrset(), wattron(),
   wattroff() and friends).

   In  newer  versions,  this is not so. Instead, the attribute of erased
   blanks  is  normal  unless  and  until it is modified by the functions
   bkgdset() or wbkgdset().

   This change in behavior conforms ncurses to System V Release 4 and the
   XSI Curses standard.

XSI Curses Conformance

   The  ncurses  library is intended to be base-level conformant with the
   XSI  Curses  standard  from  X/Open.  Many extended-level features (in
   fact,  almost all features not directly concerned with wide characters
   and internationalization) are also supported.

   One  effect  of  XSI  conformance  is the change in behavior described
   under "Background Erase -- Compatibility with Old Versions".

   Also,  ncurses  meets the XSI requirement that every macro entry point
   have  a  corresponding  function  which  may  be  linked  (and will be
   prototype-checked) if the macro definition is disabled with #undef.

                              The Panels Library

   The  ncurses  library  by  itself  provides  good  support  for screen
   displays in which the windows are tiled (non-overlapping). In the more
   general  case  that  windows  may overlap, you have to use a series of
   wnoutrefresh()  calls  followed  by a doupdate(), and be careful about
   the order you do the window refreshes in. It has to be bottom-upwards,
   otherwise parts of windows that should be obscured will show through.

   When  your  interface design is such that windows may dive deeper into
   the  visibility  stack  or  pop  to  the top at runtime, the resulting
   book-keeping  can  be  tedious  and  difficult to get right. Hence the
   panels library.

   The  panel  library  first  appeared  in  AT&T  System  V. The version
   documented here is the panel code distributed with ncurses.

Compiling With the Panels Library

   Your  panels-using modules must import the panels library declarations
   with
          #include <panel.h>

   and must be linked explicitly with the panels library using an -lpanel
   argument.  Note  that  they  must  also  link the ncurses library with
   -lncurses. Many linkers are two-pass and will accept either order, but
   it is still good practice to put -lpanel first and -lncurses second.

Overview of Panels

   A  panel  object  is  a window that is implicitly treated as part of a
   deck  including  all  other  panel  objects.  The deck has an implicit
   bottom-to-top  visibility order. The panels library includes an update
   function (analogous to refresh()) that displays all panels in the deck
   in  the proper order to resolve overlaps. The standard window, stdscr,
   is considered below all panels.

   Details  on the panels functions are available in the man pages. We'll
   just hit the highlights here.

   You  create  a  panel from a window by calling new_panel() on a window
   pointer.  It  then  becomes the top of the deck. The panel's window is
   available as the value of panel_window() called with the panel pointer
   as argument.

   You  can  delete  a  panel (removing it from the deck) with del_panel.
   This  will  not  deallocate the associated window; you have to do that
   yourself.  You can replace a panel's window with a different window by
   calling  replace_window.  The new window may be of different size; the
   panel code will re-compute all overlaps. This operation doesn't change
   the panel's position in the deck.

   To  move  a  panel's window, use move_panel(). The mvwin() function on
   the  panel's  window  isn't  sufficient  because it doesn't update the
   panels  library's  representation  of  where  the  windows  are.  This
   operation leaves the panel's depth, contents, and size unchanged.

   Two   functions   (top_panel(),   bottom_panel())   are  provided  for
   rearranging the deck. The first pops its argument window to the top of
   the  deck;  the second sends it to the bottom. Either operation leaves
   the panel's screen location, contents, and size unchanged.

   The  function update_panels() does all the wnoutrefresh() calls needed
   to prepare for doupdate() (which you must call yourself, afterwards).

   Typically,  you  will want to call update_panels() and doupdate() just
   before accepting command input, once in each cycle of interaction with
   the  user.  If  you  call  update_panels()  after each and every panel
   write,  you'll  generate  a  lot  of  unnecessary refresh activity and
   screen flicker.

Panels, Input, and the Standard Screen

   You  shouldn't mix wnoutrefresh() or wrefresh() operations with panels
   code;  this will work only if the argument window is either in the top
   panel or unobscured by any other panels.

   The  stsdcr  window  is  a  special  case.  It is considered below all
   panels. Because changes to panels may obscure parts of stdscr, though,
   you  should  call update_panels() before doupdate() even when you only
   change stdscr.

   Note  that  wgetch  automatically  calls  wrefresh.  Therefore, before
   requesting  input  from  a  panel window, you need to be sure that the
   panel is totally unobscured.

   There  is  presently  no  way to display changes to one obscured panel
   without repainting all panels.

Hiding Panels

   It's  possible  to  remove  a  panel  from  the  deck temporarily; use
   hide_panel  for this. Use show_panel() to render it visible again. The
   predicate  function  panel_hidden  tests  whether  or  not  a panel is
   hidden.

   The panel_update code ignores hidden panels. You cannot do top_panel()
   or  bottom_panel  on  a  hidden  panel().  Other panels operations are
   applicable.

Miscellaneous Other Facilities

   It's  possible  to navigate the deck using the functions panel_above()
   and  panel_below.  Handed a panel pointer, they return the panel above
   or  below  that  panel.  Handed  NULL,  they return the bottom-most or
   top-most panel.

   Every  panel  has  an  associated  user pointer, not used by the panel
   code,  to  which  you  can  attach  application data. See the man page
   documentation of set_panel_userptr() and panel_userptr for details.

                               The Menu Library

   A menu is a screen display that assists the user to choose some subset
   of  a  given set of items. The menu library is a curses extension that
   supports  easy  programming  of  menu  hierarchies  with a uniform but
   flexible interface.

   The  menu  library  first  appeared  in  AT&T  System  V.  The version
   documented here is the menu code distributed with ncurses.

Compiling With the menu Library

   Your menu-using modules must import the menu library declarations with
          #include <menu.h>

   and  must  be linked explicitly with the menus library using an -lmenu
   argument.  Note  that  they  must  also  link the ncurses library with
   -lncurses. Many linkers are two-pass and will accept either order, but
   it is still good practice to put -lmenu first and -lncurses second.

Overview of Menus

   The  menus  created  by  this  library consist of collections of items
   including  a  name  string part and a description string part. To make
   menus,  you  create  groups  of these items and connect them with menu
   frame objects.

   The  menu can then by posted, that is written to an associated window.
   Actually, each menu has two associated windows; a containing window in
   which  the  programmer can scribble titles or borders, and a subwindow
   in which the menu items proper are displayed. If this subwindow is too
   small  to  display  all the items, it will be a scrollable viewport on
   the collection of items.

   A  menu may also be unposted (that is, undisplayed), and finally freed
   to  make  the  storage  associated with it and its items available for
   re-use.

   The general flow of control of a menu program looks like this:
    1. Initialize curses.
    2. Create the menu items, using new_item().
    3. Create the menu using new_menu().
    4. Post the menu using post_menu().
    5. Refresh the screen.
    6. Process user requests via an input loop.
    7. Unpost the menu using unpost_menu().
    8. Free the menu, using free_menu().
    9. Free the items using free_item().
   10. Terminate curses.

Selecting items

   Menus  may  be  multi-valued  or  (the default) single-valued (see the
   manual  page  menu_opts(3x)  to  see  how to change the default). Both
   types always have a current item.

   From  a  single-valued  menu you can read the selected value simply by
   looking  at  the  current  item. From a multi-valued menu, you get the
   selected  set  by  looping through the items applying the item_value()
   predicate  function.  Your  menu-processing  code can use the function
   set_item_value() to flag the items in the select set.

   Menu   items   can  be  made  unselectable  using  set_item_opts()  or
   item_opts_off()  with  the  O_SELECTABLE  argument.  This  is the only
   option  so  far  defined for menus, but it is good practice to code as
   though other option bits might be on.

Menu Display

   The  menu  library  calculates a minimum display size for your window,
   based on the following variables:
     * The number and maximum length of the menu items
     * Whether the O_ROWMAJOR option is enabled
     * Whether display of descriptions is enabled
     * Whatever menu format may have been set by the programmer
     * The  length of the menu mark string used for highlighting selected
       items

   The  function  set_menu_format() allows you to set the maximum size of
   the viewport or menu page that will be used to display menu items. You
   can retrieve any format associated with a menu with menu_format(). The
   default format is rows=16, columns=1.

   The actual menu page may be smaller than the format size. This depends
   on  the item number and size and whether O_ROWMAJOR is on. This option
   (on  by  default) causes menu items to be displayed in a `raster-scan'
   pattern, so that if more than one item will fit horizontally the first
   couple  of  items  are side-by-side in the top row. The alternative is
   column-major  display,  which  tries to put the first several items in
   the first column.

   As  mentioned above, a menu format not large enough to allow all items
   to  fit  on-screen  will  result  in a menu display that is vertically
   scrollable.

   You  can  scroll  it  with  requests to the menu driver, which will be
   described in the section on menu input handling.

   Each  menu  has a mark string used to visually tag selected items; see
   the menu_mark(3x) manual page for details. The mark string length also
   influences the menu page size.

   The  function  scale_menu()  returns the minimum display size that the
   menu  code  computes  from  all  these  factors.  There are other menu
   display  attributes  including  a  select  attribute, an attribute for
   selectable  items,  an  attribute  for  unselectable  items, and a pad
   character used to separate item name text from description text. These
   have  reasonable  defaults which the library allows you to change (see
   the menu_attribs(3x) manual page.

Menu Windows

   Each  menu has, as mentioned previously, a pair of associated windows.
   Both these windows are painted when the menu is posted and erased when
   the menu is unposted.

   The  outer  or  frame  window  is  not  otherwise  touched by the menu
   routines. It exists so the programmer can associate a title, a border,
   or  perhaps  help text with the menu and have it properly refreshed or
   erased at post/unpost time. The inner window or subwindow is where the
   current menu page is displayed.

   By  default,  both  windows  are  stdscr.  You  can  set them with the
   functions in menu_win(3x).

   When  you  call post_menu(), you write the menu to its subwindow. When
   you  call  unpost_menu(), you erase the subwindow, However, neither of
   these  actually  modifies  the  screen. To do that, call wrefresh() or
   some equivalent.

Processing Menu Input

   The  main  loop of your menu-processing code should call menu_driver()
   repeatedly.  The first argument of this routine is a menu pointer; the
   second  is  a  menu  command  code. You should write an input-fetching
   routine that maps input characters to menu command codes, and pass its
   output  to  menu_driver(). The menu command codes are fully documented
   in menu_driver(3x).

   The  simplest  group of command codes is REQ_NEXT_ITEM, REQ_PREV_ITEM,
   REQ_FIRST_ITEM,     REQ_LAST_ITEM,     REQ_UP_ITEM,     REQ_DOWN_ITEM,
   REQ_LEFT_ITEM,  REQ_RIGHT_ITEM.  These  change  the currently selected
   item.  These  requests may cause scrolling of the menu page if it only
   partially displayed.

   There  are  explicit  requests  for  scrolling  which  also change the
   current  item  (because  the  select location does not change, but the
   item    there   does).   These   are   REQ_SCR_DLINE,   REQ_SCR_ULINE,
   REQ_SCR_DPAGE, and REQ_SCR_UPAGE.

   The  REQ_TOGGLE_ITEM  selects or deselects the current item. It is for
   use  in  multi-valued  menus; if you use it with O_ONEVALUE on, you'll
   get an error return (E_REQUEST_DENIED).

   Each  menu  has  an associated pattern buffer. The menu_driver() logic
   tries  to  accumulate  printable  ASCII  characters  passed in in that
   buffer;  when  it  matches a prefix of an item name, that item (or the
   next  matching  item)  is selected. If appending a character yields no
   new  match,  that  character  is  deleted from the pattern buffer, and
   menu_driver() returns E_NO_MATCH.

   Some  requests  change the pattern buffer directly: REQ_CLEAR_PATTERN,
   REQ_BACK_PATTERN,  REQ_NEXT_MATCH,  REQ_PREV_MATCH. The latter two are
   useful  when  pattern  buffer  input  matches  more than one item in a
   multi-valued menu.

   Each  successful  scroll or item navigation request clears the pattern
   buffer.  It is also possible to set the pattern buffer explicitly with
   set_menu_pattern().

   Finally,  menu  driver  requests  above  the  constant MAX_COMMAND are
   considered   application-specific  commands.  The  menu_driver()  code
   ignores them and returns E_UNKNOWN_COMMAND.

Miscellaneous Other Features

   Various  menu  options can affect the processing and visual appearance
   and input processing of menus. See menu_opts(3x) for details.

   It  is possible to change the current item from application code; this
   is  useful  if  you  want to write your own navigation requests. It is
   also  possible  to explicitly set the top row of the menu display. See
   mitem_current(3x).  If  your  application  needs  to  change  the menu
   subwindow  cursor for any reason, pos_menu_cursor() will restore it to
   the correct location for continuing menu driver processing.

   It  is  possible  to set hooks to be called at menu initialization and
   wrapup   time,   and   whenever   the   selected   item  changes.  See
   menu_hook(3x).

   Each  item, and each menu, has an associated user pointer on which you
   can hang application data. See mitem_userptr(3x) and menu_userptr(3x).

                               The Forms Library

   The  form library is a curses extension that supports easy programming
   of on-screen forms for data entry and program control.

   The  form  library  first  appeared  in  AT&T  System  V.  The version
   documented here is the form code distributed with ncurses.

Compiling With the form Library

   Your form-using modules must import the form library declarations with
          #include <form.h>

   and  must  be linked explicitly with the forms library using an -lform
   argument.  Note  that  they  must  also  link the ncurses library with
   -lncurses. Many linkers are two-pass and will accept either order, but
   it is still good practice to put -lform first and -lncurses second.

Overview of Forms

   A  form  is  a  collection of fields; each field may be either a label
   (explanatory  text)  or  a  data-entry  location.  Long  forms  may be
   segmented into pages; each entry to a new page clears the screen.

   To  make forms, you create groups of fields and connect them with form
   frame objects; the form library makes this relatively simple.

   Once  defined,  a form can be posted, that is written to an associated
   window.  Actually,  each form has two associated windows; a containing
   window  in  which the programmer can scribble titles or borders, and a
   subwindow in which the form fields proper are displayed.

   As  the  form  user  fills out the posted form, navigation and editing
   keys  support  movement between fields, editing keys support modifying
   field,  and plain text adds to or changes data in a current field. The
   form  library  allows you (the forms designer) to bind each navigation
   and  editing  key  to any keystroke accepted by curses Fields may have
   validation  conditions on them, so that they check input data for type
   and  value.  The form library supplies a rich set of pre-defined field
   types, and makes it relatively easy to define new ones.

   Once its transaction is completed (or aborted), a form may be unposted
   (that  is,  undisplayed),  and  finally  freed  to  make  the  storage
   associated with it and its items available for re-use.

   The general flow of control of a form program looks like this:
    1. Initialize curses.
    2. Create the form fields, using new_field().
    3. Create the form using new_form().
    4. Post the form using post_form().
    5. Refresh the screen.
    6. Process user requests via an input loop.
    7. Unpost the form using unpost_form().
    8. Free the form, using free_form().
    9. Free the fields using free_field().
   10. Terminate curses.

   Note  that  this  looks  much  like  a  menu program; the form library
   handles  tasks  which  are in many ways similar, and its interface was
   obviously  designed  to  resemble  that  of  the menu library wherever
   possible.

   In  forms  programs,  however, the `process user requests' is somewhat
   more   complicated   than  for  menus.  Besides  menu-like  navigation
   operations, the menu driver loop has to support field editing and data
   validation.

Creating and Freeing Fields and Forms

   The basic function for creating fields is new_field():
FIELD *new_field(int height, int width,   /* new field size */
                 int top, int left,       /* upper left corner */
                 int offscreen,           /* number of offscreen rows */
                 int nbuf);               /* number of working buffers */

   Menu  items  always  occupy  a  single  row, but forms fields may have
   multiple  rows.  So  new_field()  requires  you to specify a width and
   height  (the  first  two  arguments,  which  mist both be greater than
   zero).

   You must also specify the location of the field's upper left corner on
   the  screen  (the  third  and  fourth arguments, which must be zero or
   greater).  Note  that  these  coordinates  are  relative  to  the form
   subwindow,  which will coincide with stdscr by default but need not be
   stdscr if you've done an explicit set_form_win() call.

   The  fifth argument allows you to specify a number of off-screen rows.
   If  this  is zero, the entire field will always be displayed. If it is
   nonzero,  the  form  will  be  scrollable,  with  only one screen-full
   (initially  the  top  part) displayed at any given time. If you make a
   field  dynamic and grow it so it will no longer fit on the screen, the
   form  will  become  scrollable  even  if  the  offscreen  argument was
   initially zero.

   The  forms library allocates one working buffer per field; the size of
   each buffer is ((height + offscreen)*width + 1, one character for each
   position in the field plus a NUL terminator. The sixth argument is the
   number  of  additional  data  buffers  to allocate for the field; your
   application can use them for its own purposes.
FIELD *dup_field(FIELD *field,            /* field to copy */
                 int top, int left);      /* location of new copy */

   The  function  dup_field()  duplicates  an  existing  field  at  a new
   location.  Size  and  buffering information are copied; some attribute
   flags  and  status  bits  are  not  (see  the  form_field_new(3X)  for
   details).
FIELD *link_field(FIELD *field,           /* field to copy */
                  int top, int left);     /* location of new copy */

   The  function  link_field() also duplicates an existing field at a new
   location.  The difference from dup_field() is that it arranges for the
   new field's buffer to be shared with the old one.

   Besides  the obvious use in making a field editable from two different
   form pages, linked fields give you a way to hack in dynamic labels. If
   you  declare  several fields linked to an original, and then make them
   inactive,  changes  from  the original will still be propagated to the
   linked fields.

   As  with duplicated fields, linked fields have attribute bits separate
   from the original.

   As  you  might  guess,  all these field-allocations return NULL if the
   field  allocation  is  not  possible  due to an out-of-memory error or
   out-of-bounds arguments.

   To connect fields to a form, use
FORM *new_form(FIELD **fields);

   This  function  expects  to  see  a  NULL-terminated  array  of  field
   pointers.  Said fields are connected to a newly-allocated form object;
   its address is returned (or else NULL if the allocation fails).

   Note  that  new_field()  does  not copy the pointer array into private
   storage;  if you modify the contents of the pointer array during forms
   processing,  all manner of bizarre things might happen. Also note that
   any given field may only be connected to one form.

   The  functions  free_field() and free_form are available to free field
   and  form objects. It is an error to attempt to free a field connected
   to a form, but not vice-versa; thus, you will generally free your form
   objects first.

Fetching and Changing Field Attributes

   Each  form  field  has  a  number  of  location  and  size  attributes
   associated  with  it. There are other field attributes used to control
   display and editing of the field. Some (for example, the O_STATIC bit)
   involve  sufficient  complications  to be covered in sections of their
   own later on. We cover the functions used to get and set several basic
   attributes here.

   When a field is created, the attributes not specified by the new_field
   function  are  copied  from  an  invisible  system  default  field. In
   attribute-setting  and -fetching functions, the argument NULL is taken
   to mean this field. Changes to it persist as defaults until your forms
   application terminates.

  Fetching Size and Location Data

   You can retrieve field sizes and locations through:
int field_info(FIELD *field,              /* field from which to fetch */
               int *height, *int width,   /* field size */
               int *top, int *left,       /* upper left corner */
               int *offscreen,            /* number of offscreen rows */
               int *nbuf);                /* number of working buffers */

   This  function is a sort of inverse of new_field(); instead of setting
   size  and  location attributes of a new field, it fetches them from an
   existing one.

  Changing the Field Location

   It is possible to move a field's location on the screen:
int move_field(FIELD *field,              /* field to alter */
               int top, int left);        /* new upper-left corner */

   You can, of course. query the current location through field_info().

  The Justification Attribute

   One-line  fields  may be unjustified, justified right, justified left,
   or centered. Here is how you manipulate this attribute:
int set_field_just(FIELD *field,          /* field to alter */
                   int justmode);         /* mode to set */

int field_just(FIELD *field);             /* fetch mode of field */

   The   mode   values  accepted  and  returned  by  this  functions  are
   preprocessor  macros NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT, or
   JUSTIFY_CENTER.

  Field Display Attributes

   For  each  field,  you  can  set  a  foreground  attribute for entered
   characters,  a  background  attribute  for the entire field, and a pad
   character  for the unfilled portion of the field. You can also control
   pagination of the form.

   This  group of four field attributes controls the visual appearance of
   the  field on the screen, without affecting in any way the data in the
   field buffer.
int set_field_fore(FIELD *field,          /* field to alter */
                   chtype attr);          /* attribute to set */

chtype field_fore(FIELD *field);          /* field to query */

int set_field_back(FIELD *field,          /* field to alter */
                   chtype attr);          /* attribute to set */

chtype field_back(FIELD *field);          /* field to query */

int set_field_pad(FIELD *field,           /* field to alter */
                 int pad);                /* pad character to set */

chtype field_pad(FIELD *field);

int set_new_page(FIELD *field,            /* field to alter */
                 int flag);               /* TRUE to force new page */

chtype new_page(FIELD *field);            /* field to query */

   The attributes set and returned by the first four functions are normal
   curses(3x)  display  attribute  values  (A_STANDOUT, A_BOLD, A_REVERSE
   etc).  The page bit of a field controls whether it is displayed at the
   start of a new form screen.

  Field Option Bits

   There  is  also a large collection of field option bits you can set to
   control  various  aspects of forms processing. You can manipulate them
   with these functions:
int set_field_opts(FIELD *field,          /* field to alter */
                   int attr);             /* attribute to set */

int field_opts_on(FIELD *field,           /* field to alter */
                  int attr);              /* attributes to turn on */

int field_opts_off(FIELD *field,          /* field to alter */
                   int attr);             /* attributes to turn off */

int field_opts(FIELD *field);             /* field to query */

   By default, all options are on. Here are the available option bits:

   O_VISIBLE
          Controls  whether  the  field  is visible on the screen. Can be
          used  during form processing to hide or pop up fields depending
          on the value of parent fields.

   O_ACTIVE
          Controls  whether  the  field is active during forms processing
          (i.e.  visited  by  form  navigation keys). Can be used to make
          labels  or  derived  fields with buffer values alterable by the
          forms application, not the user.

   O_PUBLIC
          Controls  whether data is displayed during field entry. If this
          option  is  turned  off on a field, the library will accept and
          edit  data  in that field, but it will not be displayed and the
          visible  field  cursor  will  not  move.  You  can turn off the
          O_PUBLIC bit to define password fields.

   O_EDIT
          Controls  whether  the  field's data can be modified. When this
          option  is off, all editing requests except REQ_PREV_CHOICE and
          REQ_NEXT_CHOICE  will fail. Such read-only fields may be useful
          for help messages.

   O_WRAP
          Controls word-wrapping in multi-line fields. Normally, when any
          character  of  a  (blank-separated) word reaches the end of the
          current  line,  the  entire  word  is  wrapped to the next line
          (assuming there is one). When this option is off, the word will
          be split across the line break.

   O_BLANK
          Controls  field  blanking.  When  this option is on, entering a
          character  at  the first field position erases the entire field
          (except for the just-entered character).

   O_AUTOSKIP
          Controls  automatic  skip  to  next  field when this one fills.
          Normally,  when  the  forms user tries to type more data into a
          field  than will fit, the editing location jumps to next field.
          When this option is off, the user's cursor will hang at the end
          of  the  field.  This  option is ignored in dynamic fields that
          have not reached their size limit.

   O_NULLOK
          Controls   whether  validation  is  applied  to  blank  fields.
          Normally,  it  is not; the user can leave a field blank without
          invoking  the usual validation check on exit. If this option is
          off on a field, exit from it will invoke a validation check.

   O_PASSOK
          Controls whether validation occurs on every exit, or only after
          the  field  is  modified.  Normally the latter is true. Setting
          O_PASSOK  may be useful if your field's validation function may
          change during forms processing.

   O_STATIC
          Controls  whether the field is fixed to its initial dimensions.
          If  you  turn  this  off,  the  field  becomes dynamic and will
          stretch to fit entered data.

   A  field's  options  cannot  be  changed  while the field is currently
   selected.  However,  options  may be changed on posted fields that are
   not current.

   The option values are bit-masks and can be composed with logical-or in
   the obvious way.

Field Status

   Every field has a status flag, which is set to FALSE when the field is
   created  and  TRUE when the value in field buffer 0 changes. This flag
   can be queried and set directly:
int set_field_status(FIELD *field,      /* field to alter */
                   int status);         /* mode to set */

int field_status(FIELD *field);         /* fetch mode of field */

   Setting  this  flag under program control can be useful if you use the
   same form repeatedly, looking for modified fields each time.

   Calling  field_status()  on  a  field not currently selected for input
   will return a correct value. Calling field_status() on a field that is
   currently  selected for input may not necessarily give a correct field
   status  value, because entered data isn't necessarily copied to buffer
   zero  before the exit validation check. To guarantee that the returned
   status  value  reflects reality, call field_status() either (1) in the
   field's  exit validation check routine, (2) from the field's or form's
   initialization   or   termination   hooks,   or   (3)   just  after  a
   REQ_VALIDATION request has been processed by the forms driver.

Field User Pointer

   Each  field  structure contains one character pointer slot that is not
   used  by  the forms library. It is intended to be used by applications
   to store private per-field data. You can manipulate it with:
int set_field_userptr(FIELD *field,       /* field to alter */
                   char *userptr);        /* mode to set */

char *field_userptr(FIELD *field);        /* fetch mode of field */

   (Properly,  this  user  pointer field ought to have (void *) type. The
   (char *) type is retained for System V compatibility.)

   It  is  valid  to  set  the  user pointer of the default field (with a
   set_field_userptr()  call  passed  a  NULL  field pointer.) When a new
   field  is  created,  the  default-field  user  pointer  is  copied  to
   initialize the new field's user pointer.

Variable-Sized Fields

   Normally,  a  field  is fixed at the size specified for it at creation
   time.  If,  however, you turn off its O_STATIC bit, it becomes dynamic
   and  will  automatically  resize  itself  to accommodate data as it is
   entered.  If the field has extra buffers associated with it, they will
   grow right along with the main input buffer.

   A  one-line  dynamic  field  will have a fixed height (1) but variable
   width, scrolling horizontally to display data within the field area as
   originally  dimensioned  and  located. A multi-line dynamic field will
   have  a  fixed  width, but variable height (number of rows), scrolling
   vertically  to  display  data  within  the  field  area  as originally
   dimensioned and located.

   Normally,  a dynamic field is allowed to grow without limit. But it is
   possible  to set an upper limit on the size of a dynamic field. You do
   it with this function:
int set_max_field(FIELD *field,     /* field to alter (may not be NULL) */
                   int max_size);   /* upper limit on field size */

   If the field is one-line, max_size is taken to be a column size limit;
   if  it  is multi-line, it is taken to be a line size limit. To disable
   any  limit,  use  an argument of zero. The growth limit can be changed
   whether or not the O_STATIC bit is on, but has no effect until it is.

   The following properties of a field change when it becomes dynamic:
     * If  there  is  no  growth limit, there is no final position of the
       field; therefore O_AUTOSKIP and O_NL_OVERLOAD are ignored.
     * Field justification will be ignored (though whatever justification
       is set up will be retained internally and can be queried).
     * The  dup_field() and link_field() calls copy dynamic-buffer sizes.
       If  the  O_STATIC  option  is set on one of a collection of links,
       buffer  resizing  will occur only when the field is edited through
       that link.
     * The  call  field_info()  will retrieve the original static size of
       the  field;  use  dynamic_field_info()  to  get the actual dynamic
       size.

Field Validation

   By  default,  a  field will accept any data that will fit in its input
   buffer.  However,  it  is  possible  to  attach a validation type to a
   field.  If  you  do  this,  any  attempt  to  leave the field while it
   contains  data  that doesn't match the validation type will fail. Some
   validation  types also have a character-validity check for each time a
   character is entered in the field.

   A   field's   validation   check   (if   any)   is   not  called  when
   set_field_buffer()  modifies the input buffer, nor when that buffer is
   changed through a linked field.

   The  form library provides a rich set of pre-defined validation types,
   and  gives  you  the capability to define custom ones of your own. You
   can  examine and change field validation attributes with the following
   functions:
int set_field_type(FIELD *field,          /* field to alter */
                   FIELDTYPE *ftype,      /* type to associate */
                   ...);                  /* additional arguments*/

FIELDTYPE *field_type(FIELD *field);      /* field to query */

   The  validation  type  of  a  field  is considered an attribute of the
   field.  As  with  other field attributes, Also, doing set_field_type()
   with  a  NULL  field  default  will  change  the  system  default  for
   validation of newly-created fields.

   Here are the pre-defined validation types:

  TYPE_ALPHA

   This  field  type  accepts  alphabetic  data; no blanks, no digits, no
   special  characters  (this  is checked at character-entry time). It is
   set up with:
int set_field_type(FIELD *field,          /* field to alter */
                   TYPE_ALPHA,            /* type to associate */
                   int width);            /* maximum width of field */

   The width argument sets a minimum width of data. Typically you'll want
   to  set this to the field width; if it's greater than the field width,
   the  validation  check will always fail. A minimum width of zero makes
   field completion optional.

  TYPE_ALNUM

   This  field  type  accepts  alphabetic  data and digits; no blanks, no
   special  characters  (this  is checked at character-entry time). It is
   set up with:
int set_field_type(FIELD *field,          /* field to alter */
                   TYPE_ALNUM,            /* type to associate */
                   int width);            /* maximum width of field */

   The  width  argument sets a minimum width of data. As with TYPE_ALPHA,
   typically  you'll want to set this to the field width; if it's greater
   than the field width, the validation check will always fail. A minimum
   width of zero makes field completion optional.

  TYPE_ENUM

   This  type  allows  you  to  restrict  a  field's values to be among a
   specified  set  of  string  values (for example, the two-letter postal
   codes for U.S. states). It is set up with:
int set_field_type(FIELD *field,          /* field to alter */
                   TYPE_ENUM,             /* type to associate */
                   char **valuelist;      /* list of possible values */
                   int checkcase;         /* case-sensitive? */
                   int checkunique);      /* must specify uniquely? */

   The  valuelist parameter must point at a NULL-terminated list of valid
   strings.  The  checkcase  argument, if true, makes comparison with the
   string case-sensitive.

   When  the user exits a TYPE_ENUM field, the validation procedure tries
   to  complete  the  data  in the buffer to a valid entry. If a complete
   choice  string has been entered, it is of course valid. But it is also
   possible to enter a prefix of a valid string and have it completed for
   you.

   By  default,  if  you enter such a prefix and it matches more than one
   value  in  the  string list, the prefix will be completed to the first
   matching value. But the checkunique argument, if true, requires prefix
   matches to be unique in order to be valid.

   The   REQ_NEXT_CHOICE   and  REQ_PREV_CHOICE  input  requests  can  be
   particularly useful with these fields.

  TYPE_INTEGER

   This field type accepts an integer. It is set up as follows:
int set_field_type(FIELD *field,          /* field to alter */
                   TYPE_INTEGER,          /* type to associate */
                   int padding,           /* # places to zero-pad to */
                   int vmin, int vmax);   /* valid range */

   Valid  characters consist of an optional leading minus and digits. The
   range check is performed on exit. If the range maximum is less than or
   equal to the minimum, the range is ignored.

   If the value passes its range check, it is padded with as many leading
   zero digits as necessary to meet the padding argument.

   A TYPE_INTEGER value buffer can conveniently be interpreted with the C
   library function atoi(3).

  TYPE_NUMERIC

   This field type accepts a decimal number. It is set up as follows:
int set_field_type(FIELD *field,              /* field to alter */
                   TYPE_NUMERIC,              /* type to associate */
                   int padding,               /* # places of precision */
                   double vmin, double vmax); /* valid range */

   Valid  characters  consist  of  an  optional leading minus and digits.
   possibly  including a decimal point. If your system supports locale's,
   the  decimal  point  character  used  must  be the one defined by your
   locale.  The range check is performed on exit. If the range maximum is
   less than or equal to the minimum, the range is ignored.

   If  the  value  passes  its  range  check,  it  is padded with as many
   trailing zero digits as necessary to meet the padding argument.

   A TYPE_NUMERIC value buffer can conveniently be interpreted with the C
   library function atof(3).

  TYPE_REGEXP

   This  field type accepts data matching a regular expression. It is set
   up as follows:
int set_field_type(FIELD *field,          /* field to alter */
                   TYPE_REGEXP,           /* type to associate */
                   char *regexp);         /* expression to match */

   The  syntax  for  regular expressions is that of regcomp(3). The check
   for regular-expression match is performed on exit.

Direct Field Buffer Manipulation

   The chief attribute of a field is its buffer contents. When a form has
   been  completed,  your  application usually needs to know the state of
   each field buffer. You can find this out with:
char *field_buffer(FIELD *field,          /* field to query */
                   int bufindex);         /* number of buffer to query */

   Normally,  the state of the zero-numbered buffer for each field is set
   by  the user's editing actions on that field. It's sometimes useful to
   be  able  to set the value of the zero-numbered (or some other) buffer
   from your application:
int set_field_buffer(FIELD *field,        /* field to alter */
                   int bufindex,          /* number of buffer to alter */
                   char *value);          /* string value to set */

   If  the  field  is  not  large  enough  and  cannot  be  resized  to a
   sufficiently large size to contain the specified value, the value will
   be truncated to fit.

   Calling  field_buffer() with a null field pointer will raise an error.
   Calling  field_buffer()  on  a  field not currently selected for input
   will return a correct value. Calling field_buffer() on a field that is
   currently  selected for input may not necessarily give a correct field
   buffer  value, because entered data isn't necessarily copied to buffer
   zero  before the exit validation check. To guarantee that the returned
   buffer  value  reflects  on-screen reality, call field_buffer() either
   (1) in the field's exit validation check routine, (2) from the field's
   or  form's  initialization  or  termination hooks, or (3) just after a
   REQ_VALIDATION request has been processed by the forms driver.

Attributes of Forms

   As  with  field  attributes,  form attributes inherit a default from a
   system default form structure. These defaults can be queried or set by
   of these functions using a form-pointer argument of NULL.

   The principal attribute of a form is its field list. You can query and
   change this list with:
int set_form_fields(FORM *form,           /* form to alter */
                    FIELD **fields);      /* fields to connect */

char *form_fields(FORM *form);            /* fetch fields of form */

int field_count(FORM *form);              /* count connect fields */

   The  second  argument  of  set_form_fields()  may be a NULL-terminated
   field pointer array like the one required by new_form(). In that case,
   the  old  fields  of  the  form  are  disconnected  but not freed (and
   eligible  to  be  connected  to  other forms), then the new fields are
   connected.

   It  may  also  be  null, in which case the old fields are disconnected
   (and not freed) but no new ones are connected.

   The   field_count()  function  simply  counts  the  number  of  fields
   connected  to a given from. It returns -1 if the form-pointer argument
   is NULL.

Control of Form Display

   In  the  overview section, you saw that to display a form you normally
   start  by  defining  its size (and fields), posting it, and refreshing
   the  screen.  There  is  an  hidden  step before posting, which is the
   association  of  the  form  with  a  frame window (actually, a pair of
   windows)  within  which  it  will  be displayed. By default, the forms
   library associates every form with the full-screen window stdscr.

   By making this step explicit, you can associate a form with a declared
   frame window on your screen display. This can be useful if you want to
   adapt  the  form  display  to different screen sizes, dynamically tile
   forms  on  the  screen,  or  use a form as part of an interface layout
   managed by panels.

   The  two  windows associated with each form have the same functions as
   their  analogues  in  the menu library. Both these windows are painted
   when the form is posted and erased when the form is unposted.

   The  outer  or  frame  window  is  not  otherwise  touched by the form
   routines. It exists so the programmer can associate a title, a border,
   or  perhaps  help text with the form and have it properly refreshed or
   erased at post/unpost time. The inner window or subwindow is where the
   current form page is actually displayed.

   In  order  to declare your own frame window for a form, you'll need to
   know  the  size  of  the  form's  bounding rectangle. You can get this
   information with:
int scale_form(FORM *form,                /* form to query */
               int *rows,                 /* form rows */
               int *cols);                /* form cols */

   The form dimensions are passed back in the locations pointed to by the
   arguments.  Once  you have this information, you can use it to declare
   of windows, then use one of these functions:
int set_form_win(FORM *form,              /* form to alter */
                 WINDOW *win);            /* frame window to connect */

WINDOW *form_win(FORM *form);             /* fetch frame window of form */

int set_form_sub(FORM *form,              /* form to alter */
                 WINDOW *win);            /* form subwindow to connect */

WINDOW *form_sub(FORM *form);             /* fetch form subwindow of form */

   Note  that curses operations, including refresh(), on the form, should
   be done on the frame window, not the form subwindow.

   It  is  possible  to  check  from  your  application  whether all of a
   scrollable  field is actually displayed within the menu subwindow. Use
   these functions:
int data_ahead(FORM *form);               /* form to be queried */

int data_behind(FORM *form);              /* form to be queried */

   The  function  data_ahead()  returns  TRUE if (a) the current field is
   one-line  and  has  undisplayed data off to the right, (b) the current
   field is multi-line and there is data off-screen below it.

   The function data_behind() returns TRUE if the first (upper left hand)
   character position is off-screen (not being displayed).

   Finally,  there  is  a function to restore the form window's cursor to
   the value expected by the forms driver:
int pos_form_cursor(FORM *)               /* form to be queried */

   If your application changes the form window cursor, call this function
   before   handing  control  back  to  the  forms  driver  in  order  to
   re-synchronize it.

Input Processing in the Forms Driver

   The function form_driver() handles virtualized input requests for form
   navigation, editing, and validation requests, just as menu_driver does
   for menus (see the section on menu input handling).
int form_driver(FORM *form,               /* form to pass input to */
                int request);             /* form request code */

   Your  input  virtualization  function  needs  to  take  input and then
   convert  it  to  either an alphanumeric character (which is treated as
   data  to  be  entered  in  the  currently-selected  field), or a forms
   processing request.

   The   forms   driver  provides  hooks  (through  input-validation  and
   field-termination  functions)  with  which  your  application code can
   check that the input taken by the driver matched what was expected.

  Page Navigation Requests

   These  requests  cause  page-level  moves through the form, triggering
   display of a new form screen.

   REQ_NEXT_PAGE
          Move to the next form page.

   REQ_PREV_PAGE
          Move to the previous form page.

   REQ_FIRST_PAGE
          Move to the first form page.

   REQ_LAST_PAGE
          Move to the last form page.

   These  requests  treat the list as cyclic; that is, REQ_NEXT_PAGE from
   the last page goes to the first, and REQ_PREV_PAGE from the first page
   goes to the last.

  Inter-Field Navigation Requests

   These requests handle navigation between fields on the same page.

   REQ_NEXT_FIELD
          Move to next field.

   REQ_PREV_FIELD
          Move to previous field.

   REQ_FIRST_FIELD
          Move to the first field.

   REQ_LAST_FIELD
          Move to the last field.

   REQ_SNEXT_FIELD
          Move to sorted next field.

   REQ_SPREV_FIELD
          Move to sorted previous field.

   REQ_SFIRST_FIELD
          Move to the sorted first field.

   REQ_SLAST_FIELD
          Move to the sorted last field.

   REQ_LEFT_FIELD
          Move left to field.

   REQ_RIGHT_FIELD
          Move right to field.

   REQ_UP_FIELD
          Move up to field.

   REQ_DOWN_FIELD
          Move down to field.

   These  requests treat the list of fields on a page as cyclic; that is,
   REQ_NEXT_FIELD   from   the   last   field  goes  to  the  first,  and
   REQ_PREV_FIELD from the first field goes to the last. The order of the
   fields for these (and the REQ_FIRST_FIELD and REQ_LAST_FIELD requests)
   is simply the order of the field pointers in the form array (as set up
   by new_form() or set_form_fields()

   It  is also possible to traverse the fields as if they had been sorted
   in  screen-position  order,  so  the  sequence  goes left-to-right and
   top-to-bottom.   To   do   this,   use   the   second  group  of  four
   sorted-movement requests.

   Finally, it is possible to move between fields using visual directions
   up,  down, right, and left. To accomplish this, use the third group of
   four requests. Note, however, that the position of a form for purposes
   of these requests is its upper-left corner.

   For   example,  suppose  you  have  a  multi-line  field  B,  and  two
   single-line fields A and C on the same line with B, with A to the left
   of  B  and  C  to the right of B. A REQ_MOVE_RIGHT from A will go to B
   only  if  A, B, and C all share the same first line; otherwise it will
   skip over B to C.

  Intra-Field Navigation Requests

   These  requests drive movement of the edit cursor within the currently
   selected field.

   REQ_NEXT_CHAR
          Move to next character.

   REQ_PREV_CHAR
          Move to previous character.

   REQ_NEXT_LINE
          Move to next line.

   REQ_PREV_LINE
          Move to previous line.

   REQ_NEXT_WORD
          Move to next word.

   REQ_PREV_WORD
          Move to previous word.

   REQ_BEG_FIELD
          Move to beginning of field.

   REQ_END_FIELD
          Move to end of field.

   REQ_BEG_LINE
          Move to beginning of line.

   REQ_END_LINE
          Move to end of line.

   REQ_LEFT_CHAR
          Move left in field.

   REQ_RIGHT_CHAR
          Move right in field.

   REQ_UP_CHAR
          Move up in field.

   REQ_DOWN_CHAR
          Move down in field.

   Each  word  is  separated  from  the  previous  and next characters by
   whitespace. The commands to move to beginning and end of line or field
   look for the first or last non-pad character in their ranges.

  Scrolling Requests

   Fields  that  are dynamic and have grown and fields explicitly created
   with   offscreen   rows   are   scrollable.   One-line  fields  scroll
   horizontally;  multi-line  fields scroll vertically. Most scrolling is
   triggered by editing and intra-field movement (the library scrolls the
   field  to  keep  the  cursor  visible).  It  is possible to explicitly
   request scrolling with the following requests:

   REQ_SCR_FLINE
          Scroll vertically forward a line.

   REQ_SCR_BLINE
          Scroll vertically backward a line.

   REQ_SCR_FPAGE
          Scroll vertically forward a page.

   REQ_SCR_BPAGE
          Scroll vertically backward a page.

   REQ_SCR_FHPAGE
          Scroll vertically forward half a page.

   REQ_SCR_BHPAGE
          Scroll vertically backward half a page.

   REQ_SCR_FCHAR
          Scroll horizontally forward a character.

   REQ_SCR_BCHAR
          Scroll horizontally backward a character.

   REQ_SCR_HFLINE
          Scroll horizontally one field width forward.

   REQ_SCR_HBLINE
          Scroll horizontally one field width backward.

   REQ_SCR_HFHALF
          Scroll horizontally one half field width forward.

   REQ_SCR_HBHALF
          Scroll horizontally one half field width backward.

   For scrolling purposes, a page of a field is the height of its visible
   part.

  Editing Requests

   When  you pass the forms driver an ASCII character, it is treated as a
   request  to add the character to the field's data buffer. Whether this
   is  an  insertion  or  a  replacement depends on the field's edit mode
   (insertion is the default.

   The following requests support editing the field and changing the edit
   mode:

   REQ_INS_MODE
          Set insertion mode.

   REQ_OVL_MODE
          Set overlay mode.

   REQ_NEW_LINE
          New line request (see below for explanation).

   REQ_INS_CHAR
          Insert space at character location.

   REQ_INS_LINE
          Insert blank line at character location.

   REQ_DEL_CHAR
          Delete character at cursor.

   REQ_DEL_PREV
          Delete previous word at cursor.

   REQ_DEL_LINE
          Delete line at cursor.

   REQ_DEL_WORD
          Delete word at cursor.

   REQ_CLR_EOL
          Clear to end of line.

   REQ_CLR_EOF
          Clear to end of field.

   REQ_CLEAR_FIELD
          Clear entire field.

   The   behavior  of  the  REQ_NEW_LINE  and  REQ_DEL_PREV  requests  is
   complicated  and  partly  controlled  by  a pair of forms options. The
   special  cases  are triggered when the cursor is at the beginning of a
   field, or on the last line of the field.

   First, we consider REQ_NEW_LINE:

   The  normal  behavior  of  REQ_NEW_LINE in insert mode is to break the
   current line at the position of the edit cursor, inserting the portion
   of  the  current  line  after  the  cursor as a new line following the
   current  and  moving the cursor to the beginning of that new line (you
   may think of this as inserting a newline in the field buffer).

   The  normal  behavior  of REQ_NEW_LINE in overlay mode is to clear the
   current  line from the position of the edit cursor to end of line. The
   cursor is then moved to the beginning of the next line.

   However, REQ_NEW_LINE at the beginning of a field, or on the last line
   of  a  field,  instead  does a REQ_NEXT_FIELD. O_NL_OVERLOAD option is
   off, this special action is disabled.

   Now, let us consider REQ_DEL_PREV:

   The  normal  behavior  of  REQ_DEL_PREV  is  to  delete  the  previous
   character.  If  insert mode is on, and the cursor is at the start of a
   line,  and  the  text  on  that  line will fit on the previous one, it
   instead  appends  the contents of the current line to the previous one
   and  deletes  the  current  line  (you may think of this as deleting a
   newline from the field buffer).

   However,  REQ_DEL_PREV  at the beginning of a field is instead treated
   as a REQ_PREV_FIELD.

   If  the  O_BS_OVERLOAD  option is off, this special action is disabled
   and the forms driver just returns E_REQUEST_DENIED.

   See  Form  Options for discussion of how to set and clear the overload
   options.

  Order Requests

   If the type of your field is ordered, and has associated functions for
   getting  the  next and previous values of the type from a given value,
   there are requests that can fetch that value into the field buffer:

   REQ_NEXT_CHOICE
          Place the successor value of the current value in the buffer.

   REQ_PREV_CHOICE
          Place the predecessor value of the current value in the buffer.

   Of the built-in field types, only TYPE_ENUM has built-in successor and
   predecessor  functions.  When you define a field type of your own (see
   Custom   Validation   Types),  you  can  associate  our  own  ordering
   functions.

  Application Commands

   Form  requests  are  represented  as  integers  above the curses value
   greater   than  KEY_MAX  and  less  than  or  equal  to  the  constant
   MAX_COMMAND.  If  your  input-virtualization  routine  returns a value
   above MAX_COMMAND, the forms driver will ignore it.

Field Change Hooks

   It  is  possible  to  set  function  hooks to be executed whenever the
   current  field  or  form  changes. Here are the functions that support
   this:
typedef void    (*HOOK)();       /* pointer to function returning void */

int set_form_init(FORM *form,    /* form to alter */
                  HOOK hook);    /* initialization hook */

HOOK form_init(FORM *form);      /* form to query */

int set_form_term(FORM *form,    /* form to alter */
                  HOOK hook);    /* termination hook */

HOOK form_term(FORM *form);      /* form to query */

int set_field_init(FORM *form,   /* form to alter */
                  HOOK hook);    /* initialization hook */

HOOK field_init(FORM *form);     /* form to query */

int set_field_term(FORM *form,   /* form to alter */
                  HOOK hook);    /* termination hook */

HOOK field_term(FORM *form);     /* form to query */

   These functions allow you to either set or query four different hooks.
   In  each  of  the  set  functions,  the  second argument should be the
   address  of a hook function. These functions differ only in the timing
   of the hook call.

   form_init
          This  hook  is called when the form is posted; also, just after
          each page change operation.

   field_init
          This  hook  is called when the form is posted; also, just after
          each field change

   field_term
          This  hook is called just after field validation; that is, just
          before the field is altered. It is also called when the form is
          unposted.

   form_term
          This  hook  is  called  when  the  form is unposted; also, just
          before each page change operation.

   Calls to these hooks may be triggered
    1. When user editing requests are processed by the forms driver
    2. When the current page is changed by set_current_field() call
    3. When the current field is changed by a set_form_page() call

   See Field Change Commands for discussion of the latter two cases.

   You  can  set  a default hook for all fields by passing one of the set
   functions a NULL first argument.

   You  can  disable  any of these hooks by (re)setting them to NULL, the
   default value.

Field Change Commands

   Normally,  navigation  through  the  form will be driven by the user's
   input  requests.  But  sometimes  it  is useful to be able to move the
   focus  for  editing  and viewing under control of your application, or
   ask  which  field it currently is in. The following functions help you
   accomplish this:
int set_current_field(FORM *form,         /* form to alter */
                      FIELD *field);      /* field to shift to */

FIELD *current_field(FORM *form);         /* form to query */

int field_index(FORM *form,               /* form to query */
                FIELD *field);            /* field to get index of */

   The function field_index() returns the index of the given field in the
   given   form's   field  array  (the  array  passed  to  new_form()  or
   set_form_fields()).

   The  initial  current field of a form is the first active field on the
   first page. The function set_form_fields() resets this.

   It is also possible to move around by pages.
int set_form_page(FORM *form,             /* form to alter */
                  int page);              /* page to go to (0-origin) */

int form_page(FORM *form);                /* return form's current page */

   The   initial  page  of  a  newly-created  form  is  0.  The  function
   set_form_fields() resets this.

Form Options

   Like  fields,  forms may have control option bits. They can be changed
   or queried with these functions:
int set_form_opts(FORM *form,             /* form to alter */
                  int attr);              /* attribute to set */

int form_opts_on(FORM *form,              /* form to alter */
                 int attr);               /* attributes to turn on */

int form_opts_off(FORM *form,             /* form to alter */
                  int attr);              /* attributes to turn off */

int form_opts(FORM *form);                /* form to query */

   By default, all options are on. Here are the available option bits:

   O_NL_OVERLOAD
          Enable  overloading  of  REQ_NEW_LINE  as  described in Editing
          Requests. The value of this option is ignored on dynamic fields
          that  have  not  reached  their  size limit; these have no last
          line,  so  the  circumstances  for  triggering a REQ_NEXT_FIELD
          never arise.

   O_BS_OVERLOAD
          Enable  overloading  of  REQ_DEL_PREV  as  described in Editing
          Requests.

   The option values are bit-masks and can be composed with logical-or in
   the obvious way.

Custom Validation Types

   The  form library gives you the capability to define custom validation
   types  of  your  own.  Further,  the  optional additional arguments of
   set_field_type effectively allow you to parameterize validation types.
   Most  of the complications in the validation-type interface have to do
   with the handling of the additional arguments within custom validation
   functions.

  Union Types

   The  simplest  way  to create a custom data type is to compose it from
   two preexisting ones:
FIELD *link_fieldtype(FIELDTYPE *type1,
                      FIELDTYPE *type2);

   This  function creates a field type that will accept any of the values
   legal  for  either  of  its  argument field types (which may be either
   predefined  or  programmer-defined).  If a set_field_type() call later
   requires  arguments,  the new composite type expects all arguments for
   the  first  type,  than  all arguments for the second. Order functions
   (see  Order Requests) associated with the component types will work on
   the  composite;  what it does is check the validation function for the
   first  type,  then  for  the  second,  to  figure what type the buffer
   contents should be treated as.

  New Field Types

   To  create  a field type from scratch, you need to specify one or both
   of the following things:
     * A  character-validation function, to check each character as it is
       entered.
     * A field-validation function to be applied on exit from the field.

   Here's how you do that:
typedef int     (*HOOK)();       /* pointer to function returning int */

FIELDTYPE *new_fieldtype(HOOK f_validate, /* field validator */
                         HOOK c_validate) /* character validator */


int free_fieldtype(FIELDTYPE *ftype);     /* type to free */

   At least one of the arguments of new_fieldtype() must be non-NULL. The
   forms  driver  will  automatically  call  the  new  type's  validation
   functions at appropriate points in processing a field of the new type.

   The  function  free_fieldtype()  deallocates  the  argument fieldtype,
   freeing all storage associated with it.

   Normally,  a field validator is called when the user attempts to leave
   the  field.  Its  first argument is a field pointer, from which it can
   get  to  field buffer 0 and test it. If the function returns TRUE, the
   operation  succeeds; if it returns FALSE, the edit cursor stays in the
   field.

   A  character  validator  gets  the  character  passed  in  as  a first
   argument.  It  too should return TRUE if the character is valid, FALSE
   otherwise.

  Validation Function Arguments

   Your  field-  and  character-  validation  functions  will be passed a
   second  argument  as  well.  This  second argument is the address of a
   structure   (which   we'll   call  a  pile)  built  from  any  of  the
   field-type-specific  arguments  passed to set_field_type(). If no such
   arguments  are  defined for the field type, this pile pointer argument
   will be NULL.

   In order to arrange for such arguments to be passed to your validation
   functions,  you  must  associate  a  small  set  of storage-management
   functions with the type. The forms driver will use these to synthesize
   a  pile from the trailing arguments of each set_field_type() argument,
   and a pointer to the pile will be passed to the validation functions.

   Here is how you make the association:
typedef char    *(*PTRHOOK)();    /* pointer to function returning (char *) */
typedef void    (*VOIDHOOK)();    /* pointer to function returning void */

int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
                      PTRHOOK make_str,   /* make structure from args */
                      PTRHOOK copy_str,   /* make copy of structure */
                      VOIDHOOK free_str); /* free structure storage */

   Here is how the storage-management hooks are used:

   make_str
          This  function  is  called  by  set_field_type().  It  gets one
          argument,  a  va_list  of the type-specific arguments passed to
          set_field_type().  It is expected to return a pile pointer to a
          data structure that encapsulates those arguments.

   copy_str
          This function is called by form library functions that allocate
          new  field  instances.  It  is expected to take a pile pointer,
          copy  the  pile to allocated storage, and return the address of
          the pile copy.

   free_str
          This   function  is  called  by  field-  and  type-deallocation
          routines  in the library. It takes a pile pointer argument, and
          is expected to free the storage of that pile.

   The  make_str  and  copy_str  functions  may  return  NULL  to  signal
   allocation  failure.  The  library  routines  will that call them will
   return  error  indication  when  this  happens.  Thus, your validation
   functions  should  never  see  a  NULL file pointer and need not check
   specially for it.

  Order Functions For Custom Types

   Some  custom  field  types are simply ordered in the same well-defined
   way  that  TYPE_ENUM  is.  For  such  types,  it is possible to define
   successor and predecessor functions to support the REQ_NEXT_CHOICE and
   REQ_PREV_CHOICE requests. Here's how:
typedef int     (*INTHOOK)();     /* pointer to function returning int */

int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
                      INTHOOK succ,       /* get successor value */
                      INTHOOK pred);      /* get predecessor value */

   The  successor  and  predecessor  arguments  will  each  be passed two
   arguments;  a field pointer, and a pile pointer (as for the validation
   functions).  They  are  expected to use the function field_buffer() to
   read  the current value, and set_field_buffer() on buffer 0 to set the
   next  or  previous  value.  Either  hook  may  return TRUE to indicate
   success  (a legal next or previous value was set) or FALSE to indicate
   failure.

  Avoiding Problems

   The  interface  for  defining  custom types is complicated and tricky.
   Rather  than attempting to create a custom type entirely from scratch,
   you  should start by studying the library source code for whichever of
   the pre-defined types seems to be closest to what you want.

   Use  that code as a model, and evolve it towards what you really want.
   You  will avoid many problems and annoyances that way. The code in the
   ncurses  library  has  been  specifically  exempted  from  the package
   copyright to support this.

   If  your  custom  type  defines  order  functions,  have  do something
   intuitive  with  a  blank  field.  A  useful convention is to make the
   successor   of  a  blank  field  the  types  minimum  value,  and  its
   predecessor the maximum.
