Annotation of 43BSDReno/share/doc/ps1/18.curses/intro.4, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1980 The Regents of the University of California.
                      2: .\" All rights reserved.
                      3: .\"
                      4: .\" Redistribution and use in source and binary forms are permitted
                      5: .\" provided that the above copyright notice and this paragraph are
                      6: .\" duplicated in all such forms and that any documentation,
                      7: .\" advertising materials, and other materials related to such
                      8: .\" distribution and use acknowledge that the software was developed
                      9: .\" by the University of California, Berkeley.  The name of the
                     10: .\" University may not be used to endorse or promote products derived
                     11: .\" from this software without specific prior written permission.
                     12: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     13: .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     14: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     15: .\"
                     16: .\"    @(#)intro.4     6.2 (Berkeley) 3/17/89
                     17: .\"
                     18: .sh 1 "Cursor Motion Optimization: Standing Alone"
                     19: .pp
                     20: It is possible to use the cursor optimization functions of this screen package
                     21: without the overhead and additional size of the screen updating functions.
                     22: The screen updating functions are designed for uses
                     23: where parts of the screen are changed,
                     24: but the overall image remains the same.
                     25: This includes such programs as
                     26: .b rogue
                     27: and
                     28: .b vi \**.
                     29: .(f
                     30: \**
                     31: .b rogue
                     32: actually uses these functions,
                     33: .b vi
                     34: does not.
                     35: .)f
                     36: Certain other programs
                     37: will find it difficult to use these functions in this manner
                     38: without considerable unnecessary program overhead.
                     39: For such applications,
                     40: such as some
                     41: .q "\fIcrt hacks\fR\|" \**
                     42: .(f
                     43: \**
                     44: Graphics programs designed to run on character-oriented terminals.
                     45: I could name many,
                     46: but they come and go,
                     47: so the list would be quickly out of date.
                     48: Recently, there have been programs such as
                     49: .b rain ,
                     50: .b rocket ,
                     51: and
                     52: .b gun .
                     53: .)f
                     54: and optimizing
                     55: .b more (1)-type
                     56: programs,
                     57: all that is needed is the motion optimizations.
                     58: This, therefore, is a description
                     59: of what some of what goes on at the lower levels of this screen package.
                     60: The descriptions assume a certain amount of familiarity
                     61: with programming problems and some finer points of C.
                     62: None of it is terribly difficult,
                     63: but you should be forewarned.
                     64: .sh 2 "Terminal Information"
                     65: .pp
                     66: In order to use a terminal's
                     67: features to the best of a program's abilities,
                     68: it must first know what they are\**.
                     69: .(f
                     70: \**
                     71: If this comes as any surprise to you,
                     72: there's this tower in Paris they're thinking of junking
                     73: that I can let you have for a song.
                     74: .)f
                     75: The \*(tc \*(db describes these,
                     76: but a certain amount of decoding is necessary,
                     77: and there are, of course,
                     78: both efficient and inefficient ways of reading them in.
                     79: The algorithm that the uses is taken from
                     80: .b vi
                     81: and is hideously efficient.
                     82: It reads them
                     83: in a tight loop
                     84: into a set of variables
                     85: whose names are two uppercase letters with some mnemonic value.
                     86: For example,
                     87: .Vn HO
                     88: is a string which moves the cursor to the "home" position\**.
                     89: .(f
                     90: \**
                     91: These names are identical to those variables
                     92: used in the
                     93: .b termcap (5)
                     94: \*(db to describe each capability.
                     95: See Appendix A for a complete list of those read,
                     96: and the
                     97: .b termcap (5)
                     98: manual page
                     99: for a full description.
                    100: .)f
                    101: As there are two types of variables involving ttys,
                    102: there are two routines.
                    103: The first,
                    104: .Fn gettmode ,
                    105: sets some variables based upon the tty modes accessed by
                    106: .b gtty (2)
                    107: and
                    108: .b stty (2) .
                    109: The second,
                    110: .Fn setterm ,
                    111: a larger task by reading in the descriptions from the \*(tc \*(db.
                    112: This is the way these routines are used by
                    113: .Fn initscr :
                    114: .(b
                    115: .(l I
                    116: \*fif\fP (isatty(0)) {
                    117:        gettmode();
                    118:        \*fif\fP ((sp=getenv("TERM")) != NULL)
                    119:                setterm(sp);
                    120:        \*felse\fP
                    121:               setterm(Def\*_term);
                    122: }
                    123: \*felse\fP
                    124:        setterm(Def\*_term);
                    125: \*_puts(TI);
                    126: \*_puts(VS);
                    127: .)l
                    128: .)b
                    129: .pp
                    130: .Fn isatty
                    131: checks to see if file descriptor 0 is a terminal\**.
                    132: .(f
                    133: \**
                    134: .Fn isatty
                    135: is defined in the default C library function routines.
                    136: It does a
                    137: .b gtty (2)
                    138: on the descriptor and checks the return value.
                    139: .)f
                    140: If it is,
                    141: .Fn gettmode
                    142: sets the terminal description modes from a
                    143: .b gtty (2) .
                    144: .Fn getenv
                    145: is then called to get the name of the terminal,
                    146: and that value (if there is one) is passed to
                    147: .Fn setterm ,
                    148: which reads in the variables from \*(tc
                    149: associated with that terminal.
                    150: .Fn getenv "" (
                    151: returns a pointer to a string containing the name of the terminal,
                    152: which we save in the character pointer
                    153: .Vn sp .)
                    154: If
                    155: .Fn isatty
                    156: returns false,
                    157: the default terminal
                    158: .Vn Def\*_term
                    159: is used.
                    160: The
                    161: .Vn TI
                    162: and
                    163: .Vn VS
                    164: sequences initialize the terminal
                    165: .Fn \*_puts "" (
                    166: is a macro which uses
                    167: .Fn tputs
                    168: (see
                    169: .b termcap (3))
                    170: and 
                    171: .Fn \*_putchar ""
                    172: to put out a string).
                    173: .Fn endwin
                    174: undoes these things.
                    175: .sh 2 "Movement Optimizations, or, Getting Over Yonder"
                    176: .pp
                    177: Now that we have all this useful information,
                    178: it would be nice to do something with it\**.
                    179: .(f
                    180: \**
                    181: Actually,
                    182: it
                    183: .i can
                    184: be emotionally fulfilling just to get the information.
                    185: This is usually only true, however,
                    186: if you have the social life of a kumquat.
                    187: .)f
                    188: The most difficult thing to do properly is motion optimization.
                    189: When you consider how many different features various terminals have
                    190: (tabs, backtabs, non-destructive space, home sequences, absolute tabs, .....)
                    191: you can see that deciding how to get from here to there
                    192: can be a decidedly non-trivial task.
                    193: The editor
                    194: .b vi
                    195: uses many of these features,
                    196: and the routines it uses to do this take up many pages of code.
                    197: Fortunately, I was able to liberate them with the author's permission,
                    198: and use them here.
                    199: .pp
                    200: After using
                    201: .Fn gettmode
                    202: and
                    203: .Fn setterm
                    204: to get the terminal descriptions,
                    205: the function
                    206: .Fn mvcur
                    207: deals with this task.
                    208: It usage is simple:
                    209: you simply tell it where you are now and where you want to go.
                    210: For example
                    211: .(l
                    212: mvcur(0\*,0\*,LINES/2\*,COLS/2)
                    213: .)l
                    214: .lp
                    215: would move the cursor from the home position (0\*,0)
                    216: to the middle of the screen.
                    217: If you wish to force absolute addressing,
                    218: you can use the function
                    219: .Fn tgoto
                    220: from the
                    221: .b termlib (7)
                    222: routines,
                    223: or you can tell
                    224: .Fn mvcur
                    225: that you are impossibly far away,
                    226: like Cleveland.
                    227: For example,
                    228: to absolutely address the lower left hand corner of the screen
                    229: from anywhere
                    230: just claim that you are in the upper right hand corner:
                    231: .(l
                    232: mvcur(0\*,COLS\-1\*,LINES\-1\*,0)
                    233: .)l

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.