]> ncurses.scripts.mit.edu Git - ncurses.git/blob - man/curs_terminfo.3x
ncurses 6.4 - patch 20231125
[ncurses.git] / man / curs_terminfo.3x
1 '\" t
2 .\"***************************************************************************
3 .\" Copyright 2018-2022,2023 Thomas E. Dickey                                *
4 .\" Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
5 .\"                                                                          *
6 .\" Permission is hereby granted, free of charge, to any person obtaining a  *
7 .\" copy of this software and associated documentation files (the            *
8 .\" "Software"), to deal in the Software without restriction, including      *
9 .\" without limitation the rights to use, copy, modify, merge, publish,      *
10 .\" distribute, distribute with modifications, sublicense, and/or sell       *
11 .\" copies of the Software, and to permit persons to whom the Software is    *
12 .\" furnished to do so, subject to the following conditions:                 *
13 .\"                                                                          *
14 .\" The above copyright notice and this permission notice shall be included  *
15 .\" in all copies or substantial portions of the Software.                   *
16 .\"                                                                          *
17 .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
18 .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
19 .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
20 .\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
21 .\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
22 .\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
23 .\" THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
24 .\"                                                                          *
25 .\" Except as contained in this notice, the name(s) of the above copyright   *
26 .\" holders shall not be used in advertising or otherwise to promote the     *
27 .\" sale, use or other dealings in this Software without prior written       *
28 .\" authorization.                                                           *
29 .\"***************************************************************************
30 .\"
31 .\" $Id: curs_terminfo.3x,v 1.119 2023/11/25 14:32:36 tom Exp $
32 .TH curs_terminfo 3X 2023-11-25 "ncurses 6.4" "Library calls"
33 .ie \n(.g \{\
34 .ds `` \(lq
35 .ds '' \(rq
36 .\}
37 .el \{\
38 .ie t .ds `` ``
39 .el   .ds `` ""
40 .ie t .ds '' ''
41 .el   .ds '' ""
42 .\}
43 .
44 .de bP
45 .ie n  .IP \(bu 4
46 .el    .IP \(bu 2
47 ..
48 .
49 .SH NAME
50 \fB\%del_curterm\fP,
51 \fB\%mvcur\fP,
52 \fB\%putp\fP,
53 \fB\%restartterm\fP,
54 \fB\%set_curterm\fP,
55 \fB\%setupterm\fP,
56 \fB\%tigetflag\fP,
57 \fB\%tigetnum\fP,
58 \fB\%tigetstr\fP,
59 \fB\%tiparm\fP,
60 \fB\%tiparm_s\fP,
61 \fB\%tiscan_s\fP,
62 \fB\%tparm\fP,
63 \fB\%tputs\fP,
64 \fB\%vid_attr\fP,
65 \fB\%vid_puts\fP,
66 \fB\%vidattr\fP,
67 \fB\%vidputs\fP \-
68 \fIcurses\fR interfaces to \fIterminfo\fR database
69 .SH SYNOPSIS
70 .nf
71 \fB#include <curses.h>
72 \fB#include <term.h>
73 .PP
74 \fBTERMINAL *cur_term;
75 .PP
76 \fBconst char * const boolnames[];
77 \fBconst char * const boolcodes[];
78 \fBconst char * const boolfnames[];
79 \fBconst char * const numnames[];
80 \fBconst char * const numcodes[];
81 \fBconst char * const numfnames[];
82 \fBconst char * const strnames[];
83 \fBconst char * const strcodes[];
84 \fBconst char * const strfnames[];
85 .PP
86 \fBint setupterm(const char *\fIterm\fP, int \fIfiledes\fP, int *\fIerrret\fP);
87 \fBTERMINAL *set_curterm(TERMINAL *\fInterm\fP);
88 \fBint del_curterm(TERMINAL *\fIoterm\fP);
89 \fBint restartterm(const char *\fIterm\fP, int \fIfiledes\fP, int *\fIerrret\fP);
90 .PP
91 \fBchar *tparm(const char *\fIstr\fP, ...);
92         \fIor
93 \fBchar *tparm(const char *\fIstr\fP, long \fIp1 ... \fPlong \fIp9\fP);
94 .PP
95 \fBint tputs(const char *\fIstr\fP, int \fIaffcnt\fP, int (*\fIputc\fP)(int));
96 \fBint putp(const char *\fIstr\fP);
97 .PP
98 \fBint vidputs(chtype \fIattrs\fP, int (*\fIputc\fP)(int));
99 \fBint vidattr(chtype \fIattrs\fP);
100 \fBint vid_puts(attr_t \fIattrs\fP, short \fIpair\fP, void *\fIopts\fP, int (*\fIputc\fP)(int));
101 \fBint vid_attr(attr_t \fIattrs\fP, short \fIpair\fP, void *\fIopts\fP);
102 .PP
103 \fBint mvcur(int \fIoldrow\fP, int \fIoldcol\fP, int \fInewrow\fP, int \fInewcol\fP);
104 .PP
105 \fBint tigetflag(const char *\fIcapname\fP);
106 \fBint tigetnum(const char *\fIcapname\fP);
107 \fBchar *tigetstr(const char *\fIcapname\fP);
108 .PP
109 \fBchar *tiparm(const char *\fIstr\fP, ...);
110 .PP
111 \fI/* extensions */
112 \fBchar *tiparm_s(int \fIexpected\fP, int \fImask\fP, const char *\fIstr\fP, ...);
113 \fBint tiscan_s(int *\fIexpected\fP, int *\fImask\fP, const char *\fIstr\fP);
114 .fi
115 .SH DESCRIPTION
116 These low-level routines must be called by programs that have to deal
117 directly with the \fIterminfo\fP database to handle certain terminal
118 capabilities, such as programming function keys.
119 For all other
120 functionality, \fIcurses\fP routines are more suitable and their use is
121 recommended.
122 .PP
123 None of these functions use (or are aware of) multibyte character strings
124 such as UTF-8:
125 .bP
126 capability names use the POSIX portable character set
127 .bP
128 capability string values have no associated encoding;
129 they are strings of 8-bit characters.
130 .SS Initialization
131 Initially, \fBsetupterm\fP should be called.
132 The high-level curses functions \fBinitscr\fP and
133 \fBnewterm\fP call \fBsetupterm\fP to initialize the
134 low-level set of terminal-dependent variables
135 [listed in \fBterminfo\fP(5)].
136 .PP
137 Applications can use the
138 terminal capabilities either directly (via header definitions),
139 or by special functions.
140 The header files \fBcurses.h\fP and \fBterm.h\fP should be included (in this
141 order) to get the definitions for these strings, numbers, and flags.
142 .PP
143 The \fBterminfo\fP variables
144 \fBlines\fP and \fBcolumns\fP are initialized by \fBsetupterm\fP as
145 follows:
146 .bP
147 If \fBuse_env(FALSE)\fP has been called, values for
148 \fBlines\fP and \fBcolumns\fP specified in \fBterminfo\fP are used.
149 .bP
150 Otherwise, if the environment variables \fBLINES\fP and \fBCOLUMNS\fP
151 exist, their values are used.
152 If these environment variables do not
153 exist and the program is running in a window, the current window size
154 is used.
155 Otherwise, if the environment variables do not exist, the
156 values for \fBlines\fP and \fBcolumns\fP specified in the
157 \fBterminfo\fP database are used.
158 .PP
159 Parameterized strings should be passed through \fBtparm\fP to instantiate them.
160 All \fBterminfo\fP strings
161 (including the output of \fBtparm\fP)
162 should be printed
163 with \fBtputs\fP or \fBputp\fP.
164 Call \fBreset_shell_mode\fP to restore the
165 tty modes before exiting [see \fBcurs_kernel\fP(3X)].
166 .PP
167 Programs which use
168 cursor addressing should
169 .bP
170 output \fBenter_ca_mode\fP upon startup and
171 .bP
172 output \fBexit_ca_mode\fP before exiting.
173 .PP
174 Programs which execute shell subprocesses should
175 .bP
176 call \fBreset_shell_mode\fP and
177 output \fBexit_ca_mode\fP before the shell
178 is called and
179 .bP
180 output \fBenter_ca_mode\fP and
181 call \fBreset_prog_mode\fP after returning from the shell.
182 .PP
183 The \fBsetupterm\fP routine reads in the \fBterminfo\fP database,
184 initializing the \fBterminfo\fP structures, but does not set up the
185 output virtualization structures used by \fBcurses\fP.
186 These are its parameters:
187 .RS 3
188 .TP 5
189 \fIterm\fP
190 is the terminal type, a character string.
191 If \fIterm\fP is null, the environment variable \fBTERM\fP is used.
192 .TP 5
193 \fIfiledes\fP
194 is the file descriptor used for getting and setting terminal I/O modes.
195 .IP
196 Higher-level applications use \fBnewterm\fP(3X) for initializing the terminal,
197 passing an output \fIstream\fP rather than a \fIdescriptor\fP.
198 In curses, the two are the same because \fBnewterm\fP calls \fBsetupterm\fP,
199 passing the file descriptor derived from its output stream parameter.
200 .TP 5
201 \fIerrret\fP
202 points to an optional location where an error status can be returned to
203 the caller.
204 If \fIerrret\fP is not null,
205 then \fBsetupterm\fP returns \fBOK\fP or
206 \fBERR\fP and stores a status value in the integer pointed to by
207 \fIerrret\fP.
208 A return value of \fBOK\fP combined with status of \fB1\fP in \fIerrret\fP
209 is normal.
210 .IP
211 If \fBERR\fP is returned, examine \fIerrret\fP:
212 .RS
213 .TP 5
214 .B 1
215 means that the terminal is hardcopy, cannot be used
216 for \fIcurses\fP applications.
217 .IP
218 \fB\%setupterm\fP determines if the entry is a hardcopy type by
219 checking the \fBhc\fP (\fBhardcopy\fP) capability.
220 .TP 5
221 .B 0
222 means that the terminal could not be found,
223 or that it is a generic type,
224 having too little information for \fIcurses\fP applications to run.
225 .IP
226 \fB\%setupterm\fP determines if the entry is a generic type by
227 checking the \fBgn\fP \%(\fBgeneric_type\fP) capability.
228 .TP 5
229 .B \-1
230 means that the \fIterminfo\fP database could not be found.
231 .RE
232 .IP
233 If \fIerrret\fP is
234 null, \fB\%setupterm\fP prints an error message upon finding an error
235 and exits.
236 Thus, the simplest call is:
237 .IP
238 \fBsetupterm((char *)0, 1, (int *)0);\fP,
239 .PP
240 which uses all the defaults and sends the output to \fBstdout\fP.
241 .RE
242 .\" ***************************************************************************
243 .SS The Terminal State
244 The \fBsetupterm\fP routine stores its information about the terminal
245 in a \fBTERMINAL\fP structure pointed to by the global variable \fBcur_term\fP.
246 If it detects an error,
247 or decides that the terminal is unsuitable (hardcopy or generic),
248 it discards this information,
249 making it not available to applications.
250 .PP
251 If \fBsetupterm\fP is called repeatedly for the same terminal type,
252 it will reuse the information.
253 It maintains only one copy of a given terminal's capabilities in memory.
254 If it is called for different terminal types,
255 \fBsetupterm\fP allocates new storage for each set of terminal capabilities.
256 .PP
257 The \fBset_curterm\fP routine sets \fBcur_term\fP to
258 \fInterm\fP, and makes all of the \fBterminfo\fP boolean, numeric, and
259 string variables use the values from \fInterm\fP.
260 It returns the old value of \fBcur_term\fP.
261 .PP
262 The \fBdel_curterm\fP routine frees the space pointed to by
263 \fIoterm\fP and makes it available for further use.
264 If \fIoterm\fP is
265 the same as \fBcur_term\fP, references to any of the \fBterminfo\fP
266 boolean, numeric, and string variables thereafter may refer to invalid
267 memory locations until another \fBsetupterm\fP has been called.
268 .PP
269 The \fBrestartterm\fP routine is similar to \fBsetupterm\fP and \fBinitscr\fP,
270 except that it is called after restoring memory to a previous state (for
271 example, when reloading a game saved as a core image dump).
272 \fBrestartterm\fP assumes that the windows and the input and output options
273 are the same as when memory was saved,
274 but the terminal type and baud rate may be different.
275 Accordingly, \fBrestartterm\fP saves various tty state bits,
276 calls \fBsetupterm\fP, and then restores the bits.
277 .\" ***************************************************************************
278 .SS Formatting Output
279 The \fBtparm\fP routine instantiates the string \fIstr\fP with
280 parameters \fIpi\fP.  A pointer is returned to the result of \fIstr\fP
281 with the parameters applied.
282 Application developers should keep in mind these quirks of the interface:
283 .bP
284 Although \fBtparm\fP's actual parameters may be integers or strings,
285 the prototype expects \fBlong\fP (integer) values.
286 .bP
287 Aside from the \fBset_attributes\fP (\fBsgr\fP) capability,
288 most terminal capabilities require no more than one or two parameters.
289 .bP
290 Padding information is ignored by \fBtparm\fP;
291 it is interpreted by \fBtputs\fP.
292 .bP
293 The capability string is null-terminated.
294 Use \*(``\e200\*('' where an ASCII NUL is needed in the output.
295 .PP
296 \fBtiparm\fP is a newer form of \fBtparm\fP which uses \fI<stdarg.h>\fP
297 rather than a fixed-parameter list.
298 Its numeric parameters are integers (int) rather than longs.
299 .PP
300 Both \fBtparm\fP and \fBtiparm\fP assume that the application passes
301 parameters consistent with the terminal description.
302 Two extensions are provided as alternatives to deal with untrusted data:
303 .bP
304 \fBtiparm_s\fP is an extension which is a safer formatting function
305 than \fBtparm\fR or \fBtiparm\fR,
306 because it allows the developer to tell the curses
307 library how many parameters to expect in the parameter list,
308 and which may be string parameters.
309 .IP
310 The \fImask\fP parameter has one bit set for each of the parameters
311 (up to 9) which will be passed as char* rather than numbers.
312 .bP
313 The extension \fBtiscan_s\fP allows the application
314 to inspect a formatting capability to see what the curses library would assume.
315 .\" ***************************************************************************
316 .SS Output Functions
317 String capabilities can contain padding information,
318 a time delay
319 (accommodating performance limitations of hardware terminals)
320 expressed as \fB$<\fIn\fB>\fR,
321 where \fIn\fP is a nonnegative integral count of milliseconds.
322 If \fIn\fP exceeds 30,000
323 (thirty seconds),
324 it is capped at that value.
325 .PP
326 The \fBtputs\fP routine interprets time-delay information in the string
327 \fIstr\fP and outputs it, executing the delays:
328 .bP
329 The \fIstr\fP parameter must be a terminfo string
330 variable or the return value from
331 \fBtparm\fP, \fBtiparm\fP, \fBtgetstr\fP, or \fBtgoto\fP.
332 .IP
333 The \fBtgetstr\fP and \fBtgoto\fP functions are part of the \fItermcap\fP
334 interface,
335 which happens to share this function name with the \fIterminfo\fP interface.
336 .bP
337 \fIaffcnt\fP is the number of lines affected, or 1 if
338 not applicable.
339 .bP
340 \fIputc\fP is a \fBputchar\fP-like routine to which
341 the characters are passed, one at a time.
342 .IP
343 If \fBtputs\fP processes a time-delay,
344 it uses the \fBdelay_output\fP(3X) function,
345 routing any resulting padding characters through this function.
346 .PP
347 The \fBputp\fR routine calls \fBtputs(\fIstr\fB, 1, putchar)\fR.
348 The output of \fBputp\fP always goes to \fBstdout\fP, rather than
349 the \fIfiledes\fP specified in \fBsetupterm\fP.
350 .PP
351 The \fBvidputs\fP routine displays the string on the terminal in the
352 video attribute mode \fIattrs\fP, which is any combination of the
353 attributes listed in \fBcurses\fP(3X).
354 The characters are passed to
355 the \fBputchar\fP-like routine \fIputc\fP.
356 .PP
357 The \fBvidattr\fP routine is like the \fBvidputs\fP routine, except
358 that it outputs through \fBputchar\fP.
359 .PP
360 The \fBvid_attr\fP and \fBvid_puts\fP routines correspond
361 to vidattr and vidputs, respectively.
362 They use a set of arguments for representing the video attributes plus color,
363 i.e.,
364 .bP
365 \fIattrs\fP of type \fBattr_t\fP for the attributes and
366 .bP
367 \fIpair\fP of type \fBshort\fP for the color-pair number.
368 .PP
369 The \fBvid_attr\fP and \fBvid_puts\fP routines
370 are designed to use the attribute constants with the \fBWA_\fP prefix.
371 .PP
372 X/Open Curses reserves the \fIopts\fP argument for future use,
373 saying that applications must provide a null pointer for that argument.
374 As an extension,
375 this implementation allows \fIopts\fP to be used as a pointer to \fBint\fP,
376 which overrides the \fIpair\fP (\fBshort\fP) argument.
377 .PP
378 The \fBmvcur\fP routine provides low-level cursor motion.
379 It takes effect immediately (rather than at the next refresh).
380 Unlike the other low-level output functions,
381 which either write to the standard output or pass an output function parameter,
382 \fBmvcur\fP uses an output file descriptor derived from
383 the output stream parameter of \fBnewterm\fP(3X).
384 .PP
385 While \fBputp\fP and \fBmvcur\fP are low-level functions which
386 do not use the high-level curses state,
387 they are declared in \fB\%<curses.h>\fP because System\ V did this
388 (see \fIHISTORY\fP).
389 .\" ***************************************************************************
390 .SS Terminal Capability Functions
391 The \fBtigetflag\fP, \fBtigetnum\fP and \fBtigetstr\fP routines return
392 the value of the capability corresponding to the \fBterminfo\fP
393 \fIcapname\fP passed to them, such as \fBxenl\fP.
394 The \fIcapname\fP for each capability is given in the table column entitled
395 \fIcapname\fP code in the capabilities section of \fBterminfo\fP(5).
396 .PP
397 These routines return special values to denote errors.
398 .PP
399 The \fBtigetflag\fP routine returns
400 .TP
401 \fB\-1\fP
402 if \fIcapname\fP is not a boolean capability,
403 or
404 .TP
405 \fB0\fP
406 if it is canceled or absent from the terminal description.
407 .PP
408 The \fBtigetnum\fP routine returns
409 .TP
410 \fB\-2\fP
411 if \fIcapname\fP is not a numeric capability, or
412 .TP
413 \fB\-1\fP
414 if it is canceled or absent from the terminal description.
415 .PP
416 The \fBtigetstr\fP routine returns
417 .TP
418 \fB(char *)\-1\fP
419 if \fIcapname\fP is not a string capability,
420 or
421 .TP
422 \fB0\fP
423 if it is canceled or absent from the terminal description.
424 .\" ***************************************************************************
425 .SS Terminal Capability Names
426 These null-terminated arrays contain
427 .bP
428 the short \fIterminfo\fP names (\*(``codes\*(''),
429 .bP
430 the \fItermcap\fP names (\*(``names\*(''), and
431 .bP
432 the long \fIterminfo\fP names (\*(``fnames\*('')
433 .PP
434 for each of the predefined \fIterminfo\fP variables:
435 .PP
436 .RS
437 .nf
438 \fBconst char *boolnames[]\fP, \fB*boolcodes[]\fP, \fB*boolfnames[]\fP
439 \fBconst char *numnames[]\fP, \fB*numcodes[]\fP, \fB*numfnames[]\fP
440 \fBconst char *strnames[]\fP, \fB*strcodes[]\fP, \fB*strfnames[]\fP
441 .fi
442 .RE
443 .\" ***************************************************************************
444 .SS Releasing Memory
445 Each successful call to \fBsetupterm\fP allocates memory to hold the terminal
446 description.
447 As a side-effect, it sets \fBcur_term\fP to point to this memory.
448 If an application calls
449 .IP
450 \fBdel_curterm(cur_term);\fP
451 .PP
452 the memory will be freed.
453 .PP
454 The formatting functions \fBtparm\fP and \fBtiparm\fP extend the storage
455 allocated by \fBsetupterm\fP:
456 .bP
457 the \*(``static\*('' terminfo variables [a-z].
458 Before ncurses 6.3, those were shared by all screens.
459 With ncurses 6.3, those are allocated per screen.
460 See \fBterminfo\fP(5) for details.
461 .bP
462 to improve performance, ncurses 6.3 caches the result of analyzing terminfo
463 strings for their parameter types.
464 That is stored as a binary tree referenced from the \fBTERMINAL\fP structure.
465 .PP
466 The higher-level \fBinitscr\fP and \fBnewterm\fP functions use \fBsetupterm\fP.
467 Normally they do not free this memory, but it is possible to do that using
468 the \fBdelscreen\fP(3X) function.
469 .\" ***************************************************************************
470 .SH RETURN VALUE
471 Routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
472 (SVr4 only specifies \*(``an integer value other than \fBERR\fP\*('')
473 upon successful completion,
474 unless otherwise noted in the preceding routine descriptions.
475 .PP
476 Routines that return pointers always return \fBNULL\fP on error.
477 .PP
478 X/Open defines no error conditions.
479 In this implementation
480 .RS 3
481 .TP 5
482 \fBdel_curterm\fP
483 returns an error
484 if its terminal parameter is null.
485 .TP 5
486 \fBputp\fP
487 calls \fBtputs\fP, returning the same error-codes.
488 .TP 5
489 \fBrestartterm\fP
490 returns an error
491 if the associated call to \fBsetupterm\fP returns an error.
492 .TP 5
493 \fBsetupterm\fP
494 returns an error
495 if it cannot allocate enough memory, or
496 create the initial windows (stdscr, curscr, newscr).
497 Other error conditions are documented above.
498 .TP 5
499 \fBtparm\fP
500 returns a null if the capability would require unexpected parameters,
501 e.g., too many, too few, or incorrect types
502 (strings where integers are expected, or vice versa).
503 .TP 5
504 \fBtputs\fP
505 returns an error if the string parameter is null.
506 It does not detect I/O errors:
507 X/Open states that \fBtputs\fP ignores the return value
508 of the output function \fIputc\fP.
509 .RE
510 .\" ***************************************************************************
511 .SH NOTES
512 X/Open notes that \fBvidattr\fP and \fBvidputs\fP may be macros.
513 .\" ***************************************************************************
514 .SH EXTENSIONS
515 The functions marked as extensions were designed for \fBncurses\fP(3X),
516 and are not found in SVr4 curses, 4.4BSD curses,
517 or any other previous version of curses.
518 .\" ***************************************************************************
519 .SH PORTABILITY
520 The function \fBsetterm\fP is not described by X/Open and must
521 be considered non-portable.
522 All other functions are as described by X/Open.
523 .SS Compatibility macros
524 This implementation provides a few macros for compatibility with systems
525 before SVr4 (see \fIHISTORY\fP).
526 Those include
527 \fBcrmode\fP,
528 \fBfixterm\fP,
529 \fBgettmode\fP,
530 \fBnocrmode\fP,
531 \fBresetterm\fP,
532 \fBsaveterm\fP, and
533 \fBsetterm\fP.
534 .PP
535 In SVr4, those are found in \fB<curses.h>\fP,
536 but except for \fBsetterm\fP, are likewise macros.
537 The one function, \fBsetterm\fP, is mentioned in the manual page.
538 The manual page notes that the \fBsetterm\fP routine
539 was replaced by \fB\%setupterm\fP, stating that the call
540 .IP
541 \fBsetupterm(\fIterm\fB, 1, (int *)0)\fR
542 .PP
543 provides the same functionality as \fBsetterm(\fIterm\fB)\fR,
544 and is not recommended for new programs.
545 This implementation provides each of those symbols
546 as macros for BSD compatibility.
547 .SS Legacy data
548 \fBsetupterm\fP copies the terminal name to the array \fBttytype\fP.
549 This is not part of X/Open Curses, but is assumed by some applications.
550 .PP
551 Other implementions may not declare the capability name arrays.
552 Some provide them without declaring them.
553 X/Open does not specify them.
554 .PP
555 Extended terminal capability names, e.g., as defined by \fB@TIC@\ \-x\fP,
556 are not stored in the arrays described here.
557 .SS Output buffering
558 Older versions of \fBncurses\fP assumed that the file descriptor passed to
559 \fBsetupterm\fP from \fBinitscr\fP or \fBnewterm\fP uses buffered I/O,
560 and would write to the corresponding stream.
561 In addition to the limitation that the terminal was left in block-buffered
562 mode on exit (like System V curses),
563 it was problematic because \fBncurses\fP
564 did not allow a reliable way to cleanup on receiving SIGTSTP.
565 .PP
566 The current version (ncurses6)
567 uses output buffers managed directly by \fBncurses\fP.
568 Some of the low-level functions described in this manual page write
569 to the standard output.
570 They are not signal-safe.
571 The high-level functions in \fBncurses\fP use
572 alternate versions of these functions
573 using the more reliable buffering scheme.
574 .SS Function prototypes
575 The X/Open Curses prototypes are based on the SVr4 curses header declarations,
576 which were defined at the same time the C language was first standardized in
577 the late 1980s.
578 .bP
579 X/Open Curses uses \fBconst\fP less effectively than a later design might,
580 in some cases applying it needlessly to values are already constant,
581 and in most cases overlooking parameters which normally would use \fBconst\fP.
582 Using constant parameters for functions which do not use \fBconst\fP
583 may prevent the program from compiling.
584 On the other hand, \fIwritable strings\fP are an obsolescent feature.
585 .IP
586 As an extension, this implementation can be configured to change the
587 function prototypes to use the \fBconst\fP keyword.
588 The \fIncurses\fP ABI 6 enables this feature by default.
589 .bP
590 X/Open Curses prototypes \fBtparm\fP with a fixed number of parameters,
591 rather than a variable argument list.
592 .IP
593 This implementation uses a variable argument list, but can be
594 configured to use the fixed-parameter list.
595 Portable applications should provide 9 parameters after the format;
596 zeroes are fine for this purpose.
597 .IP
598 In response to review comments by Thomas E. Dickey,
599 X/Open Curses Issue 7 proposed the \fBtiparm\fP function in mid-2009.
600 .IP
601 While \fBtiparm\fP is always provided in ncurses,
602 the older form is only available as a build-time configuration option.
603 If not specially configured, \fBtparm\fP is the same as \fBtiparm\fP.
604 .PP
605 Both forms of \fBtparm\fP have drawbacks:
606 .bP
607 Most of the calls to \fBtparm\fP use only one or two parameters.
608 Passing nine on each call is awkward.
609 .IP
610 Using \fBlong\fP for the numeric parameter type is a workaround
611 to make the parameter use the same amount of stack as a pointer.
612 That approach dates back to the mid-1980s, before C was standardized.
613 Since then, there is a standard
614 (and pointers are not required to fit in a long).
615 .bP
616 Providing the right number of parameters for a variadic function
617 such as \fBtiparm\fP can be a problem, in particular for string parameters.
618 However, only a few terminfo capabilities use string parameters
619 (e.g., the ones used for programmable function keys).
620 .IP
621 The ncurses library checks usage of these capabilities,
622 and returns an error if the capability mishandles string parameters.
623 But it cannot check if a calling program provides strings in the right
624 places for the \fBtparm\fP calls.
625 .IP
626 The \fB@TPUT@\fR(1) program checks its use of these capabilities with a table,
627 so that it calls \fBtparm\fP correctly.
628 .SS Special TERM treatment
629 If configured to use the terminal-driver,
630 e.g., for the MinGW port,
631 .bP
632 \fBsetupterm\fP interprets a missing/empty TERM variable as the
633 special value \*(``unknown\*(''.
634 .IP
635 SVr4 curses uses the
636 special value \*(``dumb\*(''.
637 .IP
638 The difference between the two is that
639 the former uses the \fBgn\fP (\fBgeneric_type\fR) terminfo capability,
640 while the latter does not.
641 A generic terminal is unsuitable for full-screen applications.
642 .bP
643 \fBsetupterm\fP allows explicit use of the
644 the windows console driver by checking if $TERM is set to
645 \*(``#win32con\*('' or an abbreviation of that string.
646 .SS Other portability issues
647 In System V Release 4, \fBset_curterm\fP has an \fBint\fP return type and
648 returns \fBOK\fP or \fBERR\fP.  We have chosen to implement the X/Open Curses
649 semantics.
650 .PP
651 In System V Release 4, the third argument of \fBtputs\fP has the type
652 \fBint (*putc)(char)\fP.
653 .PP
654 At least one implementation of X/Open Curses (Solaris) returns a value
655 other than \fBOK\fP/\fBERR\fP from \fBtputs\fP.
656 That returns the length of the string, and does no error-checking.
657 .PP
658 X/Open notes that after calling \fBmvcur\fP, the curses state may not match the
659 actual terminal state, and that an application should touch and refresh
660 the window before resuming normal curses calls.
661 Both \fBncurses\fP and System V Release 4 curses implement \fBmvcur\fP using
662 the SCREEN data allocated in either \fBinitscr\fP or \fBnewterm\fP.
663 So though it is documented as a terminfo function,
664 \fBmvcur\fP is really a curses function which is not well specified.
665 .PP
666 X/Open states that the old location must be given for \fBmvcur\fP.
667 This implementation allows the caller to use \-1's for the old ordinates.
668 In that case, the old location is unknown.
669 .\" ***************************************************************************
670 .SH HISTORY
671 SVr2 introduced the terminfo feature.
672 Its programming manual mentioned the following low-level functions.
673 .PP
674 .TS
675 lB lB
676 lB lx.
677 Function        Description
678 _
679 fixterm restore tty to \*(``in curses\*('' state
680 gettmode        establish current tty modes
681 mvcur   low level cursor motion
682 putp    T{
683 utility function that uses \fBtputs\fP to send characters via \fBputchar\fP.
684 T}
685 resetterm       set tty modes to \*(``out of curses\*('' state
686 resetty reset tty flags to stored value
687 saveterm        save current modes as \*(``in curses\*('' state
688 savetty store current tty flags
689 setterm establish terminal with given type
690 setupterm       establish terminal with given type
691 tparm   instantiate a string expression with parameters
692 tputs   apply padding information to a string
693 vidattr like \fBvidputs\fP, but outputs through \fBputchar\fP
694 vidputs T{
695 output a string to put terminal in a specified video attribute mode
696 T}
697 .TE
698 .PP
699 The programming manual also mentioned
700 functions provided for \fItermcap\fP compatibility
701 (commenting that they \*(``may go away at a later date\*('').
702 .PP
703 .TS
704 lB lB
705 lB lx.
706 Function        Description
707 _
708 tgetent look up \fItermcap\fP entry for given \fIname\fP
709 tgetflag        get boolean entry for given \fIid\fP
710 tgetnum get numeric entry for given \fIid\fP
711 tgetstr get string entry for given \fIid\fP
712 tgoto   apply parameters to given capability
713 tputs   T{
714 apply padding to capability, calling a function to put characters
715 T}
716 .TE
717 .PP
718 Early terminfo programs obtained capability values from the
719 \fBTERMINAL\fP structure initialized by \fBsetupterm\fP.
720 .PP
721 SVr3 extended terminfo by adding functions to retrieve capability values
722 (like the termcap interface),
723 and reusing \fBtgoto\fP and \fBtputs\fP:
724 .PP
725 .TS
726 lB lB
727 lB lx.
728 Function        Description
729 _
730 tigetflag       get boolean entry for given \fIid\fP
731 tigetnum        get numeric entry for given \fIid\fP
732 tigetstr        get string entry for given \fIid\fP
733 .TE
734 .PP
735 SVr3 also replaced several of the SVr2 \fIterminfo\fP functions
736 which had no counterpart in the \fItermcap\fP interface,
737 documenting them as obsolete.
738 .PP
739 .TS
740 lB lB
741 l  lx.
742 Function        Replaced by
743 _
744 crmode  cbreak
745 fixterm reset_prog_mode
746 gettmode        \fIn/a\fP
747 nocrmode        nocbreak
748 resetterm       reset_shell_mode
749 saveterm        def_prog_mode
750 setterm setupterm
751 .TE
752 .PP
753 SVr3 kept the \fBmvcur\fP, \fBvidattr\fP and \fBvidputs\fP functions,
754 along with \fBputp\fP, \fBtparm\fP and \fBtputs\fP.
755 The latter were needed to support padding,
756 and handling functions such as \fBvidattr\fP
757 (which used more than the two parameters supported by \fBtgoto\fP).
758 .PP
759 SVr3 introduced the functions for switching between terminal
760 descriptions, e.g., \fBset_curterm\fP.
761 Some of that was incremental improvements to the SVr2 library:
762 .bP
763 The \fBTERMINAL\fP type definition was introduced in SVr3.01,
764 for the \fBterm\fP structure provided in SVr2.
765 .bP
766 The various global variables such as \fBboolnames\fP were mentioned
767 in the programming manual at this point,
768 though the variables were provided in SVr2.
769 .PP
770 SVr4 added the \fBvid_attr\fP and \fBvid_puts\fP functions.
771 .PP
772 There are other low-level functions declared in the \fIcurses\fP header files
773 on Unix systems,
774 but none were documented.
775 The functions marked \*(``obsolete\*('' remained in use
776 by the Unix \fBvi\fP(1) editor.
777 .SH SEE ALSO
778 \fB\%curses\fP(3X),
779 \fB\%curs_initscr\fP(3X),
780 \fB\%curs_kernel\fP(3X),
781 \fB\%curs_memleaks\fP(3X),
782 \fB\%curs_termcap\fP(3X),
783 \fB\%curs_variables\fP(3X),
784 \fB\%putc\fP(3),
785 \fB\%term_variables\fP(3X),
786 \fB\%terminfo\fP(5)