.\"***************************************************************************
.\" Copyright (c) 1999-2007,2008 Free Software Foundation, Inc.              *
.\"                                                                          *
.\" Permission is hereby granted, free of charge, to any person obtaining a  *
.\" copy of this software and associated documentation files (the            *
.\" "Software"), to deal in the Software without restriction, including      *
.\" without limitation the rights to use, copy, modify, merge, publish,      *
.\" distribute, distribute with modifications, sublicense, and/or sell       *
.\" copies of the Software, and to permit persons to whom the Software is    *
.\" furnished to do so, subject to the following conditions:                 *
.\"                                                                          *
.\" The above copyright notice and this permission notice shall be included  *
.\" in all copies or substantial portions of the Software.                   *
.\"                                                                          *
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
.\"                                                                          *
.\" Except as contained in this notice, the name(s) of the above copyright   *
.\" holders shall not be used in advertising or otherwise to promote the     *
.\" sale, use or other dealings in this Software without prior written       *
.\" authorization.                                                           *
.\"***************************************************************************
.\"
.\" $Id: curs_terminfo.3x,v 1.30 2008/08/16 20:53:27 tom Exp $
.TH curs_terminfo 3X ""
.ds n 5
.na
.hy 0
.SH NAME
\fBdel_curterm\fR,
\fBmvcur\fR,
\fBputp\fR,
\fBrestartterm\fR,
\fBset_curterm\fR,
\fBsetterm\fR,
\fBsetupterm\fR,
\fBtigetflag\fR,
\fBtigetnum\fR,
\fBtigetstr\fR,
\fBtparm\fR,
\fBtputs\fR,
\fBvid_attr\fR,
\fBvid_puts\fR,
\fBvidattr\fR,
\fBvidputs\fR - \fBcurses\fR interfaces to terminfo database
.ad
.hy
.SH SYNOPSIS
.nf
\fB#include <curses.h>\fR
.br
\fB#include <term.h>\fR
.PP
\fBint setupterm(char *\fR\fIterm\fR\fB, int \fR\fIfildes\fR\fB, int *\fR\fIerrret\fR\fB);\fR
.br
\fBint setterm(char *\fR\fIterm\fR\fB);\fR
.br
\fBTERMINAL *set_curterm(TERMINAL *\fR\fInterm\fR\fB);\fR
.br
\fBint del_curterm(TERMINAL *\fR\fIoterm\fR\fB);\fR
.br
\fBint restartterm(char *\fR\fIterm\fR\fB, int \fR\fIfildes\fR\fB, int *\fR\fIerrret\fR\fB);\fR
.br
\fBchar *tparm(char *\fR\fIstr\fR\fB, ...);\fR
.br
\fBint tputs(const char *\fR\fIstr\fR\fB, int \fR\fIaffcnt\fR\fB, int (*\fR\fIputc\fR\fB)(int));\fR
.br
\fBint putp(const char *\fR\fIstr\fR\fB);\fR
.br
\fBint vidputs(chtype \fR\fIattrs\fR\fB, int (*\fR\fIputc\fR\fB)(int));\fR
.br
\fBint vidattr(chtype \fR\fIattrs\fR\fB);\fR
.br
\fBint vid_puts(attr_t \fR\fIattrs\fR\fB, short \fR\fIpair\fR\fB, void *\fR\fIopts\fR\fB, int (*\fR\fIputc\fR\fB)(char));\fR
.br
\fBint vid_attr(attr_t \fR\fIattrs\fR\fB, short \fR\fIpair\fR\fB, void *\fR\fIopts\fR\fB);\fR
.br
\fBint mvcur(int \fR\fIoldrow\fR\fB, int \fR\fIoldcol\fR\fB, int \fR\fInewrow\fR, int \fR\fInewcol\fR\fB);\fR
.br
\fBint tigetflag(char *\fR\fIcapname\fR\fB);\fR
.br
\fBint tigetnum(char *\fR\fIcapname\fR\fB);\fR
.br
\fBchar *tigetstr(char *\fR\fIcapname\fR\fB);\fR
.br
.fi
.SH DESCRIPTION
These low-level routines must be called by programs that have to deal
directly with the \fBterminfo\fR database to handle certain terminal
capabilities, such as programming function keys.  For all other
functionality, \fBcurses\fR routines are more suitable and their use is
recommended.
.PP
Initially, \fBsetupterm\fR should be called.  Note that
\fBsetupterm\fR is automatically called by \fBinitscr\fR and
\fBnewterm\fR.  This defines the set of terminal-dependent variables
[listed in \fBterminfo\fR(\*n)].
The \fBterminfo\fR variables
\fBlines\fR and \fBcolumns\fR are initialized by \fBsetupterm\fR as
follows:
.RS
.PP
If \fBuse_env(FALSE)\fR has been called, values for
\fBlines\fR and \fBcolumns\fR specified in \fBterminfo\fR are used.
.PP
Otherwise, if the environment variables \fBLINES\fR and \fBCOLUMNS\fR
exist, their values are used.  If these environment variables do not
exist and the program is running in a window, the current window size
is used.  Otherwise, if the environment variables do not exist, the
values for \fBlines\fR and \fBcolumns\fR specified in the
\fBterminfo\fR database are used.
.RE
.PP
The header files \fBcurses.h\fR and \fBterm.h\fR should be included (in this
order) to get the definitions for these strings, numbers, and flags.
Parameterized strings should be passed through \fBtparm\fR to instantiate them. 
All \fBterminfo\fR strings [including the output of \fBtparm\fR] should be printed
with \fBtputs\fR or \fBputp\fR.  Call the \fBreset_shell_mode\fR to restore the
tty modes before exiting [see \fBcurs_kernel\fR(3X)].  Programs which use
cursor addressing should output \fBenter_ca_mode\fR upon startup and should
output \fBexit_ca_mode\fR before exiting.  Programs desiring shell escapes
should call
.PP
\fBreset_shell_mode\fR and output \fBexit_ca_mode\fR before the shell
is called and should output \fBenter_ca_mode\fR and call
\fBreset_prog_mode\fR after returning from the shell.
.PP
The \fBsetupterm\fR routine reads in the \fBterminfo\fR database,
initializing the \fBterminfo\fR structures, but does not set up the
output virtualization structures used by \fBcurses\fR.  The terminal
type is the character string \fIterm\fR; if \fIterm\fR is null, the
environment variable \fBTERM\fR is used.
All output is to file descriptor \fBfildes\fR which is initialized for output.
If \fIerrret\fR is not null,
then \fBsetupterm\fR returns \fBOK\fR or
\fBERR\fR and stores a status value in the integer pointed to by
\fIerrret\fR.
A return value of \fBOK\fR combined with status of \fB1\fR in \fIerrret\fR
is normal.
If \fBERR\fR is returned, examine \fIerrret\fR:
.RS
.TP 5
.B 1
means that the terminal is hardcopy, cannot be used for curses applications.
.TP 5
.B 0
means that the terminal could not be found,
or that it is a generic type,
having too little information for curses applications to run.
.TP 5
.B -1
means that the \fBterminfo\fR database could not be found.
.RE
.PP
If \fIerrret\fR is
null, \fBsetupterm\fR prints an error message upon finding an error
and exits.  Thus, the simplest call is:
.sp
      \fBsetupterm((char *)0, 1, (int *)0);\fR,
.sp
which uses all the defaults and sends the output to \fBstdout\fR.
.PP
The \fBsetterm\fR routine is being replaced by \fBsetupterm\fR.  The call:
.sp
      \fBsetupterm(\fR\fIterm\fR\fB, 1, (int *)0)\fR
.sp
provides the same functionality as \fBsetterm(\fR\fIterm\fR\fB)\fR.
The \fBsetterm\fR routine is included here for BSD compatibility, and
is not recommended for new programs.
.PP
The \fBset_curterm\fR routine sets the variable \fBcur_term\fR to
\fInterm\fR, and makes all of the \fBterminfo\fR boolean, numeric, and
string variables use the values from \fInterm\fR.  It returns the old value
of \fBcur_term\fR.
.PP
The \fBdel_curterm\fR routine frees the space pointed to by
\fIoterm\fR and makes it available for further use.  If \fIoterm\fR is
the same as \fBcur_term\fR, references to any of the \fBterminfo\fR
boolean, numeric, and string variables thereafter may refer to invalid
memory locations until another \fBsetupterm\fR has been called.
.PP
The \fBrestartterm\fR routine is similar to \fBsetupterm\fR and \fBinitscr\fR,
except that it is called after restoring memory to a previous state (for
example, when reloading a game saved as a core image dump).  It assumes that
the windows and the input and output options are the same as when memory was
saved, but the terminal type and baud rate may be different.  Accordingly,
it saves various tty state bits, calls \fBsetupterm\fP,
and then restores the bits.
.PP
The \fBtparm\fR routine instantiates the string \fIstr\fR with
parameters \fIpi\fR.  A pointer is returned to the result of \fIstr\fR
with the parameters applied.
.PP
The \fBtputs\fR routine applies padding information to the string
\fIstr\fR and outputs it.  The \fIstr\fR must be a terminfo string
variable or the return value from \fBtparm\fR, \fBtgetstr\fR, or
\fBtgoto\fR.  \fIaffcnt\fR is the number of lines affected, or 1 if
not applicable.  \fIputc\fR is a \fBputchar\fR-like routine to which
the characters are passed, one at a time.
.PP
The \fBputp\fR routine calls \fBtputs(\fR\fIstr\fR\fB, 1, putchar)\fR.
Note that the output of \fBputp\fR always goes to \fBstdout\fR, not to
the \fIfildes\fR specified in \fBsetupterm\fR.
.PP
The \fBvidputs\fR routine displays the string on the terminal in the
video attribute mode \fIattrs\fR, which is any combination of the
attributes listed in \fBcurses\fR(3X).  The characters are passed to
the \fBputchar\fR-like routine \fIputc\fR.
.PP
The \fBvidattr\fR routine is like the \fBvidputs\fR routine, except
that it outputs through \fBputchar\fR.
.PP
The \fBvid_attr\fR and \fBvid_puts\fR routines correspond to vidattr and vidputs,
respectively.
They use a set of arguments for representing the video attributes plus color,
i.e.,
one of type attr_t for the attributes and one of short for
the color_pair number.
The \fBvid_attr\fR and \fBvid_puts\fR routines
are designed to use the attribute constants with the \fIWA_\fR prefix.
The opts argument is reserved for future use.
Currently, applications must provide a null pointer for that argument.
.PP
The \fBmvcur\fR routine provides low-level cursor motion.  It takes
effect immediately (rather than at the next refresh).
.PP
The \fBtigetflag\fR, \fBtigetnum\fR and \fBtigetstr\fR routines return
the value of the capability corresponding to the \fBterminfo\fR
\fIcapname\fR passed to them, such as \fBxenl\fR.
.PP
The \fBtigetflag\fR routine returns the value \fB-1\fR if
\fIcapname\fR is not a boolean capability,
or \fB0\fR if it is canceled or absent from the terminal description.
.PP
The \fBtigetnum\fR routine returns the value \fB-2\fR if
\fIcapname\fR is not a numeric capability,
or \fB-1\fR if it is canceled or absent from the terminal description.
.PP
The \fBtigetstr\fR routine returns the value \fB(char *)-1\fR
if \fIcapname\fR is not a string capability,
or \fB0\fR if it is canceled or absent from the terminal description.
.PP
The \fIcapname\fR for each capability is given in the table column entitled
\fIcapname\fR code in the capabilities section of \fBterminfo\fR(\*n).
.sp
.RS
\fBchar *boolnames[]\fR, \fB*boolcodes[]\fR, \fB*boolfnames[]\fR
.sp
\fBchar *numnames[]\fR, \fB*numcodes[]\fR, \fB*numfnames[]\fR
.sp
\fBchar *strnames[]\fR, \fB*strcodes[]\fR, \fB*strfnames[]\fR
.RE
.PP
These null-terminated arrays contain the \fIcapnames\fR, the
\fBtermcap\fR codes, and the full C names, for each of the
\fBterminfo\fR variables.
.SH RETURN VALUE
Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR
(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
completion, unless otherwise noted in the preceding routine descriptions.
.PP
Routines that return pointers always return \fBNULL\fR on error.
.PP
X/Open defines no error conditions.
In this implementation
.RS
.TP 5
\fBdel_curterm\fP
returns an error
if its terminal parameter is null.
.TP 5
\fBputp\fP
calls \fBtputs\fP, returning the same error-codes.
.TP 5
\fBrestartterm\fP
returns an error
if the associated call to \fBsetupterm\fP returns an error.
.TP 5
\fBsetupterm\fP
returns an error
if it cannot allocate enough memory, or
create the initial windows (stdscr, curscr, newscr).
Other error conditions are documented above.
.TP 5
\fBtputs\fP
returns an error if the string parameter is null.
It does not detect I/O errors:
X/Open states that \fBtputs\fP ignores the return value
of the output function \fIputc\fP.
.RE
.SH NOTES
The \fBsetupterm\fR routine should be used in place of \fBsetterm\fR.
It may be useful when you want to test for terminal capabilities without
committing to the allocation of storage involved in \fBinitscr\fR.
.PP
Note that \fBvidattr\fR and \fBvidputs\fR may be macros.
.SH PORTABILITY
The function \fBsetterm\fR is not described by X/Open and must
be considered non-portable.  All other functions are as described by X/Open.
.PP
\fBsetupterm\fP copies the terminal name to the array \fBttytype\fP.
This is not part of X/Open Curses, but is assumed by some applications.
.PP
In System V Release 4, \fBset_curterm\fR has an \fBint\fR return type and
returns \fBOK\fR or \fBERR\fR.  We have chosen to implement the X/Open Curses
semantics.
.PP
In System V Release 4, the third argument of \fBtputs\fR has the type
\fBint (*putc)(char)\fR.
.PP
At least one implementation of X/Open Curses (Solaris) returns a value
other than OK/ERR from \fBtputs\fP.
That returns the length of the string, and does no error-checking.
.PP
X/Open Curses prototypes \fBtparm\fR with a fixed number of parameters,
rather than a variable argument list.
This implementation uses a variable argument list.
Portable applications should provide 9 parameters after the format;
zeroes are fine for this purpose.
.PP
X/Open notes that after calling \fBmvcur\fR, the curses state may not match the
actual terminal state, and that an application should touch and refresh
the window before resuming normal curses calls.
Both ncurses and System V Release 4 curses implement \fBmvcur\fR using
the SCREEN data allocated in either \fBinitscr\fR or \fBnewterm\fR.
So though it is documented as a terminfo function,
\fBmvcur\fR is really a curses function which is not well specified.
.PP
X/Open states that the old location must be given for \fBmvcur\fP.
This implementation allows the caller to use -1's for the old ordinates.
In that case, the old location is unknown.
.PP
Extended terminal capability names, e.g., as defined by \fBtic\ -x\fP,
are not stored in the arrays described in this section.
.SH SEE ALSO
\fBcurses\fR(3X),
\fBcurs_initscr\fR(3X),
\fBcurs_kernel\fR(3X),
\fBcurs_termcap\fR(3X),
\fBputc\fR(3),
\fBterminfo\fR(\*n)
.\"#
.\"# The following sets edit modes for GNU EMACS
.\"# Local Variables:
.\"# mode:nroff
.\"# fill-column:79
.\"# End:
