mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-03 09:00:21 +00:00
This commit was generated by cvs2svn to compensate for changes in r76732,
which included commits to RCS files with non-trunk default branches.
This commit is contained in:
parent
2493e89366
commit
edfeb4834f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=76733
@ -1,391 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
|
||||
<!--
|
||||
$Id: announce.html,v 1.34 1999/10/23 21:13:11 tom Exp $
|
||||
-->
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Announcing ncurses 5.0</TITLE>
|
||||
<link rev=made href="mailto:bug-ncurses@gnu.org">
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<H1>Announcing ncurses 5.0</H1>
|
||||
|
||||
The ncurses (new curses) library is a free software emulation of
|
||||
curses in System V Release 4.0, 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 SYSV-curses enhancements over BSD curses.<P>
|
||||
|
||||
In mid-June 1995, the maintainer of 4.4BSD curses declared that he
|
||||
considered 4.4BSD curses obsolete, and is encouraging the keepers of
|
||||
Unix releases such as BSD/OS, freeBSD and netBSD to switch over to
|
||||
ncurses.<P>
|
||||
|
||||
The ncurses code was developed under GNU/Linux. It should port easily to
|
||||
any ANSI/POSIX-conforming UNIX. It has even been ported to OS/2 Warp!<P>
|
||||
|
||||
The distribution includes the library and support utilities, including a
|
||||
terminfo compiler tic(1), a decompiler infocmp(1), clear(1), tput(1), tset(1),
|
||||
and a termcap conversion tool captoinfo(1). Full manual pages are provided for
|
||||
the library and tools.<P>
|
||||
|
||||
The ncurses distribution is available via anonymous FTP at
|
||||
the GNU distribution site
|
||||
<A HREF="ftp://ftp.gnu.org/pub/gnu/ncurses">ftp://ftp.gnu.org/pub/gnu/ncurses</A>.
|
||||
It is also available at
|
||||
<A HREF="ftp://ftp.clark.net/pub/dickey/ncurses">ftp://ftp.clark.net/pub/dickey/ncurses</A>.
|
||||
|
||||
<H1>Release Notes</H1>
|
||||
|
||||
We decided to release ncurses as a new whole number release (5.0) because it
|
||||
incorporates several interface changes, including some that would invalidate
|
||||
existing shared libraries. These are the highlights from the change-log
|
||||
since ncurses 4.2 release.
|
||||
<p>
|
||||
Interface changes:
|
||||
<ul>
|
||||
<li>The principal source of changes to the interface comes from the
|
||||
release of X/Open Curses in 1997. Earlier versions of ncurses (4.0
|
||||
and before) were based on a draft version of the specification. The
|
||||
release version adds parameters to some functions to support the
|
||||
evolving internationalization of curses. These summarize the impact:
|
||||
<ul>
|
||||
<li>modified several prototypes to correspond with 1997 version of
|
||||
X/Open Curses (affects ABI since developers have used attr_get).
|
||||
|
||||
<li>corrected prototypes for slk_* functions, using chtype rather than
|
||||
attr_t.
|
||||
|
||||
<li>the slk_attr_{set,off,on} functions need an additional void*
|
||||
parameter according to XSI.
|
||||
|
||||
<li>correct macros for wattr_set, wattr_get, separate wattrset macro from
|
||||
these to preserve behavior that allows attributes to be combined with
|
||||
color pair numbers.
|
||||
|
||||
<li>reviewed/updated curses.h, term.h against X/Open Curses Issue 4
|
||||
Version 2. This includes making some parameters NCURSES_CONST
|
||||
rather than const, e.g., in termcap.h.
|
||||
|
||||
<li>reviewed/corrected macros in curses.h as per XSI document.
|
||||
|
||||
<li>add set_a_attributes and set_pglen_inch to terminfo structure, as per
|
||||
XSI and Solaris 2.5.
|
||||
</ul>
|
||||
<li>The newest version of the X/Open Curses is implemented on Solaris
|
||||
and other vendor's systems. It adds new features to the terminfo
|
||||
descriptions:
|
||||
<ul>
|
||||
<li>implement tparm %l format.
|
||||
|
||||
<li>implement tparm printf-style width and precision for %s, %d, %x, %o
|
||||
as per XSI.
|
||||
</ul>
|
||||
<li>We made additional changes to reduce impact by future interface
|
||||
changes:
|
||||
<ul>
|
||||
<li>rename key_names[] array to _nc_key_names since it is not part of
|
||||
the curses interface.
|
||||
|
||||
<li>move macro winch to a function, to hide details of struct ldat
|
||||
</ul>
|
||||
<li>modify configure script to embed ABI in shared libraries for HP-UX
|
||||
10.x (detailed request by Tim Mooney).
|
||||
|
||||
<li>modify configuration of shared libraries on Digital Unix so that
|
||||
versioning is embedded in the library, rather than implied by
|
||||
links (patch by Tim Mooney).
|
||||
</ul>
|
||||
New features:
|
||||
<ul>
|
||||
<li>enable sigwinch handler by default.
|
||||
|
||||
<li>turn on hashmap scrolling code by default
|
||||
|
||||
<li>improved support for termcap applications
|
||||
<ul>
|
||||
<li>modify tput to accept termcap names as an alternative to terminfo
|
||||
names.
|
||||
|
||||
<li>provide support for termcap PC variable by copying it from terminfo
|
||||
data and using it as the padding character in tputs.
|
||||
|
||||
<li>provide support for termcap ospeed variable by copying it from the
|
||||
internal cur_term member, and using ospeed as the baudrate
|
||||
reference for the delay_output and tputs functions.
|
||||
|
||||
<li>change name-comparisons in lib_termcap to compare no more than 2
|
||||
characters.
|
||||
|
||||
<li>add configure option --enable-tcap-names, which essentially
|
||||
allows users to define new capabilities as in termcap.
|
||||
</ul>
|
||||
<li>add mouse support to ncurses menus.
|
||||
|
||||
<li>add mouse and dll support for OS/2 EMX
|
||||
|
||||
<li>modify terminfo parsing to accept octal and hexadecimal constants
|
||||
|
||||
<li>add configure option --enable-no-padding, to allow environment
|
||||
variable $NCURSES_NO_PADDING to eliminate non-mandatory padding,
|
||||
thereby making terminal emulators (e.g., for vt100) a little more
|
||||
efficient.
|
||||
|
||||
<li>modify lib_color.c to eliminate dependency on orig_colors and
|
||||
orig_pair, since SVr4 curses does not require these either, but
|
||||
uses them when they are available.
|
||||
|
||||
<li>add -f option to infocmp and tic, which formats the terminfo
|
||||
if/then/else/endif so that they are readable (with newlines and
|
||||
tabs).
|
||||
|
||||
<li>modify tic to compile into %'char' form in preference to %{number},
|
||||
since that is a little more efficient.
|
||||
</ul>
|
||||
Major bug fixes:
|
||||
<ul>
|
||||
<li>modify lib_tstp.c to block SIGTTOU when handling SIGTSTP, fixes a
|
||||
problem where ncurses applications which were run via a shell script
|
||||
would hang when given a ^Z. Also, check if the terminal's process
|
||||
group is consistent, i.e., a shell has not taken ownership of it,
|
||||
before deciding to save the current terminal settings in the SIGTSTP
|
||||
handler.
|
||||
|
||||
<li>suppress sc/rc capabilities from terminal description if they appear
|
||||
in smcup/rmcup. This affects only scrolling optimization, to fix a
|
||||
problem reported by several people with xterm's alternate screen,
|
||||
though the problem is more general.
|
||||
|
||||
<li>modify relative_move and tputs to avoid an interaction with the
|
||||
BSD-style padding. The relative_move function could produce a string
|
||||
to replace on the screen which began with a numeric character, which
|
||||
was then interpreted by tputs as padding.
|
||||
|
||||
<li>modify setupterm so that cancelled strings are treated the same as
|
||||
absent strings, cancelled and absent booleans false (does not affect
|
||||
tic, infocmp).
|
||||
|
||||
<li>modify lib_vidattr.c to allow for terminal types (e.g., xterm-color)
|
||||
which may reset all attributes in the 'op' capability, so that colors
|
||||
are set before turning on bold and other attributes, but still after
|
||||
turning attributes off.
|
||||
|
||||
<li>use 'access()' to check if ncurses library should be permitted to
|
||||
open or modify files with fopen/open/link/unlink/remove calls, in
|
||||
case the calling application is running in setuid mode.
|
||||
|
||||
<li>correction to doupdate, for case where terminal does not support
|
||||
insert/delete character. The logic did not check that there was a
|
||||
difference in alignment of changes to old/new screens before
|
||||
repainting the whole non-blank portion of the line. Modified to fall
|
||||
through into logic that reduces by the portion which does not differ.
|
||||
</ul>
|
||||
|
||||
<H1>Features of Ncurses</H1>
|
||||
|
||||
The ncurses package is fully compatible with SVr4 (System V Release 4) curses:
|
||||
|
||||
<UL>
|
||||
<LI>All 257 of the SVr4 calls have been implemented (and are documented).
|
||||
<LI>Full support for SVr4 curses features including keyboard mapping, color,
|
||||
forms-drawing with ACS characters, and automatic recognition of keypad
|
||||
and function keys.
|
||||
<LI>An emulation of the SVr4 panels library, supporting
|
||||
a stack of windows with backing store, is included.
|
||||
<LI>An emulation of the SVr4 menus library, supporting
|
||||
a uniform but flexible interface for menu programming, is included.
|
||||
<LI>An emulation of the SVr4 form library, supporting
|
||||
data collection through on-screen forms, is included.
|
||||
<LI>Binary terminfo entries generated by the ncurses tic(1) implementation
|
||||
are bit-for-bit-compatible with the entry format SVr4 curses uses.
|
||||
<LI>The utilities have options to allow you to filter terminfo
|
||||
entries for use with less capable <STRONG>curses</STRONG>/<STRONG>terminfo</STRONG>
|
||||
versions such as the HP/UX and AIX ports.</UL>
|
||||
|
||||
The ncurses package also has many useful extensions over SVr4:
|
||||
|
||||
<UL>
|
||||
<LI>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,
|
||||
but not all EXTENDED features). Most EXTENDED-level features not directly
|
||||
concerned with wide-character support are implemented, including many
|
||||
function calls not supported under SVr4 curses (but portability of all
|
||||
calls is documented so you can use the SVr4 subset only).
|
||||
<LI>Unlike SVr3 curses, ncurses can write to the rightmost-bottommost corner
|
||||
of the screen if your terminal has an insert-character capability.
|
||||
<LI>Ada95 and C++ bindings.
|
||||
<LI>Support for mouse event reporting with X Window xterm and OS/2 console windows.
|
||||
<LI>Extended mouse support via Alessandro Rubini's gpm package.
|
||||
<LI>The function <CODE>wresize()</CODE> allows you to resize windows, preserving
|
||||
their data.
|
||||
<LI>The function <CODE>use_default_colors()</CODE> allows you to
|
||||
use the terminal's default colors for the default color pair,
|
||||
achieving the effect of transparent colors.
|
||||
<LI>The functions <CODE>keyok()</CODE>
|
||||
and <CODE>define_key()</CODE> 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.
|
||||
<LI>Support for 16-color terminals, such as aixterm and XFree86 xterm.
|
||||
<LI>Better cursor-movement optimization. The package now features a
|
||||
cursor-local-movement computation more efficient than either BSD's
|
||||
or System V's.
|
||||
<LI>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.
|
||||
<LI>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.
|
||||
<LI>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).
|
||||
<LI>The tic(1)/captoinfo utility provided with ncurses has the
|
||||
ability to translate many termcaps from the XENIX, IBM and
|
||||
AT&T extension sets.
|
||||
<LI>A BSD-like tset(1) utility is provided.
|
||||
<LI>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.
|
||||
<LI>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.)
|
||||
<LI>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.
|
||||
<LI>A script (<STRONG>capconvert</STRONG>) is provided to help BSD users
|
||||
transition from termcap to terminfo. It gathers the information in a
|
||||
TERMCAP environment variable and/or a ~/.termcap local entries file
|
||||
and converts it to an equivalent local terminfo tree under $HOME/.terminfo.
|
||||
<LI>Automatic fallback to the /etc/termcap file can be compiled in
|
||||
when it is not possible to build a terminfo tree. This feature is neither
|
||||
fast nor cheap, you don't want to use it unless you have to,
|
||||
but it's there.
|
||||
<LI>The table-of-entries utility <STRONG>toe</STRONG> makes it easy for users to
|
||||
see exactly what terminal types are available on the system.
|
||||
<LI>The library meets the XSI requirement that every macro entry
|
||||
point have a corresponding function which may be linked (and will be
|
||||
prototype-checked) if the macro definition is disabled with
|
||||
<CODE>#undef</CODE>.
|
||||
<LI>An HTML "Introduction to Programming with NCURSES" document provides
|
||||
a narrative introduction to the curses programming interface.
|
||||
</UL>
|
||||
|
||||
<H1>State of the Package</H1>
|
||||
|
||||
Numerous bugs present in earlier versions have been fixed; the
|
||||
library is far more reliable than it used to be. Bounds checking in many
|
||||
`dangerous' entry points has been improved. The code is now type-safe
|
||||
according to gcc -Wall. The library has been checked for malloc leaks and
|
||||
arena corruption by the Purify memory-allocation tester.<P>
|
||||
|
||||
The ncurses code has been tested with a wide variety of applications
|
||||
including (versions starting with those noted):
|
||||
<DL>
|
||||
<DT> cdk
|
||||
<DD> Curses Development Kit
|
||||
<A HREF="http://www.vexus.ca/CDK.html">Curses Development Kit</a>
|
||||
<A HREF="ftp://ftp.clark.net/pub/dickey/cdk">ftp://ftp.clark.net/pub/dickey/cdk</A>.
|
||||
<DT> ded
|
||||
<DD> directory-editor
|
||||
<A HREF="ftp://ftp.clark.net/pub/dickey/ded">ftp://ftp.clark.net/pub/dickey/ded</A>.
|
||||
<DT> dialog
|
||||
<DD> the underlying application used in Slackware's setup, and the basis
|
||||
for similar applications on GNU/Linux.
|
||||
<DT> lynx
|
||||
<DD> the character-screen WWW browser
|
||||
<DT> Midnight Commander 4.1
|
||||
<DD> file manager
|
||||
<DT> mutt
|
||||
<DD> mail utility
|
||||
<DT> ncftp
|
||||
<DD> file-transfer utility
|
||||
<DT> nvi
|
||||
<DD> New vi versions 1.50 are able to use ncurses versions 1.9.7 and later.
|
||||
<DT> tin
|
||||
<DD> newsreader, supporting color, MIME
|
||||
<A HREF="ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff">ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff</A>.
|
||||
<DT> taper
|
||||
<DD> tape archive utility
|
||||
<DT> vh-1.6
|
||||
<DD> Volks-Hypertext browser for the Jargon File
|
||||
</DL>
|
||||
as well as some that use ncurses for the terminfo support alone:
|
||||
<DL>
|
||||
<DT> minicom
|
||||
<DD> terminal emulator
|
||||
<DT> vile
|
||||
<DD> vi-like-emacs
|
||||
<A HREF="ftp://ftp.clark.net/pub/dickey/vile">ftp://ftp.clark.net/pub/dickey/vile</A>.
|
||||
</DL>
|
||||
<P>
|
||||
|
||||
The ncurses distribution includes a selection of test programs (including
|
||||
a few games).
|
||||
|
||||
<H2>Who's Who and What's What</H2>
|
||||
|
||||
The original developers of ncurses are <A
|
||||
HREF="mailto:zmbenhal@netcom.com">Zeyd Ben-Halim</A> and
|
||||
<A HREF="http://www.ccil.org/~esr/home.html">Eric S. Raymond</A>.
|
||||
Ongoing work is being done by
|
||||
<A HREF="mailto:dickey@clark.net">Thomas Dickey</A>
|
||||
and
|
||||
<A HREF="mailto:juergen.pfeifer@gmx.net">Jürgen Pfeifer</A>.
|
||||
<A HREF="mailto:dickey@clark.net">Thomas Dickey</A>
|
||||
acts as the maintainer for the Free Software Foundation, which holds the
|
||||
copyright on ncurses.
|
||||
Contact the current maintainers at
|
||||
<A HREF="mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</A>.
|
||||
<P>
|
||||
|
||||
To join the ncurses mailing list, please write email to
|
||||
<CODE>bug-ncurses-request@gnu.org</CODE> containing the line:
|
||||
<PRE>
|
||||
subscribe <name>@<host.domain>
|
||||
</PRE>
|
||||
|
||||
This list is open to anyone interested in helping with the development and
|
||||
testing of this package.<P>
|
||||
|
||||
Beta versions of ncurses and patches to the current release are made available at
|
||||
<A HREF="ftp://ftp.clark.net/pub/dickey/ncurses">ftp://ftp.clark.net/pub/dickey/ncurses</A>.
|
||||
|
||||
<H2>Future Plans</H2>
|
||||
<UL>
|
||||
<LI>Extended-level XPG4 conformance, with internationalization support.
|
||||
<LI>Ports to more systems, including DOS and Windows.
|
||||
</UL>
|
||||
We need people to help with these projects. If you are interested in working
|
||||
on them, please join the ncurses list.
|
||||
|
||||
<H2>Other Related Resources</H2>
|
||||
|
||||
The distribution includes and uses a version of the terminfo-format
|
||||
terminal description file maintained by Eric Raymond.
|
||||
<A HREF="http://earthspace.net/~esr/terminfo">http://earthspace.net/~esr/terminfo</A>.<P>
|
||||
|
||||
You can find lots of information on terminal-related topics
|
||||
not covered in the terminfo file at
|
||||
<A HREF="http://www.cs.utk.edu/~shuford/terminal_index.html">Richard Shuford's
|
||||
archive</A>.
|
||||
</BODY>
|
||||
</HTML>
|
||||
<!--
|
||||
# The following sets edit modes for GNU EMACS
|
||||
# Local Variables:
|
||||
# mode:html
|
||||
# case-fold-search:nil
|
||||
# fill-column:70
|
||||
# End:
|
||||
-->
|
@ -1,110 +0,0 @@
|
||||
.\"***************************************************************************
|
||||
.\" Copyright (c) 1998,1999,2000 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. *
|
||||
.\"***************************************************************************
|
||||
.\"
|
||||
.\" Author: Thomas E. Dickey <dickey@clark.net> 1997,1999
|
||||
.\"
|
||||
.\" $Id: dft_fgbg.3x,v 1.10 2000/07/01 16:33:31 tom Exp $
|
||||
.TH use_default_colors 3X ""
|
||||
.SH NAME
|
||||
\fBdft_fgbg\fR:
|
||||
\fBuse_default_colors\fR,
|
||||
\fBassume_default_colors\fR \- use terminal's default colors
|
||||
..
|
||||
.SH SYNOPSIS
|
||||
\fB#include <curses.h>\fP
|
||||
|
||||
\fBint use_default_colors(void);\fP
|
||||
.br
|
||||
\fBint assume_default_colors(int fg, int bg);\fP
|
||||
..
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.I use_default_colors()
|
||||
and
|
||||
.I assume_default_colors()
|
||||
functions are extensions to the curses library.
|
||||
They are used with terminals that support ISO 6429 color, or equivalent.
|
||||
These terminals allow the application to reset color to an unspecified
|
||||
default value (e.g., with SGR 39 or SGR 49).
|
||||
.PP
|
||||
Applications that paint a colored background over the whole screen
|
||||
do not take advantage of SGR 39 and SGR 49.
|
||||
Some applications are designed to work with the default background.
|
||||
.PP
|
||||
The first function,
|
||||
.I use_default_colors()
|
||||
tells the curses library to assign terminal default
|
||||
foreground/background colors to color number -1. So init_pair(x,COLOR_RED,-1)
|
||||
will initialize pair x as red on default background and init_pair(x,-1,COLOR_BLUE) will
|
||||
initialize pair x as default foreground on blue.
|
||||
.PP
|
||||
The other,
|
||||
.I assume_default_colors()
|
||||
is a refinement which tells which colors to paint for color pair 0, and -1 means default terminal color.
|
||||
The following are equivalent:
|
||||
.RS
|
||||
.br
|
||||
.I use_default_colors();
|
||||
.br
|
||||
.I assume_default_colors(-1,-1);
|
||||
.RE
|
||||
.PP
|
||||
This is a ncurses extension and for other curses implementations color
|
||||
number -1 does not mean anything, just as for ncurses before a
|
||||
successful call of use_default_colors or assume_default_colors.
|
||||
..
|
||||
.SH RETURN VALUE
|
||||
These functions return the integer \fBERR\fP upon failure and \fBOK\fP on success.
|
||||
They will fail if either the terminal does not support
|
||||
the \fIorig_pair\fP or \fIorig_colors\fP capability.
|
||||
If the \fIinitialize_pair\fP capability is found, this causes an
|
||||
error as well.
|
||||
..
|
||||
.SH NOTES
|
||||
Associated with this extension, the \fBinit_pair\fR(3X) function accepts
|
||||
negative arguments to specify default foreground or background
|
||||
colors.
|
||||
..
|
||||
.SH PORTABILITY
|
||||
These routines are specific to ncurses. They were not supported on
|
||||
Version 7, BSD or System V implementations. It is recommended that
|
||||
any code depending on them be conditioned using NCURSES_VERSION.
|
||||
..
|
||||
.SH SEE ALSO
|
||||
\fBcurs_color\fR(3X),
|
||||
\fBded\fP(1).
|
||||
..
|
||||
.SH AUTHOR
|
||||
Thomas Dickey (from an analysis of the requirements for color xterm
|
||||
for XFree86 3.1.2C, February 1996).
|
||||
.\"#
|
||||
.\"# The following sets edit modes for GNU EMACS
|
||||
.\"# Local Variables:
|
||||
.\"# mode:nroff
|
||||
.\"# fill-column:79
|
||||
.\"# End:
|
@ -1,100 +0,0 @@
|
||||
'\" t
|
||||
.\"***************************************************************************
|
||||
.\" Copyright (c) 1998 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: menu_attribs.3x,v 1.6 1998/11/29 01:09:20 Rick.Ohnemus Exp $
|
||||
.TH menu_attributes 3X ""
|
||||
.SH NAME
|
||||
\fBmenu_attributes\fR - color and attribute control for menus
|
||||
.SH SYNOPSIS
|
||||
\fB#include <menu.h>\fR
|
||||
.br
|
||||
int set_menu_fore(MENU *menu, chtype attr);
|
||||
.br
|
||||
chtype menu_fore(const MENU *menu);
|
||||
.br
|
||||
int set_menu_back(MENU *menu, chtype attr);
|
||||
.br
|
||||
chtype menu_back(const MENU *menu);
|
||||
.br
|
||||
int set_menu_grey(MENU *menu, chtype attr);
|
||||
.br
|
||||
chtype menu_grey(const MENU *menu);
|
||||
.br
|
||||
int set_menu_pad(MENU *menu, int pad);
|
||||
.br
|
||||
int menu_pad(const MENU *menu);
|
||||
.br
|
||||
.SH DESCRIPTION
|
||||
The function \fBset_menu_fore\fR sets the foreground attribute of
|
||||
\fImenu\fR. This is the highlight used for selected menu items.
|
||||
\fBmenu_fore\fR returns the foreground attribute. The default
|
||||
is \fBA_STANDOUT\fR.
|
||||
|
||||
The function \fBset_menu_back\fR sets the background attribute of
|
||||
\fImenu\fR. This is the highlight used for selectable (but not currently
|
||||
selected) menu items. The function \fBmenu_back\fR returns the background
|
||||
attribute. The default is \fBA_NORMAL\fR.
|
||||
|
||||
The function \fBset_menu_grey\fR sets the grey attribute of \fImenu\fR. This is
|
||||
the highlight used for un-selectable menu items in menus that permit more than
|
||||
one selection. The function \fBmenu_grey\fR returns the grey attribute.
|
||||
The default is \fBA_UNDERLINE\fR.
|
||||
|
||||
The function \fBset_menu_pad\fR sets the character used to fill the space
|
||||
between the name and description parts of a menu item. \fBmenu_pad\fR returns
|
||||
the given menu's pad character. The default is a blank.
|
||||
.SH RETURN VALUE
|
||||
These routines return one of the following:
|
||||
.TP 5
|
||||
\fBE_OK\fR
|
||||
The routine succeeded.
|
||||
.TP 5
|
||||
\fBE_SYSTEM_ERROR\fR
|
||||
System error occurred (see \fBerrno\fR).
|
||||
.TP 5
|
||||
\fBE_BAD_ARGUMENT\fR
|
||||
Routine detected an incorrect or out-of-range argument.
|
||||
.SH SEE ALSO
|
||||
\fBcurses\fR(3X) and 3X pages whose names begin "menu_" for detailed
|
||||
descriptions of the entry points.
|
||||
.SH NOTES
|
||||
The header file \fB<menu.h>\fR automatically includes the header file
|
||||
\fB<curses.h>\fR.
|
||||
.SH PORTABILITY
|
||||
These routines emulate the System V menu library. They were not supported on
|
||||
Version 7 or BSD versions.
|
||||
.SH AUTHORS
|
||||
Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
|
||||
S. Raymond.
|
||||
.\"#
|
||||
.\"# The following sets edit modes for GNU EMACS
|
||||
.\"# Local Variables:
|
||||
.\"# mode:nroff
|
||||
.\"# fill-column:79
|
||||
.\"# End:
|
@ -1,692 +0,0 @@
|
||||
|
||||
A Hacker's Guide to NCURSES
|
||||
|
||||
Contents
|
||||
|
||||
* Abstract
|
||||
* Objective of the Package
|
||||
+ Why System V Curses?
|
||||
+ How to Design Extensions
|
||||
* Portability and Configuration
|
||||
* Documentation Conventions
|
||||
* How to Report Bugs
|
||||
* A Tour of the Ncurses Library
|
||||
+ Library Overview
|
||||
+ The Engine Room
|
||||
+ Keyboard Input
|
||||
+ Mouse Events
|
||||
+ Output and Screen Updating
|
||||
* The Forms and Menu Libraries
|
||||
* A Tour of the Terminfo Compiler
|
||||
+ Translation of Non-use Capabilities
|
||||
+ Use Capability Resolution
|
||||
+ Source-Form Translation
|
||||
* Other Utilities
|
||||
* Style Tips for Developers
|
||||
* Porting Hints
|
||||
|
||||
Abstract
|
||||
|
||||
This document is a hacker's tour of the ncurses library and utilities.
|
||||
It discusses design philosophy, implementation methods, and the
|
||||
conventions used for coding and documentation. It is recommended
|
||||
reading for anyone who is interested in porting, extending or
|
||||
improving the package.
|
||||
|
||||
Objective of the Package
|
||||
|
||||
The objective of the ncurses package is to provide a free software API
|
||||
for character-cell terminals and terminal emulators with the following
|
||||
characteristics:
|
||||
|
||||
* Source-compatible with historical curses implementations
|
||||
(including the original BSD curses and System V curses.
|
||||
* Conformant with the XSI Curses standard issued as part of XPG4 by
|
||||
X/Open.
|
||||
* High-quality -- stable and reliable code, wide portability, good
|
||||
packaging, superior documentation.
|
||||
* Featureful -- should eliminate as much of the drudgery of C
|
||||
interface programming as possible, freeing programmers to think at
|
||||
a higher level of design.
|
||||
|
||||
These objectives are in priority order. So, for example, source
|
||||
compatibility with older version must trump featurefulness -- we
|
||||
cannot add features if it means breaking the portion of the API
|
||||
corresponding to historical curses versions.
|
||||
|
||||
Why System V Curses?
|
||||
|
||||
We used System V curses as a model, reverse-engineering their API, in
|
||||
order to fulfill the first two objectives.
|
||||
|
||||
System V curses implementations can support BSD curses programs with
|
||||
just a recompilation, so by capturing the System V API we also capture
|
||||
BSD's.
|
||||
|
||||
More importantly for the future, the XSI Curses standard issued by
|
||||
X/Open is explicitly and closely modeled on System V. So conformance
|
||||
with System V took us most of the way to base-level XSI conformance.
|
||||
|
||||
How to Design Extensions
|
||||
|
||||
The third objective (standards conformance) requires that it be easy
|
||||
to condition source code using ncurses so that the absence of
|
||||
nonstandard extensions does not break the code.
|
||||
|
||||
Accordingly, we have a policy of associating with each nonstandard
|
||||
extension a feature macro, so that ncurses client code can use this
|
||||
macro to condition in or out the code that requires the ncurses
|
||||
extension.
|
||||
|
||||
For example, there is a macro NCURSES_MOUSE_VERSION which XSI Curses
|
||||
does not define, but which is defined in the ncurses library header.
|
||||
You can use this to condition the calls to the mouse API calls.
|
||||
|
||||
Portability and Configuration
|
||||
|
||||
Code written for ncurses may assume an ANSI-standard C compiler and
|
||||
POSIX-compatible OS interface. It may also assume the presence of a
|
||||
System-V-compatible select(2) call.
|
||||
|
||||
We encourage (but do not require) developers to make the code friendly
|
||||
to less-capable UNIX environments wherever possible.
|
||||
|
||||
We encourage developers to support OS-specific optimizations and
|
||||
methods not available under POSIX/ANSI, provided only that:
|
||||
|
||||
* All such code is properly conditioned so the build process does
|
||||
not attempt to compile it under a plain ANSI/POSIX environment.
|
||||
* Adding such implementation methods does not introduce
|
||||
incompatibilities in the ncurses API between platforms.
|
||||
|
||||
We use GNU autoconf(1) as a tool to deal with portability issues. The
|
||||
right way to leverage an OS-specific feature is to modify the autoconf
|
||||
specification files (configure.in and aclocal.m4) to set up a new
|
||||
feature macro, which you then use to condition your code.
|
||||
|
||||
Documentation Conventions
|
||||
|
||||
There are three kinds of documentation associated with this package.
|
||||
Each has a different preferred format:
|
||||
|
||||
* Package-internal files (README, INSTALL, TO-DO etc.)
|
||||
* Manual pages.
|
||||
* Everything else (i.e., narrative documentation).
|
||||
|
||||
Our conventions are simple:
|
||||
|
||||
1. Maintain package-internal files in plain text. The expected viewer
|
||||
for them more(1) or an editor window; there's no point in
|
||||
elaborate mark-up.
|
||||
2. Mark up manual pages in the man macros. These have to be viewable
|
||||
through traditional man(1) programs.
|
||||
3. Write everything else in HTML.
|
||||
|
||||
When in doubt, HTMLize a master and use lynx(1) to generate plain
|
||||
ASCII (as we do for the announcement document).
|
||||
|
||||
The reason for choosing HTML is that it's (a) well-adapted for on-line
|
||||
browsing through viewers that are everywhere; (b) more easily readable
|
||||
as plain text than most other mark-ups, if you don't have a viewer;
|
||||
and (c) carries enough information that you can generate a
|
||||
nice-looking printed version from it. Also, of course, it make
|
||||
exporting things like the announcement document to WWW pretty trivial.
|
||||
|
||||
How to Report Bugs
|
||||
|
||||
The reporting address for bugs is bug-ncurses@gnu.org. This is a
|
||||
majordomo list; to join, write to bug-ncurses-request@gnu.org with a
|
||||
message containing the line:
|
||||
subscribe <name>@<host.domain>
|
||||
|
||||
The ncurses code is maintained by a small group of volunteers. While
|
||||
we try our best to fix bugs promptly, we simply don't have a lot of
|
||||
hours to spend on elementary hand-holding. We rely on intelligent
|
||||
cooperation from our users. If you think you have found a bug in
|
||||
ncurses, there are some steps you can take before contacting us that
|
||||
will help get the bug fixed quickly.
|
||||
|
||||
In order to use our bug-fixing time efficiently, we put people who
|
||||
show us they've taken these steps at the head of our queue. This means
|
||||
that if you don't, you'll probably end up at the tail end and have to
|
||||
wait a while.
|
||||
|
||||
1. Develop a recipe to reproduce the bug.
|
||||
Bugs we can reproduce are likely to be fixed very quickly, often
|
||||
within days. The most effective single thing you can do to get a
|
||||
quick fix is develop a way we can duplicate the bad behavior --
|
||||
ideally, by giving us source for a small, portable test program
|
||||
that breaks the library. (Even better is a keystroke recipe using
|
||||
one of the test programs provided with the distribution.)
|
||||
2. Try to reproduce the bug on a different terminal type.
|
||||
In our experience, most of the behaviors people report as library
|
||||
bugs are actually due to subtle problems in terminal descriptions.
|
||||
This is especially likely to be true if you're using a traditional
|
||||
asynchronous terminal or PC-based terminal emulator, rather than
|
||||
xterm or a UNIX console entry.
|
||||
It's therefore extremely helpful if you can tell us whether or not
|
||||
your problem reproduces on other terminal types. Usually you'll
|
||||
have both a console type and xterm available; please tell us
|
||||
whether or not your bug reproduces on both.
|
||||
If you have xterm available, it is also good to collect xterm
|
||||
reports for different window sizes. This is especially true if you
|
||||
normally use an unusual xterm window size -- a surprising number
|
||||
of the bugs we've seen are either triggered or masked by these.
|
||||
3. Generate and examine a trace file for the broken behavior.
|
||||
Recompile your program with the debugging versions of the
|
||||
libraries. Insert a trace() call with the argument set to
|
||||
TRACE_UPDATE. (See "Writing Programs with NCURSES" for details on
|
||||
trace levels.) Reproduce your bug, then look at the trace file to
|
||||
see what the library was actually doing.
|
||||
Another frequent cause of apparent bugs is application coding
|
||||
errors that cause the wrong things to be put on the virtual
|
||||
screen. Looking at the virtual-screen dumps in the trace file will
|
||||
tell you immediately if this is happening, and save you from the
|
||||
possible embarrassment of being told that the bug is in your code
|
||||
and is your problem rather than ours.
|
||||
If the virtual-screen dumps look correct but the bug persists,
|
||||
it's possible to crank up the trace level to give more and more
|
||||
information about the library's update actions and the control
|
||||
sequences it issues to perform them. The test directory of the
|
||||
distribution contains a tool for digesting these logs to make them
|
||||
less tedious to wade through.
|
||||
Often you'll find terminfo problems at this stage by noticing that
|
||||
the escape sequences put out for various capabilities are wrong.
|
||||
If not, you're likely to learn enough to be able to characterize
|
||||
any bug in the screen-update logic quite exactly.
|
||||
4. Report details and symptoms, not just interpretations.
|
||||
If you do the preceding two steps, it is very likely that you'll
|
||||
discover the nature of the problem yourself and be able to send us
|
||||
a fix. This will create happy feelings all around and earn you
|
||||
good karma for the first time you run into a bug you really can't
|
||||
characterize and fix yourself.
|
||||
If you're still stuck, at least you'll know what to tell us.
|
||||
Remember, we need details. If you guess about what is safe to
|
||||
leave out, you are too likely to be wrong.
|
||||
If your bug produces a bad update, include a trace file. Try to
|
||||
make the trace at the least voluminous level that pins down the
|
||||
bug. Logs that have been through tracemunch are OK, it doesn't
|
||||
throw away any information (actually they're better than
|
||||
un-munched ones because they're easier to read).
|
||||
If your bug produces a core-dump, please include a symbolic stack
|
||||
trace generated by gdb(1) or your local equivalent.
|
||||
Tell us about every terminal on which you've reproduced the bug --
|
||||
and every terminal on which you can't. Ideally, sent us terminfo
|
||||
sources for all of these (yours might differ from ours).
|
||||
Include your ncurses version and your OS/machine type, of course!
|
||||
You can find your ncurses version in the curses.h file.
|
||||
|
||||
If your problem smells like a logic error or in cursor movement or
|
||||
scrolling or a bad capability, there are a couple of tiny test frames
|
||||
for the library algorithms in the progs directory that may help you
|
||||
isolate it. These are not part of the normal build, but do have their
|
||||
own make productions.
|
||||
|
||||
The most important of these is mvcur, a test frame for the
|
||||
cursor-movement optimization code. With this program, you can see
|
||||
directly what control sequences will be emitted for any given cursor
|
||||
movement or scroll/insert/delete operations. If you think you've got a
|
||||
bad capability identified, you can disable it and test again. The
|
||||
program is command-driven and has on-line help.
|
||||
|
||||
If you think the vertical-scroll optimization is broken, or just want
|
||||
to understand how it works better, build hashmap and read the header
|
||||
comments of hardscroll.c and hashmap.c; then try it out. You can also
|
||||
test the hardware-scrolling optimization separately with hardscroll.
|
||||
|
||||
There's one other interactive tester, tctest, that exercises
|
||||
translation between termcap and terminfo formats. If you have a
|
||||
serious need to run this, you probably belong on our development team!
|
||||
|
||||
A Tour of the Ncurses Library
|
||||
|
||||
Library Overview
|
||||
|
||||
Most of the library is superstructure -- fairly trivial convenience
|
||||
interfaces to a small set of basic functions and data structures used
|
||||
to manipulate the virtual screen (in particular, none of this code
|
||||
does any I/O except through calls to more fundamental modules
|
||||
described below). The files
|
||||
|
||||
lib_addch.c lib_bkgd.c lib_box.c lib_chgat.c lib_clear.c
|
||||
lib_clearok.c lib_clrbot.c lib_clreol.c lib_colorset.c lib_data.c
|
||||
lib_delch.c lib_delwin.c lib_echo.c lib_erase.c lib_gen.c
|
||||
lib_getstr.c lib_hline.c lib_immedok.c lib_inchstr.c lib_insch.c
|
||||
lib_insdel.c lib_insstr.c lib_instr.c lib_isendwin.c lib_keyname.c
|
||||
lib_leaveok.c lib_move.c lib_mvwin.c lib_overlay.c lib_pad.c
|
||||
lib_printw.c lib_redrawln.c lib_scanw.c lib_screen.c lib_scroll.c
|
||||
lib_scrollok.c lib_scrreg.c lib_set_term.c lib_slk.c
|
||||
lib_slkatr_set.c lib_slkatrof.c lib_slkatron.c lib_slkatrset.c
|
||||
lib_slkattr.c lib_slkclear.c lib_slkcolor.c lib_slkinit.c
|
||||
lib_slklab.c lib_slkrefr.c lib_slkset.c lib_slktouch.c lib_touch.c
|
||||
lib_unctrl.c lib_vline.c lib_wattroff.c lib_wattron.c lib_window.c
|
||||
|
||||
are all in this category. They are very unlikely to need change,
|
||||
barring bugs or some fundamental reorganization in the underlying data
|
||||
structures.
|
||||
|
||||
These files are used only for debugging support:
|
||||
|
||||
lib_trace.c lib_traceatr.c lib_tracebits.c lib_tracechr.c
|
||||
lib_tracedmp.c lib_tracemse.c trace_buf.c
|
||||
|
||||
It is rather unlikely you will ever need to change these, unless you
|
||||
want to introduce a new debug trace level for some reasoon.
|
||||
|
||||
There is another group of files that do direct I/O via tputs(),
|
||||
computations on the terminal capabilities, or queries to the OS
|
||||
environment, but nevertheless have only fairly low complexity. These
|
||||
include:
|
||||
|
||||
lib_acs.c lib_beep.c lib_color.c lib_endwin.c lib_initscr.c
|
||||
lib_longname.c lib_newterm.c lib_options.c lib_termcap.c lib_ti.c
|
||||
lib_tparm.c lib_tputs.c lib_vidattr.c read_entry.c.
|
||||
|
||||
They are likely to need revision only if ncurses is being ported to an
|
||||
environment without an underlying terminfo capability representation.
|
||||
|
||||
These files have serious hooks into the tty driver and signal
|
||||
facilities:
|
||||
|
||||
lib_kernel.c lib_baudrate.c lib_raw.c lib_tstp.c lib_twait.c
|
||||
|
||||
If you run into porting snafus moving the package to another UNIX, the
|
||||
problem is likely to be in one of these files. The file lib_print.c
|
||||
uses sleep(2) and also falls in this category.
|
||||
|
||||
Almost all of the real work is done in the files
|
||||
|
||||
hardscroll.c hashmap.c lib_addch.c lib_doupdate.c lib_getch.c
|
||||
lib_mouse.c lib_mvcur.c lib_refresh.c lib_setup.c lib_vidattr.c
|
||||
|
||||
Most of the algorithmic complexity in the library lives in these
|
||||
files. If there is a real bug in ncurses itself, it's probably here.
|
||||
We'll tour some of these files in detail below (see The Engine Room).
|
||||
|
||||
Finally, there is a group of files that is actually most of the
|
||||
terminfo compiler. The reason this code lives in the ncurses library
|
||||
is to support fallback to /etc/termcap. These files include
|
||||
|
||||
alloc_entry.c captoinfo.c comp_captab.c comp_error.c comp_hash.c
|
||||
comp_parse.c comp_scan.c parse_entry.c read_termcap.c write_entry.c
|
||||
|
||||
We'll discuss these in the compiler tour.
|
||||
|
||||
The Engine Room
|
||||
|
||||
Keyboard Input
|
||||
|
||||
All ncurses input funnels through the function wgetch(), defined in
|
||||
lib_getch.c. This function is tricky; it has to poll for keyboard and
|
||||
mouse events and do a running match of incoming input against the set
|
||||
of defined special keys.
|
||||
|
||||
The central data structure in this module is a FIFO queue, used to
|
||||
match multiple-character input sequences against special-key
|
||||
capabilities; also to implement pushback via ungetch().
|
||||
|
||||
The wgetch() code distinguishes between function key sequences and the
|
||||
same sequences typed manually by doing a timed wait after each input
|
||||
character that could lead a function key sequence. If the entire
|
||||
sequence takes less than 1 second, it is assumed to have been
|
||||
generated by a function key press.
|
||||
|
||||
Hackers bruised by previous encounters with variant select(2) calls
|
||||
may find the code in lib_twait.c interesting. It deals with the
|
||||
problem that some BSD selects don't return a reliable time-left value.
|
||||
The function timed_wait() effectively simulates a System V select.
|
||||
|
||||
Mouse Events
|
||||
|
||||
If the mouse interface is active, wgetch() polls for mouse events each
|
||||
call, before it goes to the keyboard for input. It is up to
|
||||
lib_mouse.c how the polling is accomplished; it may vary for different
|
||||
devices.
|
||||
|
||||
Under xterm, however, mouse event notifications come in via the
|
||||
keyboard input stream. They are recognized by having the kmous
|
||||
capability as a prefix. This is kind of klugey, but trying to wire in
|
||||
recognition of a mouse key prefix without going through the
|
||||
function-key machinery would be just too painful, and this turns out
|
||||
to imply having the prefix somewhere in the function-key capabilities
|
||||
at terminal-type initialization.
|
||||
|
||||
This kluge only works because kmous isn't actually used by any
|
||||
historic terminal type or curses implementation we know of. Best guess
|
||||
is it's a relic of some forgotten experiment in-house at Bell Labs
|
||||
that didn't leave any traces in the publicly-distributed System V
|
||||
terminfo files. If System V or XPG4 ever gets serious about using it
|
||||
again, this kluge may have to change.
|
||||
|
||||
Here are some more details about mouse event handling:
|
||||
|
||||
The lib_mouse()code is logically split into a lower level that accepts
|
||||
event reports in a device-dependent format and an upper level that
|
||||
parses mouse gestures and filters events. The mediating data structure
|
||||
is a circular queue of event structures.
|
||||
|
||||
Functionally, the lower level's job is to pick up primitive events and
|
||||
put them on the circular queue. This can happen in one of two ways:
|
||||
either (a) _nc_mouse_event() detects a series of incoming mouse
|
||||
reports and queues them, or (b) code in lib_getch.c detects the kmous
|
||||
prefix in the keyboard input stream and calls _nc_mouse_inline to
|
||||
queue up a series of adjacent mouse reports.
|
||||
|
||||
In either case, _nc_mouse_parse() should be called after the series is
|
||||
accepted to parse the digested mouse reports (low-level events) into a
|
||||
gesture (a high-level or composite event).
|
||||
|
||||
Output and Screen Updating
|
||||
|
||||
With the single exception of character echoes during a wgetnstr() call
|
||||
(which simulates cooked-mode line editing in an ncurses window), the
|
||||
library normally does all its output at refresh time.
|
||||
|
||||
The main job is to go from the current state of the screen (as
|
||||
represented in the curscr window structure) to the desired new state
|
||||
(as represented in the newscr window structure), while doing as little
|
||||
I/O as possible.
|
||||
|
||||
The brains of this operation are the modules hashmap.c, hardscroll.c
|
||||
and lib_doupdate.c; the latter two use lib_mvcur.c. Essentially, what
|
||||
happens looks like this:
|
||||
|
||||
The hashmap.c module tries to detect vertical motion changes between
|
||||
the real and virtual screens. This information is represented by the
|
||||
oldindex members in the newscr structure. These are modified by
|
||||
vertical-motion and clear operations, and both are re-initialized
|
||||
after each update. To this change-journalling information, the hashmap
|
||||
code adds deductions made using a modified Heckel algorithm on hash
|
||||
values generated from the line contents.
|
||||
|
||||
The hardscroll.c module computes an optimum set of scroll, insertion,
|
||||
and deletion operations to make the indices match. It calls
|
||||
_nc_mvcur_scrolln() in lib_mvcur.c to do those motions.
|
||||
|
||||
Then lib_doupdate.c goes to work. Its job is to do line-by-line
|
||||
transformations of curscr lines to newscr lines. Its main tool is the
|
||||
routine mvcur() in lib_mvcur.c. This routine does cursor-movement
|
||||
optimization, attempting to get from given screen location A to given
|
||||
location B in the fewest output characters posible.
|
||||
|
||||
If you want to work on screen optimizations, you should use the fact
|
||||
that (in the trace-enabled version of the library) enabling the
|
||||
TRACE_TIMES trace level causes a report to be emitted after each
|
||||
screen update giving the elapsed time and a count of characters
|
||||
emitted during the update. You can use this to tell when an update
|
||||
optimization improves efficiency.
|
||||
|
||||
In the trace-enabled version of the library, it is also possible to
|
||||
disable and re-enable various optimizations at runtime by tweaking the
|
||||
variable _nc_optimize_enable. See the file include/curses.h.in for
|
||||
mask values, near the end.
|
||||
|
||||
The Forms and Menu Libraries
|
||||
|
||||
The forms and menu libraries should work reliably in any environment
|
||||
you can port ncurses to. The only portability issue anywhere in them
|
||||
is what flavor of regular expressions the built-in form field type
|
||||
TYPE_REGEXP will recognize.
|
||||
|
||||
The configuration code prefers the POSIX regex facility, modeled on
|
||||
System V's, but will settle for BSD regexps if the former isn't
|
||||
available.
|
||||
|
||||
Historical note: the panels code was written primarily to assist in
|
||||
porting u386mon 2.0 (comp.sources.misc v14i001-4) to systems lacking
|
||||
panels support; u386mon 2.10 and beyond use it. This version has been
|
||||
slightly cleaned up for ncurses.
|
||||
|
||||
A Tour of the Terminfo Compiler
|
||||
|
||||
The ncurses implementation of tic is rather complex internally; it has
|
||||
to do a trying combination of missions. This starts with the fact
|
||||
that, in addition to its normal duty of compiling terminfo sources
|
||||
into loadable terminfo binaries, it has to be able to handle termcap
|
||||
syntax and compile that too into terminfo entries.
|
||||
|
||||
The implementation therefore starts with a table-driven, dual-mode
|
||||
lexical analyzer (in comp_scan.c). The lexer chooses its mode (termcap
|
||||
or terminfo) based on the first `,' or `:' it finds in each entry. The
|
||||
lexer does all the work of recognizing capability names and values;
|
||||
the grammar above it is trivial, just "parse entries till you run out
|
||||
of file".
|
||||
|
||||
Translation of Non-use Capabilities
|
||||
|
||||
Translation of most things besides use capabilities is pretty
|
||||
straightforward. The lexical analyzer's tokenizer hands each
|
||||
capability name to a hash function, which drives a table lookup. The
|
||||
table entry yields an index which is used to look up the token type in
|
||||
another table, and controls interpretation of the value.
|
||||
|
||||
One possibly interesting aspect of the implementation is the way the
|
||||
compiler tables are initialized. All the tables are generated by
|
||||
various awk/sed/sh scripts from a master table include/Caps; these
|
||||
scripts actually write C initializers which are linked to the
|
||||
compiler. Furthermore, the hash table is generated in the same way, so
|
||||
it doesn't have to be generated at compiler startup time (another
|
||||
benefit of this organization is that the hash table can be in
|
||||
shareable text space).
|
||||
|
||||
Thus, adding a new capability is usually pretty trivial, just a matter
|
||||
of adding one line to the include/Caps file. We'll have more to say
|
||||
about this in the section on Source-Form Translation.
|
||||
|
||||
Use Capability Resolution
|
||||
|
||||
The background problem that makes tic tricky isn't the capability
|
||||
translation itself, it's the resolution of use capabilities. Older
|
||||
versions would not handle forward use references for this reason (that
|
||||
is, a using terminal always had to follow its use target in the source
|
||||
file). By doing this, they got away with a simple implementation
|
||||
tactic; compile everything as it blows by, then resolve uses from
|
||||
compiled entries.
|
||||
|
||||
This won't do for ncurses. The problem is that that the whole
|
||||
compilation process has to be embeddable in the ncurses library so
|
||||
that it can be called by the startup code to translate termcap entries
|
||||
on the fly. The embedded version can't go promiscuously writing
|
||||
everything it translates out to disk -- for one thing, it will
|
||||
typically be running with non-root permissions.
|
||||
|
||||
So our tic is designed to parse an entire terminfo file into a
|
||||
doubly-linked circular list of entry structures in-core, and then do
|
||||
use resolution in-memory before writing everything out. This design
|
||||
has other advantages: it makes forward and back use-references equally
|
||||
easy (so we get the latter for free), and it makes checking for name
|
||||
collisions before they're written out easy to do.
|
||||
|
||||
And this is exactly how the embedded version works. But the
|
||||
stand-alone user-accessible version of tic partly reverts to the
|
||||
historical strategy; it writes to disk (not keeping in core) any entry
|
||||
with no use references.
|
||||
|
||||
This is strictly a core-economy kluge, implemented because the
|
||||
terminfo master file is large enough that some core-poor systems swap
|
||||
like crazy when you compile it all in memory...there have been reports
|
||||
of this process taking three hours, rather than the twenty seconds or
|
||||
less typical on the author's development box.
|
||||
|
||||
So. The executable tic passes the entry-parser a hook that immediately
|
||||
writes out the referenced entry if it has no use capabilities. The
|
||||
compiler main loop refrains from adding the entry to the in-core list
|
||||
when this hook fires. If some other entry later needs to reference an
|
||||
entry that got written immediately, that's OK; the resolution code
|
||||
will fetch it off disk when it can't find it in core.
|
||||
|
||||
Name collisions will still be detected, just not as cleanly. The
|
||||
write_entry() code complains before overwriting an entry that
|
||||
postdates the time of tic's first call to write_entry(), Thus it will
|
||||
complain about overwriting entries newly made during the tic run, but
|
||||
not about overwriting ones that predate it.
|
||||
|
||||
Source-Form Translation
|
||||
|
||||
Another use of tic is to do source translation between various termcap
|
||||
and terminfo formats. There are more variants out there than you might
|
||||
think; the ones we know about are described in the captoinfo(1) manual
|
||||
page.
|
||||
|
||||
The translation output code (dump_entry() in ncurses/dump_entry.c) is
|
||||
shared with the infocmp(1) utility. It takes the same internal
|
||||
representation used to generate the binary form and dumps it to
|
||||
standard output in a specified format.
|
||||
|
||||
The include/Caps file has a header comment describing ways you can
|
||||
specify source translations for nonstandard capabilities just by
|
||||
altering the master table. It's possible to set up capability aliasing
|
||||
or tell the compiler to plain ignore a given capability without
|
||||
writing any C code at all.
|
||||
|
||||
For circumstances where you need to do algorithmic translation, there
|
||||
are functions in parse_entry.c called after the parse of each entry
|
||||
that are specifically intended to encapsulate such translations. This,
|
||||
for example, is where the AIX box1 capability get translated to an
|
||||
acsc string.
|
||||
|
||||
Other Utilities
|
||||
|
||||
The infocmp utility is just a wrapper around the same entry-dumping
|
||||
code used by tic for source translation. Perhaps the one interesting
|
||||
aspect of the code is the use of a predicate function passed in to
|
||||
dump_entry() to control which capabilities are dumped. This is
|
||||
necessary in order to handle both the ordinary De-compilation case and
|
||||
entry difference reporting.
|
||||
|
||||
The tput and clear utilities just do an entry load followed by a
|
||||
tputs() of a selected capability.
|
||||
|
||||
Style Tips for Developers
|
||||
|
||||
See the TO-DO file in the top-level directory of the source
|
||||
distribution for additions that would be particularly useful.
|
||||
|
||||
The prefix _nc_ should be used on library public functions that are
|
||||
not part of the curses API in order to prevent pollution of the
|
||||
application namespace. If you have to add to or modify the function
|
||||
prototypes in curses.h.in, read ncurses/MKlib_gen.sh first so you can
|
||||
avoid breaking XSI conformance. Please join the ncurses mailing list.
|
||||
See the INSTALL file in the top level of the distribution for details
|
||||
on the list.
|
||||
|
||||
Look for the string FIXME in source files to tag minor bugs and
|
||||
potential problems that could use fixing.
|
||||
|
||||
Don't try to auto-detect OS features in the main body of the C code.
|
||||
That's the job of the configuration system.
|
||||
|
||||
To hold down complexity, do make your code data-driven. Especially, if
|
||||
you can drive logic from a table filtered out of include/Caps, do it.
|
||||
If you find you need to augment the data in that file in order to
|
||||
generate the proper table, that's still preferable to ad-hoc code --
|
||||
that's why the fifth field (flags) is there.
|
||||
|
||||
Have fun!
|
||||
|
||||
Porting Hints
|
||||
|
||||
The following notes are intended to be a first step towards DOS and
|
||||
Macintosh ports of the ncurses libraries.
|
||||
|
||||
The following library modules are `pure curses'; they operate only on
|
||||
the curses internal structures, do all output through other curses
|
||||
calls (not including tputs() and putp()) and do not call any other
|
||||
UNIX routines such as signal(2) or the stdio library. Thus, they
|
||||
should not need to be modified for single-terminal ports.
|
||||
|
||||
lib_addch.c lib_addstr.c lib_bkgd.c lib_box.c lib_clear.c
|
||||
lib_clrbot.c lib_clreol.c lib_delch.c lib_delwin.c lib_erase.c
|
||||
lib_inchstr.c lib_insch.c lib_insdel.c lib_insstr.c lib_keyname.c
|
||||
lib_move.c lib_mvwin.c lib_newwin.c lib_overlay.c lib_pad.c
|
||||
lib_printw.c lib_refresh.c lib_scanw.c lib_scroll.c lib_scrreg.c
|
||||
lib_set_term.c lib_touch.c lib_tparm.c lib_tputs.c lib_unctrl.c
|
||||
lib_window.c panel.c
|
||||
|
||||
This module is pure curses, but calls outstr():
|
||||
|
||||
lib_getstr.c
|
||||
|
||||
These modules are pure curses, except that they use tputs() and
|
||||
putp():
|
||||
|
||||
lib_beep.c lib_color.c lib_endwin.c lib_options.c lib_slk.c
|
||||
lib_vidattr.c
|
||||
|
||||
This modules assist in POSIX emulation on non-POSIX systems:
|
||||
|
||||
sigaction.c
|
||||
signal calls
|
||||
|
||||
The following source files will not be needed for a
|
||||
single-terminal-type port.
|
||||
|
||||
alloc_entry.c captoinfo.c clear.c comp_captab.c comp_error.c
|
||||
comp_hash.c comp_main.c comp_parse.c comp_scan.c dump_entry.c
|
||||
infocmp.c parse_entry.c read_entry.c tput.c write_entry.c
|
||||
|
||||
The following modules will use open()/read()/write()/close()/lseek()
|
||||
on files, but no other OS calls.
|
||||
|
||||
lib_screen.c
|
||||
used to read/write screen dumps
|
||||
|
||||
lib_trace.c
|
||||
used to write trace data to the logfile
|
||||
|
||||
Modules that would have to be modified for a port start here:
|
||||
|
||||
The following modules are `pure curses' but contain assumptions
|
||||
inappropriate for a memory-mapped port.
|
||||
|
||||
lib_longname.c
|
||||
assumes there may be multiple terminals
|
||||
|
||||
lib_acs.c
|
||||
assumes acs_map as a double indirection
|
||||
|
||||
lib_mvcur.c
|
||||
assumes cursor moves have variable cost
|
||||
|
||||
lib_termcap.c
|
||||
assumes there may be multiple terminals
|
||||
|
||||
lib_ti.c
|
||||
assumes there may be multiple terminals
|
||||
|
||||
The following modules use UNIX-specific calls:
|
||||
|
||||
lib_doupdate.c
|
||||
input checking
|
||||
|
||||
lib_getch.c
|
||||
read()
|
||||
|
||||
lib_initscr.c
|
||||
getenv()
|
||||
|
||||
lib_newterm.c
|
||||
lib_baudrate.c
|
||||
lib_kernel.c
|
||||
various tty-manipulation and system calls
|
||||
|
||||
lib_raw.c
|
||||
various tty-manipulation calls
|
||||
|
||||
lib_setup.c
|
||||
various tty-manipulation calls
|
||||
|
||||
lib_restart.c
|
||||
various tty-manipulation calls
|
||||
|
||||
lib_tstp.c
|
||||
signal-manipulation calls
|
||||
|
||||
lib_twait.c
|
||||
gettimeofday(), select().
|
||||
_________________________________________________________________
|
||||
|
||||
|
||||
Eric S. Raymond <esr@snark.thyrsus.com>
|
||||
|
||||
(Note: This is not the bug address!)
|
@ -1,883 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
|
||||
<!--
|
||||
$Id: hackguide.html,v 1.23 1999/01/17 00:15:48 tom Exp $
|
||||
-->
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>A Hacker's Guide to Ncurses Internals</TITLE>
|
||||
<link rev="made" href="mailto:bugs-ncurses@gnu.org">
|
||||
<!--
|
||||
This document is self-contained, *except* that there is one relative link to
|
||||
the ncurses-intro.html document, expected to be in the same directory with
|
||||
this one.
|
||||
-->
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<H1>A Hacker's Guide to NCURSES</H1>
|
||||
|
||||
<H1>Contents</H1>
|
||||
<UL>
|
||||
<LI><A HREF="#abstract">Abstract</A>
|
||||
<P>
|
||||
<LI><A HREF="#objective">Objective of the Package</A>
|
||||
<UL>
|
||||
<LI><A HREF="#whysvr4">Why System V Curses?</A>
|
||||
<LI><A HREF="#extensions">How to Design Extensions</A>
|
||||
</UL>
|
||||
<LI><A HREF="#portability">Portability and Configuration</A><UL>
|
||||
</UL>
|
||||
<LI><A HREF="#documentation">Documentation Conventions</A>
|
||||
<P>
|
||||
<LI><A HREF="#bugtrack">How to Report Bugs</A>
|
||||
<P>
|
||||
<LI><A HREF="#ncurslib">A Tour of the Ncurses Library</A>
|
||||
<UL>
|
||||
<LI><A HREF="#loverview">Library Overview</A>
|
||||
<LI><A HREF="#engine">The Engine Room</A>
|
||||
<LI><A HREF="#input">Keyboard Input</A>
|
||||
<LI><A HREF="#mouse">Mouse Events</A>
|
||||
<LI><A HREF="#output">Output and Screen Updating</A>
|
||||
</UL>
|
||||
<LI><A HREF="#fmnote">The Forms and Menu Libraries</A>
|
||||
<P>
|
||||
<LI><A HREF="#tic">A Tour of the Terminfo Compiler</A>
|
||||
<UL>
|
||||
<LI><A HREF="#nonuse">Translation of Non-<STRONG>use</STRONG> Capabilities</A>
|
||||
<LI><A HREF="#uses">Use Capability Resolution</A>
|
||||
<LI><A HREF="#translation">Source-Form Translation</A>
|
||||
</UL>
|
||||
<LI><A HREF="#utils">Other Utilities</A>
|
||||
<P>
|
||||
<LI><A HREF="#style">Style Tips for Developers</A>
|
||||
<P>
|
||||
<LI><A HREF="#port">Porting Hints</A>
|
||||
</UL>
|
||||
|
||||
<H1><A NAME="abstract">Abstract</A></H1>
|
||||
|
||||
This document is a hacker's tour of the <STRONG>ncurses</STRONG> library and utilities.
|
||||
It discusses design philosophy, implementation methods, and the
|
||||
conventions used for coding and documentation. It is recommended
|
||||
reading for anyone who is interested in porting, extending or improving the
|
||||
package. <P>
|
||||
|
||||
<H1><A NAME="objective">Objective of the Package</A></H1>
|
||||
|
||||
The objective of the <STRONG>ncurses</STRONG> package is to provide a free software API for
|
||||
character-cell terminals and terminal emulators with the following
|
||||
characteristics: <P>
|
||||
|
||||
<UL>
|
||||
<LI>Source-compatible with historical curses implementations (including
|
||||
the original BSD curses and System V curses.
|
||||
<P>
|
||||
<LI>Conformant with the XSI Curses standard issued as part of XPG4 by
|
||||
X/Open.
|
||||
<P>
|
||||
<LI>High-quality -- stable and reliable code, wide portability, good
|
||||
packaging, superior documentation.
|
||||
<P>
|
||||
<LI>Featureful -- should eliminate as much of the drudgery of C interface
|
||||
programming as possible, freeing programmers to think at a higher
|
||||
level of design.
|
||||
</UL>
|
||||
|
||||
These objectives are in priority order. So, for example, source
|
||||
compatibility with older version must trump featurefulness -- we cannot
|
||||
add features if it means breaking the portion of the API corresponding
|
||||
to historical curses versions. <P>
|
||||
|
||||
<H2><A NAME="whysvr4">Why System V Curses?</A></H2>
|
||||
|
||||
We used System V curses as a model, reverse-engineering their API, in
|
||||
order to fulfill the first two objectives. <P>
|
||||
|
||||
System V curses implementations can support BSD curses programs with
|
||||
just a recompilation, so by capturing the System V API we also
|
||||
capture BSD's. <P>
|
||||
|
||||
More importantly for the future, the XSI Curses standard issued by X/Open
|
||||
is explicitly and closely modeled on System V. So conformance with
|
||||
System V took us most of the way to base-level XSI conformance. <P>
|
||||
|
||||
<H2><A NAME="extensions">How to Design Extensions</A></H2>
|
||||
|
||||
The third objective (standards conformance) requires that it be easy to
|
||||
condition source code using <STRONG>ncurses</STRONG> so that the absence of nonstandard
|
||||
extensions does not break the code. <P>
|
||||
|
||||
Accordingly, we have a policy of associating with each nonstandard extension
|
||||
a feature macro, so that ncurses client code can use this macro to condition
|
||||
in or out the code that requires the <STRONG>ncurses</STRONG> extension. <P>
|
||||
|
||||
For example, there is a macro <CODE>NCURSES_MOUSE_VERSION</CODE> which XSI Curses
|
||||
does not define, but which is defined in the <STRONG>ncurses</STRONG> library header.
|
||||
You can use this to condition the calls to the mouse API calls. <P>
|
||||
|
||||
<H1><A NAME="portability">Portability and Configuration</A></H1>
|
||||
|
||||
Code written for <STRONG>ncurses</STRONG> may assume an ANSI-standard C compiler and
|
||||
POSIX-compatible OS interface. It may also assume the presence of a
|
||||
System-V-compatible <EM>select(2)</EM> call. <P>
|
||||
|
||||
We encourage (but do not require) developers to make the code friendly
|
||||
to less-capable UNIX environments wherever possible. <P>
|
||||
|
||||
We encourage developers to support OS-specific optimizations and methods
|
||||
not available under POSIX/ANSI, provided only that: <P>
|
||||
|
||||
<UL>
|
||||
<LI>All such code is properly conditioned so the build process does not
|
||||
attempt to compile it under a plain ANSI/POSIX environment.
|
||||
<P>
|
||||
<LI>Adding such implementation methods does not introduce incompatibilities
|
||||
in the <STRONG>ncurses</STRONG> API between platforms.
|
||||
</UL>
|
||||
|
||||
We use GNU <CODE>autoconf(1)</CODE> as a tool to deal with portability issues.
|
||||
The right way to leverage an OS-specific feature is to modify the autoconf
|
||||
specification files (configure.in and aclocal.m4) to set up a new feature
|
||||
macro, which you then use to condition your code. <P>
|
||||
|
||||
<H1><A NAME="documentation">Documentation Conventions</A></H1>
|
||||
|
||||
There are three kinds of documentation associated with this package. Each
|
||||
has a different preferred format: <P>
|
||||
|
||||
<UL>
|
||||
<LI>Package-internal files (README, INSTALL, TO-DO etc.)
|
||||
<LI>Manual pages.
|
||||
<LI>Everything else (i.e., narrative documentation).
|
||||
</UL>
|
||||
|
||||
Our conventions are simple: <P>
|
||||
<OL>
|
||||
<LI><STRONG>Maintain package-internal files in plain text.</STRONG>
|
||||
The expected viewer for them <EM>more(1)</EM> or an editor window; there's
|
||||
no point in elaborate mark-up. <P>
|
||||
|
||||
<LI><STRONG>Mark up manual pages in the man macros.</STRONG> These have to be viewable
|
||||
through traditional <EM>man(1)</EM> programs. <P>
|
||||
|
||||
<LI><STRONG>Write everything else in HTML.</STRONG>
|
||||
</OL>
|
||||
|
||||
When in doubt, HTMLize a master and use <EM>lynx(1)</EM> to generate
|
||||
plain ASCII (as we do for the announcement document). <P>
|
||||
|
||||
The reason for choosing HTML is that it's (a) well-adapted for on-line
|
||||
browsing through viewers that are everywhere; (b) more easily readable
|
||||
as plain text than most other mark-ups, if you don't have a viewer; and (c)
|
||||
carries enough information that you can generate a nice-looking printed
|
||||
version from it. Also, of course, it make exporting things like the
|
||||
announcement document to WWW pretty trivial.<P>
|
||||
|
||||
<H1><A NAME="bugtrack">How to Report Bugs</A></H1>
|
||||
|
||||
The <A NAME="bugreport">reporting address for bugs</A> is
|
||||
<A HREF="mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</A>.
|
||||
This is a majordomo list; to join, write
|
||||
to <CODE>bug-ncurses-request@gnu.org</CODE> with a message containing the line:
|
||||
<PRE>
|
||||
subscribe <name>@<host.domain>
|
||||
</PRE>
|
||||
|
||||
The <CODE>ncurses</CODE> code is maintained by a small group of
|
||||
volunteers. While we try our best to fix bugs promptly, we simply
|
||||
don't have a lot of hours to spend on elementary hand-holding. We rely
|
||||
on intelligent cooperation from our users. If you think you have
|
||||
found a bug in <CODE>ncurses</CODE>, there are some steps you can take
|
||||
before contacting us that will help get the bug fixed quickly. <P>
|
||||
|
||||
In order to use our bug-fixing time efficiently, we put people who
|
||||
show us they've taken these steps at the head of our queue. This
|
||||
means that if you don't, you'll probably end up at the tail end and
|
||||
have to wait a while. <P>
|
||||
|
||||
<OL>
|
||||
<LI>Develop a recipe to reproduce the bug. <P>
|
||||
|
||||
Bugs we can reproduce are likely to be fixed very quickly, often
|
||||
within days. The most effective single thing you can do to get a
|
||||
quick fix is develop a way we can duplicate the bad behavior --
|
||||
ideally, by giving us source for a small, portable test program that
|
||||
breaks the library. (Even better is a keystroke recipe using one of
|
||||
the test programs provided with the distribution.) <P>
|
||||
|
||||
<LI>Try to reproduce the bug on a different terminal type. <P>
|
||||
|
||||
In our experience, most of the behaviors people report as library bugs
|
||||
are actually due to subtle problems in terminal descriptions. This is
|
||||
especially likely to be true if you're using a traditional
|
||||
asynchronous terminal or PC-based terminal emulator, rather than xterm
|
||||
or a UNIX console entry. <P>
|
||||
|
||||
It's therefore extremely helpful if you can tell us whether or not your
|
||||
problem reproduces on other terminal types. Usually you'll have both
|
||||
a console type and xterm available; please tell us whether or not your
|
||||
bug reproduces on both. <P>
|
||||
|
||||
If you have xterm available, it is also good to collect xterm reports for
|
||||
different window sizes. This is especially true if you normally use an
|
||||
unusual xterm window size -- a surprising number of the bugs we've seen
|
||||
are either triggered or masked by these. <P>
|
||||
|
||||
<LI>Generate and examine a trace file for the broken behavior. <P>
|
||||
|
||||
Recompile your program with the debugging versions of the libraries.
|
||||
Insert a <CODE>trace()</CODE> call with the argument set to <CODE>TRACE_UPDATE</CODE>.
|
||||
(See <A HREF="ncurses-intro.html#debugging">"Writing Programs with
|
||||
NCURSES"</A> for details on trace levels.)
|
||||
Reproduce your bug, then look at the trace file to see what the library
|
||||
was actually doing. <P>
|
||||
|
||||
Another frequent cause of apparent bugs is application coding errors
|
||||
that cause the wrong things to be put on the virtual screen. Looking
|
||||
at the virtual-screen dumps in the trace file will tell you immediately if
|
||||
this is happening, and save you from the possible embarrassment of being
|
||||
told that the bug is in your code and is your problem rather than ours. <P>
|
||||
|
||||
If the virtual-screen dumps look correct but the bug persists, it's
|
||||
possible to crank up the trace level to give more and more information
|
||||
about the library's update actions and the control sequences it issues
|
||||
to perform them. The test directory of the distribution contains a
|
||||
tool for digesting these logs to make them less tedious to wade
|
||||
through. <P>
|
||||
|
||||
Often you'll find terminfo problems at this stage by noticing that the
|
||||
escape sequences put out for various capabilities are wrong. If not,
|
||||
you're likely to learn enough to be able to characterize any bug in
|
||||
the screen-update logic quite exactly. <P>
|
||||
|
||||
<LI>Report details and symptoms, not just interpretations. <P>
|
||||
|
||||
If you do the preceding two steps, it is very likely that you'll discover
|
||||
the nature of the problem yourself and be able to send us a fix. This
|
||||
will create happy feelings all around and earn you good karma for the first
|
||||
time you run into a bug you really can't characterize and fix yourself. <P>
|
||||
|
||||
If you're still stuck, at least you'll know what to tell us. Remember, we
|
||||
need details. If you guess about what is safe to leave out, you are too
|
||||
likely to be wrong. <P>
|
||||
|
||||
If your bug produces a bad update, include a trace file. Try to make
|
||||
the trace at the <EM>least</EM> voluminous level that pins down the
|
||||
bug. Logs that have been through tracemunch are OK, it doesn't throw
|
||||
away any information (actually they're better than un-munched ones because
|
||||
they're easier to read). <P>
|
||||
|
||||
If your bug produces a core-dump, please include a symbolic stack trace
|
||||
generated by gdb(1) or your local equivalent. <P>
|
||||
|
||||
Tell us about every terminal on which you've reproduced the bug -- and
|
||||
every terminal on which you can't. Ideally, sent us terminfo sources
|
||||
for all of these (yours might differ from ours). <P>
|
||||
|
||||
Include your ncurses version and your OS/machine type, of course! You can
|
||||
find your ncurses version in the <CODE>curses.h</CODE> file.
|
||||
</OL>
|
||||
|
||||
If your problem smells like a logic error or in cursor movement or
|
||||
scrolling or a bad capability, there are a couple of tiny test frames
|
||||
for the library algorithms in the progs directory that may help you
|
||||
isolate it. These are not part of the normal build, but do have their
|
||||
own make productions. <P>
|
||||
|
||||
The most important of these is <CODE>mvcur</CODE>, a test frame for the
|
||||
cursor-movement optimization code. With this program, you can see
|
||||
directly what control sequences will be emitted for any given cursor
|
||||
movement or scroll/insert/delete operations. If you think you've got
|
||||
a bad capability identified, you can disable it and test again. The
|
||||
program is command-driven and has on-line help. <P>
|
||||
|
||||
If you think the vertical-scroll optimization is broken, or just want to
|
||||
understand how it works better, build <CODE>hashmap</CODE> and read the
|
||||
header comments of <CODE>hardscroll.c</CODE> and <CODE>hashmap.c</CODE>; then try
|
||||
it out. You can also test the hardware-scrolling optimization separately
|
||||
with <CODE>hardscroll</CODE>. <P>
|
||||
|
||||
There's one other interactive tester, <CODE>tctest</CODE>, that exercises
|
||||
translation between termcap and terminfo formats. If you have a serious
|
||||
need to run this, you probably belong on our development team! <P>
|
||||
|
||||
<H1><A NAME="ncurslib">A Tour of the Ncurses Library</A></H1>
|
||||
|
||||
<H2><A NAME="loverview">Library Overview</A></H2>
|
||||
|
||||
Most of the library is superstructure -- fairly trivial convenience
|
||||
interfaces to a small set of basic functions and data structures used
|
||||
to manipulate the virtual screen (in particular, none of this code
|
||||
does any I/O except through calls to more fundamental modules
|
||||
described below). The files
|
||||
<blockquote>
|
||||
<CODE>
|
||||
lib_addch.c
|
||||
lib_bkgd.c
|
||||
lib_box.c
|
||||
lib_chgat.c
|
||||
lib_clear.c
|
||||
lib_clearok.c
|
||||
lib_clrbot.c
|
||||
lib_clreol.c
|
||||
lib_colorset.c
|
||||
lib_data.c
|
||||
lib_delch.c
|
||||
lib_delwin.c
|
||||
lib_echo.c
|
||||
lib_erase.c
|
||||
lib_gen.c
|
||||
lib_getstr.c
|
||||
lib_hline.c
|
||||
lib_immedok.c
|
||||
lib_inchstr.c
|
||||
lib_insch.c
|
||||
lib_insdel.c
|
||||
lib_insstr.c
|
||||
lib_instr.c
|
||||
lib_isendwin.c
|
||||
lib_keyname.c
|
||||
lib_leaveok.c
|
||||
lib_move.c
|
||||
lib_mvwin.c
|
||||
lib_overlay.c
|
||||
lib_pad.c
|
||||
lib_printw.c
|
||||
lib_redrawln.c
|
||||
lib_scanw.c
|
||||
lib_screen.c
|
||||
lib_scroll.c
|
||||
lib_scrollok.c
|
||||
lib_scrreg.c
|
||||
lib_set_term.c
|
||||
lib_slk.c
|
||||
lib_slkatr_set.c
|
||||
lib_slkatrof.c
|
||||
lib_slkatron.c
|
||||
lib_slkatrset.c
|
||||
lib_slkattr.c
|
||||
lib_slkclear.c
|
||||
lib_slkcolor.c
|
||||
lib_slkinit.c
|
||||
lib_slklab.c
|
||||
lib_slkrefr.c
|
||||
lib_slkset.c
|
||||
lib_slktouch.c
|
||||
lib_touch.c
|
||||
lib_unctrl.c
|
||||
lib_vline.c
|
||||
lib_wattroff.c
|
||||
lib_wattron.c
|
||||
lib_window.c
|
||||
</CODE>
|
||||
</blockquote>
|
||||
are all in this category. They are very
|
||||
unlikely to need change, barring bugs or some fundamental
|
||||
reorganization in the underlying data structures. <P>
|
||||
|
||||
These files are used only for debugging support:
|
||||
<blockquote><code>
|
||||
lib_trace.c
|
||||
lib_traceatr.c
|
||||
lib_tracebits.c
|
||||
lib_tracechr.c
|
||||
lib_tracedmp.c
|
||||
lib_tracemse.c
|
||||
trace_buf.c
|
||||
</blockquote></code>
|
||||
It is rather unlikely you will ever need to change these, unless
|
||||
you want to introduce a new debug trace level for some reasoon.<P>
|
||||
|
||||
There is another group of files that do direct I/O via <EM>tputs()</EM>,
|
||||
computations on the terminal capabilities, or queries to the OS
|
||||
environment, but nevertheless have only fairly low complexity. These
|
||||
include:
|
||||
<blockquote><code>
|
||||
lib_acs.c
|
||||
lib_beep.c
|
||||
lib_color.c
|
||||
lib_endwin.c
|
||||
lib_initscr.c
|
||||
lib_longname.c
|
||||
lib_newterm.c
|
||||
lib_options.c
|
||||
lib_termcap.c
|
||||
lib_ti.c
|
||||
lib_tparm.c
|
||||
lib_tputs.c
|
||||
lib_vidattr.c
|
||||
read_entry.c.
|
||||
</blockquote></code>
|
||||
They are likely to need revision only if
|
||||
ncurses is being ported to an environment without an underlying
|
||||
terminfo capability representation. <P>
|
||||
|
||||
These files
|
||||
have serious hooks into
|
||||
the tty driver and signal facilities:
|
||||
<blockquote><code>
|
||||
lib_kernel.c
|
||||
lib_baudrate.c
|
||||
lib_raw.c
|
||||
lib_tstp.c
|
||||
lib_twait.c
|
||||
</blockquote></code>
|
||||
If you run into porting snafus
|
||||
moving the package to another UNIX, the problem is likely to be in one
|
||||
of these files.
|
||||
The file <CODE>lib_print.c</CODE> uses sleep(2) and also
|
||||
falls in this category.<P>
|
||||
|
||||
Almost all of the real work is done in the files
|
||||
<blockquote><code>
|
||||
hardscroll.c
|
||||
hashmap.c
|
||||
lib_addch.c
|
||||
lib_doupdate.c
|
||||
lib_getch.c
|
||||
lib_mouse.c
|
||||
lib_mvcur.c
|
||||
lib_refresh.c
|
||||
lib_setup.c
|
||||
lib_vidattr.c
|
||||
</blockquote></code>
|
||||
Most of the algorithmic complexity in the
|
||||
library lives in these files.
|
||||
If there is a real bug in <STRONG>ncurses</STRONG> itself, it's probably here.
|
||||
We'll tour some of these files in detail
|
||||
below (see <A HREF="#engine">The Engine Room</A>). <P>
|
||||
|
||||
Finally, there is a group of files that is actually most of the
|
||||
terminfo compiler. The reason this code lives in the <STRONG>ncurses</STRONG>
|
||||
library is to support fallback to /etc/termcap. These files include
|
||||
<blockquote><code>
|
||||
alloc_entry.c
|
||||
captoinfo.c
|
||||
comp_captab.c
|
||||
comp_error.c
|
||||
comp_hash.c
|
||||
comp_parse.c
|
||||
comp_scan.c
|
||||
parse_entry.c
|
||||
read_termcap.c
|
||||
write_entry.c
|
||||
</blockquote></code>
|
||||
We'll discuss these in the compiler tour. <P>
|
||||
|
||||
<H2><A NAME="engine">The Engine Room</A></H2>
|
||||
|
||||
<H3><A NAME="input">Keyboard Input</A></H3>
|
||||
|
||||
All <CODE>ncurses</CODE> input funnels through the function
|
||||
<CODE>wgetch()</CODE>, defined in <CODE>lib_getch.c</CODE>. This function is
|
||||
tricky; it has to poll for keyboard and mouse events and do a running
|
||||
match of incoming input against the set of defined special keys. <P>
|
||||
|
||||
The central data structure in this module is a FIFO queue, used to
|
||||
match multiple-character input sequences against special-key
|
||||
capabilities; also to implement pushback via <CODE>ungetch()</CODE>. <P>
|
||||
|
||||
The <CODE>wgetch()</CODE> code distinguishes between function key
|
||||
sequences and the same sequences typed manually by doing a timed wait
|
||||
after each input character that could lead a function key sequence.
|
||||
If the entire sequence takes less than 1 second, it is assumed to have
|
||||
been generated by a function key press. <P>
|
||||
|
||||
Hackers bruised by previous encounters with variant <CODE>select(2)</CODE>
|
||||
calls may find the code in <CODE>lib_twait.c</CODE> interesting. It deals
|
||||
with the problem that some BSD selects don't return a reliable
|
||||
time-left value. The function <CODE>timed_wait()</CODE> effectively
|
||||
simulates a System V select. <P>
|
||||
|
||||
<H3><A NAME="mouse">Mouse Events</A></H3>
|
||||
|
||||
If the mouse interface is active, <CODE>wgetch()</CODE> polls for mouse
|
||||
events each call, before it goes to the keyboard for input. It is
|
||||
up to <CODE>lib_mouse.c</CODE> how the polling is accomplished; it may vary
|
||||
for different devices. <P>
|
||||
|
||||
Under xterm, however, mouse event notifications come in via the keyboard
|
||||
input stream. They are recognized by having the <STRONG>kmous</STRONG> capability
|
||||
as a prefix. This is kind of klugey, but trying to wire in recognition of
|
||||
a mouse key prefix without going through the function-key machinery would
|
||||
be just too painful, and this turns out to imply having the prefix somewhere
|
||||
in the function-key capabilities at terminal-type initialization. <P>
|
||||
|
||||
This kluge only works because <STRONG>kmous</STRONG> isn't actually used by any
|
||||
historic terminal type or curses implementation we know of. Best
|
||||
guess is it's a relic of some forgotten experiment in-house at Bell
|
||||
Labs that didn't leave any traces in the publicly-distributed System V
|
||||
terminfo files. If System V or XPG4 ever gets serious about using it
|
||||
again, this kluge may have to change. <P>
|
||||
|
||||
Here are some more details about mouse event handling: <P>
|
||||
|
||||
The <CODE>lib_mouse()</CODE>code is logically split into a lower level that
|
||||
accepts event reports in a device-dependent format and an upper level that
|
||||
parses mouse gestures and filters events. The mediating data structure is a
|
||||
circular queue of event structures. <P>
|
||||
|
||||
Functionally, the lower level's job is to pick up primitive events and
|
||||
put them on the circular queue. This can happen in one of two ways:
|
||||
either (a) <CODE>_nc_mouse_event()</CODE> detects a series of incoming
|
||||
mouse reports and queues them, or (b) code in <CODE>lib_getch.c</CODE> detects the
|
||||
<STRONG>kmous</STRONG> prefix in the keyboard input stream and calls _nc_mouse_inline
|
||||
to queue up a series of adjacent mouse reports. <P>
|
||||
|
||||
In either case, <CODE>_nc_mouse_parse()</CODE> should be called after the
|
||||
series is accepted to parse the digested mouse reports (low-level
|
||||
events) into a gesture (a high-level or composite event). <P>
|
||||
|
||||
<H3><A NAME="output">Output and Screen Updating</A></H3>
|
||||
|
||||
With the single exception of character echoes during a <CODE>wgetnstr()</CODE>
|
||||
call (which simulates cooked-mode line editing in an ncurses window),
|
||||
the library normally does all its output at refresh time. <P>
|
||||
|
||||
The main job is to go from the current state of the screen (as represented
|
||||
in the <CODE>curscr</CODE> window structure) to the desired new state (as
|
||||
represented in the <CODE>newscr</CODE> window structure), while doing as
|
||||
little I/O as possible. <P>
|
||||
|
||||
The brains of this operation are the modules <CODE>hashmap.c</CODE>,
|
||||
<CODE>hardscroll.c</CODE> and <CODE>lib_doupdate.c</CODE>; the latter two use
|
||||
<CODE>lib_mvcur.c</CODE>. Essentially, what happens looks like this: <P>
|
||||
|
||||
The <CODE>hashmap.c</CODE> module tries to detect vertical motion
|
||||
changes between the real and virtual screens. This information
|
||||
is represented by the oldindex members in the newscr structure.
|
||||
These are modified by vertical-motion and clear operations, and both are
|
||||
re-initialized after each update. To this change-journalling
|
||||
information, the hashmap code adds deductions made using a modified Heckel
|
||||
algorithm on hash values generated from the line contents. <P>
|
||||
|
||||
The <CODE>hardscroll.c</CODE> module computes an optimum set of scroll,
|
||||
insertion, and deletion operations to make the indices match. It calls
|
||||
<CODE>_nc_mvcur_scrolln()</CODE> in <CODE>lib_mvcur.c</CODE> to do those motions. <P>
|
||||
|
||||
Then <CODE>lib_doupdate.c</CODE> goes to work. Its job is to do line-by-line
|
||||
transformations of <CODE>curscr</CODE> lines to <CODE>newscr</CODE> lines. Its main
|
||||
tool is the routine <CODE>mvcur()</CODE> in <CODE>lib_mvcur.c</CODE>. This routine
|
||||
does cursor-movement optimization, attempting to get from given screen
|
||||
location A to given location B in the fewest output characters posible. <P>
|
||||
|
||||
If you want to work on screen optimizations, you should use the fact
|
||||
that (in the trace-enabled version of the library) enabling the
|
||||
<CODE>TRACE_TIMES</CODE> trace level causes a report to be emitted after
|
||||
each screen update giving the elapsed time and a count of characters
|
||||
emitted during the update. You can use this to tell when an update
|
||||
optimization improves efficiency. <P>
|
||||
|
||||
In the trace-enabled version of the library, it is also possible to disable
|
||||
and re-enable various optimizations at runtime by tweaking the variable
|
||||
<CODE>_nc_optimize_enable</CODE>. See the file <CODE>include/curses.h.in</CODE>
|
||||
for mask values, near the end. <P>
|
||||
|
||||
<H1><A NAME="fmnote">The Forms and Menu Libraries</A></H1>
|
||||
|
||||
The forms and menu libraries should work reliably in any environment you
|
||||
can port ncurses to. The only portability issue anywhere in them is what
|
||||
flavor of regular expressions the built-in form field type TYPE_REGEXP
|
||||
will recognize. <P>
|
||||
|
||||
The configuration code prefers the POSIX regex facility, modeled on
|
||||
System V's, but will settle for BSD regexps if the former isn't available. <P>
|
||||
|
||||
Historical note: the panels code was written primarily to assist in
|
||||
porting u386mon 2.0 (comp.sources.misc v14i001-4) to systems lacking
|
||||
panels support; u386mon 2.10 and beyond use it. This version has been
|
||||
slightly cleaned up for <CODE>ncurses</CODE>. <P>
|
||||
|
||||
<H1><A NAME="tic">A Tour of the Terminfo Compiler</A></H1>
|
||||
|
||||
The <STRONG>ncurses</STRONG> implementation of <STRONG>tic</STRONG> is rather complex
|
||||
internally; it has to do a trying combination of missions. This starts
|
||||
with the fact that, in addition to its normal duty of compiling
|
||||
terminfo sources into loadable terminfo binaries, it has to be able to
|
||||
handle termcap syntax and compile that too into terminfo entries. <P>
|
||||
|
||||
The implementation therefore starts with a table-driven, dual-mode
|
||||
lexical analyzer (in <CODE>comp_scan.c</CODE>). The lexer chooses its
|
||||
mode (termcap or terminfo) based on the first `,' or `:' it finds in
|
||||
each entry. The lexer does all the work of recognizing capability
|
||||
names and values; the grammar above it is trivial, just "parse entries
|
||||
till you run out of file". <P>
|
||||
|
||||
<H2><A NAME="nonuse">Translation of Non-<STRONG>use</STRONG> Capabilities</A></H2>
|
||||
|
||||
Translation of most things besides <STRONG>use</STRONG> capabilities is pretty
|
||||
straightforward. The lexical analyzer's tokenizer hands each capability
|
||||
name to a hash function, which drives a table lookup. The table entry
|
||||
yields an index which is used to look up the token type in another table,
|
||||
and controls interpretation of the value. <P>
|
||||
|
||||
One possibly interesting aspect of the implementation is the way the
|
||||
compiler tables are initialized. All the tables are generated by various
|
||||
awk/sed/sh scripts from a master table <CODE>include/Caps</CODE>; these
|
||||
scripts actually write C initializers which are linked to the compiler.
|
||||
Furthermore, the hash table is generated in the same way, so it doesn't
|
||||
have to be generated at compiler startup time (another benefit of this
|
||||
organization is that the hash table can be in shareable text space). <P>
|
||||
|
||||
Thus, adding a new capability is usually pretty trivial, just a matter
|
||||
of adding one line to the <CODE>include/Caps</CODE> file. We'll have more
|
||||
to say about this in the section on <A HREF="#translation">Source-Form
|
||||
Translation</A>. <P>
|
||||
|
||||
<H2><A NAME="uses">Use Capability Resolution</A></H2>
|
||||
|
||||
The background problem that makes <STRONG>tic</STRONG> tricky isn't the capability
|
||||
translation itself, it's the resolution of <STRONG>use</STRONG> capabilities. Older
|
||||
versions would not handle forward <STRONG>use</STRONG> references for this reason
|
||||
(that is, a using terminal always had to follow its use target in the
|
||||
source file). By doing this, they got away with a simple implementation
|
||||
tactic; compile everything as it blows by, then resolve uses from compiled
|
||||
entries. <P>
|
||||
|
||||
This won't do for <STRONG>ncurses</STRONG>. The problem is that that the whole
|
||||
compilation process has to be embeddable in the <STRONG>ncurses</STRONG> library
|
||||
so that it can be called by the startup code to translate termcap
|
||||
entries on the fly. The embedded version can't go promiscuously writing
|
||||
everything it translates out to disk -- for one thing, it will typically
|
||||
be running with non-root permissions. <P>
|
||||
|
||||
So our <STRONG>tic</STRONG> is designed to parse an entire terminfo file into a
|
||||
doubly-linked circular list of entry structures in-core, and then do
|
||||
<STRONG>use</STRONG> resolution in-memory before writing everything out. This
|
||||
design has other advantages: it makes forward and back use-references
|
||||
equally easy (so we get the latter for free), and it makes checking for
|
||||
name collisions before they're written out easy to do. <P>
|
||||
|
||||
And this is exactly how the embedded version works. But the stand-alone
|
||||
user-accessible version of <STRONG>tic</STRONG> partly reverts to the historical
|
||||
strategy; it writes to disk (not keeping in core) any entry with no
|
||||
<STRONG>use</STRONG> references. <P>
|
||||
|
||||
This is strictly a core-economy kluge, implemented because the
|
||||
terminfo master file is large enough that some core-poor systems swap
|
||||
like crazy when you compile it all in memory...there have been reports of
|
||||
this process taking <STRONG>three hours</STRONG>, rather than the twenty seconds
|
||||
or less typical on the author's development box. <P>
|
||||
|
||||
So. The executable <STRONG>tic</STRONG> passes the entry-parser a hook that
|
||||
<EM>immediately</EM> writes out the referenced entry if it has no use
|
||||
capabilities. The compiler main loop refrains from adding the entry
|
||||
to the in-core list when this hook fires. If some other entry later
|
||||
needs to reference an entry that got written immediately, that's OK;
|
||||
the resolution code will fetch it off disk when it can't find it in
|
||||
core. <P>
|
||||
|
||||
Name collisions will still be detected, just not as cleanly. The
|
||||
<CODE>write_entry()</CODE> code complains before overwriting an entry that
|
||||
postdates the time of <STRONG>tic</STRONG>'s first call to
|
||||
<CODE>write_entry()</CODE>, Thus it will complain about overwriting
|
||||
entries newly made during the <STRONG>tic</STRONG> run, but not about
|
||||
overwriting ones that predate it. <P>
|
||||
|
||||
<H2><A NAME="translation">Source-Form Translation</A></H2>
|
||||
|
||||
Another use of <STRONG>tic</STRONG> is to do source translation between various termcap
|
||||
and terminfo formats. There are more variants out there than you might
|
||||
think; the ones we know about are described in the <STRONG>captoinfo(1)</STRONG>
|
||||
manual page. <P>
|
||||
|
||||
The translation output code (<CODE>dump_entry()</CODE> in
|
||||
<CODE>ncurses/dump_entry.c</CODE>) is shared with the <STRONG>infocmp(1)</STRONG>
|
||||
utility. It takes the same internal representation used to generate
|
||||
the binary form and dumps it to standard output in a specified
|
||||
format. <P>
|
||||
|
||||
The <CODE>include/Caps</CODE> file has a header comment describing ways you
|
||||
can specify source translations for nonstandard capabilities just by
|
||||
altering the master table. It's possible to set up capability aliasing
|
||||
or tell the compiler to plain ignore a given capability without writing
|
||||
any C code at all. <P>
|
||||
|
||||
For circumstances where you need to do algorithmic translation, there
|
||||
are functions in <CODE>parse_entry.c</CODE> called after the parse of each
|
||||
entry that are specifically intended to encapsulate such
|
||||
translations. This, for example, is where the AIX <STRONG>box1</STRONG> capability
|
||||
get translated to an <STRONG>acsc</STRONG> string.<P>
|
||||
|
||||
<H1><A NAME="utils">Other Utilities</A></H1>
|
||||
|
||||
The <STRONG>infocmp</STRONG> utility is just a wrapper around the same
|
||||
entry-dumping code used by <STRONG>tic</STRONG> for source translation. Perhaps
|
||||
the one interesting aspect of the code is the use of a predicate
|
||||
function passed in to <CODE>dump_entry()</CODE> to control which
|
||||
capabilities are dumped. This is necessary in order to handle both
|
||||
the ordinary De-compilation case and entry difference reporting. <P>
|
||||
|
||||
The <STRONG>tput</STRONG> and <STRONG>clear</STRONG> utilities just do an entry load
|
||||
followed by a <CODE>tputs()</CODE> of a selected capability. <P>
|
||||
|
||||
<H1><A NAME="style">Style Tips for Developers</A></H1>
|
||||
|
||||
See the TO-DO file in the top-level directory of the source distribution
|
||||
for additions that would be particularly useful. <P>
|
||||
|
||||
The prefix <CODE>_nc_</CODE> should be used on library public functions that are
|
||||
not part of the curses API in order to prevent pollution of the
|
||||
application namespace.
|
||||
|
||||
If you have to add to or modify the function prototypes in curses.h.in,
|
||||
read ncurses/MKlib_gen.sh first so you can avoid breaking XSI conformance.
|
||||
|
||||
Please join the ncurses mailing list. See the INSTALL file in the
|
||||
top level of the distribution for details on the list. <P>
|
||||
|
||||
Look for the string <CODE>FIXME</CODE> in source files to tag minor bugs
|
||||
and potential problems that could use fixing. <P>
|
||||
|
||||
Don't try to auto-detect OS features in the main body of the C code.
|
||||
That's the job of the configuration system. <P>
|
||||
|
||||
To hold down complexity, do make your code data-driven. Especially,
|
||||
if you can drive logic from a table filtered out of
|
||||
<CODE>include/Caps</CODE>, do it. If you find you need to augment the
|
||||
data in that file in order to generate the proper table, that's still
|
||||
preferable to ad-hoc code -- that's why the fifth field (flags) is
|
||||
there. <P>
|
||||
|
||||
Have fun! <P>
|
||||
|
||||
<H1><A NAME="port">Porting Hints</A></H1>
|
||||
|
||||
The following notes are intended to be a first step towards DOS and Macintosh
|
||||
ports of the ncurses libraries. <P>
|
||||
|
||||
The following library modules are `pure curses'; they operate only on
|
||||
the curses internal structures, do all output through other curses
|
||||
calls (not including <CODE>tputs()</CODE> and <CODE>putp()</CODE>) and do not
|
||||
call any other UNIX routines such as signal(2) or the stdio library.
|
||||
Thus, they should not need to be modified for single-terminal
|
||||
ports. <P>
|
||||
|
||||
<blockquote><code>
|
||||
lib_addch.c
|
||||
lib_addstr.c
|
||||
lib_bkgd.c
|
||||
lib_box.c
|
||||
lib_clear.c
|
||||
lib_clrbot.c
|
||||
lib_clreol.c
|
||||
lib_delch.c
|
||||
lib_delwin.c
|
||||
lib_erase.c
|
||||
lib_inchstr.c
|
||||
lib_insch.c
|
||||
lib_insdel.c
|
||||
lib_insstr.c
|
||||
lib_keyname.c
|
||||
lib_move.c
|
||||
lib_mvwin.c
|
||||
lib_newwin.c
|
||||
lib_overlay.c
|
||||
lib_pad.c
|
||||
lib_printw.c
|
||||
lib_refresh.c
|
||||
lib_scanw.c
|
||||
lib_scroll.c
|
||||
lib_scrreg.c
|
||||
lib_set_term.c
|
||||
lib_touch.c
|
||||
lib_tparm.c
|
||||
lib_tputs.c
|
||||
lib_unctrl.c
|
||||
lib_window.c
|
||||
panel.c
|
||||
</blockquote></code>
|
||||
<P>
|
||||
|
||||
This module is pure curses, but calls outstr(): <P>
|
||||
|
||||
<blockquote><code>
|
||||
lib_getstr.c
|
||||
</blockquote></code>
|
||||
<P>
|
||||
|
||||
These modules are pure curses, except that they use <CODE>tputs()</CODE>
|
||||
and <CODE>putp()</CODE>: <P>
|
||||
|
||||
<blockquote><code>
|
||||
lib_beep.c
|
||||
lib_color.c
|
||||
lib_endwin.c
|
||||
lib_options.c
|
||||
lib_slk.c
|
||||
lib_vidattr.c
|
||||
</blockquote></code>
|
||||
<P>
|
||||
|
||||
This modules assist in POSIX emulation on non-POSIX systems: <P>
|
||||
<DL>
|
||||
<DT> sigaction.c
|
||||
<DD> signal calls
|
||||
</DL>
|
||||
|
||||
The following source files will not be needed for a
|
||||
single-terminal-type port. <P>
|
||||
|
||||
<blockquote><code>
|
||||
alloc_entry.c
|
||||
captoinfo.c
|
||||
clear.c
|
||||
comp_captab.c
|
||||
comp_error.c
|
||||
comp_hash.c
|
||||
comp_main.c
|
||||
comp_parse.c
|
||||
comp_scan.c
|
||||
dump_entry.c
|
||||
infocmp.c
|
||||
parse_entry.c
|
||||
read_entry.c
|
||||
tput.c
|
||||
write_entry.c
|
||||
</blockquote></code>
|
||||
<P>
|
||||
|
||||
The following modules will use open()/read()/write()/close()/lseek() on files,
|
||||
but no other OS calls. <P>
|
||||
|
||||
<DL>
|
||||
<DT>lib_screen.c
|
||||
<DD>used to read/write screen dumps
|
||||
<DT>lib_trace.c
|
||||
<DD>used to write trace data to the logfile
|
||||
</DL>
|
||||
|
||||
Modules that would have to be modified for a port start here: <P>
|
||||
|
||||
The following modules are `pure curses' but contain assumptions inappropriate
|
||||
for a memory-mapped port. <P>
|
||||
|
||||
<dl>
|
||||
<dt>lib_longname.c<dd>assumes there may be multiple terminals
|
||||
<dt>lib_acs.c<dd>assumes acs_map as a double indirection
|
||||
<dt>lib_mvcur.c<dd>assumes cursor moves have variable cost
|
||||
<dt>lib_termcap.c<dd>assumes there may be multiple terminals
|
||||
<dt>lib_ti.c<dd>assumes there may be multiple terminals
|
||||
</dl>
|
||||
|
||||
The following modules use UNIX-specific calls:
|
||||
|
||||
<dl>
|
||||
<dt>lib_doupdate.c<dd>input checking
|
||||
<dt>lib_getch.c<dd>read()
|
||||
<dt>lib_initscr.c<dd>getenv()
|
||||
<dt>lib_newterm.c
|
||||
<dt>lib_baudrate.c
|
||||
<dt>lib_kernel.c<dd>various tty-manipulation and system calls
|
||||
<dt>lib_raw.c<dd>various tty-manipulation calls
|
||||
<dt>lib_setup.c<dd>various tty-manipulation calls
|
||||
<dt>lib_restart.c<dd>various tty-manipulation calls
|
||||
<dt>lib_tstp.c<dd>signal-manipulation calls
|
||||
<dt>lib_twait.c<dd>gettimeofday(), select().
|
||||
</dl>
|
||||
|
||||
<HR>
|
||||
<ADDRESS>Eric S. Raymond <esr@snark.thyrsus.com></ADDRESS>
|
||||
(Note: This is <EM>not</EM> the <A HREF="#bugtrack">bug address</A>!)
|
||||
</BODY>
|
||||
</HTML>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,170 +0,0 @@
|
||||
#!/bin/sh
|
||||
##############################################################################
|
||||
# Copyright (c) 1998,2000 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. #
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Thomas E. Dickey <dickey@clark.net> 1996
|
||||
#
|
||||
# $Id: run_tic.sh,v 1.12 2000/07/01 19:25:13 tom Exp $
|
||||
# This script is used to install terminfo.src using tic. We use a script
|
||||
# because the path checking is too awkward to do in a makefile.
|
||||
#
|
||||
# Parameters:
|
||||
# $1 = nominal directory in which to find 'tic', i.e., $(bindir).
|
||||
# $2 = source-directory, i.e., $(srcdir)
|
||||
# $3 = destination-directory path, i.e., $(ticdir)
|
||||
# $4 = install-prefix, if any
|
||||
#
|
||||
# Assumes:
|
||||
# The leaf directory names (bin, lib, shared, tabset, terminfo)
|
||||
#
|
||||
echo '** Building terminfo database, please wait...'
|
||||
#
|
||||
# Parameter parsing is primarily for debugging. The script is designed to
|
||||
# be run from the misc/Makefile as
|
||||
# make install.data
|
||||
prefix=/usr/local
|
||||
if test $# != 0 ; then
|
||||
bindir=$1
|
||||
shift
|
||||
PREFIX=`echo $bindir | sed -e 's/\/bin$//'`
|
||||
test -n "$PREFIX" && test "x$PREFIX" != "x$bindir" && prefix=$PREFIX
|
||||
else
|
||||
bindir=$prefix/bin
|
||||
fi
|
||||
|
||||
if test $# != 0 ; then
|
||||
srcdir=$1
|
||||
shift
|
||||
else
|
||||
srcdir=.
|
||||
fi
|
||||
|
||||
if test $# != 0 ; then
|
||||
ticdir=$1
|
||||
shift
|
||||
else
|
||||
ticdir=$prefix/share/terminfo
|
||||
fi
|
||||
|
||||
if test $# != 0 ; then
|
||||
IP=$1
|
||||
shift
|
||||
else
|
||||
IP=""
|
||||
fi
|
||||
|
||||
# Allow tic to run either from the install-path, or from the build-directory
|
||||
case "$PATH" in
|
||||
:*) PATH=../progs:$IP$bindir$PATH ;;
|
||||
*) PATH=../progs:$IP$bindir:$PATH ;;
|
||||
esac
|
||||
export PATH
|
||||
|
||||
#
|
||||
# set another env var that doesn't get reset when `shlib' runs, so `shlib' uses
|
||||
# the PATH we just set.
|
||||
#
|
||||
NEWPATH=$PATH
|
||||
export NEWPATH
|
||||
PROG_BIN_DIR=$IP$bindir
|
||||
export PROG_BIN_DIR
|
||||
|
||||
TERMINFO=$IP$ticdir ; export TERMINFO
|
||||
umask 022
|
||||
|
||||
# Construct the name of the old (obsolete) pathname, e.g., /usr/lib/terminfo.
|
||||
TICDIR=`echo $TERMINFO | sed -e 's/\/share\//\/lib\//'`
|
||||
|
||||
# Remove the old terminfo stuff; we don't care if it existed before, and it
|
||||
# would generate a lot of confusing error messages if we tried to overwrite it.
|
||||
# We explicitly remove its contents rather than the directory itself, in case
|
||||
# the directory is actually a symbolic link.
|
||||
( rm -fr $TERMINFO/[0-9A-Za-z] 2>/dev/null )
|
||||
|
||||
# If we're not installing into /usr/share/, we'll have to adjust the location
|
||||
# of the tabset files in terminfo.src (which are in a parallel directory).
|
||||
TABSET=`echo $ticdir | sed -e 's/\/terminfo$/\/tabset/'`
|
||||
SRC=$srcdir/terminfo.src
|
||||
if test "x$TABSET" != "x/usr/share/tabset" ; then
|
||||
echo '** adjusting tabset paths'
|
||||
TMP=${TMPDIR-/tmp}/$$
|
||||
sed -e s:/usr/share/tabset:$TABSET:g $SRC >$TMP
|
||||
trap "rm -f $TMP" 0 1 2 5 15
|
||||
SRC=$TMP
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
Running tic to install $TERMINFO ...
|
||||
|
||||
You may see messages regarding unknown capabilities, e.g., AX.
|
||||
These are extended terminal capabilities which can be compiled
|
||||
using
|
||||
tic -x
|
||||
Read the INSTALL document before doing this - it can cause
|
||||
problems for older ncurses applications.
|
||||
|
||||
EOF
|
||||
if ( $srcdir/shlib tic -s $SRC )
|
||||
then
|
||||
echo '** built new '$TERMINFO
|
||||
else
|
||||
echo '? tic could not build '$TERMINFO
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make a symbolic link to provide compatibility with applications that expect
|
||||
# to find terminfo under /usr/lib. That is, we'll _try_ to do that. Not
|
||||
# all systems support symbolic links, and those that do provide a variety
|
||||
# of options for 'test'.
|
||||
if test "$TICDIR" != "$TERMINFO" ; then
|
||||
( rm -f $TICDIR 2>/dev/null )
|
||||
if ( cd $TICDIR 2>/dev/null )
|
||||
then
|
||||
cd $TICDIR
|
||||
TICDIR=`pwd`
|
||||
if test $TICDIR != $TERMINFO ; then
|
||||
# Well, we tried. Some systems lie to us, so the
|
||||
# installer will have to double-check.
|
||||
echo "Verify if $TICDIR and $TERMINFO are the same."
|
||||
echo "The new terminfo is in $TERMINFO; the other should be a link to it."
|
||||
echo "Otherwise, remove $TICDIR and link it to $TERMINFO."
|
||||
fi
|
||||
else
|
||||
cd $IP$prefix
|
||||
# Construct a symbolic link that only assumes $ticdir has the
|
||||
# same $prefix as the other installed directories.
|
||||
RELATIVE=`echo $ticdir|sed -e 's:^'$prefix'/::'`
|
||||
if test "$RELATIVE" != "$ticdir" ; then
|
||||
RELATIVE=../`echo $ticdir|sed -e 's:^'$prefix'/::' -e 's:^/::'`
|
||||
fi
|
||||
if ( ln -s $RELATIVE $TICDIR )
|
||||
then
|
||||
echo '** linked '$TICDIR' for compatibility'
|
||||
fi
|
||||
fi
|
||||
fi
|
@ -1,4 +0,0 @@
|
||||
.*-.*-linux.* libform=4
|
||||
.*-.*-linux.* libmenu=4
|
||||
.*-.*-linux.* libncurses=4
|
||||
.*-.*-linux.* libpanel=4
|
Loading…
Reference in New Issue
Block a user