xref: /freebsd/contrib/ncurses/doc/hackguide.doc (revision 7a69bbfb278952228c9aa1eca241e65fcdef425e)
17a69bbfbSPeter Wemm
27a69bbfbSPeter Wemm                          A Hacker's Guide to NCURSES
37a69bbfbSPeter Wemm
47a69bbfbSPeter Wemm                                   Contents
57a69bbfbSPeter Wemm
67a69bbfbSPeter Wemm     * Abstract
77a69bbfbSPeter Wemm     * Objective of the Package
87a69bbfbSPeter Wemm          + Why System V Curses?
97a69bbfbSPeter Wemm          + How to Design Extensions
107a69bbfbSPeter Wemm     * Portability and Configuration
117a69bbfbSPeter Wemm     * Documentation Conventions
127a69bbfbSPeter Wemm     * How to Report Bugs
137a69bbfbSPeter Wemm     * A Tour of the Ncurses Library
147a69bbfbSPeter Wemm          + Library Overview
157a69bbfbSPeter Wemm          + The Engine Room
167a69bbfbSPeter Wemm          + Keyboard Input
177a69bbfbSPeter Wemm          + Mouse Events
187a69bbfbSPeter Wemm          + Output and Screen Updating
197a69bbfbSPeter Wemm     * The Forms and Menu Libraries
207a69bbfbSPeter Wemm     * A Tour of the Terminfo Compiler
217a69bbfbSPeter Wemm          + Translation of Non-use Capabilities
227a69bbfbSPeter Wemm          + Use Capability Resolution
237a69bbfbSPeter Wemm          + Source-Form Translation
247a69bbfbSPeter Wemm     * Other Utilities
257a69bbfbSPeter Wemm     * Style Tips for Developers
267a69bbfbSPeter Wemm     * Porting Hints
277a69bbfbSPeter Wemm
287a69bbfbSPeter Wemm                                   Abstract
297a69bbfbSPeter Wemm
307a69bbfbSPeter Wemm   This document is a hacker's tour of the ncurses library and utilities.
317a69bbfbSPeter Wemm   It discusses design philosophy, implementation methods, and the
327a69bbfbSPeter Wemm   conventions used for coding and documentation. It is recommended
337a69bbfbSPeter Wemm   reading for anyone who is interested in porting, extending or
347a69bbfbSPeter Wemm   improving the package.
357a69bbfbSPeter Wemm
367a69bbfbSPeter Wemm                           Objective of the Package
377a69bbfbSPeter Wemm
387a69bbfbSPeter Wemm   The objective of the ncurses package is to provide a free software API
397a69bbfbSPeter Wemm   for character-cell terminals and terminal emulators with the following
407a69bbfbSPeter Wemm   characteristics:
417a69bbfbSPeter Wemm     * Source-compatible with historical curses implementations
427a69bbfbSPeter Wemm       (including the original BSD curses and System V curses.
437a69bbfbSPeter Wemm     * Conformant with the XSI Curses standard issued as part of XPG4 by
447a69bbfbSPeter Wemm       X/Open.
457a69bbfbSPeter Wemm     * High-quality -- stable and reliable code, wide portability, good
467a69bbfbSPeter Wemm       packaging, superior documentation.
477a69bbfbSPeter Wemm     * Featureful -- should eliminate as much of the drudgery of C
487a69bbfbSPeter Wemm       interface programming as possible, freeing programmers to think at
497a69bbfbSPeter Wemm       a higher level of design.
507a69bbfbSPeter Wemm
517a69bbfbSPeter Wemm   These objectives are in priority order. So, for example, source
527a69bbfbSPeter Wemm   compatibility with older version must trump featurefulness -- we
537a69bbfbSPeter Wemm   cannot add features if it means breaking the portion of the API
547a69bbfbSPeter Wemm   corresponding to historical curses versions.
557a69bbfbSPeter Wemm
567a69bbfbSPeter WemmWhy System V Curses?
577a69bbfbSPeter Wemm
587a69bbfbSPeter Wemm   We used System V curses as a model, reverse-engineering their API, in
597a69bbfbSPeter Wemm   order to fulfill the first two objectives.
607a69bbfbSPeter Wemm
617a69bbfbSPeter Wemm   System V curses implementations can support BSD curses programs with
627a69bbfbSPeter Wemm   just a recompilation, so by capturing the System V API we also capture
637a69bbfbSPeter Wemm   BSD's.
647a69bbfbSPeter Wemm
657a69bbfbSPeter Wemm   More importantly for the future, the XSI Curses standard issued by
667a69bbfbSPeter Wemm   X/Open is explicitly and closely modeled on System V. So conformance
677a69bbfbSPeter Wemm   with System V took us most of the way to base-level XSI conformance.
687a69bbfbSPeter Wemm
697a69bbfbSPeter WemmHow to Design Extensions
707a69bbfbSPeter Wemm
717a69bbfbSPeter Wemm   The third objective (standards conformance) requires that it be easy
727a69bbfbSPeter Wemm   to condition source code using ncurses so that the absence of
737a69bbfbSPeter Wemm   nonstandard extensions does not break the code.
747a69bbfbSPeter Wemm
757a69bbfbSPeter Wemm   Accordingly, we have a policy of associating with each nonstandard
767a69bbfbSPeter Wemm   extension a feature macro, so that ncurses client code can use this
777a69bbfbSPeter Wemm   macro to condition in or out the code that requires the ncurses
787a69bbfbSPeter Wemm   extension.
797a69bbfbSPeter Wemm
807a69bbfbSPeter Wemm   For example, there is a macro NCURSES_MOUSE_VERSION which XSI Curses
817a69bbfbSPeter Wemm   does not define, but which is defined in the ncurses library header.
827a69bbfbSPeter Wemm   You can use this to condition the calls to the mouse API calls.
837a69bbfbSPeter Wemm
847a69bbfbSPeter Wemm                         Portability and Configuration
857a69bbfbSPeter Wemm
867a69bbfbSPeter Wemm   Code written for ncurses may assume an ANSI-standard C compiler and
877a69bbfbSPeter Wemm   POSIX-compatible OS interface. It may also assume the presence of a
887a69bbfbSPeter Wemm   System-V-compatible select(2) call.
897a69bbfbSPeter Wemm
907a69bbfbSPeter Wemm   We encourage (but do not require) developers to make the code friendly
917a69bbfbSPeter Wemm   to less-capable UNIX environments wherever possible.
927a69bbfbSPeter Wemm
937a69bbfbSPeter Wemm   We encourage developers to support OS-specific optimizations and
947a69bbfbSPeter Wemm   methods not available under POSIX/ANSI, provided only that:
957a69bbfbSPeter Wemm     * All such code is properly conditioned so the build process does
967a69bbfbSPeter Wemm       not attempt to compile it under a plain ANSI/POSIX environment.
977a69bbfbSPeter Wemm     * Adding such implementation methods does not introduce
987a69bbfbSPeter Wemm       incompatibilities in the ncurses API between platforms.
997a69bbfbSPeter Wemm
1007a69bbfbSPeter Wemm   We use GNU autoconf(1) as a tool to deal with portability issues. The
1017a69bbfbSPeter Wemm   right way to leverage an OS-specific feature is to modify the autoconf
1027a69bbfbSPeter Wemm   specification files (configure.in and aclocal.m4) to set up a new
1037a69bbfbSPeter Wemm   feature macro, which you then use to condition your code.
1047a69bbfbSPeter Wemm
1057a69bbfbSPeter Wemm                           Documentation Conventions
1067a69bbfbSPeter Wemm
1077a69bbfbSPeter Wemm   There are three kinds of documentation associated with this package.
1087a69bbfbSPeter Wemm   Each has a different preferred format:
1097a69bbfbSPeter Wemm     * Package-internal files (README, INSTALL, TO-DO etc.)
1107a69bbfbSPeter Wemm     * Manual pages.
1117a69bbfbSPeter Wemm     * Everything else (i.e., narrative documentation).
1127a69bbfbSPeter Wemm
1137a69bbfbSPeter Wemm   Our conventions are simple:
1147a69bbfbSPeter Wemm    1. Maintain package-internal files in plain text. The expected viewer
1157a69bbfbSPeter Wemm       for them more(1) or an editor window; there's no point in
1167a69bbfbSPeter Wemm       elaborate mark-up.
1177a69bbfbSPeter Wemm    2. Mark up manual pages in the man macros. These have to be viewable
1187a69bbfbSPeter Wemm       through traditional man(1) programs.
1197a69bbfbSPeter Wemm    3. Write everything else in HTML.
1207a69bbfbSPeter Wemm
1217a69bbfbSPeter Wemm   When in doubt, HTMLize a master and use lynx(1) to generate plain
1227a69bbfbSPeter Wemm   ASCII (as we do for the announcement document).
1237a69bbfbSPeter Wemm
1247a69bbfbSPeter Wemm   The reason for choosing HTML is that it's (a) well-adapted for on-line
1257a69bbfbSPeter Wemm   browsing through viewers that are everywhere; (b) more easily readable
1267a69bbfbSPeter Wemm   as plain text than most other mark-ups, if you don't have a viewer;
1277a69bbfbSPeter Wemm   and (c) carries enough information that you can generate a
1287a69bbfbSPeter Wemm   nice-looking printed version from it. Also, of course, it make
1297a69bbfbSPeter Wemm   exporting things like the announcement document to WWW pretty trivial.
1307a69bbfbSPeter Wemm
1317a69bbfbSPeter Wemm                              How to Report Bugs
1327a69bbfbSPeter Wemm
1337a69bbfbSPeter Wemm   The reporting address for bugs is bug-ncurses@gnu.org. This is a
1347a69bbfbSPeter Wemm   majordomo list; to join, write to bug-ncurses-request@gnu.org with a
1357a69bbfbSPeter Wemm   message containing the line:
1367a69bbfbSPeter Wemm             subscribe <name>@<host.domain>
1377a69bbfbSPeter Wemm
1387a69bbfbSPeter Wemm   The ncurses code is maintained by a small group of volunteers. While
1397a69bbfbSPeter Wemm   we try our best to fix bugs promptly, we simply don't have a lot of
1407a69bbfbSPeter Wemm   hours to spend on elementary hand-holding. We rely on intelligent
1417a69bbfbSPeter Wemm   cooperation from our users. If you think you have found a bug in
1427a69bbfbSPeter Wemm   ncurses, there are some steps you can take before contacting us that
1437a69bbfbSPeter Wemm   will help get the bug fixed quickly.
1447a69bbfbSPeter Wemm
1457a69bbfbSPeter Wemm   In order to use our bug-fixing time efficiently, we put people who
1467a69bbfbSPeter Wemm   show us they've taken these steps at the head of our queue. This means
1477a69bbfbSPeter Wemm   that if you don't, you'll probably end up at the tail end and have to
1487a69bbfbSPeter Wemm   wait a while.
1497a69bbfbSPeter Wemm    1. Develop a recipe to reproduce the bug.
1507a69bbfbSPeter Wemm       Bugs we can reproduce are likely to be fixed very quickly, often
1517a69bbfbSPeter Wemm       within days. The most effective single thing you can do to get a
1527a69bbfbSPeter Wemm       quick fix is develop a way we can duplicate the bad behavior --
1537a69bbfbSPeter Wemm       ideally, by giving us source for a small, portable test program
1547a69bbfbSPeter Wemm       that breaks the library. (Even better is a keystroke recipe using
1557a69bbfbSPeter Wemm       one of the test programs provided with the distribution.)
1567a69bbfbSPeter Wemm    2. Try to reproduce the bug on a different terminal type.
1577a69bbfbSPeter Wemm       In our experience, most of the behaviors people report as library
1587a69bbfbSPeter Wemm       bugs are actually due to subtle problems in terminal descriptions.
1597a69bbfbSPeter Wemm       This is especially likely to be true if you're using a traditional
1607a69bbfbSPeter Wemm       asynchronous terminal or PC-based terminal emulator, rather than
1617a69bbfbSPeter Wemm       xterm or a UNIX console entry.
1627a69bbfbSPeter Wemm       It's therefore extremely helpful if you can tell us whether or not
1637a69bbfbSPeter Wemm       your problem reproduces on other terminal types. Usually you'll
1647a69bbfbSPeter Wemm       have both a console type and xterm available; please tell us
1657a69bbfbSPeter Wemm       whether or not your bug reproduces on both.
1667a69bbfbSPeter Wemm       If you have xterm available, it is also good to collect xterm
1677a69bbfbSPeter Wemm       reports for different window sizes. This is especially true if you
1687a69bbfbSPeter Wemm       normally use an unusual xterm window size -- a surprising number
1697a69bbfbSPeter Wemm       of the bugs we've seen are either triggered or masked by these.
1707a69bbfbSPeter Wemm    3. Generate and examine a trace file for the broken behavior.
1717a69bbfbSPeter Wemm       Recompile your program with the debugging versions of the
1727a69bbfbSPeter Wemm       libraries. Insert a trace() call with the argument set to
1737a69bbfbSPeter Wemm       TRACE_UPDATE. (See "Writing Programs with NCURSES" for details on
1747a69bbfbSPeter Wemm       trace levels.) Reproduce your bug, then look at the trace file to
1757a69bbfbSPeter Wemm       see what the library was actually doing.
1767a69bbfbSPeter Wemm       Another frequent cause of apparent bugs is application coding
1777a69bbfbSPeter Wemm       errors that cause the wrong things to be put on the virtual
1787a69bbfbSPeter Wemm       screen. Looking at the virtual-screen dumps in the trace file will
1797a69bbfbSPeter Wemm       tell you immediately if this is happening, and save you from the
1807a69bbfbSPeter Wemm       possible embarrassment of being told that the bug is in your code
1817a69bbfbSPeter Wemm       and is your problem rather than ours.
1827a69bbfbSPeter Wemm       If the virtual-screen dumps look correct but the bug persists,
1837a69bbfbSPeter Wemm       it's possible to crank up the trace level to give more and more
1847a69bbfbSPeter Wemm       information about the library's update actions and the control
1857a69bbfbSPeter Wemm       sequences it issues to perform them. The test directory of the
1867a69bbfbSPeter Wemm       distribution contains a tool for digesting these logs to make them
1877a69bbfbSPeter Wemm       less tedious to wade through.
1887a69bbfbSPeter Wemm       Often you'll find terminfo problems at this stage by noticing that
1897a69bbfbSPeter Wemm       the escape sequences put out for various capabilities are wrong.
1907a69bbfbSPeter Wemm       If not, you're likely to learn enough to be able to characterize
1917a69bbfbSPeter Wemm       any bug in the screen-update logic quite exactly.
1927a69bbfbSPeter Wemm    4. Report details and symptoms, not just interpretations.
1937a69bbfbSPeter Wemm       If you do the preceding two steps, it is very likely that you'll
1947a69bbfbSPeter Wemm       discover the nature of the problem yourself and be able to send us
1957a69bbfbSPeter Wemm       a fix. This will create happy feelings all around and earn you
1967a69bbfbSPeter Wemm       good karma for the first time you run into a bug you really can't
1977a69bbfbSPeter Wemm       characterize and fix yourself.
1987a69bbfbSPeter Wemm       If you're still stuck, at least you'll know what to tell us.
1997a69bbfbSPeter Wemm       Remember, we need details. If you guess about what is safe to
2007a69bbfbSPeter Wemm       leave out, you are too likely to be wrong.
2017a69bbfbSPeter Wemm       If your bug produces a bad update, include a trace file. Try to
2027a69bbfbSPeter Wemm       make the trace at the least voluminous level that pins down the
2037a69bbfbSPeter Wemm       bug. Logs that have been through tracemunch are OK, it doesn't
2047a69bbfbSPeter Wemm       throw away any information (actually they're better than
2057a69bbfbSPeter Wemm       un-munched ones because they're easier to read).
2067a69bbfbSPeter Wemm       If your bug produces a core-dump, please include a symbolic stack
2077a69bbfbSPeter Wemm       trace generated by gdb(1) or your local equivalent.
2087a69bbfbSPeter Wemm       Tell us about every terminal on which you've reproduced the bug --
2097a69bbfbSPeter Wemm       and every terminal on which you can't. Ideally, sent us terminfo
2107a69bbfbSPeter Wemm       sources for all of these (yours might differ from ours).
2117a69bbfbSPeter Wemm       Include your ncurses version and your OS/machine type, of course!
2127a69bbfbSPeter Wemm       You can find your ncurses version in the curses.h file.
2137a69bbfbSPeter Wemm
2147a69bbfbSPeter Wemm   If your problem smells like a logic error or in cursor movement or
2157a69bbfbSPeter Wemm   scrolling or a bad capability, there are a couple of tiny test frames
2167a69bbfbSPeter Wemm   for the library algorithms in the progs directory that may help you
2177a69bbfbSPeter Wemm   isolate it. These are not part of the normal build, but do have their
2187a69bbfbSPeter Wemm   own make productions.
2197a69bbfbSPeter Wemm
2207a69bbfbSPeter Wemm   The most important of these is mvcur, a test frame for the
2217a69bbfbSPeter Wemm   cursor-movement optimization code. With this program, you can see
2227a69bbfbSPeter Wemm   directly what control sequences will be emitted for any given cursor
2237a69bbfbSPeter Wemm   movement or scroll/insert/delete operations. If you think you've got a
2247a69bbfbSPeter Wemm   bad capability identified, you can disable it and test again. The
2257a69bbfbSPeter Wemm   program is command-driven and has on-line help.
2267a69bbfbSPeter Wemm
2277a69bbfbSPeter Wemm   If you think the vertical-scroll optimization is broken, or just want
2287a69bbfbSPeter Wemm   to understand how it works better, build hashmap and read the header
2297a69bbfbSPeter Wemm   comments of hardscroll.c and hashmap.c; then try it out. You can also
2307a69bbfbSPeter Wemm   test the hardware-scrolling optimization separately with hardscroll.
2317a69bbfbSPeter Wemm
2327a69bbfbSPeter Wemm   There's one other interactive tester, tctest, that exercises
2337a69bbfbSPeter Wemm   translation between termcap and terminfo formats. If you have a
2347a69bbfbSPeter Wemm   serious need to run this, you probably belong on our development team!
2357a69bbfbSPeter Wemm
2367a69bbfbSPeter Wemm                         A Tour of the Ncurses Library
2377a69bbfbSPeter Wemm
2387a69bbfbSPeter WemmLibrary Overview
2397a69bbfbSPeter Wemm
2407a69bbfbSPeter Wemm   Most of the library is superstructure -- fairly trivial convenience
2417a69bbfbSPeter Wemm   interfaces to a small set of basic functions and data structures used
2427a69bbfbSPeter Wemm   to manipulate the virtual screen (in particular, none of this code
2437a69bbfbSPeter Wemm   does any I/O except through calls to more fundamental modules
2447a69bbfbSPeter Wemm   described below). The files
2457a69bbfbSPeter Wemm
2467a69bbfbSPeter Wemm     lib_addch.c lib_bkgd.c lib_box.c lib_chgat.c lib_clear.c
2477a69bbfbSPeter Wemm     lib_clearok.c lib_clrbot.c lib_clreol.c lib_colorset.c lib_data.c
2487a69bbfbSPeter Wemm     lib_delch.c lib_delwin.c lib_echo.c lib_erase.c lib_gen.c
2497a69bbfbSPeter Wemm     lib_getstr.c lib_hline.c lib_immedok.c lib_inchstr.c lib_insch.c
2507a69bbfbSPeter Wemm     lib_insdel.c lib_insstr.c lib_instr.c lib_isendwin.c lib_keyname.c
2517a69bbfbSPeter Wemm     lib_leaveok.c lib_move.c lib_mvwin.c lib_overlay.c lib_pad.c
2527a69bbfbSPeter Wemm     lib_printw.c lib_redrawln.c lib_scanw.c lib_screen.c lib_scroll.c
2537a69bbfbSPeter Wemm     lib_scrollok.c lib_scrreg.c lib_set_term.c lib_slk.c
2547a69bbfbSPeter Wemm     lib_slkatr_set.c lib_slkatrof.c lib_slkatron.c lib_slkatrset.c
2557a69bbfbSPeter Wemm     lib_slkattr.c lib_slkclear.c lib_slkcolor.c lib_slkinit.c
2567a69bbfbSPeter Wemm     lib_slklab.c lib_slkrefr.c lib_slkset.c lib_slktouch.c lib_touch.c
2577a69bbfbSPeter Wemm     lib_unctrl.c lib_vline.c lib_wattroff.c lib_wattron.c lib_window.c
2587a69bbfbSPeter Wemm
2597a69bbfbSPeter Wemm   are all in this category. They are very unlikely to need change,
2607a69bbfbSPeter Wemm   barring bugs or some fundamental reorganization in the underlying data
2617a69bbfbSPeter Wemm   structures.
2627a69bbfbSPeter Wemm
2637a69bbfbSPeter Wemm   These files are used only for debugging support:
2647a69bbfbSPeter Wemm
2657a69bbfbSPeter Wemm     lib_trace.c lib_traceatr.c lib_tracebits.c lib_tracechr.c
2667a69bbfbSPeter Wemm     lib_tracedmp.c lib_tracemse.c trace_buf.c
2677a69bbfbSPeter Wemm
2687a69bbfbSPeter Wemm   It is rather unlikely you will ever need to change these, unless you
2697a69bbfbSPeter Wemm   want to introduce a new debug trace level for some reasoon.
2707a69bbfbSPeter Wemm
2717a69bbfbSPeter Wemm   There is another group of files that do direct I/O via tputs(),
2727a69bbfbSPeter Wemm   computations on the terminal capabilities, or queries to the OS
2737a69bbfbSPeter Wemm   environment, but nevertheless have only fairly low complexity. These
2747a69bbfbSPeter Wemm   include:
2757a69bbfbSPeter Wemm
2767a69bbfbSPeter Wemm     lib_acs.c lib_beep.c lib_color.c lib_endwin.c lib_initscr.c
2777a69bbfbSPeter Wemm     lib_longname.c lib_newterm.c lib_options.c lib_termcap.c lib_ti.c
2787a69bbfbSPeter Wemm     lib_tparm.c lib_tputs.c lib_vidattr.c read_entry.c.
2797a69bbfbSPeter Wemm
2807a69bbfbSPeter Wemm   They are likely to need revision only if ncurses is being ported to an
2817a69bbfbSPeter Wemm   environment without an underlying terminfo capability representation.
2827a69bbfbSPeter Wemm
2837a69bbfbSPeter Wemm   These files have serious hooks into the tty driver and signal
2847a69bbfbSPeter Wemm   facilities:
2857a69bbfbSPeter Wemm
2867a69bbfbSPeter Wemm     lib_kernel.c lib_baudrate.c lib_raw.c lib_tstp.c lib_twait.c
2877a69bbfbSPeter Wemm
2887a69bbfbSPeter Wemm   If you run into porting snafus moving the package to another UNIX, the
2897a69bbfbSPeter Wemm   problem is likely to be in one of these files. The file lib_print.c
2907a69bbfbSPeter Wemm   uses sleep(2) and also falls in this category.
2917a69bbfbSPeter Wemm
2927a69bbfbSPeter Wemm   Almost all of the real work is done in the files
2937a69bbfbSPeter Wemm
2947a69bbfbSPeter Wemm     hardscroll.c hashmap.c lib_addch.c lib_doupdate.c lib_getch.c
2957a69bbfbSPeter Wemm     lib_mouse.c lib_mvcur.c lib_refresh.c lib_setup.c lib_vidattr.c
2967a69bbfbSPeter Wemm
2977a69bbfbSPeter Wemm   Most of the algorithmic complexity in the library lives in these
2987a69bbfbSPeter Wemm   files. If there is a real bug in ncurses itself, it's probably here.
2997a69bbfbSPeter Wemm   We'll tour some of these files in detail below (see The Engine Room).
3007a69bbfbSPeter Wemm
3017a69bbfbSPeter Wemm   Finally, there is a group of files that is actually most of the
3027a69bbfbSPeter Wemm   terminfo compiler. The reason this code lives in the ncurses library
3037a69bbfbSPeter Wemm   is to support fallback to /etc/termcap. These files include
3047a69bbfbSPeter Wemm
3057a69bbfbSPeter Wemm     alloc_entry.c captoinfo.c comp_captab.c comp_error.c comp_hash.c
3067a69bbfbSPeter Wemm     comp_parse.c comp_scan.c parse_entry.c read_termcap.c write_entry.c
3077a69bbfbSPeter Wemm
3087a69bbfbSPeter Wemm   We'll discuss these in the compiler tour.
3097a69bbfbSPeter Wemm
3107a69bbfbSPeter WemmThe Engine Room
3117a69bbfbSPeter Wemm
3127a69bbfbSPeter Wemm  Keyboard Input
3137a69bbfbSPeter Wemm
3147a69bbfbSPeter Wemm   All ncurses input funnels through the function wgetch(), defined in
3157a69bbfbSPeter Wemm   lib_getch.c. This function is tricky; it has to poll for keyboard and
3167a69bbfbSPeter Wemm   mouse events and do a running match of incoming input against the set
3177a69bbfbSPeter Wemm   of defined special keys.
3187a69bbfbSPeter Wemm
3197a69bbfbSPeter Wemm   The central data structure in this module is a FIFO queue, used to
3207a69bbfbSPeter Wemm   match multiple-character input sequences against special-key
3217a69bbfbSPeter Wemm   capabilities; also to implement pushback via ungetch().
3227a69bbfbSPeter Wemm
3237a69bbfbSPeter Wemm   The wgetch() code distinguishes between function key sequences and the
3247a69bbfbSPeter Wemm   same sequences typed manually by doing a timed wait after each input
3257a69bbfbSPeter Wemm   character that could lead a function key sequence. If the entire
3267a69bbfbSPeter Wemm   sequence takes less than 1 second, it is assumed to have been
3277a69bbfbSPeter Wemm   generated by a function key press.
3287a69bbfbSPeter Wemm
3297a69bbfbSPeter Wemm   Hackers bruised by previous encounters with variant select(2) calls
3307a69bbfbSPeter Wemm   may find the code in lib_twait.c interesting. It deals with the
3317a69bbfbSPeter Wemm   problem that some BSD selects don't return a reliable time-left value.
3327a69bbfbSPeter Wemm   The function timed_wait() effectively simulates a System V select.
3337a69bbfbSPeter Wemm
3347a69bbfbSPeter Wemm  Mouse Events
3357a69bbfbSPeter Wemm
3367a69bbfbSPeter Wemm   If the mouse interface is active, wgetch() polls for mouse events each
3377a69bbfbSPeter Wemm   call, before it goes to the keyboard for input. It is up to
3387a69bbfbSPeter Wemm   lib_mouse.c how the polling is accomplished; it may vary for different
3397a69bbfbSPeter Wemm   devices.
3407a69bbfbSPeter Wemm
3417a69bbfbSPeter Wemm   Under xterm, however, mouse event notifications come in via the
3427a69bbfbSPeter Wemm   keyboard input stream. They are recognized by having the kmous
3437a69bbfbSPeter Wemm   capability as a prefix. This is kind of klugey, but trying to wire in
3447a69bbfbSPeter Wemm   recognition of a mouse key prefix without going through the
3457a69bbfbSPeter Wemm   function-key machinery would be just too painful, and this turns out
3467a69bbfbSPeter Wemm   to imply having the prefix somewhere in the function-key capabilities
3477a69bbfbSPeter Wemm   at terminal-type initialization.
3487a69bbfbSPeter Wemm
3497a69bbfbSPeter Wemm   This kluge only works because kmous isn't actually used by any
3507a69bbfbSPeter Wemm   historic terminal type or curses implementation we know of. Best guess
3517a69bbfbSPeter Wemm   is it's a relic of some forgotten experiment in-house at Bell Labs
3527a69bbfbSPeter Wemm   that didn't leave any traces in the publicly-distributed System V
3537a69bbfbSPeter Wemm   terminfo files. If System V or XPG4 ever gets serious about using it
3547a69bbfbSPeter Wemm   again, this kluge may have to change.
3557a69bbfbSPeter Wemm
3567a69bbfbSPeter Wemm   Here are some more details about mouse event handling:
3577a69bbfbSPeter Wemm
3587a69bbfbSPeter Wemm   The lib_mouse()code is logically split into a lower level that accepts
3597a69bbfbSPeter Wemm   event reports in a device-dependent format and an upper level that
3607a69bbfbSPeter Wemm   parses mouse gestures and filters events. The mediating data structure
3617a69bbfbSPeter Wemm   is a circular queue of event structures.
3627a69bbfbSPeter Wemm
3637a69bbfbSPeter Wemm   Functionally, the lower level's job is to pick up primitive events and
3647a69bbfbSPeter Wemm   put them on the circular queue. This can happen in one of two ways:
3657a69bbfbSPeter Wemm   either (a) _nc_mouse_event() detects a series of incoming mouse
3667a69bbfbSPeter Wemm   reports and queues them, or (b) code in lib_getch.c detects the kmous
3677a69bbfbSPeter Wemm   prefix in the keyboard input stream and calls _nc_mouse_inline to
3687a69bbfbSPeter Wemm   queue up a series of adjacent mouse reports.
3697a69bbfbSPeter Wemm
3707a69bbfbSPeter Wemm   In either case, _nc_mouse_parse() should be called after the series is
3717a69bbfbSPeter Wemm   accepted to parse the digested mouse reports (low-level events) into a
3727a69bbfbSPeter Wemm   gesture (a high-level or composite event).
3737a69bbfbSPeter Wemm
3747a69bbfbSPeter Wemm  Output and Screen Updating
3757a69bbfbSPeter Wemm
3767a69bbfbSPeter Wemm   With the single exception of character echoes during a wgetnstr() call
3777a69bbfbSPeter Wemm   (which simulates cooked-mode line editing in an ncurses window), the
3787a69bbfbSPeter Wemm   library normally does all its output at refresh time.
3797a69bbfbSPeter Wemm
3807a69bbfbSPeter Wemm   The main job is to go from the current state of the screen (as
3817a69bbfbSPeter Wemm   represented in the curscr window structure) to the desired new state
3827a69bbfbSPeter Wemm   (as represented in the newscr window structure), while doing as little
3837a69bbfbSPeter Wemm   I/O as possible.
3847a69bbfbSPeter Wemm
3857a69bbfbSPeter Wemm   The brains of this operation are the modules hashmap.c, hardscroll.c
3867a69bbfbSPeter Wemm   and lib_doupdate.c; the latter two use lib_mvcur.c. Essentially, what
3877a69bbfbSPeter Wemm   happens looks like this:
3887a69bbfbSPeter Wemm
3897a69bbfbSPeter Wemm   The hashmap.c module tries to detect vertical motion changes between
3907a69bbfbSPeter Wemm   the real and virtual screens. This information is represented by the
3917a69bbfbSPeter Wemm   oldindex members in the newscr structure. These are modified by
3927a69bbfbSPeter Wemm   vertical-motion and clear operations, and both are re-initialized
3937a69bbfbSPeter Wemm   after each update. To this change-journalling information, the hashmap
3947a69bbfbSPeter Wemm   code adds deductions made using a modified Heckel algorithm on hash
3957a69bbfbSPeter Wemm   values generated from the line contents.
3967a69bbfbSPeter Wemm
3977a69bbfbSPeter Wemm   The hardscroll.c module computes an optimum set of scroll, insertion,
3987a69bbfbSPeter Wemm   and deletion operations to make the indices match. It calls
3997a69bbfbSPeter Wemm   _nc_mvcur_scrolln() in lib_mvcur.c to do those motions.
4007a69bbfbSPeter Wemm
4017a69bbfbSPeter Wemm   Then lib_doupdate.c goes to work. Its job is to do line-by-line
4027a69bbfbSPeter Wemm   transformations of curscr lines to newscr lines. Its main tool is the
4037a69bbfbSPeter Wemm   routine mvcur() in lib_mvcur.c. This routine does cursor-movement
4047a69bbfbSPeter Wemm   optimization, attempting to get from given screen location A to given
4057a69bbfbSPeter Wemm   location B in the fewest output characters posible.
4067a69bbfbSPeter Wemm
4077a69bbfbSPeter Wemm   If you want to work on screen optimizations, you should use the fact
4087a69bbfbSPeter Wemm   that (in the trace-enabled version of the library) enabling the
4097a69bbfbSPeter Wemm   TRACE_TIMES trace level causes a report to be emitted after each
4107a69bbfbSPeter Wemm   screen update giving the elapsed time and a count of characters
4117a69bbfbSPeter Wemm   emitted during the update. You can use this to tell when an update
4127a69bbfbSPeter Wemm   optimization improves efficiency.
4137a69bbfbSPeter Wemm
4147a69bbfbSPeter Wemm   In the trace-enabled version of the library, it is also possible to
4157a69bbfbSPeter Wemm   disable and re-enable various optimizations at runtime by tweaking the
4167a69bbfbSPeter Wemm   variable _nc_optimize_enable. See the file include/curses.h.in for
4177a69bbfbSPeter Wemm   mask values, near the end.
4187a69bbfbSPeter Wemm
4197a69bbfbSPeter Wemm                         The Forms and Menu Libraries
4207a69bbfbSPeter Wemm
4217a69bbfbSPeter Wemm   The forms and menu libraries should work reliably in any environment
4227a69bbfbSPeter Wemm   you can port ncurses to. The only portability issue anywhere in them
4237a69bbfbSPeter Wemm   is what flavor of regular expressions the built-in form field type
4247a69bbfbSPeter Wemm   TYPE_REGEXP will recognize.
4257a69bbfbSPeter Wemm
4267a69bbfbSPeter Wemm   The configuration code prefers the POSIX regex facility, modeled on
4277a69bbfbSPeter Wemm   System V's, but will settle for BSD regexps if the former isn't
4287a69bbfbSPeter Wemm   available.
4297a69bbfbSPeter Wemm
4307a69bbfbSPeter Wemm   Historical note: the panels code was written primarily to assist in
4317a69bbfbSPeter Wemm   porting u386mon 2.0 (comp.sources.misc v14i001-4) to systems lacking
4327a69bbfbSPeter Wemm   panels support; u386mon 2.10 and beyond use it. This version has been
4337a69bbfbSPeter Wemm   slightly cleaned up for ncurses.
4347a69bbfbSPeter Wemm
4357a69bbfbSPeter Wemm                        A Tour of the Terminfo Compiler
4367a69bbfbSPeter Wemm
4377a69bbfbSPeter Wemm   The ncurses implementation of tic is rather complex internally; it has
4387a69bbfbSPeter Wemm   to do a trying combination of missions. This starts with the fact
4397a69bbfbSPeter Wemm   that, in addition to its normal duty of compiling terminfo sources
4407a69bbfbSPeter Wemm   into loadable terminfo binaries, it has to be able to handle termcap
4417a69bbfbSPeter Wemm   syntax and compile that too into terminfo entries.
4427a69bbfbSPeter Wemm
4437a69bbfbSPeter Wemm   The implementation therefore starts with a table-driven, dual-mode
4447a69bbfbSPeter Wemm   lexical analyzer (in comp_scan.c). The lexer chooses its mode (termcap
4457a69bbfbSPeter Wemm   or terminfo) based on the first `,' or `:' it finds in each entry. The
4467a69bbfbSPeter Wemm   lexer does all the work of recognizing capability names and values;
4477a69bbfbSPeter Wemm   the grammar above it is trivial, just "parse entries till you run out
4487a69bbfbSPeter Wemm   of file".
4497a69bbfbSPeter Wemm
4507a69bbfbSPeter WemmTranslation of Non-use Capabilities
4517a69bbfbSPeter Wemm
4527a69bbfbSPeter Wemm   Translation of most things besides use capabilities is pretty
4537a69bbfbSPeter Wemm   straightforward. The lexical analyzer's tokenizer hands each
4547a69bbfbSPeter Wemm   capability name to a hash function, which drives a table lookup. The
4557a69bbfbSPeter Wemm   table entry yields an index which is used to look up the token type in
4567a69bbfbSPeter Wemm   another table, and controls interpretation of the value.
4577a69bbfbSPeter Wemm
4587a69bbfbSPeter Wemm   One possibly interesting aspect of the implementation is the way the
4597a69bbfbSPeter Wemm   compiler tables are initialized. All the tables are generated by
4607a69bbfbSPeter Wemm   various awk/sed/sh scripts from a master table include/Caps; these
4617a69bbfbSPeter Wemm   scripts actually write C initializers which are linked to the
4627a69bbfbSPeter Wemm   compiler. Furthermore, the hash table is generated in the same way, so
4637a69bbfbSPeter Wemm   it doesn't have to be generated at compiler startup time (another
4647a69bbfbSPeter Wemm   benefit of this organization is that the hash table can be in
4657a69bbfbSPeter Wemm   shareable text space).
4667a69bbfbSPeter Wemm
4677a69bbfbSPeter Wemm   Thus, adding a new capability is usually pretty trivial, just a matter
4687a69bbfbSPeter Wemm   of adding one line to the include/Caps file. We'll have more to say
4697a69bbfbSPeter Wemm   about this in the section on Source-Form Translation.
4707a69bbfbSPeter Wemm
4717a69bbfbSPeter WemmUse Capability Resolution
4727a69bbfbSPeter Wemm
4737a69bbfbSPeter Wemm   The background problem that makes tic tricky isn't the capability
4747a69bbfbSPeter Wemm   translation itself, it's the resolution of use capabilities. Older
4757a69bbfbSPeter Wemm   versions would not handle forward use references for this reason (that
4767a69bbfbSPeter Wemm   is, a using terminal always had to follow its use target in the source
4777a69bbfbSPeter Wemm   file). By doing this, they got away with a simple implementation
4787a69bbfbSPeter Wemm   tactic; compile everything as it blows by, then resolve uses from
4797a69bbfbSPeter Wemm   compiled entries.
4807a69bbfbSPeter Wemm
4817a69bbfbSPeter Wemm   This won't do for ncurses. The problem is that that the whole
4827a69bbfbSPeter Wemm   compilation process has to be embeddable in the ncurses library so
4837a69bbfbSPeter Wemm   that it can be called by the startup code to translate termcap entries
4847a69bbfbSPeter Wemm   on the fly. The embedded version can't go promiscuously writing
4857a69bbfbSPeter Wemm   everything it translates out to disk -- for one thing, it will
4867a69bbfbSPeter Wemm   typically be running with non-root permissions.
4877a69bbfbSPeter Wemm
4887a69bbfbSPeter Wemm   So our tic is designed to parse an entire terminfo file into a
4897a69bbfbSPeter Wemm   doubly-linked circular list of entry structures in-core, and then do
4907a69bbfbSPeter Wemm   use resolution in-memory before writing everything out. This design
4917a69bbfbSPeter Wemm   has other advantages: it makes forward and back use-references equally
4927a69bbfbSPeter Wemm   easy (so we get the latter for free), and it makes checking for name
4937a69bbfbSPeter Wemm   collisions before they're written out easy to do.
4947a69bbfbSPeter Wemm
4957a69bbfbSPeter Wemm   And this is exactly how the embedded version works. But the
4967a69bbfbSPeter Wemm   stand-alone user-accessible version of tic partly reverts to the
4977a69bbfbSPeter Wemm   historical strategy; it writes to disk (not keeping in core) any entry
4987a69bbfbSPeter Wemm   with no use references.
4997a69bbfbSPeter Wemm
5007a69bbfbSPeter Wemm   This is strictly a core-economy kluge, implemented because the
5017a69bbfbSPeter Wemm   terminfo master file is large enough that some core-poor systems swap
5027a69bbfbSPeter Wemm   like crazy when you compile it all in memory...there have been reports
5037a69bbfbSPeter Wemm   of this process taking three hours, rather than the twenty seconds or
5047a69bbfbSPeter Wemm   less typical on the author's development box.
5057a69bbfbSPeter Wemm
5067a69bbfbSPeter Wemm   So. The executable tic passes the entry-parser a hook that immediately
5077a69bbfbSPeter Wemm   writes out the referenced entry if it has no use capabilities. The
5087a69bbfbSPeter Wemm   compiler main loop refrains from adding the entry to the in-core list
5097a69bbfbSPeter Wemm   when this hook fires. If some other entry later needs to reference an
5107a69bbfbSPeter Wemm   entry that got written immediately, that's OK; the resolution code
5117a69bbfbSPeter Wemm   will fetch it off disk when it can't find it in core.
5127a69bbfbSPeter Wemm
5137a69bbfbSPeter Wemm   Name collisions will still be detected, just not as cleanly. The
5147a69bbfbSPeter Wemm   write_entry() code complains before overwriting an entry that
5157a69bbfbSPeter Wemm   postdates the time of tic's first call to write_entry(), Thus it will
5167a69bbfbSPeter Wemm   complain about overwriting entries newly made during the tic run, but
5177a69bbfbSPeter Wemm   not about overwriting ones that predate it.
5187a69bbfbSPeter Wemm
5197a69bbfbSPeter WemmSource-Form Translation
5207a69bbfbSPeter Wemm
5217a69bbfbSPeter Wemm   Another use of tic is to do source translation between various termcap
5227a69bbfbSPeter Wemm   and terminfo formats. There are more variants out there than you might
5237a69bbfbSPeter Wemm   think; the ones we know about are described in the captoinfo(1) manual
5247a69bbfbSPeter Wemm   page.
5257a69bbfbSPeter Wemm
5267a69bbfbSPeter Wemm   The translation output code (dump_entry() in ncurses/dump_entry.c) is
5277a69bbfbSPeter Wemm   shared with the infocmp(1) utility. It takes the same internal
5287a69bbfbSPeter Wemm   representation used to generate the binary form and dumps it to
5297a69bbfbSPeter Wemm   standard output in a specified format.
5307a69bbfbSPeter Wemm
5317a69bbfbSPeter Wemm   The include/Caps file has a header comment describing ways you can
5327a69bbfbSPeter Wemm   specify source translations for nonstandard capabilities just by
5337a69bbfbSPeter Wemm   altering the master table. It's possible to set up capability aliasing
5347a69bbfbSPeter Wemm   or tell the compiler to plain ignore a given capability without
5357a69bbfbSPeter Wemm   writing any C code at all.
5367a69bbfbSPeter Wemm
5377a69bbfbSPeter Wemm   For circumstances where you need to do algorithmic translation, there
5387a69bbfbSPeter Wemm   are functions in parse_entry.c called after the parse of each entry
5397a69bbfbSPeter Wemm   that are specifically intended to encapsulate such translations. This,
5407a69bbfbSPeter Wemm   for example, is where the AIX box1 capability get translated to an
5417a69bbfbSPeter Wemm   acsc string.
5427a69bbfbSPeter Wemm
5437a69bbfbSPeter Wemm                                Other Utilities
5447a69bbfbSPeter Wemm
5457a69bbfbSPeter Wemm   The infocmp utility is just a wrapper around the same entry-dumping
5467a69bbfbSPeter Wemm   code used by tic for source translation. Perhaps the one interesting
5477a69bbfbSPeter Wemm   aspect of the code is the use of a predicate function passed in to
5487a69bbfbSPeter Wemm   dump_entry() to control which capabilities are dumped. This is
5497a69bbfbSPeter Wemm   necessary in order to handle both the ordinary De-compilation case and
5507a69bbfbSPeter Wemm   entry difference reporting.
5517a69bbfbSPeter Wemm
5527a69bbfbSPeter Wemm   The tput and clear utilities just do an entry load followed by a
5537a69bbfbSPeter Wemm   tputs() of a selected capability.
5547a69bbfbSPeter Wemm
5557a69bbfbSPeter Wemm                           Style Tips for Developers
5567a69bbfbSPeter Wemm
5577a69bbfbSPeter Wemm   See the TO-DO file in the top-level directory of the source
5587a69bbfbSPeter Wemm   distribution for additions that would be particularly useful.
5597a69bbfbSPeter Wemm
5607a69bbfbSPeter Wemm   The prefix _nc_ should be used on library public functions that are
5617a69bbfbSPeter Wemm   not part of the curses API in order to prevent pollution of the
5627a69bbfbSPeter Wemm   application namespace. If you have to add to or modify the function
5637a69bbfbSPeter Wemm   prototypes in curses.h.in, read ncurses/MKlib_gen.sh first so you can
5647a69bbfbSPeter Wemm   avoid breaking XSI conformance. Please join the ncurses mailing list.
5657a69bbfbSPeter Wemm   See the INSTALL file in the top level of the distribution for details
5667a69bbfbSPeter Wemm   on the list.
5677a69bbfbSPeter Wemm
5687a69bbfbSPeter Wemm   Look for the string FIXME in source files to tag minor bugs and
5697a69bbfbSPeter Wemm   potential problems that could use fixing.
5707a69bbfbSPeter Wemm
5717a69bbfbSPeter Wemm   Don't try to auto-detect OS features in the main body of the C code.
5727a69bbfbSPeter Wemm   That's the job of the configuration system.
5737a69bbfbSPeter Wemm
5747a69bbfbSPeter Wemm   To hold down complexity, do make your code data-driven. Especially, if
5757a69bbfbSPeter Wemm   you can drive logic from a table filtered out of include/Caps, do it.
5767a69bbfbSPeter Wemm   If you find you need to augment the data in that file in order to
5777a69bbfbSPeter Wemm   generate the proper table, that's still preferable to ad-hoc code --
5787a69bbfbSPeter Wemm   that's why the fifth field (flags) is there.
5797a69bbfbSPeter Wemm
5807a69bbfbSPeter Wemm   Have fun!
5817a69bbfbSPeter Wemm
5827a69bbfbSPeter Wemm                                 Porting Hints
5837a69bbfbSPeter Wemm
5847a69bbfbSPeter Wemm   The following notes are intended to be a first step towards DOS and
5857a69bbfbSPeter Wemm   Macintosh ports of the ncurses libraries.
5867a69bbfbSPeter Wemm
5877a69bbfbSPeter Wemm   The following library modules are `pure curses'; they operate only on
5887a69bbfbSPeter Wemm   the curses internal structures, do all output through other curses
5897a69bbfbSPeter Wemm   calls (not including tputs() and putp()) and do not call any other
5907a69bbfbSPeter Wemm   UNIX routines such as signal(2) or the stdio library. Thus, they
5917a69bbfbSPeter Wemm   should not need to be modified for single-terminal ports.
5927a69bbfbSPeter Wemm
5937a69bbfbSPeter Wemm     lib_addch.c lib_addstr.c lib_bkgd.c lib_box.c lib_clear.c
5947a69bbfbSPeter Wemm     lib_clrbot.c lib_clreol.c lib_delch.c lib_delwin.c lib_erase.c
5957a69bbfbSPeter Wemm     lib_inchstr.c lib_insch.c lib_insdel.c lib_insstr.c lib_keyname.c
5967a69bbfbSPeter Wemm     lib_move.c lib_mvwin.c lib_newwin.c lib_overlay.c lib_pad.c
5977a69bbfbSPeter Wemm     lib_printw.c lib_refresh.c lib_scanw.c lib_scroll.c lib_scrreg.c
5987a69bbfbSPeter Wemm     lib_set_term.c lib_touch.c lib_tparm.c lib_tputs.c lib_unctrl.c
5997a69bbfbSPeter Wemm     lib_window.c panel.c
6007a69bbfbSPeter Wemm
6017a69bbfbSPeter Wemm   This module is pure curses, but calls outstr():
6027a69bbfbSPeter Wemm
6037a69bbfbSPeter Wemm     lib_getstr.c
6047a69bbfbSPeter Wemm
6057a69bbfbSPeter Wemm   These modules are pure curses, except that they use tputs() and
6067a69bbfbSPeter Wemm   putp():
6077a69bbfbSPeter Wemm
6087a69bbfbSPeter Wemm     lib_beep.c lib_color.c lib_endwin.c lib_options.c lib_slk.c
6097a69bbfbSPeter Wemm     lib_vidattr.c
6107a69bbfbSPeter Wemm
6117a69bbfbSPeter Wemm   This modules assist in POSIX emulation on non-POSIX systems:
6127a69bbfbSPeter Wemm
6137a69bbfbSPeter Wemm   sigaction.c
6147a69bbfbSPeter Wemm          signal calls
6157a69bbfbSPeter Wemm
6167a69bbfbSPeter Wemm   The following source files will not be needed for a
6177a69bbfbSPeter Wemm   single-terminal-type port.
6187a69bbfbSPeter Wemm
6197a69bbfbSPeter Wemm     alloc_entry.c captoinfo.c clear.c comp_captab.c comp_error.c
6207a69bbfbSPeter Wemm     comp_hash.c comp_main.c comp_parse.c comp_scan.c dump_entry.c
6217a69bbfbSPeter Wemm     infocmp.c parse_entry.c read_entry.c tput.c write_entry.c
6227a69bbfbSPeter Wemm
6237a69bbfbSPeter Wemm   The following modules will use open()/read()/write()/close()/lseek()
6247a69bbfbSPeter Wemm   on files, but no other OS calls.
6257a69bbfbSPeter Wemm
6267a69bbfbSPeter Wemm   lib_screen.c
6277a69bbfbSPeter Wemm          used to read/write screen dumps
6287a69bbfbSPeter Wemm
6297a69bbfbSPeter Wemm   lib_trace.c
6307a69bbfbSPeter Wemm          used to write trace data to the logfile
6317a69bbfbSPeter Wemm
6327a69bbfbSPeter Wemm   Modules that would have to be modified for a port start here:
6337a69bbfbSPeter Wemm
6347a69bbfbSPeter Wemm   The following modules are `pure curses' but contain assumptions
6357a69bbfbSPeter Wemm   inappropriate for a memory-mapped port.
6367a69bbfbSPeter Wemm
6377a69bbfbSPeter Wemm   lib_longname.c
6387a69bbfbSPeter Wemm          assumes there may be multiple terminals
6397a69bbfbSPeter Wemm
6407a69bbfbSPeter Wemm   lib_acs.c
6417a69bbfbSPeter Wemm          assumes acs_map as a double indirection
6427a69bbfbSPeter Wemm
6437a69bbfbSPeter Wemm   lib_mvcur.c
6447a69bbfbSPeter Wemm          assumes cursor moves have variable cost
6457a69bbfbSPeter Wemm
6467a69bbfbSPeter Wemm   lib_termcap.c
6477a69bbfbSPeter Wemm          assumes there may be multiple terminals
6487a69bbfbSPeter Wemm
6497a69bbfbSPeter Wemm   lib_ti.c
6507a69bbfbSPeter Wemm          assumes there may be multiple terminals
6517a69bbfbSPeter Wemm
6527a69bbfbSPeter Wemm   The following modules use UNIX-specific calls:
6537a69bbfbSPeter Wemm
6547a69bbfbSPeter Wemm   lib_doupdate.c
6557a69bbfbSPeter Wemm          input checking
6567a69bbfbSPeter Wemm
6577a69bbfbSPeter Wemm   lib_getch.c
6587a69bbfbSPeter Wemm          read()
6597a69bbfbSPeter Wemm
6607a69bbfbSPeter Wemm   lib_initscr.c
6617a69bbfbSPeter Wemm          getenv()
6627a69bbfbSPeter Wemm
6637a69bbfbSPeter Wemm   lib_newterm.c
6647a69bbfbSPeter Wemm   lib_baudrate.c
6657a69bbfbSPeter Wemm   lib_kernel.c
6667a69bbfbSPeter Wemm          various tty-manipulation and system calls
6677a69bbfbSPeter Wemm
6687a69bbfbSPeter Wemm   lib_raw.c
6697a69bbfbSPeter Wemm          various tty-manipulation calls
6707a69bbfbSPeter Wemm
6717a69bbfbSPeter Wemm   lib_setup.c
6727a69bbfbSPeter Wemm          various tty-manipulation calls
6737a69bbfbSPeter Wemm
6747a69bbfbSPeter Wemm   lib_restart.c
6757a69bbfbSPeter Wemm          various tty-manipulation calls
6767a69bbfbSPeter Wemm
6777a69bbfbSPeter Wemm   lib_tstp.c
6787a69bbfbSPeter Wemm          signal-manipulation calls
6797a69bbfbSPeter Wemm
6807a69bbfbSPeter Wemm   lib_twait.c
6817a69bbfbSPeter Wemm          gettimeofday(), select().
6827a69bbfbSPeter Wemm     _________________________________________________________________
6837a69bbfbSPeter Wemm
6847a69bbfbSPeter Wemm
6857a69bbfbSPeter Wemm    Eric S. Raymond <esr@snark.thyrsus.com>
6867a69bbfbSPeter Wemm
6877a69bbfbSPeter Wemm   (Note: This is not the bug address!)
688