                            Announcing ncurses 6.5

Overview

   The  ncurses  (new  curses)  library  is  a free software emulation of
   curses  in  System  V  Release  4.0 (SVr4), and more. It uses terminfo
   format,  supports  pads  and  color  and multiple highlights and forms
   characters and function-key mapping, and has all the other SVr4-curses
   enhancements  over  BSD curses. SVr4 curses became the basis of X/Open
   Curses.

   In  mid-June  1995,  the  maintainer of 4.4BSD curses declared that he
   considered  4.4BSD curses obsolete, and encouraged the keepers of unix
   releases such as BSD/OS, FreeBSD and NetBSD to switch over to ncurses.

   Since 1995, ncurses has been ported to many systems:
     * It is used in almost every system based on the Linux kernel (aside
       from some embedded applications).
     * It  is  used  as the system curses library on OpenBSD, FreeBSD and
       MacOS.
     * It  is used in environments such as Cygwin and MinGW. The first of
       these was EMX on OS/2 Warp.
     * It is used (though usually not as the system curses) on all of the
       vendor  unix  systems,  e.g.,  AIX,  HP-UX,  IRIX64, SCO, Solaris,
       Tru64.
     * It should work readily on any ANSI/POSIX-conforming unix.

   The distribution includes the library and support utilities, including
     * captoinfo, a termcap conversion tool
     * clear, utility for clearing the screen
     * infocmp, the terminfo decompiler
     * tabs, set tabs on a terminal
     * tic, the terminfo compiler
     * toe, list (table of) terminfo entries
     * tput,  utility  for  retrieving  terminal  capabilities  in  shell
       scripts
     * tset, to initialize the terminal

   Full manual pages are provided for the library and tools.

   The ncurses distribution is available at ncurses' homepage:

     https://invisible-island.net/archives/ncurses/ or
     https://invisible-mirror.net/archives/ncurses/ .

   It is also available at the GNU distribution site

     https://ftp.gnu.org/gnu/ncurses/ .

Release Notes

   These notes are for ncurses 6.5, released April 27, 2024.

   This  release  is  designed  to  be source-compatible with ncurses 5.0
   through  6.4; providing extensions to the application binary interface
   (ABI).  Although  the  source  can  still be configured to support the
   ncurses  5  ABI, the reason for the release is to reflect improvements
   to the ncurses 6 ABI and the supporting utility programs.

   There  are,  of  course,  numerous  other improvements, listed in this
   announcement.

   The   most  important  bug-fixes/improvements  dealt  with  robustness
   issues.  The  release notes also mention some other bug-fixes, but are
   focused  on  new  features and improvements to existing features since
   ncurses 6.4 release.

  Library improvements

    New features

   These are new features:
     * The low-level terminfo and termcap interfaces are used both by the
       higher-level curses library, as well as by many applications.
       The  functions  which  convert  parameterized  terminal capability
       strings  for output to the terminal (tiparm and tparm) analyze the
       capability string to determine which parameters are strings (i.e.,
       addresses), versus numbers (not addresses).
       The  library's analysis of a capability string may differ from the
       calling  application's design if environment variables are used to
       point  to  an  invalid  terminal  database. This is a longstanding
       problem  with  all  implementations  of  terminfo, dating from the
       early 1980s.
       Two  new  functions  address this problem: by providing a function
       which  allows  the  calling  application  to tell ncurses how many
       string-parameters to expect:
          + tiscan_s  helps  applications  check  formatting capabilities
            that would be passed to tiparm_s.
          + tiparm_s provides applications a way to tell ncurses what the
            expected parameters are for a capability.
     * The  ncurses library supports a compile-time feature (enabled with
       the   configure   --enable-check-size   option)  which  simplifies
       initialization  with  terminals  which  do  not  negotiate  window
       (screen)  size.  This is done in setupterm, by providing for using
       ANSI cursor-position report (in user6/user7 terminfo capabilities)
       to  obtain  the  screen  size  if neither environment variables or
       ioctl is used.
       The  ncurses  test-program  with options "-E -T" demonstrates this
       feature.
     * add functions to query tty-flags in SCREEN

   This release drops compatibility with obsolete versions of tack, e.g.,
   pre-1.08

    Other improvements

   These are improvements to existing features:
     * In  addition  to  the  new,  safer function tiparm_s, ncurses adds
       checks to make the older tiparm, tparm and tgoto functions safer:
          + the  terminfo  functions  tiparm  and  tparm  ensure that the
            capability  string  comes from the terminal description which
            ncurses  loads,  rather  than  from  random  data  which  the
            application happens to have.
          + the  tgoto function disallows capabilities which its analysis
            shows will attempt to use string parameters.
          + ncurses  uses  internal functions which correspond to tiparm,
            and  tgoto which ensure that the capability strings which are
            passed  to  these  functions  come  from  the loaded terminal
            description.
     * improve  check  in  lib_tparm.c, ensuring that a char* fits into a
       TPARM_ARG
     * modify  _nc_syserr_abort  to  use _nc_env_access, rather than only
       checking root uid
     * improve thread lock in lib_trace.c
     * modify  flushinp  to  use  file descriptors in SCREEN, rather than
       from TERMINAL, and check if they are for a terminal, like SVr4
     * modify mcprint to use file descriptor in SCREEN, for consistency
     * modify  internal  function  _nc_read_file_entry  to  show relevant
       filename in warnings
     * improve  checks  in  internal  function convert_string for corrupt
       terminfo entry
     * review/improve handling of out-of-memory conditions
     * limit  delays  to 30 seconds, i.e., padding delays in terminfo, as
       well as napms and delay_output functions
     * fix  reallocation  loop  for  vsnprintf  in  _nc_sprintf_string by
       copying the va_list variable
     * modify  delscreen  to  limit  the windows which it creates to just
       those associated with the screen
     * modify  endwin to return an error if it is called again without an
       intervening screen update
     * modify wenclose to handle pads
     * eliminate use of PATH_MAX in lib_trace.c
     * provide for any CCHARW_MAX greater than 1

   These are corrections to existing features:
     * correct loop termination condition in waddnstr and waddnwstr
     * improve  parsing  in  internal  function _nc_msec_cost, allowing a
       single decimal point
     * amend  parameter check for entire string versus specific length in
       winsnstr  and wins_nwstr to match Solaris; make similar correction
       to wins_nwstr
     * correct   internal   function   wadd_wch_literal   when  adding  a
       non-spacing character to a double-width character
     * correct  definition of Charable macro for non-wide ncurses library
       .

  Program improvements

   Several improvements were made to the utility programs. Some were done
   to  make  the  infocmp  option  "-u" option help refactor the terminal
   database.

   infocmp

          + add  limit  checks  for processing extended capabilities with
            the "-u" option
          + correct  initial  alignment of extended capabilities, so that
            the "-u" option can be used for more than two terminal types
          + modify  "-u"  option  to not report cancels for strings which
            were already cancelled in a use'd chunk.
          + correct  an  assignment  "-u"  for  detecting if a boolean is
            unset  in  a base entry and set in a use'd chunk, i.e., if it
            was cancelled.

   tic

          + correct limit-check when dumping tc/use clause via "-I"
          + check  return  value  of  _nc_save_str, in special case where
            extended   capabilities   are   processed  but  the  terminal
            description was not initialized
          + modify  check for multiply defined aliases to report problems
            within  the  current  runtime  rather than for conflicts with
            pre-existing terminal descriptions.
          + disallow  using $TERMINFO or $HOME/.terminfo when "-o" option
            is used

   tput and tset

          + add "-v" option to tput, to show warnings
          + modify reset command to avoid altering clocal if the terminal
            uses a modem
          + modify  reset feature to avoid 1-second sleep if running in a
            pseudo-terminal

    Examples

   Along  with  the  library and utilities, improvements were made to the
   ncurses-examples:
     * modify test_tparm to account for extended capabilities
     * corrected mouse mask in test/testcurs.c
     * modify test/clip_printw.c to optionally test non-wrapped updates
     * modify test/test_mouse.c to use curses api for raw/noraw
     * modify test/clip_printw.c to optionally test non-wrapped updates

   There is one new demo/test programs:

   test/test_endwin.c
          This program shows the return-status from endwin with different
          combinations of endwin (repeated), initscr, newterm.

  Terminal database

   There are several new terminal descriptions:
     * ansi+apparrows
     * contour
     * linux+kbs for terminals which imitate xterm's behavior with Linux
     * rio, rio-direct
     * mostlike
     * ms-vt100-16color, winconsole
     * vt100+noapp,   vt100+noapp+pc,  xterm+app+pc,  xterm+decedit  from
       xterm #389
     * putty+cursor to reflect amending of modified cursor-keys in 2021
     * wezterm

   There  are  many  changes to existing terminal descriptions. Some were
   updates  to  several  descriptions, using the infocmp "-u" option in a
   script  to  determine  which  building-block  entries could be used to
   replace multiple capability settings (and trim redundant information).

   Other changes include:
     * document XF, kxIN and kxOUT
     * add note on sun regarding wscons/cmdtool/shelltool
     * remove DECCOLM+DECSCLM from foot
     * add xterm+focus to foot+base
     * add ecma+strikeout to putty
     * use CSI 3J in vte-2017
     * use oldxterm+sm+1006 in vte-2014
     * modify xgterm to work around line-drawing bug
     * add  xterm  focus  mode 1004 to xterm+focus as fe/fd capabilities,
       like vim.
     * add xterm+focus to alacritty+common
     * add  XR/xr,  to work with vim, and use RV/rv to denote DA2 and its
       response
     * add  XF  flag  to  xterm+focus so that termcap applications can be
       aware of terminals which may support focus in/out
     * use xterm+focus in xterm-p370 and tmux
     * remove xterm+sm+1006 from tmux
     * NetBSD-related fixes for x68k and wsvt25

  Documentation

   As usual, this release
     * improves documentation by describing new features,
     * attempts  to  improve the description of features which users have
       found confusing
     * fills  in overlooked descriptions of features which were described
       in the NEWS file but treated sketchily in manual pages.

   In  addition  to  providing  background  information  to explain these
   features   and   show   how   they  evolved,  there  are  corrections,
   clarifications, etc.:
     * Corrections:
          + add   assignment   in  CF_MAN_PAGES  to  fill  in  value  for
            TERMINFO_DIRS in ncurses, terminfo and tic manpages.
          + clarify  interaction  of  -R  option  versus -C, -I and -r in
            infocmp manpage.
          + correct manpage description of panel_hidden.
          + improve  manpage  description  for addch versus unctrl format
            used for non-printable characters.
          + improve  manpages  discussing  file  descriptors in low-level
            functions.
          + improve description of search rules for terminal descriptions
            in terminfo manpage.
          + modify  dist.mk  to  avoid  passing  developer's  comments in
            manpages into the generated html documentation.
          + modify  test-package  "ncurses6-doc"  to use manpage-aliases,
            which  in  turn  required a change to the configure script to
            factor in the extra-suffix option when deriving alias names.
     * New/improved history and portability sections:
          + add  information  about  "ttycap",  termcap's  forerunner, to
            tset.1
          + document   limitations   of   tparm,   and  error-returns  in
            curs_terminfo.3x
          + document   limitations   of   tgoto,   and  error-returns  in
            curs_termcap.3x
     * Other improvements:
          + This  release  has many changes to improve the formatting and
            style of the manpages.
          + Manpages  now use consistent section-naming, page headers and
            footers (including the modification date for each page).
          + Table layout has been revised.

   There  are  no new manual pages (all of the manual page updates are to
   existing pages).

  Interesting bug-fixes

   The  changes to tparm, tgoto which improve the design of the low-level
   interfaces are interesting, but are not bug-fixes per se.

  Configuration changes

    Major changes

   These are the major changes (aside from introducing tiparm_s):
     * use wide-character (ncursesw) by default
     * use opaque typedefs by default

   However,  most  of  the  work  on configure scripts was done to reduce
   warnings within the configure script:
     * intrusive warnings from GNU grep regarding fgrep and egrep
     * fatal  errors  in  compile-checks,  arising from recent "Modern C"
       efforts  by  some  developers  which caused longstanding configure
       checks to fail.
       After  repairing  the  configure  script,  none  of  that activity
       affected  ncurses  because stricter warnings are used routinely in
       development.

   Other improvements made to configure checks include
     * use  string-hacks in alloc_entry.c, alloc_type.c and hardscroll.c,
       overlooked due to compiler changes in recent OpenBSD releases
     * revise progs.priv.h to provide for NC_ISATTY reuse
     * configure check for MB_LEN_MAX provides warning as needed
     * trim   a   space  after  some  "-R"  options,  fixing  builds  for
       applications built using clang and ncurses on Solaris
     * work  around  misconfiguration  of  MacPorts  gcc13, which exposes
       invalid  definition  of  MB_LEN_MAX  in  gcc's  fallback  copy  of
       limits.h
     * modified  experimental  Windows  driver  works  with  xterm  mouse
       protocol

    Configuration options

   There are a few new configure options:

   --disable-setuid-environ
          Compile  with  environment  restriction, so certain environment
          variables  are  not  available when running via a setuid/setgid
          application. These are (for example $TERMINFO) those that allow
          the  search  path  for  the  terminfo  or  termcap  entry to be
          customized.

          A  setuid/setgid application inherits its environment variables
          from  the current user, in contrast to sudo which may limit the
          environment variables that ncurses uses.

   --enable-check-size
          Compile-in  feature to detect screensize for terminals which do
          not advertise their screensize, e.g., serial terminals.

   --with-abi-altered=NUM
          Override  the  displayed  (rather  than  compiled-in) ABI. Only
          packagers who have created configurations where the ABI differs
          from ncurses should be interested in this option.

   --with-strip-program=XXX
          When  stripping  executables  during install, use the specified
          program  rather  than  "strip" overriding program chosen by the
          install program for stripping executables.

   These configure options are modified:

   --with-pkg-config-libdir[=DIR]
          The  optional  DIR parameter can now be "auto" to automatically
          use pkg-config's library directory.

          The default is $(libdir).

   --with-xterm-kbs[=XXX]
          The  default  is  "auto"  which  tells  the configure script to
          choose BS or DEL according to platform defaults.

  Portability

   Many  of  the  portability  changes  are implemented via the configure
   script:
     * add/use   configure   check   for   clock_gettime,   to  supersede
       gettimeofday.
     * modify  configure script check for pkg-config library directory to
       take   into   account   an   older   version   0.15.0  which  used
       PKG_CONFIG_PATH but not PKG_CONFIG_LIBDIR
     * allow for MinGW32-/64-bit configurations to use _DEFAULT_SOURCE
     * modify   CF_XOPEN_SOURCE  macro's  amend  default  case  to  avoid
       undefining _XOPEN_SOURCE if _POSIX_C_SOURCE is defined
     * updated configure script macro CF_XOPEN_SOURCE, for uClibc-ng
     * modify version-check for gcc/g++, now works for msys2
     * build-fixes related to configure-options and/or platform:
          + fix for --enable-fvisibility
          + fix for unusual values of --with-rel-version
          + fix for unusual values of --with-abi-version
          + fix for --disable-tcap-names
          + fix for termcap in nc_access.h
     * other configure-script improvements:
          + recent msys2 headers work with _DEFAULT_SOURCE; amend check
          + use  $ac_includes_default in most cases where stdlib.h should
            work
          + use #error consistently vs "make an error"
          + add configure macro for gettimeofday vs inline check

   Here are some of the other portability fixes:
     * modify  configure  scripts/makefiles  to  omit  KEY_RESIZE  if the
       corresponding SIGWINCH feature is disabled
     * increase MB_CUR_MAX to 16, matching glibc's MB_LEN_MAX
     * add BSD erase2 to characters handled by tset/reset
     * use getauxval when available, to improve setuid/setgid checks
     * set dwShareMode in calls to CreateConsoleScreenBuffer
     * use  CreateFile  with "CONIN$", "CONOUT$" rather than GetStdHandle
       to  obtain a handle on the actual console, avoiding redirection in
       the MinGW/Win32 configurations
     * modify  MinGW  driver  to  return KEY_BACKSPACE when an unmodified
       VK_BACK virtual key is entered
     * modify  MinGW  configuration  to provide for running in MSYS/MSYS2
       shells, assuming ConPTY support
     _________________________________________________________________

Features of ncurses

   The  ncurses  package  is  fully upward-compatible with SVr4 (System V
   Release 4) curses:
     * All of the SVr4 calls have been implemented (and are documented).
     * ncurses  supports  the  features of SVr4 curses including keyboard
       mapping,  color,  form  drawing with ACS characters, and automatic
       recognition of keypad and function keys.
     * ncurses  provides  work-alike  replacements  of  SVr4 supplemental
       libraries  based on curses, but which were not specified by X/Open
       Curses:
          + the panel library, supporting a stack of windows with backing
            store
          + the menu library, supporting a uniform but flexible interface
            for menu programming
          + the   form   library,   supporting  data  collection  through
            on-screen forms
     * ncurses's  terminal database is fully compatible with that used by
       SVr4 curses.
          + ncurses  supports  user-defined capabilities that it can see,
            but  which are hidden from SVr4 curses applications using the
            same terminal database.
          + It  can  be optionally configured to match the format used in
            related systems such as AIX and Tru64.
          + Alternatively,  ncurses  can  be  configured  to  use  hashed
            databases  rather  than  the  directory of files used by SVr4
            curses.
     * The ncurses utilities have options to allow you to filter terminfo
       entries for use with less capable curses/terminfo versions such as
       the HP-UX and AIX ports.

   The ncurses package also has many useful extensions over SVr4:
     * The  API  is 8-bit clean and base-level conformant with the X/Open
       Curses  specification, XSI curses (that is, it implements all BASE
       level  features,  and  almost  all EXTENDED features). It includes
       many   function   calls  not  supported  under  SVr4  curses  (but
       portability  of  all  calls  is documented so you can use the SVr4
       subset only).
     * Unlike  SVr3 curses, ncurses can write to the rightmost-bottommost
       corner  of  the  screen  if  your terminal has an insert-character
       capability.
     * Ada95 and C++ bindings.
     * Support  for mouse event reporting with X Window xterm and FreeBSD
       and OS/2 console windows.
     * Extended mouse support via Alessandro Rubini's gpm package.
     * The  function  wresize  allows  you  to resize windows, preserving
       their data.
     * The  function  use_default_colors allows you to use the terminal's
       default colors for the default color pair, achieving the effect of
       transparent colors.
     * The functions keyok and define_key allow you to better control the
       use of function keys, e.g., disabling the ncurses KEY_MOUSE, or by
       defining  more  than  one  control  sequence to map to a given key
       code.
     * Support for direct-color terminals, such as modern xterm.
     * Support for 256-color terminals, such as modern xterm.
     * Support for 16-color terminals, such as aixterm and modern xterm.
     * Better  cursor-movement  optimization.  The package now features a
       cursor-local-movement computation more efficient than either BSD's
       or System V's.
     * Super   hardware   scrolling   support.   The  screen-update  code
       incorporates  a novel, simple, and cheap algorithm that enables it
       to  make  optimal  use  of hardware scrolling, line-insertion, and
       line-deletion  for  screen-line  movements. This algorithm is more
       powerful than the 4.4BSD curses quickch routine.
     * Real  support  for  terminals  with  the  magic-cookie glitch. The
       screen-update  code  will  refrain from drawing a highlight if the
       magic-   cookie  unattributed  spaces  required  just  before  the
       beginning  and  after the end would step on a non-space character.
       It  will  automatically  shift  highlight boundaries when doing so
       would  make it possible to draw the highlight without changing the
       visual appearance of the screen.
     * It  is  possible to generate the library with a list of pre-loaded
       fallback  entries linked to it so that it can serve those terminal
       types  even  when  no  terminfo tree or termcap file is accessible
       (this  may  be useful for support of screen-oriented programs that
       must run in single-user mode).
     * The tic/captoinfo utility provided with ncurses has the ability to
       translate  many  termcaps  from  the XENIX, IBM and AT&T extension
       sets.
     * A BSD-like tset utility is provided.
     * The ncurses library and utilities will automatically read terminfo
       entries  from  $HOME/.terminfo  if  it exists, and compile to that
       directory  if  it  exists  and the user has no write access to the
       system  directory.  This feature makes it easier for users to have
       personal  terminfo  entries without giving up access to the system
       terminfo directory.
     * You  may  specify  a  path  of  directories to search for compiled
       descriptions  with  the  environment  variable TERMINFO_DIRS (this
       generalizes  the  feature  provided by TERMINFO under stock System
       V.)
     * In  terminfo  source files, use capabilities may refer not just to
       other entries in the same source file (as in System V) but also to
       compiled  entries  in  either the system terminfo directory or the
       user's $HOME/.terminfo directory.
     * The  table-of-entries  utility  toe makes it easy for users to see
       exactly what terminal types are available on the system.
     * X/Open  Curses  permits  most  functions  it  specifies to be made
       available as macros as well. ncurses does this
          + to  improve  performance,  e.g.,  for  operations composed of
            simpler functions such as cursor movement following by adding
            text to the screen,
          + to simplify the implementation by reusing functions which use
            common parameters, e.g., the standard screen stdscr, and
          + to provide functions that return values via their parameters
       Except   for   the   last   case,  ncurses  provides  a  non-macro
       implementation  of  the  function.  If  the  macro  definition  is
       disabled with #undef, or by defining NCURSES_NOMACROS the function
       may  be  linked  (and  its  calls  will  be  checked  against  the
       prototype).
     * Extensive  documentation  is  provided (see the Additional Reading
       section of the ncurses FAQ for online documentation).

Applications using ncurses

   The  ncurses  distribution  includes  a  selection  of  test  programs
   (including   a   few   games).   These  are  available  separately  as
   ncurses-examples

   The   ncurses   library  has  been  tested  with  a  wide  variety  of
   applications including:

   aptitude
          FrontEnd to Apt, the debian package manager

          https://wiki.debian.org/Aptitude

   cdk
          Curses Development Kit

          https://invisible-island.net/cdk/

   ded
          directory-editor

          https://invisible-island.net/ded/

   dialog
          the  underlying  application used in Slackware's setup, and the
          basis   for  similar  install/configure  applications  on  many
          systems.

          https://invisible-island.net/dialog/

   lynx
          the text WWW browser

          https://lynx.invisible-island.net/

   mutt
          mail utility

          http://www.mutt.org/

   ncftp
          file-transfer utility

          https://www.ncftp.com/

   nvi
          New vi uses ncurses.

          https://sites.google.com/a/bostic.com/keithbostic/the-berkeley-
          vi-editor-home-page

   ranger
          A console file manager with VI key bindings in Python.

          https://ranger.github.io/

   tin
          newsreader, supporting color, MIME

          http://www.tin.org/

   vifm
          File manager with vi like keybindings

          https://vifm.info/

   as well as some that use ncurses for the terminfo support alone:

   minicom
          terminal emulator for serial modem connections

          https://salsa.debian.org/minicom-team/minicom

   mosh
          a replacement for ssh.

          https://mosh.org/

   tack
          terminfo action checker

          https://invisible-island.net/ncurses/tack.html

   tmux
          terminal multiplexor

          https://github.com/tmux/tmux/wiki

   vile
          vi-like-emacs  may  be  built  to  use the terminfo, termcap or
          curses interfaces.

          https://invisible-island.net/vile/

   and finally, those which use only the termcap interface:

   emacs
          text editor

          https://www.gnu.org/software/emacs/

   less
          The  most  commonly  used  pager  (a program that displays text
          files).

          http://www.greenwoodsoftware.com/less/

   screen
          terminal multiplexor

          https://www.gnu.org/software/screen/

   vim
          text editor

          https://www.vim.org/

Development activities

   Zeyd  Ben-Halim  started  ncurses  from  a  previous  package pcurses,
   written  by  Pavel  Curtis.  Eric  S.  Raymond  continued development.
   Juergen Pfeifer wrote most of the form and menu libraries.

   Ongoing development work is done by Thomas E. Dickey. Thomas E. Dickey
   has  acted  as  the maintainer for the Free Software Foundation, which
   held  a  copyright  on ncurses for releases 4.2 through 6.1. Following
   the release of ncurses 6.1, effective as of release 6.2, copyright for
   ncurses  reverted  to  Thomas  E.  Dickey  (see  the  ncurses  FAQ for
   additional information).

   Contact the current maintainers at

     bug-ncurses@gnu.org

   To join the ncurses mailing list, please write email to

     bug-ncurses-request@gnu.org

   containing the line:

     subscribe <name>@<host.domain>

   This list is open to anyone interested in helping with the development
   and testing of this package.

   Beta versions of ncurses are made available at

     https://invisible-island.net/archives/ncurses/current/ and
     https://invisible-mirror.net/archives/ncurses/current/ .

   Patches to the current release are made available at

     https://invisible-island.net/archives/ncurses/6.4/ and
     https://invisible-mirror.net/archives/ncurses/6.4/ .

   There is an archive of the mailing list here:

     https://lists.gnu.org/archive/html/bug-ncurses .

Related resources

   The  release notes make scattered references to these pages, which may
   be interesting by themselves:
     * ncurses licensing
     * Symbol versioning in ncurses
     * Comments on ncurses versus slang (S-Lang)
     * Comments on OpenBSD
     * tack - terminfo action checker
     * tctest - termcap library checker
     * Terminal Database

Other resources

   The  distribution  provides  a  newer  version  of the terminfo-format
   terminal description file once maintained by Eric Raymond . Unlike the
   older  version, the termcap and terminfo data are provided in the same
   file, which also provides several user-definable extensions beyond the
   X/Open Curses specification.

   You  can  find  lots  of  information  on  terminal-related topics not
   covered  in the terminfo file in Richard Shuford's archive (original).
   The  collection  of  computer  manuals  at bitsavers.org has also been
   useful.

     * Overview
     * Release Notes
          + Library improvements
               o New features
               o Other improvements
          + Program improvements
               o Utilities
               o Examples
          + Terminal database
          + Documentation
          + Interesting bug-fixes
          + Configuration changes
               o Major changes
               o Configuration options
          + Portability
     * Features of ncurses
     * Applications using ncurses
     * Development activities
     * Related resources
     * Other resources
