micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1 | .\"*************************************************************************** |
| 2 | .\" Copyright 2018-2023,2024 Thomas E. Dickey * |
| 3 | .\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * |
| 4 | .\" * |
| 5 | .\" Permission is hereby granted, free of charge, to any person obtaining a * |
| 6 | .\" copy of this software and associated documentation files (the * |
| 7 | .\" "Software"), to deal in the Software without restriction, including * |
| 8 | .\" without limitation the rights to use, copy, modify, merge, publish, * |
| 9 | .\" distribute, distribute with modifications, sublicense, and/or sell * |
| 10 | .\" copies of the Software, and to permit persons to whom the Software is * |
| 11 | .\" furnished to do so, subject to the following conditions: * |
| 12 | .\" * |
| 13 | .\" The above copyright notice and this permission notice shall be included * |
| 14 | .\" in all copies or substantial portions of the Software. * |
| 15 | .\" * |
| 16 | .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * |
| 17 | .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * |
| 18 | .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * |
| 19 | .\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * |
| 20 | .\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * |
| 21 | .\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * |
| 22 | .\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * |
| 23 | .\" * |
| 24 | .\" Except as contained in this notice, the name(s) of the above copyright * |
| 25 | .\" holders shall not be used in advertising or otherwise to promote the * |
| 26 | .\" sale, use or other dealings in this Software without prior written * |
| 27 | .\" authorization. * |
| 28 | .\"*************************************************************************** |
| 29 | .\" |
| 30 | .\" $Id: terminfo.tail,v 1.148 2024/04/20 21:24:19 tom Exp $ |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 31 | .ps +1 |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 32 | .SS "User-Defined Capabilities" |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 33 | . |
| 34 | The preceding section listed the \fIpredefined\fP capabilities. |
| 35 | They deal with some special features for terminals no longer |
| 36 | (or possibly never) produced. |
| 37 | Occasionally there are special features of newer terminals which |
| 38 | are awkward or impossible to represent by reusing the predefined |
| 39 | capabilities. |
| 40 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 41 | \fI\%ncurses\fP addresses this limitation by allowing user-defined |
| 42 | capabilities. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 43 | The \fB@TIC@\fP and \fB@INFOCMP@\fP programs provide |
| 44 | the \fB\-x\fP option for this purpose. |
| 45 | When \fB\-x\fP is set, |
| 46 | \fB@TIC@\fP treats unknown capabilities as user-defined. |
| 47 | That is, if \fB@TIC@\fP encounters a capability name |
| 48 | which it does not recognize, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 49 | it infers its type (Boolean, number or string) from the syntax |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 50 | and makes an extended table entry for that capability. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 51 | The \fBuse_extended_names\fP(3X) function makes this information |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 52 | conditionally available to applications. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 53 | The \fI\%ncurses\fP library provides the data leaving most of the |
| 54 | behavior to applications: |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 55 | .bP |
| 56 | User-defined capability strings whose name begins |
| 57 | with \*(``k\*('' are treated as function keys. |
| 58 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 59 | The types (Boolean, number, string) determined by \fB@TIC@\fP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 60 | can be inferred by successful calls on \fBtigetflag\fP, etc. |
| 61 | .bP |
| 62 | If the capability name happens to be two characters, |
| 63 | the capability is also available through the termcap interface. |
| 64 | .PP |
| 65 | While termcap is said to be extensible because it does not use a predefined set |
| 66 | of capabilities, |
| 67 | in practice it has been limited to the capabilities defined by |
| 68 | terminfo implementations. |
| 69 | As a rule, |
| 70 | user-defined capabilities intended for use by termcap applications should |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 71 | be limited to Booleans and numbers to avoid running past the 1023 byte |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 72 | limit assumed by termcap implementations and their applications. |
| 73 | In particular, providing extended sets of function keys (past the 60 |
| 74 | numbered keys and the handful of special named keys) is best done using |
| 75 | the longer names available using terminfo. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 76 | .PP |
| 77 | The \fI\%ncurses\fP library uses a few of these user-defined |
| 78 | capabilities, |
| 79 | as described in \fBuser_caps\fR(5). |
| 80 | Other user-defined capabilities (including function keys) are |
| 81 | described in the terminal database, in the section on |
| 82 | .I "NCURSES USER-DEFINABLE CAPABILITIES" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 83 | . |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 84 | .SS "A Sample Entry" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 85 | . |
| 86 | The following entry, describing an ANSI-standard terminal, is representative |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 87 | of what a \fBterminfo\fP entry for a modern terminal typically looks like. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 88 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 89 | .EX |
| 90 | \s-2ansi|ansi/pc\-term compatible with color, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 91 | am, mc5i, mir, msgr, |
| 92 | colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 93 | acsc=+\e020\e,\e021\-\e030.\*^Y0\e333\(ga\e004a\e261f\e370g\e361h\e260 |
| 94 | j\e331k\e277l\e332m\e300n\e305o\*~p\e304q\e304r\e304s_t\e303 |
| 95 | u\e264v\e301w\e302x\e263y\e363z\e362{\e343|\e330}\e234\*~\e376, |
| 96 | bel=\*^G, blink=\eE[5m, bold=\eE[1m, cbt=\eE[Z, clear=\eE[H\eE[J, |
| 97 | cr=\*^M, cub=\eE[%p1%dD, cub1=\eE[D, cud=\eE[%p1%dB, cud1=\eE[B, |
| 98 | cuf=\eE[%p1%dC, cuf1=\eE[C, cup=\eE[%i%p1%d;%p2%dH, |
| 99 | cuu=\eE[%p1%dA, cuu1=\eE[A, dch=\eE[%p1%dP, dch1=\eE[P, |
| 100 | dl=\eE[%p1%dM, dl1=\eE[M, ech=\eE[%p1%dX, ed=\eE[J, el=\eE[K, |
| 101 | el1=\eE[1K, home=\eE[H, hpa=\eE[%i%p1%dG, ht=\eE[I, hts=\eEH, |
| 102 | ich=\eE[%p1%d@, il=\eE[%p1%dL, il1=\eE[L, ind=\*^J, |
| 103 | indn=\eE[%p1%dS, invis=\eE[8m, kbs=\*^H, kcbt=\eE[Z, kcub1=\eE[D, |
| 104 | kcud1=\eE[B, kcuf1=\eE[C, kcuu1=\eE[A, khome=\eE[H, kich1=\eE[L, |
| 105 | mc4=\eE[4i, mc5=\eE[5i, nel=\er\eE[S, op=\eE[39;49m, |
| 106 | rep=%p1%c\eE[%p2%{1}%\-%db, rev=\eE[7m, rin=\eE[%p1%dT, |
| 107 | rmacs=\eE[10m, rmpch=\eE[10m, rmso=\eE[m, rmul=\eE[m, |
| 108 | s0ds=\eE(B, s1ds=\eE)B, s2ds=\eE*B, s3ds=\eE+B, |
| 109 | setab=\eE[4%p1%dm, setaf=\eE[3%p1%dm, |
| 110 | sgr=\eE[0;10%?%p1%t;7%; |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 111 | %?%p2%t;4%; |
| 112 | %?%p3%t;7%; |
| 113 | %?%p4%t;5%; |
| 114 | %?%p6%t;1%; |
| 115 | %?%p7%t;8%; |
| 116 | %?%p9%t;11%;m, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 117 | sgr0=\eE[0;10m, smacs=\eE[11m, smpch=\eE[11m, smso=\eE[7m, |
| 118 | smul=\eE[4m, tbc=\eE[3g, u6=\eE[%i%d;%dR, u7=\eE[6n, |
| 119 | u8=\eE[?%[;0123456789]c, u9=\eE[c, vpa=\eE[%i%p1%dd, |
| 120 | .EE |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 121 | .PP |
| 122 | Entries may continue onto multiple lines by placing white space at |
| 123 | the beginning of each line except the first. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 124 | Comments may be included on lines beginning with \*(``#\*(''. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 125 | Capabilities in |
| 126 | .I terminfo |
| 127 | are of three types: |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 128 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 129 | Boolean capabilities which indicate that the terminal has |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 130 | some particular feature, |
| 131 | .bP |
| 132 | numeric capabilities giving the size of the terminal |
| 133 | or the size of particular delays, and |
| 134 | .bP |
| 135 | string |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 136 | capabilities, which give a sequence which can be used to perform particular |
| 137 | terminal operations. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 138 | .SS "Types of Capabilities" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 139 | All capabilities have names. |
| 140 | For instance, the fact that |
| 141 | ANSI-standard terminals have |
| 142 | .I "automatic margins" |
| 143 | (i.e., an automatic return and line-feed |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 144 | when the end of a line is reached) is indicated by the capability \fBam\fP. |
| 145 | Hence the description of ansi includes \fBam\fP. |
| 146 | Numeric capabilities are followed by the character \*(``#\*('' |
| 147 | and then a positive value. |
| 148 | Thus \fBcols\fP, which indicates the number of columns the terminal has, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 149 | gives the value \*(``80\*('' for ansi. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 150 | Values for numeric capabilities may be specified in |
| 151 | decimal, |
| 152 | octal, or |
| 153 | hexadecimal, |
| 154 | using the C programming language conventions |
| 155 | (e.g., 255, 0377 and 0xff or 0xFF). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 156 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 157 | Finally, string valued capabilities, |
| 158 | such as \fBel\fP (clear to end of line sequence) |
| 159 | are given by the two-character code, |
| 160 | an \*(``=\*('', and then |
| 161 | a string ending at the next following \*(``,\*(''. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 162 | .PP |
| 163 | A number of escape sequences are provided in the string valued capabilities |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 164 | for easy encoding of characters there: |
| 165 | .bP |
| 166 | Both \fB\eE\fP and \fB\ee\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 167 | map to an \s-1ESCAPE\s0 character, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 168 | .bP |
| 169 | \fB\*^\f(BIx\fR maps to a control-\fIx\fP for any appropriate \fIx\fP, |
| 170 | and |
| 171 | .bP |
| 172 | the sequences |
| 173 | .RS 6 |
| 174 | .PP |
| 175 | \fB\en\fP, \fB\el\fP, \fB\er\fP, \fB\et\fP, \fB\eb\fP, \fB\ef\fP, and \fB\es\fP |
| 176 | .RE |
| 177 | .IP |
| 178 | produce |
| 179 | .RS 6 |
| 180 | .PP |
| 181 | \fInewline\fP, \fIline-feed\fP, \fIreturn\fP, \fItab\fP, \fIbackspace\fP, \fIform-feed\fP, and \fIspace\fP, |
| 182 | .RE |
| 183 | .IP |
| 184 | respectively. |
| 185 | .PP |
| 186 | X/Open Curses does not say what \*(``appropriate \fIx\fP\*('' might be. |
| 187 | In practice, that is a printable ASCII graphic character. |
| 188 | The special case \*(``\*^?\*('' is interpreted as DEL (127). |
| 189 | In all other cases, the character value is AND'd with 0x1f, |
| 190 | mapping to ASCII control codes in the range 0 through 31. |
| 191 | .PP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 192 | Other escapes include |
| 193 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 194 | \fB\e\*^\fP for \fB\*^\fP, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 195 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 196 | \fB\e\e\fP for \fB\e\fP, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 197 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 198 | \fB\e\fP, for comma, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 199 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 200 | \fB\e:\fP for \fB:\fP, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 201 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 202 | and \fB\e0\fP for null. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 203 | .IP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 204 | \fB\e0\fP will produce \e200, which does not terminate a string but behaves |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 205 | as a null character on most terminals, providing CS7 is specified. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 206 | See \fBstty\fP(1). |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 207 | .IP |
| 208 | The reason for this quirk is to maintain binary compatibility of the |
| 209 | compiled terminfo files with other implementations, |
| 210 | e.g., the SVr4 systems, which document this. |
| 211 | Compiled terminfo files use null-terminated strings, with no lengths. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 212 | Modifying this would require a new binary format, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 213 | which would not work with other implementations. |
| 214 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 215 | Finally, characters may be given as three octal digits after a \fB\e\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 216 | .PP |
| 217 | A delay in milliseconds may appear anywhere in a string capability, enclosed in |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 218 | $<..> brackets, as in \fBel\fP=\eEK$<5>, |
| 219 | and padding characters are supplied by \fBtputs\fP(3X) |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 220 | to provide this delay. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 221 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 222 | The delay must be a number with at most one decimal |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 223 | place of precision; |
| 224 | it may be followed by suffixes \*(``*\*('' or \*(``/\*('' or both. |
| 225 | .bP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 226 | A \*(``*\*('' |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 227 | indicates that the padding required is proportional to the number of lines |
| 228 | affected by the operation, and the amount given is the per-affected-unit |
| 229 | padding required. |
| 230 | (In the case of insert character, the factor is still the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 231 | number of \fIlines\fP affected.) |
| 232 | .IP |
| 233 | Normally, padding is advisory if the device has the \fBxon\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 234 | capability; it is used for cost computation but does not trigger delays. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 235 | .bP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 236 | A \*(``/\*('' |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 237 | suffix indicates that the padding is mandatory and forces a delay of the given |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 238 | number of milliseconds even on devices for which \fBxon\fP is present to |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 239 | indicate flow control. |
| 240 | .PP |
| 241 | Sometimes individual capabilities must be commented out. |
| 242 | To do this, put a period before the capability name. |
| 243 | For example, see the second |
| 244 | .B ind |
| 245 | in the example above. |
| 246 | .br |
| 247 | .ne 5 |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 248 | .SS "Fetching Compiled Descriptions" |
| 249 | Terminal descriptions in \fI\%ncurses\fP are stored in terminal |
| 250 | databases. |
| 251 | These databases, which are found by their pathname, |
| 252 | may be configured either as directory trees or hashed databases |
| 253 | (see \fBterm\fR(5)), |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 254 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 255 | The library uses a compiled-in list of pathnames, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 256 | which can be overridden by environment variables. |
| 257 | Before starting to search, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 258 | \fI\%ncurses\fP checks the search list, |
| 259 | eliminating duplicates and pathnames where no terminal database is found. |
| 260 | The \fI\%ncurses\fP library reads the first description |
| 261 | which passes its consistency checks. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 262 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 263 | The environment variable \fBTERMINFO\fR is checked first, for |
| 264 | a terminal database containing the terminal description. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 265 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 266 | Next, |
| 267 | \fI\%ncurses\fP looks in \fI$HOME/.terminfo\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 268 | for a compiled description. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 269 | .IP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 270 | This is an optional feature which may be omitted entirely from |
| 271 | the library, or limited to prevent accidental use by privileged applications. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 272 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 273 | Next, |
| 274 | if the environment variable \fI\%TERMINFO_DIRS\fP is set, |
| 275 | \fI\%ncurses\fP interprets the contents of that variable |
| 276 | as a list of colon-separated pathnames of terminal databases to be searched. |
| 277 | .IP |
| 278 | An empty pathname (i.e., if the variable begins or ends |
| 279 | with a colon, or contains adjacent colons) |
| 280 | is interpreted as the system location \fI\*d\fP. |
| 281 | .bP |
| 282 | Finally, \fI\%ncurses\fP searches these compiled-in locations: |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 283 | .RS |
| 284 | .bP |
| 285 | a list of directories (@TERMINFO_DIRS@), and |
| 286 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 287 | the system terminfo directory, \fI\*d\fP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 288 | .RE |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 289 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 290 | The \fBTERMINFO\fP variable can contain a terminal description instead |
| 291 | of the pathname of a terminal database. |
| 292 | If this variable begins with \*(``hex:\*('' or \*(``b64:\*('' |
| 293 | then \fI\%ncurses\fP reads a terminal description from |
| 294 | hexadecimal- or base64-encoded data, |
| 295 | and if that description matches the name sought, will use that. |
| 296 | This encoded data can be set using the \*(``\-Q\*('' option of |
| 297 | \fB@TIC@\fR or \fB@INFOCMP@\fR. |
| 298 | .PP |
| 299 | The preceding addresses the usual configuration of \fI\%ncurses\fP, |
| 300 | which uses terminal descriptions prepared in \fIterminfo\fP format. |
| 301 | While \fItermcap\fP is less expressive, |
| 302 | \fI\%ncurses\fP can also be configured to read \fItermcap\fP |
| 303 | descriptions. |
| 304 | In that configuration, |
| 305 | it checks the \fI\%TERMCAP\fP and \fI\%TERMPATH\fP variables |
| 306 | (for content and search path, |
| 307 | respectively) |
| 308 | after the system terminal database. |
| 309 | .SS "Preparing Descriptions" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 310 | We now outline how to prepare descriptions of terminals. |
| 311 | The most effective way to prepare a terminal description is by imitating |
| 312 | the description of a similar terminal in |
| 313 | .I terminfo |
| 314 | and to build up a description gradually, using partial descriptions |
| 315 | with |
| 316 | .I vi |
| 317 | or some other screen-oriented program to check that they are correct. |
| 318 | Be aware that a very unusual terminal may expose deficiencies in |
| 319 | the ability of the |
| 320 | .I terminfo |
| 321 | file to describe it |
| 322 | or bugs in the screen-handling code of the test program. |
| 323 | .PP |
| 324 | To get the padding for insert line right (if the terminal manufacturer |
| 325 | did not document it) a severe test is to edit a large file at 9600 baud, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 326 | delete 16 or so lines from the middle of the screen, then hit the \*(``u\*('' |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 327 | key several times quickly. |
| 328 | If the terminal messes up, more padding is usually needed. |
| 329 | A similar test can be used for insert character. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 330 | .SS "Basic Capabilities" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 331 | The number of columns on each line for the terminal is given by the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 332 | \fBcols\fP numeric capability. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 333 | If the terminal is a \s-1CRT\s0, then the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 334 | number of lines on the screen is given by the \fBlines\fP capability. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 335 | If the terminal wraps around to the beginning of the next line when |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 336 | it reaches the right margin, then it should have the \fBam\fP capability. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 337 | If the terminal can clear its screen, leaving the cursor in the home |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 338 | position, then this is given by the \fBclear\fP string capability. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 339 | If the terminal overstrikes |
| 340 | (rather than clearing a position when a character is struck over) |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 341 | then it should have the \fBos\fP capability. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 342 | If the terminal is a printing terminal, with no soft copy unit, |
| 343 | give it both |
| 344 | .B hc |
| 345 | and |
| 346 | .BR os . |
| 347 | .RB ( os |
| 348 | applies to storage scope terminals, such as \s-1TEKTRONIX\s+1 4010 |
| 349 | series, as well as hard copy and APL terminals.) |
| 350 | If there is a code to move the cursor to the left edge of the current |
| 351 | row, give this as |
| 352 | .BR cr . |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 353 | (Normally this will be carriage return, control/M.) |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 354 | If there is a code to produce an audible signal (bell, beep, etc) |
| 355 | give this as |
| 356 | .BR bel . |
| 357 | .PP |
| 358 | If there is a code to move the cursor one position to the left |
| 359 | (such as backspace) that capability should be given as |
| 360 | .BR cub1 . |
| 361 | Similarly, codes to move to the right, up, and down should be |
| 362 | given as |
| 363 | .BR cuf1 , |
| 364 | .BR cuu1 , |
| 365 | and |
| 366 | .BR cud1 . |
| 367 | These local cursor motions should not alter the text they pass over, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 368 | for example, you would not normally use \*(``\fBcuf1\fP=\ \*('' because the |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 369 | space would erase the character moved over. |
| 370 | .PP |
| 371 | A very important point here is that the local cursor motions encoded |
| 372 | in |
| 373 | .I terminfo |
| 374 | are undefined at the left and top edges of a \s-1CRT\s0 terminal. |
| 375 | Programs should never attempt to backspace around the left edge, |
| 376 | unless |
| 377 | .B bw |
| 378 | is given, |
| 379 | and never attempt to go up locally off the top. |
| 380 | In order to scroll text up, a program will go to the bottom left corner |
| 381 | of the screen and send the |
| 382 | .B ind |
| 383 | (index) string. |
| 384 | .PP |
| 385 | To scroll text down, a program goes to the top left corner |
| 386 | of the screen and sends the |
| 387 | .B ri |
| 388 | (reverse index) string. |
| 389 | The strings |
| 390 | .B ind |
| 391 | and |
| 392 | .B ri |
| 393 | are undefined when not on their respective corners of the screen. |
| 394 | .PP |
| 395 | Parameterized versions of the scrolling sequences are |
| 396 | .B indn |
| 397 | and |
| 398 | .B rin |
| 399 | which have the same semantics as |
| 400 | .B ind |
| 401 | and |
| 402 | .B ri |
| 403 | except that they take one parameter, and scroll that many lines. |
| 404 | They are also undefined except at the appropriate edge of the screen. |
| 405 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 406 | The \fBam\fP capability tells whether the cursor sticks at the right |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 407 | edge of the screen when text is output, but this does not necessarily |
| 408 | apply to a |
| 409 | .B cuf1 |
| 410 | from the last column. |
| 411 | The only local motion which is defined from the left edge is if |
| 412 | .B bw |
| 413 | is given, then a |
| 414 | .B cub1 |
| 415 | from the left edge will move to the right edge of the previous row. |
| 416 | If |
| 417 | .B bw |
| 418 | is not given, the effect is undefined. |
| 419 | This is useful for drawing a box around the edge of the screen, for example. |
| 420 | If the terminal has switch selectable automatic margins, |
| 421 | the |
| 422 | .I terminfo |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 423 | file usually assumes that this is on; i.e., \fBam\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 424 | If the terminal has a command which moves to the first column of the next |
| 425 | line, that command can be given as |
| 426 | .B nel |
| 427 | (newline). |
| 428 | It does not matter if the command clears the remainder of the current line, |
| 429 | so if the terminal has no |
| 430 | .B cr |
| 431 | and |
| 432 | .B lf |
| 433 | it may still be possible to craft a working |
| 434 | .B nel |
| 435 | out of one or both of them. |
| 436 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 437 | These capabilities suffice to describe |
| 438 | hard-copy and \*(``glass-tty\*('' terminals. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 439 | Thus the model 33 teletype is described as |
| 440 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 441 | .EX |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 442 | .\".in -2 |
| 443 | \s-133\||\|tty33\||\|tty\||\|model 33 teletype, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 444 | bel=\*^G, cols#72, cr=\*^M, cud1=\*^J, hc, ind=\*^J, os,\s+1 |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 445 | .\".in +2 |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 446 | .EE |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 447 | .PP |
| 448 | while the Lear Siegler \s-1ADM-3\s0 is described as |
| 449 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 450 | .EX |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 451 | .\".in -2 |
| 452 | \s-1adm3\||\|3\||\|lsi adm3, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 453 | am, bel=\*^G, clear=\*^Z, cols#80, cr=\*^M, cub1=\*^H, cud1=\*^J, |
| 454 | ind=\*^J, lines#24,\s+1 |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 455 | .\".in +2 |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 456 | .EE |
| 457 | .SS "Parameterized Strings" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 458 | Cursor addressing and other strings requiring parameters |
| 459 | in the terminal are described by a |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 460 | parameterized string capability, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 461 | with \fIprintf\fP-like escapes such as \fI%x\fP in it. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 462 | For example, to address the cursor, the |
| 463 | .B cup |
| 464 | capability is given, using two parameters: |
| 465 | the row and column to address to. |
| 466 | (Rows and columns are numbered from zero and refer to the |
| 467 | physical screen visible to the user, not to any unseen memory.) |
| 468 | If the terminal has memory relative cursor addressing, |
| 469 | that can be indicated by |
| 470 | .BR mrcup . |
| 471 | .PP |
| 472 | The parameter mechanism uses a stack and special \fB%\fP codes |
| 473 | to manipulate it. |
| 474 | Typically a sequence will push one of the |
| 475 | parameters onto the stack and then print it in some format. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 476 | Print (e.g., \*(``%d\*('') is a special case. |
| 477 | Other operations, including \*(``%t\*('' pop their operand from the stack. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 478 | It is noted that more complex operations are often necessary, |
| 479 | e.g., in the \fBsgr\fP string. |
| 480 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 481 | The \fB%\fP encodings have the following meanings: |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 482 | .TP 5 |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 483 | \fB%%\fP |
| 484 | outputs \*(``%\*('' |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 485 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 486 | \fB%\fI[[\fR:\fI]flags][width[.precision]][\fBdoxXs\fI]\fR |
| 487 | as in \fBprintf\fP(3), flags are \fI[\-+#]\fP and \fIspace\fP. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 488 | Use a \*(``:\*('' to allow the next character to be a \*(``\-\*('' flag, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 489 | avoiding interpreting \*(``%\-\*('' as an operator. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 490 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 491 | \fB%c\fP |
| 492 | print \fIpop()\fP like %c in \fBprintf\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 493 | .TP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 494 | \fB%s\fP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 495 | print \fIpop()\fP like %s in \fBprintf\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 496 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 497 | \fB%p\fI[1\-9]\fR |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 498 | push \fIi\fP'th parameter |
| 499 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 500 | \fB%P\fI[a\-z]\fR |
| 501 | set dynamic variable \fI[a\-z]\fP to \fIpop()\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 502 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 503 | \fB%g\fI[a\-z]\fR |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 504 | get dynamic variable \fI[a\-z]\fP and push it |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 505 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 506 | \fB%P\fI[A\-Z]\fR |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 507 | set static variable \fI[a\-z]\fP to \fIpop()\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 508 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 509 | \fB%g\fI[A\-Z]\fR |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 510 | get static variable \fI[a\-z]\fP and push it |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 511 | .IP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 512 | The terms \*(``static\*('' and \*(``dynamic\*('' are misleading. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 513 | Historically, these are simply two different sets of variables, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 514 | whose values are not reset between calls to \fBtparm\fP(3X). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 515 | However, that fact is not documented in other implementations. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 516 | Relying on it will adversely impact portability to other implementations: |
| 517 | .RS |
| 518 | .bP |
| 519 | SVr2 curses supported \fIdynamic\fP variables. |
| 520 | Those are set only by a \fB%P\fP operator. |
| 521 | A \fB%g\fP for a given variable without first setting it with \fB%P\fP |
| 522 | will give unpredictable results, because dynamic variables are |
| 523 | an uninitialized local array on the stack in the \fBtparm\fP function. |
| 524 | .bP |
| 525 | SVr3.2 curses supported \fIstatic\fP variables. |
| 526 | Those are an array in the \fI\%TERMINAL\fP |
| 527 | structure (declared in \fBterm.h\fP), |
| 528 | and are zeroed automatically when the \fBsetupterm\fP function |
| 529 | allocates the data. |
| 530 | .bP |
| 531 | SVr4 curses made no further improvements |
| 532 | to the \fIdynamic/static\fP variable feature. |
| 533 | .bP |
| 534 | Solaris XPG4 curses does not distinguish between \fIdynamic\fP and |
| 535 | \fIstatic\fP variables. |
| 536 | They are the same. |
| 537 | Like SVr4 curses, XPG4 curses does not initialize these explicitly. |
| 538 | .bP |
| 539 | Before version 6.3, |
| 540 | \fI\%ncurses\fP stores both \fIdynamic\fP and \fIstatic\fP |
| 541 | variables in persistent storage, initialized to zeros. |
| 542 | .bP |
| 543 | Beginning with version 6.3, |
| 544 | \fI\%ncurses\fP stores \fIstatic\fP and \fIdynamic\fP |
| 545 | variables in the same manner as SVr4. |
| 546 | .RS |
| 547 | .bP |
| 548 | Unlike other implementations, \fI\%ncurses\fP zeros dynamic variables |
| 549 | before the first \fB%g\fP or \fB%P\fP operator. |
| 550 | .bP |
| 551 | Like SVr2, |
| 552 | the scope of dynamic variables in \fI\%ncurses\fP |
| 553 | is within the current call to |
| 554 | \fBtparm\fP. |
| 555 | Use static variables if persistent storage is needed. |
| 556 | .RE |
| 557 | .RE |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 558 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 559 | \fB%\*'\fIc\fB\*'\fR |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 560 | char constant \fIc\fP |
| 561 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 562 | \fB%{\fInn\fB}\fR |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 563 | integer constant \fInn\fP |
| 564 | .TP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 565 | \fB%l\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 566 | push strlen(pop) |
| 567 | .TP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 568 | \fB%+\fP, \fB%\-\fP, \fB%*\fP, \fB%/\fP, \fB%m\fP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 569 | arithmetic (%m is \fImod\fP): \fIpush(pop() op pop())\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 570 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 571 | \fB%&\fP, \fB%|\fP, \fB%\*^\fP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 572 | bit operations (AND, OR and exclusive-OR): \fIpush(pop() op pop())\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 573 | .TP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 574 | \fB%=\fP, \fB%>\fP, \fB%<\fP |
| 575 | logical operations: \fIpush(pop() op pop())\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 576 | .TP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 577 | \fB%A\fP, \fB%O\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 578 | logical AND and OR operations (for conditionals) |
| 579 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 580 | \fB%!\fP, \fB%\*~\fP |
| 581 | unary operations (logical and bit complement): \fIpush(op pop())\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 582 | .TP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 583 | \fB%i\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 584 | add 1 to first two parameters (for ANSI terminals) |
| 585 | .TP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 586 | \fB%?\fP \fIexpr\fP \fB%t\fP \fIthenpart\fP \fB%e\fP \fIelsepart\fP \fB%;\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 587 | This forms an if-then-else. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 588 | The \fB%e\fP \fIelsepart\fP is optional. |
| 589 | Usually the \fB%?\fP \fIexpr\fP part pushes a value onto the stack, |
| 590 | and \fB%t\fP pops it from the stack, testing if it is nonzero (true). |
| 591 | If it is zero (false), control passes to the \fB%e\fP (else) part. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 592 | .IP |
| 593 | It is possible to form else-if's a la Algol 68: |
| 594 | .RS |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 595 | \fB%?\fP c\d1\u \fB%t\fP b\d1\u \fB%e\fP c\d2\u \fB%t\fP b\d2\u \fB%e\fP c\d3\u \fB%t\fP b\d3\u \fB%e\fP c\d4\u \fB%t\fP b\d4\u \fB%e\fP \fB%;\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 596 | .RE |
| 597 | .IP |
| 598 | where c\di\u are conditions, b\di\u are bodies. |
| 599 | .IP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 600 | Use the \fB\-f\fP option of \fB@TIC@\fP or \fB@INFOCMP@\fP to see |
| 601 | the structure of if-then-else's. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 602 | Some strings, e.g., \fBsgr\fP can be very complicated when written |
| 603 | on one line. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 604 | The \fB\-f\fP option splits the string into lines with the parts indented. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 605 | .PP |
| 606 | Binary operations are in postfix form with the operands in the usual order. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 607 | That is, to get x\-5 one would use \*(``%gx%{5}%\-\*(''. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 608 | \fB%P\fP and \fB%g\fP variables are |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 609 | persistent across escape-string evaluations. |
| 610 | .PP |
| 611 | Consider the HP2645, which, to get to row 3 and column 12, needs |
| 612 | to be sent \eE&a12c03Y padded for 6 milliseconds. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 613 | The order of the rows and columns is inverted here, |
| 614 | and the row and column are printed as two digits. |
| 615 | The corresponding terminal description is expressed thus: |
| 616 | .RS |
| 617 | cup=\eE&a%p2%dc%p1%dY$<6>, |
| 618 | .RE |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 619 | .PP |
| 620 | The Microterm \s-1ACT-IV\s0 needs the current row and column sent |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 621 | preceded by a \fB\*^T\fP, with the row and column simply encoded in binary, |
| 622 | .RS |
| 623 | cup=\*^T%p1%c%p2%c |
| 624 | .RE |
| 625 | .PP |
| 626 | Terminals which use \*(``%c\*('' need to be able to |
| 627 | backspace the cursor (\fBcub1\fP), |
| 628 | and to move the cursor up one line on the screen (\fBcuu1\fP). |
| 629 | This is necessary because it is not always safe to transmit \fB\en\fP |
| 630 | \fB\*^D\fP and \fB\er\fP, as the system may change or discard them. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 631 | (The library routines dealing with terminfo set tty modes so that |
| 632 | tabs are never expanded, so \et is safe to send. |
| 633 | This turns out to be essential for the Ann Arbor 4080.) |
| 634 | .PP |
| 635 | A final example is the \s-1LSI ADM\s0-3a, which uses row and column |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 636 | offset by a blank character, thus |
| 637 | .RS |
| 638 | cup=\eE=%p1%\*' \*'%+%c%p2%\*' \*'%+%c |
| 639 | .RE |
| 640 | .PP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 641 | After sending \*(``\eE=\*('', this pushes the first parameter, pushes the |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 642 | ASCII value for a space (32), adds them (pushing the sum on the stack |
| 643 | in place of the two previous values) and outputs that value as a character. |
| 644 | Then the same is done for the second parameter. |
| 645 | More complex arithmetic is possible using the stack. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 646 | .SS "Cursor Motions" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 647 | If the terminal has a fast way to home the cursor |
| 648 | (to very upper left corner of screen) then this can be given as |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 649 | \fBhome\fP; similarly a fast way of getting to the lower left-hand corner |
| 650 | can be given as \fBll\fP; this may involve going up with \fBcuu1\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 651 | from the home position, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 652 | but a program should never do this itself (unless \fBll\fP does) because it |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 653 | can make no assumption about the effect of moving up from the home position. |
| 654 | Note that the home position is the same as addressing to (0,0): |
| 655 | to the top left corner of the screen, not of memory. |
| 656 | (Thus, the \eEH sequence on HP terminals cannot be used for |
| 657 | .BR home .) |
| 658 | .PP |
| 659 | If the terminal has row or column absolute cursor addressing, |
| 660 | these can be given as single parameter capabilities |
| 661 | .B hpa |
| 662 | (horizontal position absolute) |
| 663 | and |
| 664 | .B vpa |
| 665 | (vertical position absolute). |
| 666 | Sometimes these are shorter than the more general two parameter |
| 667 | sequence (as with the hp2645) and can be used in preference to |
| 668 | .BR cup . |
| 669 | If there are parameterized local motions (e.g., move |
| 670 | .I n |
| 671 | spaces to the right) these can be given as |
| 672 | .BR cud , |
| 673 | .BR cub , |
| 674 | .BR cuf , |
| 675 | and |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 676 | .B cuu |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 677 | with a single parameter indicating how many spaces to move. |
| 678 | These are primarily useful if the terminal does not have |
| 679 | .BR cup , |
| 680 | such as the \s-1TEKTRONIX\s+1 4025. |
| 681 | .PP |
| 682 | If the terminal needs to be in a special mode when running |
| 683 | a program that uses these capabilities, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 684 | the codes to enter and exit this mode can be given |
| 685 | as \fBsmcup\fP and \fBrmcup\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 686 | This arises, for example, from terminals like the Concept with more than |
| 687 | one page of memory. |
| 688 | If the terminal has only memory relative cursor addressing and not screen |
| 689 | relative cursor addressing, a one screen-sized window must be fixed into |
| 690 | the terminal for cursor addressing to work properly. |
| 691 | This is also used for the \s-1TEKTRONIX\s+1 4025, |
| 692 | where |
| 693 | .B smcup |
| 694 | sets the command character to be the one used by terminfo. |
| 695 | If the \fBsmcup\fP sequence will not restore the screen after an |
| 696 | \fBrmcup\fP sequence is output (to the state prior to outputting |
| 697 | \fBrmcup\fP), specify \fBnrrmc\fP. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 698 | .SS Margins |
| 699 | SVr4 (and X/Open Curses) |
| 700 | list several string capabilities for setting margins. |
| 701 | Two were intended for use with terminals, |
| 702 | and another six were intended for use with printers. |
| 703 | .bP |
| 704 | The two terminal capabilities assume that the terminal may have |
| 705 | the capability of setting the left and/or right margin at the current |
| 706 | cursor column position. |
| 707 | .bP |
| 708 | The printer capabilities assume that the printer may have |
| 709 | two types of capability: |
| 710 | .RS |
| 711 | .bP |
| 712 | the ability to set a top and/or bottom margin using the current |
| 713 | line position, and |
| 714 | .bP |
| 715 | parameterized capabilities for setting the top, bottom, left, right margins |
| 716 | given the number of rows or columns. |
| 717 | .RE |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 718 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 719 | In practice, the categorization into \*(``terminal\*('' and \*(``printer\*('' |
| 720 | is not suitable: |
| 721 | .bP |
| 722 | The AT&T SVr4 terminal database uses \fBsmgl\fP four times, |
| 723 | for AT&T hardware. |
| 724 | .IP |
| 725 | Three of the four are printers. |
| 726 | They lack the ability to set left/right margins by specifying the column. |
| 727 | .bP |
| 728 | Other (non-AT&T) terminals may support margins |
| 729 | but using different assumptions from AT&T. |
| 730 | .IP |
| 731 | For instance, the DEC VT420 supports left/right margins, |
| 732 | but only using a column parameter. |
| 733 | As an added complication, the VT420 uses two settings to fully enable |
| 734 | left/right margins (left/right margin mode, and origin mode). |
| 735 | The former enables the margins, which causes printed text |
| 736 | to wrap within margins, but the latter is needed to prevent |
| 737 | cursor-addressing outside those margins. |
| 738 | .bP |
| 739 | Both DEC VT420 left/right margins are set with a single control sequence. |
| 740 | If either is omitted, the corresponding margin is set to the left or |
| 741 | right edge of the display (rather than leaving the margin unmodified). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 742 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 743 | These are the margin-related capabilities: |
| 744 | .PP |
| 745 | .TS |
| 746 | center; |
| 747 | lb lb |
| 748 | lb l . |
| 749 | Name Description |
| 750 | _ |
| 751 | smgl Set left margin at current column |
| 752 | smgr Set right margin at current column |
| 753 | smgb Set bottom margin at current line |
| 754 | smgt Set top margin at current line |
| 755 | smgbp Set bottom margin at line \fIN\fP |
| 756 | smglp Set left margin at column \fIN\fP |
| 757 | smgrp Set right margin at column \fIN\fP |
| 758 | smgtp Set top margin at line \fIN\fP |
| 759 | smglr Set both left and right margins to \fIL\fP and \fIR\fP |
| 760 | smgtb Set both top and bottom margins to \fIT\fP and \fIB\fP |
| 761 | .TE |
| 762 | .PP |
| 763 | When writing an application that |
| 764 | uses these string capabilities, |
| 765 | the pairs should be first checked to see |
| 766 | if each capability in the pair is set or only one is set: |
| 767 | .bP |
| 768 | If both \fBsmglp\fP and \fBsmgrp\fP are set, |
| 769 | each is used with a single argument, \fIN\fP, |
| 770 | that gives the column number of the left and right margin, respectively. |
| 771 | .bP |
| 772 | If both \fBsmgtp\fP and \fBsmgbp\fP are set, |
| 773 | each is used to set the top and bottom margin, |
| 774 | respectively: |
| 775 | .RS 4 |
| 776 | .bP |
| 777 | \fBsmgtp\fP is used with a single argument, \fIN\fP, |
| 778 | the line number of the top margin. |
| 779 | .bP |
| 780 | \fBsmgbp\fP is used with two arguments, \fIN\fP and \fIM\fP, |
| 781 | that give the line number of the bottom margin, |
| 782 | the first counting from the top of the |
| 783 | page and the second counting from the bottom. |
| 784 | This accommodates the two styles of specifying |
| 785 | the bottom margin in different manufacturers' printers. |
| 786 | .RE |
| 787 | .IP |
| 788 | When designing a terminfo entry for a |
| 789 | printer that has a settable bottom margin, |
| 790 | only the first or second argument should be used, depending on the printer. |
| 791 | When developing an application that uses \fBsmgbp\fP to set the bottom margin, |
| 792 | both arguments must be given. |
| 793 | .PP |
| 794 | Conversely, when only one capability in the pair is set: |
| 795 | .bP |
| 796 | If only one of \fBsmglp\fP and \fBsmgrp\fP is set, |
| 797 | then it is used with two arguments, |
| 798 | the column number of the left and right margins, in that order. |
| 799 | .bP |
| 800 | Likewise, if only one of \fBsmgtp\fP and \fBsmgbp\fP is set, then it |
| 801 | is used with two arguments that give the top and bottom margins, |
| 802 | in that order, counting from the top of the page. |
| 803 | .IP |
| 804 | When designing a terminfo entry for a printer that requires setting both |
| 805 | left and right or top and bottom margins simultaneously, |
| 806 | only one capability in the pairs |
| 807 | \fBsmglp\fP and \fBsmgrp\fP or |
| 808 | \fBsmgtp\fP and \fBsmgbp\fP should be defined, |
| 809 | leaving the other unset. |
| 810 | .PP |
| 811 | Except for very old terminal descriptions, e.g., those developed for SVr4, |
| 812 | the scheme just described should be considered obsolete. |
| 813 | An improved set of capabilities was added late in the SVr4 releases |
| 814 | (\fBsmglr\fP and \fBsmgtb\fP), |
| 815 | which explicitly use two parameters for setting the left/right or top/bottom |
| 816 | margins. |
| 817 | .PP |
| 818 | When setting margins, the line- and column-values are zero-based. |
| 819 | .PP |
| 820 | The \fBmgc\fP string capability should be defined. |
| 821 | Applications such as \fBtabs\fP(1) rely upon this to reset all margins. |
| 822 | .\" |
| 823 | .SS "Area Clears" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 824 | If the terminal can clear from the current position to the end of the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 825 | line, leaving the cursor where it is, this should be given as \fBel\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 826 | If the terminal can clear from the beginning of the line to the current |
| 827 | position inclusive, leaving |
| 828 | the cursor where it is, this should be given as \fBel1\fP. |
| 829 | If the terminal can clear from the current position to the end of the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 830 | display, then this should be given as \fBed\fP. |
| 831 | \fBEd\fP is only defined from the first column of a line. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 832 | (Thus, it can be simulated by a request to delete a large number of lines, |
| 833 | if a true |
| 834 | .B ed |
| 835 | is not available.) |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 836 | .\" |
| 837 | .SS "Insert/Delete Line and Vertical Motions" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 838 | If the terminal can open a new blank line before the line where the cursor |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 839 | is, this should be given as \fBil1\fP; this is done only from the first |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 840 | position of a line. |
| 841 | The cursor must then appear on the newly blank line. |
| 842 | If the terminal can delete the line which the cursor is on, then this |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 843 | should be given as \fBdl1\fP; this is done only from the first position on |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 844 | the line to be deleted. |
| 845 | Versions of |
| 846 | .B il1 |
| 847 | and |
| 848 | .B dl1 |
| 849 | which take a single parameter and insert or delete that many lines can |
| 850 | be given as |
| 851 | .B il |
| 852 | and |
| 853 | .BR dl . |
| 854 | .PP |
| 855 | If the terminal has a settable scrolling region (like the vt100) |
| 856 | the command to set this can be described with the |
| 857 | .B csr |
| 858 | capability, which takes two parameters: |
| 859 | the top and bottom lines of the scrolling region. |
| 860 | The cursor position is, alas, undefined after using this command. |
| 861 | .PP |
| 862 | It is possible to get the effect of insert or delete line using |
| 863 | .B csr |
| 864 | on a properly chosen region; the |
| 865 | .B sc |
| 866 | and |
| 867 | .B rc |
| 868 | (save and restore cursor) commands may be useful for ensuring that |
| 869 | your synthesized insert/delete string does not move the cursor. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 870 | (Note that the \fB\%ncurses\fP(3X) library does this synthesis |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 871 | automatically, so you need not compose insert/delete strings for |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 872 | an entry with \fBcsr\fP). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 873 | .PP |
| 874 | Yet another way to construct insert and delete might be to use a combination of |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 875 | index with the memory-lock feature found on some terminals (like the HP-700/90 |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 876 | series, which however also has insert/delete). |
| 877 | .PP |
| 878 | Inserting lines at the top or bottom of the screen can also be |
| 879 | done using |
| 880 | .B ri |
| 881 | or |
| 882 | .B ind |
| 883 | on many terminals without a true insert/delete line, |
| 884 | and is often faster even on terminals with those features. |
| 885 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 886 | The Boolean \fBnon_dest_scroll_region\fP should be set if each scrolling |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 887 | window is effectively a view port on a screen-sized canvas. |
| 888 | To test for |
| 889 | this capability, create a scrolling region in the middle of the screen, |
| 890 | write something to the bottom line, move the cursor to the top of the region, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 891 | and do \fBri\fP followed by \fBdl1\fP or \fBind\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 892 | If the data scrolled |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 893 | off the bottom of the region by the \fBri\fP re-appears, then scrolling |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 894 | is non-destructive. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 895 | System V and X/Open Curses expect that \fBind\fP, \fBri\fP, |
| 896 | \fBindn\fP, and \fBrin\fP will simulate destructive scrolling; their |
| 897 | documentation cautions you not to define \fBcsr\fP unless this is true. |
| 898 | This \fBcurses\fP implementation is more liberal and will do explicit erases |
| 899 | after scrolling if \fBndsrc\fP is defined. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 900 | .PP |
| 901 | If the terminal has the ability to define a window as part of |
| 902 | memory, which all commands affect, |
| 903 | it should be given as the parameterized string |
| 904 | .BR wind . |
| 905 | The four parameters are the starting and ending lines in memory |
| 906 | and the starting and ending columns in memory, in that order. |
| 907 | .PP |
| 908 | If the terminal can retain display memory above, then the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 909 | \fBda\fP capability should be given; if display memory can be retained |
| 910 | below, then \fBdb\fP should be given. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 911 | These indicate |
| 912 | that deleting a line or scrolling may bring non-blank lines up from below |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 913 | or that scrolling back with \fBri\fP may bring down non-blank lines. |
| 914 | .SS "Insert/Delete Character" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 915 | There are two basic kinds of intelligent terminals with respect to |
| 916 | insert/delete character which can be described using |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 917 | .IR terminfo . |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 918 | The most common insert/delete character operations affect only the characters |
| 919 | on the current line and shift characters off the end of the line rigidly. |
| 920 | Other terminals, such as the Concept 100 and the Perkin Elmer Owl, make |
| 921 | a distinction between typed and untyped blanks on the screen, shifting |
| 922 | upon an insert or delete only to an untyped blank on the screen which is |
| 923 | either eliminated, or expanded to two untyped blanks. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 924 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 925 | You can determine the |
| 926 | kind of terminal you have by clearing the screen and then typing |
| 927 | text separated by cursor motions. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 928 | Type \*(``abc\ \ \ \ def\*('' using local |
| 929 | cursor motions (not spaces) between the \*(``abc\*('' and the \*(``def\*(''. |
| 930 | Then position the cursor before the \*(``abc\*('' and put the terminal in insert |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 931 | mode. |
| 932 | If typing characters causes the rest of the line to shift |
| 933 | rigidly and characters to fall off the end, then your terminal does |
| 934 | not distinguish between blanks and untyped positions. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 935 | If the \*(``abc\*('' |
| 936 | shifts over to the \*(``def\*('' which then move together around the end of the |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 937 | current line and onto the next as you insert, you have the second type of |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 938 | terminal, and should give the capability \fBin\fP, which stands for |
| 939 | \*(``insert null\*(''. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 940 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 941 | While these are two logically separate attributes (one line versus multi-line |
| 942 | insert mode, and special treatment of untyped spaces) we have seen no |
| 943 | terminals whose insert mode cannot be described with the single attribute. |
| 944 | .PP |
| 945 | Terminfo can describe both terminals which have an insert mode, and terminals |
| 946 | which send a simple sequence to open a blank position on the current line. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 947 | Give as \fBsmir\fP the sequence to get into insert mode. |
| 948 | Give as \fBrmir\fP the sequence to leave insert mode. |
| 949 | Now give as \fBich1\fP any sequence needed to be sent just before sending |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 950 | the character to be inserted. |
| 951 | Most terminals with a true insert mode |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 952 | will not give \fBich1\fP; terminals which send a sequence to open a screen |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 953 | position should give it here. |
| 954 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 955 | If your terminal has both, insert mode is usually preferable to \fBich1\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 956 | Technically, you should not give both unless the terminal actually requires |
| 957 | both to be used in combination. |
| 958 | Accordingly, some non-curses applications get |
| 959 | confused if both are present; the symptom is doubled characters in an update |
| 960 | using insert. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 961 | This requirement is now rare; most \fBich\fP sequences do not |
| 962 | require previous smir, and most smir insert modes do not require \fBich1\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 963 | before each character. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 964 | Therefore, the new \fBcurses\fP actually assumes this |
| 965 | is the case and uses either \fBrmir\fP/\fBsmir\fP or \fBich\fP/\fBich1\fP as |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 966 | appropriate (but not both). |
| 967 | If you have to write an entry to be used under |
| 968 | new curses for a terminal old enough to need both, include the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 969 | \fBrmir\fP/\fBsmir\fP sequences in \fBich1\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 970 | .PP |
| 971 | If post insert padding is needed, give this as a number of milliseconds |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 972 | in \fBip\fP (a string option). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 973 | Any other sequence which may need to be |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 974 | sent after an insert of a single character may also be given in \fBip\fP. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 975 | If your terminal needs both to be placed into an \*(``insert mode\*('' and |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 976 | a special code to precede each inserted character, then both |
| 977 | .BR smir / rmir |
| 978 | and |
| 979 | .B ich1 |
| 980 | can be given, and both will be used. |
| 981 | The |
| 982 | .B ich |
| 983 | capability, with one parameter, |
| 984 | .IR n , |
| 985 | will repeat the effects of |
| 986 | .B ich1 |
| 987 | .I n |
| 988 | times. |
| 989 | .PP |
| 990 | If padding is necessary between characters typed while not |
| 991 | in insert mode, give this as a number of milliseconds padding in \fBrmp\fP. |
| 992 | .PP |
| 993 | It is occasionally necessary to move around while in insert mode |
| 994 | to delete characters on the same line (e.g., if there is a tab after |
| 995 | the insertion position). |
| 996 | If your terminal allows motion while in |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 997 | insert mode you can give the capability \fBmir\fP to speed up inserting |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 998 | in this case. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 999 | Omitting \fBmir\fP will affect only speed. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1000 | Some terminals |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1001 | (notably Datamedia's) must not have \fBmir\fP because of the way their |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1002 | insert mode works. |
| 1003 | .PP |
| 1004 | Finally, you can specify |
| 1005 | .B dch1 |
| 1006 | to delete a single character, |
| 1007 | .B dch |
| 1008 | with one parameter, |
| 1009 | .IR n , |
| 1010 | to delete |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1011 | .IR n "characters," |
| 1012 | and delete mode by giving \fBsmdc\fP and \fBrmdc\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1013 | to enter and exit delete mode (any mode the terminal needs to be placed |
| 1014 | in for |
| 1015 | .B dch1 |
| 1016 | to work). |
| 1017 | .PP |
| 1018 | A command to erase |
| 1019 | .I n |
| 1020 | characters (equivalent to outputting |
| 1021 | .I n |
| 1022 | blanks without moving the cursor) |
| 1023 | can be given as |
| 1024 | .B ech |
| 1025 | with one parameter. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1026 | .SS "Highlighting, Underlining, and Visible Bells" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1027 | If your terminal has one or more kinds of display attributes, |
| 1028 | these can be represented in a number of different ways. |
| 1029 | You should choose one display form as |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1030 | \f2standout mode\fP, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1031 | representing a good, high contrast, easy-on-the-eyes, |
| 1032 | format for highlighting error messages and other attention getters. |
| 1033 | (If you have a choice, reverse video plus half-bright is good, |
| 1034 | or reverse video alone.) |
| 1035 | The sequences to enter and exit standout mode |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1036 | are given as \fBsmso\fP and \fBrmso\fP, respectively. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1037 | If the code to change into or out of standout |
| 1038 | mode leaves one or even two blank spaces on the screen, |
| 1039 | as the TVI 912 and Teleray 1061 do, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1040 | then \fBxmc\fP should be given to tell how many spaces are left. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1041 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1042 | Codes to begin underlining and end underlining can be given as \fBsmul\fP |
| 1043 | and \fBrmul\fP respectively. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1044 | If the terminal has a code to underline the current character and move |
| 1045 | the cursor one space to the right, |
| 1046 | such as the Microterm Mime, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1047 | this can be given as \fBuc\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1048 | .PP |
| 1049 | Other capabilities to enter various highlighting modes include |
| 1050 | .B blink |
| 1051 | (blinking) |
| 1052 | .B bold |
| 1053 | (bold or extra bright) |
| 1054 | .B dim |
| 1055 | (dim or half-bright) |
| 1056 | .B invis |
| 1057 | (blanking or invisible text) |
| 1058 | .B prot |
| 1059 | (protected) |
| 1060 | .B rev |
| 1061 | (reverse video) |
| 1062 | .B sgr0 |
| 1063 | (turn off |
| 1064 | .I all |
| 1065 | attribute modes) |
| 1066 | .B smacs |
| 1067 | (enter alternate character set mode) |
| 1068 | and |
| 1069 | .B rmacs |
| 1070 | (exit alternate character set mode). |
| 1071 | Turning on any of these modes singly may or may not turn off other modes. |
| 1072 | .PP |
| 1073 | If there is a sequence to set arbitrary combinations of modes, |
| 1074 | this should be given as |
| 1075 | .B sgr |
| 1076 | (set attributes), |
| 1077 | taking 9 parameters. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1078 | Each parameter is either zero (0) or nonzero, |
| 1079 | as the corresponding attribute is on or off. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1080 | The 9 parameters are, in order: |
| 1081 | standout, underline, reverse, blink, dim, bold, blank, protect, alternate |
| 1082 | character set. |
| 1083 | Not all modes need be supported by |
| 1084 | .BR sgr , |
| 1085 | only those for which corresponding separate attribute commands exist. |
| 1086 | .PP |
| 1087 | For example, the DEC vt220 supports most of the modes: |
| 1088 | .PP |
| 1089 | .TS |
| 1090 | center; |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1091 | lb lb lb |
| 1092 | l l l . |
| 1093 | tparm Parameter Attribute Escape Sequence |
| 1094 | _ |
| 1095 | none none \eE[0m |
| 1096 | p1 standout \eE[0;1;7m |
| 1097 | p2 underline \eE[0;4m |
| 1098 | p3 reverse \eE[0;7m |
| 1099 | p4 blink \eE[0;5m |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1100 | p5 dim not available |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1101 | p6 bold \eE[0;1m |
| 1102 | p7 invis \eE[0;8m |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1103 | p8 protect not used |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1104 | p9 altcharset \*^O (off) \*^N (on) |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1105 | .TE |
| 1106 | .PP |
| 1107 | We begin each escape sequence by turning off any existing modes, since |
| 1108 | there is no quick way to determine whether they are active. |
| 1109 | Standout is set up to be the combination of reverse and bold. |
| 1110 | The vt220 terminal has a protect mode, |
| 1111 | though it is not commonly used in sgr |
| 1112 | because it protects characters on the screen from the host's erasures. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1113 | The altcharset mode also is different in that it is either \*^O or \*^N, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1114 | depending on whether it is off or on. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1115 | If all modes are turned on, the resulting sequence is \eE[0;1;4;5;7;8m\*^N. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1116 | .PP |
| 1117 | Some sequences are common to different modes. |
| 1118 | For example, ;7 is output when either p1 or p3 is true, that is, if |
| 1119 | either standout or reverse modes are turned on. |
| 1120 | .PP |
| 1121 | Writing out the above sequences, along with their dependencies yields |
| 1122 | .PP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1123 | .ne 11 |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1124 | .TS |
| 1125 | center; |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1126 | lb lb lb |
| 1127 | l l l . |
| 1128 | Sequence When to Output terminfo Translation |
| 1129 | _ |
| 1130 | \eE[0 always \eE[0 |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1131 | ;1 if p1 or p6 %?%p1%p6%|%t;1%; |
| 1132 | ;4 if p2 %?%p2%|%t;4%; |
| 1133 | ;5 if p4 %?%p4%|%t;5%; |
| 1134 | ;7 if p1 or p3 %?%p1%p3%|%t;7%; |
| 1135 | ;8 if p7 %?%p7%|%t;8%; |
| 1136 | m always m |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1137 | \*^N or \*^O if p9 \*^N, else \*^O %?%p9%t\*^N%e\*^O%; |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1138 | .TE |
| 1139 | .PP |
| 1140 | Putting this all together into the sgr sequence gives: |
| 1141 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1142 | .EX |
| 1143 | sgr=\eE[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p4%t;5%; |
| 1144 | %?%p1%p3%|%t;7%;%?%p7%t;8%;m%?%p9%t\e016%e\e017%;, |
| 1145 | .EE |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1146 | .PP |
| 1147 | Remember that if you specify sgr, you must also specify sgr0. |
| 1148 | Also, some implementations rely on sgr being given if sgr0 is, |
| 1149 | Not all terminfo entries necessarily have an sgr string, however. |
| 1150 | Many terminfo entries are derived from termcap entries |
| 1151 | which have no sgr string. |
| 1152 | The only drawback to adding an sgr string is that termcap also |
| 1153 | assumes that sgr0 does not exit alternate character set mode. |
| 1154 | .PP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1155 | Terminals with the \*(``magic cookie\*('' glitch |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1156 | .RB ( xmc ) |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1157 | deposit special \*(``cookies\*('' when they receive mode-setting sequences, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1158 | which affect the display algorithm rather than having extra bits for |
| 1159 | each character. |
| 1160 | Some terminals, such as the HP 2621, automatically leave standout |
| 1161 | mode when they move to a new line or the cursor is addressed. |
| 1162 | Programs using standout mode should exit standout mode before |
| 1163 | moving the cursor or sending a newline, |
| 1164 | unless the |
| 1165 | .B msgr |
| 1166 | capability, asserting that it is safe to move in standout mode, is present. |
| 1167 | .PP |
| 1168 | If the terminal has |
| 1169 | a way of flashing the screen to indicate an error quietly (a bell replacement) |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1170 | then this can be given as \fBflash\fP; it must not move the cursor. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1171 | .PP |
| 1172 | If the cursor needs to be made more visible than normal when it is |
| 1173 | not on the bottom line (to make, for example, a non-blinking underline into an |
| 1174 | easier to find block or blinking underline) |
| 1175 | give this sequence as |
| 1176 | .BR cvvis . |
| 1177 | If there is a way to make the cursor completely invisible, give that as |
| 1178 | .BR civis . |
| 1179 | The capability |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1180 | .B cnorm |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1181 | should be given which undoes the effects of both of these modes. |
| 1182 | .PP |
| 1183 | If your terminal correctly generates underlined characters |
| 1184 | (with no special codes needed) |
| 1185 | even though it does not overstrike, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1186 | then you should give the capability \fBul\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1187 | If a character overstriking another leaves both characters on the screen, |
| 1188 | specify the capability \fBos\fP. |
| 1189 | If overstrikes are erasable with a blank, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1190 | then this should be indicated by giving \fBeo\fP. |
| 1191 | .SS "Keypad and Function Keys" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1192 | If the terminal has a keypad that transmits codes when the keys are pressed, |
| 1193 | this information can be given. |
| 1194 | Note that it is not possible to handle |
| 1195 | terminals where the keypad only works in local (this applies, for example, |
| 1196 | to the unshifted HP 2621 keys). |
| 1197 | If the keypad can be set to transmit or not transmit, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1198 | give these codes as \fBsmkx\fP and \fBrmkx\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1199 | Otherwise the keypad is assumed to always transmit. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1200 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1201 | The codes sent by the left arrow, right arrow, up arrow, down arrow, |
| 1202 | and home keys can be given as |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1203 | \fBkcub1, kcuf1, kcuu1, kcud1, \fRand\fB khome\fP respectively. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1204 | If there are function keys such as f0, f1, ..., f10, the codes they send |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1205 | can be given as \fBkf0, kf1, ..., kf10\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1206 | If these keys have labels other than the default f0 through f10, the labels |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1207 | can be given as \fBlf0, lf1, ..., lf10\fP. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1208 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1209 | The codes transmitted by certain other special keys can be given: |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1210 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1211 | .B kll |
| 1212 | (home down), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1213 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1214 | .B kbs |
| 1215 | (backspace), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1216 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1217 | .B ktbc |
| 1218 | (clear all tabs), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1219 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1220 | .B kctab |
| 1221 | (clear the tab stop in this column), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1222 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1223 | .B kclr |
| 1224 | (clear screen or erase key), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1225 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1226 | .B kdch1 |
| 1227 | (delete character), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1228 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1229 | .B kdl1 |
| 1230 | (delete line), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1231 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1232 | .B krmir |
| 1233 | (exit insert mode), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1234 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1235 | .B kel |
| 1236 | (clear to end of line), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1237 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1238 | .B ked |
| 1239 | (clear to end of screen), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1240 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1241 | .B kich1 |
| 1242 | (insert character or enter insert mode), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1243 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1244 | .B kil1 |
| 1245 | (insert line), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1246 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1247 | .B knp |
| 1248 | (next page), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1249 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1250 | .B kpp |
| 1251 | (previous page), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1252 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1253 | .B kind |
| 1254 | (scroll forward/down), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1255 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1256 | .B kri |
| 1257 | (scroll backward/up), |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1258 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1259 | .B khts |
| 1260 | (set a tab stop in this column). |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1261 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1262 | In addition, if the keypad has a 3 by 3 array of keys including the four |
| 1263 | arrow keys, the other five keys can be given as |
| 1264 | .BR ka1 , |
| 1265 | .BR ka3 , |
| 1266 | .BR kb2 , |
| 1267 | .BR kc1 , |
| 1268 | and |
| 1269 | .BR kc3 . |
| 1270 | These keys are useful when the effects of a 3 by 3 directional pad are needed. |
| 1271 | .PP |
| 1272 | Strings to program function keys can be given as |
| 1273 | .BR pfkey , |
| 1274 | .BR pfloc , |
| 1275 | and |
| 1276 | .BR pfx . |
| 1277 | A string to program screen labels should be specified as \fBpln\fP. |
| 1278 | Each of these strings takes two parameters: the function key number to |
| 1279 | program (from 0 to 10) and the string to program it with. |
| 1280 | Function key numbers out of this range may program undefined keys in |
| 1281 | a terminal dependent manner. |
| 1282 | The difference between the capabilities is that |
| 1283 | .B pfkey |
| 1284 | causes pressing the given key to be the same as the user typing the |
| 1285 | given string; |
| 1286 | .B pfloc |
| 1287 | causes the string to be executed by the terminal in local; and |
| 1288 | .B pfx |
| 1289 | causes the string to be transmitted to the computer. |
| 1290 | .PP |
| 1291 | The capabilities \fBnlab\fP, \fBlw\fP and \fBlh\fP |
| 1292 | define the number of programmable |
| 1293 | screen labels and their width and height. |
| 1294 | If there are commands to turn the labels on and off, |
| 1295 | give them in \fBsmln\fP and \fBrmln\fP. |
| 1296 | \fBsmln\fP is normally output after one or more pln |
| 1297 | sequences to make sure that the change becomes visible. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1298 | .SS "Tabs and Initialization" |
| 1299 | A few capabilities are used only for tabs: |
| 1300 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1301 | If the terminal has hardware tabs, the command to advance to the next |
| 1302 | tab stop can be given as |
| 1303 | .B ht |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1304 | (usually control/I). |
| 1305 | .bP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1306 | A \*(``back-tab\*('' command which moves leftward to the preceding tab stop can |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1307 | be given as |
| 1308 | .BR cbt . |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1309 | .IP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1310 | By convention, if the teletype modes indicate that tabs are being |
| 1311 | expanded by the computer rather than being sent to the terminal, |
| 1312 | programs should not use |
| 1313 | .B ht |
| 1314 | or |
| 1315 | .B cbt |
| 1316 | even if they are present, since the user may not have the tab stops |
| 1317 | properly set. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1318 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1319 | If the terminal has hardware tabs which are initially set every |
| 1320 | .I n |
| 1321 | spaces when the terminal is powered up, |
| 1322 | the numeric parameter |
| 1323 | .B it |
| 1324 | is given, showing the number of spaces the tabs are set to. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1325 | .IP |
| 1326 | The \fBit\fP capability is normally used by the \fB@TSET@\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1327 | command to determine whether to set the mode for hardware tab expansion, |
| 1328 | and whether to set the tab stops. |
| 1329 | If the terminal has tab stops that can be saved in non-volatile memory, |
| 1330 | the terminfo description can assume that they are properly set. |
| 1331 | .PP |
| 1332 | Other capabilities |
| 1333 | include |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1334 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1335 | .BR is1 , |
| 1336 | .BR is2 , |
| 1337 | and |
| 1338 | .BR is3 , |
| 1339 | initialization strings for the terminal, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1340 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1341 | .BR iprog , |
| 1342 | the path name of a program to be run to initialize the terminal, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1343 | .bP |
| 1344 | and \fBif\fP, the name of a file containing long initialization strings. |
| 1345 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1346 | These strings are expected to set the terminal into modes consistent |
| 1347 | with the rest of the terminfo description. |
| 1348 | They are normally sent to the terminal, by the |
| 1349 | .I init |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1350 | option of the \fB@TPUT@\fP program, each time the user logs in. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1351 | They will be printed in the following order: |
| 1352 | .RS |
| 1353 | .TP |
| 1354 | run the program |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1355 | .B iprog |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1356 | .TP |
| 1357 | output |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1358 | .br |
| 1359 | \fBis1\fP and |
| 1360 | .br |
| 1361 | \fBis2\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1362 | .TP |
| 1363 | set the margins using |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1364 | \fBmgc\fP or |
| 1365 | .br |
| 1366 | \fBsmglp\fP and \fBsmgrp\fP or |
| 1367 | .br |
| 1368 | \fBsmgl\fP and \fBsmgr\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1369 | .TP |
| 1370 | set tabs using |
| 1371 | .B tbc |
| 1372 | and |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1373 | .B hts |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1374 | .TP |
| 1375 | print the file |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1376 | \fBif\fP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1377 | .TP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1378 | and finally output |
| 1379 | \fBis3\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1380 | .RE |
| 1381 | .PP |
| 1382 | Most initialization is done with |
| 1383 | .BR is2 . |
| 1384 | Special terminal modes can be set up without duplicating strings |
| 1385 | by putting the common sequences in |
| 1386 | .B is2 |
| 1387 | and special cases in |
| 1388 | .B is1 |
| 1389 | and |
| 1390 | .BR is3 . |
| 1391 | .PP |
| 1392 | A set of sequences that does a harder reset from a totally unknown state |
| 1393 | can be given as |
| 1394 | .BR rs1 , |
| 1395 | .BR rs2 , |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1396 | .B rf |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1397 | and |
| 1398 | .BR rs3 , |
| 1399 | analogous to |
| 1400 | .B is1 , |
| 1401 | .B is2 , |
| 1402 | .B if |
| 1403 | and |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1404 | .B is3 |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1405 | respectively. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1406 | These strings are output |
| 1407 | by \fIreset\fP option of \fB@TPUT@\fP, |
| 1408 | or by the \fB@RESET@\fP program |
| 1409 | (an alias of \fB@TSET@\fP), |
| 1410 | which is used when the terminal gets into a wedged state. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1411 | Commands are normally placed in |
| 1412 | .BR rs1 , |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1413 | .B rs2 |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1414 | .B rs3 |
| 1415 | and |
| 1416 | .B rf |
| 1417 | only if they produce annoying effects on the screen and are not |
| 1418 | necessary when logging in. |
| 1419 | For example, the command to set the vt100 into 80-column mode would |
| 1420 | normally be part of |
| 1421 | .BR is2 , |
| 1422 | but it causes an annoying glitch of the screen and is not normally |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1423 | needed since the terminal is usually already in 80-column mode. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1424 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1425 | The \fB@RESET@\fP program writes strings including |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1426 | .BR iprog , |
| 1427 | etc., in the same order as the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1428 | .I init |
| 1429 | program, using |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1430 | .BR rs1 , |
| 1431 | etc., instead of |
| 1432 | .BR is1 , |
| 1433 | etc. |
| 1434 | If any of |
| 1435 | .BR rs1 , |
| 1436 | .BR rs2 , |
| 1437 | .BR rs3 , |
| 1438 | or |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1439 | .B rf |
| 1440 | reset capability strings are missing, |
| 1441 | the \fB@RESET@\fP program |
| 1442 | falls back upon the corresponding initialization capability string. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1443 | .PP |
| 1444 | If there are commands to set and clear tab stops, they can be given as |
| 1445 | .B tbc |
| 1446 | (clear all tab stops) |
| 1447 | and |
| 1448 | .B hts |
| 1449 | (set a tab stop in the current column of every row). |
| 1450 | If a more complex sequence is needed to set the tabs than can be |
| 1451 | described by this, the sequence can be placed in |
| 1452 | .B is2 |
| 1453 | or |
| 1454 | .BR if . |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1455 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1456 | The \fB@TPUT@ reset\fP command uses the same capability strings |
| 1457 | as the \fB@RESET@\fP command, |
| 1458 | although the two programs (\fB@TPUT@\fP and \fB@RESET@\fP) |
| 1459 | provide different command-line options. |
| 1460 | .PP |
| 1461 | In practice, these terminfo capabilities are not often used in |
| 1462 | initialization of tabs |
| 1463 | (though they are required for the \fB@TABS@\fP program): |
| 1464 | .bP |
| 1465 | Almost all hardware terminals (at least those which supported tabs) |
| 1466 | initialized those to every \fIeight\fP columns: |
| 1467 | .IP |
| 1468 | The only exception was the AT&T 2300 series, |
| 1469 | which set tabs to every \fIfive\fP columns. |
| 1470 | .bP |
| 1471 | In particular, developers of the hardware terminals which are commonly used |
| 1472 | as models for modern terminal emulators provided documentation demonstrating |
| 1473 | that \fIeight\fP columns were the standard. |
| 1474 | .bP |
| 1475 | Because of this, the terminal initialization programs |
| 1476 | \fB@TPUT@\fP and \fB@TSET@\fP |
| 1477 | use the |
| 1478 | \fBtbc\fP (\fBclear_all_tabs\fP) and |
| 1479 | \fBhts\fP (\fBset_tab\fP) capabilities directly |
| 1480 | only when the \fBit\fP (\fBinit_tabs\fP) capability |
| 1481 | is set to a value other than \fIeight\fP. |
| 1482 | .SS "Delays and Padding" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1483 | Many older and slower terminals do not support either XON/XOFF or DTR |
| 1484 | handshaking, including hard copy terminals and some very archaic CRTs |
| 1485 | (including, for example, DEC VT100s). |
| 1486 | These may require padding characters |
| 1487 | after certain cursor motions and screen changes. |
| 1488 | .PP |
| 1489 | If the terminal uses xon/xoff handshaking for flow control (that is, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1490 | it automatically emits \*^S back to the host when its input buffers are |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1491 | close to full), set |
| 1492 | .BR xon . |
| 1493 | This capability suppresses the emission of padding. |
| 1494 | You can also set it |
| 1495 | for memory-mapped console devices effectively that do not have a speed limit. |
| 1496 | Padding information should still be included so that routines can |
| 1497 | make better decisions about relative costs, but actual pad characters will |
| 1498 | not be transmitted. |
| 1499 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1500 | If \fBpb\fP (padding baud rate) is given, padding is suppressed at baud rates |
| 1501 | below the value of \fBpb\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1502 | If the entry has no padding baud rate, then |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1503 | whether padding is emitted or not is completely controlled by \fBxon\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1504 | .PP |
| 1505 | If the terminal requires other than a null (zero) character as a pad, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1506 | then this can be given as \fBpad\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1507 | Only the first character of the |
| 1508 | .B pad |
| 1509 | string is used. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1510 | .SS "Status Lines" |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1511 | Some terminals have an extra \*(``status line\*('' which is not normally used by |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1512 | software (and thus not counted in the terminal's \fBlines\fP capability). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1513 | .PP |
| 1514 | The simplest case is a status line which is cursor-addressable but not |
| 1515 | part of the main scrolling region on the screen; the Heathkit H19 has |
| 1516 | a status line of this kind, as would a 24-line VT100 with a 23-line |
| 1517 | scrolling region set up on initialization. |
| 1518 | This situation is indicated |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1519 | by the \fBhs\fP capability. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1520 | .PP |
| 1521 | Some terminals with status lines need special sequences to access the |
| 1522 | status line. |
| 1523 | These may be expressed as a string with single parameter |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1524 | \fBtsl\fP which takes the cursor to a given zero-origin column on the |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1525 | status line. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1526 | The capability \fBfsl\fP must return to the main-screen |
| 1527 | cursor positions before the last \fBtsl\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1528 | You may need to embed the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1529 | string values of \fBsc\fP (save cursor) and \fBrc\fP (restore cursor) |
| 1530 | in \fBtsl\fP and \fBfsl\fP to accomplish this. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1531 | .PP |
| 1532 | The status line is normally assumed to be the same width as the width |
| 1533 | of the terminal. |
| 1534 | If this is untrue, you can specify it with the numeric |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1535 | capability \fBwsl\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1536 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1537 | A command to erase or blank the status line may be specified as \fBdsl\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1538 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1539 | The Boolean capability \fBeslok\fP specifies that escape sequences, tabs, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1540 | etc., work ordinarily in the status line. |
| 1541 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1542 | The \fI\%ncurses\fP implementation does not yet use any of these |
| 1543 | capabilities. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1544 | They are documented here in case they ever become important. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1545 | .SS "Line Graphics" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1546 | Many terminals have alternate character sets useful for forms-drawing. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1547 | Terminfo and \fBcurses\fP have built-in support |
| 1548 | for most of the drawing characters |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1549 | supported by the VT100, with some characters from the AT&T 4410v1 added. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1550 | This alternate character set may be specified by the \fBacsc\fP capability. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1551 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1552 | .TS |
| 1553 | center; |
| 1554 | Lb Cb S L Lb |
| 1555 | Lb2 Lb2 Lb Lb1 S |
| 1556 | Lb L C Lb Lx. |
| 1557 | \& acsc \& \& |
| 1558 | ACS Name Value Symbol ASCII Fallback / Glyph Name |
| 1559 | _ |
| 1560 | ACS_RARROW 0x2b + > arrow pointing right |
| 1561 | ACS_LARROW 0x2c , < arrow pointing left |
| 1562 | ACS_UARROW 0x2d \- \*^ arrow pointing up |
| 1563 | ACS_DARROW 0x2e . v arrow pointing down |
| 1564 | ACS_BLOCK 0x30 0 # solid square block |
| 1565 | ACS_DIAMOND 0x60 \(ga + diamond |
| 1566 | ACS_CKBOARD 0x61 a : checker board (stipple) |
| 1567 | ACS_DEGREE 0x66 f \e degree symbol |
| 1568 | ACS_PLMINUS 0x67 g # plus/minus |
| 1569 | ACS_BOARD 0x68 h # board of squares |
| 1570 | ACS_LANTERN 0x69 i # lantern symbol |
| 1571 | ACS_LRCORNER 0x6a j + lower right corner |
| 1572 | ACS_URCORNER 0x6b k + upper right corner |
| 1573 | ACS_ULCORNER 0x6c l + upper left corner |
| 1574 | ACS_LLCORNER 0x6d m + lower left corner |
| 1575 | ACS_PLUS 0x6e n + large plus or crossover |
| 1576 | ACS_S1 0x6f o \*~ scan line 1 |
| 1577 | ACS_S3 0x70 p \- scan line 3 |
| 1578 | ACS_HLINE 0x71 q \- horizontal line |
| 1579 | ACS_S7 0x72 r \- scan line 7 |
| 1580 | ACS_S9 0x73 s \&_ scan line 9 |
| 1581 | ACS_LTEE 0x74 t + tee pointing right |
| 1582 | ACS_RTEE 0x75 u + tee pointing left |
| 1583 | ACS_BTEE 0x76 v + tee pointing up |
| 1584 | ACS_TTEE 0x77 w + tee pointing down |
| 1585 | ACS_VLINE 0x78 x | vertical line |
| 1586 | ACS_LEQUAL 0x79 y < less-than-or-equal-to |
| 1587 | ACS_GEQUAL 0x7a z > greater-than-or-equal-to |
| 1588 | ACS_PI 0x7b { * greek pi |
| 1589 | ACS_NEQUAL 0x7c | ! not-equal |
| 1590 | ACS_STERLING 0x7d } f UK pound sign |
| 1591 | ACS_BULLET 0x7e \*~ o bullet |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1592 | .TE |
| 1593 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1594 | A few notes apply to the table itself: |
| 1595 | .bP |
| 1596 | X/Open Curses incorrectly states that the mapping for \fIlantern\fP is |
| 1597 | uppercase \*(``I\*('' although Unix implementations use the |
| 1598 | lowercase \*(``i\*('' mapping. |
| 1599 | .bP |
| 1600 | The DEC VT100 implemented graphics using the alternate character set |
| 1601 | feature, temporarily switching \fImodes\fP and sending characters |
| 1602 | in the range 0x60 (96) to 0x7e (126) |
| 1603 | (the \fBacsc Value\fP column in the table). |
| 1604 | .bP |
| 1605 | The AT&T terminal added graphics characters outside that range. |
| 1606 | .IP |
| 1607 | Some of the characters within the range do not match the VT100; |
| 1608 | presumably they were used in the AT&T terminal: |
| 1609 | \fIboard of squares\fP replaces the VT100 \fInewline\fP symbol, while |
| 1610 | \fIlantern symbol\fP replaces the VT100 \fIvertical tab\fP symbol. |
| 1611 | The other VT100 symbols for control characters (\fIhorizontal tab\fP, |
| 1612 | \fIcarriage return\fP and \fIline-feed\fP) are not (re)used in curses. |
| 1613 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1614 | The best way to define a new device's graphics set is to add a column |
| 1615 | to a copy of this table for your terminal, giving the character which |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1616 | (when emitted between \fBsmacs\fP/\fBrmacs\fP switches) will be rendered |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1617 | as the corresponding graphic. |
| 1618 | Then read off the VT100/your terminal |
| 1619 | character pairs right to left in sequence; these become the ACSC string. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1620 | .SS "Color Handling" |
| 1621 | The curses library functions \fBinit_pair\fP and \fBinit_color\fP |
| 1622 | manipulate the \fIcolor pairs\fP and \fIcolor values\fP discussed in this |
| 1623 | section |
| 1624 | (see \fBcurs_color\fP(3X) for details on these and related functions). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1625 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1626 | Most color terminals are either \*(``Tektronix-like\*('' or \*(``HP-like\*('': |
| 1627 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1628 | Tektronix-like |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1629 | terminals have a predefined set of \fIN\fP colors |
| 1630 | (where \fIN\fP is usually 8), |
| 1631 | and can set |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1632 | character-cell foreground and background characters independently, mixing them |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1633 | into \fIN\fP\ *\ \fIN\fP color pairs. |
| 1634 | .bP |
| 1635 | On HP-like terminals, the user must set each color |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1636 | pair up separately (foreground and background are not independently settable). |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1637 | Up to \fIM\fP color pairs may be set up from 2*\fIM\fP different colors. |
| 1638 | ANSI-compatible terminals are Tektronix-like. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1639 | .PP |
| 1640 | Some basic color capabilities are independent of the color method. |
| 1641 | The numeric |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1642 | capabilities \fBcolors\fP and \fBpairs\fP specify the maximum numbers of colors |
| 1643 | and color pairs that can be displayed simultaneously. |
| 1644 | The \fBop\fP (original |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1645 | pair) string resets foreground and background colors to their default values |
| 1646 | for the terminal. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1647 | The \fBoc\fP string resets all colors or color pairs to |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1648 | their default values for the terminal. |
| 1649 | Some terminals (including many PC |
| 1650 | terminal emulators) erase screen areas with the current background color rather |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1651 | than the power-up default background; these should have the Boolean capability |
| 1652 | \fBbce\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1653 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1654 | While the curses library works with \fIcolor pairs\fP |
| 1655 | (reflecting the inability of some devices to set foreground |
| 1656 | and background colors independently), |
| 1657 | there are separate capabilities for setting these features: |
| 1658 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1659 | To change the current foreground or background color on a Tektronix-type |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1660 | terminal, use \fBsetaf\fP (set ANSI foreground) and \fBsetab\fP (set ANSI |
| 1661 | background) or \fBsetf\fP (set foreground) and \fBsetb\fP (set background). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1662 | These take one parameter, the color number. |
| 1663 | The SVr4 documentation describes |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1664 | only \fBsetaf\fP/\fBsetab\fP; the XPG4 draft says that "If the terminal |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1665 | supports ANSI escape sequences to set background and foreground, they should |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1666 | be coded as \fBsetaf\fP and \fBsetab\fP, respectively. |
| 1667 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1668 | If the terminal |
| 1669 | supports other escape sequences to set background and foreground, they should |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1670 | be coded as \fBsetf\fP and \fBsetb\fP, respectively. |
| 1671 | The \fBvidputs\fP and the \fBrefresh\fP(3X) functions |
| 1672 | use the \fBsetaf\fP and \fBsetab\fP capabilities if they are defined. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1673 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1674 | The \fBsetaf\fP/\fBsetab\fP and \fBsetf\fP/\fBsetb\fP capabilities take a |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1675 | single numeric argument each. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1676 | Argument values 0-7 of \fBsetaf\fP/\fBsetab\fP are portably defined as |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1677 | follows (the middle column is the symbolic #define available in the header for |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1678 | the \fBcurses\fP or \fI\%ncurses\fP libraries). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1679 | The terminal hardware is free to |
| 1680 | map these as it likes, but the RGB values indicate normal locations in color |
| 1681 | space. |
| 1682 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1683 | .TS |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1684 | center; |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1685 | cb cb cb cb s s |
| 1686 | l lb c l1 l1 l . |
| 1687 | Color #define Value RGB |
| 1688 | _ |
| 1689 | black COLOR_BLACK 0 0, 0, 0 |
| 1690 | red COLOR_RED 1 max, 0, 0 |
| 1691 | green COLOR_GREEN 2 0, max, 0 |
| 1692 | yellow COLOR_YELLOW 3 max, max, 0 |
| 1693 | blue COLOR_BLUE 4 0, 0, max |
| 1694 | magenta COLOR_MAGENTA 5 max, 0, max |
| 1695 | cyan COLOR_CYAN 6 0, max, max |
| 1696 | white COLOR_WHITE 7 max, max, max |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1697 | .TE |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1698 | .br |
| 1699 | .if t .ne 6v |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1700 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1701 | The argument values of \fBsetf\fP/\fBsetb\fP historically correspond to |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1702 | a different mapping, i.e., |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1703 | .PP |
| 1704 | .TS |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1705 | center; |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1706 | cb cb cb cb s s |
| 1707 | l lb c l1 l1 l . |
| 1708 | Color #define Value RGB |
| 1709 | _ |
| 1710 | black COLOR_BLACK 0 0, 0, 0 |
| 1711 | blue COLOR_BLUE 1 0, 0, max |
| 1712 | green COLOR_GREEN 2 0, max, 0 |
| 1713 | cyan COLOR_CYAN 3 0, max, max |
| 1714 | red COLOR_RED 4 max, 0, 0 |
| 1715 | magenta COLOR_MAGENTA 5 max, 0, max |
| 1716 | yellow COLOR_YELLOW 6 max, max, 0 |
| 1717 | white COLOR_WHITE 7 max, max, max |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1718 | .TE |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1719 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1720 | It is important to not confuse the two sets of color capabilities; |
| 1721 | otherwise red/blue will be interchanged on the display. |
| 1722 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1723 | On an HP-like terminal, use \fBscp\fP with a color pair number parameter to set |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1724 | which color pair is current. |
| 1725 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1726 | Some terminals allow the \fIcolor values\fP to be modified: |
| 1727 | .bP |
| 1728 | On a Tektronix-like terminal, the capability \fBccc\fP may be present to |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1729 | indicate that colors can be modified. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1730 | If so, the \fBinitc\fP capability will |
| 1731 | take a color number (0 to \fBcolors\fP \- 1)and three more parameters which |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1732 | describe the color. |
| 1733 | These three parameters default to being interpreted as RGB |
| 1734 | (Red, Green, Blue) values. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1735 | If the Boolean capability \fBhls\fP is present, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1736 | they are instead as HLS (Hue, Lightness, Saturation) indices. |
| 1737 | The ranges are |
| 1738 | terminal-dependent. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1739 | .bP |
| 1740 | On an HP-like terminal, \fBinitp\fP may give a capability for changing a |
| 1741 | color pair value. |
| 1742 | It will take seven parameters; a color pair number (0 to |
| 1743 | \fBmax_pairs\fP \- 1), and two triples describing first background and then |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1744 | foreground colors. |
| 1745 | These parameters must be (Red, Green, Blue) or |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1746 | (Hue, Lightness, Saturation) depending on \fBhls\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1747 | .PP |
| 1748 | On some color terminals, colors collide with highlights. |
| 1749 | You can register |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1750 | these collisions with the \fBncv\fP capability. |
| 1751 | This is a bit mask of |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1752 | attributes not to be used when colors are enabled. |
| 1753 | The correspondence with the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1754 | attributes understood by \fBcurses\fP is as follows: |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1755 | .PP |
| 1756 | .TS |
| 1757 | center; |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1758 | cb cb cb cb |
| 1759 | lb n n lb. |
| 1760 | Attribute Bit Decimal Set by |
| 1761 | _ |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1762 | A_STANDOUT 0 1 sgr |
| 1763 | A_UNDERLINE 1 2 sgr |
| 1764 | A_REVERSE 2 4 sgr |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1765 | A_BLINK 3 8 sgr |
| 1766 | A_DIM 4 16 sgr |
| 1767 | A_BOLD 5 32 sgr |
| 1768 | A_INVIS 6 64 sgr |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1769 | A_PROTECT 7 128 sgr |
| 1770 | A_ALTCHARSET 8 256 sgr |
| 1771 | A_HORIZONTAL 9 512 sgr1 |
| 1772 | A_LEFT 10 1024 sgr1 |
| 1773 | A_LOW 11 2048 sgr1 |
| 1774 | A_RIGHT 12 4096 sgr1 |
| 1775 | A_TOP 13 8192 sgr1 |
| 1776 | A_VERTICAL 14 16384 sgr1 |
| 1777 | A_ITALIC 15 32768 sitm |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1778 | .TE |
| 1779 | .PP |
| 1780 | For example, on many IBM PC consoles, the underline attribute collides with the |
| 1781 | foreground color blue and is not available in color mode. |
| 1782 | These should have |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1783 | an \fBncv\fP capability of 2. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1784 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1785 | SVr4 curses does nothing with \fBncv\fP, |
| 1786 | \fI\%ncurses\fP recognizes it and optimizes |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1787 | the output in favor of colors. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1788 | .SS Miscellaneous |
| 1789 | If the terminal requires other than a null (zero) character as a pad, then this |
| 1790 | can be given as pad. |
| 1791 | Only the first character of the pad string is used. |
| 1792 | If the terminal does not have a pad character, specify npc. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1793 | Note that \fI\%ncurses\fP implements the termcap-compatible \fBPC\fP |
| 1794 | variable; |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1795 | though the application may set this value to something other than |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1796 | a null, |
| 1797 | \fI\%ncurses\fP will test \fBnpc\fP first and use napms if the terminal |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1798 | has no pad character. |
| 1799 | .PP |
| 1800 | If the terminal can move up or down half a line, |
| 1801 | this can be indicated with |
| 1802 | .B hu |
| 1803 | (half-line up) |
| 1804 | and |
| 1805 | .B hd |
| 1806 | (half-line down). |
| 1807 | This is primarily useful for superscripts and subscripts on hard-copy terminals. |
| 1808 | If a hard-copy terminal can eject to the next page (form feed), give this as |
| 1809 | .B ff |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1810 | (usually control/L). |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1811 | .PP |
| 1812 | If there is a command to repeat a given character a given number of |
| 1813 | times (to save time transmitting a large number of identical characters) |
| 1814 | this can be indicated with the parameterized string |
| 1815 | .BR rep . |
| 1816 | The first parameter is the character to be repeated and the second |
| 1817 | is the number of times to repeat it. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1818 | Thus, tparm(repeat_char, \*'x\*', 10) is the same as \*(``xxxxxxxxxx\*(''. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1819 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1820 | If the terminal has a settable command character, |
| 1821 | such as the \s-1TEKTRONIX\s+1 4025, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1822 | this can be indicated with |
| 1823 | .BR cmdch . |
| 1824 | A prototype command character is chosen which is used in all capabilities. |
| 1825 | This character is given in the |
| 1826 | .B cmdch |
| 1827 | capability to identify it. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1828 | The following convention is supported on some Unix systems: |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1829 | The environment is to be searched for a |
| 1830 | .B CC |
| 1831 | variable, and if found, all |
| 1832 | occurrences of the prototype character are replaced with the character |
| 1833 | in the environment variable. |
| 1834 | .PP |
| 1835 | Terminal descriptions that do not represent a specific kind of known |
| 1836 | terminal, such as |
| 1837 | .IR switch , |
| 1838 | .IR dialup , |
| 1839 | .IR patch , |
| 1840 | and |
| 1841 | .IR network , |
| 1842 | should include the |
| 1843 | .B gn |
| 1844 | (generic) capability so that programs can complain that they do not know |
| 1845 | how to talk to the terminal. |
| 1846 | (This capability does not apply to |
| 1847 | .I virtual |
| 1848 | terminal descriptions for which the escape sequences are known.) |
| 1849 | .PP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1850 | If the terminal has a \*(``meta key\*('' which acts as a shift key, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1851 | setting the 8th bit of any character transmitted, this fact can |
| 1852 | be indicated with |
| 1853 | .BR km . |
| 1854 | Otherwise, software will assume that the 8th bit is parity and it |
| 1855 | will usually be cleared. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1856 | If strings exist to turn this \*(``meta mode\*('' on and off, they |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1857 | can be given as |
| 1858 | .B smm |
| 1859 | and |
| 1860 | .BR rmm . |
| 1861 | .PP |
| 1862 | If the terminal has more lines of memory than will fit on the screen |
| 1863 | at once, the number of lines of memory can be indicated with |
| 1864 | .BR lm . |
| 1865 | A value of |
| 1866 | .BR lm #0 |
| 1867 | indicates that the number of lines is not fixed, |
| 1868 | but that there is still more memory than fits on the screen. |
| 1869 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1870 | If the terminal is one of those supported by the Unix virtual |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1871 | terminal protocol, the terminal number can be given as |
| 1872 | .BR vt . |
| 1873 | .PP |
| 1874 | Media copy |
| 1875 | strings which control an auxiliary printer connected to the terminal |
| 1876 | can be given as |
| 1877 | .BR mc0 : |
| 1878 | print the contents of the screen, |
| 1879 | .BR mc4 : |
| 1880 | turn off the printer, and |
| 1881 | .BR mc5 : |
| 1882 | turn on the printer. |
| 1883 | When the printer is on, all text sent to the terminal will be sent |
| 1884 | to the printer. |
| 1885 | It is undefined whether the text is also displayed on the terminal screen |
| 1886 | when the printer is on. |
| 1887 | A variation |
| 1888 | .B mc5p |
| 1889 | takes one parameter, and leaves the printer on for as many characters |
| 1890 | as the value of the parameter, then turns the printer off. |
| 1891 | The parameter should not exceed 255. |
| 1892 | All text, including |
| 1893 | .BR mc4 , |
| 1894 | is transparently passed to the printer while an |
| 1895 | .B mc5p |
| 1896 | is in effect. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1897 | .SS "Glitches and Brain Damage" |
| 1898 | Hazeltine terminals, |
| 1899 | which do not allow \*(``\*~\*('' characters to be displayed should |
| 1900 | indicate \fBhz\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1901 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1902 | Terminals which ignore a line-feed immediately after an \fBam\fP wrap, |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1903 | such as the Concept and vt100, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1904 | should indicate \fBxenl\fP. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1905 | .PP |
| 1906 | If |
| 1907 | .B el |
| 1908 | is required to get rid of standout |
| 1909 | (instead of merely writing normal text on top of it), |
| 1910 | \fBxhp\fP should be given. |
| 1911 | .PP |
| 1912 | Teleray terminals, where tabs turn all characters moved over to blanks, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1913 | should indicate \fBxt\fP (destructive tabs). |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1914 | Note: the variable indicating this is now \*(``dest_tabs_magic_smso\*(''; in |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1915 | older versions, it was teleray_glitch. |
| 1916 | This glitch is also taken to mean that it is not possible to position |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1917 | the cursor on top of a \*(``magic cookie\*('', |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1918 | that to erase standout mode it is instead necessary to use |
| 1919 | delete and insert line. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1920 | The \fI\%ncurses\fP implementation ignores this glitch. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1921 | .PP |
| 1922 | The Beehive Superbee, which is unable to correctly transmit the escape |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1923 | or control/C characters, has |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1924 | .BR xsb , |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1925 | indicating that the f1 key is used for escape and f2 for control/C. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1926 | (Only certain Superbees have this problem, depending on the ROM.) |
| 1927 | Note that in older terminfo versions, this capability was called |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1928 | \*(``beehive_glitch\*(''; it is now \*(``no_esc_ctl_c\*(''. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1929 | .PP |
| 1930 | Other specific terminal problems may be corrected by adding more |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1931 | capabilities of the form \fBx\fIx\fR. |
| 1932 | .SS "Pitfalls of Long Entries" |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1933 | Long terminfo entries are unlikely to be a problem; to date, no entry has even |
| 1934 | approached terminfo's 4096-byte string-table maximum. |
| 1935 | Unfortunately, the termcap |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1936 | translations are much more strictly limited (to 1023 bytes), |
| 1937 | thus termcap translations of long terminfo entries can cause problems. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1938 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1939 | The man pages for 4.3BSD |
| 1940 | and older versions of \fBtgetent\fP instruct the user to |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1941 | allocate a 1024-byte buffer for the termcap entry. |
| 1942 | The entry gets null-terminated by |
| 1943 | the termcap library, so that makes the maximum safe length for a termcap entry |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1944 | 1k\-1 (1023) bytes. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1945 | Depending on what the application and the termcap library being used does, |
| 1946 | and where in the termcap file the terminal type that \fBtgetent\fP |
| 1947 | is searching for is, several bad things can happen: |
| 1948 | .bP |
| 1949 | some termcap libraries print a warning message, |
| 1950 | .bP |
| 1951 | some exit if they find an entry that's longer than 1023 bytes, |
| 1952 | .bP |
| 1953 | some neither exit nor warn, doing nothing useful, and |
| 1954 | .bP |
| 1955 | some simply truncate the entries to 1023 bytes. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1956 | .PP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1957 | Some application programs allocate more than |
| 1958 | the recommended 1K for the termcap entry; others do not. |
| 1959 | .PP |
| 1960 | Each termcap entry has two important sizes associated with it: before |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1961 | \*(``tc\*('' expansion, and after \*(``tc\*('' expansion. |
| 1962 | \*(``tc\*('' is the capability that |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1963 | tacks on another termcap entry to the end of the current one, to add |
| 1964 | on its capabilities. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1965 | If a termcap entry does not use the \*(``tc\*('' |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1966 | capability, then of course the two lengths are the same. |
| 1967 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1968 | The \*(``before tc expansion\*('' length is the most important one, because it |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1969 | affects more than just users of that particular terminal. |
| 1970 | This is the |
| 1971 | length of the entry as it exists in /etc/termcap, minus the |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1972 | backslash-newline pairs, which \fBtgetent\fP strips out while reading it. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1973 | Some termcap libraries strip off the final newline, too (GNU termcap does not). |
| 1974 | Now suppose: |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1975 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1976 | a termcap entry before expansion is more than 1023 bytes long, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1977 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1978 | and the application has only allocated a 1k buffer, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1979 | .bP |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1980 | and the termcap library (like the one in BSD/OS 1.1 and GNU) reads |
| 1981 | the whole entry into the buffer, no matter what its length, to see |
| 1982 | if it is the entry it wants, |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 1983 | .bP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1984 | and \fBtgetent\fP is searching for a terminal type that either is the |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1985 | long entry, appears in the termcap file after the long entry, or |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1986 | does not appear in the file at all (so that \fBtgetent\fP has to search |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1987 | the whole termcap file). |
| 1988 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 1989 | Then \fBtgetent\fP will overwrite memory, |
| 1990 | perhaps its stack, |
| 1991 | and probably core dump the program. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1992 | Programs like telnet are particularly vulnerable; modern telnets |
| 1993 | pass along values like the terminal type automatically. |
| 1994 | The results are almost |
| 1995 | as undesirable with a termcap library, like SunOS 4.1.3 and Ultrix 4.4, that |
| 1996 | prints warning messages when it reads an overly long termcap entry. |
| 1997 | If a |
| 1998 | termcap library truncates long entries, like OSF/1 3.0, it is immune to dying |
| 1999 | here but will return incorrect data for the terminal. |
| 2000 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2001 | The \*(``after tc expansion\*('' length will have a similar effect to the |
| 2002 | above, but only for people who actually set \fITERM\fP to that terminal |
| 2003 | type, since \fBtgetent\fP only does \*(``tc\*('' expansion once it is found the |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2004 | terminal type it was looking for, not while searching. |
| 2005 | .PP |
| 2006 | In summary, a termcap entry that is longer than 1023 bytes can cause, |
| 2007 | on various combinations of termcap libraries and applications, a core |
| 2008 | dump, warnings, or incorrect operation. |
| 2009 | If it is too long even before |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2010 | \*(``tc\*('' expansion, it will have this effect even for users of some other |
| 2011 | terminal types and users whose \fITERM\fP variable does not have a termcap |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2012 | entry. |
| 2013 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2014 | When in \-C (translate to termcap) mode, |
| 2015 | the \fI\%ncurses\fP implementation of |
| 2016 | \fB@TIC@\fP(1M) issues warning messages when the pre-tc length of a termcap |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2017 | translation is too long. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 2018 | The \-c (check) option also checks resolved (after tc |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2019 | expansion) lengths. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2020 | .SH FILES |
| 2021 | .TP |
| 2022 | .I \*d |
| 2023 | compiled terminal description database directory |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2024 | .SH EXTENSIONS |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 2025 | Searching for terminal descriptions in |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2026 | \fI$HOME/.terminfo\fP and \fI\%TERMINFO_DIRS\fP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 2027 | is not supported by older implementations. |
| 2028 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2029 | Some SVr4 \fBcurses\fP implementations, and all previous to SVr4, do not |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2030 | interpret the %A and %O operators in parameter strings. |
| 2031 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2032 | SVr4/XPG4 do not specify whether \fBmsgr\fP licenses movement while in |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2033 | an alternate-character-set mode (such modes may, among other things, map |
| 2034 | CR and NL to characters that do not trigger local motions). |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2035 | The \fI\%ncurses\fP implementation ignores \fBmsgr\fP in |
| 2036 | \fBALTCHARSET\fP mode. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2037 | This raises the possibility that an XPG4 |
| 2038 | implementation making the opposite interpretation may need terminfo |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2039 | entries made for \fI\%ncurses\fP to have \fBmsgr\fP turned off. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2040 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2041 | The \fI\%ncurses\fP library handles insert-character and |
| 2042 | insert-character modes in a slightly non-standard way to get better |
| 2043 | update efficiency. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2044 | See |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2045 | the \fBInsert/Delete Character\fP subsection above. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2046 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2047 | The parameter substitutions for \fBset_clock\fP and \fBdisplay_clock\fP are |
| 2048 | not documented in SVr4 or X/Open Curses. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2049 | They are deduced from the |
| 2050 | documentation for the AT&T 505 terminal. |
| 2051 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2052 | Be careful assigning the \fBkmous\fP capability. |
| 2053 | The \fI\%ncurses\fP library wants to interpret it as \fBKEY_MOUSE\fP, |
| 2054 | for use by terminals and emulators like xterm |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2055 | that can return mouse-tracking information in the keyboard-input stream. |
| 2056 | .PP |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 2057 | X/Open Curses does not mention italics. |
| 2058 | Portable applications must assume that numeric capabilities are |
| 2059 | signed 16-bit values. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2060 | This includes the \fIno_color_video\fP (\fBncv\fP) capability. |
| 2061 | The 32768 mask value used for italics with \fBncv\fP can be confused with |
| 2062 | an absent or cancelled \fBncv\fP. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 2063 | If italics should work with colors, |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2064 | then the \fBncv\fP value must be specified, even if it is zero. |
Steve Kondik | ae271bc | 2015-11-15 02:50:53 +0100 | [diff] [blame] | 2065 | .PP |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2066 | Different commercial ports of \fI\%terminfo\fP and \fIcurses\fP support |
| 2067 | different subsets of X/Open Curses and |
| 2068 | (in some cases) |
| 2069 | different extensions. |
| 2070 | Here is a summary, |
| 2071 | accurate as of October 1995, |
| 2072 | after which the commercial Unix market contracted and lost diversity. |
| 2073 | .bP |
| 2074 | SVr4, |
| 2075 | Solaris, |
| 2076 | and \fI\%ncurses\fP support all SVr4 capabilities. |
| 2077 | .bP |
| 2078 | IRIX supports the SVr4 set and adds one undocumented extended string |
| 2079 | capability (\fB\%set_pglen\fP). |
| 2080 | .bP |
| 2081 | SVr1 and Ultrix support a restricted subset of \fI\%terminfo\fP |
| 2082 | capabilities. |
| 2083 | The Booleans end with \fB\%xon_xoff\fP; |
| 2084 | the numerics with \fB\%width_status_line\fP; |
| 2085 | and the strings with \fB\%prtr_non\fP. |
| 2086 | .bP |
| 2087 | HP/UX supports the SVr1 subset, |
| 2088 | plus the SVr[234] numerics |
| 2089 | \fB\%num_labels\fP, |
| 2090 | \fB\%label_height\fP, |
| 2091 | \fB\%label_width\fP, |
| 2092 | plus function keys 11 through 63, |
| 2093 | plus |
| 2094 | \fB\%plab_norm\fP, |
| 2095 | \fB\%label_on\fP, |
| 2096 | and |
| 2097 | \fB\%label_off\fP, |
| 2098 | plus a number of incompatible string table extensions. |
| 2099 | .bP |
| 2100 | AIX supports the SVr1 subset, |
| 2101 | plus function keys 11 through 63, |
| 2102 | plus a number of incompatible string table extensions. |
| 2103 | .bP |
| 2104 | OSF/1 supports both the SVr4 set and the AIX extensions. |
| 2105 | .SH PORTABILITY |
| 2106 | Do not count on compiled (binary) \fI\%terminfo\fP entries being |
| 2107 | portable between commercial Unix systems. |
| 2108 | At least two implementations of \fI\%terminfo\fP |
| 2109 | (those of HP-UX and AIX) |
| 2110 | diverged from those of other System V Unices after SVr1, |
| 2111 | adding extension capabilities to the string table that |
| 2112 | (in the binary format) |
| 2113 | collide with subsequent System V and X/Open Curses extensions. |
Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 2114 | .SH AUTHORS |
| 2115 | Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey. |
micky387 | 9b9f5e7 | 2025-07-08 18:04:53 -0400 | [diff] [blame] | 2116 | Based on \fIpcurses\fP by Pavel Curtis. |
| 2117 | .SH SEE ALSO |
| 2118 | \fB\%@INFOCMP@\fP(1M), |
| 2119 | \fB\%@TABS@\fP(1), |
| 2120 | \fB\%@TIC@\fP(1M), |
| 2121 | \fB\%curses\fP(3X), |
| 2122 | \fB\%curs_color\fP(3X), |
| 2123 | \fB\%curs_terminfo\fP(3X), |
| 2124 | \fB\%curs_variables\fP(3X), |
| 2125 | \fB\%printf\fP(3), |
| 2126 | \fB\%term_variables\fP(3X), |
| 2127 | \fB\%term\fP(5), |
| 2128 | \fB\%user_caps\fP(5) |