| 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. |
| |
| 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 reason. |
| |
| 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 possible. |
| |
| 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!) |