freebsd-src/lib/libncurses/doc/manual.doc
1995-04-20 21:36:15 +00:00

1362 lines
53 KiB
Plaintext

The Curses Reference Manual
Pavel Curtis 1982
Zeyd M. Ben-Halim 1993
zmbenhal@netcom.com
Caveat Emptor:
I'm slowly but surely updating the documentation of
ncurses to reflect the current status of the code. The text
below may refer to yet to be implemented functions or
missing functionality. Description of functions may be
missing or out of date. ncurses is aimed at being compatible
with AT&T curses as defined in SysVR4.
There is no ?roff sources for this document. I may one day
go nuts and create one, but don't hold your breath :-)
1. Introduction
Terminfo is a database describing many capabilities of over
150 different terminals. Curses is a subroutine package
which presents a high level screen model to the programmer,
while dealing with issues such as terminal differences and
optimization of output to change one screenfull of text into
another.
Terminfo is based on Berkeley's termcap database, but con-
tains a number of improvements and extensions. Parameterized
strings are introduced, making it possible to describe such
capabilities as video attributes, and to handle far more
unusual terminals than possible with termcap.
Curses is also based on Berkeley's curses package, with many
improvements. The 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.+
2. An Overview of the Package
2.1. Terminology
In this document, the following terminology is kept
to with reasonable consistency:
window An internal representation containing an image of
what a section of the terminal screen may look
like at some point in time. This subsection can
either encompass the entire terminal screen, or
any smaller portion down to a single character
within that screen.
terminal Sometimes called terminal screen. The package's
idea of what the terminal's screen currently looks
like, i.e., what the user sees now. This is a
special screen.
screen This is 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 automati-
cally provided for the programmer.
2.2. Compiling Programs using the Package
In order to use the library, it is necessary to have
certain types and variables defined. Therefore, the pro-
grammer must have a line:
#include <ncurses.h>
at the top of the program source. The screen package
uses the Standard I/O library, so <ncurses.h> includes
<stdio.h>. Ncurses also includes <termios.h>, <termio.h>, or
<sgtty.h> depending on your system. It is redundant (but
harmless) for the programmer to do it, too. In linking with
ncurses you need to have `-lncurses' in your LDFLAGS or on
the command line. There is no need for any other libraries.
2.3. 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 is more like an
array of characters on which to make changes.
When one has a window which describes what some part of
the terminal screen should look like, the routine refresh()
(or wrefresh() if the window is not stdscr) is called.
Refresh() in the area covered by the window, look like that
window. Note, therefore, that changing something on a win-
dow does not change the terminal. Actual updates to the
terminal screen are made only by calling refresh() or wre-
fresh(). This allows the programmer to maintain several
different ideas of what a portion of the terminal screen
should look like. 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 worry about the best way to do
this.
2.4. 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 pro-
grammer wants the terminal to look like next. The user
should never really access curscr directly. Changes should
be made to the appropriate screen, and then the routine
refresh() (or wrefresh()) should be called.
Many functions are set up to deal with stdscr as a
default screen. For example, to add a character to stdscr,
one calls addch() with the desired character. If a differ-
ent window is to be used, 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 rou-
tines which do not do this are those to 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 clumsy-
ness, most I/O routines can be preceded by the prefix 'mv'
and the desired (y, x) coordinates then can be added 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 such pointers are need,
they are always the first parameters passed.
3. Variables
Many variables which are used to describe the terminal
environment are available to the programmer. They are:
type name description
------------------------------------------------------------------
WINDOW *curscr current version of the screen (terminal screen).
WINDOW *stdscr standard screen. Most updates are done here.
int LINES number of lines on the terminal
int COLS number of columns on the terminal
There are also several `#define' constants and types which
are of general usefulness:
bool boolean type, actually a `char' (e.g., bool doneit;)
TRUE boolean `true' flag (1).
FALSE boolean `false' flag (0).
ERR -1 error flag returned by routines on a fail.
OK 0 error flag returned by routines when things
go right.
4. Usage
This is a description of how to actually use the screen
package. In it, we assume all updating, reading, etc. is
applied to stdscr. All instructions will work on any win-
dow, with changing the function name and parameters as men-
tioned above.
4.1. 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 functions are
performed by initscr(). Since it must allocate space for the
windows, it can overflow memory when attempting to do so. On
this rather rare occasion, initscr() returns ERR.
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().
Now that the screen windows have been allocated, you
can set them up for the run. If you want to, say, allow the
window to scroll, use scrollok(). If you want the cursor to
be left 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. New windows of your
own can be created, too, by using the functions newwin(),
derwin(), and subwin(). delwin() will allow you to get rid
of old windows.
4.2. Output
Now that we have set things up, we will want to actu-
ally 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,
returning ERR if it would cause the window to illegally
scroll, i.e., printing a character in the lower right-hand
corner of a terminal which automatically scrolls if
scrolling is not allowed. 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 win-
dow has been changed, thus making refresh() check the whole
subsection of the terminal for changes.
If you call wrefresh() with curscr(), it will make the
screen look like curscr thinks it looks like. This is use-
ful for implementing a command which would redraw the screen
in case it get messed up.
4.3. Input
Input is essentially a mirror image of output. 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 echo-
ing enable and is in nocreak mode, one or the other has to
changed before calling getch(). The result of not doing this
is unpredictable output.
4.4. Miscellaneous
A plethora of other functions exist for maintaining and
changing information about the windows. For the most part,
the descriptions in section 5 should suffice.
4.5. Finishing Up
In order to do certain optimizations, and, on some ter-
minals, to work at all, some things must be done before the
screen routines start up. In order to clean up after the
routines, the routine endwin() is provided. It restores tty
modes to what they were when initscr() was first called,
moves the cursor down to the lower-left corner, etc. Thus,
anytime after the call to initscr, endwin() should be called
before exiting.
5. Descriptions of the Functions
This section describes all the functions available to the
programmer in the curses package. For an alphabetical list,
see the manual page ncurses(3).
5.1. Initialization
These functions are called when initializing a program.
initscr()
The first function called should 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 writen to standard error and the program exits. Otherwise
it returns a pointer to stdscr. Some function may be called
before initscr (slk_init, filter, ripofflines, use_env, and
if you are using multiple terminals newterm.)
endwin()
A 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 nonvisual mode.
Calling refresh() or doupdate() after a temporary escape
from the program will restore the screen to its original
status.
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. 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
must called for each terminal opened using this function.
set_term(new)
This function is used to switch to a different terminal.
The screen reference for the new terminal is passed as the
parameter. The previous terminal is returned by the func-
tion. All other calls affect only the current terminal.
delscreen(sp)
longname()
This function returns a pointer to a static area containing
a verbose description of the current terminal. It is defined
only after a call to initscr or newterm.
termattrs()
termname()
5.2. Option Setting
These functions set options within curses. In each case,
win is the window affected, and bf is a boolean flag with
value TRUE or FALSE indicating whether to enable or disable
the option. All options are initially FALSE. It is not
necessary to turn these options off before calling endwin.
clearok(win,bf)
If set, the next call to wrefresh with this window will
clear the screen and redraw the entire screen. If win is
curscr, the next call to wrefresh with any window will cause
the screen to be cleared. This is useful when the contents
of the screen are uncertain, or in some cases for a more
pleasing visual effect.
idlok(win,bf)
If enabled, curses will consider using the hardware
insert/delete line feature of terminals so equipped. If
disabled, curses will not use this feature. Enable this
option only if your application needs insert/delete line,
for example, for a screen editor. It is disabled by default
because insert/delete line is visually annoying when used in
applications where it isn't really needed.
idcok(win,bf)
This option allows curses will use inset/delete character
capabilities if any are defined. This option is on be
default.
immedok(win,bf)
If this option is enabled any change in the window's image
causes a call to wrefresh. Enabling this option can degrade
performance; it is disabled by default.
keypad(win,bf)
This option enables the keypad of the users terminal. If
enabled, the user can press a function key (such as an arrow
key) and getch will return a single value representing the
function key. If disabled, curses will not treat function
keys specially. If the keypad in the terminal can be turned
on (made to transmit) and off (made to work locally), turn-
ing on this option will turn on the terminal keypad. All the
possible function keys are defined in ncurses.h as KEY_*.
leaveok(win,bf)
Normally, the hardware cursor is left at the location of the
window cursor being refreshed. This option allows the cur-
sor to be left wherever the update happens to leave it. It
is useful for applications where the cursor is not used,
since it saves cursor motions. If possible, the cursor is
made invisible when this option is enabled.
meta(win,bf)
If enabled, characters returned by getch are transmitted
with all 8 bits, instead of stripping the highest bit. It
is useful for extending the non-text command set in applica-
tions where the terminal has a meta shift key, such as
EMACS. NOTE: This function is currently unsupported.
notimeout(win,bf)
This option controls whether a timer is set when wgetch is
trying to interpret an input sequence. See keypad.
scrollok(win,bf)
This option controls what happens when the cursor of a win-
dow is moved off the edge of the window, either from a new-
line on the bottom line, or typing the last character of the
last line. If disabled, the cursor is left on the bottom
line. If enabled, wrefresh is called on the window, and then
the physical terminal and window are scrolled up one line.
setscrreg(t,b)
wsetscrreg(win,t,b)
These functions allow the user to set a software scrolling
region in a window win or stdscr. t and b are the line num-
bers of the top and bottom margin of the scrolling region.
(Line 0 is the top line of the screen.) If this option and
scrollok are enabled, an attempt to move off the bottom mar-
gin line will cause all lines in the scrolling region to
scroll up one line. Note that this has nothing to do with
use of a physical scrolling region capability in the termi-
nal, like that in the VT100. Only the text of the window is
scrolled.
The scrolling region really acts as a sort of barrier, lim-
iting the area of a window over which changes take place.
For this reason, an attempt to create a scrolling region in
an area of the screen which does not contain the current (y,
x) coordinates for that window is an error. Similarly,
attempts to move the (y, x) coordinates out of the region
will also fail with an ERR return.
When a scrolling region is in place, all changes are limited
to the region. For example, erase() will only erase the
area inside the region; insertln() will only shift lines
down to the bottom of the region, etc. It is anticipated
that this method of controlling the area of change will
prove quite handy in a number of applications.
To disable the scrolling region, once defined, simply rede-
fine it to be the whole window. For example, to disable the
scrolling region on stdscr, the following call would be
used:
setscrreg(0, LINES - 1)
For other windows, the height of the window should be used
instead of (LINES - 1).
5.3. Terminal Mode Setting
These functions are used to set modes in the tty driver. The
initial mode usually depends on the setting when the program
was called: the initial modes documented here represenet the
normal situation.
cbreak()
nocbreak()
crmode()
nocrmode()
These functions put the terminal into and out of CBREAK
mode. In this mode, characters typed by the user are immedi-
ately available to the program. When out of this mode, the
device driver will buffer characters typed until newline is
typed. Interrupt and flow control characters are unaffected
by this mode. Initially the terminal is not in CBREAK mode.
Most interactive programs using curses will set this mode.
The functions crmode() and nocrmode() are the result of an
accident in the first version of curses and are retained
solely for upward compatibility. crmode() is the same as
cbreak() and nocrmode() is the same as nocbreak(). See 4.3
for a important note on using these functions.
raw()
noraw()
These functions put the terminal into and out of RAW mode.
RAW mode is just like CBREAK mode except that no special
character processing is done (e.g. the interrupt character
will be passed through to the program, uninterpreted, as
will the kill character, etc.) and all 8 bits of the input
character are retained; in CBREAK mode, the eighth bit is
stripped off before it is given to the program. Because of
the lack of interpretation of special characters, it is not
recommended that programs use this mode.
echo()
noecho()
These functions control whether characters typed by the user
are echoed as typed. Initially, characters typed are echoed
by the teletype driver. Authors of most interactive pro-
grams prefer to do their own echoing in a controlled area of
the screen, or not to echo at all, so they disable echoing.
halfdelay(t)
This options is similar to cbreak mode except that if after
blocking for t tenth of a seconds no input is received ERR
is returned. t must between 1 and 255. Use nocbreak to leave
this mode.
nodelay(win,bf)
This option causes getch to be a non-blocking call. If no
input is ready, getch will return ERR. If disabled, getch
will hang until a key is pressed.
timeout(t)
wtimeout(win,t)
These functions offer control over the blocking action of a
read. If t is negative, reading will block until there is
input. If t is zero, no blocking will occur, read returns
ERR if no input is available. If t is posistive, the read
will block for t milliseconds and return ERR if there is
still no input.
These routines offer better and finer control than nodelay()
and halfdelay() and their use is recommended.
nl()
nonl()
These functions control whether newline is translated into
carriage return and linefeed on output, and whether return
is translated into newline on input. Initially, the trans-
lations do occur. By disabling these translations, curses
is able to make better use of the linefeed capability,
resulting in faster cursor motion.
savetty()
resetty()
These functions save and restore the state of the tty modes.
savetty saves the current state in a buffer, resetty
restores the state to what it was at the last call to save-
tty.
5.4. Window Manipulation
newwin(num_lines, num_cols, begy, begx)
Create a new window with the given number of lines and
columns. The upper left corner of the window is at line
begy column begx. If either num_lines or num_cols is zero,
they will be defaulted to LINES-begy and COLS-begx. A new
full-screen window is created by calling newwin(0,0,0,0).
subwin(orig, num_lines, num_cols, begy, begx)
Create a new window with the given number of lines and
columns. The window is at position (begy, begx) on the
screen. (It is relative to the screen, not orig.) The win-
dow is made in the middle of the window orig, so that
changes made to one window will affect both windows. When
using this function, often it will be necessary to call
touchwin before calling wrefresh.
derwin(orig, num_lines, num_cols, begy, begx)
Is similar to subwin only the new window is created relative
to the original window, not the screen.
delwin(win)
Deletes the named window, freeing up all memory associated
with it. In the case of sub-windows, they should be deleted
before the main window.
dupwin(win)
mvderwin(win,y,x)
syncok(win,bf)
wsyncup(win)
wcursyncup(win)
wsyncdown(win)
mvwin(win, by, bx)
Move the window so that the upper left corner will be at
position (by, bx). If the move would cause the window to be
off the screen, it is an error and the window is not moved.
touchline(win,start,count)
touchwin(win)
Throw away all optimization information about which parts of
the window have been touched, by pretending the entire win-
dow has been drawn on. This is sometimes necessary when
using overlapping windows, since a change to one window will
affect the other window, but the optimization records of the
other window will not reflect the change.
wtouchln(win,y,n,changed)
Throw away optimization information, or mark as unchanged,
n lines starting at y, depending on the value of changed.
untouchwin(win)
Mark the whole window as unchcnged since the lat wrefresh.
is_linetouched(win,line)
is_wintouched(win)
These routines are used to check if the given line/window
has been modified since the last wrefresh. They will return
TRUE is that is the case, FALSE otherwise. is_linetouched
will return ERR if there is no such line.
overlay(win1, win2)
overwrite(win1, win2)
These functions overlay win1 on top of win2, that is, all
text in win1 is copied into win2, after lining up the two
windows' origins. The difference between the functions is
that overlay is nondestructive (blanks are not copied) while
overwrite is destructive.
copywin(win,win,sminrow,smincol,dminrow,dmincol,dmaxrow,
dmaxcol,overlay)
Low level function used to implement overlay/overwrite.
5.5. Causing Output to the Terminal
refresh()
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 physi-
cal terminal screen, taking into account what is already
there in order to do optimizations. refresh is the same,
using stdscr as a default screen. Unless leaveok has been
enabled, the physical cursor of the terminal is left at the
location of the window's cursor.
doupdate()
wnoutrefresh(win)
These two functions allow multiple updates with more effi-
ciency 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 wre-
fresh 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 out-
put, with probably fewer total characters transmitted.
redrawwin(win)
wredrawln(win,start,count)
5.6. Writing on Window Structures
These routines are used to ``draw'' text on windows. In all
cases, a missing win is taken to be stdscr. y and x are the
row and column, respectively. The upper left corner is
always (0, 0) not (1, 1). The mv functions imply a call to
move before the call to the other function.
5.6.1. Moving the Cursor
move(y, x)
wmove(win, y, x)
The cursor associated with the window is moved to the given
location. This does not move the physical cursor of the
terminal until refresh is called.
5.6.2. Writing One Character
addch(ch)
waddch(win, ch)
mvaddch(y, x, ch)
mvwaddch(win, y, x, ch)
The character ch is put in the window at the current cursor
position of the window. If ch is a tab, newline, or
backspace, the cursor will be moved appropriately in the
window. If ch is a different control character, it will be
drawn in the ^X notation. The position of the window cursor
is advanced. At the right margin, an automatic newline is
performed. At the bottom of the scrolling region, if scrol-
lok is enabled, the scrolling region will be scrolled up one
line.
5.6.3. Writing a String
addstr(str)
addnstr(str,n)
waddstr(win,str)
waddnstr(win,str,n)
mvaddstr(y,x,str)
mvaddnstr(y,x,str,n)
mvwaddstr(win,y,x,str)
mvwaddnstr(win,y,x,str,n)
These functions write all the characters of the null termi-
nated character string str on the given window. They are
identical to a series of calls to addch. Routines with 'n'
write n characters of str. If n is -1 then the entire string
is written.
addchstr(chstr)
addchnstr(chstr,n)
waddchstr(win,chstr)
waddchnstr(win,chstr,n)
mvaddchstr(y,x,chstr)
mvaddchnstr(y,x,chstr,n)
mvwaddchstr(win,y,x,chstr)
mvwaddchnstr(win,y,x,chstr,n)
These functions copy chstr onto the window image starting at
the current cursor position. Routines with 'n' write at most
n characters of chstr (as many as will fit on the line). If
n is -1 then the entire string is written. The cursor is not
advanced and no checking for control characters is done.
These routines are faster than the addstr() group. chstr is
a pointer to an array of chtype.
5.6.4. Clearing Areas of the Screen
erase()
werase(win)
These functions copy blanks to every position in the window.
clear()
wclear(win)
These functions are like erase and werase but they also call
clearok, arranging that the screen will be cleared on the
next refresh. The result can visually annoying.
clrtobot()
wclrtobot(win)
All lines below the cursor in this window are erased. Also,
the current line to the right of the cursor is erased.
clrtoeol()
wclrtoeol(win)
The current line to the right of the cursor is erased.
5.6.5. Inserting and Deleting Text
delch()
wdelch(win)
mvdelch(y,x)
mvwdelch(win,y,x)
The character under the cursor in the window is deleted.
All characters to the right on the same line are moved to
the left one position. This does not imply use of the hard-
ware delete character feature.
deleteln()
wdeleteln(win)
The line under the cursor in the window is deleted. All
lines below the current line are moved up one line. The
bottom line of the window is cleared. This does not imply
use of the hardware delete line feature.
insch(c)
winsch(win, c)
mvinsch(y,x,c)
mvwinsch(win,y,x,c)
The character c is inserted before the character under the
cursor. All characters to the right are moved one space to
the right, possibly losing the rightmost character on the
line. This does not imply use of the hardware insert char-
acter feature.
insertln()
winsertln(win)
A blank line is inserted above the current line. The bottom
line is lost. This does not imply use of the hardware
insert line feature.
5.6.6. Formatted Output
printw(fmt, ...)
wprintw(win, fmt, ...)
mvprintw(y, x, fmt, ...)
mvwprintw(win, y, x, fmt, ...)
vwprintw(win, fmt, va_list)
These functions correspond to printf. The characters which
would be output by printf are instead output using waddch on
the given window. vwprintw() acts like vprintf().
5.6.7. Line drawing
Borders are drawn inside a window and not around it.
border(ls, rs, ts, bs, tl, tr, bl, br)
wborder(win, ls, rs, ts, bs, tl, tr, bl, br)
box(win, vert, hor)
A border is drawn around the edges of the window. ls, rs,
ts, bs, tl, tr, bl, and br are the character and attribute
to draw the left side, right side, top side, bottom side,
top left, top right, bottom left, and bottom right respec-
tively.
If any of these are 0, the follwing defaults are used:
ACS_VLINE. ACS_VLINE, ACS_HLINE, ACS_HLINE, ACS_ULCORNER,
ACS_URCORNER, ACS_LLCORNER, ACS_LRCORNER. box is shorthand
for wborder(win, vert, vert, hor, hor, 0, 0, 0, 0).
vline(ch,n)
wvline(win,ch,n)
These functions draw a vertical line starting at the current
cursor position using ch for n characters or as many as will
fit on the window. The cursor position is not advanced.
hline(ch,n)
whline(win,ch,n)
These functions draw a horizontal line starting at the
current cursor position using ch for n characters or as many
as will fit on the window. The cursor position is not
advanced.
5.6.8 Scrolling
Scrolling only works if enabled via scrollok(). The cursor
position is unchanged by these functions. As an optimization
the physical screen is scrolled if the window in question is
covering the entire screen.
scroll(win)
The window is scrolled up one line. This involves moving
the lines in the window data structure.
scrl(n)
wscrl(win,n)
These functions scroll thw window up/down n lines depending
on the sign on n (+ for up, - for down).
5.7. Querying the Contents of a Window
getyx(win,y,x)
The cursor position of the window is placed in the two
integer variables y and x. Since this is a macro, no & is
necessary.
inch()
winch(win)
mvinch(y,x)
mvwinch(win,y,x)
The character at the current position in the named window is
returned.
5.8. Input from the Terminal
getch()
wgetch(win)
mvgetch(y,x)
mvwgetch(win,y,x)
A character is read from the terminal associated with the
window. In nodelay mode, if there is no input waiting, the
value -1 is returned. In delay mode, the program will hang
until a character is typed.
If keypad mode is enabled, and a function key is pressed,
the code for that function key will be returned instead of
the raw characters. Possible function keys are defined with
integers beginning with 0401, whose names begin with KEY_,
defined in <ncurses.h>. If a character is received that
could be the beginning of a function key (such as escape),
curses will set a one second timer. If the remainder of the
sequence does not come in within one second, the character
will be passed through, otherwise the function key value
will be returned. For this reason, on many terminals, there
will be a one second delay after a user presses the escape
key. (Use by a programmer of the escape key for a single
character function is discouraged.) The one second delay can
be turned off using the notimeout() function.
getstr(str)
wgetstr(win,str)
mvgetstr(y,x,str)
mvwgetstr(win,y,x,str)
A series of calls to getch is made, until a newline is
received. The resulting value is placed in the area pointed
at by the character pointer str. The users erase and kill
characters are interpreted, and the string is echoed.
scanw(fmt, ...)
wscanw(win, fmt, ...)
mvscanw(y, x, fmt, ...)
mvwscanw(win, y, x, fmt, ...)
vwscanw(win,fmt,va_list)
These functions corresponds to scanf. wgetstr is called on
the window, and the resulting line is used as input for the
scan.
5.9. Video Attributes
attroff(at)
wattroff(win, attrs)
attron(at)
wattron(win, attrs)
attrset(at)
wattrset(win, attrs)
standout()
standend()
wstandout(win)
wstandend(win)
These functions set the current attributes of the named win-
dow. These attributes can be any combination of A_STANDOUT,
A_REVERSE, A_BOLD, A_DIM, A_BLINK, A_BLANK, A_UNDERLINE,
A_PROTECT, A_INVIS, and A_ALTCHARSET. These constants are
defined in <ncurses.h> and can be combined with the C | (or)
operator. The current attributes of a window are applied to
all characters that are written into the window. Attributes
are a property of the character, and move with the char-
acter through any scrolling and insert/delete line/character
operations. To the extent possible on the particular
terminal, they will be displayed as the graphic rendition
of characters put on the screen.
attrset(at) sets the current attributes of the given window
to at. attroff(at) turns off the named attributes without
affecting any other attributes. attron(at) turns on the
named attributes without affecting any others. standout is
the same as attrset(A_STANDOUT), standend is the same as
attrset(0), that is, it turns off all attributes.
5.10. Color Manipulation
Ncurses provides support for the use of color on terminals
that are capable of display it. Note the BSD and older SYSV
curses don't support color. Color support in the PC version
is not compatible with SYSR4.
has_colors()
this function returns TRUE if the terminal supports color,
FALSE otherwise. Other color handling funtions will return
ERR if has_colors() is FALSE. You should always check before
using color and use other video attributes to replace color.
can_change_color()
This function returns TRUE if the terminal is capable of
redefining colors using the init_color function, FALSE if it
can't. Don't use init_color and color_content if it returns
FALSE.
start_color()
This function must be called before any other color handling
function is called. It initializes the 8 basic colors (see
appendix I) and sets the global variables COLORS and COLOR_
PAIRS to the maximum number of colors and color-pairs a
terminal can handle.
init_pair(pair, fg, bg)
This function changes the definition of a color-pair, pair.
Each pair has a foregroung color fg, and a background color
bg. Both values must be between 0 and COLORS-1. pair must be
between 1 and COLOR_PAIRS-1.
[If a pair is changed from a previous definition, the screen
is refreshed and all occurances of the color-pair are
changed to reflect the change.]
pair_content(pair, f, b)
This function stores the foreground and background colors of
the color-pair pair into the variables pointed to by f, b.
pair should be between 1 and COLOR_PAIRS-1.
init_color(color, r, g, b)
This function changes the value of a given color. A color is
defined by its red, green, and blue components, r, g, and b.
These values must be between 0 and 1000. color should be
between 0 and COLORS-1.
color_content(color, r, g, b)
This function puts the red, green, and blue components of
color into the variable pointed to by r, g, b respectively.
color should be between 0 and COLORS-1.
5.11. Pads
5.12. Soft Labels
5.13. Bells and Flashing Lights
beep()
flash()
These functions are used to signal the programmer. beep
will sound the audible alarm on the terminal, if possible,
and if not, will flash the screen (visible bell), if that is
possible. flash will flash the screen, and if that is not
possible, will sound the audible signal. If neither signal
is possible, nothing will happen. Nearly all terminals have
an audible signal (bell or beep) but only some can flash the
screen.
5.14. Portability Functions
These functions do not have anything to do with terminal
dependent character output, but tend to be needed by pro-
grams that use curses. Unfortunately, their implemention
varies from one version of UNIX* to another. They have been
included here to enhance the portability of programs using
curses.
baudrate()
baudrate returns the output speed of the terminal. The num-
ber returned is the integer baud rate, for example, 9600,
rather than a table index such as B9600.
erasechar()
The erase character chosen by the user is returned. This is
the character typed by the user to erase the character just
typed.
killchar()
The line kill character chosen by the user is returned.
This is the character typed by the user to forget the entire
line being typed.
flushinp()
flushinp throws away any typeahead that has been typed by
the user and has not yet been read by the program.
5.15. Debugging
These functions are useful when debugging a program with
curses.
unctrl(ch)
This macro expands to a character string which is a print-
able representation of the character ch. The program must
include the file <unctrl.h>. Control characters are dis-
played in the ^x notation. Printing characters are displayed
as is.
traceoff()
traceon()
It is possible to compile a debugging version of curses with
tracing turned on, and with the -g option for gdb. This
library may be available on your system as -ldcurses. When
using this version, the file ``trace'' will be created each
time the program is run, containing verbose information
showing each step done by curses. This output is useful for
finding bugs in curses, and may be useful for finding bugs
in user programs. Since the output is so verbose, with any
bug that cannot be easily and quickly reproduced, it may be
necessary to turn the debugging output off in some parts of
the program. These functions can be used to turn tracing
off and back on. When initscr is first called, tracing is
automatically turned on.
You should use -DTRACE when compiling programs that use
tracing.
_tracef()
This function can be used to output your own debugging info-
rmation. It is only available only if you compile with the
-DTRACE flag and linking with -ldcurses. It can be used the
same way as printf, only it outputs a newline after the end
of arguments.
6. Lower Level Functions
These functions are provided for programs not needing the
screen optimization capabilities of curses. Programs are
discouraged from working at this level, since they must han-
dle various glitches in certain terminals. However, a pro-
gram can be smaller if it only brings in the low level rou-
tines.
gettmode()
setterm(type)
These two initialization routines are provided for upward
compatibility with the old curses. gettmode does nothing.
setterm results in a call to setupterm with appropriate
arguments.
def_prog_mode()
def_shell_mode()
These functions define "program" mode and "shell" mode. The
first describes the status of a terminal while in curses,
the second the status outside curses.
reset_prog_mode()
reset_shell_mode()
These functions restore a terminal to "program" mode after
shelling out, or to "shell" mode before shelling out.
fixterm()
resetterm()
These functions are obselete and have been replaced by
reset_prog_mode() and reset_prog_mode() respectively.
saveterm()
This fucntion is obselete and is replaced by
def_prog_mode().
mvcur(oldrow, oldcol, newrow, newcol)
This routine optimally moves the cursor from (oldrow, old-
col) to (newrow, newcol). The user program is expected to
keep track of the current cursor position. Note that unless
a full screen image is kept, curses will have to make pes-
simistic assumptions, sometimes resulting in less than opti-
mal cursor motion. For example, moving the cursor a few
spaces to the right can be done by transmitting the charac-
ters being moved over, but if curses does not have access to
the screen image, it doesn't know what these characters are.
If either of oldcol or oldrow are negative, mvcur() will
refrain from using any relative motions. This is handy for
occasions when a program is unsure as to the current cursor
location.
7. Terminfo Level
These routines are called by low level programs that need
access to specific capabilities of terminfo. A program
working at this level should include both <ncurses.h> and
<term.h>. After a call to setupterm, the capabilities will
be available with macro names defined in <term.h>. See ter-
minfo(5) for a detailed description of the capabilies. If
the program only needs to handle one terminal, the defini-
tion -DSINGLE can be passed to the C compiler, resulting in
static references to capabilities instead of dynamic refer-
ences. This can result in smaller code, but prevents use of
more than one terminal at a time. Very few programs use
more than one terminal, so almost all programs can use this
flag.
setupterm(term, filenum, errret)
This routine is called to initialize a terminal. term is
the character string representing the name of the terminal
being used. filenum is the UNIX file descriptor of the ter-
minal being 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 0, which will cause the
value of TERM in the environment to be used. The errret
pointer can also be given as 0, 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.
setupterm will check the tty driver mode bits, and change
any that might prevent the correct operation of other low
level routines. Currently, the mode that expands tabs into
spaces is disabled, because the tab character is sometimes
used for different functions by different terminals. (Some
terminals use it to move right one space. Others use it to
address the cursor to row or column 9.) If the system is
expanding tabs, setupterm will remove the definition of the
tab and backtab functions, assuming that since the user is
not using hardware tabs, they may not be properly set in the
terminal.
After the call to setupterm, the global variable cur_term is
set to point to the current structure of terminal capabili-
ties. 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 your-
self if need be.
The mode that turns newlines into CRLF on output is not dis-
abled. Programs that use cud1 or ind should avoid these
capabilities if their value is linefeed unless they disable
this mode. setupterm calls fixterm after any changes it
makes.
vidattr(newmode)
vidputs(newmode, outc)
newmode is any combination of attributes, defined in
<ncurses.h>. The proper string to put the terminal in the
given video mode is output. The routine vidattr() sends the
output characters to putchar; vidputs sends them to the
given routine outc, one character at a time. That routine
should therefore expect one char parameter. The previous
mode is remembered by this routine.
tparm(instring, p1, p2, p3, p4, p5, p6, p7, p8, p9)
tparm is used to instantiate a parameterized string. The
character string returned is suitable for tputs. Up to 9
parameters can be passed, in addition to the parameterized
string.
tputs(cp, affcnt, outc)
A string capability, possibly containing padding informa-
tion, is processed. Enough padding characters to delay for
the specified time replace the padding specification, and
the resulting string is passed, one character at a time, to
the routine outc, which should expect one character parame-
ter. (This routine often just calls putchar.) cp is the
capability string. affcnt is the number of units affected
by the capability, which varies with the particular capabil-
ity. (For example, the affcnt for insert_line is the number
of lines below the inserted line on the screen, that is, the
number of lines that will have to be moved by the terminal.)
affcnt is used by the padding information of some terminals
as a multiplication factor. If the capability does not have
a factor, the value 1 should be passed.
putp(str)
This is a convenient function to output a capability with no
affcnt. The string is output to putchar with an affcnt of
1. It can be used in simple applications that do not need
to process the output of tputs.
8. Termcap Emulation
Appendix I: Attributes
----------------------
Attributes are used with wattron(), wattroff(), wattrset(),
or or'ed with the character passed to waddch(). They are
defined in <ncurses.h>
A_ATTRIBUTES mask chtype for attributes
A_NORMAL reset all attributes
A_STANDOUT best highlighting mode
A_UNDERLINE underline
A_REVERSE reverse video, background and foreground reversed
A_BLINK blinking
A_DIM dim or half bright
A_BOLD bold or extra bright
A_ALTCHARSET use alternate character set
A_INVIS invisible, background same as foreground
A_PROTECT I haven't a clue
A_CHARTEXT mask chtype for actual character
A_COLOR mask for color
COLOR_PAIR(n) set color-pair to that stored in n
PAIR_NUMBER(a) get color-pair stored in attribute a
Appendix II: COLORS
-------------------
Colors are defined in <ncurses.h> are used with init_pair().
COLOR_BLACK 0
COLOR_RED 1
COLOR_GREEN 2
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7
Appendix III: Alternative character sets
----------------------------------------
ACS variables are used to add line-drawing capability to
ncurses on terminals that support it. When defined for a
given terminal (using acs) the A_ALTCHARSET attribute is
set for that variable, otherwise the default value is
used.
ACS_ULCORNER +
ACS_LLCORNER +
ACS_URCORNER +
ACS_LRCORNER +
ACS_RTEE +
ACS_LTEE +
ACS_BTEE +
ACS_TTEE +
ACS_HLINE -
ACS_VLINE |
ACS_PLUS +
ACS_S1 ~ /* scan line 1 */
ACS_S9 _ /* scan line 9 */
ACS_DIAMOND + /* diamond */
ACS_CKBOARD : /* checker board (stipple) */
ACS_DEGREE ' /* degree symbol */
ACS_PLMINUS # /* plus/minus */
ACS_BULLET 0 /* bullet */
ACS_LARROW < /* arrow pointing left */
ACS_RARROW > /* arrow pointing right */
ACS_DARROW v /* arrow pointing down */
ACS_UARROW ^ /* arrow pointing up */
ACS_BOARD # /* board of squares */
ACS_LANTERN # /* lantern symbol */
ACS_BLOCK # /* solid square block */
Appendix IV: Function keys, their codes, and their definition
-------------------------------------------------------------
Function keys can return their respective codes if keypad()
is enabled and they are defined in the terminal's terminfo
description (assuming the terminal transmits unique sequences
for the key. They are defined in <ncurses.h>
KEY_BREAK 0401 /* break key (unreliable) */
KEY_DOWN 0402 /* The four arrow keys ... */
KEY_UP 0403
KEY_LEFT 0404
KEY_RIGHT 0405 /* ... */
KEY_HOME 0406 /* Home key (upward+left arrow) */
KEY_BACKSPACE 0407 /* backspace (unreliable) */
KEY_F0 0410 /* Function keys. Space for 64 */
KEY_F(n) (KEY_F0+(n)) /* keys is reserved. */
KEY_DL 0510 /* Delete line */
KEY_IL 0511 /* Insert line */
KEY_DC 0512 /* Delete character */
KEY_IC 0513 /* Insert char or enter insert mode */
KEY_EIC 0514 /* Exit insert char mode */
KEY_CLEAR 0515 /* Clear screen */
KEY_EOS 0516 /* Clear to end of screen */
KEY_EOL 0517 /* Clear to end of line */
KEY_SF 0520 /* Scroll 1 line forward */
KEY_SR 0521 /* Scroll 1 line backwards (reverse) */
KEY_NPAGE 0522 /* Next page */
KEY_PPAGE 0523 /* Previous page */
KEY_STAB 0524 /* Set tab */
KEY_CTAB 0525 /* Clear tab */
KEY_CATAB 0526 /* Clear all tabs */
KEY_ENTER 0527 /* Enter or send (unreliable) */
KEY_SRESET 0530 /* soft (partial) reset (unreliable) */
KEY_RESET 0531 /* reset or hard reset (unreliable) */
KEY_PRINT 0532 /* print or copy */
KEY_LL 0533 /* home down or bottom (lower left) */
/* The keypad is arranged like this: */
/* a1 up a3 */
/* left b2 right */
/* c1 down c3 */
KEY_A1 0534 /* Upper left of keypad */
KEY_A3 0535 /* Upper right of keypad */
KEY_B2 0536 /* Center of keypad */
KEY_C1 0537 /* Lower left of keypad */
KEY_C3 0540 /* Lower right of keypad */
KEY_BTAB 0541 /* Back tab key */
KEY_BEG 0542 /* beg(inning) key */
KEY_CANCEL 0543 /* cancel key */
KEY_CLOSE 0544 /* close key */
KEY_COMMAND 0545 /* cmd (command) key */
KEY_COPY 0546 /* copy key */
KEY_CREATE 0547 /* create key */
KEY_END 0550 /* end key */
KEY_EXIT 0551 /* exit key */
KEY_FIND 0552 /* find key */
KEY_HELP 0553 /* help key */
KEY_MARK 0554 /* mark key */
KEY_MESSAGE 0555 /* message key */
KEY_MOVE 0556 /* move key */
KEY_NEXT 0557 /* next object key */
KEY_OPEN 0560 /* open key */
KEY_OPTIONS 0561 /* options key */
KEY_PREVIOUS 0562 /* previous object key */
KEY_REDO 0563 /* redo key */
KEY_REFERENCE 0564 /* ref(erence) key */
KEY_REFRESH 0565 /* refresh key */
KEY_REPLACE 0566 /* replace key */
KEY_RESTART 0567 /* restart key */
KEY_RESUME 0570 /* resume key */
KEY_SAVE 0571 /* save key */
KEY_SBEG 0572 /* shifted beginning key */
KEY_SCANCEL 0573 /* shifted cancel key */
KEY_SCOMMAND 0574 /* shifted command key */
KEY_SCOPY 0575 /* shifted copy key */
KEY_SCREATE 0576 /* shifted create key */
KEY_SDC 0577 /* shifted delete char key */
KEY_SDL 0600 /* shifted delete line key */
KEY_SELECT 0601 /* select key */
KEY_SEND 0602 /* shifted end key */
KEY_SEOL 0603 /* shifted clear line key */
KEY_SEXIT 0604 /* shifted exit key */
KEY_SFIND 0605 /* shifted find key */
KEY_SHELP 0606 /* shifted help key */
KEY_SHOME 0607 /* shifted home key */
KEY_SIC 0610 /* shifted input key */
KEY_SLEFT 0611 /* shifted left arrow key */
KEY_SMESSAGE 0612 /* shifted message key */
KEY_SMOVE 0613 /* shifted move key */
KEY_SNEXT 0614 /* shifted next key */
KEY_SOPTIONS 0615 /* shifted options key */
KEY_SPREVIOUS 0616 /* shifted prev key */
KEY_SPRINT 0617 /* shifted print key */
KEY_SREDO 0620 /* shifted redo key */
KEY_SREPLACE 0621 /* shifted replace key */
KEY_SRIGHT 0622 /* shifted right arrow */
KEY_SRSUME 0623 /* shifted resume key */
KEY_SSAVE 0624 /* shifted save key */
KEY_SSUSPEND 0625 /* shifted suspend key */
KEY_SUNDO 0626 /* shifted undo key */
KEY_SUSPEND 0627 /* suspend key */
KEY_UNDO 0630 /* undo key */
KEY_MAX 0777 /* Maximum curses key */