diff options
author | Thorsten Lockert <tholo@cvs.openbsd.org> | 1996-06-02 06:06:27 +0000 |
---|---|---|
committer | Thorsten Lockert <tholo@cvs.openbsd.org> | 1996-06-02 06:06:27 +0000 |
commit | 97548ea6b6ae9322fb78df90b7633d40df4e11df (patch) | |
tree | ab5a82d85a6c89f0dfdb1e44cc10cc6d80167d0c /lib/libcurses | |
parent | 4eae3aa9e113650162ffb0bbb09e47503936e77e (diff) |
Install ncurses as -lcurses and <curses.h>
Install BSD curses library as -locurses and <ocurses.h>
Diffstat (limited to 'lib/libcurses')
168 files changed, 15130 insertions, 9897 deletions
diff --git a/lib/libcurses/EXAMPLES/ex1.c b/lib/libcurses/EXAMPLES/ex1.c deleted file mode 100644 index 76da41b4d9b..00000000000 --- a/lib/libcurses/EXAMPLES/ex1.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1992, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)ex1.c 8.1 (Berkeley) 6/4/93"; -#endif /* not lint */ -#include <sys/types.h> -#include <curses.h> -#include <stdio.h> -#include <signal.h> - - -#define YSIZE 10 -#define XSIZE 20 - -int quit(); - -main() -{ - int i, j, c; - size_t len; - char id[100]; - FILE *fp; - char *s; - - initscr(); /* Always call initscr() first */ - signal(SIGINT, quit); /* Make sure wou have a 'cleanup' fn */ - crmode(); /* We want cbreak mode */ - noecho(); /* We want to have control of chars */ - delwin(stdscr); /* Create our own stdscr */ - stdscr = newwin(YSIZE, XSIZE, 10, 35); - flushok(stdscr, TRUE); /* Enable flushing of stdout */ - scrollok(stdscr, TRUE); /* Enable scrolling */ - erase(); /* Initially, clear the screen */ - - standout(); - move(0,0); - while (1) { - c = getchar(); - switch(c) { - case 'q': /* Quit on 'q' */ - quit(); - break; - case 's': /* Go into standout mode on 's' */ - standout(); - break; - case 'e': /* Exit standout mode on 'e' */ - standend(); - break; - case 'r': /* Force a refresh on 'r' */ - wrefresh(curscr); - break; - default: /* By default output the character */ - addch(c); - refresh(); - } - } -} - - -int -quit() -{ - erase(); /* Terminate by erasing the screen */ - refresh(); - endwin(); /* Always end with endwin() */ - delwin(curscr); /* Return storage */ - delwin(stdscr); - putchar('\n'); - exit(0); -} - - - - diff --git a/lib/libcurses/MKkeyname.awk b/lib/libcurses/MKkeyname.awk new file mode 100644 index 00000000000..4d03ae95e23 --- /dev/null +++ b/lib/libcurses/MKkeyname.awk @@ -0,0 +1,31 @@ + +BEGIN { + print "" + print "#include <stdlib.h>" + print "#include \"curses.h\"" + print "#include \"term.h\"" + print "" + print "struct kn {" + print "\tchar *name;" + print "\tint code;" + print "};" + print "" + print "const struct kn key_names[] = {" +} + +{printf "\t{\"%s\", %s,},\n", $1, $2;} + +END { + print "};" + print "" + print "const char *keyname(int c)" + print "{" + print "int i, size = sizeof(key_names)/sizeof(struct kn);" + print "" + print "\tfor (i = 0; i < size; i++) {" + print "\t\tif (key_names[i].code == c) return key_names[i].name;" + print "\t}" + print "\treturn NULL;" + print "}" + print "" +} diff --git a/lib/libcurses/MKkeys.awk b/lib/libcurses/MKkeys.awk new file mode 100644 index 00000000000..669c455ef54 --- /dev/null +++ b/lib/libcurses/MKkeys.awk @@ -0,0 +1 @@ +{printf "\tadd_to_try(%s, %s);\n", $1, $2;} diff --git a/lib/libcurses/Makefile b/lib/libcurses/Makefile index 408903dbfba..3de99d58687 100644 --- a/lib/libcurses/Makefile +++ b/lib/libcurses/Makefile @@ -1,24 +1,45 @@ -# @(#)Makefile 8.2 (Berkeley) 1/2/94 +LIB= curses +SRCS= hardscroll.c lib_acs.c lib_delch.c lib_insstr.c lib_options.c \ + lib_set_term.c lib_addch.c lib_delwin.c lib_instr.c lib_overlay.c \ + lib_slk.c lib_addstr.c lib_doupdate.c lib_isendwin.c lib_pad.c \ + lib_touch.c lib_beep.c lib_endwin.c lib_kernel.c lib_printw.c \ + lib_tstp.c lib_bkgd.c lib_erase.c lib_longname.c lib_raw.c \ + lib_twait.c lib_box.c lib_getch.c lib_mouse.c lib_refresh.c \ + lib_unctrl.c lib_clear.c lib_getstr.c lib_move.c lib_resize.c \ + lib_vidattr.c lib_clrbot.c lib_inchstr.c lib_mvcur.c lib_scanw.c \ + lib_window.c lib_clreol.c lib_initscr.c lib_mvwin.c lib_screen.c \ + lib_color.c lib_insch.c lib_newterm.c lib_scroll.c lib_data.c \ + lib_insdel.c lib_keyname.c lib_newwin.c lib_scrreg.c +CFLAGS+= -I. -I${.CURDIR} -DTERMIOS -DEXTERN_TERMINFO +LDADD+= -ltermlib +MAN= curs_addch.3 curs_addchstr.3 curs_addstr.3 curs_attr.3 curs_beep.3 \ + curs_bkgd.3 curs_border.3 curs_clear.3 curs_color.3 curs_delch.3 \ + curs_deleteln.3 curs_getch.3 curs_getstr.3 curs_getyx.3 curs_inch.3 \ + curs_inchstr.3 curs_initscr.3 curs_inopts.3 curs_insch.3 curs_insstr.3 \ + curs_instr.3 curs_kernel.3 curs_mouse.3 curs_move.3 curs_outopts.3 \ + curs_overlay.3 curs_pad.3 curs_printw.3 curs_refresh.3 curs_scanw.3 \ + curs_scr_dmp.3 curs_scroll.3 curs_slk.3 curs_termattrs.3 curs_touch.3 \ + curs_util.3 curs_window.3 curses.3 +MLINKS+=curses.3 ncurses.3 +CLEANFILES+= lib_keyname.c keys.tries -CFLAGS+=#-DTFILE=\"/dev/ttyp0\" -CFLAGS+=-D_CURSES_PRIVATE -I${.CURDIR} -LIB= curses -SRCS= addbytes.c addch.c addnstr.c box.c clear.c clrtobot.c clrtoeol.c \ - cr_put.c ctrace.c cur_hash.c curses.c delch.c deleteln.c delwin.c \ - erase.c fullname.c getch.c getstr.c id_subwins.c idlok.c initscr.c \ - insch.c insertln.c longname.c move.c mvwin.c newwin.c overlay.c \ - overwrite.c printw.c putchar.c refresh.c scanw.c scroll.c setterm.c \ - standout.c toucholap.c touchwin.c tscroll.c tstp.c tty.c unctrl.c -MAN= curses.3 +beforedepend: keys.tries includes: - -cd ${.CURDIR}; cmp -s curses.h ${DESTDIR}/usr/include/curses.h > \ - /dev/null 2>&1 || \ - install -c -o ${BINOWN} -g ${BINGRP} -m 444 curses.h \ - ${DESTDIR}/usr/include + @cd ${.CURDIR}; for i in unctrl.h; do \ + cmp -s $$i ${DESTDIR}/usr/include/$$i || \ + install -c -m 444 -o $(BINOWN) -g $(BINGRP) $$i \ + ${DESTDIR}/usr/include; done + @cd ${.CURDIR}; cmp -s curses.h ${DESTDIR}/usr/include/curses.h || \ + install -c -m 444 -o $(BINOWN) -g $(BINGRP) curses.h \ + ${DESTDIR}/usr/include -.if make(install) -SUBDIR+= PSD.doc -.endif +keys.tries: ${.CURDIR}/keys.list ${.CURDIR}/MKkeys.awk + awk -f ${.CURDIR}/MKkeys.awk ${.CURDIR}/keys.list > keys.tries + +lib_keyname.c: ${.CURDIR}/keys.list ${.CURDIR}/MKkeyname.awk + awk -f ${.CURDIR}/MKkeyname.awk ${.CURDIR}/keys.list > lib_keyname.c .include <bsd.lib.mk> + +lib_options.o lib_options.so lib_options.po lib_options.ln: keys.tries diff --git a/lib/libcurses/PSD.doc/Makefile b/lib/libcurses/PSD.doc/Makefile deleted file mode 100644 index 2ab371e08c0..00000000000 --- a/lib/libcurses/PSD.doc/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# @(#)Makefile 8.2 (Berkeley) 5/23/94 - -DIR= psd/19.curses -SRCS= Master -MACROS= -me -EXTRA= appen.A appen.B appen.C c_macros doc.I doc.II doc.III \ - doc.IV ex1.c ex2.c fns.doc intro.0 intro.1 intro.2 intro.3 \ - intro.4 intro.5 intro.6 life.c macros twinkle1.c twinkle2.c \ - win_st.c - -CLEANFILES+=win_st.gr twinkle1.gr twinkle2.gr life.gr intro.2.tbl appen.A.tbl \ - ex1.gr ex2.gr - -.SUFFIXES: -.SUFFIXES: .c .gr - -# -# this section formats C input source into nice troffable (or nroffable) -# versions. It uses the capabilites of "vgrind", which sets keywords in -# bold font, and comments in italics. -# - -# Don't re-run vgrind unless you want to patch the output files. -VFONT= /usr/libexec/vfontedpr -.c.gr: - ${VFONT} $*.c | grep -v "^'wh" > $*.gr - -paper.ps: ${SRCS} - soelim ${SRCS} | ${ROFF} > ${.TARGET} - -Master: twinkle1.gr ex1.gr ex2.gr fns.doc intro.5 intro.2.tbl intro.0 intro.1 \ - intro.3 intro.4 intro.6 macros c_macros - -intro.2.tbl: intro.2 - ${TBL} intro.2 > intro.2.tbl - -.include <bsd.doc.mk> - - diff --git a/lib/libcurses/PSD.doc/Master b/lib/libcurses/PSD.doc/Master deleted file mode 100644 index 12db62b9bfa..00000000000 --- a/lib/libcurses/PSD.doc/Master +++ /dev/null @@ -1,54 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)Master 8.2 (Berkeley) 5/24/94 -.\" -.ds Ln Screen Package -.so macros -.so c_macros -.so intro.0 -.pn 3 -.bp -.so intro.1 -.so intro.2.tbl -.so intro.3 -.so intro.4 -.so intro.5 -.so intro.6 -.bp -.so appen.A -.pn 2 -.oh '\*(Ln''PSD:19-%' -.eh 'PSD:19-%''\*(Ln' -.bp -.bi Contents -.sp -.xp diff --git a/lib/libcurses/PSD.doc/appen.A b/lib/libcurses/PSD.doc/appen.A deleted file mode 100644 index a40c95d7891..00000000000 --- a/lib/libcurses/PSD.doc/appen.A +++ /dev/null @@ -1,77 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)appen.A 8.1 (Berkeley) 6/8/93 -.\" -.ie t .oh '\*(Ln Appendix A''PS1:19-%' -.eh 'PS1:19-%''\*(Ln Appendix A' -.el .he ''\fIAppendix A\fR'' -.bp -.(x -.ti 0 -.b "Appendix A" -.)x -.sh 1 "Examples" 1 -.pp -Here we present a few examples -of how to use the package. -They attempt to be representative, -though not comprehensive. Further examples can be found in the games section -of the source tree and in various utilities that use the screen such as -.i systat(1) . -.pp -The following examples are intended to demonstrate -the basic structure of a program -using the package. An additional, more comprehensive, program can be found in -the source code in the -\fIexamples\fP subdirectory. -.sh 2 "Simple Character Output" -.pp -This program demonstrates how to set up a window and output characters to it. -Also, it demonstrates how one might control the output to the window. If -you run this program, you will get a demonstration of the character output -chracteristics discussed in the above Character Output section. -.(l I -.so ex1.gr -.)l -.sh 2 "Twinkle" -.pp -This is a moderately simple program which prints -patterns on the screen. -It switches between patterns of asterisks, -putting them on one by one in random order, -and then taking them off in the same fashion. -It is more efficient to write this -using only the motion optimization, -as is demonstrated below. -.(l I -.so twinkle1.gr -.)l diff --git a/lib/libcurses/PSD.doc/appen.B b/lib/libcurses/PSD.doc/appen.B deleted file mode 100644 index 0f89fa551bb..00000000000 --- a/lib/libcurses/PSD.doc/appen.B +++ /dev/null @@ -1,201 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)appen.B 8.1 (Berkeley) 6/8/93 -.\" -.ie t .oh '\*(Ln Appendix B''PS1:19-%' -.eh 'PS1:19-%''\*(Ln Appendix B' -.el .he ''\fIAppendix B\fR'' -.bp -.(x -.ti 0 -.b "Appendix B" -.)x -.nr $1 0 -.sh 1 "The WINDOW structure" -.pp -The WINDOW structure is defined as follows: -.(l I -.so win_st.gr -.)l -.pp -.Vn \*_cury \\* -.(f -\** -All variables not normally accessed directly by the user -are named with an initial -.Bq \*_ -to avoid conflicts with the user's variables. -.)f -and -.Vn \*_curx -are the current \*y for the window. -New characters added to the screen -are added at this point. -.Vn \*_maxy -and -.Vn \*_maxx -are the maximum values allowed for -.Vn \*_cury\*,\*_curx ). ( -.Vn \*_begy -and -.Vn \*_begx -are the starting \*y on the terminal for the window, -.i i.e. , -the window's home. -.Vn \*_cury , -.Vn \*_curx , -.Vn \*_maxy , -and -.Vn \*_maxx -are measured relative to -.Vn \*_begy\*,\*_begx ), ( -not the terminal's home. -.pp -.Vn \*_clear -tells if a clear-screen sequence is to be generated -on the next -.Fn refresh -call. -This is only meaningful for screens. -The initial clear-screen for the first -.Fn refresh -call is generated by initially setting clear to be TRUE for -.Vn curscr , -which always generates a clear-screen if set, -irrelevant of the dimensions of the window involved. -.Vn \*_leave -is TRUE if the current \*y and the cursor -are to be left after the last character changed on the terminal, -or not moved if there is no change. -.Vn \*_scroll -is TRUE -if scrolling is allowed. -.pp -.Vn \*_y -is a pointer to an array of lines which describe the terminal. -Thus: -.(l -\*_y[i] -.)l -.lp -is a pointer to the -.Vn i th -line, and -.(l -\*_y[i][j] -.)l -.lp -is the -.Vn j th -character on the -.Vn i th -line. -.Vn \*_flags -can have one or more values -or'd into it. -.pp -For windows that are not subwindows, -.Vn \*_orig -is -NULL . -For subwindows, -it points to the main window -to which the window is subsidiary. -.Vn \*_nextp -is a pointer in a circularly linked list -of all the windows which are subwindows of the same main window, -plus the main window itself. -.pp -.Vn \*_firstch -and -.Vn \*_lastch -are -.Fn malloc ed -arrays which contain the index of the -first and last changed characters -on the line. -.Vn \*_ch\*_off -is the x offset for the window -in the -.Vn \*_firstch -and -.Vn \*_lastch -arrays for this window. -For main windows, -this is always 0; -for subwindows -it is the difference between the starting point of the main window -and that of the subindow, -so that change markers can be set relative to the main window. -This makes these markers global in scope. -.pp -All subwindows share the appropriate portions of -.Vn _y , -.Vn _firstch , -.Vn _lastch , -and -.Vn _insdel -with their main window. -.pp -.b \*_ENDLINE -says that the end of the line for this window -is also the end of a screen. -.b \*_FULLWIN -says that this window is a screen. -.b \*_SCROLLWIN -indicates that the last character of this screen -is at the lower right-hand corner of the terminal; -.i i.e. , -if a character was put there, -the terminal would scroll. -.b \*_FULLLINE -says that the width of a line is the same as the width of the terminal. -If -.b \*_FLUSH -is set, -it says that -.Fn fflush "" "" stdout -should be called at the end of each -.Fn refresh -.b \*_STANDOUT -says that all characters added to the screen -are in standout mode. -.b \*_INSDEL -is reserved for future use, -and is set by -.Fn idlok . -.Vn \*_firstch -is set to -.b \*_NOCHANGE -for lines on which there has been no change -since the last -.Fn refresh . diff --git a/lib/libcurses/PSD.doc/appen.C b/lib/libcurses/PSD.doc/appen.C deleted file mode 100644 index 65bef2bcb98..00000000000 --- a/lib/libcurses/PSD.doc/appen.C +++ /dev/null @@ -1,127 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)appen.C 8.1 (Berkeley) 6/8/93 -.\" -.ie t .oh '\*(Ln Appendix A''PS1:19-%' -.eh 'PS1:19-%''\*(Ln Appendix A' -.el .he ''\fIAppendix A\fR'' -.bp -.(x -.ti 0 -.b "Appendix A" -.)x -.sh 1 "Examples" 1 -.pp -Here we present a few examples -of how to use the package. -They attempt to be representative, -though not comprehensive. Further examples can be found in the games section -of the source tree and in various utilities that use the screen such as -.i systat(1) . -.sh 2 "Screen Updating" -.pp -The following examples are intended to demonstrate -the basic structure of a program -using the screen updating sections of the package. -Several of the programs require calculational sections -which are irrelevant of to the example, -and are therefore usually not included. -It is hoped that the data structure definitions -give enough of an idea to allow understanding -of what the relevant portions do. -.sh 3 "Simple Character Output" -.pp -This program demonstrates how to set up a window and output characters to it. -Also, it demonstrates how one might control the output to the window. If -you run this program, you will get a demonstration of the character output -chracteristics discussed in the above Character Output section. -.(l I -.so t2.gr -.)l -.sh 3 "A Small Screen Manipulator" -.pp -The next example follows the lines of the previous one but extends then to -demonstrate the various othe uses of the package. Make sure you understand -how this program works as it encompasses most of anything you will -need to do with the package. -.(l I -.so t3.gr -.)l -.sh 3 "Twinkle" -.pp -This is a moderately simple program which prints -patterns on the screen. -It switches between patterns of asterisks, -putting them on one by one in random order, -and then taking them off in the same fashion. -It is more efficient to write this -using only the motion optimization, -as is demonstrated below. -.(l I -.so twinkle1.gr -.)l -.sh 3 "Life" -.pp -This program fragment models the famous computer pattern game of life -(Scientific American, May, 1974). -The calculational routines create a linked list of structures -defining where each piece is. -Nothing here claims to be optimal, -merely demonstrative. -This code, however, -is a very good place to use the screen updating routines, -as it allows them to worry about what the last position looked like, -so you don't have to. -It also demonstrates some of the input routines. -.(l I -.so life.gr -.)l -.sh 2 "Motion optimization" -.pp -The following example shows how motion optimization -is written on its own. -Programs which flit from one place to another without -regard for what is already there -usually do not need the overhead of both space and time -associated with screen updating. -They should instead use motion optimization. -.sh 3 "Twinkle" -.pp -The -.b twinkle -program -is a good candidate for simple motion optimization. -Here is how it could be written -(only the routines that have been changed are shown): -.(l -.so twinkle2.gr -.)l diff --git a/lib/libcurses/PSD.doc/c_macros b/lib/libcurses/PSD.doc/c_macros deleted file mode 100644 index ba6ebbc1922..00000000000 --- a/lib/libcurses/PSD.doc/c_macros +++ /dev/null @@ -1,70 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)c_macros 8.1 (Berkeley) 6/4/93 -.\" -'ie t 'ds _ \d\(mi\u -'el 'ds _ _ -'tr *\(** -'ps 9p -'vs 10p -'ds - \(mi -'ds /* \\h'\\w' 'u-\\w'/'u'/* -'bd B 3 -'bd S B 3 -'nr cm 0 -'nf -'de () -'pn 1 -.. -'de +C -'nr cm 1 -'ft 2 -'ds +K -'ds -K -.. -'de -C -'nr cm 0 -'ft 1 -.ie t 'ds +K \f3 -.el 'ds +K \fI -'ds -K \fP -.. -'+C -'-C -'am +C -'ne 3 -.. -'de -F -'rm =f -.. -'ft 1 -'lg 0 diff --git a/lib/libcurses/PSD.doc/doc.I b/lib/libcurses/PSD.doc/doc.I deleted file mode 100644 index 2345aba9b1c..00000000000 --- a/lib/libcurses/PSD.doc/doc.I +++ /dev/null @@ -1,349 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)doc.I 8.1 (Berkeley) 6/4/93 -.\" -.Ds -.Fd addch ch \*m -char ch; -.Fd waddch win\*,ch -WINDOW *win; -char ch; -.De -Add the character -.Vn ch -on the window -at the current \*y. -If the character is a newline -(\'\en\') -the line will be cleared to the end, -and the current \*y will be changed to the -beginning off the next line -if newline mapping is on, -or to the next line at the same x co-ordinate -if it is off. -A return -(\'\er\') -will move to the beginning of the line on the window. -Tabs -(\'\et\') -will be expanded into spaces -in the normal tabstop positions of -every eight characters. -\*(Es -.Ds -.Fd addstr str \*m -char *str; -.Fd waddstr win\*,str -WINDOW *win; -char *str; -.De -Add the string pointed to by -.Vn str -on the window at the current \*y. -\*(Es -In this case, it will put on as much as it can. -.Ds -.Fd box win\*,vert\*,hor -WINDOW *win; -char vert\*,hor; -.De -.Pp -Draws a box around the window using -.Vn vert -as the character for drawing the vertical sides, and -.Vn hor -for drawing the horizontal lines. -If scrolling is not allowed, -and the window encompasses the lower right-hand corner of the terminal, -the corners are left blank to avoid a scroll. -.Ds -.Fd clear "" \*m -.Fd wclear win -WINDOW *win; -.De -Resets the entire window to blanks. -If -.Vn win -is a screen, -this sets the clear flag, -which will cause a clear-screen sequence to be sent -on the next -.Fn refresh -call. -This also moves the current \*y -to (0\*,0). -.Ds -.Fd clearok scr\*,boolf \*m -WINDOW *scr; -bool boolf; -.De -Sets the clear flag for the screen -.Vn scr . -If -.Vn boolf -is TRUE, -this will force a clear-screen to be printed on the next -.Fn refresh , -or stop it from doing so if -.Vn boolf -is FALSE. -This only works on screens, -and, -unlike -.Fn clear , -does not alter the contents of the screen. -If -.Vn scr -is -.Vn curscr , -the next -.Fn refresh -call will cause a clear-screen, -even if the window passed to -.Fn refresh -is not a screen. -.Ds -.Fd clrtobot "" \*m -.Fd wclrtobot win -WINDOW *win; -.De -Wipes the window clear from the current \*y to the bottom. -This does not force a clear-screen sequence on the next refresh -under any circumstances. -\*(Nm -.Ds -.Fd clrtoeol "" \*m -.Fd wclrtoeol win -WINDOW *win; -.De -Wipes the window clear from the current \*y to the end of the line. -\*(Nm -.Ds -.Fd delch -.Fd wdelch win -WINDOW *win; -.De -Delete the character at the current \*y. -Each character after it on the line shifts to the left, -and the last character becomes blank. -.Ds -.Fd deleteln -.Fd wdeleteln win -WINDOW *win; -.De -Delete the current line. -Every line below the current one will move up, -and the bottom line will become blank. -The current \*y will remain unchanged. -.Ds -.Fd erase "" \*m -.Fd werase win -WINDOW *win; -.De -Erases the window to blanks without setting the clear flag. -This is analagous to -.Fn clear , -except that it never causes a clear-screen sequence to be generated -on a -.Fn refresh . -\*(Nm -.Ds -.Fd flushok win\*,boolf \*m -WINDOW *win; -bool boolf; -.De -Normally, -.Fn refresh -.Fn fflush 's -.Vn stdout -when it is finished. -.Fn flushok -allows you to control this. -if -.Vn boolf -is TRUE -(\c -.i i.e. , -non-zero) -it will do the -.Fn fflush ; -if it is FALSE. -it will not. -.Ds -.Fd idlok win\*,boolf -WINDOW *win; -bool boolf; -.De -Reserved for future use. -This will eventually signal to -.Fn refresh -that it is all right to use the insert and delete line sequences -when updating the window. -.Ds -.Fd insch c -char c; -.Fd winsch win\*,c -WINDOW *win; -char c; -.De -Insert -.Vn c -at the current \*y -Each character after it shifts to the right, -and the last character disappears. -\*(Es -.Ds -.Fd insertln -.Fd winsertln win -WINDOW *win; -.De -Insert a line above the current one. -Every line below the current line -will be shifted down, -and the bottom line will disappear. -The current line will become blank, -and the current \*y will remain unchanged. -.Ds -.Fd move y\*,x \*m -int y\*,x; -.Fd wmove win\*,y\*,x -WINDOW *win; -int y\*,x; -.De -Change the current \*y of the window to -.Vn y\*,x ). ( -\*(Es -.Ds -.Fd overlay win1\*,win2 -WINDOW *win1\*,*win2; -.De -Overlay -.Vn win1 -on -.Vn win2 . -The contents of -.Vn win1 , -insofar as they fit, -are placed on -.Vn win2 -at their starting \*y. -This is done non-destructively, -i.e., blanks on -.Vn win1 -leave the contents of the space on -.Vn win2 -untouched. -.Ds -.Fd overwrite win1\*,win2 -WINDOW *win1\*,*win2; -.De -Overwrite -.Vn win1 -on -.Vn win2 . -The contents of -.Vn win1 , -insofar as they fit, -are placed on -.Vn win2 -at their starting \*y. -This is done destructively, -.i i.e. , -blanks on -.Vn win1 -become blank on -.Vn win2 . -.Ds -.Fd printw fmt\*,arg1\*,arg2\*,... -char *fmt; -.Fd wprintw win\*,fmt\*,arg1\*,arg2\*,... -WINDOW *win; -char *fmt; -.De -Performs a -.Fn printf -on the window starting at the current \*y. -It uses -.Fn addstr -to add the string on the window. -It is often advisable to use the field width options of -.Fn printf -to avoid leaving things on the window from earlier calls. -\*(Es -.Ds -.Fd refresh "" \*m -.Fd wrefresh win -WINDOW *win; -.De -Synchronize the terminal screen with the desired window. -If the window is not a screen, -only that part covered by it is updated. -\*(Es -In this case, it will update whatever it can -without causing the scroll. -.sp -As a special case, -if -.Fn wrefresh -is called with the window -.Vn curscr -the screen is cleared -and repainted as it is currently. -This is very useful for allowing the redrawing of the screen -when the user has garbage dumped on his terminal. -.Ds -.Fd standout "" \*m -.Fd wstandout win -WINDOW *win; -.Fd standend "" \*m -.Fd wstandend win -WINDOW *win; -.De -Start and stop putting characters onto -.i win -in standout mode. -.Fn standout -causes any characters added to the window -to be put in standout mode on the terminal -(if it has that capability). -.Fn standend -stops this. -The sequences -.Vn SO -and -.Vn SE -(or -.Vn US -and -.Vn UE -if they are not defined) -are used (see Appendix A). diff --git a/lib/libcurses/PSD.doc/doc.II b/lib/libcurses/PSD.doc/doc.II deleted file mode 100644 index 1f6880247bc..00000000000 --- a/lib/libcurses/PSD.doc/doc.II +++ /dev/null @@ -1,142 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)doc.II 8.1 (Berkeley) 6/4/93 -.\" -.Ds -.Fd cbreak "" \*m -.Fd nocbreak "" \*m -.Fd crmode "" \*m -.Fd nocrmode "" \*m -.De -Set or unset the terminal to/from cbreak mode. -The misnamed macros -.Fn crmode -and -.Fn nocrmode -are retained for backwards compatibility -with ealier versions of the library. -.Ds -.Fd echo "" \*m -.Fd noecho "" \*m -.De -Sets the terminal to echo or not echo characters. -.Ds -.Fd getch "" \*m -.Fd wgetch win -WINDOW *win; -.De -Gets a character from the terminal and (if necessary) -echos it on the window. -\*(Es -Otherwise, the character gotten is returned. -If -.i noecho -has been set, then the window is left unaltered. -In order to retain control of the terminal, -it is necessary to have one of -.i noecho , -.i cbreak , -or -.i rawmode -set. -If you do not set one, -whatever routine you call to read characters will set -.i cbreak -for you, -and then reset to the original mode when finished. -.Ds -.Fd getstr str \*m -char *str; -.Fd wgetstr win\*,str -WINDOW *win; -char *str; -.De -Get a string through the window -and put it in the location pointed to by -.Vn str , -which is assumed to be large enough to handle it. -It sets tty modes if necessary, -and then calls -.Fn getch -(or -.Fn wgetch ) "" win -to get the characters needed to fill in the string -until a newline or EOF is encountered. -The newline stripped off the string. -\*(Es -.Ds -.Fd \*_putchar c -char c; -.De -Put out a character using the -.Fn putchar -macro. -This function is used to output every character -that -.b curses -generates. -Thus, -it can be redefined by the user who wants to do non-standard things -with the output. -It is named with an initial \*(lq\*_\*(rq -because it usually should be invisible to the programmer. -.Ds -.Fd raw "" \*m -.Fd noraw "" \*m -.De -Set or unset the terminal to/from raw mode. -On version 7 -.Un \** -.(f -\** -.Un -is a trademark of Bell Laboratories. -.)f -this also turns of newline mapping -(see -.Fn nl ). -.Ds -.Fd scanw fmt\*,arg1\*,arg2\*,... -char *fmt; -.Fd wscanw win\*,fmt\*,arg1\*,arg2\*,... -WINDOW *win; -char *fmt; -.De -Perform a -.Fn scanf -through the window using -.Vn fmt . -It does this using consecutive -.Fn getch 's -(or -.Fn wgetch 's). "" win -\*(Es diff --git a/lib/libcurses/PSD.doc/doc.III b/lib/libcurses/PSD.doc/doc.III deleted file mode 100644 index 7d710d49dbc..00000000000 --- a/lib/libcurses/PSD.doc/doc.III +++ /dev/null @@ -1,343 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)doc.III 8.1 (Berkeley) 6/4/93 -.\" -.Ds -.Fd baudrate "" \*m -.De -Returns the output baud rate of the terminal. -This is a system dependent constant -(defined in -.b <sys/tty.h> -on BSD systems, -which is included by -.b <curses.h> ). -.Ds -.Fd delwin win -WINDOW *win; -.De -Deletes the window from existence. -All resources are freed for future use by -.b calloc (3). -If a window has a -.Fn subwin -allocated window inside of it, -deleting the outer window -the subwindow is not affected, -even though this does invalidate it. -Therefore, -subwindows should be deleted before their -outer windows are. -.Ds -.Fd endwin -.De -Finish up window routines before exit. -This restores the terminal to the state it was before -.Fn initscr -(or -.Fn gettmode -and -.Fn setterm ) -was called. -It should always be called before exiting. -It does not exit. -This is especially useful for resetting tty stats -when trapping rubouts via -.b signal (2). -.Ds -.Fd erasechar "" \*m -.De -Returns the erase character -for the terminal, -.i i.e. , -the character used by the user to erase a single character from the input. -.Ds -.Fd getcap str "" "char *" -char *str; -.De -Return a pointer to the -.b termcap -capability described by -.Vn str -(see -.b termcap (5) -for details). -.Ds -.Fd getyx win\*,y\*,x \*m -WINDOW *win; -int y\*,x; -.De -Puts the current \*y of -.Vn win -in the variables -.Vn y -and -.Vn x . -Since it is a macro, -not a function, -you do not pass the address -of -.Vn y -and -.Vn x . -.Ds -.Fd inch "" \*m -.Fd winch win \*m -WINDOW *win; -.De -Returns the character at the current \*(y -on the given window. -This does not make any changes to the window. -.Ds -.Fd initscr -.De -Initialize the screen routines. -This must be called before any of the screen routines are used. -It initializes the terminal-type data and such, -and without it none of the routines can operate. -If standard input is not a tty, -it sets the specifications to the terminal -whose name is pointed to by -.Vn Def\*_term -(initialy "dumb"). -If the boolean -.Vn My\*_term -is true, -.Vn Def\*_term -is always used. -If the system supports the -.b TIOCGWINSZ -.Fn ioctl "" "" 2 -call, -it is used to get the number of lines and columns for the terminal, -otherwise it is taken from the -.b termcap -description. -.Ds -.Fd killchar "" \*m -.De -Returns the line kill character -for the terminal, -.i i.e. , -the character used by the user to erase an entire line from the input. -.Ds -.Fd leaveok win\*,boolf \*m -WINDOW *win; -bool boolf; -.De -Sets the boolean flag for leaving the cursor after the last change. -If -.Vn boolf -is TRUE, -the cursor will be left after the last update on the terminal, -and the current \*y for -.Vn win -will be changed accordingly. -If it is FALSE, -it will be moved to the current \*y. -This flag -(initialy FALSE) -retains its value until changed by the user. -.Ds -.Fd longname termbuf\*,name -char *termbuf\*,*name; -.Fd fullname termbuf\*,name -char *termbuf\*,*name; -.De -.Fn longname -fills in -.Vn name -with the long name of the terminal described by the -.b termcap -entry in -.Vn termbuf . -It is generally of little use, -but is nice for telling the user in a readable format what terminal -we think he has. -This is available in the global variable -.Vn ttytype . -.Vn termbuf -is usually set via the termlib routine -.Fn tgetent . -.Fn fullname -is the same as -.Fn longname , -except that it gives the fullest name given in the entry, -which can be quite verbose. -.Ds -.Fd mvwin win\*,y\*,x -WINDOW *win; -int y, x; -.De -Move the home position of the window -.Vn win -from its current starting coordinates -to -.Vn y\*,x ). ( -If that would put part or all of the window -off the edge of the terminal screen, -.Fn mvwin -returns ERR and does not change anything. -For subwindows, -.Fn mvwin -also returns ERR if you attempt to move it off its main window. -If you move a main window, -all subwindows are moved along with it. -.Ds -.Fd newwin lines\*,cols\*,begin\*_y\*,begin\*_x "" "WINDOW *" -int lines\*,cols\*,begin\*_y\*,begin\*_x; -.De -Create a new window with -.Vn lines -lines and -.Vn cols -columns starting at position -.Vn begin\*_y\*,begin\*_x ). ( -If either -.Vn lines -or -.Vn cols -is 0 (zero), -that dimension will be set to -.Vn "LINES \- begin\*_y" ) ( -or -.Vn "COLS \- begin\*_x" ) ( -respectively. -Thus, to get a new window of dimensions -.Vn LINES -\(mu -.Vn COLS , -use -.Fn newwin . "" 0\*,0\*,0\*,0 -.Ds -.Fd nl "" \*m -.Fd nonl "" \*m -.De -Set or unset the terminal to/from nl mode, -.i i.e. , -start/stop the system from mapping -.b <RETURN> -to -.b <LINE-FEED> . -If the mapping is not done, -.Fn refresh -can do more optimization, -so it is recommended, but not required, to turn it off. -.Ds -.Fd scrollok win\*,boolf \*m -WINDOW *win; -bool boolf; -.De -Set the scroll flag for the given window. -If -.Vn boolf -is FALSE, scrolling is not allowed. -This is its default setting. -.Ds -.Fd touchline win\*,y\*,startx\*,endx -WINDOW *win; -int y\*,startx\*,endx; -.De -This function performs a function similar to -.Fn touchwin -on a single line. -It marks the first change for the given line -to be -.Vn startx , -if it is before the current first change mark, -and -the last change mark is set to be -.Vn endx -if it is currently less than -.Vn endx . -.Ds -.Fd touchoverlap win1\*,win2 -WINDOW *win1, *win2; -.De -Touch the window -.Vn win2 -in the area which overlaps with -.Vn win1 . -If they do not overlap, -no changes are made. -.Ds -.Fd touchwin win -WINDOW *win; -.De -Make it appear that the every location on the window -has been changed. -This is usually only needed for refreshes with overlapping windows. -.Ds -.Fd subwin win\*,lines\*,cols\*,begin\*_y\*,begin\*_x "" "WINDOW *" -WINDOW *win; -int lines\*,cols\*,begin\*_y\*,begin\*_x; -.De -Create a new window with -.Vn lines -lines and -.Vn cols -columns starting at position -.Vn begin\*_y\*,begin\*_x ) ( -inside the window -.i win . -This means that any change made to either window -in the area covered -by the subwindow will be made on both windows. -.Vn begin\*_y\*,begin\*_x -are specified relative to the overall screen, -not the relative (0\*,0) of -.Vn win . -If either -.Vn lines -or -.Vn cols -is 0 (zero), -that dimension will be set to -.Vn "LINES \- begin\*_y" ) ( -or -.Vn "COLS \- begin\*_x" ) ( -respectively. -.Ds -.Fd unctrl ch \*m -char ch; -.De -This is actually a debug function for the library, -but it is of general usefulness. -It returns a string which is a representation of -.Vn ch . -Control characters become their upper-case equivalents preceded by a "^". -Other letters stay just as they are. -To use -.Fn unctrl , -you may have to have -.b #include\ <unctrl.h> -in your file. diff --git a/lib/libcurses/PSD.doc/doc.IV b/lib/libcurses/PSD.doc/doc.IV deleted file mode 100644 index 717a9863abb..00000000000 --- a/lib/libcurses/PSD.doc/doc.IV +++ /dev/null @@ -1,110 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)doc.IV 8.1 (Berkeley) 6/4/93 -.\" -.Ds -.Fd gettmode -.De -Get the tty stats. -This is normally called by -.Fn initscr . -.Ds -.Fd mvcur lasty\*,lastx\*,newy\*,newx -int lasty\*,lastx\*,newy\*,newx; -.De -Moves the terminal's cursor from -.Vn lasty\*,lastx ) ( -to -.Vn newy\*,newx ) ( -in an approximation of optimal fashion. -This routine uses the functions borrowed from -.i ex -version 2.6. -It is possible to use this optimization -without the benefit of the screen routines. -With the screen routines, this should not be called by the user. -.Fn move -and -.Fn refresh -should be used to move the cursor position, -so that the routines know what's going on. -.Ds -.Fd scroll win -WINDOW *win; -.De -Scroll the window upward one line. -This is normally not used by the user. -.Ds -.Fd savetty "" \*m -.Fd resetty "" \*m -.De -.Fn savetty -saves the current tty characteristic flags. -.Fn resetty -restores them to what -.Fn savetty -stored. -These functions are performed automatically by -.Fn initscr -and -.Fn endwin . -.Ds -.Fd setterm name -char *name; -.De -Set the terminal characteristics to be those of the terminal named -.Vn name , -getting the terminal size from the -.b TIOCGWINSZ -.Fn ioctl "" "" 2 -if it exists, -otherwise from the environment. -This is normally called by -.Fn initscr . -.Ds -.Fd tstp -.De -If the new -.b tty (4) -driver is in use, -this function -will save the current tty state -and then put the process to sleep. -When the process gets restarted, -it restores the tty state -and then calls -.Fn wrefresh "" "" curscr -to redraw the screen. -.Fn initscr -sets the signal -SIGTSTP -to trap to this routine. diff --git a/lib/libcurses/PSD.doc/ex1.c b/lib/libcurses/PSD.doc/ex1.c deleted file mode 100644 index 02ed9b936bd..00000000000 --- a/lib/libcurses/PSD.doc/ex1.c +++ /dev/null @@ -1,102 +0,0 @@ -.\" Copyright (c) 1992, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)ex1.c 8.1 (Berkeley) 6/8/93 -.\" -#include <sys/types.h> -#include <curses.h> -#include <stdio.h> -#include <signal.h> - - -#define YSIZE 10 -#define XSIZE 20 - -int quit(); - -main() -{ - int i, j, c; - size_t len; - char id[100]; - FILE *fp; - char *s; - - initscr(); /* Always call initscr() first */ - signal(SIGINT, quit); /* Make sure wou have a 'cleanup' fn */ - crmode(); /* We want cbreak mode */ - noecho(); /* We want to have control of chars */ - delwin(stdscr); /* Create our own stdscr */ - stdscr = newwin(YSIZE, XSIZE, 10, 35); - flushok(stdscr, TRUE); /* Enable flushing of stdout */ - scrollok(stdscr, TRUE); /* Enable scrolling */ - erase(); /* Initially, clear the screen */ - - standout(); - move(0,0); - while (1) { - c = getchar(); - switch(c) { - case 'q': /* Quit on 'q' */ - quit(); - break; - case 's': /* Go into standout mode on 's' */ - standout(); - break; - case 'e': /* Exit standout mode on 'e' */ - standend(); - break; - case 'r': /* Force a refresh on 'r' */ - wrefresh(curscr); - break; - default: /* By default output the character */ - addch(c); - refresh(); - } - } -} - - -int -quit() -{ - erase(); /* Terminate by erasing the screen */ - refresh(); - endwin(); /* Always end with endwin() */ - delwin(curscr); /* Return storage */ - delwin(stdscr); - putchar('\n'); - exit(0); -} - - - - diff --git a/lib/libcurses/PSD.doc/ex2.c b/lib/libcurses/PSD.doc/ex2.c deleted file mode 100644 index 13e8f2990b9..00000000000 --- a/lib/libcurses/PSD.doc/ex2.c +++ /dev/null @@ -1,210 +0,0 @@ -.\" Copyright (c) 1992, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)ex2.c 8.1 (Berkeley) 6/8/93 -.\" -#include <curses.h> -#include <stdio.h> -#include <signal.h> - -#define YSIZE LINES -#define XSIZE COLS - -static int quit(); - -/* - * This program fills the screen up with characters and the allows the user to - * manipulate the text on the screen using some basic commands. - * Nothing fancy, just a demonstration of the elementary features of the - * curses(3) package. - */ -main() -{ - int i, j, c, n, d = 0; - char id[100]; - int hh = 0; - int curx, cury, base, arg; - - initscr(); - signal(SIGINT, quit); - crmode(); - noecho(); - nonl(); - delwin(stdscr); - stdscr = newwin(YSIZE, XSIZE, 0, 0); - flushok(stdscr, TRUE); - scrollok(stdscr, TRUE); - erase(); - refresh(); - - move(0,0); - refresh(); - for (i = 0; i < YSIZE + 2; i++) { - sprintf(id, "%d: ", i); - addstr(id); - for (j = 0; j < XSIZE - strlen(id); j++) - addch('0' + (i % 10)); - } - c = getchar(); - base = 2; - curx = cury = 0; - move(0, 0); - refresh(); - - /* - * The screen manipulator has the following commands: - * 'D' - clear to the end of the current line. - * 'B' - clear to the bottom of the screen. - * 'E' - erase the screen. - * 's' - enter standout mode. - * 'e' - exit standout mode. - * 'd' n - delete n lines below cursor line. - * 'i' n - insert n lines below cursor line. - * 'q' - quit. - * 'f' - move cursor one position to the right. - * 'b' - move cursor one position to the left. - * 'n' - move cursor one line down. - * 'p' - move cursor one line up. - * 'h' - home cusor. - * 'l' - force refresh. - * 'r' - simulate a carriage return. - * - * All other characters are ignored. - */ - for(;;) { - switch(c = getchar()) { - case 'D': - clrtoeol(); - refresh(); - continue; - case 'B': - clrtobot(); - refresh(); - continue; - case 'E': - erase(); - refresh(); - continue; - case 's': - standout(); - continue; - case 'e': - standend(); - continue; - case 'd': - arg = getchar() - '0'; - for (i = 0; i < arg; i++) - deleteln(); - refresh(); - continue; - case 'i': - arg = getchar() - '0'; - for (i = 0; i < arg; i++) - insertln(); - refresh(); - continue; - case 'q': - quit(); - case 'f': - if (curx < XSIZE - 1) - curx++; - else { - cury++; - curx = 0; - } - break; - case 'b': - if (curx == 0) { - cury--; - curx = XSIZE - 1; - } else - curx--; - break; - case 'n': - cury++; - break; - case 'p': - cury--; - break; - case 'h': - curx = cury = 0; - break; - case 'l': - wrefresh(curscr); - continue; - case 'r': /* return */ - { - int x, y; - getyx(stdscr, y, x); - move(y+1, 0); - insertln(); - move(y, x); - clrtoeol(); - refresh(); - continue; - } - default: - continue; - } - - if (cury < 0) { - base--; - move(0, 0); - insertln(); - sprintf(id, "%d: ", base); - addstr(id); - for (j = 0; j < XSIZE - strlen(id) - 2; j++) - addch('0' + (base % 10)); - cury++; - } else if (cury >= YSIZE) { - move(0, 0); - deleteln(); - move(YSIZE - 1, 0); - sprintf(id, "%d: ", base + YSIZE); - addstr(id); - for (j = 0; j < XSIZE - strlen(id) - 2; j++) - addch('0' + ((base + YSIZE) % 10)); - cury--; - base++; - } - move(cury, curx); - refresh(); - } -} - -int -quit() -{ - erase(); - refresh(); - endwin(); - exit(0); -} diff --git a/lib/libcurses/PSD.doc/fns.doc b/lib/libcurses/PSD.doc/fns.doc deleted file mode 100644 index 0fa89abd3f7..00000000000 --- a/lib/libcurses/PSD.doc/fns.doc +++ /dev/null @@ -1,799 +0,0 @@ -.\" Copyright (c) 1992, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)fns.doc 8.2 (Berkeley) 6/1/94 -.\" -.Ds -.Fn addch "char ch" \(dg -.De -Add the character -.Vn ch -on the window -at the current \*y. -If the character is a newline -(\'\en\') -the line will be cleared to the end, -and the current \*y will be changed to the -beginning off the next line -if newline mapping is on, -or to the next line at the same x co-ordinate -if it is off. -A return -(\'\er\') -will move to the beginning of the line on the window. -Tabs -(\'\et\') -will be expanded into spaces -in the normal tabstop positions of -every eight characters. -\*(Es -.Ds -.Fn addstr "char *str" \(dg -.De -Add the string pointed to by -.Vn str -on the window at the current \*y. -\*(Es -In this case, it will put on as much as it can. -.Ds -.Fn baudrate "" \(dg -.De -Returns the output baud rate of the terminal. -This is a system dependent constant -(defined in -.b <sys/tty.h> -on BSD systems, -which is included by -.b <curses.h> ). -.Ds -.Fn box "WINDOW win" "char vert" "char hor" -.De -.Pp -Draws a box around the window using -.Vn vert -as the character for drawing the vertical sides, and -.Vn hor -for drawing the horizontal lines. -If scrolling is not allowed, -and the window encompasses the lower right-hand corner of the terminal, -the corners are left blank to avoid a scroll. -.Ds -.Fn cbreak "" \(dg -.De -Set or the terminal to cbreak mode. -.Ds -.Fn clear "" \(dg -.De -Resets the entire window to blanks. -If -.Vn win -is a screen, -this sets the clear flag, -which will cause a clear-screen sequence to be sent -on the next -.Fn refresh -call. -This also moves the current \*y -to (0\*,0). -.Ds -.Fn clearok "WINDOW *scr" "int boolf" \(dg -.De -Sets the clear flag for the screen -.Vn scr . -If -.Vn boolf -is non-zero, -this will force a clear-screen to be printed on the next -.Fn refresh , -or stop it from doing so if -.Vn boolf -is 0. -This only works on screens, -and, -unlike -.Fn clear , -does not alter the contents of the screen. -If -.Vn scr -is -.Vn curscr , -the next -.Fn refresh -call will cause a clear-screen, -even if the window passed to -.Fn refresh -is not a screen. -.Ds -.Fn clrtobot "" \(dg -.De -Wipes the window clear from the current \*y to the bottom. -This does not force a clear-screen sequence on the next refresh -under any circumstances. -\*(Nm -.Ds -.Fn clrtoeol "" \(dg -.De -Wipes the window clear from the current \*y to the end of the line. -\*(Nm -.Ds -.Fn crmode "" \(dg -.De -Identical to -.Fn cbreak . -The misnamed macro -.Fn crmode -and -.Fn nocrmode -is retained for backwards compatibility -with ealier versions of the library. -.Ds -.Fn delch "" -.De -Delete the character at the current \*y. -Each character after it on the line shifts to the left, -and the last character becomes blank. -.Ds -.Fn deleteln "" -.De -Delete the current line. -Every line below the current one will move up, -and the bottom line will become blank. -The current \*y will remain unchanged. -.Ds -.Fn delwin "WINDOW *win" -.De -Deletes the window from existence. -All resources are freed for future use by -.b calloc (3). -If a window has a -.Fn subwin -allocated window inside of it, -deleting the outer window -the subwindow is not affected, -even though this does invalidate it. -Therefore, -subwindows should be deleted before their -outer windows are. -.Ds -.Fn echo "" \(dg -.De -Sets the terminal to echo characters. -.Ds -.Fn endwin "" -.De -Finish up window routines before exit. -This restores the terminal to the state it was before -.Fn initscr -(or -.Fn gettmode -and -.Fn setterm ) -was called. -It should always be called before exiting and before the final calls to -.Fn delwin . -It does not exit. -This is especially useful for resetting tty stats -when trapping rubouts via -.b signal (2). -.Ds -.Fn erase "" \(dg -.De -Erases the window to blanks without setting the clear flag. -This is analagous to -.Fn clear , -except that it never causes a clear-screen sequence to be generated -on a -.Fn refresh . -\*(Nm -.Ds -.Fn erasechar "" \(dg -.De -Returns the erase character -for the terminal, -.i i.e. , -the character used by the user to erase a single character from the input. -.Ds -.Fn flushok "WINDOW *win" "int boolf" -.De -Normally, -.Fn refresh -.Fn fflush 's -.Vn stdout -when it is finished. -.Fn flushok -allows you to control this. -if -.Vn boolf -is non-zero -(\c -.i i.e. , -non-zero) -it will do the -.Fn fflush , -otherwise it will not. -.Ds -.Fn getch "" \(dg -.De -Gets a character from the terminal and (if necessary) -echos it on the window. -\*(Es -Otherwise, the character gotten is returned. -If -.i noecho -has been set, then the window is left unaltered. -In order to retain control of the terminal, -it is necessary to have one of -.i noecho , -.i cbreak , -or -.i rawmode -set. -If you do not set one, -whatever routine you call to read characters will set -.i cbreak -for you, -and then reset to the original mode when finished. -.Ds -.Fn getstr "char *str" \(dg -.De -Get a string through the window -and put it in the location pointed to by -.Vn str , -which is assumed to be large enough to handle it. -It sets tty modes if necessary, -and then calls -.Fn getch -(or -.Fn wgetch ) -to get the characters needed to fill in the string -until a newline or EOF is encountered. -The newline stripped off the string. -\*(Es -.Ds -.Fn gettmode "" -.De -Get the tty stats. -This is normally called by -.Fn initscr . -.Ds -.Fn getyx "WINDOW *win" "int y" "int x" -.De -Puts the current \*y of -.Vn win -in the variables -.Vn y -and -.Vn x . -Since it is a macro, -not a function, -you do not pass the address -of -.Vn y -and -.Vn x . -.Ds -.Fn idlok "WINDOW *win" "int boolf" -.De -Reserved for future use. -This will eventually signal to -.Fn refresh -that it is all right to use the insert and delete line sequences -when updating the window. -.ne 1i -.Ds -.Fn inch "" \(dg -.De -Returns the character at the current position on the given window. -This does not make any changes to the window. -.Ds -.Fn initscr "" -.De -Initialize the screen routines. -This must be called before any of the screen routines are used. -It initializes the terminal-type data and such, -and without it none of the routines can operate. -If standard input is not a tty, -it sets the specifications to the terminal -whose name is pointed to by -.Vn Def\*_term -(initially "dumb"). -If the boolean -.Vn My\*_term -is non-zero, -.Vn Def\*_term -is always used. -If the system supports the -.b TIOCGWINSZ -.i ioctl(2) -call, -it is used to get the number of lines and columns for the terminal, -otherwise it is taken from the -.b termcap -description. -.Ds -.Fn insch "char c" -.De -Insert -.Vn c -at the current \*y -Each character after it shifts to the right, -and the last character disappears. -\*(Es -.Ds -.Fn insertln "" -.De -Insert a line above the current one. -Every line below the current line -will be shifted down, -and the bottom line will disappear. -The current line will become blank, -and the current \*y will remain unchanged. -.Ds -.Fn killchar "" \(dg -.De -Returns the line kill character -for the terminal, -.i i.e. , -the character used by the user to erase an entire line from the input. -.Ds -.Fn leaveok "WINDOW *win" "int boolf" \(dg -.De -Sets the boolean flag for leaving the cursor after the last change. -If -.Vn boolf -is non-zero, -the cursor will be left after the last update on the terminal, -and the current \*y for -.Vn win -will be changed accordingly. -If -.Vn boolf - is 0 the cursor will be moved to the current \*y. -This flag -(initially 0) -retains its value until changed by the user. -.Ds -.Fn move "int y" "int x" -.De -Change the current \*y of the window to -.Vn y\*,x ). ( -\*(Es -.Ds -.Fn mvcur "int lasty" "int lastx" "int newy" "int newx" -.De -Moves the terminal's cursor from -.Vn lasty\*,lastx ) ( -to -.Vn newy\*,newx ) ( -in an approximation of optimal fashion. -This routine uses the functions borrowed from -.i ex -version 2.6. -It is possible to use this optimization -without the benefit of the screen routines. -With the screen routines, this should not be called by the user. -.Fn move -and -.Fn refresh -should be used to move the cursor position, -so that the routines know what's going on. -.Ds -.Fn mvprintw "int y" "int x" "const char *fmt" "..." -.De -Equivalent to: -.(l -move(y, x); -printw(fmt, ...); -.)l -.Ds -.Fn mvscanw "int y" "int x" "const char *fmt" "..." -.De -Equivalent to: -.(l -move(y, x); -scanw(fmt, ...); -.)l -.Ds -.Fn mvwin "WINDOW *win" "int y" "int x" -.De -Move the home position of the window -.Vn win -from its current starting coordinates -to -.Vn y\*,x ). ( -If that would put part or all of the window -off the edge of the terminal screen, -.Fn mvwin -returns ERR and does not change anything. -For subwindows, -.Fn mvwin -also returns ERR if you attempt to move it off its main window. -If you move a main window, -all subwindows are moved along with it. -.Ds -.Fn mvwprintw "WINDOW *win" "int y" "int x" "const char *fmt" "..." -.De -Equivalent to: -.(l -wmove(win, y, x); -printw(fmt, ...); -.)l -.Ds -.Fn mvwscanw "WINDOW *win" "int y" "int x" "const char *fmt" "..." -.De -Equivalent to: -.(l -wmove(win, y, x); -scanw(fmt, ...); -.)l -.Ds -.Ft "WINDOW *" -.Fn newwin "int lines" "int cols" "int begin_y" "int begin_x" -.De -Create a new window with -.Vn lines -lines and -.Vn cols -columns starting at position -.Vn begin\*_y\*,begin\*_x ). ( -If either -.Vn lines -or -.Vn cols -is 0 (zero), -that dimension will be set to -.Vn "LINES \- begin\*_y" ) ( -or -.Vn "COLS \- begin\*_x" ) ( -respectively. -Thus, to get a new window of dimensions -.Vn LINES -\(mu -.Vn COLS , -use -.Fn newwin 0 0 0 0 . -.Ds -.Fn nl "" \(dg -.De -Set the terminal to nl mode, -.i i.e. , -start/stop the system from mapping -.b <RETURN> -to -.b <LINE-FEED> . -If the mapping is not done, -.Fn refresh -can do more optimization, -so it is recommended, but not required, to turn it off. -.Ds -.Fn nocbreak "" \(dg -.De -Unset the terminal from cbreak mode. -.Ds -.Fn nocrmode "" \(dg -.De -Identical to -.Fn nocbreak . -The misnamed macro -.Fn nocrmode -is retained for backwards compatibility -with ealier versions of the library. -.Ds -.Fn noecho "" \(dg -.De -Turn echoing of characters off. -.Ds -.Fn nonl "" \(dg -.De -Unset the terminal to from nl mode. See -.Fn nl . -.ne 1i -.Ds -.Fn noraw "" \(dg -.De -Unset the terminal from raw mode. See -.Fn raw . -.Ds -.Fn overlay "WINDOW *win1" "WINDOW *win2" -.De -Overlay -.Vn win1 -on -.Vn win2 . -The contents of -.Vn win1 , -insofar as they fit, -are placed on -.Vn win2 -at their starting \*y. -This is done non-destructively, -i.e., blanks on -.Vn win1 -leave the contents of the space on -.Vn win2 -untouched. Note that all non-blank characters are overwritten -destructively in the overlay. -.Ds -.Fn overwrite "WINDOW *win1" "WINDOW *win2" -.De -Overwrite -.Vn win1 -on -.Vn win2 . -The contents of -.Vn win1 , -insofar as they fit, -are placed on -.Vn win2 -at their starting \*y. -This is done destructively, -.i i.e. , -blanks on -.Vn win1 -become blank on -.Vn win2 . -.Ds -.Fn printw "char *fmt" "..." -.De -Performs a -.Fn printf -on the window starting at the current \*y. -It uses -.Fn addstr -to add the string on the window. -It is often advisable to use the field width options of -.Fn printf -to avoid leaving things on the window from earlier calls. -\*(Es -.Ds -.Fn raw "" \(dg -.De -Set the terminal to raw mode. -On version 7 -.Un \** -.(f -\** -.Un -is a trademark of Unix System Laboratories. -.)f -this also turns off newline mapping -(see -.Fn nl ). -.Ds -.Fn refresh "" \(dg -.De -Synchronize the terminal screen with the desired window. -If the window is not a screen, -only that part covered by it is updated. -\*(Es -In this case, it will update whatever it can -without causing the scroll. -.sp -As a special case, -if -.Fn wrefresh -is called with the window -.Vn curscr -the screen is cleared -and repainted as it is currently. -This is very useful for allowing the redrawing of the screen -when the user has garbage dumped on his terminal. -.Ds -.Fn resetty "" \(dg -.De -.Fn resetty -restores them to what -.Fn savetty -stored. -These functions are performed automatically by -.Fn initscr -and -.Fn endwin . -This function should not be used by the user. -.Ds -.Fn savetty "" \(dg -.De -.Fn savetty -saves the current tty characteristic flags. See -.Fn resetty . -This function should not be used by the user. -.Ds -.Fn scanw "char *fmt" "..." -.De -Perform a -.Fn scanf -through the window using -.Vn fmt . -It does this using consecutive calls to -.Fn getch -(or -.Fn wgetch ). -\*(Es -.ne 1i -.Ds -.Fn scroll "WINDOW *win" -.De -Scroll the window upward one line. -This is normally not used by the user. -.Ds -.Fn scrollok "WINDOW *win" "int boolf" \(dg -.De -Set the scroll flag for the given window. -If -.Vn boolf -is 0, scrolling is not allowed. -This is its default setting. -.Ds -.Fn standend "" \(dg -.De -End standout mode initiated by -.Fn standout . -.Ds -.Fn standout "" \(dg -.De -Causes any characters added to the window -to be put in standout mode on the terminal -(if it has that capability). -.Ds -.Ft "WINDOW *" -.Fn subwin "WINDOW *win" "int lines" "int cols" "int begin_y" "int begin_x" -.De -Create a new window with -.Vn lines -lines and -.Vn cols -columns starting at position -.Vn begin\*_y\*,begin\*_x ) ( -inside the window -.i win . -This means that any change made to either window -in the area covered -by the subwindow will be made on both windows. -.Vn begin\*_y\*,begin\*_x -are specified relative to the overall screen, -not the relative (0\*,0) of -.Vn win . -If either -.Vn lines -or -.Vn cols -is 0 (zero), -that dimension will be set to -.Vn "LINES \- begin\*_y" ) ( -or -.Vn "COLS \- begin\*_x" ) ( -respectively. -.Ds -.Fn touchline "WINDOW *win" "int y" "int startx" "int endx" -.De -This function performs a function similar to -.Fn touchwin -on a single line. -It marks the first change for the given line -to be -.Vn startx , -if it is before the current first change mark, -and -the last change mark is set to be -.Vn endx -if it is currently less than -.Vn endx . -.Ds -.Fn touchoverlap "WINDOW *win1" "WINDOW *win2" -.De -Touch the window -.Vn win2 -in the area which overlaps with -.Vn win1 . -If they do not overlap, -no changes are made. -.Ds -.Fn touchwin "WINDOW *win" -.De -Make it appear that the every location on the window -has been changed. -This is usually only needed for refreshes with overlapping windows. -.Ds -.Fn tstp -.De -This function -will save the current tty state -and then put the process to sleep. -When the process gets restarted, -it restores the saved tty state -and then calls -.Fn wrefresh "curscr" -to redraw the screen. -.Fn Initscr -sets the signal -SIGTSTP -to trap to this routine. -.Ds -.Fn unctrl "char *ch" \(dg -.De -Returns a string which is an ASCII representation of -.Vn ch . -Characters are 8 bits long. -.Ds -.Fn unctrllen "char *ch" \(dg -.De -Returns the length of the ASCII representation of -.Vn ch . -.ne 1i -.Ds -.Fn vwprintw "WINDOW *win" "const char *fmt" "va_list ap" -.De -Identical to -.Fn printw -except that it takes both a window specification and a pointer to a variable -length argument list. -.Ds -.Fn vwscanw "WINDOW *win" "const char *fmt" "va_list ap" -.De -Identical to -.Fn scanw -except that it takes both a window specification and a pointer to a variable -length argument list. -.Ds -.Fn waddbytes "WINDOW *win" "char *str" "int len" -.De -This function is the low level character output function. -.Vn Len -characters of the string -.Vn str -are output to the current \*y position of the window specified by -.Vn win. -.sp 2 -.pp -\fIThe following functions differ from the standard functions only in their -specification of a window, rather than the use of the default -.Vn stdscr.\fP -.Ds -.Fn waddch "WINDOW *win" "char ch" -.Fn waddstr "WINDOW *win" "char *str" -.Fn wclear "WINDOW *win" -.Fn wclrtobot "WINDOW *win" -.Fn wclrtoeol "WINDOW *win" -.Fn wdelch "WINDOW *win" -.Fn wdeleteln "WINDOW *win" -.Fn werase "WINDOW *win" -.Fn wgetch "WINDOW *win" -.Fn wgetstr "WINDOW *win" "char *str" -.Fn winch "WINDOW *win" \(dg -.Fn winsch "WINDOW *win" "char c" -.Fn winsertln "WINDOW *win" -.Fn wmove "WINDOW *win" "int y" int x" -.Fn wprintw "WINDOW *win" "char *fmt" "..." -.Fn wrefresh "WINDOW *win" -.Fn wscanw "WINDOW *win" "char *fmt" "..." -.Fn wstandend "WINDOW *win" -.Fn wstandout "WINDOW *win" -.Dg diff --git a/lib/libcurses/PSD.doc/intro.0 b/lib/libcurses/PSD.doc/intro.0 deleted file mode 100644 index c95b49d4782..00000000000 --- a/lib/libcurses/PSD.doc/intro.0 +++ /dev/null @@ -1,106 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.0 8.1 (Berkeley) 6/4/93 -.\" -.tp -.(l C -.ps 12 -.ft B -Screen Updating and Cursor Movement Optimization: -.fl -A Library Package -.ft -.ps -.sp -.i "Kenneth C. R. C. Arnold" -.i "Elan Amir" -.sp -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, California 94720 -.sp 3 -.bi ABSTRACT -.sp 2 -.)l -.(q -.pp -This document describes a package of C library functions -which allow the user to: -.ie t .ip \ \ \ \(bu -.el .ip 1) -update a screen with reasonable optimization, -.ie t .ip \ \ \ \(bu -.el .ip 2) -get input from the terminal -in a screen-oriented fashion, -and -.ie t .ip \ \ \ \(bu -.el .ip 3) -independent from the above, move the cursor optimally -from one point to another. -.pp -These routines all use the -\*(tc \*(db to describe the capabilities of the terminal. -.)q -.b Acknowledgements -.pp -This package would not exist -without the work of Bill Joy, -who, -in writing his editor, -created the capability to generally describe terminals, -wrote the routines which read this \*(db, -and, most importantly, -those which implement optimal cursor movement, -which routines I have simply lifted nearly intact. -Doug Merritt and Kurt Shoens also were extremely important, -as were both willing to waste time listening to me rant and rave. -The help and/or support of -Ken Abrams, -Alan Char, -Mark Horton, -and -Joe Kalash, -was, and is, -also greatly appreciated. -.i "Ken Arnold 16 April 1986" -.pp -The help and/or support of Kirk McKusick and Keith Bostic (public vi!) -was invaluable in bringing the package ``into the 90's'', which now -includes completely new data structures and screen refresh optimization -routines. -.i "Elan Amir 29 December 1992" - - - - diff --git a/lib/libcurses/PSD.doc/intro.1 b/lib/libcurses/PSD.doc/intro.1 deleted file mode 100644 index a86d7571ade..00000000000 --- a/lib/libcurses/PSD.doc/intro.1 +++ /dev/null @@ -1,249 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.1 8.1 (Berkeley) 6/4/93 -.\" -.bp -.sh 1 Overview -.pp -In making available the generalized terminal descriptions in \*(tc, -much information was made available to the programmer, -but little work was taken out of one's hands. -The purpose of this package is to allow the C programmer -to do the most common type of terminal dependent functions, -those of movement optimization and optimal screen updating, -without doing any of the dirty work, -and with nearly as much ease as is necessary to simply print -or read things. -.sh 2 "Terminology" -.pp -In this document, the following terminology is used: -.de Ip -.sp -.in 5n -.ti 0n -.b "\\$1" : -.. -.Ip window -An internal representation -containing an image of what a section of the terminal screen may look like -at some point in time. -This subsection can either encompass the entire terminal screen, -or any smaller portion down to a single character within that screen. -.Ip terminal -Sometimes called -.b terminal -.b screen . -The package's idea of what the terminal's screen currently looks like, -.i i.e. , -what the user sees now. -This is a special -.i screen : -.Ip screen -This is a subset of windows which are as large as the terminal screen, -.i i.e. , -they start at the upper left hand corner -and encompass the lower right hand corner. -One of these, -.Vn stdscr , -is automatically provided for the programmer. -.rm Ip -.sh 2 "Compiling Applications" -.pp -In order to use the library, -it is necessary to have certain types and variables defined. -Therefore, the programmer must have a line: -.(l -.b "#include <curses.h>" -.)l -at the top of the program source. -Compilations should have the following form: -.(l -.ie t \fBcc\fR [ \fIflags\fR ] file ... \fB\-lcurses \-ltermcap\fR -.el \fIcc\fR [ flags ] file ... \fI\-lcurses \-ltermcap\fR -.)l -.sh 2 "Screen Updating" -.pp -In order to update the screen optimally, -it is necessary for the routines to know what the screen currently looks like -and what the programmer wants it to look like next. -For this purpose, -a data type -(structure) -named -.Vn WINDOW -is defined -which describes a window image to the routines, -including its starting position on the screen -(the \*y of the upper left hand corner) -and its size. -One of these -(called -.Vn curscr -for -.i "current screen" ) -is a screen image of what the terminal currently looks like. -Another screen -(called -.Vn stdscr , -for -.i "standard screen" ) -is provided -by default -to make changes on. -.pp -A window is a purely internal representation. -It is used to build and store -a potential image of a portion of the terminal. -It doesn't bear any necessary relation -to what is really on the terminal screen. -It is more like an array of characters on which to make changes. -.pp -When one has a window which describes -what some part the terminal should look like, -the routine -.Fn refresh -(or -.Fn wrefresh -if the window is not -.Vn stdscr ) -is called. -.Fn Refresh -makes the terminal, -in the area covered by the window, -look like that window. -Note, therefore, that changing something on a window -.i does -.bi not -.i "change the terminal" . -Actual updates to the terminal screen -are made only by calling -.Fn refresh -or -.Fn wrefresh . -This allows the programmer to maintain several different ideas -of what a portion of the terminal screen should look like. -Also, changes can be made to windows in any order, -without regard to motion efficiency. -Then, at will, -the programmer can effectively say -.q "make it look like this" , -and the package will execute the changes in an optimal way. -.sh 2 "Naming Conventions" -.pp -As hinted above, -the routines can use several windows, -but two are always available: -.Vn curscr , -which is the image of what the terminal looks like at present, -and -.Vn stdscr , -which is the image of what the programmer wants the terminal to look like next. -The user should not access -.Vn curscr -directly. -Changes should be made to -the appropriate screen, -and then the routine -.Fn refresh -(or -.Fn wrefresh ) -should be called. -.pp -Many functions are set up to deal with -.Vn stdscr -as a default screen. -For example, to add a character to -.Vn stdscr , -one calls -.Fn addch -with the desired character. -If a different window is to be used, -the routine -.Fn waddch -(for -.b w indow-specific -.Fn addch ) -is provided\**. -.(f -\** -Actually, -.Fn addch -is really a -.q #define -macro with arguments, -as are most of the "functions" which act upon -.Vn stdscr . -.)f -This convention of prepending function names with a -.Bq w -when they are to be applied to specific windows -is consistent. -The only routines which do -.i not -do this are those -to which a window must always be specified. -.pp -In order to move the current \*y from one point to another, -the routines -.Fn move -and -.Fn wmove -are provided. -However, -it is often desirable to first move and then perform some I/O operation. -In order to avoid clumsiness, -most I/O routines can be preceded by the prefix -.Bq mv -and the desired \*y can then be added to the arguments to the function. -For example, -the calls -.(l -move(y\*,x); -addch(ch); -.)l -can be replaced by -.(l -mvaddch(y\*,x\*,ch); -.)l -and -.(l -wmove(win\*,y\*,x); -waddch(win\*,ch); -.)l -can be replaced by -.(l -mvwaddch(win\*,y\*,x\*,ch); -.)l -Note that the window description pointer -.Vn win ) ( -comes before the added \*y. -If a window pointer is needed, it is always the first parameter passed. diff --git a/lib/libcurses/PSD.doc/intro.2 b/lib/libcurses/PSD.doc/intro.2 deleted file mode 100644 index d98c0c76198..00000000000 --- a/lib/libcurses/PSD.doc/intro.2 +++ /dev/null @@ -1,77 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.2 8.1 (Berkeley) 6/4/93 -.\" -.sh 1 Variables -.pp -Many variables which are used to describe the terminal environment -are available to the programmer. They are: -.(b -.TS -expand; -lw(6m) lw(8n) lw(50n). -type name description -_ -WINDOW * curscr T{ -.fi -current version of the screen (terminal screen). -T} -WINDOW * stdscr T{ -standard screen. Most updates are usually done here. -T} -char * Def\*_term T{ -default terminal type if type cannot be determined -T} -bool My\*_term T{ -use the terminal specification in \fIDef\*_term\fR as terminal, -irrelevant of real terminal type -T} -char * ttytype T{ -full name of the current terminal. -T} -int LINES T{ -number of lines on the terminal -T} -int COLS T{ -number of columns on the terminal -T} -int ERR T{ -error flag returned by routines on a fail. -T} -int OK T{ -flag returned by routines upon success. -T} -.TE -.fi -.ev -.)b -.lp diff --git a/lib/libcurses/PSD.doc/intro.3 b/lib/libcurses/PSD.doc/intro.3 deleted file mode 100644 index d0ba9a2ab7b..00000000000 --- a/lib/libcurses/PSD.doc/intro.3 +++ /dev/null @@ -1,228 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.3 8.1 (Berkeley) 6/4/93 -.\" -.sh 1 Usage -.pp -This is a description of how to actually use the screen package. -For simplicity, we assume all updating, reading, etc. -is applied to -.Vn stdscr , -although a different window can of course be specified. -.sh 2 "Initialization" -.pp -In order to use the screen package, -the routines must know about terminal characteristics, -and the space for -.Vn curscr -and -.Vn stdscr -must be allocated. -These functions are performed by -.Fn initscr . -Since it must allocate space for the windows, -it can overflow core when attempting to do so. -On this rather rare occasion, -.Fn initscr -returns ERR. -.Fn Initscr -must -.bi always -be called before any of the routines which affect windows are used. -If it is not, -the program will core dump as soon as either -.Vn curscr -or -.Vn stdscr -are referenced. -However, it is usually best to wait to call it -until after you are sure you will need it, -like after checking for startup errors. -Terminal status changing routines -like -.Fn nl -and -.Fn cbreak -should be called after -.Fn initscr . -.pp -After the initial window allocation done by -.Fn initscr , -specific window characteristics can be set. -Scrolling can be enabled by calling -.Fn scrollok . -If you want the cursor to be left after the last change, use -.Fn leaveok . -If this isn't done, -.Fn refresh -will move the cursor to the window's current \*y after updating it. -Additional windows can be created by using the functions -.Fn newwin -and -.Fn subwin . -.Fn Delwin -allows you to delete an exisiting window. -The variables -.Vn LINES -and -.Vn COLS -control the size of the terminal. They are initially implicitly set by -.Fn initscr , -but can be altered explicitly by the user followed by a call to -.Fn initscr . -Note that any call to -.Fn initscr , -will always delete any existing -.Vn stdscr -and/or -.Vn curscr -before creating new ones so this change is best done before the initial call to -.Fn initscr . -.pp -.sh 2 "Output" -.pp -The basic functions -used to change what will go on a window are -.Fn addch -and -.Fn move . -.Fn Addch -adds a character at the current \*y, -returning ERR if it would cause the window to illegally scroll, -.i i.e. , -printing a character in the lower right-hand corner -of a terminal which automatically scrolls -if scrolling is not allowed. -.Fn Move -changes the current \*y to whatever you want them to be. -It returns ERR if you try to move off the window. -As mentioned above, you can combine the two into -.Fn mvaddch -to do both things in one call. -.pp -The other output functions -(such as -.Fn addstr -and -.Fn printw ) -all call -.Fn addch -to add characters to the window. -.pp -After a change has been made to the window, -you must call -.Fn refresh . -when you want the portion of the terminal covered by the window -to reflect the change. -In order to optimize finding changes, -.Fn refresh -assumes that any part of the window not changed -since the last -.Fn refresh -of that window has not been changed on the terminal, -.i i.e. , -that you have not refreshed a portion of the terminal -with an overlapping window. -If this is not the case, -the routines -.Fn touchwin , -.Fn touchline , -and -.Fn touchoverlap -are provided to make it look like a desired part of window has been changed, -thus forcing -.Fn refresh -to check that whole subsection of the terminal for changes. -.pp -If you call -.Fn wrefresh -with -.Vn curscr , -it will make the screen look like the image of -.Vn curscr . -This is useful for implementing a command -which would redraw the screen in case it got messed up. -.sh 2 Input -.pp -Input is essentially a mirror image of output. -The complementary function to -.Fn addch -is -.Fn getch -which, -if echo is set, -will call -.Fn addch -to echo the character. -Since the screen package needs to know what is on the terminal at all times, -if characters are to be echoed, -the tty must be in raw or cbreak mode. -If it is not, -.Fn getch -sets it to be cbreak, -and then reads in the character. -.sh 2 "Termination" -.pp -In order to perform certain optimizations, -and, -on some terminals, -to work at all, -some things must be done -before the screen routines start up. -These functions are performed in -.Fn getttmode -and -.Fn setterm , -which are called by -.Fn initscr . -In order to clean up after the routines, -the routine -.Fn endwin -is provided. -It restores tty modes to what they were -when -.Fn initscr -was first called. -The terminal state module uses the variable -.Vn curses_termios -to save the original terminal state which is then restored upon a call to -.Fn endwin . -Thus, -anytime after the call to initscr, -.Fn endwin -should be called before exiting. Note however, that -.Fn endwin -should always be called -.b before -the final calls to -.Fn delwin , -which free the storage of the windows. diff --git a/lib/libcurses/PSD.doc/intro.4 b/lib/libcurses/PSD.doc/intro.4 deleted file mode 100644 index 9e529822c5d..00000000000 --- a/lib/libcurses/PSD.doc/intro.4 +++ /dev/null @@ -1,69 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.4 8.1 (Berkeley) 6/4/93 -.\" -.sh 1 "Cursor Movement Optimizations" -.pp -One of the most difficult things to do properly is motion optimization. -After using -.Fn gettmode -and -.Fn setterm -to get the terminal descriptions, -the function -.Fn mvcur -deals with this task. -It usage is simple: -simply tell it where you are now and where you want to go. -For example -.(l -mvcur(0\*,0\*,LINES/2\*,COLS/2); -.)l -.lp -would move the cursor from the home position (0\*,0) -to the middle of the screen. -If you wish to force absolute addressing, -you can use the function -.Fn tgoto -from the -.b termlib (7) -routines, -or you can tell -.Fn mvcur -that you are impossibly far away, -For example, -to absolutely address the lower left hand corner of the screen -from anywhere -just claim that you are in the upper right hand corner: -.(l -mvcur(0\*,COLS\-1\*,LINES\-1\*,0); -.)l diff --git a/lib/libcurses/PSD.doc/intro.5 b/lib/libcurses/PSD.doc/intro.5 deleted file mode 100644 index d0f96575b4b..00000000000 --- a/lib/libcurses/PSD.doc/intro.5 +++ /dev/null @@ -1,87 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.5 8.1 (Berkeley) 6/4/93 -.\" -.sh 1 "Character Output and Scrolling" -.pp -The character output policy deals with the following problems. First, -where is the location of the cursor after a character is printed, and -secondly, when does the screen scroll if scrolling is enabled. -.pp -In the normal case the characters are output as expected, with the cursor -occupying the position of the next character to be output. However, when the -cursor is on the last column of the line, the cursor will remain on that -position after the last character on the line is output and will only assume -the position on the next line when the next character (the first on the next -line) is output. -.pp -Likewise, if scrolling is enabled, a scroll will be invoked only when the -first character on he first line past the bottom line of the window is -output. If scrolling is not enabled the chracters will to be output to the -bottom right corner of the window which is the cursor location. -.pp -This policy allows consistent behavior of the cursor at the boundary -conditions. Furthermore, it prevents a scroll from happening before it is -actually needed (the old package used to scroll when the bottom right position -was output a character). As a precendent, it models the -.i xterm -character output conventions. -.sh 1 "Terminal State Handling" -.pp -The variable -.Vn curses_termios -contains the terminal state of the terminal. Certain historical routines -return information: -.Fn baudrate , -.Fn erasechar , -.Fn killchar , -and -.Fn ospeed . -These routines are obsolete and exist only for backward compatibility. If -you wish to use the information in the -.Vn curses_termios -structure, you should use the -\fItsetattr\fP(3) -routines. -.sh 1 "Subwindows" -.pp -Subwindows are windows which do not have an independent text structure, -.i i.e. , -they are windows whose text is a subset of the text of a larger window: the -.i parent -window. One consequence of this is that changes to either the parent or the -child window are destructive to the other, -.i i.e. , -a change to the subwindow is also a change to the parent window and a change -to the parent window in the region defined by the subwindow is implicitly a -change to the subwindow as well. -Apart from this detail, subwindows function like any other window. diff --git a/lib/libcurses/PSD.doc/intro.6 b/lib/libcurses/PSD.doc/intro.6 deleted file mode 100644 index 7c4560dc33a..00000000000 --- a/lib/libcurses/PSD.doc/intro.6 +++ /dev/null @@ -1,44 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)intro.6 8.1 (Berkeley) 6/4/93 -.\" -.sh 1 "The Functions" -.pp -In the following definitions, -.q \*m -means that the -.q function -is really a -.q #define -macro with arguments. -.ta 11m 17m 25m 33m 41m 49m 57m 65m 73m -.so fns.doc diff --git a/lib/libcurses/PSD.doc/life.c b/lib/libcurses/PSD.doc/life.c deleted file mode 100644 index 72febba29ae..00000000000 --- a/lib/libcurses/PSD.doc/life.c +++ /dev/null @@ -1,163 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)life.c 8.1 (Berkeley) 6/8/93 -.\" -# include <curses.h> -# include <signal.h> - -/* - * Run a life game. This is a demonstration program for - * the Screen Updating section of the -lcurses cursor package. - */ - -typedef struct lst_st { /* linked list element */ - int y, x; /* (y, x) position of piece */ - struct lst_st *next, *last; /* doubly linked */ -} LIST; - -LIST *Head; /* head of linked list */ - -int die(); - -main(ac, av) -int ac; -char *av[]; -{ - evalargs(ac, av); /* evaluate arguments */ - - initscr(); /* initialize screen package */ - signal(SIGINT, die); /* set to restore tty stats */ - cbreak(); /* set for char-by-char */ - noecho(); /* input */ - nonl(); /* for optimization */ - - getstart(); /* get starting position */ - for (;;) { - prboard(); /* print out current board */ - update(); /* update board position */ - } -} - -/* - * This is the routine which is called when rubout is hit. - * It resets the tty stats to their original values. This - * is the normal way of leaving the program. - */ -die() -{ - signal(SIGINT, SIG_IGN); /* ignore rubouts */ - mvcur(0, COLS - 1, LINES - 1, 0); /* go to bottom of screen */ - endwin(); /* set terminal to good state */ - exit(0); -} - -/* - * Get the starting position from the user. They keys u, i, o, j, l, - * m, ,, and . are used for moving their relative directions from the - * k key. Thus, u move diagonally up to the left, , moves directly down, - * etc. x places a piece at the current position, " " takes it away. - * The input can also be from a file. The list is built after the - * board setup is ready. - */ -getstart() -{ - reg char c; - reg int x, y; - auto char buf[100]; - - box(stdscr, '|', '_'); /* box in the screen */ - move(1, 1); /* move to upper left corner */ - - for (;;) { - refresh(); /* print current position */ - if ((c = getch()) == 'q') - break; - switch (c) { - case 'u': - case 'i': - case 'o': - case 'j': - case 'l': - case 'm': - case ',': - case '.': - adjustyx(c); - break; - case 'f': - mvaddstr(0, 0, "File name: "); - getstr(buf); - readfile(buf); - break; - case 'x': - addch('X'); - break; - case ' ': - addch(' '); - break; - } - } - - if (Head != NULL) /* start new list */ - dellist(Head); - Head = malloc(sizeof (LIST)); - - /* - * loop through the screen looking for 'x's, and add a list - * element for each one - */ - for (y = 1; y < LINES - 1; y++) - for (x = 1; x < COLS - 1; x++) { - move(y, x); - if (inch() == 'x') - addlist(y, x); - } -} - -/* - * Print out the current board position from the linked list - */ -prboard() { - - reg LIST *hp; - - erase(); /* clear out last position */ - box(stdscr, '|', '_'); /* box in the screen */ - - /* - * go through the list adding each piece to the newly - * blank board - */ - for (hp = Head; hp; hp = hp->next) - mvaddch(hp->y, hp->x, 'X'); - - refresh(); -} diff --git a/lib/libcurses/PSD.doc/macros b/lib/libcurses/PSD.doc/macros deleted file mode 100644 index b7f3abf793e..00000000000 --- a/lib/libcurses/PSD.doc/macros +++ /dev/null @@ -1,144 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)macros 8.1 (Berkeley) 8/14/93 -.\" -.\" this is the uncommented version. The commented one is in "macros.coms" -.ie t .ds _ \d\(mi\u -.el .ds _ _ -.ds , ,\ -.ds y (y\*,x) co-ordinates -.ds db database -.ie n .ds f \fI -.el .ds f \fB -.ds tc \*ftermcap\fP(5) -.ds Es This returns ERR if it would cause the screen to scroll illegally. -.ds Nm This has no associated \*(lq\fBmv\fP\*(rq command. -.ie t .ds m \fB\s-2\(dg\s+2\fP -.el .ds m [*] -.\" .hy WINDOW -.\".he ''\*(Ln'' -.\".fo ''\- % \-'' -.oh '\*(Ln''PS1:19-%' -.eh 'PS1:19-%''\*(Ln' -.de Un -.b -\s-2\\$2UNIX\\$1\s+2 -.ft -.. -.de Ds -.sp -.lp -.ev 1 -.nf -.ft I -.in 0 -.di Df -.. -.de De -.di -.Df -.ne \n(dn+2 -.ev -.ip -.. -.de Dg -.di -.Df -.ne \n(dn+2 -.ev -.. -.de Fd -.br -\&\\$4 -.fi -.b -\&\\$1(\\$2) -.ft -\&\\$3 -.br -.nf -.. -.de Vn -\&\\$3\c -.i "\\$1" \\$2 -.. -.de Bq -.ie t \&\*(lq\fB\\$1\fP\*(rq -.el \&\*(lq\fI\\$1\fP\*(rq -.. -.de $0 -.(x -.in \\n(Xs -\\*($n \\$1 -.)x -.. -.de $1 -.nr Xs 0 -.. -.de $2 -.nr Xs 3 -.. -.de $3 -.nr Xs 6 -.. -.de Fn -.if \\n(.$==0 .tm error -.nr ll 0 -.nr dg 0 -.ft R -.if '\\$\\n(.$'.' .nr ll 1 -.if '\\$\\n(.$',' .nr ll 1 -.if '\\$\\n(.$')' .nr ll 1 -.if '\\$\\n(.$').' .nr ll 1 -.if '\\$\\n(.$';' .nr ll 1 -.if '\\$\\n(.$':' .nr ll 1 -.if '\\$\\n(.$'\'s' .nr ll 1 -.if '\\$\\n(.$'\(dg' .nr ll 1 -.\" .if '\\$\\n(.$'' .nr ll 1 -.nr al \\n(.$-\\n(ll -.ds ot \f(CB\\$1\fP( -.if \\n(al>1 .as ot \fI\\$2\fP -.if \\n(al>2 .as ot ", \fI\\$3\fP -.if \\n(al>3 .as ot ", \fI\\$4\fP -.if \\n(al>4 .as ot ", \fI\\$5\fP -.if \\n(al>5 .as ot ", \fI\\$6\fP -.if \\n(al>6 .as ot ", \fI\\$7\fP -.if \\n(al>7 .as ot ", \fI\\$8\fP -.if \\n(al>8 .as ot ", \fI\\$9\fP -.as ot ) -.if \\n(.$>1 \{\ -. if \\n(ll==0 .as ot ; -. if '\\$\\n(.$'\(dg' .as ot ; -.\} -.if \\n(ll==1 .as ot \\$\\n(.$ -\\*(ot -.. diff --git a/lib/libcurses/PSD.doc/twinkle1.c b/lib/libcurses/PSD.doc/twinkle1.c deleted file mode 100644 index 7d3d00db203..00000000000 --- a/lib/libcurses/PSD.doc/twinkle1.c +++ /dev/null @@ -1,157 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)twinkle1.c 8.1 (Berkeley) 6/8/93 -.\" -# include <curses.h> -# include <signal.h> - -/* - * the idea for this program was a product of the imagination of - * Kurt Schoens. Not responsible for minds lost or stolen. - */ - -# define NCOLS 80 -# define NLINES 24 -# define MAXPATTERNS 4 - -typedef struct { - int y, x; -} LOCS; - -LOCS Layout[NCOLS * NLINES]; /* current board layout */ - -int Pattern, /* current pattern number */ - Numstars; /* number of stars in pattern */ - -char *getenv(); - -int die(); - -main() -{ - srand(getpid()); /* initialize random sequence */ - - initscr(); - signal(SIGINT, die); - noecho(); - nonl(); - leaveok(stdscr, TRUE); - scrollok(stdscr, FALSE); - - for (;;) { - makeboard(); /* make the board setup */ - puton('*'); /* put on '*'s */ - puton(' '); /* cover up with ' 's */ - } -} - -/* - * On program exit, move the cursor to the lower left corner by - * direct addressing, since current location is not guaranteed. - * We lie and say we used to be at the upper right corner to guarantee - * absolute addressing. - */ -die() -{ - signal(SIGINT, SIG_IGN); - mvcur(0, COLS - 1, LINES - 1, 0); - endwin(); - exit(0); -} - - -/* - * Make the current board setup. It picks a random pattern and - * calls ison() to determine if the character is on that pattern - * or not. - */ -makeboard() -{ - reg int y, x; - reg LOCS *lp; - - Pattern = rand() % MAXPATTERNS; - lp = Layout; - for (y = 0; y < NLINES; y++) - for (x = 0; x < NCOLS; x++) - if (ison(y, x)) { - lp->y = y; - lp->x = x; - lp++; - } - Numstars = lp - Layout; -} - -/* - * Return TRUE if (y, x) is on the current pattern. - */ -ison(y, x) -reg int y, x; { - - switch (Pattern) { - case 0: /* alternating lines */ - return !(y & 01); - case 1: /* box */ - if (x >= LINES && y >= NCOLS) - return FALSE; - if (y < 3 || y >= NLINES - 3) - return TRUE; - return (x < 3 || x >= NCOLS - 3); - case 2: /* holy pattern! */ - return ((x + y) & 01); - case 3: /* bar across center */ - return (y >= 9 && y <= 15); - } - /* NOTREACHED */ -} - -puton(ch) -reg char ch; -{ - reg LOCS *lp; - reg int r; - reg LOCS *end; - LOCS temp; - - end = &Layout[Numstars]; - for (lp = Layout; lp < end; lp++) { - r = rand() % Numstars; - temp = *lp; - *lp = Layout[r]; - Layout[r] = temp; - } - - for (lp = Layout; lp < end; lp++) { - mvaddch(lp->y, lp->x, ch); - refresh(); - } -} diff --git a/lib/libcurses/PSD.doc/twinkle2.c b/lib/libcurses/PSD.doc/twinkle2.c deleted file mode 100644 index 0a25590fcde..00000000000 --- a/lib/libcurses/PSD.doc/twinkle2.c +++ /dev/null @@ -1,96 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)twinkle2.c 8.1 (Berkeley) 6/8/93 -.\" -extern int _putchar(); - -main() -{ - reg char *sp; - - srand(getpid()); /* initialize random sequence */ - - if (isatty(0)) { - gettmode(); - if ((sp = getenv("TERM")) != NULL) - setterm(sp); - signal(SIGINT, die); - } - else { - printf("Need a terminal on %d\n", _tty_ch); - exit(1); - } - _puts(TI); - _puts(VS); - - noecho(); - nonl(); - tputs(CL, NLINES, _putchar); - for (;;) { - makeboard(); /* make the board setup */ - puton('*'); /* put on '*'s */ - puton(' '); /* cover up with ' 's */ - } -} - -puton(ch) -char ch; -{ - reg LOCS *lp; - reg int r; - reg LOCS *end; - LOCS temp; - static int lasty, lastx; - - end = &Layout[Numstars]; - for (lp = Layout; lp < end; lp++) { - r = rand() % Numstars; - temp = *lp; - *lp = Layout[r]; - Layout[r] = temp; - } - - for (lp = Layout; lp < end; lp++) - /* prevent scrolling */ - if (!AM || (lp->y < NLINES - 1 || lp->x < NCOLS - 1)) { - mvcur(lasty, lastx, lp->y, lp->x); - putchar(ch); - lasty = lp->y; - if ((lastx = lp->x + 1) >= NCOLS) - if (AM) { - lastx = 0; - lasty++; - } - else - lastx = NCOLS - 1; - } -} diff --git a/lib/libcurses/PSD.doc/win_st.c b/lib/libcurses/PSD.doc/win_st.c deleted file mode 100644 index 7790f6ca632..00000000000 --- a/lib/libcurses/PSD.doc/win_st.c +++ /dev/null @@ -1,58 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)win_st.c 8.1 (Berkeley) 6/8/93 -.\" -# define WINDOW struct _win_st - -struct _win_st { - short _cury, _curx; - short _maxy, _maxx; - short _begy, _begx; - short _flags; - short _ch_off; - bool _clear; - bool _leave; - bool _scroll; - char **_y; - short *_firstch; - short *_lastch; - struct _win_st *_nextp, *_orig; -}; - -# define _ENDLINE 001 -# define _FULLWIN 002 -# define _SCROLLWIN 004 -# define _FLUSH 010 -# define _FULLLINE 020 -# define _IDLINE 040 -# define _STANDOUT 0200 -# define _NOCHANGE -1 diff --git a/lib/libcurses/addbytes.c b/lib/libcurses/addbytes.c deleted file mode 100644 index 6dd8bf959b5..00000000000 --- a/lib/libcurses/addbytes.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 1987, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -#define SYNCH_IN {y = win->cury; x = win->curx;} -#define SYNCH_OUT {win->cury = y; win->curx = x;} - -/* - * waddbytes -- - * Add the character to the current position in the given window. - */ -int -__waddbytes(win, bytes, count, so) - register WINDOW *win; - register const char *bytes; - register int count; - int so; -{ - static char blanks[] = " "; - register int c, newx, x, y; - char stand; - __LINE *lp; - - SYNCH_IN; - -#ifdef DEBUG - __CTRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x); -#endif - while (count--) { - c = *bytes++; - switch (c) { - case '\t': - SYNCH_OUT; - if (waddbytes(win, blanks, 8 - (x % 8)) == ERR) - return (ERR); - SYNCH_IN; - break; - - default: -#ifdef DEBUG - __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x); -#endif - - lp = win->lines[y]; - if (lp->flags & __ISPASTEOL) { - lp->flags &= ~__ISPASTEOL; -newline: if (y == win->maxy - 1) { - if (win->flags & __SCROLLOK) { - SYNCH_OUT; - scroll(win); - SYNCH_IN; - lp = win->lines[y]; - x = 0; - } else - return (ERR); - } else { - y++; - lp = win->lines[y]; - x = 0; - } - if (c == '\n') - break; - } - - stand = '\0'; - if (win->flags & __WSTANDOUT || so) - stand |= __STANDOUT; -#ifdef DEBUG - __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", - y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); -#endif - if (lp->line[x].ch != c || - !(lp->line[x].attr & stand)) { - newx = x + win->ch_off; - if (!(lp->flags & __ISDIRTY)) { - lp->flags |= __ISDIRTY; - *lp->firstchp = *lp->lastchp = newx; - } - else if (newx < *lp->firstchp) - *lp->firstchp = newx; - else if (newx > *lp->lastchp) - *lp->lastchp = newx; -#ifdef DEBUG - __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", - *lp->firstchp, *lp->lastchp, - *lp->firstchp - win->ch_off, - *lp->lastchp - win->ch_off); -#endif - } - lp->line[x].ch = c; - if (stand) - lp->line[x].attr |= __STANDOUT; - else - lp->line[x].attr &= ~__STANDOUT; - if (x == win->maxx - 1) - lp->flags |= __ISPASTEOL; - else - x++; -#ifdef DEBUG - __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", - y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); -#endif - break; - case '\n': - SYNCH_OUT; - wclrtoeol(win); - SYNCH_IN; - if (!NONL) - x = 0; - goto newline; - case '\r': - x = 0; - break; - case '\b': - if (--x < 0) - x = 0; - break; - } - } - SYNCH_OUT; - return (OK); -} diff --git a/lib/libcurses/addch.c b/lib/libcurses/addch.c deleted file mode 100644 index d5f30014c02..00000000000 --- a/lib/libcurses/addch.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)addch.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * waddch -- - * Add the character to the current position in the given window. - * - */ -int -waddch(win, ch) - WINDOW *win; - int ch; -{ - __LDATA buf; - - buf.ch = ch; - buf.attr = 0; - return (__waddch(win, &buf)); -} - -int -__waddch(win, dp) - WINDOW *win; - __LDATA *dp; -{ - char buf[2]; - - buf[0] = dp->ch; - return (__waddbytes(win, buf, 1, dp->attr & __STANDOUT)); -} diff --git a/lib/libcurses/addnstr.c b/lib/libcurses/addnstr.c deleted file mode 100644 index 92a6e681a54..00000000000 --- a/lib/libcurses/addnstr.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)addnstr.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <string.h> - -#include "curses.h" - -/* - * waddnstr -- - * Add a string (at most n characters) to the given window - * starting at (_cury, _curx). If n is negative, add the - * entire string. - */ -int -waddnstr(win, s, n) - WINDOW *win; - const char *s; - int n; -{ - size_t len; - const char *p; - - if (n > 0) - for (p = s, len = 0; n-- && *p++; ++len); - else - len = strlen(s); - return (waddbytes(win, s, len)); -} diff --git a/lib/libcurses/box.c b/lib/libcurses/box.c deleted file mode 100644 index 191e37cfd82..00000000000 --- a/lib/libcurses/box.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)box.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * box -- - * Draw a box around the given window with "vert" as the vertical - * delimiting char, and "hor", as the horizontal one. - */ -int -box(win, vert, hor) - register WINDOW *win; - int vert, hor; -{ - register int endy, endx, i; - register __LDATA *fp, *lp; - - endx = win->maxx; - endy = win->maxy - 1; - fp = win->lines[0]->line; - lp = win->lines[endy]->line; - for (i = 0; i < endx; i++) { - fp[i].ch = lp[i].ch = hor; - fp[i].attr &= ~__STANDOUT; - lp[i].attr &= ~__STANDOUT; - } - endx--; - for (i = 0; i <= endy; i++) { - win->lines[i]->line[0].ch = vert; - win->lines[i]->line[endx].ch = vert; - win->lines[i]->line[0].attr &= ~__STANDOUT; - win->lines[i]->line[endx].attr &= ~__STANDOUT; - } - if (!(win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN)) { - fp[0].ch = fp[endx].ch = lp[0].ch = lp[endx].ch = ' '; - fp[0].attr &= ~__STANDOUT; - fp[endx].attr &= ~__STANDOUT; - lp[0].attr &= ~__STANDOUT; - lp[endx].attr &= ~__STANDOUT; - } - __touchwin(win); - return (OK); -} diff --git a/lib/libcurses/clear.c b/lib/libcurses/clear.c deleted file mode 100644 index 54c0b30d3cf..00000000000 --- a/lib/libcurses/clear.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)clear.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * wclear -- - * Clear the window. - */ -int -wclear(win) - register WINDOW *win; -{ - if (werase(win) == OK) { - win->flags |= __CLEAROK; - return (OK); - } - return (ERR); -} diff --git a/lib/libcurses/clrtobot.c b/lib/libcurses/clrtobot.c deleted file mode 100644 index 81ee6a4603a..00000000000 --- a/lib/libcurses/clrtobot.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)clrtobot.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * wclrtobot -- - * Erase everything on the window. - */ -int -wclrtobot(win) - register WINDOW *win; -{ - register int minx, startx, starty, y; - register __LDATA *sp, *end, *maxx; - - if (win->lines[win->cury]->flags & __ISPASTEOL) { - starty = win->cury + 1; - startx = 0; - } else { - starty = win->cury; - startx = win->curx; - } - for (y = starty; y < win->maxy; y++) { - minx = -1; - end = &win->lines[y]->line[win->maxx]; - for (sp = &win->lines[y]->line[startx]; sp < end; sp++) - if (sp->ch != ' ' || sp->attr != 0) { - maxx = sp; - if (minx == -1) - minx = sp - win->lines[y]->line; - sp->ch = ' '; - sp->attr = 0; - } - if (minx != -1) - __touchline(win, y, minx, maxx - win->lines[y]->line, - 0); - startx = 0; - } - return (OK); -} diff --git a/lib/libcurses/clrtoeol.c b/lib/libcurses/clrtoeol.c deleted file mode 100644 index 44fc190fee3..00000000000 --- a/lib/libcurses/clrtoeol.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)clrtoeol.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * wclrtoeol -- - * Clear up to the end of line. - */ -int -wclrtoeol(win) - register WINDOW *win; -{ - register int minx, x, y; - register __LDATA *end, *maxx, *sp; - - y = win->cury; - x = win->curx; - if (win->lines[y]->flags & __ISPASTEOL) { - if (y < win->maxy - 1) { - y++; - x = 0; - } else - return (OK); - } - end = &win->lines[y]->line[win->maxx]; - minx = -1; - maxx = &win->lines[y]->line[x]; - for (sp = maxx; sp < end; sp++) - if (sp->ch != ' ' || sp->attr != 0) { - maxx = sp; - if (minx == -1) - minx = sp - win->lines[y]->line; - sp->ch = ' '; - sp->attr = 0; - } -#ifdef DEBUG - __CTRACE("CLRTOEOL: minx = %d, maxx = %d, firstch = %d, lastch = %d\n", - minx, maxx - win->lines[y]->line, *win->lines[y]->firstchp, - *win->lines[y]->lastchp); -#endif - /* Update firstch and lastch for the line. */ - return (__touchline(win, y, x, win->maxx - 1, 0)); -} - - - - - diff --git a/lib/libcurses/config.h b/lib/libcurses/config.h new file mode 100644 index 00000000000..e9b3a016aa9 --- /dev/null +++ b/lib/libcurses/config.h @@ -0,0 +1,43 @@ +/* generated by configure-script + * On host: OpenBSD gandalf.sigmasoft.com 1.2 OpenBSD 1.2 (GANDALF) #1: Sun Apr 28 03:30:40 PDT 1996 tholo@gandalf.sigmasoft.com:/usr/src/sys/arch/i386/compile/GANDALF i386 + */ +#ifndef NC_CONFIG_H +#define NC_CONFIG_H + +#define CC_HAS_INLINE_FUNCS 1 +#define HAVE_DIRENT_H 1 +#define HAVE_EXTERN_ERRNO 1 +#define HAVE_EXTERN_SYS_ERRLIST 1 +#define HAVE_FCNTL_H 1 +#define HAVE_FORM_H 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_GETTTYNAM 1 +#define HAVE_LIMITS_H 1 +#define HAVE_MEMCCPY 1 +#define HAVE_MENU_H 1 +#define HAVE_PANEL_H 1 +#define HAVE_REGEXP_H 1 +#define HAVE_REGEX_H 1 +#define HAVE_SETBUFFER 1 +#define HAVE_SETVBUF 1 +#define HAVE_SIGACTION 1 +#define HAVE_STRDUP 1 +#define HAVE_STRERROR 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_PARAM_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_TERMIOS_H 1 +#define HAVE_TTYENT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_USLEEP 1 +#define HAVE_VSSCANF 1 +#define STDC_HEADERS 1 + + /* The C compiler may not treat these properly, but C++ has to */ +#ifdef __cplusplus +#undef const +#undef inline +#endif + +#endif /* NC_CONFIG_H */ diff --git a/lib/libcurses/cr_put.c b/lib/libcurses/cr_put.c deleted file mode 100644 index ada2df5ca1e..00000000000 --- a/lib/libcurses/cr_put.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)cr_put.c 8.3 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <string.h> - -#include "curses.h" - -#define HARDTABS 8 - -/* - * Terminal driving and line formatting routines. Basic motion optimizations - * are done here as well as formatting lines (printing of control characters, - * line numbering and the like). - */ - -/* Stub function for the users. */ -int -mvcur(ly, lx, y, x) - int ly, lx, y, x; -{ - return (__mvcur(ly, lx, y, x, 0)); -} - -static void fgoto __P((int)); -static int plod __P((int, int)); -static void plodput __P((int)); -static int tabcol __P((int, int)); - -static int outcol, outline, destcol, destline; - -/* - * Sync the position of the output cursor. Most work here is rounding for - * terminal boundaries getting the column position implied by wraparound or - * the lack thereof and rolling up the screen to get destline on the screen. - */ -int -__mvcur(ly, lx, y, x, in_refresh) - int ly, lx, y, x, in_refresh; -{ -#ifdef DEBUG - __CTRACE("mvcur: moving cursor from (%d, %d) to (%d, %d)\n", - ly, lx, y, x); -#endif - destcol = x; - destline = y; - outcol = lx; - outline = ly; - fgoto(in_refresh); - return (OK); -} - -static void -fgoto(in_refresh) - int in_refresh; -{ - register int c, l; - register char *cgp; - - if (destcol >= COLS) { - destline += destcol / COLS; - destcol %= COLS; - } - if (outcol >= COLS) { - l = (outcol + 1) / COLS; - outline += l; - outcol %= COLS; - if (AM == 0) { - while (l > 0) { - if (__pfast) - if (CR) - tputs(CR, 0, __cputchar); - else - putchar('\r'); - if (NL) - tputs(NL, 0, __cputchar); - else - putchar('\n'); - l--; - } - outcol = 0; - } - if (outline > LINES - 1) { - destline -= outline - (LINES - 1); - outline = LINES - 1; - } - } - if (destline >= LINES) { - l = destline; - destline = LINES - 1; - if (outline < LINES - 1) { - c = destcol; - if (__pfast == 0 && !CA) - destcol = 0; - fgoto(in_refresh); - destcol = c; - } - while (l >= LINES) { - /* The following linefeed (or simulation thereof) is - * supposed to scroll up the screen, since we are on - * the bottom line. We make the assumption that - * linefeed will scroll. If ns is in the capability - * list this won't work. We should probably have an - * sc capability but sf will generally take the place - * if it works. - * - * Superbee glitch: in the middle of the screen have - * to use esc B (down) because linefeed screws up in - * "Efficient Paging" (what a joke) mode (which is - * essential in some SB's because CRLF mode puts - * garbage in at end of memory), but you must use - * linefeed to scroll since down arrow won't go past - * memory end. I turned this off after recieving Paul - * Eggert's Superbee description which wins better. - */ - if (NL /* && !XB */ && __pfast) - tputs(NL, 0, __cputchar); - else - putchar('\n'); - l--; - if (__pfast == 0) - outcol = 0; - } - } - if (destline < outline && !(CA || UP)) - destline = outline; - if (CA) { - cgp = tgoto(CM, destcol, destline); - - /* - * Need this condition due to inconsistent behavior - * of backspace on the last column. - */ - if (outcol != COLS - 1 && plod(strlen(cgp), in_refresh) > 0) - plod(0, in_refresh); - else - tputs(cgp, 0, __cputchar); - } else - plod(0, in_refresh); - outline = destline; - outcol = destcol; -} -/* - * Move (slowly) to destination. - * Hard thing here is using home cursor on really deficient terminals. - * Otherwise just use cursor motions, hacking use of tabs and overtabbing - * and backspace. - */ - -static int plodcnt, plodflg; - -static void -plodput(c) - int c; -{ - if (plodflg) - --plodcnt; - else - putchar(c); -} - -static int -plod(cnt, in_refresh) - int cnt, in_refresh; -{ - register int i, j, k, soutcol, soutline; - - plodcnt = plodflg = cnt; - soutcol = outcol; - soutline = outline; - /* - * Consider homing and moving down/right from there, vs. moving - * directly with local motions to the right spot. - */ - if (HO) { - /* - * i is the cost to home and tab/space to the right to get to - * the proper column. This assumes ND space costs 1 char. So - * i + destcol is cost of motion with home. - */ - if (GT) - i = (destcol / HARDTABS) + (destcol % HARDTABS); - else - i = destcol; - - /* j is cost to move locally without homing. */ - if (destcol >= outcol) { /* if motion is to the right */ - j = destcol / HARDTABS - outcol / HARDTABS; - if (GT && j) - j += destcol % HARDTABS; - else - j = destcol - outcol; - } else - /* leftward motion only works if we can backspace. */ - if (outcol - destcol <= i && (BS || BC)) - /* Cheaper to backspace. */ - i = j = outcol - destcol; - else - /* Impossibly expensive. */ - j = i + 1; - - /* k is the absolute value of vertical distance. */ - k = outline - destline; - if (k < 0) - k = -k; - j += k; - - /* Decision. We may not have a choice if no UP. */ - if (i + destline < j || (!UP && destline < outline)) { - /* - * Cheaper to home. Do it now and pretend it's a - * regular local motion. - */ - tputs(HO, 0, plodput); - outcol = outline = 0; - } else if (LL) { - /* - * Quickly consider homing down and moving from there. - * Assume cost of LL is 2. - */ - k = (LINES - 1) - destline; - if (i + k + 2 < j && (k <= 0 || UP)) { - tputs(LL, 0, plodput); - outcol = 0; - outline = LINES - 1; - } - } - } else - /* No home and no up means it's impossible. */ - if (!UP && destline < outline) - return (-1); - if (GT) - i = destcol % HARDTABS + destcol / HARDTABS; - else - i = destcol; -#ifdef notdef - if (BT && outcol > destcol && - (j = (((outcol+7) & ~7) - destcol - 1) >> 3)) { - j *= (k = strlen(BT)); - if ((k += (destcol&7)) > 4) - j += 8 - (destcol&7); - else - j += k; - } - else -#endif - j = outcol - destcol; - - /* - * If we will later need a \n which will turn into a \r\n by the - * system or the terminal, then don't bother to try to \r. - */ - if ((NONL || !__pfast) && outline < destline) - goto dontcr; - - /* - * If the terminal will do a \r\n and there isn't room for it, then - * we can't afford a \r. - */ - if (NC && outline >= destline) - goto dontcr; - - /* - * If it will be cheaper, or if we can't back up, then send a return - * preliminarily. - */ - if (j > i + 1 || outcol > destcol && !BS && !BC) { - /* - * BUG: this doesn't take the (possibly long) length of CR - * into account. - */ - if (CR) - tputs(CR, 0, plodput); - else - plodput('\r'); - if (NC) { - if (NL) - tputs(NL, 0, plodput); - else - plodput('\n'); - outline++; - } - outcol = 0; - } - -dontcr: while (outline < destline) { - outline++; - if (NL) - tputs(NL, 0, plodput); - else - plodput('\n'); - if (plodcnt < 0) - goto out; - if (NONL || __pfast == 0) - outcol = 0; - } - if (BT) - k = strlen(BT); - while (outcol > destcol) { - if (plodcnt < 0) - goto out; -#ifdef notdef - if (BT && outcol - destcol > k + 4) { - tputs(BT, 0, plodput); - outcol--; - outcol &= ~7; - continue; - } -#endif - outcol--; - if (BC) - tputs(BC, 0, plodput); - else - plodput('\b'); - } - while (outline > destline) { - outline--; - tputs(UP, 0, plodput); - if (plodcnt < 0) - goto out; - } - if (GT && destcol - outcol > 1) { - for (;;) { - i = tabcol(outcol, HARDTABS); - if (i > destcol) - break; - if (TA) - tputs(TA, 0, plodput); - else - plodput('\t'); - outcol = i; - } - if (destcol - outcol > 4 && i < COLS && (BC || BS)) { - if (TA) - tputs(TA, 0, plodput); - else - plodput('\t'); - outcol = i; - while (outcol > destcol) { - outcol--; - if (BC) - tputs(BC, 0, plodput); - else - plodput('\b'); - } - } - } - while (outcol < destcol) { - /* - * Move one char to the right. We don't use ND space because - * it's better to just print the char we are moving over. - */ - if (in_refresh) - if (plodflg) /* Avoid a complex calculation. */ - plodcnt--; - else { - i = curscr->lines[outline]->line[outcol].ch; - if ((curscr->lines[outline]->line[outcol].attr - & __STANDOUT) == - (curscr->flags & __WSTANDOUT)) - putchar(i); - else - goto nondes; - } - else -nondes: if (ND) - tputs(ND, 0, plodput); - else - plodput(' '); - outcol++; - if (plodcnt < 0) - goto out; - } - -out: if (plodflg) { - outcol = soutcol; - outline = soutline; - } - return (plodcnt); -} - -/* - * Return the column number that results from being in column col and - * hitting a tab, where tabs are set every ts columns. Work right for - * the case where col > COLS, even if ts does not divide COLS. - */ -static int -tabcol(col, ts) - int col, ts; -{ - int offset; - - if (col >= COLS) { - offset = COLS * (col / COLS); - col -= offset; - } else - offset = 0; - return (col + ts - (col % ts) + offset); -} diff --git a/lib/libcurses/ctrace.c b/lib/libcurses/ctrace.c deleted file mode 100644 index 4f53906cc5e..00000000000 --- a/lib/libcurses/ctrace.c +++ /dev/null @@ -1,76 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)ctrace.c 8.2 (Berkeley) 10/5/93"; -#endif /* not lint */ - -#ifdef DEBUG -#include <stdio.h> - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#ifndef TFILE -#define TFILE "__curses.out" -#endif - -static FILE *tracefp; /* Curses debugging file descriptor. */ - -void -#ifdef __STDC__ -__CTRACE(const char *fmt, ...) -#else -__CTRACE(fmt, va_alist) - char *fmt; - va_dcl -#endif -{ - va_list ap; -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - if (tracefp == NULL) - tracefp = fopen(TFILE, "w"); - if (tracefp == NULL) - return; - (void)vfprintf(tracefp, fmt, ap); - va_end(ap); - (void)fflush(tracefp); -} -#endif diff --git a/lib/libcurses/cur_hash.c b/lib/libcurses/cur_hash.c deleted file mode 100644 index ed47fe37333..00000000000 --- a/lib/libcurses/cur_hash.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)cur_hash.c 8.1 (Berkeley) 6/4/93"; -#endif /* not lint */ - -#include <sys/types.h> - - -/* - * __hash() is "hashpjw" from the Dragon Book, Aho, Sethi & Ullman, p.436. - */ -u_int -__hash(s, len) - char *s; - int len; -{ - register u_int h, g, i; - - h = 0; - i = 0; - while (i < len) { - h = (h << 4) + s[i]; - if (g = h & 0xf0000000) { - h = h ^ (g >> 24); - h = h ^ g; - } - i++; - } - return h; -} diff --git a/lib/libcurses/curs_addch.3 b/lib/libcurses/curs_addch.3 new file mode 100644 index 00000000000..e32eba1ef1b --- /dev/null +++ b/lib/libcurses/curs_addch.3 @@ -0,0 +1,146 @@ +'\" t +.TH curs_addch 3X "" +.SH NAME +\fBaddch\fR, \fBwaddch\fR, \fBmvaddch\fR, \fBmvwaddch\fR, +\fBechochar\fR, \fBwechochar\fR - add a character (with attributes) to a +\fBcurses\fR window, then advance the cursor +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint addch(chtype ch);\fR +.br +\fBint waddch(WINDOW *win, chtype ch);\fR +.br +\fBint mvaddch(int y, int x, chtype ch);\fR +.br +\fBint mvwaddch(WINDOW *win, int y, int x, chtype ch);\fR +.br +\fBint echochar(chtype ch);\fR +.br +\fBint wechochar(WINDOW *win, chtype ch);\fR +.br +.SH DESCRIPTION +The \fBaddch\fR, \fBwaddch\fR, \fBmvaddch\fR and \fBmvwaddch\fR routines put +the character \fIch\fR into the given window at its current window position, +which is then advanced. They are analogous to \fBputchar\fR in \fBstdio\fR(3). +If the advance is at the right margin, the cursor automatically wraps to the +beginning of the next line. At the bottom of the current scrolling region, if +\fBscrollok\fR is enabled, the scrolling region is scrolled up one line. + +If \fIch\fR is a tab, newline, or backspace, the cursor is moved appropriately +within the window. Backspace moves the cursor one character left; at the left +edge of a window it does nothing. Newline does a \fBclrtoeol\fR, then moves +the cursor to the window left margin on the next line, scrolling the window if +on the last line). Tabs are considered to be at every eighth column. + +If \fIch\fR is any control character other than tab, newline, or backspace, it +is drawn in \fB^\fR\fIX\fR notation. Calling \fBwinch\fR after adding a +control character does not return the character itself, but instead returns +the ^-representation of the control character. (To emit control characters +literally, use \fBechochar\fR.) + +Video attributes can be combined with a character argument passed to +\fBaddch\fR or related functions by logical-ORing them into the character. +(Thus, text, including attributes, can be copied from one place to another +using \fBinch\fR and \fBaddch\fR.). See the \fBcurs_attr\fR(3X) page for +values of predefined video attribute constants that can be usefully ORed +into characters. + +The \fBechochar\fR and \fBwechochar\fR routines are equivalent to a call to +\fBaddch\fR followed by a call to \fBrefresh\fR, or a call to \fBwaddch\fR +followed by a call to \fBwrefresh\fR. The knowledge that only a single +character is being output is used and, for non-control characters, a +considerable performance gain may be seen by using these routines instead of +their equivalents. +.SS Line Graphics +The following variables may be used to add line drawing characters to the +screen with routines of the \fBaddch\fR family. The default character listed +below is used if the \fBacsc\fR capability doesn't define a terminal-specific +replacement for it (but see the EXTENSIONS section below). The names are +taken from VT100 nomenclature. + +.TS +l l l +_ _ _ +l l l. +\fIName\fR \fIDefault\fR \fIDescription\fR +ACS_ULCORNER + upper left-hand corner +ACS_LLCORNER + lower left-hand corner +ACS_URCORNER + upper right-hand corner +ACS_LRCORNER + lower right-hand corner +ACS_RTEE + right tee +ACS_LTEE + left tee +ACS_BTEE + bottom tee +ACS_TTEE + top tee +ACS_HLINE - horizontal line +ACS_VLINE | vertical line +ACS_PLUS + plus +ACS_S1 - scan line 1 +ACS_S9 \&_ scan line 9 +ACS_DIAMOND + diamond +ACS_CKBOARD : checker board (stipple) +ACS_DEGREE ' degree symbol +ACS_PLMINUS # plus/minus +ACS_BULLET o bullet +ACS_LARROW < arrow pointing left +ACS_RARROW > arrow pointing right +ACS_DARROW v arrow pointing down +ACS_UARROW ^ arrow pointing up +ACS_BOARD # board of squares +ACS_LANTERN # lantern symbol +ACS_BLOCK # solid square block +ACS_S3 - scan line 3 +ACS_S7 - scan line 7 +ACS_LEQUAL < less-than-or-equal-to +ACS_GEQUAL > greater-than-or-equal-to +ACS_PI * greek pi +ACS_NEQUAL ! not-equal +ACS_STERLING f pound-sterling symbol +.TE + +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and \fBOK\fR on success +(the SVr4 manuals specify only "an integer value other than \fBERR\fR") upon +successful completion, unless otherwise noted in the preceding routine +descriptions. +.SH NOTES +Note that \fBaddch\fR, \fBmvaddch\fR, \fBmvwaddch\fR, and +\fBechochar\fR may be macros. +.SH EXTENSIONS +The following extended \fBcurses\fR features are available only on PC-clone +consoles and compatible terminals obeying the ANSI.SYS de-facto standard for +terminal control sequences. They are not part of XSI curses. + +The attribute A_ALTCHARSET actually forces literal display of PC ROM characters +including the high-half graphics. Your console driver may still capture or +translate a few (such as ESC) but this feature should give you access to the +card-suit characters, up and down-arrow, and most others in the range 0-32. +(In a terminfo entry designed for use with \fBncurses\fR, the high-half +characters are obtained using this attribute with an \fBacsc\fR string in +which the second of each pair is a high-half character.) + +Giving \fBwechochar\fR an argument with its high bit set will produce the +corresponding high-half ASCII graphic (SVr4 curses also has this feature but +does not document it). A control-character argument, however, will not +typically produce the corresponding graphic; characters such as CR, NL, FF and +TAB are typically interpreted by the console driver itself, and ESC will be +interpreted as the leader of a control sequence. +.SH PORTABILITY +All these functions are described in the XSI Curses standard, Issue 4. +The defaults specified for forms-drawing characters apply in the POSIX locale. + +The seven ACS symbols starting with \fBACS_S3\fR were not documented in +any publicly released System V. However, many publicly available terminfos +include \fBacsc\fR strings in which their key characters (pryz{|}) are +embedded, and a second-hand list of their character descriptions has come +to light. The ACS-prefixed names for them were invented for \fBncurses\fR(3X). +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_attr\fR(3X), \fBcurs_clear\fR(3X), +\fBcurs_inch\fR(3X), \fBcurs_outopts\fR(3X), \fBcurs_refresh\fR(3X), +\fBputc\fR(3S). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_addchstr.3 b/lib/libcurses/curs_addchstr.3 new file mode 100644 index 00000000000..fd5600dd2e1 --- /dev/null +++ b/lib/libcurses/curs_addchstr.3 @@ -0,0 +1,55 @@ +.TH curs_addchstr 3X "" +.SH NAME +\fBaddchstr\fR, \fBaddchnstr\fR, \fBwaddchstr\fR, +\fBwaddchnstr\fR, \fBmvaddchstr\fR, \fBmvaddchnstr\fR, \fBmvwaddchstr\fR, +\fBmvwaddchnstr\fR - add a string of characters (and attributes) to a +\fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint addchstr(const chtype *chstr);\fR +.br +\fBint addchnstr(const chtype *chstr, int n);\fR +.br +\fBint waddchstr(WINDOW *win, const chtype *chstr);\fR +.br +\fBint waddchnstr(WINDOW *win, const chtype *chstr, int n);\fR +.br +\fBint mvaddchstr(int y, int x, const chtype *chstr);\fR +.br +\fBint mvaddchnstr(int y, int x, const chtype *chstr, int n);\fR +.br +\fBint mvwaddchstr(WINDOW *win, int y, int x, const chtype *chstr);\fR +.br +\fBint mvwaddchnstr(WINDOW *win, int y, int x, const chtype *chstr, int n);\fR +.SH DESCRIPTION +These routines copy \fIchstr\fR into the window image structure at and after +the current cursor position. The four routines with \fIn\fR as the last +argument copy at most \fIn\fR elements, but no more than will fit on the line. +If \fBn\fR=\fB-1\fR then the whole string is copied, to the maximum number of +characters that will fit on the line. + +The window cursor is \fInot\fR advanced, and these routines work faster than +\fBwaddnstr\fR. On the other hand, they don't perform any kind of checking +(such as for the newline, backspace, or carriage return characters), they don't +advance the current cursor position, they don't expand other control characters +to ^-escapes, and they truncate the string if it crosses the right margin, +rather then wrapping it around to the new line. + +.SH RETURN VALUES +All routines return the integer \fBERR\fR upon failure and \fBOK\fR on success +(the SVr4 manuals specify only "an integer value other than \fBERR\fR") upon +successful completion, unless otherwise noted in the preceding routine +descriptions. +.SH NOTES +Note that all routines except \fBwaddchnstr\fR may be macros. +.SH PORTABILITY +All these entry points are described in the XSI Curses standard, Issue 4. +.SH SEE ALSO +\fBcurses\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_addstr.3 b/lib/libcurses/curs_addstr.3 new file mode 100644 index 00000000000..3859a34b8b4 --- /dev/null +++ b/lib/libcurses/curs_addstr.3 @@ -0,0 +1,48 @@ +.TH curs_addstr 3X "" +.SH NAME +\fBaddstr\fR, \fBaddnstr\fR, \fBwaddstr\fR, \fBwaddnstr\fR, +\fBmvaddstr\fR, \fBmvaddnstr\fR, \fBmvwaddstr\fR, \fBmvwaddnstr\fR - add a +string of characters to a \fBcurses\fR window and advance cursor +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint addstr(const char *str);\fR +.br +\fBint addnstr(const char *str, int n);\fR +.br +\fBint waddstr(WINDOW *win, const char *str);\fR +.br +\fBint waddnstr(WINDOW *win, const char *str, int n);\fR +.br +\fBint mvaddstr(int y, int x, const char *str);\fR +.br +\fBint mvaddnstr(int y, int x, const char *str, int n);\fR +.br +\fBint mvwaddstr(WINDOW *win, int y, int x, const char *str);\fR +.br +\fBint mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n);\fR +.SH DESCRIPTION +These routines write the characters of the (null-terminated) character string +\fIstr\fR on the given window. It is similar to calling \fBwaddch\fR once for +each character in the string. The four routines with \fIn\fR as the last +argument write at most \fIn\fR characters. If \fIn\fR is -1, then the +entire string will be added. +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and \fBOK\fR on success +(the SVr4 manuals specify only "an integer value other than \fBERR\fR") upon +successful completion. +.SH NOTES +Note that all of these routines except \fBwaddstr\fR and \fBwaddnstr\fR may be +macros. +.SH PORTABILITY +All these entry points are described in the XSI Curses standard, Issue 4. The +XSI errors EILSEQ and EOVERFLOW, associated with extended-level conformance, +are not yet detected. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_addch\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_attr.3 b/lib/libcurses/curs_attr.3 new file mode 100644 index 00000000000..d08df520173 --- /dev/null +++ b/lib/libcurses/curs_attr.3 @@ -0,0 +1,167 @@ +.TH curs_attr 3X "" +.SH NAME +\fBattroff\fR, \fBwattroff\fR, \fBattron\fR, \fBwattron\fR, +\fBattrset\fR, \fBwattrset\fR, \fBstandend\fR, \fBwstandend\fR, \fBstandout\fR, +\fBwstandout\fR - \fBcurses\fR character and window attribute control routines +.SH SYNOPSIS +\fB#include <curses.h>\fR +.br +\fBint attroff(int attrs);\fR +.br +\fBint wattroff(WINDOW *win, int attrs);\fR +.br +\fBint attron(int attrs);\fR +.br +\fBint wattron(WINDOW *win, int attrs);\fR +.br +\fBint attrset(int attrs);\fR +.br +\fBint wattrset(WINDOW *win, int attrs);\fR +.br +\fBint standend(void);\fR +.br +\fBint wstandend(WINDOW *win);\fR +.br +\fBint standout(void);\fR +.br +\fBint wstandout(WINDOW *win);\fR +.br +\fBattr_t attr_get(void);\fR +.br +\fBattr_t wattr_get(WINDOW *);\fR +.br +\fBint attr_off(attr_t attrs);\fR +.br +\fBint wattr_off(WINDOW *, attr_t attrs);\fR +.br +\fBint attr_on(attr_t attrs);\fR +.br +\fBint wattr_on(WINDOW *, attr_t attrs);\fR +.br +\fBint attr_set(attr_t attrs);\fR +.br +\fBint wattr_set(WINDOW *, attr_t attrs);\fR +.br +\fBint chgat(int n, attr_t attr, short color, const void *opts)\fR +.br +\fBint wchgat(WINDOW *, int n, attr_t attr, + short color, const void *opts)\fR +.br +\fBint mvchgat(int y, int x, int n, attr_t attr, + short color, const void *opts)\fR +.br +\fBint mvwchgat(WINDOW *, int y, int x, int n, attr_t attr, + short color, const void *opts)\fR +.br +.SH DESCRIPTION +These routines manipulate the current attributes of the named window. The +current attributes of a window apply to all characters that are written into +the window with \fBwaddch\fR, \fBwaddstr\fR and \fBwprintw\fR. Attributes are +a property of the character, and move with the character through any scrolling +and insert/delete line/character operations. To the extent possible, they are +displayed as appropriate modifications to the graphic rendition of characters +put on the screen. + +The routine \fBattrset\fR sets the current attributes of the given window to +\fIattrs\fR. The routine \fBattroff\fR turns off the named attributes without +turning any other attributes on or off. The routine \fBattron\fR turns on the +named attributes without affecting any others. The routine \fBstandout\fR is +the same as \fBattron(A_STANDOUT)\fR. The routine \fBstandend\fR is the same +as \fBattrset(A_NORMAL)\fR or \fBattrset(0)\fR, that is, it turns off all +attributes. + +The routine \fBwattr_get\fR returns the current attribute for the given +window; \fBattr_get\fR returns the current attribute for \fBstdscr\fR. +The remaining \fBattr_\fR* functions operate exactly like the corresponding +\fBattr\fR* functions, except that they take arguments of type \fBattr_t\fR +rather than \fBint\fR. + +The routine \fBchgat\fR changes the attributes of a given number of characters +starting at the current cursor location of \fBstdscr\fR. It does not update +the cursor and does not perform wrapping. A character count of -1 or greater +than the remaining window width means to change attributes all the way to the +end of the current line. The \fBwchgat\fR function generalizes this to any +window; the \fBmvwchgat\fR function does a cursor move before acting. In these +functions, the color argument is a color-pair index (as in the first argument +of \fIinit_pair\fR, see \fBcurs_color\fR(3x)). The \fBopts\fR argument is not +presently used, but is reserved for the future (leave it \fBNULL\fR). +.SS Attributes +The following video attributes, defined in \fB<curses.h>\fR, can be passed to +the routines \fBattron\fR, \fBattroff\fR, and \fBattrset\fR, or OR-ed with the +characters passed to \fBaddch\fR. + +.nf +\fBA_NORMAL\fR Normal display (no highlight) +\fBA_STANDOUT\fR Best highlighting mode of the terminal. +\fBA_UNDERLINE\fR Underlining +\fBA_REVERSE\fR Reverse video +\fBA_BLINK\fR Blinking +\fBA_DIM\fR Half bright +\fBA_BOLD\fR Extra bright or bold +\fBA_PROTECT\fR Protected mode +\fBA_INVIS\fR Invisible or blank mode +\fBA_ALTCHARSET\fR Alternate character set +\fBA_CHARTEXT\fR Bit-mask to extract a character +\fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR Color-pair number \fIn\fR +.fi + +The following macro is the reverse of \fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR: + +.DS C +\fBPAIR_NUMBER(\fIattrs\fR) Returns the pair number associated + with the \fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR attribute. +.DE + +The return values of many of these routines are not meaningful (they are +implemented as macro-expanded assignments and simply return their argument). +The SVr4 manual page claims (falsely) that these routines always return \fB1\fR. + +.SH NOTES +Note that \fBattroff\fR, \fBwattroff\fR, \fBattron\fR, \fBwattron\fR, +\fBattrset\fR, \fBwattrset\fR, \fBstandend\fR and \fBstandout\fR may be macros. +.SH PORTABILITY +All these functions are supported in the XSI Curses standard, Issue 4. The +standard defined the dedicated type for highlights, \fBattr_t\fR, which is not +defined in SVr4 curses. The functions taking \fBattr_t\fR arguments are +not supported under SVr4. + +The XSI Curses standard states that whether the traditional functions +\fBattron\fR/\fBattroff\fR/\fBattrset\fR can manipulate attributes other than +\fBA_BLINK\fR, \fBA_BOLD\fR, \fBA_DIM\fR, \fBA_REVERSE\fR, \fBA_STANDOUT\fR, or +\fBA_UNDERLINE\fR is "unspecified". Under this implementation as well as +SVr4 curses, these functions correctly manipulate all other highlights +(specifically, \fBA_ALTCHARSET\fR, \fBA_PROTECT\fR, and \fBA_INVIS\fR). + +XSI Curses added the new entry points, \fBattr_get\fR, \fBattr_on\fR, +\fBattr_off\fR, \fBattr_set\fR, \fBwattr_on\fR, \fBwattr_off\fR, +\fBwattr_get\fR, \fBwattr_set\fR. These are intended to work with +a new series of highlight macros prefixed with \fBWA_\fR. + +.nf +\fBWA_NORMAL\fR Normal display (no highlight) +\fBWA_STANDOUT\fR Best highlighting mode of the terminal. +\fBWA_UNDERLINE\fR Underlining +\fBWA_REVERSE\fR Reverse video +\fBWA_BLINK\fR Blinking +\fBWA_DIM\fR Half bright +\fBWA_BOLD\fR Extra bright or bold +\fBWA_ALTCHARSET\fR Alternate character set +.fi + +The XSI curses standard specifies that each pair of corresponding \fBA_\fR +and \fBWA_\fR-using functions operates on the same current-highlight +information. + +The XSI standard extended conformance level adds new highlights +\fBA_HORIZONTAL\fR, \fBA_LEFT\fR, \fBA_LOW\fR, \fBA_RIGHT\fR, \fBA_TOP\fR, +\fBA_VERTICAL\fR (and corresponding \fBWA_\fR macros for each) which this +curses does not yet support. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_addch\fR(3X), \fBcurs_addstr\fR(3X), +\fBcurs_printw\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_beep.3 b/lib/libcurses/curs_beep.3 new file mode 100644 index 00000000000..140f255c762 --- /dev/null +++ b/lib/libcurses/curs_beep.3 @@ -0,0 +1,34 @@ +.TH curs_beep 3X "" +.SH NAME +\fBbeep\fR, \fBflash\fR - \fBcurses\fR bell and screen flash routines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint beep(void);\fR +.br +\fBint flash(void);\fR +.br +.SH DESCRIPTION +The \fBbeep\fR and \fBflash\fR routines are used to alert the terminal user. +The routine \fBbeep\fR sounds an audible alarm on the terminal, if possible; +otherwise it flashes the screen (visible bell). The routine \fBflash\fR +flashes the screen, and if that is not possible, sounds the alert. If neither +alert is possible, nothing happens. Nearly all terminals have an audible alert +(bell or beep), but only some can flash the screen. +.SH RETURN VALUE +These routines return \fBOK\fR if they succeed in beeping or flashing, +\fBERR\fR otherwise. +.SH EXTENSIONS +SVr4's beep and flash routines always returned \fBOK\fR, so it was not +possible to tell when the beep or flash failed. +.SH PORTABILITY +These functions are defined in the XSI Curses standard, Issue 4. Like SVr4, it +specifies that they always return \fBOK\fR. +.SH SEE ALSO +\fBcurses\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_bkgd.3 b/lib/libcurses/curs_bkgd.3 new file mode 100644 index 00000000000..cc3372c8e47 --- /dev/null +++ b/lib/libcurses/curs_bkgd.3 @@ -0,0 +1,60 @@ +.TH curs_bkgd 3X "" +.SH NAME +\fBbkgdset\fR, \fBwbkgdset\fR, \fBbkgd\fR, +\fBwbkgd\fR - \fBcurses\fR window background manipulation routines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBvoid bkgdset(const chtype ch);\fR +.br +\fBvoid wbkgdset(WINDOW *win, const chtype ch);\fR +.br +\fBint bkgd(const chtype ch);\fR +.br +\fBint wbkgd(WINDOW *win, const chtype ch);\fR +.br +\fBchtype wgetbkgd(WINDOW *win);\fR +.br +.SH DESCRIPTION +The \fBbkgdset\fR and \fBwbkgdset\fR routines manipulate the +background of the named window. Background is a \fBchtype\fR +consisting of any combination of attributes and a character. The +attribute part of the background is combined (ORed) with all non-blank +characters that are written into the window with \fBwaddch\fR. Both +the character and attribute parts of the background are combined with +the blank characters. The background becomes a property of the +character and moves with the character through any scrolling and +insert/delete line/character operations. To the extent possible on a +particular terminal, the attribute part of the background is displayed +as the graphic rendition of the character put on the screen. + +The \fBbkgd\fR and \fBwbkgd\fR routines combine the new background +with every position in the window. Background is any combination of +attributes and a character. Only the attribute part is used to set +the background of non-blank characters, while both character and +attributes are used for blank positions. To the extent possible on a +particular terminal, the attribute part of the background is displayed +as the graphic rendition of the character put on the screen. + +The \fBwgetbkgd\fR function returns the given window's current background +character/attribute pair. +.SH RETURN VALUE +The routines \fBbkgd\fR and \fBwbkgd\fR return the integer \fBOK\fR. +The SVr4.0 manual says "or a non-negative integer if \fBimmedok\fR is set", +but this appears to be an error. +.SH NOTES +Note that \fBbkgdset\fR and \fBbkgd\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. The draft +does not include \fBconst\fR qualifiers on the arguments. The standard +specifies that \fBbkgd\fR and \fBwbkgd\fR return \fBERR\fR, on failure. but +gives no failure conditions. The draft describes the new function +\fBwgetbkgd\fR, which is not in SVr4. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_addch\fR(3X), \fBcurs_outopts\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_border.3 b/lib/libcurses/curs_border.3 new file mode 100644 index 00000000000..c3d845acfc8 --- /dev/null +++ b/lib/libcurses/curs_border.3 @@ -0,0 +1,71 @@ +.TH curs_border 3X "" +.SH NAME +\fBborder\fR, \fBwborder\fR, \fBbox\fR, +\fBhline\fR, \fBwhline\fR, \fBvline\fR, \fBwvline\fR - create +\fBcurses\fR borders, horizontal and vertical lines +.SH SYNOPSIS +\fB#include <curses.h>\fR +.br +\fBint border(chtype ls, chtype rs, chtype ts, chtype bs, + chtype tl, chtype tr, chtype bl, chtype br);\fR +.br +\fBint wborder(WINDOW *win, chtype ls, chtype rs, + chtype ts, chtype bs, chtype tl, chtype tr, + chtype bl, chtype br);\fR +.br +\fBint box(WINDOW *win, chtype verch, chtype horch);\fR +.br +\fBint hline(chtype ch, int n);\fR +.br +\fBint whline(WINDOW *win, chtype ch, int n);\fR +.br +\fBint vline(chtype ch, int n);\fR +.br +\fBint wvline(WINDOW *win, chtype ch, int n);\fR +.br +.SH DESCRIPTION +The \fBborder\fR, \fBwborder\fR and \fBbox\fR routines draw a box around the +edges of a window. The argument \fIls\fR is a character and attributes used +for the left side of the border, \fIrs\fR - right side, \fIts\fR - top side, +\fIbs\fR - bottom side, \fItl\fR - top left-hand corner, \fItr\fR - top +right-hand corner, \fIbl\fR - bottom left-hand corner, and \fIbr\fR - bottom +right-hand corner. If any of these arguments is zero, then the following +default values (defined in \fBcurses.h\fR) are used instead: \fBACS_VLINE\fR, +\fBACS_VLINE\fR, \fBACS_HLINE\fR, \fBACS_HLINE\fR, \fB\fBACS_ULCORNER\fR, +\fBACS_URCORNER\fR, \fBACS_BLCORNER\fR, \fBACS_BRCORNER\fR. + +\fBbox(\fR\fIwin\fR\gB, \fR\fIverch\fR\fB, \fR\fIhorch\fR\fB)\fR is a shorthand +for the following call: \fBwborder(\fR\fIwin\fR\fB,\fR \fIverch\fR\fB,\fR +\fIverch\fR\fB,\fR \fIhorch\fR\fB,\fR \fIhorch\fR\fB, 0, 0, 0, 0)\fR. + +The \fBhline\fR and \fBwhline\fR functions draw a horizontal (left to right) +line using \fIch\fR starting at the current cursor position in the window. The +current cursor position is not changed. The line is at most \fIn\fR characters +long, or as many as fit into the window. + +The \fBvline\fR and \fBwvline\fR functions draw a vertical (top to bottom) line +using \fIch\fR starting at the current cursor position in the window. The +current cursor position is not changed. The line is at most \fIn\fR characters +long, or as many as fit into the window. +.SH RETURN VALUE +All routines return the integer \fBOK\fR. The SVr4.0 manual says "or a +non-negative integer if \fBimmedok\fR is set", but this appears to be an error. +.SH NOTES +The borders generated by these functions are \fIinside\fR borders (this +is also true of SVr4 curses, though the fact is not documented). + +Note that \fBborder\fR and \fBbox\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. Additional +functions \fBmvhline\fR, \fBmvvline\fR, \fBmvwhline\fR, and \fBmvwvline\fR are +described there which this implementation does not yet support. The standard +specifies that they return \fBERR\fR on failure, but specifies no error +conditions. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_outopts\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_clear.3 b/lib/libcurses/curs_clear.3 new file mode 100644 index 00000000000..1a9efb7ce15 --- /dev/null +++ b/lib/libcurses/curs_clear.3 @@ -0,0 +1,65 @@ +.TH curs_clear 3X "" +.SH NAME +\fBerase\fR, \fBwerase\fR, \fBclear\fR, +\fBwclear\fR, \fBclrtobot\fR, \fBwclrtobot\fR, \fBclrtoeol\fR, +\fBwclrtoeol\fR - clear all or part of a \fBcurses\fR window +.SH SYNOPSIS +\fB# include <curses.h>\fR + +\fBint erase(void);\fR +.br +\fBint werase(WINDOW *win);\fR +.br +\fBint clear(void);\fR +.br +\fBint wclear(WINDOW *win);\fR +.br +\fBint clrtobot(void);\fR +.br +\fBint wclrtobot(WINDOW *win);\fR +.br +\fBint clrtoeol(void);\fR +.br +\fBint wclrtoeol(WINDOW *win);\fR +.br +.SH DESCRIPTION +The \fBerase\fR and \fBwerase\fR routines copy blanks to every +position in the window, clearing the screen. + +The \fBclear\fR and \fBwclear\fR routines are like \fBerase\fR and +\fBwerase\fR, but they also call \fBclearok\fR, so that the screen is +cleared completely on the next call to \fBwrefresh\fR for that window +and repainted from scratch. + +The \fBclrtobot\fR and \fBwclrtobot\fR routines erase from the cursor to the +end of screen. That is, they erase all lines below the cursor in the window. +Also, the current line to the right of the cursor, inclusive, is erased. + +The \fBclrtoeol\fR and \fBwclrtoeol\fR routines erase the current line +to the right of the cursor, inclusive, to the end of the current line. + +Blanks created by erasure have the current background rendition (as set +by \fBwbkgdset\fR) merged into them. +.SH RETURN VALUE +All routines return the integer \fBOK\fR. The SVr4.0 manual says "or a +non-negative integer if \fBimmedok\fR is set", but this appears to be an error. +.SH NOTES +Note that \fBerase\fR, \fBwerase\fR, \fBclear\fR, \fBwclear\fR, +\fBclrtobot\fR, and \fBclrtoeol\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. The +standard specifies that they return \fBERR\fR on failure, but specifies no +error conditions. + +Some historic curses implementations had, as an undocumented feature, the +ability to do the equivalent of \fBclearok(..., 1)\fR by saying +\fBtouchwin(stdscr)\fR or \fBclear(stdscr)\fR. This will not work under +ncurses. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_outopts\fR(3X), \fBcurs_refresh\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_color.3 b/lib/libcurses/curs_color.3 new file mode 100644 index 00000000000..ef015207411 --- /dev/null +++ b/lib/libcurses/curs_color.3 @@ -0,0 +1,148 @@ +.TH curs_color 3X "" +.SH NAME +\fBstart_color\fR, \fBinit_pair\fR, +\fBinit_color\fR, \fBhas_colors\fR, \fBcan_change_color\fR, +\fBcolor_content\fR, \fBpair_content\fR - \fBcurses\fR color +manipulation routines +.SH SYNOPSIS +\fB# include <curses.h>\fR +.br +\fBint start_color(void);\fR +.br +\fBint init_pair(short pair, short f, short b);\fR +.br +\fBint init_color(short color, short r, short g, short b);\fR +.br +\fBbool has_colors(void);\fR +.br +\fBbool can_change_color(void);\fR +.br +\fBint color_content(short color, short *r, short *g, short *b);\fR +.br +\fBint pair_content(short pair, short *f, short *b);\fR +.br +.SH DESCRIPTION +.SS Overview +\fBcurses\fR support color attributes on terminals with that capability. To +use these routines \fBstart_color\fR must be called, usually right after +\fBinitscr\fR. Colors are always used in pairs (referred to as color-pairs). +A color-pair consists of a foreground color (for characters) and a background +color (for the blank field on which the characters are displayed). A +programmer initializes a color-pair with the routine \fBinit_pair\fR. After it +has been initialized, \fBCOLOR_PAIR\fR(\fIn\fR), a macro defined in +\fB<curses.h>\fR, can be used as a new video attribute. + +If a terminal is capable of redefining colors, the programmer can use the +routine \fBinit_color\fR to change the definition of a color. The routines +\fBhas_colors\fR and \fBcan_change_color\fR return \fBTRUE\fR or \fBFALSE\fR, +depending on whether the terminal has color capabilities and whether the +programmer can change the colors. The routine \fBcolor_content\fR allows a +programmer to extract the amounts of red, green, and blue components in an +initialized color. The routine \fBpair_content\fR allows a programmer to find +out how a given color-pair is currently defined. +.SS Routine Descriptions +The \fBstart_color\fR routine requires no arguments. It must be +called if the programmer wants to use colors, and before any other +color manipulation routine is called. It is good practice to call +this routine right after \fBinitscr\fR. \fBstart_color\fR initializes +eight basic colors (black, red, green, yellow, blue, magenta, cyan, +and white), and two global variables, \fBCOLORS\fR and +\fBCOLOR_PAIRS\fR (respectively defining the maximum number of colors +and color-pairs the terminal can support). It also restores the +colors on the terminal to the values they had when the terminal was +just turned on. + +The \fBinit_pair\fR routine changes the definition of a color-pair. It takes +three arguments: the number of the color-pair to be changed, the foreground +color number, and the background color number. The value of the first argument +must be between \fB1\fR and \fBCOLOR_PAIRS-1\fR. The value of the second and +third arguments must be between 0 and \fBCOLORS\fR (the 0 color pair is wired +to white on black and cannot be changed). If the color-pair was previously +initialized, the screen is refreshed and all occurrences of that color-pair is +changed to the new definition. + +The \fBinit_color\fR routine changes the definition of a color. It takes four +arguments: the number of the color to be changed followed by three RGB values +(for the amounts of red, green, and blue components). The value of the first +argument must be between \fB0\fR and \fBCOLORS\fR. (See the section +\fBColors\fR for the default color index.) Each of the last three arguments +must be a value between 0 and 1000. When \fBinit_color\fR is used, all +occurrences of that color on the screen immediately change to the new +definition. + +The \fBhas_colors\fR routine requires no arguments. It returns \fBTRUE\fR if +the terminal can manipulate colors; otherwise, it returns \fBFALSE\fR. This +routine facilitates writing terminal-independent programs. For example, a +programmer can use it to decide whether to use color or some other video +attribute. + +The \fBcan_change_color\fR routine requires no arguments. It returns +\fBTRUE\fR if the terminal supports colors and can change their definitions; +other, it returns \fBFALSE\fR. This routine facilitates writing +terminal-independent programs. + +The \fBcolor_content\fR routine gives programmers a way to find the intensity +of the red, green, and blue (RGB) components in a color. It requires four +arguments: the color number, and three addresses of \fBshort\fRs for storing +the information about the amounts of red, green, and blue components in the +given color. The value of the first argument must be between 0 and +\fBCOLORS\fR. The values that are stored at the addresses pointed to by the +last three arguments are between 0 (no component) and 1000 (maximum amount of +component). + +The \fBpair_content\fR routine allows programmers to find out what colors a +given color-pair consists of. It requires three arguments: the color-pair +number, and two addresses of \fBshort\fRs for storing the foreground and the +background color numbers. The value of the first argument must be between 1 +and \fBCOLOR_PAIRS-1\fR. The values that are stored at the addresses pointed +to by the second and third arguments are between 0 and \fBCOLORS\fR. +.SS Colors +In \fB<curses.h>\fR the following macros are defined. These are the default +colors. \fBcurses\fR also assumes that \fBCOLOR_BLACK\fR is the default +background color for all terminals. + +.nf + \fBCOLOR_BLACK\fR + \fBCOLOR_RED\fR + \fBCOLOR_GREEN\fR + \fBCOLOR_YELLOW\fR + \fBCOLOR_BLUE\fR + \fBCOLOR_MAGENTA\fR + \fBCOLOR_CYAN\fR + \fBCOLOR_WHITE\fR +.fi +.SH RETURN VALUE +The routines \fBcan_change_color()\fR and \fBhas_colors()\fR return \fBTRUE\fR +or \fBFALSE\fR. + +All other routines return the integer \fBERR\fR upon failure and an \fBOK\fR +(SVr4 specifies only "an integer value other than \fBERR\fR") upon successful +completion. +.SH NOTES +Note that setting an implicit background color via a color pair affects only +character cells that a character write operation explicitly touches. To change +the background color used when parts of a window are blanked by erasing or +scrolling operastions, see \fBcurs_bkgd\fR(3x). + +Several caveats apply on 386 and 486 machines with VGA-compatible graphics: + +COLOR_YELLOW is actually brown. To get yellow, use COLOR_YELLOW combined with +the \fBA_BOLD\fR attribute. + +The A_BLINK attribute should in theory cause the background to go bright. This +often fails to work, and even some cards for which it mostly works (such as the +Paradise and compatibles) do the wrong thing when you try to set a bright +"yellow" background (you get a blinking yellow foreground instead). + +Color RGB values are not settable. +.SH PORTABILITY +This implementation satisfies XSI Curses's minumum maximums +for \fBCOLORS\fR and \fBCOLOR_PAIRS\fR. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_attr\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_delch.3 b/lib/libcurses/curs_delch.3 new file mode 100644 index 00000000000..d7973a98962 --- /dev/null +++ b/lib/libcurses/curs_delch.3 @@ -0,0 +1,39 @@ +.TH curs_delch 3X "" +.SH NAME +\fBdelch\fR, \fBwdelch\fR, \fBmvdelch\fR, \fBmvwdelch\fR - +delete character under the cursor in a \fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint delch(void);\fR +.br +\fBint wdelch(WINDOW *win);\fR +.br +\fBint mvdelch(int y, int x);\fR +.br +\fBint mvwdelch(WINDOW *win, int y, int x);\fR +.br +.SH DESCRIPTION +These routines delete the character under the cursor; all characters to the +right of the cursor on the same line are moved to the left one position and the +last character on the line is filled with a blank. The cursor position does +not change (after moving to \fIy\fR, \fIx\fR, if specified). (This does not +imply use of the hardware delete character feature.) +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and an \fBOK\fR (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion. +.SH NOTES +Note that \fBdelch\fR, \fBmvdelch\fR, and \fBmvwdelch\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. The +standard specifies that they return \fBERR\fR on failure, but specifies no +error conditions. +.SH SEE ALSO +\fBcurses\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_deleteln.3 b/lib/libcurses/curs_deleteln.3 new file mode 100644 index 00000000000..2b4710990aa --- /dev/null +++ b/lib/libcurses/curs_deleteln.3 @@ -0,0 +1,55 @@ +.TH curs_deleteln 3X "" +.SH NAME +\fBdeleteln\fR, \fBwdeleteln\fR, \fBinsdelln\fR, +\fBwinsdelln\fR, \fBinsertln\fR, \fBwinsertln\fR - delete and insert +lines in a \fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint deleteln(void);\fR +.br +\fBint wdeleteln(WINDOW *win);\fR +.br +\fBint insdelln(int n);\fR +.br +\fBint winsdelln(WINDOW *win, int n);\fR +.br +\fBint insertln(void);\fR +.br +\fBint winsertln(WINDOW *win);\fR +.br +.SH DESCRIPTION +The \fBdeleteln\fR and \fBwdeleteln\fR routines delete the line under the +cursor in the window; all lines below the current line are moved up one line. +The bottom line of the window is cleared. The cursor position does not change. + +The \fBinsdelln\fR and \fBwinsdelln\fR routines, for positive \fIn\fR, insert +\fIn\fR lines into the specified window above the current line. The \fIn\fR +bottom lines are lost. For negative \fIn\fR, delete \fIn\fR lines (starting +with the one under the cursor), and move the remaining lines up. The bottom +\fIn\fR lines are cleared. The current cursor position remains the same. + +The \fBinsertln\fR and \fBinsertln\fR routines, insert a blank line above the +current line and the bottom line is lost. +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and an \fBOK\fR (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. The +standard specifies that they return \fBERR\fR on failure, but specifies no +error conditions. +.SH NOTES +Note that all but \fBwinsdelln\fR may be a macros. + +These routines do not require a hardware line delete or insert feature in the +terminal. In fact, they won't use hardware line delete/insert unless +\fBidlok(..., TRUE)\fR has been set on the current window. +.SH SEE ALSO +\fBcurses\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_getch.3 b/lib/libcurses/curs_getch.3 new file mode 100644 index 00000000000..293bcf29fc4 --- /dev/null +++ b/lib/libcurses/curs_getch.3 @@ -0,0 +1,203 @@ +.TH curs_getch 3X "" +.SH NAME +\fBgetch\fR, \fBwgetch\fR, \fBmvgetch\fR, +\fBmvwgetch\fR, \fBungetch\fR - get (or push back) characters from +\fBcurses\fR terminal keyboard +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint getch(void);\fR +.br +\fBint wgetch(WINDOW *win);\fR +.br +\fBint mvgetch(int y, int x);\fR +.br +\fBint mvwgetch(WINDOW *win, int y, int x);\fR +.br +\fBint ungetch(int ch);\fR +.br +.SH DESCRIPTION +The \fBgetch\fR, \fBwgetch\fR, \fBmvgetch\fR and \fBmvwgetch\fR, routines read +a character from the window. In no-delay mode, if no input is waiting, the +value \fBERR\fR is returned. In delay mode, the program waits until the system +passes text through to the program. Depending on the setting of \fBcbreak\fR, +this is after one character (cbreak mode), or after the first newline (nocbreak +mode). In half-delay mode, the program waits until a character is typed or the +specified timeout has been reached. + +If \fBnoecho\fR has been set, then the character will also be echoed into the +designated window according to the following rules: +If the character is the current erase character, left arrow, or backspace, +the cursor is moved one space to the left and that screen position is erased +as if \fBdelch\fR had been called. +If the character value is any other \fBKEY_\fR define, the user is alerted +with a \fBbeep\fR call. +Otherwise the character is simply output to the screen. + +If the window is not a pad, and it has been moved or modified since the last +call to \fBwrefresh\fR, \fBwrefresh\fR will be called before another character +is read. + +If \fBkeypad\fR is \fBTRUE\fR, and a function key is pressed, the token for +that function key is returned instead of the raw characters. Possible function +keys are defined in \fB<curses.h>\fR as macros with values outside the range +of 8-bit characters whose names begin with \fBKEY_.\fR Thus, a variable +intended to hold the return value of a function key must be of short size or +larger. + +When a character that could be the beginning of a function key is received +(which, on modern terminals, means an escape character), \fBcurses\fR sets a +timer. If the remainder of the sequence does not come in within the designated +time, the character is passed through; otherwise, the function key value is +returned. For this reason, many terminals experience a delay between the time +a user presses the escape key and the escape is returned to the program. + +The \fBungetch\fR routine places \fIch\fR back onto the input queue to be +returned by the next call to \fBwgetch\fR. Note that there is, in effect, +just one input queue for all windows. + +.SS Function Keys +The following function keys, defined in \fB<curses.h>\fR, might be returned by +\fBgetch\fR if \fBkeypad\fR has been enabled. Note that not all of these are +necessarily supported on any particular terminal. +.nf +__________________________________________________________________ +\fIName\fR \fIKey\fR \fIname\fR +__________________________________________________________________ +KEY_BREAK Break key +KEY_DOWN The four arrow keys ... +KEY_UP +KEY_LEFT +KEY_RIGHT +KEY_HOME Home key (upward+left arrow) +KEY_BACKSPACE Backspace +KEY_F0 Function keys; space for 64 keys is reserved. +KEY_F(\fIn\fR) For 0 \fI<\fR \fIn\fR \fI<\fR 63 +KEY_DL Delete line +KEY_IL Insert line +KEY_DC Delete character +KEY_IC Insert char or enter insert mode +KEY_EIC Exit insert char mode +KEY_CLEAR Clear screen +KEY_EOS Clear to end of screen +KEY_EOL Clear to end of line +KEY_SF Scroll 1 line forward +KEY_SR Scroll 1 line backward (reverse) +KEY_NPAGE Next page +KEY_PPAGE Previous page +KEY_STAB Set tab +KEY_CTAB Clear tab +KEY_CATAB Clear all tabs +KEY_ENTER Enter or send +KEY_SRESET Soft (partial) reset +KEY_RESET Reset or hard reset +KEY_PRINT Print or copy +KEY_LL Home down or bottom (lower left). Keypad is + arranged like this: + \fBA1\fR \fBup\fR \fBA3\fR + \fBleft\fR \fBB2\fR \fBright\fR + \fBC1\fR \fBdown\fR \fBC3\fR +KEY_A1 Upper left of keypad +KEY_A3 Upper right of keypad +KEY_B2 Center of keypad +KEY_C1 Lower left of keypad +KEY_C3 Lower right of keypad +KEY_BTAB Back tab key +KEY_BEG Beg(inning) key +KEY_CANCEL Cancel key +KEY_CLOSE Close key +KEY_COMMAND Cmd (command) key +KEY_COPY Copy key +KEY_CREATE Create key +KEY_END End key +KEY_EXIT Exit key +KEY_FIND Find key +KEY_HELP Help key +KEY_MARK Mark key +KEY_MESSAGE Message key +KEY_MOVE Move key +KEY_NEXT Next object key +KEY_OPEN Open key +KEY_OPTIONS Options key +KEY_PREVIOUS Previous object key +KEY_REDO Redo key +KEY_REFERENCE Ref(erence) key +KEY_REFRESH Refresh key +KEY_REPLACE Replace key +KEY_RESTART Restart key +KEY_RESUME Resume key +KEY_SAVE Save key +KEY_SBEG Shifted beginning key +KEY_SCANCEL Shifted cancel key +KEY_SCOMMAND Shifted command key +KEY_SCOPY Shifted copy key +KEY_SCREATE Shifted create key +KEY_SDC Shifted delete char key +KEY_SDL Shifted delete line key +KEY_SELECT Select key +KEY_SEND Shifted end key +KEY_SEOL Shifted clear line key +KEY_SEXIT Shifted exit key +KEY_SFIND Shifted find key +KEY_SHELP Shifted help key +KEY_SHOME Shifted home key +KEY_SIC Shifted input key +KEY_SLEFT Shifted left arrow key +KEY_SMESSAGE Shifted message key +KEY_SMOVE Shifted move key +KEY_SNEXT Shifted next key +KEY_SOPTIONS Shifted options key +KEY_SPREVIOUS Shifted prev key +KEY_SPRINT Shifted print key +KEY_SREDO Shifted redo key +KEY_SREPLACE Shifted replace key +KEY_SRIGHT Shifted right arrow +KEY_SRSUME Shifted resume key +KEY_SSAVE Shifted save key +KEY_SSUSPEND Shifted suspend key +KEY_SUNDO Shifted undo key +KEY_SUSPEND Suspend key +KEY_UNDO Undo key +.fi + +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and an integer value +other than \fBERR\fR" (\fBOK\fR in the case of ungetch()) upon successful +completion. +.SH NOTES +Use of the escape key by a programmer for a single character function is +discouraged, as it will cause a delay of up to one second while the +keypad code looks for a following function-key sequence. + +When using \fBgetch\fR, \fBwgetch\fR, \fBmvgetch\fR, or +\fBmvwgetch\fR, nocbreak mode (\fBnocbreak\fR) and echo mode +(\fBecho\fR) should not be used at the same time. Depending on the +state of the tty driver when each character is typed, the program may +produce undesirable results. + +Note that \fBgetch\fR, \fBmvgetch\fR, and \fBmvwgetch\fR may be macros. + +Historically, the set of keypad macros was largely defined by the extremely +function-key-rich keyboard of the AT&T 7300, aka 3B1, aka Safari 4. Modern +personal computers usually have only a small subset of these. IBM PC-style +consoles typically support little more than \fBKEY_UP\fR, \fBKEY_DOWN\fR, +\fBKEY_LEFT\fR, \fBKEY_RIGHT\fR, \fBKEY_HOME\fR, \fBKEY_END\fR, +\fBKEY_NPAGE\fR, \fBKEY_PPAGE\fR, and function keys 1 through 12. The Ins key +is usually mapped to \fBKEY_IC\fR. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. They read +single-byte characters only. The standard specifies that they return \fBERR\fR +on failure, but specifies no error conditions. + +The echo behavior of these functions on input of \fBKEY_\fR or backspace +characters was not specified. This description is adopted from the XSI +Curses standard. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_inopts\fR(3X), \fBcurs_move\fR(3X), +\fBcurs_refresh\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_getstr.3 b/lib/libcurses/curs_getstr.3 new file mode 100644 index 00000000000..95845739807 --- /dev/null +++ b/lib/libcurses/curs_getstr.3 @@ -0,0 +1,66 @@ +.TH curs_getstr 3X "" +.SH NAME +\fBgetstr\fR, \fBwgetstr\fR, \fBmvgetstr\fR, +\fBmvwgetstr\fR, \fBwgetnstr\fR - accept character strings from +\fBcurses\fR terminal keyboard +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint getstr(char *str);\fR +.br +\fBint wgetstr(WINDOW *win, char *str);\fR +.br +\fBint mvgetstr(int y, int x, char *str);\fR +.br +\fBint mvwgetstr(WINDOW *win, int y, int x, char *str);\fR +.br +\fBint wgetnstr(WINDOW *win, char *str, int n);\fR +.br +.SH DESCRIPTION +The function \fBgetstr\fR is equivalent to a series of calls to \fBgetch\fR, +until a newline or carriage return is received (the terminating character is +not included in the returned string). The resulting value is placed in the +area pointed to by the character pointer \fIstr\fR. + +\fBwgetnstr\fR reads at most \fIn\fR characters, thus preventing a possible +overflow of the input buffer. Any attempt to enter more characters (other +than the terminating newline or carriage return) causes a beep. Function +keys also cause a beep and are ignored. + +The user's erase and kill characters are interpreted. If keypad +mode is on for the window, \fBKEY_LEFT\fR and \fBKEY_BACKSPACE\fR +are both considered equivalent to the user's kill character. + +Characters input are echoed only if \fBecho\fR is currently on. In that case, +backspace is echoed as deletion of the previous character (typically a left +motion). +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and an \fBOK\fR (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion. +.SH NOTES +Note that \fBgetstr\fR, \fBmvgetstr\fR, and \fBmvwgetstr\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. They read +single-byte characters only. The standard specifies that they return \fBERR\fR +on failure, but the single error condition \fBEOVERFLOW\fR associated with +extended-level conformance is not yet returned (the XSI curses support for +multi-byte characters is not yet present). + +SVr3 and early SVr4 curses implementations did not reject function keys; +the SVr4.0 documentation claimed that "special keys" (such as function +keys, "home" key, "clear" key, \fIetc\fR.) are interpreted" without +giving details. It lied. In fact, the `character' value appended to the +string by those implementations was predictable but not useful +(being, in fact, the low-order eight bits of the key's KEY_ value). + +The functions \fBgetnstr\fR, \fBmvgetnstr\fR, and \fBmvwgetnstr\fR were +present but not documented in SVr4. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_getch\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_getyx.3 b/lib/libcurses/curs_getyx.3 new file mode 100644 index 00000000000..58a3a52e8eb --- /dev/null +++ b/lib/libcurses/curs_getyx.3 @@ -0,0 +1,43 @@ +.TH curs_getyx 3X "" +.SH NAME +\fBgetyx\fR, \fBgetparyx\fR, \fBgetbegyx\fR, +\fBgetmaxyx\fR - get \fBcurses\fR cursor and window coordinates +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBvoid getyx(WINDOW *win, int y, int x);\fR +.br +\fBvoid getparyx(WINDOW *win, int y, int x);\fR +.br +\fBvoid getbegyx(WINDOW *win, int y, int x);\fR +.br +\fBvoid getmaxyx(WINDOW *win, int y, int x);\fR +.br +.SH DESCRIPTION +The \fBgetyx\fR macro places the current cursor position of the given window in +the two integer variables \fIy\fR and \fIx\fR. + +If \fIwin\fR is a subwindow, the \fBgetparyx\fR macro places the beginning +coordinates of the subwindow relative to the parent window into two integer +variables \fIy\fR and \fIx\fR. Otherwise, \fB-1\fR is placed into \fIy\fR and +\fIx\fR. + +Like \fBgetyx\fR, the \fBgetbegyx\fR and \fBgetmaxyx\fR macros store +the current beginning coordinates and size of the specified window. +.SH RETURN VALUE +The return values of these macros are undefined (\fIi\fR.\fIe\fR., +they should not be used as the right-hand side of assignment +statements). +.SH NOTES +All of these interfaces are macros and that "\fB&\fR" is not +necessary before the variables \fIy\fR and \fIx\fR. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. +.SH SEE ALSO +\fBcurses\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_inch.3 b/lib/libcurses/curs_inch.3 new file mode 100644 index 00000000000..688a12c415a --- /dev/null +++ b/lib/libcurses/curs_inch.3 @@ -0,0 +1,42 @@ +.TH curs_inch 3X "" +.SH NAME +\fBinch\fR, \fBwinch\fR, \fBmvinch\fR, \fBmvwinch\fR +- get a character and attributes from a \fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBchtype inch(void);\fR +.br +\fBchtype winch(WINDOW *win);\fR +.br +\fBchtype mvinch(int y, int x);\fR +.br +\fBchtype mvwinch(WINDOW *win, int y, int x);\fR +.br +.SH DESCRIPTION +These routines return the character, of type \fBchtype\fR, at the current +position in the named window. If any attributes are set for that position, +their values are OR-ed into the value returned. Constants defined in +\fB<curses.h>\fR can be used with the \fB&\fR (logical AND) operator to +extract the character or attributes alone. + +.SS Attributes +The following bit-masks may be AND-ed with characters returned by \fBwinch\fR. + +.nf +\fBA_CHARTEXT\fR Bit-mask to extract character +\fBA_ATTRIBUTES\fR Bit-mask to extract attributes +\fBA_COLOR\fR Bit-mask to extract color-pair field information +.fi +.SH NOTES +Note that all of these routines may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. +.SH SEE ALSO +\fBcurses\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_inchstr.3 b/lib/libcurses/curs_inchstr.3 new file mode 100644 index 00000000000..75c02b2fdb5 --- /dev/null +++ b/lib/libcurses/curs_inchstr.3 @@ -0,0 +1,55 @@ +.TH curs_inchstr 3X "" +.SH NAME +\fBinchstr\fR, \fBinchnstr\fR, \fBwinchstr\fR, +\fBwinchnstr\fR, \fBmvinchstr\fR, \fBmvinchnstr\fR, \fBmvwinchstr\fR, +\fBmvwinchnstr\fR - get a string of characters (and attributes) from a +\fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint inchstr(chtype *chstr);\fR +.br +\fBint inchnstr(chtype *chstr, int n);\fR +.br +\fBint winchstr(WINDOW *win, chtype *chstr);\fR +.br +\fBint winchnstr(WINDOW *win, chtype *chstr, int n);\fR +.br +\fBint mvinchstr(int y, int x, chtype *chstr);\fR +.br +\fBint mvinchnstr(int y, int x, chtype *chstr, int n);\fR +.br +\fBint mvwinchstr(WINDOW *win, int y, int x, chtype *chstr);\fR +.br +\fBint mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n);\fR +.br +.SH DESCRIPTION +These routines return a NULL-terminated array of \fBchtype\fR quantities, +starting at the current cursor position in the named window and ending at the +right margin of the window. The four functions with \fIn\fR as +the last argument, return a leading substring at most \fIn\fR characters long +(exclusive of the trailing (chtype)0). +Constants defined in \fB<curses.h>\fR can be used with the \fB&\fR (logical +AND) operator to extract the character or the attribute alone from any position +in the \fIchstr\fR [see curs_inch(3X)]. +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and an integer value +other than \fBERR\fR upon successful completion (the number of characters +retrieved, exclusive of the trailing 0). +.SH NOTES +Note that all routines except \fBwinchnstr\fR may be macros. SVr4 does not +document whether the result string is 0-terminated; it does not document +whether a length limit argument includes any trailing 0; and it does not +document the meaning of the return value. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. It is no +more specific than the SVr4 documentation on the trailing 0. It does specify +that the successful return of the functions is \fBOK\fR. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_inch\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_initscr.3 b/lib/libcurses/curs_initscr.3 new file mode 100644 index 00000000000..0ede098dc19 --- /dev/null +++ b/lib/libcurses/curs_initscr.3 @@ -0,0 +1,87 @@ +.TH curs_initscr 3X "" +.SH NAME +\fBinitscr\fR, \fBnewterm\fR, \fBendwin\fR, +\fBisendwin\fR, \fBset_term\fR, \fBdelscreen\fR - \fBcurses\fR screen +initialization and manipulation routines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBWINDOW *initscr(void);\fR +.br +\fBint endwin(void);\fR +.br +\fBint isendwin(void);\fR +.br +\fBSCREEN *newterm(const char *type, FILE *outfd, FILE *infd);\fR +.br +\fBSCREEN *set_term(SCREEN *new);\fR +.br +\fBvoid delscreen(SCREEN* sp);\fR +.br +.SH DESCRIPTION +\fBinitscr\fR is normally the first \fBcurses\fR routine to call when +initializing a program. A few special routines sometimes need to be +called before it; these are \fBslk_init\fR, \fBfilter\fR, \fBripoffline\fR, +\fBuse_env\fR. For multiple-terminal applications, \fBnewterm\fR may be +called before \fBinitscr\fR. + +The initscr code determines the terminal type and initializes all \fBcurses\fR +data structures. \fBinitscr\fR also causes the first call to \fBrefresh\fR to +clear the screen. If errors occur, \fBinitscr\fR writes an appropriate error +message to standard error and exits; otherwise, a pointer is returned to +\fBstdscr\fR. + +A program that outputs to more than one terminal should use the \fBnewterm\fR +routine for each terminal instead of \fBinitscr\fR. A program that needs to +inspect capabilities, so it can continue to run in a line-oriented mode if the +terminal cannot support a screen-oriented program, would also use +\fBnewterm\fR. The routine \fBnewterm\fR should be called once for each +terminal. It returns a variable of type \fBSCREEN *\fR which should be saved +as a reference to that terminal. The arguments are the \fItype\fR of the +terminal to be used in place of \fB$TERM\fR, a file pointer for output to the +terminal, and another file pointer for input from the terminal (if \fItype\fR +is \fBNULL\fR, \fB$TERM\fR will be used). The program must also call +\fBendwin\fR for each terminal being used before exiting from \fBcurses\fR. +If \fBnewterm\fR is called more than once for the same terminal, the first +terminal referred to must be the last one for which \fBendwin\fR is called. + +A program should always call \fBendwin\fR before exiting or escaping from +\fBcurses\fR mode temporarily. This routine restores tty modes, moves the +cursor to the lower left-hand corner of the screen and resets the terminal into +the proper non-visual mode. Calling \fBrefresh\fR or \fBdoupdate\fR after a +temporary escape causes the program to resume visual mode. + +The \fBisendwin\fR routine returns \fBTRUE\fR if \fBendwin\fR has been +called without any subsequent calls to \fBwrefresh\fR, and \fBFALSE\fR +otherwise. + +The \fBset_term\fR routine is used to switch between different +terminals. The screen reference \fBnew\fR becomes the new current +terminal. The previous terminal is returned by the routine. This is +the only routine which manipulates \fBSCREEN\fR pointers; all other +routines affect only the current terminal. + +The \fBdelscreen\fR routine frees storage associated with the +\fBSCREEN\fR data structure. The \fBendwin\fR routine does not do +this, so \fBdelscreen\fR should be called after \fBendwin\fR if a +particular \fBSCREEN\fR is no longer needed. +.SH RETURN VALUE +\fBendwin\fR returns the integer \fBERR\fR upon failure and \fBOK\fR +upon successful completion. + +Routines that return pointers always return \fBNULL\fR on error. +.SH NOTES +Note that \fBinitscr\fR and \fBnewterm\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. It +specifies that portable applications must not call \fBinitscr\fR more than +once. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_kernel\fR(3X), \fBcurs_refresh\fR(3X), +\fBcurs_slk\fR(3X), \fBcurs_util\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_inopts.3 b/lib/libcurses/curs_inopts.3 new file mode 100644 index 00000000000..aa53b61e57a --- /dev/null +++ b/lib/libcurses/curs_inopts.3 @@ -0,0 +1,183 @@ +.TH curs_inopts 3X "" +.SH NAME +\fBcbreak\fR, \fBnocbreak\fR, \fBecho\fR, +\fBnoecho\fR, \fBhalfdelay\fR, \fBintrflush\fR, \fBkeypad\fR, +\fBmeta\fR, \fBnodelay\fR, \fBnotimeout\fR, \fBraw\fR, \fBnoraw\fR, +\fBnoqiflush\fR, \fBqiflush\fR, \fBtimeout\fR, \fBwtimeout\fR, +\fBtypeahead\fR - \fBcurses\fR input options +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint cbreak(void);\fR +.br +\fBint nocbreak(void);\fR +.br +\fBint echo(void);\fR +.br +\fBint noecho(void);\fR +.br +\fBint halfdelay(int tenths);\fR +.br +\fBint intrflush(WINDOW *win, bool bf);\fR +.br +\fBint keypad(WINDOW *win, bool bf);\fR +.br +\fBint meta(WINDOW *win, bool bf);\fR +.br +\fBint nodelay(WINDOW *win, bool bf);\fR +.br +\fBint raw(void);\fR +.br +\fBint noraw(void);\fR +.br +\fBvoid noqiflush(void);\fR +.br +\fBvoid qiflush(void);\fR +.br +\fBint notimeout(WINDOW *win, bool bf);\fR +.br +\fBvoid timeout(int delay);\fR +.br +\fBvoid wtimeout(WINDOW *win, int delay);\fR +.br +\fBint typeahead(int fd);\fR +.br +.SH DESCRIPTION +Normally, the tty driver buffers typed characters until a newline or carriage +return is typed. The \fBcbreak\fR routine disables line buffering and +erase/kill character-processing (interrupt and flow control characters are +unaffected), making characters typed by the user immediately available to the +program. The \fBnocbreak\fR routine returns the terminal to normal (cooked) +mode. + +Initially the terminal may or may not be in \fBcbreak\fR mode, as the mode is +inherited; therefore, a program should call \fBcbreak\fR or \fBnocbreak\fR +explicitly. Most interactive programs using \fBcurses\fR set the \fBcbreak\fR +mode. Note that \fBcbreak\fR overrides \fBraw\fR. [See curs_getch(3X) for a +discussion of how these routines interact with \fBecho\fR and \fBnoecho\fR.] + +The \fBecho\fR and \fBnoecho\fR routines control whether characters typed by +the user are echoed by \fBgetch\fR as they are typed. Echoing by the tty +driver is always disabled, but initially \fBgetch\fR is in echo mode, so +characters typed are echoed. Authors of most interactive programs prefer to do +their own echoing in a controlled area of the screen, or not to echo at all, so +they disable echoing by calling \fBnoecho\fR. [See curs_getch(3X) for a +discussion of how these routines interact with \fBcbreak\fR and +\fBnocbreak\fR.] + +The \fBhalfdelay\fR routine is used for half-delay mode, which is similar to +\fBcbreak\fR mode in that characters typed by the user are immediately +available to the program. However, after blocking for \fItenths\fR tenths of +seconds, ERR is returned if nothing has been typed. The value of \fBtenths\fR +must be a number between 1 and 255. Use \fBnocbreak\fR to leave half-delay +mode. + +If the \fBintrflush\fR option is enabled, (\fIbf\fR is \fBTRUE\fR), when an +interrupt key is pressed on the keyboard (interrupt, break, quit) all output in +the tty driver queue will be flushed, giving the effect of faster response to +the interrupt, but causing \fBcurses\fR to have the wrong idea of what is on +the screen. Disabling (\fIbf\fR is \fBFALSE\fR), the option prevents the +flush. The default for the option is inherited from the tty driver settings. +The window argument is ignored. + +The \fBkeypad\fR option enables the keypad of the user's terminal. If +enabled (\fIbf\fR is \fBTRUE\fR), the user can press a function key +(such as an arrow key) and \fBwgetch\fR returns a single value +representing the function key, as in \fBKEY_LEFT\fR. If disabled +(\fIbf\fR is \fBFALSE\fR), \fBcurses\fR does not treat function keys +specially and the program has to interpret the escape sequences +itself. If the keypad in the terminal can be turned on (made to +transmit) and off (made to work locally), turning on this option +causes the terminal keypad to be turned on when \fBwgetch\fR is +called. The default value for keypad is false. + +Initially, whether the terminal returns 7 or 8 significant bits on +input depends on the control mode of the tty driver [see termio(7)]. +To force 8 bits to be returned, invoke \fBmeta\fR(\fIwin\fR, +\fBTRUE\fR); this is equivalent, under POSIX, to setting the CS8 flag +on the terminal. To force 7 bits to be returned, invoke +\fBmeta\fR(\fIwin\fR, \fBFALSE\fR); this is equivalent, under POSIX, +to setting the CS8 flag on the terminal. The window argument, +\fIwin\fR, is always ignored. If the terminfo capabilities \fBsmm\fR +(meta_on) and \fBrmm\fR (meta_off) are defined for the terminal, +\fBsmm\fR is sent to the terminal when \fBmeta\fR(\fIwin\fR, +\fBTRUE\fR) is called and \fBrmm\fR is sent when \fBmeta\fR(\fIwin\fR, +\fBFALSE\fR) is called. + +The \fBnodelay\fR option causes \fBgetch\fR to be a non-blocking call. +If no input is ready, \fBgetch\fR returns \fBERR\fR. If disabled +(\fIbf\fR is \fBFALSE\fR), \fBgetch\fR waits until a key is pressed. + +While interpreting an input escape sequence, \fBwgetch\fR sets a timer +while waiting for the next character. If \fBnotimeout(\fR\fIwin\fR, +\fBTRUE\fR) is called, then \fBwgetch\fR does not set a timer. The +purpose of the timeout is to differentiate between sequences received +from a function key and those typed by a user. + +The \fBraw\fR and \fBnoraw\fR routines place the terminal into or out of raw +mode. Raw mode is similar to \fBcbreak\fR mode, in that characters typed are +immediately passed through to the user program. The differences are that in +raw mode, the interrupt, quit, suspend, and flow control characters are all +passed through uninterpreted, instead of generating a signal. The behavior of +the BREAK key depends on other bits in the tty driver that are not set by +\fBcurses\fR. + +When the \fBnoqiflush\fR routine is used, normal flush of input and +output queues associated with the \fBINTR\fR, \fBQUIT\fR and +\fBSUSP\fR characters will not be done [see termio(7)]. When +\fBqiflush\fR is called, the queues will be flushed when these control +characters are read. You may want to call \fBnoqiflush()\fR in a signal +handler if you want output to continue as though the interrupt +had not occurred, after the handler exits. + +The \fBtimeout\fR and \fBwtimeout\fR routines set blocking or +non-blocking read for a given window. If \fIdelay\fR is negative, +blocking read is used (\fIi\fR.\fIe\fR., waits indefinitely for +input). If \fIdelay\fR is zero, then non-blocking read is used +(\fIi\fR.\fIe\fR., read returns \fBERR\fR if no input is waiting). If +\fIdelay\fR is positive, then read blocks for \fIdelay\fR +milliseconds, and returns \fBERR\fR if there is still no input. +Hence, these routines provide the same functionality as \fBnodelay\fR, +plus the additional capability of being able to block for only +\fIdelay\fR milliseconds (where \fIdelay\fR is positive). + +The \fBcurses\fR library does ``line-breakout optimization'' by looking for +typeahead periodically while updating the screen. If input is found, +and it is coming from a tty, the current update is postponed until +\fBrefresh\fR or \fBdoupdate\fR is called again. This allows faster +response to commands typed in advance. Normally, the input FILE +pointer passed to \fBnewterm\fR, or \fBstdin\fR in the case that +\fBinitscr\fR was used, will be used to do this typeahead checking. +The \fBtypeahead\fR routine specifies that the file descriptor +\fIfd\fR is to be used to check for typeahead instead. If \fIfd\fR is +-1, then no typeahead checking is done. +.SH RETURN VALUE +All routines that return an integer return \fBERR\fR upon failure and OK (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion, unless otherwise noted in the preceding routine descriptions. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. + +The curses library obeys the XPG4 standard and the historical practice of the +AT&T curses implementations, in that the echo bit is cleared when curses +initializes the terminal state. BSD curses differed from this slightly; it +left the echo bit on at initialization, but the BSD \fBraw\fR call turned it +off as a side-effect. For best portability, set echo or noecho explicitly +just after initialization, even if your program remains in cooked mode. +.SH NOTES +Note that \fBecho\fR, \fBnoecho\fR, \fBhalfdelay\fR, \fBintrflush\fR, +\fBmeta\fR, \fBnodelay\fR, \fBnotimeout\fR, \fBnoqiflush\fR, +\fBqiflush\fR, \fBtimeout\fR, and \fBwtimeout\fR may be macros. + +The \fBnoraw\fR and \fBnocbreak\fR calls follow historical practice in that +they attempt to restore to normal (`cooked') mode from raw and cbreak modes +respectively. Mixing raw/noraw and cbreak/nocbreak calls leads to tty driver +control states that are hard to predict or understand; it is not recommended. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_getch\fR(3X), \fBcurs_initscr\fR(3X), \fBtermio\fR(7) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_insch.3 b/lib/libcurses/curs_insch.3 new file mode 100644 index 00000000000..11f49053095 --- /dev/null +++ b/lib/libcurses/curs_insch.3 @@ -0,0 +1,39 @@ +.TH curs_insch 3X "" +.SH NAME +\fBinsch\fR, \fBwinsch\fR, \fBmvinsch\fR, \fBmvwinsch\fR - +insert a character before cursor in a \fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint insch(chtype ch);\fR +.br +\fBint winsch(WINDOW *win, chtype ch);\fR +.br +\fBint mvinsch(int y, int x, chtype ch);\fR +.br +\fBint mvwinsch(WINDOW *win, int y, int x, chtype ch);\fR +.br +.SH DESCRIPTION +These routines, insert the character \fIch\fR before the character under the +cursor. All characters to the right of the cursor are moved one space to the +right, with the possibility of the rightmost character on the line being lost. +The insertion operation does not change the cursor position. +.SH RETURN VALUE +All routines that return an integer return \fBERR\fR upon failure and OK (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion, unless otherwise noted in the preceding routine descriptions. +.SH NOTES +These routines do not necessarily imply use of a hardware insert character +feature. + +Note that \fBinsch\fR, \fBmvinsch\fR, and \fBmvwinsch\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. +.SH SEE ALSO +\fBcurses\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_insstr.3 b/lib/libcurses/curs_insstr.3 new file mode 100644 index 00000000000..965c16fd4d4 --- /dev/null +++ b/lib/libcurses/curs_insstr.3 @@ -0,0 +1,61 @@ +.TH curs_insstr 3X "" +.SH NAME +\fBinsstr\fR, \fBinsnstr\fR, \fBwinsstr\fR, \fBwinsnstr\fR, +\fBmvinsstr\fR, \fBmvinsnstr\fR, \fBmvwinsstr\fR, \fBmvwinsnstr\fR - insert +string before cursor in a \fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR +.br +\fBint insstr(const char *str);\fR +.br +\fBint insnstr(const char *str, int n);\fR +.br +\fBint winsstr(WINDOW *win, const char *str);\fR +.br +\fBint winsnstr(WINDOW *win, const char *str, int n);\fR +.br +\fBint mvinsstr(int y, int x, const char *str);\fR +.br +\fBint mvinsnstr(int y, int x, const char *str, int n);\fR +.br +\fBint mvwinsstr(WINDOW *win, int y, int x, const char *str);\fR +.br +\fBint mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n);\fR +.br +.SH DESCRIPTION +These routines insert a character string (as many characters as will fit on the +line) before the character under the cursor. All characters to the right of +the cursor are shifted right, with the possibility of the rightmost characters +on the line being lost. The cursor position does not change (after moving to +\fIy\fR, \fIx\fR, if specified). The four routines with \fIn\fR as the last +argument insert a leading substring of at most \fIn\fR characters. If +\fIn\fR<=0, then the entire string is inserted. + +If a character in \fIstr\fR is a tab, newline, carriage return or +backspace, the cursor is moved appropriately within the window. A +newline also does a \fBclrtoeol\fR before moving. Tabs are considered +to be at every eighth column. If a character in \fIstr\fR is another +control character, it is drawn in the \fB^\fR\fIX\fR notation. +Calling \fBwinch\fR after adding a control character (and moving to +it, if necessary) does not return the control character, but instead +returns a character in the the ^-representation of the control character. +.SH RETURN VALUE +All routines that return an integer return \fBERR\fR upon failure and OK (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion, unless otherwise noted in the preceding routine descriptions. +.SH NOTES +Note that all but \fBwinsnstr\fR may be macros. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4, which adds +const qualifiers to the arguments. The XSI Curses error conditions +\fBEILSEQ\fR and \fBEILOVERFLOW\fR associated with extended-level conformance +are not yet detected (this implementation does not yet support XPG4 multibyte +characters). +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_clear\fR(3X), \fBcurs_inch\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_instr.3 b/lib/libcurses/curs_instr.3 new file mode 100644 index 00000000000..e7c681664a5 --- /dev/null +++ b/lib/libcurses/curs_instr.3 @@ -0,0 +1,53 @@ +.TH curs_instr 3X "" +.SH NAME +\fBinstr\fR, \fBinnstr\fR, \fBwinstr\fR, \fBwinnstr\fR, +\fBmvinstr\fR, \fBmvinnstr\fR, \fBmvwinstr\fR, \fBmvwinnstr\fR - get a string +of characters from a \fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint instr(char *str);\fR +.br +\fBint innstr(char *str, int n);\fR +.br +\fBint winstr(WINDOW *win, char *str);\fR +.br +\fBint winnstr(WINDOW *win, char *str, int n);\fR +.br +\fBint mvinstr(int y, int x, char *str);\fR +.br +\fBint mvinnstr(int y, int x, char *str, int n);\fR +.br +\fBint mvwinstr(WINDOW *win, int y, int x, char *str);\fR +.br +\fBint mvwinnstr(WINDOW *win, int y, int x, char *str, int n);\fR +.br +.SH DESCRIPTION +These routines return a string of characters in \fIstr\fR, extracted starting +at the current cursor position in the named window and ending at the right +margin of the window. Attributes are stripped from the characters. The four +functions with \fIn\fR as the last argument return a leading substring at most +\fIn\fR characters long (exclusive of the trailing NUL). +.SH RETURN VALUE +All routines that return an integer return \fBERR\fR upon failure and OK (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion, unless otherwise noted in the preceding routine descriptions. +.SH NOTES +Note that all routines except \fBwinnstr\fR may be macros. SVr4 does not +document whether a length limit includes or excludes the trailing NUL, and +does not document the meaning of the return values. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. The +standard specifies that they always return \fBOK\fR on success. The XSI Curses +error conditions \fBEILSEQ\fR and \fBEILOVERFLOW\fR associated with +extebded-level conformance are not yet detected (this implementation does not +yet support XPG4 multibyte characters). +.SH SEE ALSO +\fBcurses\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: + diff --git a/lib/libcurses/curs_kernel.3 b/lib/libcurses/curs_kernel.3 new file mode 100644 index 00000000000..7fda81b2560 --- /dev/null +++ b/lib/libcurses/curs_kernel.3 @@ -0,0 +1,123 @@ +.TH curs_kernel 3X "" +.SH NAME +\fBdef_prog_mode\fR, \fBdef_shell_mode\fR, +\fBreset_prog_mode\fR, \fBreset_shell_mode\fR, \fBresetty\fR, +\fBsavetty\fR, \fBgetsyx\fR, \fBsetsyx\fR, \fBripoffline\fR, +\fBcurs_set\fR, \fBnapms\fR - low-level \fBxscurses\fR routines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint def_prog_mode(void);\fR +.br +\fBint def_shell_mode(void);\fR +.br +\fBint reset_prog_mode(void);\fR +.br +\fBint reset_shell_mode(void);\fR +.br +\fBint resetty(void);\fR +.br +\fBint savetty(void);\fR +.br +\fBvoid getsyx(int y, int x);\fR +.br +\fBvoid setsyx(int y, int x);\fR +.br +\fBint ripoffline(int line, int (*init)(WINDOW *, int));\fR +.br +\fBint curs_set(int visibility);\fR +.br +\fBint napms(unsigned int ms);\fR +.br +.SH DESCRIPTION +The following routines give low-level access to various \fBcurses\fR +capabilities. Theses routines typically are used inside library +routines. + +The \fBdef_prog_mode\fR and \fBdef_shell_mode\fR routines save the +current terminal modes as the "program" (in \fBcurses\fR) or "shell" +(not in \fBcurses\fR) state for use by the \fBreset_prog_mode\fR and +\fBreset_shell_mode\fR routines. This is done automatically by +\fBinitscr\fR. There is one such save area for each screen context +allocated by \fBnewterm()\fR. + +The \fBreset_prog_mode\fR and \fBreset_shell_mode\fR routines restore +the terminal to "program" (in \fBcurses\fR) or "shell" (out of +\fBcurses\fR) state. These are done automatically by \fBendwin\fR +and, after an \fBendwin\fR, by \fBdoupdate\fR, so they normally are +not called. + +The \fBresetty\fR and \fBsavetty\fR routines save and restore the +state of the terminal modes. \fBsavetty\fR saves the current state in +a buffer and \fBresetty\fR restores the state to what it was at the +last call to \fBsavetty\fR. + +The \fBgetsyx\fR routine returns the current coordinates of the virtual screen +cursor in \fIy\fR and \fIx\fR. If \fBleaveok\fR is currently \fBTRUE\fR, then +\fB-1\fR,\fB-1\fR is returned. If lines have been removed from the top of the +screen, using \fBripoffline\fR, \fIy\fR and \fIx\fR include these lines; +therefore, \fIy\fR and \fIx\fR should be used only as arguments for +\fBsetsyx\fR. + +The \fBsetsyx\fR routine sets the virtual screen cursor to +\fIy\fR, \fIx\fR. If \fIy\fR and \fIx\fR are both \fB-1\fR, then +\fBleaveok\fR is set. The two routines \fBgetsyx\fR and \fBsetsyx\fR +are designed to be used by a library routine, which manipulates +\fBcurses\fR windows but does not want to change the current position +of the program's cursor. The library routine would call \fBgetsyx\fR +at the beginning, do its manipulation of its own windows, do a +\fBwnoutrefresh\fR on its windows, call \fBsetsyx\fR, and then call +\fBdoupdate\fR. + +The \fBripoffline\fR routine provides access to the same facility that +\fBslk_init\fR [see curs_slk(3X)] uses to reduce the size of the +screen. \fBripoffline\fR must be called before \fBinitscr\fR or +\fBnewterm\fR is called. If \fIline\fR is positive, a line is removed +from the top of \fBstdscr\fR; if \fIline\fR is negative, a line is +removed from the bottom. When this is done inside \fBinitscr\fR, the +routine \fBinit\fR (supplied by the user) is called with two +arguments: a window pointer to the one-line window that has been +allocated and an integer with the number of columns in the window. +Inside this initialization routine, the integer variables \fBLINES\fR +and \fBCOLS\fR (defined in \fB<curses.h>\fR) are not guaranteed to be +accurate and \fBwrefresh\fR or \fBdoupdate\fR must not be called. It +is allowable to call \fBwnoutrefresh\fR during the initialization +routine. + +\fBripoffline\fR can be called up to five times before calling \fBinitscr\fR or +\fBnewterm\fR. + +The \fBcurs_set\fR routine sets the cursor state is set to invisible, +normal, or very visible for \fBvisibility\fR equal to \fB0\fR, +\fB1\fR, or \fB2\fR respectively. If the terminal supports the +\fIvisibility\fR requested, the previous \fIcursor\fR state is +returned; otherwise, \fBERR\fR is returned. + +The \fBnapms\fR routine is used to sleep for \fIms\fR milliseconds. +.SH RETURN VALUE +Except for \fBcurs_set\fR, these routines always return \fBOK\fR. +\fBcurs_set\fR returns the previous cursor state, or \fBERR\fR if the +requested \fIvisibility\fR is not supported. +.SH NOTES +Note that \fBgetsyx\fR is a macro, so \fB&\fR is not necessary before +the variables \fIy\fR and \fIx\fR. + +The SVr4 man pages warn that the return value of \fBcurs_set\fR "is currently +incorrect". This implementation gets it right, but it may be unwise to count +on the correctness of the return value anywhere else. +.SH PORTABILITY +The functions \fBsetsyx\fR and \fBgetsyx\fR are not described in the XSI +Curses standard, Issue 4. All other functions are as described in XSI Curses. + +The SVr4 documentation describes \fBsetsyx\fR and \fBgetsyx\fR as having return +type int. This is misleading, as they are macros with no documented semantics +for the return value. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_outopts\fR(3X), \fBcurs_refresh\fR(3X), +\fBcurs_scr_dump\fR(3X), \fBcurs_slk\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_mouse.3 b/lib/libcurses/curs_mouse.3 new file mode 100644 index 00000000000..4781f99bed8 --- /dev/null +++ b/lib/libcurses/curs_mouse.3 @@ -0,0 +1,151 @@ +'\" t +.TH curs_mouse 3X "" +.SH NAME +\fBgetmouse\fR, \fBungetmouse\fR, +\fBmousemask\fR - mouse interface through curses +.SH SYNOPSIS +.nf +\fB#include <curses.h>\fR + +\fBtypedef unsigned long mmask_t; + +typedef struct +{ + short id; \fI/* ID to distinguish multiple devices */\fB + int x, y, z; \fI/* event coordinates */\fB + mmask_t bstate; \fI/* button state bits */\fB +} +MEVENT;\fR +.fi +.br +\fBint getmouse(MEVENT *event);\fR +.br +\fBint ungetmouse(MEVENT *event);\fR +.br +\fBmmask_t mousemask(mmask_t newmask, mmask_t *oldmask);\fR +.br +\fBbool wenclose(WINDOW *win, int y, int x)\fR +.br +\fBint mouseinterval(int erval)\fR +.br +.SH DESCRIPTION +These functions provide an interface to mouse events from +\fBcurses\fR(3x). Mouse events are represented by \fBKEY_MOUSE\fR +pseudo-key values in the \fBwgetch\fR input stream. + +To make mouse events visible, use the \fBmousemask\fR function. This will set +the mouse events to be reported. By default, no mouse events are reported. +The function will return a mask to indicate which of the specified mouse events +can be reported; on complete failure it returns 0. If oldmask is non-NULL, +this function fills the indicated location with the previous value of the given +window's mouse event mask. + +As a side effect, setting a zero mousemask may turn off the mouse pointer; +setting a nonzero mask may turn it on. Whether this happens is +device-dependent. + +Here are the mouse event type masks: + +.TS +l l +_ _ +l l. +\fIName\fR \fIDescription\fR +BUTTON1_PRESSED mouse button 1 down +BUTTON1_RELEASED mouse button 1 up +BUTTON1_CLICKED mouse button 1 clicked +BUTTON1_DOUBLE_CLICKED mouse button 1 double clicked +BUTTON1_TRIPLE_CLICKED mouse button 1 triple clicked +BUTTON2_PRESSED mouse button 2 down +BUTTON2_RELEASED mouse button 2 up +BUTTON2_CLICKED mouse button 2 clicked +BUTTON2_DOUBLE_CLICKED mouse button 2 double clicked +BUTTON2_TRIPLE_CLICKED mouse button 2 triple clicked +BUTTON3_PRESSED mouse button 3 down +BUTTON3_RELEASED mouse button 3 up +BUTTON3_CLICKED mouse button 3 clicked +BUTTON3_DOUBLE_CLICKED mouse button 3 double clicked +BUTTON3_TRIPLE_CLICKED mouse button 3 triple clicked +BUTTON4_PRESSED mouse button 4 down +BUTTON4_RELEASED mouse button 4 up +BUTTON4_CLICKED mouse button 4 clicked +BUTTON4_DOUBLE_CLICKED mouse button 4 double clicked +BUTTON4_TRIPLE_CLICKED mouse button 4 triple clicked +BUTTON_SHIFT shift was down during button state change +BUTTON_CTRL control was down during button state change +BUTTON_ALT alt was down during button state change +ALL_MOUSE_EVENTS report all button state changes +REPORT_MOUSE_POSITION report mouse movement +.TE + +Once a class of mouse events have been made visible in a window, +calling the \fBwgetch\fR function on that window may return +\fBKEY_MOUSE\fR as an indicator that a mouse event has been queued. +To read the event data and pop the event off the queue, call +\fBgetmouse\fR. This function will return \fBOK\fR if a mouse event +is actually visible in the given window, \fBERR\fR otherwise. +When \fBgetmouse\fR returns \fBOK\fR, the data deposited as y and +x in the event structure coordinates will be screen-relative character-cell +coordinates. The returned state mask will have exactly one bit set to +indicate the event type. + +The \fBungetmouse\fR function behaves analogously to \fBungetch\fR. It pushes +a \fBKEY_MOUSE\fR event onto the input queue, and associates with that event +the given state data and screen-relative character-cell coordinates. + +The \fBwenclose\fR function tests whether a given pair of screen-relative +character-cell coordinates is enclosed by a given window, returning TRUE +if it is and FALSE otherwise. It is useful for determining what subset of +the screen windows enclose the location of a mouse event. + +The \fBmouseinterval\fR function sets the maximum time (in thousands of a +second) that can elapse between press and release events in order for them to +be recognized as a click. This function returns the previous interval value. +The default is one fifth of a second. + +Note that mouse events will be ignored when input is in cooked mode, and will +cause an error beep when cooked mode is being simulated in a window by a +function such as \fBgetstr\fR that expects a linefeed for input-loop +termination. + +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure or \fBOK\fR +upon successful completion. +.SH PORTABILITY +These calls were designed for \fBcurses\fR(3x), and are not found in SVr4 +curses, 4.4BSD curses, or any other previous version of curses. + +The feature macro \fBNCURSES_MOUSE_VERSION\fR is provided so the preprocessor +can be used to test whether these features are present (its value is 1). NOTE: +THIS INTERFACE IS EXPERIMENTAL AND IS SUBJECT TO CHANGE WITHOUT NOTICE! If the +interface is changed, the value of \fBNCURSES_MOUSE_VERSION\fR will be +incremented. + +The order of the \fBMEVENT\fR structure members is not guaranteed. +Additional fields may be added to the structure in the future. + +Under \fBcurses\fR(3x), these calls are implemented using either +xterm's built-in mouse-tracking API or Alessandro Rubini's gpm server. +If you are using something other than xterm there is no gpm daemon +running on your machine, mouse events will not be visible to +\fBcurses\fR(3x) (and the \fBwmousemask\fR function will always +return \fB0\fR). + +The z member in the event structure is not presently used. It is intended +for use with touchscreens (which may be pressure-sensitive) or with +3D-mice/trackballs/power gloves. +.SH BUGS +Mouse events under xterm will not in fact be ignored during cooked mode, +if they have been enabled by \fBwmousemask\fR. Instead, the xterm mouse +report sequence will appear in the string read. + +Mouse events under xterm will not be detected correctly in a window with +its keypad bit off. +.SH SEE ALSO +\fBcurses\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_move.3 b/lib/libcurses/curs_move.3 new file mode 100644 index 00000000000..7d915ed2843 --- /dev/null +++ b/lib/libcurses/curs_move.3 @@ -0,0 +1,34 @@ +.TH curs_move 3X "" +.SH NAME +\fBmove\fR, \fBwmove\fR - move \fBcurses\fR window cursor +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint move(int y, int x);\fR +.br +\fBint wmove(WINDOW *win, int y, int x);\fR +.br +.SH DESCRIPTION +These routines move the cursor associated with the window to line \fIy\fR and +column \fIx\fR. This routine does not move the physical cursor of the terminal +until \fBrefresh\fR is called. The position specified is relative to the upper +left-hand corner of the window, which is (0,0). +.SH RETURN VALUE +These routines return \fBERR\fR upon failure and OK (SVr4 +specifies only "an integer value other than \fBERR\fR") upon successful +completion. +.SH NOTES +Note that \fBmove\fR may be a macro. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. The +standard specifies that if (y,x) is within a multi-column character, the cursor +is moved to the first column of that character; however, this implementation +does not yet support the extended-level XSI multi-byte characters. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_refresh\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_outopts.3 b/lib/libcurses/curs_outopts.3 new file mode 100644 index 00000000000..e69383b4ad4 --- /dev/null +++ b/lib/libcurses/curs_outopts.3 @@ -0,0 +1,134 @@ +.TH curs_outopts 3X "" +.SH NAME +\fBclearok\fR, \fBidlok\fR, \fBidcok immedok\fR, +\fBleaveok\fR, \fBsetscrreg\fR, \fBwsetscrreg\fR, \fBscrollok\fR, +\fBnl\fR, \fBnonl\fR - \fBcurses\fR output options +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint clearok(WINDOW *win, bool bf);\fR +.br +\fBint idlok(WINDOW *win, bool bf);\fR +.br +\fBvoid idcok(WINDOW *win, bool bf);\fR +.br +\fBvoid immedok(WINDOW *win, bool bf);\fR +.br +\fBint leaveok(WINDOW *win, bool bf);\fR +.br +\fBint setscrreg(int top, int bot);\fR +.br +\fBint wsetscrreg(WINDOW *win, int top, int bot);\fR +.br +\fBint scrollok(WINDOW *win, bool bf);\fR +.br +\fBint nl(void);\fR +.br +\fBint nonl(void);\fR +.br +.SH DESCRIPTION +These routines set options that change the style of output within +\fBcurses\fR. All options are initially \fBFALSE\fR, unless otherwise stated. +It is not necessary to turn these options off before calling \fBendwin\fR. + +If \fBclearok\fR is called with \fBTRUE\fR as argument, the next +call to \fBwrefresh\fR with this window will clear the screen completely and +redraw the entire screen from scratch. This is useful when the contents of the +screen are uncertain, or in some cases for a more pleasing visual effect. If +the \fIwin\fR argument to \fBclearok\fR is the global variable \fBcurscr\fR, +the next call to \fBwrefresh\fR with any window causes the screen to be cleared +and repainted from scratch. + +If \fBidlok\fR is called with \fBTRUE\fR as argument, +\fBcurses\fR considers using the hardware insert/delete line feature of +terminals so equipped. If disabled (\fIbf\fR is \fBFALSE\fR), \fBcurses\fR +very seldom uses this feature. (The insert/delete character feature is always +considered.) This option should be enabled only if the application needs +insert/delete line, for example, for a screen editor. It is disabled by +default because insert/delete line tends to be visually annoying when used in +applications where it isn't really needed. If insert/delete line cannot be +used, \fBcurses\fR redraws the changed portions of all lines. + +If \fBidcok\fR is called with \fBTRUE\fR as argument, +\fBcurses\fR considers using the hardware insert/delete character feature of +terminals so equipped. This is enabled by default. + +If \fBimmedok\fR is called with \fBTRUE as argument\fR, any change +in the window image, such as the ones caused by \fBwaddch, wclrtobot, wscrl\fR, +\fIetc\fR., automatically cause a call to \fBwrefresh\fR. However, it may +degrade the performance considerably, due to repeated calls to \fBwrefresh\fR. +It is disabled by default. + +Normally, the hardware cursor is left at the location of the window cursor +being refreshed. The \fBleaveok\fR option allows the cursor to be left +wherever the update happens to leave it. It is useful for applications where +the cursor is not used, since it reduces the need for cursor motions. If +possible, the cursor is made invisible when this option is enabled. + +The \fBsetscrreg\fR and \fBwsetscrreg\fR routines allow the application +programmer to set a software scrolling region in a window. \fItop\fR and +\fIbot\fR are the line numbers of the top and bottom margin of the scrolling +region. (Line 0 is the top line of the window.) If this option and +\fBscrollok\fR are enabled, an attempt to move off the bottom margin line +causes all lines in the scrolling region to scroll one line in the direction +of the first line. Only the text of the window is scrolled. (Note that this +has nothing to do with the use of a physical scrolling region capability in the +terminal, like that in the VT100. If \fBidlok\fR is enabled and the terminal +has either a scrolling region or insert/delete line capability, they will +probably be used by the output routines.) + +The \fBscrollok\fR option controls what happens when the cursor of a window is +moved off the edge of the window or scrolling region, either as a result of a +newline action on the bottom line, or typing the last character of the last +line. If disabled, (\fIbf\fR is \fBFALSE\fR), the cursor is left on the bottom +line. If enabled, (\fIbf\fR is \fBTRUE\fR), the window is scrolled up one line +(Note that in order to get the physical scrolling effect on the terminal, it is +also necessary to call \fBidlok\fR). + +The \fBnl\fR and \fBnonl\fR routines control whether the underlying display +device translates the return key into newline on input, and whether it +translates newline into return and line-feed on output (in either case, the +call \fBaddch('\n')\fR does the equivalent of return and line feed on the +virtual screen). Initially, these translations do occur. If you disable them +using \fBnonl\fR, \fBcurses\fR will be able to make better use of the line-feed +capability, resulting in faster cursor motion. Also, \fBcurses\fR will then be +able to detect the return key. +.SH RETURN VALUE +The functions \fBsetscrreg\fR and \fBwsetscrreg\fR return \fBOK\fR upon success +and \fBERR\fR upon failure. All other routines that return an integer always +return \fBOK\fR. +.SH PORTABILITY +These functions are described in the XSI Curses standard, Issue 4. + +The XSI Curses standard is ambiguous on the question of whether \fBraw\fR() +should disable the CRLF translations controlled by \fBnl\fR() and \fBnonl\fR(). +BSD curses did turn off these translations; AT&T curses (at least as late as +SVr1) did not. We choose to do so, on the theory that a programmer requesting +raw input wants a clean (ideally 8-bit clean) connection that the operating +system does not mess with. + +Some historic curses implementations had, as an undocumented feature, the +ability to do the equivalent of \fBclearok(..., 1)\fR by saying +\fBtouchwin(stdscr)\fR or \fBclear(stdscr)\fR. This will not work under +curses. + +Earlier System V curses implementations specified that with \fBscrollok\fR +enabled, any window modification triggering a scroll also forced a physical +refresh. XSI Curses does not require this, and \fBcurses\fR avoids doing +it in order to perform better vertical-motion optimization at \fBwrefresh\fR +time. +.SH NOTES +Note that \fBclearok\fR, \fBleaveok\fR, \fBscrollok\fR, \fBidcok\fR, \fBnl\fR, +\fBnonl\fR and \fBsetscrreg\fR may be macros. + +The \fBimmedok\fR routine is useful for windows that are used as terminal +emulators. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_addch\fR(3X), \fBcurs_clear\fR(3X), +\fBcurs_initscr\fR(3X), \fBcurs_scroll\fR(3X), \fBcurs_refresh\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_overlay.3 b/lib/libcurses/curs_overlay.3 new file mode 100644 index 00000000000..0c7b93df37f --- /dev/null +++ b/lib/libcurses/curs_overlay.3 @@ -0,0 +1,46 @@ +.TH curs_overlay 3X "" +.SH NAME +\fBoverlay\fR, \fBoverwrite\fR, \fBcopywin\fR - overlay and +manipulate overlapped \fBcurses\fR windows +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint overlay(const WINDOW *srcwin, WINDOW *dstwin);\fR +.br +\fBint overwrite(const WINDOW *srcwin, WINDOW *dstwin);\fR +.br +\fBint copywin(WINDOW *srcwin, WINDOW *dstwin, int sminrow, + int smincol, int dminrow, int dmincol, int dmaxrow, + int dmaxcol, int overlay);\fR +.SH DESCRIPTION +The \fBoverlay\fR and \fBoverwrite\fR routines overlay \fIsrcwin\fR on +top of \fIdstwin\fR. \fIscrwin\fR and \fIdstwin\fR are not required +to be the same size; only text where the two windows overlap is +copied. The difference is that \fBoverlay\fR is non-destructive +(blanks are not copied) whereas \fBoverwrite\fR is destructive. + +The \fBcopywin\fR routine provides a finer granularity of control over the +\fBoverlay\fR and \fBoverwrite\fR routines. Like in the \fBprefresh\fR +routine, a rectangle is specified in the destination window, (\fIdminrow\fR, +\fIdmincol\fR) and (\fIdmaxrow\fR, \fIdmaxcol\fR), and the upper-left-corner +coordinates of the source window, (\fIsminrow\fR, \fIsmincol\fR). If the +argument \fIoverlay\fR is \fBtrue\fR, then copying is non-destructive, as in +\fBoverlay\fR. +.SH RETURN VALUE +Routines that return an integer return \fBERR\fR upon failure, and \fBOK\fR +(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful +completion. +.SH NOTES +Note that \fBoverlay\fR and \fBoverwrite\fR may be macros. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions (adding the const +qualifiers). It further specifies their behavior in the presence of characters +with multi-byte renditions (not yet supported in this implementation). +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_pad\fR(3X), \fBcurs_refresh\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_pad.3 b/lib/libcurses/curs_pad.3 new file mode 100644 index 00000000000..18969c94e3e --- /dev/null +++ b/lib/libcurses/curs_pad.3 @@ -0,0 +1,82 @@ +.TH curs_pad 3X "" +.SH NAME +\fBnewpad\fR, \fBsubpad\fR, \fBprefresh\fR, +\fBpnoutrefresh\fR, \fBpechochar\fR - create and display \fBcurses\fR +pads +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBWINDOW *newpad(int nlines, int ncols);\fR +.br +\fBWINDOW *subpad(WINDOW *orig, int nlines, int ncols, + int begin_y, int begin_x);\fR +.br +\fBint prefresh(WINDOW *pad, int pminrow, int pmincol, + int sminrow, int smincol, int smaxrow, int smaxcol);\fR +.br +\fBint pnoutrefresh(WINDOW *pad, int pminrow, int pmincol, + int sminrow, int smincol, int smaxrow, int smaxcol);\fR +.br +\fBint pechochar(WINDOW *pad, chtype ch);\fR +.SH DESCRIPTION +The \fBnewpad\fR routine creates and returns a pointer to a new pad data +structure with the given number of lines, \fInlines\fR, and columns, +\fIncols\fR. A pad is like a window, except that it is not restricted by the +screen size, and is not necessarily associated with a particular part of the +screen. Pads can be used when a large window is needed, and only a part of the +window will be on the screen at one time. Automatic refreshes of pads +(\fIe\fR.\fIg\fR., from scrolling or echoing of input) do not occur. It is not +legal to call \fBwrefresh\fR with a \fIpad\fR as an argument; the routines +\fBprefresh\fR or \fBpnoutrefresh\fR should be called instead. Note that these +routines require additional parameters to specify the part of the pad to be +displayed and the location on the screen to be used for the display. + +The \fBsubpad\fR routine creates and returns a pointer to a subwindow within a +pad with the given number of lines, \fInlines\fR, and columns, \fIncols\fR. +Unlike \fBsubwin\fR, which uses screen coordinates, the window is at position +(\fIbegin\fR_\fIx\fR\fB,\fR \fIbegin\fR_\fIy\fR) on the pad. The window is +made in the middle of the window \fIorig\fR, so that changes made to one window +affect both windows. During the use of this routine, it will often be +necessary to call \fBtouchwin\fR or \fBtouchline\fR on \fIorig\fR before +calling \fBprefresh\fR. + +The \fBprefresh\fR and \fBpnoutrefresh\fR routines are analogous to +\fBwrefresh\fR and \fBwnoutrefresh\fR except that they relate to pads instead +of windows. The additional parameters are needed to indicate what part of the +pad and screen are involved. \fIpminrow\fR and \fIpmincol\fR specify the upper +left-hand corner of the rectangle to be displayed in the pad. \fIsminrow\fR, +\fIsmincol\fR, \fIsmaxrow\fR, and \fIsmaxcol\fR specify the edges of the +rectangle to be displayed on the screen. The lower right-hand corner of the +rectangle to be displayed in the pad is calculated from the screen coordinates, +since the rectangles must be the same size. Both rectangles must be entirely +contained within their respective structures. Negative values of +\fIpminrow\fR, \fIpmincol\fR, \fIsminrow\fR, or \fIsmincol\fR are treated as if +they were zero. + +The \fBpechochar\fR routine is functionally equivalent to a call to \fBaddch\fR +followed by a call to \fBrefresh\fR, a call to \fBwaddch\fR followed by a call +to \fBwrefresh\fR, or a call to \fBwaddch\fR followed by a call to +\fBprefresh.\fR The knowledge that only a single character is being output is +taken into consideration and, for non-control characters, a considerable +performance gain might be seen by using these routines instead of their +equivalents. In the case of \fBpechochar\fR, the last location of the pad on +the screen is reused for the arguments to \fBprefresh\fR. +.SH RETURN VALUE +Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR +(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful +completion. + +Routines that return pointers return \fBNULL\fR on error, and set \fBerrno\fR +to \fBENOMEM\fR. +.SH NOTES +Note that \fBpechochar\fR may be a macro. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_refresh\fR(3X), \fBcurs_touch\fR(3X), \fBcurs_addch\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_printw.3 b/lib/libcurses/curs_printw.3 new file mode 100644 index 00000000000..c6db4c099ce --- /dev/null +++ b/lib/libcurses/curs_printw.3 @@ -0,0 +1,47 @@ +.TH curs_printw 3X "" +.SH NAME +\fBprintw\fR, \fBwprintw\fR, \fBmvprintw\fR, +\fBmvwprintw\fR, \fBvwprintw\fR - print formatted output in +\fBcurses\fR windows +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint printw(char *fmt\fR [\fB, arg\fR] \fB...);\fR +.br +\fBint wprintw(WINDOW *win, char *fmt\fR [\fB, arg\fR] \fB...);\fR +.br +\fBint mvprintw(int y, int x, char *fmt\fR [\fB, arg\fR] \fB...);\fR +.br +\fBint mvwprintw(WINDOW *win, int y, int x, + \fBchar *fmt\fR [\fB, arg]\fR ...); + +\fB#include <varargs.h>\fR +.br +\fBint vwprintw(WINDOW *win, char *fmt, varglist);\fR +.br +.SH DESCRIPTION +The \fBprintw\fR, \fBwprintw\fR, \fBmvprintw\fR and \fBmvwprintw\fR +routines are analogous to \fBprintf\fR [see \fBprintf\fR(3S)]. In +effect, the string that would be output by \fBprintf\fR is output +instead as though \fBwaddstr\fR were used on the given window. + +The \fBvwprintw\fR routine is analogous to \fBvprintf\fR [see +\fBprintf\fR(3S)] and performs a \fBwprintw\fR using a variable +argument list. The third argument is a \fBva_list\fR, a pointer to a +list of arguments, as defined in \fB<varargs.h>\fR. +.SH RETURN VALUE +Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR +(SVr4 onlyspecifies "an integer value other than \fBERR\fR") upon successful +completion. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. The function +\fBvwprintw\fR is marked TO BE WITHDRAWN, and is to be replaced by a function +\fBvw_printw\fR using the \fB<stdarg.h>\fR interface. +.SH SEE ALSO +\fBcurses\fR(3X), \fBprintf\fR(3S), \fBvprintf(3S)\fR +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_refresh.3 b/lib/libcurses/curs_refresh.3 new file mode 100644 index 00000000000..77bae2eeb90 --- /dev/null +++ b/lib/libcurses/curs_refresh.3 @@ -0,0 +1,84 @@ +.TH curs_refresh 3X "" +.SH NAME +\fBrefresh\fR, \fBwrefresh\fR, \fBwnoutrefresh\fR, +\fBdoupdate\fR, \fBredrawwin\fR, \fBwredrawln\fR - refresh +\fBcurses\fR windows and lines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint refresh(void);\fR +.br +\fBint wrefresh(WINDOW *win);\fR +.br +\fBint wnoutrefresh(WINDOW *win);\fR +.br +\fBint doupdate(void);\fR +.br +\fBint redrawwin(WINDOW *win);\fR +.br +\fBint wredrawln(WINDOW *win, int beg_line, int num_lines);\fR +.br +.SH DESCRIPTION +The \fBrefresh\fR and \fBwrefresh\fR routines (or \fBwnoutrefresh\fR and +\fBdoupdate\fR) must be called to get actual output to the terminal, as other +routines merely manipulate data structures. The routine \fBwrefresh\fR copies +the named window to the physical terminal screen, taking into account what is +already there in order to do optimizations. The \fBrefresh\fR routine is the +same, using \fBstdscr\fR as the default window. Unless \fBleaveok\fR has been +enabled, the physical cursor of the terminal is left at the location of the +cursor for that window. + +The \fBwnoutrefresh\fR and \fBdoupdate\fR routines allow multiple updates with +more efficiency than \fBwrefresh\fR alone. In addition to all the window +structures, \fBcurses\fR keeps two data structures representing the terminal +screen: a physical screen, describing what is actually on the screen, and a +virtual screen, describing what the programmer wants to have on the screen. + +The routine \fBwrefresh\fR works by first calling \fBwnoutrefresh\fR, which +copies the named window to the virtual screen, and then calling \fBdoupdate\fR, +which compares the virtual screen to the physical screen and does the actual +update. If the programmer wishes to output several windows at once, a series +of calls to \fBwrefresh\fR results in alternating calls to \fBwnoutrefresh\fR +and \fBdoupdate\fR, causing several bursts of output to the screen. By first +calling \fBwnoutrefresh\fR for each window, it is then possible to call +\fBdoupdate\fR once, resulting in only one burst of output, with fewer total +characters transmitted and less CPU time used. If the \fIwin\fR argument to +\fBwrefresh\fR is the global variable \fBcurscr\fR, the screen is immediately +cleared and repainted from scratch. + +The phrase "copies the named window to the virtual screen" above is ambiguous. +What actually happens is that all \fItouched\fR (changed) lines in the window +are copied to the virtual screen. This affects programs that use overlapping +windows; it means that if two windows overlap, you can refresh them in either +order and the overlap region will be modified only when it is explicitly +changed. (But see the section on \fBPORTABILITY\fR below for a warning about +exploiting this behavior.) + +The \fBwredrawln\fR routine indicates to \fBcurses\fR that some screen lines +are corrupted and should be thrown away before anything is written over them +it touches the indicated lines (marking them changed) then does a refresh +of the window. The routine \fBredrawwin\fR() touches the entire window and then +refreshes it. +.SH RETURN VALUE +Routines that return an integer return \fBERR\fR upon failure, and \fBOK\fR +(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful +completion. +.SH NOTES +Note that \fBrefresh\fR and \fBredrawwin\fR may be macros. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. + +Whether \fBwnoutrefresh()\fR copies to the virtual screen the entire contents +of a window or just its changed portions has never been well-documented in +historic curses versions (including SVr4). It might be unwise to rely on +either behavior in programs that might have to be linked with other curses +implementations. Instead, you can do an explicit \fBtouchwin()\fR before the +\fBwnoutrefresh()\fR call to guarantee an entire-contents copy anywhere. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_outopts\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_scanw.3 b/lib/libcurses/curs_scanw.3 new file mode 100644 index 00000000000..6ce1c0d2f84 --- /dev/null +++ b/lib/libcurses/curs_scanw.3 @@ -0,0 +1,48 @@ +.TH curs_scanw 3X "" +.SH NAME +\fBscanw\fR, \fBwscanw\fR, \fBmvscanw\fR, +\fBmvwscanw\fR, \fBvwscanw\fR - convert formatted input from a +\fBcurses\fR widow +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint scanw(char *fmt\fR [\fB, arg\fR] \fB...);\fR +.br +\fBint wscanw(WINDOW *win, char *fmt\fR [\fB, arg\fR] \fB...);\fR +.br +\fBint mvscanw(int y, int x, char *fmt\fR [\fB, arg\fR] \fB...);\fR +.br +\fBint mvwscanw(WINDOW *win, int y, int x, + char *fmt\fR [\fB, arg]\fR \fB...);\fR +.br +\fBint vwscanw(WINDOW *win, char *fmt, va_list varglist);\fR +.SH DESCRIPTION +The \fBscanw\fR, \fBwscanw\fR and \fBmvscanw\fR routines are analogous to +\fBscanf\fR [see \fBscanf\fR(3S)]. The effect of these routines is as though +\fBwgetstr\fR were called on the window, and the resulting line used as input +for \fBsscanf\fR(3). Fields which do not map to a variable in the \fIfmt\fR +field are lost. + +The \fBvwscanw\fR routine is similar to \fBvwprintw\fR in that it performs a +\fBwscanw\fR using a variable argument list. The third argument is a +\fIva\fR_\fIlist\fR, a pointer to a list of arguments, as defined in +\fB<varargs.h>\fR. +.SH RETURN VALUE +\fBvwscanw\fR returns \fBERR\fR on failure and an integer equal to the +number of fields scanned on success. + +Applications may use the return value from the \fBscanw\fR, \fBwscanw\fR, +\fBmvscanw\fR and \fBmvwscanw\fR routines to determine the number of fields +which were mapped in the call. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. The function +\fBvwscanw\fR is marked TO BE WITHDRAWN, and is to be replaced by a function +\fBvw_scanw\fR using the \fB<stdarg.h>\fR interface. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_getstr\fR, \fBcurs_printw\fR, \fBscanf\fR(3S) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_scr_dmp.3 b/lib/libcurses/curs_scr_dmp.3 new file mode 100644 index 00000000000..c1b89f12059 --- /dev/null +++ b/lib/libcurses/curs_scr_dmp.3 @@ -0,0 +1,64 @@ +.TH curs_scr_dump 3X "" +.SH NAME +\fBscr_dump\fR, \fBscr_restore\fR, +\fBscr_init\fR, \fBscr_set\fR - read (write) a \fBcurses\fR screen +from (to) a file +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint scr_dump(const char *filename);\fR +.br +\fBint scr_restore(const char *filename);\fR +.br +\fBint scr_init(const char *filename);\fR +.br +\fBint scr_set(const char *filename);\fR +.br +.SH DESCRIPTION +The \fBscr_dump\fR routine dumps the current contents of the virtual screen +to the file \fIfilename\fR. + +The \fBscr_restore\fR routine sets the virtual screen to the contents +of \fIfilename\fR, which must have been written using \fBscr_dump\fR. The next +call to \fBdoupdate\fR restores the screen to the way it looked in the dump +file. + +The \fBscr_init\fR routine reads in the contents of \fIfilename\fR and uses +them to initialize the \fBcurses\fR data structures about what the terminal +currently has on its screen. If the data is determined to be valid, +\fBcurses\fR bases its next update of the screen on this information rather +than clearing the screen and starting from scratch. \fBscr_init\fR is used +after \fBinitscr\fR or a \fBsystem\fR [see \fBsystem\fR(BA_LIB)] call to share +the screen with another process which has done a \fBscr_dump\fR after its +\fBendwin\fR call. The data is declared invalid if the terminfo capabilities +\fBrmcup\fR and \fBnrrmc\fR exist; also if the terminal has been written to +since the preceding \fBscr_dump\fR call. + +The \fBscr_set\fR routine is a combination of \fBscr_restore\fR and +\fBscr_init\fR. It tells the program that the information in \fIfilename\fR is +what is currently on the screen, and also what the program wants on the screen. +This can be thought of as a screen inheritance function. + +To read (write) a window from (to) a file, use the \fBgetwin\fR and +\fBputwin\fR routines [see \fBcurs_util\fR(3X)]. +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and \fBOK\fR +upon success. +.SH NOTES +Note that \fBscr_init\fR, \fBscr_set\fR, and \fBscr_restore\fR may be macros. +.SH PORTABILITY +The XSI Curses standard, Issue 4, describes these functions (adding the const +qualifiers). + +The SVr4 docs merely say under \fBscr_init\fR that the dump data is also +considered invalid "if the time-stamp of the tty is old" but don't define +"old". +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_refresh\fR(3X), +\fBcurs_util\fR(3X), \fBsystem\fR(3S) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_scroll.3 b/lib/libcurses/curs_scroll.3 new file mode 100644 index 00000000000..0ac518d5b25 --- /dev/null +++ b/lib/libcurses/curs_scroll.3 @@ -0,0 +1,49 @@ +.TH curs_scroll 3X "" +.SH NAME +\fBscroll\fR, \fBsrcl\fR, \fBwscrl\fR - scroll a \fBcurses\fR window +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint scroll(WINDOW *win);\fR +.br +\fBint scrl(int n);\fR +.br +\fBint wscrl(WINDOW *win, int n);\fR +.br +.SH DESCRIPTION +The \fBscroll\fR routine scrolls the window up one line. This involves moving +the lines in the window data structure. As an optimization, if the scrolling +region of the window is the entire screen, the physical screen may be scrolled +at the same time. + +For positive \fIn\fR, the \fBscrl\fR and \fBwscrl\fR routines scroll the +window up \fIn\fR lines (line \fIi\fR+\fIn\fR becomes \fIi\fR); otherwise +scroll the window down \fIn\fR lines. This involves moving the lines in the +window character image structure. The current cursor position is not changed. + +For these functions to work, scrolling must be enabled via \fBscrollok\fR. +.SH RETURN VALUE +These routines return \fBERR\fR upon failure, and \fBOK\fR (SVr4 only specifies +"an integer value other than \fBERR\fR") upon successful completion. +.SH NOTES +Note that \fBscrl\fR and \fBscroll\fR may be macros. + +The SVr4 documentation says that the optimization of physically scrolling +immediately if the scroll region is the entire screen "is" performed, not +"may be" performed. This implementation deliberately does not guarantee +that this will occur, in order to leave open the possibility of smarter +optimization of multiple scroll actions on the next update. + +Neither the SVr4 documentation specifies whether the current attribute or +current color-pair of blanks generated by the scroll function is zeroed. +Under this implementation it is. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_outopts\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_slk.3 b/lib/libcurses/curs_slk.3 new file mode 100644 index 00000000000..e735b9f2666 --- /dev/null +++ b/lib/libcurses/curs_slk.3 @@ -0,0 +1,91 @@ +.TH curs_slk 3X "" +.SH NAME +\fBslk_init\fR, \fBslk_set\fR, \fBslk_refresh\fR, +\fBslk_noutrefresh\fR, \fBslk_label\fR, \fBslk_clear\fR, \fBslk_restore\fR, +\fBslk_touch\fR, \fBslk_attron\fR, \fBslk_attrset\fR, \fBslk_attroff\fR - +\fBcurses\fR soft label routines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint slk_init(int fmt);\fR +.br +\fBint slk_set(int labnum, const char *label, int fmt);\fR +.br +\fBint slk_refresh(void);\fR +.br +\fBint slk_noutrefresh(void);\fR +.br +\fBchar *slk_label(int labnum);\fR +.br +\fBint slk_clear(void);\fR +.br +\fBint slk_restore(void);\fR +.br +\fBint slk_touch(void);\fR +.br +\fBint slk_attron(attr_t attrs);\fR +.br +\fBint slk_attrset(attr_t attrs);\fR +.br +\fBint slk_attroff(attr_t attrs);\fR +.br +.SH DESCRIPTION +The slk* functions manipulate the set of soft function-key labels that exist on +many terminals. For those terminals that do not have soft labels, +\fBcurses\fR takes over the bottom line of \fBstdscr\fR, reducing the size of +\fBstdscr\fR and the variable \fBLINES\fR. \fBcurses\fR standardizes on eight +labels of up to eight characters each. + +The \fBslk_init\fR routine must be called before \fBinitscr\fR or \fBnewterm\fR +is called. If \fBinitscr\fR eventually uses a line from \fBstdscr\fR to +emulate the soft labels, then \fIfmt\fR determines how the labels are arranged +on the screen. Setting \fIfmt\fR to \fB0\fR indicates a 3-2-3 arrangement of +the labels; \fB1\fR indicates a 4-4 arrangement. + +The \fBslk_set\fR routine requires \fIlabnum\fR to be a label number, +from \fB1\fR to \fB8\fR; \fIlabel\fR must be the string to be put on the +label, up to eight characters in length. A null string or a null +pointer sets up a blank label. \fIfmt\fR is either \fB0\fR, \fB1\fR, +or \fB2\fR, indicating whether the label is to be left-justified, +centered, or right-justified, respectively, within the label. + +The \fBslk_refresh\fR and \fBslk_noutrefresh\fR routines correspond to +the \fBwrefresh\fR and \fBwnoutrefresh\fR routines. + +The \fBslk_label\fR routine returns the current label for label number +\fIlabnum\fR, with leading and trailing blanks stripped. + +The \fBslk_clear\fR routine clears the soft labels from the screen. + +The \fBslk_restore\fR routine, restores the soft labels to the screen +after a \fBslk_clear\fR has been performed. + +The \fBslk_touch\fR routine forces all the soft labels to be output +the next time a \fBslk_noutrefresh\fR is performed. + +The \fBslk_attron\fR, \fBslk_attrset\fR and \fBslk_attroff\fR routines +correspond to \fBattron\fR, \fBattrset\fR, and \fBattroff\fR. They +have an effect only if soft labels are simulated on the bottom line of +the screen. The default highlight for soft keys is A_STANDOUT (as in +System V curses, which does not document this fact). +.SH RETURN VALUE +These routines return \fBERR\fR upon failure and OK (SVr4 specifies only "an +integer value other than \fBERR\fR") upon successful completion. + +\fBslk_label\fR returns \fBNULL\fR on error. +.SH NOTES +Most applications would use \fBslk_noutrefresh\fR because a +\fBwrefresh\fR is likely to follow soon. +.SH PORTABILITY +The XSI Curses standard, Issue 4, describes these functions. It changes the +argument type of the attribute-manipulation functions \fBslk_attron\fR, +\fBslk_attroff\fR, \fBslk_attrset\fR to be \fBattr_t\fR, and adds \fBconst\fR +qualifiers. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_attr\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_refresh\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_termattrs.3 b/lib/libcurses/curs_termattrs.3 new file mode 100644 index 00000000000..5c65d3c573e --- /dev/null +++ b/lib/libcurses/curs_termattrs.3 @@ -0,0 +1,78 @@ +.TH curs_termattrs 3X "" +.SH NAME +\fBbaudrate\fR, \fBerasechar\fR, \fBhas_ic\fR, +\fBhas_il\fR, \fBkillchar\fR, \fBlongname\fR, \fBtermattrs\fR, +\fBtermname\fR - \fBcurses\fR environment query routines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBint baudrate(void);\fR +.br +\fBchar erasechar(void);\fR +.br +\fBint has_ic(void);\fR +.br +\fBint has_il(void);\fR +.br +\fBchar killchar(void);\fR +.br +\fBchar *longname(void);\fR +.br +\fBattr_t termattrs(void);\fR +.br +\fBchar *termname(void);\fR +.br +.SH DESCRIPTION +The \fBbaudrate\fR routine returns the output speed of the terminal. The +number returned is in bits per second, for example \fB9600\fR, and is an +integer. + +The \fBerasechar\fR routine returns the user's current erase character. + +The \fBhas_ic\fR routine is true if the terminal has insert- and delete- +character capabilities. + +The \fBhas_il\fR routine is true if the terminal has insert- and delete-line +capabilities, or can simulate them using scrolling regions. This might +be used to determine if it would be appropriate to turn on physical +scrolling using \fBscrollok\fR. + +The \fBkillchar\fR routine returns the user's current line kill character. + +The \fBlongname\fR routine returns a pointer to a static area +containing a verbose description of the current terminal. The maximum +length of a verbose description is 128 characters. It is defined only +after the call to \fBinitscr\fR or \fBnewterm\fR. The area is +overwritten by each call to \fBnewterm\fR and is not restored by +\fBset_term\fR, so the value should be saved between calls to +\fBnewterm\fR if \fBlongname\fR is going to be used with multiple +terminals. + +If a given terminal doesn't support a video attribute that an +application program is trying to use, \fBcurses\fR may substitute a +different video attribute for it. The \fBtermattrs\fR function +returns a logical \fBOR\fR of all video attributes supported by the +terminal. This information is useful when a \fBcurses\fR program +needs complete control over the appearance of the screen. + +The \fBtermname\fR routine returns the value of the environmental +variable \fBTERM\fR (truncated to 14 characters). +.SH RETURN VALUE +\fBlongname\fR and \fBtermname\fR return \fBNULL\fR on error. + +Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR +(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful +completion. +.SH NOTES +Note that \fBtermattrs\fR may be a macro. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. It changes the +return type of \fBtermattrs\fR to the new type \fBattr_t\fR. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_outopts\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_touch.3 b/lib/libcurses/curs_touch.3 new file mode 100644 index 00000000000..961ccbe66da --- /dev/null +++ b/lib/libcurses/curs_touch.3 @@ -0,0 +1,64 @@ +.TH curs_touch 3X "" +.SH NAME +\fBtouchwin\fR, \fBtouchline\fR, \fBuntouchwin\fR, +\fBwtouchln\fR, \fBis_linetouched\fR, \fBis_wintouched\fR - +\fBcurses\fR refresh control routines +.SH SYNOPSIS +\fB#include <curses.h>\fR +.br +\fBint touchwin(WINDOW *win);\fR +.br +\fBint touchline(WINDOW *win, int start, int count);\fR +.br +\fBint untouchwin(WINDOW *win);\fR +.br +\fBint wtouchln(WINDOW *win, int y, int n, int changed);\fR +.br +\fBint is_linetouched(WINDOW *win, int line);\fR +.br +\fBint is_wintouched(WINDOW *win);\fR +.br +.SH DESCRIPTION +The \fBtouchwin\fR and \fBtouchline\fR routines throw away all +optimization information about which parts of the window have been +touched, by pretending that the entire window has been drawn on. This +is sometimes necessary when using overlapping windows, since a change +to one window affects the other window, but the records of which lines +have been changed in the other window do not reflect the change. The +routine \fBtouchline\fR only pretends that \fIcount\fR lines have been +changed, beginning with line \fIstart\fR. + +The \fBuntouchwin\fR routine marks all lines in the window as unchanged since +the last call to \fBwrefresh\fR. + +The \fBwtouchln\fR routine makes \fIn\fR lines in the window, starting +at line \fIy\fR, look as if they have (\fIchanged\fR\fB=1\fR) or have +not (\fIchanged\fR\fB=0\fR) been changed since the last call to +\fBwrefresh\fR. + +The \fBis_linetouched\fR and \fBis_wintouched\fR routines return +\fBTRUE\fR if the specified line/window was modified since the last +call to \fBwrefresh\fR; otherwise they return \fBFALSE\fR. In +addition, \fBis_linetouched\fR returns \fBERR\fR if \fIline\fR is not +valid for the given window. +.SH RETURN VALUE +All routines return the integer \fBERR\fR upon failure and an integer value +other than \fBERR\fR upon successful completion, unless otherwise noted in the +preceding routine descriptions. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. + +Some historic curses implementations had, as an undocumented feature, the +ability to do the equivalent of \fBclearok(..., 1)\fR by saying +\fBtouchwin(stdscr)\fR or \fBclear(stdscr)\fR. This will not work under +curses. +.SH NOTES +Note that all routines except \fBwtouchln\fR may be macros. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_refresh\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_util.3 b/lib/libcurses/curs_util.3 new file mode 100644 index 00000000000..0d2e0b88b74 --- /dev/null +++ b/lib/libcurses/curs_util.3 @@ -0,0 +1,85 @@ +.TH curs_util 3X "" +.SH NAME +\fBunctrl\fR, \fBkeyname\fR, \fBfilter\fR, +\fBuse_env\fR, \fBputwin\fR, \fBgetwin\fR, \fBdelay_output\fR, +\fBflushinp\fR - miscellaneous \fBcurses\fR utility routines +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBchar *unctrl(chtype c);\fR +.br +\fBchar *keyname(int c);\fR +.br +\fBvoid filter(void);\fR +.br +\fBvoid use_env(char bool);\fR +.br +\fBint putwin(WINDOW *win, FILE *filep);\fR +.br +\fBWINDOW *getwin(FILE *filep);\fR +.br +\fBint delay_output(int ms);\fR +.br +\fBint flushinp(void);\fR +.br +.SH DESCRIPTION +The \fBunctrl\fR macro expands to a character string which is a printable +representation of the character \fIc\fR. Control characters are displayed in +the \fB^\fR\fIX\fR notation. Printing characters are displayed as is. + +The \fBkeyname\fR routine returns a character string corresponding to +the key \fIc\fR. + +The \fBfilter\fR routine, if used, must be called before \fBinitscr\fR or +\fBnewterm\fR are called. The effect is that, during those calls, \fBLINES\fR +is set to 1; the capabilities \fBclear\fR, \fBcup\fR, \fBcud\fR, \fBcud1\fR, +\fBcuu1\fR, \fBcuu\fR, \fBvpa\fR are disabled; and the \fBhome\fR string is +set to the value of \fBcr\fR. + +The \fBuse_env\fR routine, if used, is called before \fBinitscr\fR or +\fBnewterm\fR are called. When called with \fBFALSE\fR as an +argument, the values of \fBlines\fR and \fBcolumns\fR specified in the +\fIterminfo\fR database will be used, even if environment variables +\fBLINES\fR and \fBCOLUMNS\fR (used by default) are set, or if +\fBcurses\fR is running in a window (in which case default behavior +would be to use the window size if \fBLINES\fR and \fBCOLUMNS\fR are +not set). + +The \fBputwin\fR routine writes all data associated with window \fIwin\fR into +the file to which \fIfilep\fR points. This information can be later retrieved +using the \fBgetwin\fR function. + +The \fBgetwin\fR routine reads window related data stored in the file by +\fBputwin\fR. The routine then creates and initializes a new window using that +data. It returns a pointer to the new window. + +The \fBdelay_output\fR routine inserts an \fIms\fR millisecond pause +in output. This routine should not be used extensively because +padding characters are used rather than a CPU pause. + +The \fBflushinp\fR routine throws away any typeahead that has been typed by the +user and has not yet been read by the program. +.SH RETURN VALUE +Except for \fBflushinp\fR, routines that return an integer return \fBERR\fR +upon failure and \fBOK\fR (SVr4 specifies only "an integer value other than +\fBERR\fR") upon successful completion. + +\fBflushinp\fR always returns \fBOK\fR. + +Routines that return pointers return \fBNULL\fR on error. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. + +The SVr4 documentation describes the action of \fBfilter\fR only in the vaguest +terms. The description here is adapted from the XSI Curses standard (which +erroneously fails to describe the disabling of \fBcuu\fR). +.SH NOTES +Note that \fBunctrl\fR is a macro, which is defined in <\fBunctrl.h\fR>. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_scr_dump\fR(3X). +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curs_window.3 b/lib/libcurses/curs_window.3 new file mode 100644 index 00000000000..9bd3facd818 --- /dev/null +++ b/lib/libcurses/curs_window.3 @@ -0,0 +1,123 @@ +.TH curs_window 3X "" +.SH NAME +\fBnewwin\fR, \fBdelwin\fR, \fBmvwin\fR, +\fBsubwin\fR, \fBderwin\fR, \fBmvderwin\fR, \fBdupwin\fR, +\fBwsyncup\fR, \fBsyncok\fR, \fBwcursyncup\fR, \fBwsyncdown\fR - +create \fBcurses\fR windows +.SH SYNOPSIS +\fB#include <curses.h>\fR + +\fBWINDOW *newwin(int nlines, int ncols, int begin_y,\fR + \fBintbegin_x);\fR +.br +\fBint delwin(WINDOW *win);\fR +.br +\fBint mvwin(WINDOW *win, int y, int x);\fR +.br +\fBWINDOW *subwin(WINDOW *orig, int nlines, int ncols, + int begin_y, int begin_x);\fR +.br +\fBWINDOW *derwin(WINDOW *orig, int nlines, int ncols, + int begin_y, int begin_x);\fR +.br +\fBint mvderwin(WINDOW *win, int par_y, int par_x);\fR +.br +\fBWINDOW *dupwin(WINDOW *win);\fR +.br +\fBvoid wsyncup(WINDOW *win);\fR +.br +\fBint syncok(WINDOW *win, bool bf);\fR +.br +\fBvoid wcursyncup(WINDOW *win);\fR +.br +\fBvoid wsyncdown(WINDOW *win);\fR +.br +.SH DESCRIPTION +Calling \fBnewwin\fR creates and returns a pointer to a new window with the +given number of lines and columns. The upper left-hand corner of the window is +at line \fIbegin\fR_\fIy\fR, column \fIbegin\fR_\fIx\fR. If either +\fInlines\fR or \fIncols\fR is zero, they default to \fBLINES -\fR +\fIbegin\fR_\fIy\fR and \fBCOLS -\fR \fIbegin\fR_\fIx\fR. A new full-screen +window is created by calling \fBnewwin(0,0,0,0)\fR. + +Calling \fBdelwin\fR deletes the named window, freeing all memory +associated with it (it does not actually erase the window's screen +image). Subwindows must be deleted before the main window can be +deleted. + +Calling \fBmvwin\fR moves the window so that the upper left-hand +corner is at position (\fIx\fR, \fIy\fR). If the move would cause the +window to be off the screen, it is an error and the window is not +moved. Moving subwindows is allowed, but should be avoided. + +Calling \fBsubwin\fR creates and returns a pointer to a new window +with the given number of lines, \fInlines\fR, and columns, +\fIncols\fR. The window is at position (\fIbegin\fR_\fIy\fR, +\fIbegin\fR_\fIx\fR) on the screen. (This position is relative to the +screen, and not to the window \fIorig\fR.) The window is made in the +middle of the window \fIorig\fR, so that changes made to one window +will affect both windows. The subwindow shares memory with the window +\fIorig\fR. When using this routine, it is necessary to call +\fBtouchwin\fR or \fBtouchline\fR on \fIorig\fR before calling +\fBwrefresh\fR on the subwindow. + +Calling \fBderwin\fR is the same as calling \fBsubwin,\fR except that +\fIbegin\fR_\fIy\fR and \fIbegin\fR_\fIx\fR are relative to the origin +of the window \fIorig\fR rather than the screen. There is no +difference between the subwindows and the derived windows. + +Calling \fBmvderwin\fR moves a derived window (or subwindow) +inside its parent window. The screen-relative parameters of the +window are not changed. This routine is used to display different +parts of the parent window at the same physical position on the +screen. + +Calling \fBdupwin\fR creates an exact duplicate of the window \fIwin\fR. + +Calling \fBwsyncup\fR touches all locations in ancestors of \fIwin\fR that are +changed in \fIwin\fR. If \fBsyncok\fR is called with second argument +\fBTRUE\fR then \fBwsyncup\fR is called automatically whenever there is a +change in the window. + +The \fBwsyncdown\fR routine touches each location in \fIwin\fR that has been +touched in any of its ancestor windows. This routine is called by +\fBwrefresh\fR, so it should almost never be necessary to call it manually. + +The routine \fBwcursyncup\fR updates the current cursor position of all the +ancestors of the window to reflect the current cursor position of the +window. +.SH RETURN VALUE +Routines that return an integer return the integer \fBERR\fR upon failure and +\fBOK\fR (SVr4 only specifies "an integer value other than \fBERR\fR") upon +successful completion. + +\fBdelwin\fR returns the integer \fBERR\fR upon failure and \fBOK\fR +upon successful completion. + +Routines that return pointers return \fBNULL\fR on error. +.SH NOTES +If many small changes are made to the window, the \fBwsyncup\fR option could +degrade performance. + +Note that \fBsyncok\fR may be a macro. +.SH BUGS +The subwindow functions (\fIsubwin\fR, \fIderwin\fR, \fImvderwin\fR, +\fBwsyncup\fR, \fBwsyncdown\fR, \fBwcursyncup\fR, \fBsyncok\fR) are flaky, +incompletely implemented, and not well tested. + +The System V curses documentation is very unclear about what \fBwsyncup\fR +and \fBwsyncdown\fR actually do. It seems to imply that they are only +supposed to touch exactly those lines that are affected by ancestor changes. +The language here, and the behavior of the \fBcurses\fR implementation, +is patterned on the XPG4 curses standard. The weaker XPG4 spec may result +in slower updates. +.SH PORTABILITY +The XSI Curses standard, Issue 4 describes these functions. +.SH SEE ALSO +\fBcurses\fR(3X), \fBcurs_refresh\fR(3X), \fBcurs_touch\fR(3X) +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curses.3 b/lib/libcurses/curses.3 index ea0093b61ad..a47086d4871 100644 --- a/lib/libcurses/curses.3 +++ b/lib/libcurses/curses.3 @@ -1,197 +1,608 @@ -.\" Copyright (c) 1985, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)curses.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd June 4, 1993 -.Dt CURSES 3 -.Os BSD 4 -.Sh NAME -.Nm curses -.Nd screen functions with ``optimal'' cursor motion -.Sh SYNOPSIS -.Nm cc -.Op Ar flags -.Ar files -.Fl lcurses ltermcap -.Op Ar libraries -.Sh DESCRIPTION -These routines give the user a method of updating screens with reasonable -optimization. They keep an image of the current screen, -and the user sets up an image of a new one. Then the -.Fn refresh -tells the routines to make the current screen look like the new one. -In order to initialize the routines, the routine -.Fn initscr -must be called before any of the other routines that deal with windows and -screens are used. The routine -.Fn endwin -should be called before exiting. -.Sh SEE ALSO -.Xr ioctl 2 , -.Xr getenv 3 , -.Xr tty 4 , -.Xr termcap 5 -.Rs -.%T Screen Updating and Cursor Movement Optimization: A Library Package -.%A Ken Arnold -.Re -.Sh AUTHOR -.An Ken Arnold -.Sh FUNCTIONS -.Bl -column "subwin(win,lines,cols,begin_y,begin_x) " -.It addch(ch) add a character to -.Em stdscr -.It addstr(str) add a string to -.Em stdscr -.It box(win,vert,hor) draw a box around a window -.It cbreak() set cbreak mode -.It clear() clear -.Em stdscr -.It clearok(scr,boolf) set clear flag for -.Em scr -.It clrtobot() clear to bottom on -.Em stdscr -.It clrtoeol() clear to end of line on -.Em stdscr -.It delch() delete a character -.It deleteln() delete a line -.It delwin(win) delete -.Em stdscr -.It echo() set echo mode -.It endwin() end window modes -.It erase() erase -.Em stdscr -.It flusok(win,boolf) set flush-on-refresh flag for -.Em win -.It getch() get a char through -.Em stdscr -.It getcap(name) get terminal capability -.Em name -.It getstr(str) get a string through -.Em stdscr -.It gettmode() get tty modes -.It getyx(win,y,x) get (y,x) co-ordinates -.It inch() get char at current (y,x) co-ordinates -.It initscr() initialize screens -.It insch(c) insert a char -.It insertln() insert a line -.It leaveok(win,boolf) set leave flag for -.Em stdscr -.It longname(termbuf,name) get long name from -.Em termbuf -.It move(y,x) move to (y,x) on -.Em stdscr -.It mvcur(lasty,lastx,newy,newx) actually move cursor -.It newwin(lines,cols,begin_y,begin_x)\ create a new window -.It nl() set newline mapping -.It nocbreak() unset cbreak mode -.It noecho() unset echo mode -.It nonl() unset newline mapping -.It noraw() unset raw mode -.It overlay(win1,win2) overlay win1 on win2 -.It overwrite(win1,win2) overwrite win1 on top of win2 -.It printw(fmt,arg1,arg2,...) printf on -.Em stdscr -.It raw() set raw mode -.It refresh() make current screen look like -.Em stdscr -.It resetty() reset tty flags to stored value -.It savetty() stored current tty flags -.It scanw(fmt,arg1,arg2,...) scanf through -.Em stdscr -.It scroll(win) scroll -.Em win -one line -.It scrollok(win,boolf) set scroll flag -.It setterm(name) set term variables for name -.It standend() end standout mode -.It standout() start standout mode -.It subwin(win,lines,cols,begin_y,begin_x)\ create a subwindow -.It touchline(win,y,sx,ex) mark line -.Em y -.Em sx -through -.Em sy -as changed -.It touchoverlap(win1,win2) mark overlap of -.Em win1 -on -.Em win2 -as changed -.It touchwin(win) \*(lqchange\*(rq all of -.Em win -.It unctrl(ch) printable version of -.Em ch -.It waddch(win,ch) add char to -.Em win -.It waddstr(win,str) add string to -.Em win -.It wclear(win) clear -.Em win -.It wclrtobot(win) clear to bottom of -.Em win -.It wclrtoeol(win) clear to end of line on -.Em win -.It wdelch(win) delete char from -.Em win -.It wdeleteln(win) delete line from -.Em win -.It werase(win) erase -.Em win -.It wgetch(win) get a char through -.Em win -.It wgetstr(win,str) get a string through -.Em win -.It winch(win) get char at current (y,x) in -.Em win -.It winsch(win,c) insert char into -.Em win -.It winsertln(win) insert line into -.Em win -.It wmove(win,y,x) set current (y,x) co-ordinates on -.Em win -.It wprintw(win,fmt,arg1,arg2,...)\ printf on -.Em win -.It wrefresh(win) make screen look like -.Em win -.It wscanw(win,fmt,arg1,arg2,...)\ scanf through -.Em win -.It wstandend(win) end standout mode on -.Em win -.It wstandout(win) start standout mode on -.Em win -.El -.Sh HISTORY -The -.Nm -package appeared in -.Bx 4.0 . +.TH curses 3X "" +.ds n 5 +.ds d /usr/share/terminfo +.SH NAME +\fBcurses\fR - CRT screen handling and optimization package +.SH SYNOPSIS +\fB#include <curses.h>\fR +.br +.SH DESCRIPTION +The \fBcurses\fR library routines give the user a terminal-independent method +of updating character screens with reasonable optimization. This +implementation is ``new curses'' (ncurses) and is the approved replacement for +4.4BSD classic curses, which is being discontinued. + +The \fBcurses\fR routines emulate the \fBcurses\fR(3X) library of System V +Release 4 UNIX, and the XPG4 curses standard (XSI curses) but the \fBcurses\fR +library is freely redistributable in source form. Differences from the SVr4 +curses are summarized under the EXTENSIONS and BUGS sections below and +described in detail in the EXTENSIONS and BUGS sections of individual man +pages. + +A program using these routines must be linked with the \fB-lcurses\fR option. + +The \fBcurses\fR package supports: overall screen, window and pad +manipulation; output to windows and pads; reading terminal input; control over +terminal and \fBcurses\fR input and output options; environment query +routines; color manipulation; use of soft label keys; terminfo capabilities; +and access to low-level terminal-manipulation routines. + +To initialize the routines, the routine \fBinitscr\fR or \fBnewterm\fR +must be called before any of the other routines that deal with windows +and screens are used. The routine \fBendwin\fR must be called before +exiting. To get character-at-a-time input without echoing (most +interactive, screen oriented programs want this), the following +sequence should be used: + + \fBinitscr(); cbreak(); noecho();\fR + +Most programs would additionally use the sequence: + + \fBnonl();\fR + \fBintrflush(stdscr, FALSE);\fR + \fBkeypad(stdscr, TRUE);\fR + +Before a \fBcurses\fR program is run, the tab stops of the terminal +should be set and its initialization strings, if defined, must be +output. This can be done by executing the \fBtput init\fR command +after the shell environment variable \fBTERM\fR has been exported. +\fBtset(1)\fR is usually responsible for doing this. +[See \fBterminfo\fR(\*n) for further details.] + +The \fBcurses\fR library permits manipulation of data structures, +called \fIwindows\fR, which can be thought of as two-dimensional +arrays of characters representing all or part of a CRT screen. A +default window called \fBstdscr\fR, which is the size of the terminal +screen, is supplied. Others may be created with \fBnewwin\fR. + +Note that \fBcurses\fR does not handle overlapping windows, that's done by +the \fBpanels(3x)\fR library. This means that you can either use +\fBstdscr\fR or divide the screen into tiled windows and not using +\fBstdscr\fR at all. Mixing the two will result in unpredictable, and +undesired, effects. + +Windows are referred to by variables declared as \fBWINDOW *\fR. +These data structures are manipulated with routines described here and +elsewhere in the \fBcurses\fR manual pages. Among which the most basic +routines are \fBmove\fR and \fBaddch\fR. More general versions of +these routines are included with names beginning with \fBw\fR, +allowing the user to specify a window. The routines not beginning +with \fBw\fR affect \fBstdscr\fR.) + +After using routines to manipulate a window, \fBrefresh\fR is called, +telling \fBcurses\fR to make the user's CRT screen look like +\fBstdscr\fR. The characters in a window are actually of type +\fBchtype\fR, (character and attribute data) so that other information +about the character may also be stored with each character. + +Special windows called \fIpads\fR may also be manipulated. These are windows +which are not constrained to the size of the screen and whose contents need not +be completely displayed. See curs_pad(3X) for more information. + +In addition to drawing characters on the screen, video attributes and colors +may be supported, causing the characters to show up in such modes as +underlined, in reverse video, or in color on terminals that support such +display enhancements. Line drawing characters may be specified to be output. +On input, \fBcurses\fR is also able to translate arrow and function keys that +transmit escape sequences into single values. The video attributes, line +drawing characters, and input values use names, defined in \fB<curses.h>\fR, +such as \fBA_REVERSE\fR, \fBACS_HLINE\fR, and \fBKEY_LEFT\fR. + +If the environment variables \fBLINES\fR and \fBCOLUMNS\fR are set, or if the +program is executing in a window environment, line and column information in +the environment will override information read by \fIterminfo\fR. This would +effect a program running in an AT&T 630 layer, for example, where the size of a +screen is changeable. + +If the environment variable \fBTERMINFO\fR is defined, any program using +\fBcurses\fR checks for a local terminal definition before checking in the +standard place. For example, if \fBTERM\fR is set to \fBatt4424\fR, then the +compiled terminal definition is found in + + \fB\*d/a/att4424\fR. + +(The \fBa\fR is copied from the first letter of \fBatt4424\fR to avoid +creation of huge directories.) However, if \fBTERMINFO\fR is set to +\fB$HOME/myterms\fR, \fBcurses\fR first checks + + \fB$HOME/myterms/a/att4424\fR, + +and if that fails, it then checks + + \fB\*d/a/att4424\fR. + +This is useful for developing experimental definitions or when write +permission in \fB\*d\fR is not available. + +The integer variables \fBLINES\fR and \fBCOLS\fR are defined in +\fB<curses.h>\fR and will be filled in by \fBinitscr\fR with the size of the +screen. The constants \fBTRUE\fR and \fBFALSE\fR have the values \fB1\fR and +\fB0\fR, respectively. + +The \fBcurses\fR routines also define the \fBWINDOW *\fR variable \fBcurscr\fR +which is used for certain low-level operations like clearing and redrawing a +screen containing garbage. The \fBcurscr\fR can be used in only a few +routines. + +.SS Routine and Argument Names +Many \fBcurses\fR routines have two or more versions. The routines prefixed +with \fBw\fR require a window argument. The routines prefixed with \fBp\fR +require a pad argument. Those without a prefix generally use \fBstdscr\fR. + +The routines prefixed with \fBmv\fR require a \fIy\fR and \fIx\fR +coordinate to move to before performing the appropriate action. The +\fBmv\fR routines imply a call to \fBmove\fR before the call to the +other routine. The coordinate \fIy\fR always refers to the row (of +the window), and \fIx\fR always refers to the column. The upper +left-hand corner is always (0,0), not (1,1). + +The routines prefixed with \fBmvw\fR take both a window argument and +\fIx\fR and \fIy\fR coordinates. The window argument is always +specified before the coordinates. + +In each case, \fIwin\fR is the window affected, and \fIpad\fR is the +pad affected; \fIwin\fR and \fIpad\fR are always pointers to type +\fBWINDOW\fR. + +Option setting routines require a Boolean flag \fIbf\fR with the value +\fBTRUE\fR or \fBFALSE\fR; \fIbf\fR is always of type \fBbool\fR. The +variables \fIch\fR and \fIattrs\fR below are always of type +\fBchtype\fR. The types \fBWINDOW\fR, \fBSCREEN\fR, \fBbool\fR, and +\fBchtype\fR are defined in \fB<curses.h>\fR. The type \fBTERMINAL\fR +is defined in \fB<term.h>\fR. All other arguments are integers. + +.SS Routine Name Index +The following table lists each \fBcurses\fR routine and the name of +the manual page on which it is described. Routines flagged with `*' +are ncurses-specific, not described by XPG4 or present in SVr4. + +.nf +\fBcurses\fR Routine Name Manual Page Name +___________________________________________ +addch curs_addch(3X) +addchnstr curs_addchstr(3X) +addchstr curs_addchstr(3X) +addnstr curs_addstr(3X) +addstr curs_addstr(3X) +attroff curs_attr(3X) +attron curs_attr(3X) +attrset curs_attr(3X) +baudrate curs_termattrs(3X) +beep curs_beep(3X) +bkgd curs_bkgd(3X) +bkgdset curs_bkgd(3X) +border curs_border(3X) +box curs_border(3X) +can_change_color curs_color(3X) +cbreak curs_inopts(3X) +clear curs_clear(3X) +clearok curs_outopts(3X) +clrtobot curs_clear(3X) +clrtoeol curs_clear(3X) +color_content curs_color(3X) +copywin curs_overlay(3X) +curs_set curs_kernel(3X) +def_prog_mode curs_kernel(3X) +def_shell_mode curs_kernel(3X) +del_curterm curs_terminfo(3X) +delay_output curs_util(3X) +delch curs_delch(3X) +deleteln curs_deleteln(3X) +delscreen curs_initscr(3X) +delwin curs_window(3X) +derwin curs_window(3X) +doupdate curs_refresh(3X) +dupwin curs_window(3X) +echo curs_inopts(3X) +echochar curs_addch(3X) +endwin curs_initscr(3X) +erase curs_clear(3X) +erasechar curs_termattrs(3X) +filter curs_util(3X) +flash curs_beep(3X) +flushinp curs_util(3X) +getbegyx curs_getyx(3X) +getch curs_getch(3X) +getmaxyx curs_getyx(3X) +getmouse curs_mouse(3X)* +getparyx curs_getyx(3X) +getstr curs_getstr(3X) +getsyx curs_kernel(3X) +getwin curs_util(3X) +getyx curs_getyx(3X) +halfdelay curs_inopts(3X) +has_colors curs_color(3X) +has_ic curs_termattrs(3X) +has_il curs_termattrs(3X) +hline curs_border(3X) +idcok curs_outopts(3X) +idlok curs_outopts(3X) +immedok curs_outopts(3X) +inch curs_inch(3X) +inchnstr curs_inchstr(3X) +inchstr curs_inchstr(3X) +init_color curs_color(3X) +init_pair curs_color(3X) +initscr curs_initscr(3X) +innstr curs_instr(3X) +insch curs_insch(3X) +insdelln curs_deleteln(3X) +insertln curs_deleteln(3X) +insnstr curs_insstr(3X) +insstr curs_insstr(3X) +instr curs_instr(3X) +intrflush curs_inopts(3X) +is_linetouched curs_touch(3X) +is_wintouched curs_touch(3X) +isendwin curs_initscr(3X) +keyname curs_util(3X) +keypad curs_inopts(3X) +killchar curs_termattrs(3X) +leaveok curs_outopts(3X) +longname curs_termattrs(3X) +meta curs_inopts(3X) +mouseinterval curs_mouse(3X)* +mousemask curs_mouse(3X)* +move curs_move(3X) +mvaddch curs_addch(3X) +mvaddchnstr curs_addchstr(3X) +mvaddchstr curs_addchstr(3X) +mvaddnstr curs_addstr(3X) +mvaddstr curs_addstr(3X) +mvcur curs_terminfo(3X) +mvdelch curs_delch(3X) +mvderwin curs_window(3X) +mvgetch curs_getch(3X) +mvgetstr curs_getstr(3X) +mvinch curs_inch(3X) +mvinchnstr curs_inchstr(3X) +mvinchstr curs_inchstr(3X) +mvinnstr curs_instr(3X) +mvinsch curs_insch(3X) +mvinsnstr curs_insstr(3X) +mvinsstr curs_insstr(3X) +mvinstr curs_instr(3X) +mvprintw curs_printw(3X) +mvscanw curs_scanw(3X) +mvwaddch curs_addch(3X) +mvwaddchnstr curs_addchstr(3X) +mvwaddchstr curs_addchstr(3X) +mvwaddnstr curs_addstr(3X) +mvwaddstr curs_addstr(3X) +mvwdelch curs_delch(3X) +mvwgetch curs_getch(3X) +mvwgetstr curs_getstr(3X) +mvwin curs_window(3X) +mvwinch curs_inch(3X) +mvwinchnstr curs_inchstr(3X) +mvwinchstr curs_inchstr(3X) +mvwinnstr curs_instr(3X) +mvwinsch curs_insch(3X) +mvwinsnstr curs_insstr(3X) +mvwinsstr curs_insstr(3X) +mvwinstr curs_instr(3X) +mvwprintw curs_printw(3X) +mvwscanw curs_scanw(3X) +napms curs_kernel(3X) +newpad curs_pad(3X) +newterm curs_initscr(3X) +newwin curs_window(3X) +nl curs_outopts(3X) +nocbreak curs_inopts(3X) +nodelay curs_inopts(3X) +noecho curs_inopts(3X) +nonl curs_outopts(3X) +noqiflush curs_inopts(3X) +noraw curs_inopts(3X) +notimeout curs_inopts(3X) +overlay curs_overlay(3X) +overwrite curs_overlay(3X) +pair_content curs_color(3X) +pechochar curs_pad(3X) +pnoutrefresh curs_pad(3X) +prefresh curs_pad(3X) +printw curs_printw(3X) +putp curs_terminfo(3X) +putwin curs_util(3X) +qiflush curs_inopts(3X) +raw curs_inopts(3X) +redrawwin curs_refresh(3X) +refresh curs_refresh(3X) +reset_prog_mode curs_kernel(3X) +reset_shell_mode curs_kernel(3X) +resetty curs_kernel(3X) +restartterm curs_terminfo(3X) +ripoffline curs_kernel(3X) +savetty curs_kernel(3X) +scanw curs_scanw(3X) +scr_dump curs_scr_dump(3X) +scr_init curs_scr_dump(3X) +scr_restore curs_scr_dump(3X) +scr_set curs_scr_dump(3X) +scrl curs_scroll(3X) +scroll curs_scroll(3X) +scrollok curs_outopts(3X) +set_curterm curs_terminfo(3X) +set_term curs_initscr(3X) +setscrreg curs_outopts(3X) +setsyx curs_kernel(3X) +setterm curs_terminfo(3X) +setupterm curs_terminfo(3X) +slk_attroff curs_slk(3X) +slk_attron curs_slk(3X) +slk_attrset curs_slk(3X) +slk_clear curs_slk(3X) +slk_init curs_slk(3X) +slk_label curs_slk(3X) +slk_noutrefresh curs_slk(3X) +slk_refresh curs_slk(3X) +slk_restore curs_slk(3X) +slk_set curs_slk(3X) +slk_touch curs_slk(3X) +standend curs_attr(3X) +standout curs_attr(3X) +start_color curs_color(3X) +subpad curs_pad(3X) +subwin curs_window(3X) +syncok curs_window(3X) +termattrs curs_termattrs(3X) +termname curs_termattrs(3X) +tgetent curs_termcap(3X) +tgetflag curs_termcap(3X) +tgetnum curs_termcap(3X) +tgetstr curs_termcap(3X) +tgoto curs_termcap(3X) +tigetflag curs_terminfo(3X) +tigetnum curs_terminfo(3X) +tigetstr curs_terminfo(3X) +timeout curs_inopts(3X) +touchline curs_touch(3X) +touchwin curs_touch(3X) +tparm curs_terminfo(3X) +tputs curs_termcap(3X) +tputs curs_terminfo(3X) +typeahead curs_inopts(3X) +unctrl curs_util(3X) +ungetch curs_getch(3X) +ungetmouse curs_mouse(3X)* +untouchwin curs_touch(3X) +use_env curs_util(3X) +vidattr curs_terminfo(3X) +vidputs curs_terminfo(3X) +vline curs_border(3X) +vwprintw curs_printw(3X) +vwscanw curs_scanw(3X) +waddch curs_addch(3X) +waddchnstr curs_addchstr(3X) +waddchstr curs_addchstr(3X) +waddnstr curs_addstr(3X) +waddstr curs_addstr(3X) +wattroff curs_attr(3X) +wattron curs_attr(3X) +wattrset curs_attr(3X) +wbkgd curs_bkgd(3X) +wbkgdset curs_bkgd(3X) +wborder curs_border(3X) +wclear curs_clear(3X) +wclrtobot curs_clear(3X) +wclrtoeol curs_clear(3X) +wcursyncup curs_window(3X) +wdelch curs_delch(3X) +wdeleteln curs_deleteln(3X) +wechochar curs_addch(3X) +wenclose curs_mouse(3X)* +werase curs_clear(3X) +wgetch curs_getch(3X) +wgetnstr curs_getstr(3X) +wgetstr curs_getstr(3X) +whline curs_border(3X) +winch curs_inch(3X) +winchnstr curs_inchstr(3X) +winchstr curs_inchstr(3X) +winnstr curs_instr(3X) +winsch curs_insch(3X) +winsdelln curs_deleteln(3X) +winsertln curs_deleteln(3X) +winsnstr curs_insstr(3X) +winsstr curs_insstr(3X) +winstr curs_instr(3X) +wmove curs_move(3X) +wnoutrefresh curs_refresh(3X) +wprintw curs_printw(3X) +wredrawln curs_refresh(3X) +wrefresh curs_refresh(3X) +wresize curs_resize(3x)* +wscanw curs_scanw(3X) +wscrl curs_scroll(3X) +wsetscrreg curs_outopts(3X) +wstandend curs_attr(3X) +wstandout curs_attr(3X) +wsyncdown curs_window(3X) +wsyncup curs_window(3X) +wtimeout curs_inopts(3X) +wtouchln curs_touch(3X) +wvline curs_border(3X) +.fi +.SH RETURN VALUE +Routines that return an integer return \fBERR\fR upon failure and an +integer value other than \fBERR\fR upon successful completion, unless +otherwise noted in the routine descriptions. + +All macros return the value of the \fBw\fR version, except \fBsetscrreg\fR, +\fBwsetscrreg\fR, \fBgetyx\fR, \fBgetbegyx\fR, \fBgetmaxyx\fR. The return +values of \fBsetscrreg\fR, \fBwsetscrreg\fR, \fBgetyx\fR, \fBgetbegyx\fR, and +\fBgetmaxyx\fR are undefined (\fIi\fR.\fIe\fR., these should not be used as the +right-hand side of assignment statements). + +Routines that return pointers return \fBNULL\fR on error. +.SH SEE ALSO +\fBterminfo\fR(\*n) and 3X pages whose names begin "curs_" for detailed routine +descriptions. +.SH EXTENSIONS +The \fBcurses\fR library can be compiled with an option (\fB-DTERMCAP_FILE\fR) +that falls back to the old-style /etc/termcap file if the terminal setup code +cannot find a terminfo entry corresponding to \fBTERM\fR. Use of this feature +is not recommended, as it essentially includes an entire termcap compiler in +the \fBcurses\fR startup code, at significant cost in core and startup cycles. + +Compiling with \fB-DTERMCAP_FILE\fR changes the library's initialization +sequence in a way intended to mimic the behavior of 4.4BSD curses. If there is +no local or system terminfo entry matching \fBTERM\fR, then the library looks +for termcap entries in the following places: (1) if \fBTERMINFO\fR is +undefined, in the file named by \fBTERMCAP_FILE\fR; (2) if \fBTERMINFO\fR is +defined and begins with a slash, it is interpreted as the name of a termcap +file to search for \fBTERM\fR; (3) otherwise, if \fBTERMINFO\fR has a leading +string that looks like a terminal entry name list, and it matches \fBTERM\fR, +the contents of \fBTERMINFO\fR is interpreted as a termcap; (4) if +\fBTERMINFO\fR looks like a termcap but doesn't match \fBTERM\fR, the termcap +file is searched for among the colon-separated paths in the environment +variable \fBTERMPATHS\fR if that is defined, and in ~/.termcap and the file +value of \fBTERMCAP_FILE\fR otherwise. + +Versions of \fBcurses\fR compiled on PC clones support display of the PC ROM +characters (including ROM characters 0-31, which stock SVr4 curses cannot +display). See the EXTENSIONS sections of \fBcurs_addch\fR(3x) and +\fBcurs_attr\fR(3x). +.SH PORTABILITY +The \fBcurses\fR library is intended to be BASE-level conformant with the XSI +Curses standard. Certain portions of the EXTENDED XSI Curses functionality +(including color support) are supported. The following EXTENDED XSI Curses +calls in support of wide (multibyte) characters are not yet implemented: +\fBaddnwstr\fB, +\fBaddwstr\fB, +\fBmvaddnwstr\fB, +\fBmvwaddnwstr\fB, +\fBmvaddwstr\fB, +\fBwaddnwstr\fB, +\fBwaddwstr\fB, +\fBadd_wch\fB, +\fBwadd_wch\fB, +\fBmvadd_wch\fB, +\fBmvwadd_wch\fB, +\fBadd_wchnstr\fB, +\fBadd_wchstr\fB, +\fBwadd_wchnstr\fB, +\fBwadd_wchstr\fB, +\fBmvadd_wchnstr\fB, +\fBmvadd_wchstr\fB, +\fBmvwadd_wchnstr\fB, +\fBmvwadd_wchstr\fB, +\fBbkgrndset\fB, +\fBbkgrnd\fB, +\fBgetbkgrnd\fB, +\fBwbkgrnd\fB, +\fBwbkgrndset\fB, +\fBwgetbkgrnd\fB, +\fBborder_set\fB, +\fBwborder_set\fB, +\fBbox_set\fB, +\fBhline_set\fB, +\fBmvhline_set\fB, +\fBmvvline_set\fB, +\fBmvwhline_set\fB, +\fBmvwvline_set\fB, +\fBwhline_set\fB, +\fBvhline_set\fB, +\fBwvline_set\fB, +\fBecho_wchar\fB, +\fBwecho_wchar\fB, +\fBerasewchar\fB, +\fBkillwchar\fB, +\fBget_wch\fB, +\fBmvget_wch\fB, +\fBmvwget_ch\fB, +\fBwget_wch\fB, +\fBgetwchtype\fB, +\fBget_wstr\fB, +\fBgetn_wstr\fB, +\fBwget_wstr\fB, +\fBwgetn_wstr\fB, +\fBmvget_wstr\fB, +\fBmvgetn_wstr\fB, +\fBmvwget_wstr\fB, +\fBmvwgetn_wstr\fB, +\fBinnwstr\fB, +\fBinwstr\fB, +\fBwinnwstr\fB, +\fBwinwstr\fB, +\fBmvinnwstr\fB, +\fBmvinwstr\fB, +\fBmvwinnwstr\fB, +\fBmvwinwstr\fB, +\fBins_nwstr\fB, +\fBins_wstr\fB, +\fBmvins_nwstr\fB, +\fBmvins_wstr\fB, +\fBmvwins_nwstr\fB, +\fBmvwins_wstr\fB, +\fBwins_nwstr\fB, +\fBwins_wstr\fB, +\fBins_wch\fB, +\fBwins_wch\fB, +\fBmvins_wch\fB, +\fBmvwins_wch\fB, +\fBin_wch\fB, +\fBwin_wch\fB, +\fBmvin_wch\fB, +\fBmvwin_wch\fB, +\fBinwchstr\fB, +\fBinwchnstr\fB, +\fBwinwchstr\fB, +\fBwinwchnstr\fB, +\fBmvinwchstr\fB, +\fBmvinwchnstr\fB, +\fBmvinwchstr\fB, +\fBmvwinwchnstr\fB. +.PP +A small number of local differences (that is, individual differences between +the XSI Curses and \fBcurses\fR calls) are described in \fBPORTABILITY\fR +sections of the library man pages. +.PP +The terminfo format supported by \fBcurses\fR is binary-compatible with SVr4, +but not conformant with XSI curses. This is because the XSI Curses drafters, +in a remarkable fit of braindamage, changed the undocumented SVr4 capability +\fBgetm\fR from a string to a boolean, changing the binary offsets of all +capabilities after it in the SVr4 order and making it impossible for any +SVr4-compatible implementation to be fully conformant. +.PP +The routines \fBgetmouse\fR, \fBmousemask\fR, \fBungetmouse\fR, +\fBmouseinterval\fR, and \fBwenclose\fR relating to mouse interfacing are not +part of XPG4, nor are they present in SVr4. See the \fBcurs_mouse\fR(3X) +manual page for details. +.PP +The routine \fBwresize\fR is not part of XPG4, nor is it present in SVr4. See +the \fBcurs_resize\fR(3X) manual page for details. +.PP +In historic curses versions, delays embedded in the capabilities \fBcr\fR, +\fBind\fR, \fBcub1\fR, \fBff\fR and \fBtab\fR activated corresponding delay +bits in the UNIX tty driver. In this implementation, all padding is done by +NUL sends. This method is slightly more expensive, but narrows the interface +to the UNIX kernel significantly and increases the package's portability +correspondingly. +.PP +In the XSI standard and SVr4 manual pages, many entry points have prototype +arguments of the for \fBchar *const\fR (or \fBcchar_t *const\fR, or \fBwchar_t +*const\fR, or \fBvoid *const\fR). Depending on one's interpretation of the +ANSI C standard (see section 3.5.4.1), these declarations are either (a) +meaningless, or (b) meaningless and illegal. The declaration \fBconst char +*x\fR is a modifiable pointer to unmodifiable data, but \fBchar *const x\fR' is +an unmodifiable pointer to modifiable data. Given that C passes arguments by +value, \fB<type> *const\fR as a formal type is at best dubious. Some compilers +choke on the prototypes. Therefore, in this implementation, they have been +changed to \fBconst <type> *\fR globally. +.SH NOTES +The header file \fB<curses.h>\fR automatically includes the header files +\fB<stdio.h>\fR and \fB<unctrl.h>\fR. + +If standard output from a \fBcurses\fR program is re-directed to something +which is not a tty, screen updates will be directed to standard error. This +was an undocumented feature of AT&T System V Release 3 curses. +.SH AUTHORS +Zeyd M. Ben-Halim, Eric S. Raymond. Descends from the original pcurses +by Pavel Curtis. +.\"# +.\"# The following sets edit modes for GNU EMACS +.\"# Local Variables: +.\"# mode:nroff +.\"# fill-column:79 +.\"# End: diff --git a/lib/libcurses/curses.c b/lib/libcurses/curses.c deleted file mode 100644 index 07cbb5b4afd..00000000000 --- a/lib/libcurses/curses.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)curses.c 8.3 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* Private. */ -int __echoit = 1; /* If stty indicates ECHO. */ -int __pfast; -int __rawmode = 0; /* If stty indicates RAW mode. */ -int __noqch = 0; /* - * If terminal doesn't have - * insert/delete line capabilities - * for quick change on refresh. - */ -char AM, BS, CA, DA, EO, HC, IN, MI, MS, NC, NS, OS, PC, - UL, XB, XN, XT, XS, XX; -char *AL, *BC, *BT, *CD, *CE, *CL, *CM, *CR, *CS, *DC, *DL, - *DM, *DO, *ED, *EI, *K0, *K1, *K2, *K3, *K4, *K5, *K6, - *K7, *K8, *K9, *HO, *IC, *IM, *IP, *KD, *KE, *KH, *KL, - *KR, *KS, *KU, *LL, *MA, *ND, *NL, *RC, *SC, *SE, *SF, - *SO, *SR, *TA, *TE, *TI, *UC, *UE, *UP, *US, *VB, *VS, - *VE, *al, *dl, *sf, *sr, - *AL_PARM, *DL_PARM, *UP_PARM, *DOWN_PARM, *LEFT_PARM, - *RIGHT_PARM; -/* - * Public. - * - * XXX - * UPPERCASE isn't used by libcurses, and is left for backward - * compatibility only. - */ -WINDOW *curscr; /* Current screen. */ -WINDOW *stdscr; /* Standard screen. */ -int COLS; /* Columns on the screen. */ -int LINES; /* Lines on the screen. */ -int My_term = 0; /* Use Def_term regardless. */ -char *Def_term = "unknown"; /* Default terminal type. */ -char GT; /* Gtty indicates tabs. */ -char NONL; /* Term can't hack LF doing a CR. */ -char UPPERCASE; /* Terminal is uppercase only. */ diff --git a/lib/libcurses/curses.h b/lib/libcurses/curses.h index cee7f96e013..95c2c95a5a4 100644 --- a/lib/libcurses/curses.h +++ b/lib/libcurses/curses.h @@ -1,341 +1,1202 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +#ifndef __NCURSES_H +#define __NCURSES_H +#define CURSES 1 +#define CURSES_H 1 +#define NCURSES_VERSION "1.9.9e" + +#ifndef _CHTYPE_T_ +#define _CHTYPE_T_ unsigned long +typedef _CHTYPE_T_ chtype; +#endif + +#include <stdio.h> +#include <unctrl.h> +#include <stdarg.h> +#ifdef _XOPEN_SOURCE_EXTENDED +#include <stddef.h> /* we want wchar_t */ +#endif /* _XOPEN_SOURCE_EXTENDED */ + +/* XSI and SVr4 specify that curses implements 'bool'. However, C++ may also + * implement it. If so, we must use the C++ compiler's type to avoid conflict + * with other interfaces. * - * @(#)curses.h 8.4 (Berkeley) 8/10/94 + * To simplify use with/without the configuration script, we define the symbols + * CXX_BUILTIN_BOOL and CXX_TYPE_OF_BOOL; they're edited by the configure + * script. + */ + +#undef TRUE +#undef FALSE +#define CXX_BUILTIN_BOOL 1 +#define CXX_TYPE_OF_BOOL char + +#if defined(__cplusplus) && CXX_BUILTIN_BOOL +#define TRUE ((CXX_TYPE_OF_BOOL)true) +#define FALSE ((CXX_TYPE_OF_BOOL)false) +#else +typedef CXX_TYPE_OF_BOOL bool; +#define TRUE ((bool)1) +#define FALSE ((bool)0) +#endif + +/* + * XSI attributes. In the ncurses implementation, they are identical to the + * A_ attributes because attr_t is just an int. The XSI Curses attr_* and + * wattr_* entry points are all mapped to attr* and wattr* entry points. */ +#define WA_ATTRIBUTES 0xffffff00 +#define WA_NORMAL 0x00000000 +#define WA_STANDOUT 0x00010000 +#define WA_UNDERLINE 0x00020000 +#define WA_REVERSE 0x00040000 +#define WA_BLINK 0x00080000 +#define WA_DIM 0x00100000 +#define WA_BOLD 0x00200000 +#define WA_ALTCHARSET 0x00400000 +#define WA_INVIS 0x00800000 +#define WA_PROTECT 0x01000000 +#define WA_HORIZONTAL 0x02000000 /* XSI Curses attr -- not yet used */ +#define WA_LEFT 0x04000000 /* XSI Curses attr -- not yet used */ +#define WA_LOW 0x08000000 /* XSI Curses attr -- not yet used */ +#define WA_RIGHT 0x10000000 /* XSI Curses attr -- not yet used */ +#define WA_TOP 0x20000000 /* XSI Curses attr -- not yet used */ +#define WA_VERTICAL 0x40000000 /* XSI Curses attr -- not yet used */ + +/* colors */ +extern int COLORS; +extern int COLOR_PAIRS; +extern unsigned char *color_pairs; -#ifndef _CURSES_H_ -#define _CURSES_H_ +#define COLOR_BLACK 0 +#define COLOR_RED 1 +#define COLOR_GREEN 2 +#define COLOR_YELLOW 3 +#define COLOR_BLUE 4 +#define COLOR_MAGENTA 5 +#define COLOR_CYAN 6 +#define COLOR_WHITE 7 -#include <sys/types.h> -#include <sys/cdefs.h> +/* line graphics */ -#include <stdio.h> +extern chtype acs_map[]; +/* VT100 symbols begin here */ +#define ACS_ULCORNER (acs_map['l']) /* upper left corner */ +#define ACS_LLCORNER (acs_map['m']) /* lower left corner */ +#define ACS_URCORNER (acs_map['k']) /* upper right corner */ +#define ACS_LRCORNER (acs_map['j']) /* lower right corner */ +#define ACS_LTEE (acs_map['t']) /* tee pointing right */ +#define ACS_RTEE (acs_map['u']) /* tee pointing left */ +#define ACS_BTEE (acs_map['v']) /* tee pointing up */ +#define ACS_TTEE (acs_map['w']) /* tee pointing down */ +#define ACS_HLINE (acs_map['q']) /* horizontal line */ +#define ACS_VLINE (acs_map['x']) /* vertical line */ +#define ACS_PLUS (acs_map['n']) /* large plus or crossover */ +#define ACS_S1 (acs_map['o']) /* scan line 1 */ +#define ACS_S9 (acs_map['s']) /* scan line 9 */ +#define ACS_DIAMOND (acs_map['`']) /* diamond */ +#define ACS_CKBOARD (acs_map['a']) /* checker board (stipple) */ +#define ACS_DEGREE (acs_map['f']) /* degree symbol */ +#define ACS_PLMINUS (acs_map['g']) /* plus/minus */ +#define ACS_BULLET (acs_map['~']) /* bullet */ +/* Teletype 5410v1 symbols begin here */ +#define ACS_LARROW (acs_map[',']) /* arrow pointing left */ +#define ACS_RARROW (acs_map['+']) /* arrow pointing right */ +#define ACS_DARROW (acs_map['.']) /* arrow pointing down */ +#define ACS_UARROW (acs_map['-']) /* arrow pointing up */ +#define ACS_BOARD (acs_map['h']) /* board of squares */ +#define ACS_LANTERN (acs_map['I']) /* lantern symbol */ +#define ACS_BLOCK (acs_map['0']) /* solid square block */ /* - * The following #defines and #includes are present for backward - * compatibility only. They should not be used in future code. - * - * START BACKWARD COMPATIBILITY ONLY. + * These aren't documented, but a lot of System Vs have them anyway + * (you can spot pprryyzz{{||}} in a lot of AT&T terminfo strings). + * The ACS_names may not match AT&T's, our source didn't know them. */ -#ifndef _CURSES_PRIVATE -#define bool char -#define reg register +#define ACS_S3 (acs_map['p']) /* scan line 3 */ +#define ACS_S7 (acs_map['r']) /* scan line 7 */ +#define ACS_LEQUAL (acs_map['y']) /* less/equal */ +#define ACS_GEQUAL (acs_map['z']) /* greater/equal */ +#define ACS_PI (acs_map['{']) /* Pi */ +#define ACS_NEQUAL (acs_map['|']) /* not equal */ +#define ACS_STERLING (acs_map['}']) /* UK pound sign */ + +/* + * Line drawing ACS names are of the form ACS_trbl, where t is the top, r + * is the right, b is the bottom, and l is the left. t, r, b, and l might + * be B (blank), S (single), D (double), or T (thick). The subset defined + * here only uses B and S. + */ +#define ACS_BSSB ACS_ULCORNER +#define ACS_SSBB ACS_LLCORNER +#define ACS_BBSS ACS_URCORNER +#define ACS_SBBS ACS_LRCORNER +#define ACS_SBSS ACS_RTEE +#define ACS_SSSB ACS_LTEE +#define ACS_SSBS ACS_BTEE +#define ACS_BSSS ACS_TTEE +#define ACS_BSBS ACS_HLINE +#define ACS_SBSB ACS_VLINE +#define ACS_SSSS ACS_PLUS -#ifndef TRUE -#define TRUE (1) +#if !defined(ERR) || ((ERR) != -1) +#define ERR (-1) #endif -#ifndef FALSE -#define FALSE (0) + +#if !defined(OK) || ((OK) != 0) +#define OK (0) #endif -#define _puts(s) tputs(s, 0, __cputchar) -#define _putchar(c) __cputchar(c) - -/* Old-style terminal modes access. */ -#define baudrate() (cfgetospeed(&__baset)) -#define crmode() cbreak() -#define erasechar() (__baset.c_cc[VERASE]) -#define killchar() (__baset.c_cc[VKILL]) -#define nocrmode() nocbreak() -#define ospeed (cfgetospeed(&__baset)) -#endif /* _CURSES_PRIVATE */ - -extern char GT; /* Gtty indicates tabs. */ -extern char NONL; /* Term can't hack LF doing a CR. */ -extern char UPPERCASE; /* Terminal is uppercase only. */ - -extern int My_term; /* Use Def_term regardless. */ -extern char *Def_term; /* Default terminal type. */ - -/* Termcap capabilities. */ -extern char AM, BS, CA, DA, EO, HC, IN, MI, MS, NC, NS, OS, - PC, UL, XB, XN, XT, XS, XX; -extern char *AL, *BC, *BT, *CD, *CE, *CL, *CM, *CR, *CS, *DC, *DL, - *DM, *DO, *ED, *EI, *K0, *K1, *K2, *K3, *K4, *K5, *K6, - *K7, *K8, *K9, *HO, *IC, *IM, *IP, *KD, *KE, *KH, *KL, - *KR, *KS, *KU, *LL, *MA, *ND, *NL, *RC, *SC, *SE, *SF, - *SO, *SR, *TA, *TE, *TI, *UC, *UE, *UP, *US, *VB, *VS, - *VE, *al, *dl, *sf, *sr, - *AL_PARM, *DL_PARM, *UP_PARM, *DOWN_PARM, *LEFT_PARM, - *RIGHT_PARM; - -/* END BACKWARD COMPATIBILITY ONLY. */ - -/* 8-bit ASCII characters. */ -#define unctrl(c) __unctrl[(c) & 0xff] -#define unctrllen(ch) __unctrllen[(ch) & 0xff] - -extern char *__unctrl[256]; /* Control strings. */ -extern char __unctrllen[256]; /* Control strings length. */ +/* values for the _flags member */ +#define _SUBWIN 0x01 /* is this a sub-window? */ +#define _ENDLINE 0x02 /* is the window flush right? */ +#define _FULLWIN 0x04 /* is the window full-screen? */ +#define _SCROLLWIN 0x08 /* bottom edge is at screen bottom? */ +#define _ISPAD 0x10 /* is this window a pad? */ +#define _HASMOVED 0x20 /* has cursor moved since last refresh? */ +#define _NEED_WRAP 0x40 /* cursor wrap pending */ /* - * A window an array of __LINE structures pointed to by the 'lines' pointer. - * A line is an array of __LDATA structures pointed to by the 'line' pointer. - * - * IMPORTANT: the __LDATA structure must NOT induce any padding, so if new - * fields are added -- padding fields with *constant values* should ensure - * that the compiler will not generate any padding when storing an array of - * __LDATA structures. This is to enable consistent use of memcmp, and memcpy - * for comparing and copying arrays. + * this value is used in the firstchar and lastchar fields to mark + * unchanged lines + */ +#define _NOCHANGE -1 + +/* + * this value is used in the oldindex field to mark lines created by insertions + * and scrolls. */ -typedef struct { - char ch; /* the actual character */ - -#define __STANDOUT 0x01 /* Added characters are standout. */ - char attr; /* attributes of character */ -} __LDATA; - -#define __LDATASIZE (sizeof(__LDATA)) - -typedef struct { -#define __ISDIRTY 0x01 /* Line is dirty. */ -#define __ISPASTEOL 0x02 /* Cursor is past end of line */ -#define __FORCEPAINT 0x04 /* Force a repaint of the line */ - unsigned int flags; - unsigned int hash; /* Hash value for the line. */ - size_t *firstchp, *lastchp; /* First and last chngd columns ptrs */ - size_t firstch, lastch; /* First and last changed columns. */ - __LDATA *line; /* Pointer to the line text. */ -} __LINE; - -typedef struct __window { /* Window structure. */ - struct __window *nextp, *orig; /* Subwindows list and parent. */ - size_t begy, begx; /* Window home. */ - size_t cury, curx; /* Current x, y coordinates. */ - size_t maxy, maxx; /* Maximum values for curx, cury. */ - short ch_off; /* x offset for firstch/lastch. */ - __LINE **lines; /* Array of pointers to the lines */ - __LINE *lspace; /* line space (for cleanup) */ - __LDATA *wspace; /* window space (for cleanup) */ - -#define __ENDLINE 0x001 /* End of screen. */ -#define __FLUSH 0x002 /* Fflush(stdout) after refresh. */ -#define __FULLWIN 0x004 /* Window is a screen. */ -#define __IDLINE 0x008 /* Insert/delete sequences. */ -#define __SCROLLWIN 0x010 /* Last char will scroll window. */ -#define __SCROLLOK 0x020 /* Scrolling ok. */ -#define __CLEAROK 0x040 /* Clear on next refresh. */ -#define __WSTANDOUT 0x080 /* Standout window */ -#define __LEAVEOK 0x100 /* If curser left */ - unsigned int flags; -} WINDOW; - -/* Curses external declarations. */ -extern WINDOW *curscr; /* Current screen. */ -extern WINDOW *stdscr; /* Standard screen. */ - -extern struct termios __orig_termios; /* Terminal state before curses */ -extern struct termios __baset; /* Our base terminal state */ -extern int __tcaction; /* If terminal hardware set. */ - -extern int COLS; /* Columns on the screen. */ -extern int LINES; /* Lines on the screen. */ - -extern char *ttytype; /* Full name of current terminal. */ - -#define ERR (0) /* Error return. */ -#define OK (1) /* Success return. */ - -/* Standard screen pseudo functions. */ -#define addbytes(s, n) __waddbytes(stdscr, s, n, 0) -#define addch(ch) waddch(stdscr, ch) -#define addnstr(s, n) waddnstr(stdscr, s, n) -#define addstr(s) __waddbytes(stdscr, s, strlen(s), 0) -#define clear() wclear(stdscr) -#define clrtobot() wclrtobot(stdscr) -#define clrtoeol() wclrtoeol(stdscr) -#define delch() wdelch(stdscr) -#define deleteln() wdeleteln(stdscr) -#define erase() werase(stdscr) -#define getch() wgetch(stdscr) -#define getstr(s) wgetstr(stdscr, s) -#define inch() winch(stdscr) -#define insch(ch) winsch(stdscr, ch) -#define insertln() winsertln(stdscr) -#define move(y, x) wmove(stdscr, y, x) -#define refresh() wrefresh(stdscr) -#define standend() wstandend(stdscr) -#define standout() wstandout(stdscr) -#define waddbytes(w, s, n) __waddbytes(w, s, n, 0) -#define waddstr(w, s) __waddbytes(w, s, strlen(s), 0) - -/* Standard screen plus movement pseudo functions. */ -#define mvaddbytes(y, x, s, n) mvwaddbytes(stdscr, y, x, s, n) -#define mvaddch(y, x, ch) mvwaddch(stdscr, y, x, ch) -#define mvaddnstr(y, x, s, n) mvwaddnstr(stdscr, y, x, s, n) -#define mvaddstr(y, x, s) mvwaddstr(stdscr, y, x, s) -#define mvdelch(y, x) mvwdelch(stdscr, y, x) -#define mvgetch(y, x) mvwgetch(stdscr, y, x) -#define mvgetstr(y, x, s) mvwgetstr(stdscr, y, x, s) -#define mvinch(y, x) mvwinch(stdscr, y, x) -#define mvinsch(y, x, c) mvwinsch(stdscr, y, x, c) -#define mvwaddbytes(w, y, x, s, n) \ - (wmove(w, y, x) == ERR ? ERR : __waddbytes(w, s, n, 0)) -#define mvwaddch(w, y, x, ch) \ - (wmove(w, y, x) == ERR ? ERR : waddch(w, ch)) -#define mvwaddnstr(w, y, x, s, n) \ - (wmove(w, y, x) == ERR ? ERR : waddnstr(w, s, n)) -#define mvwaddstr(w, y, x, s) \ - (wmove(w, y, x) == ERR ? ERR : __waddbytes(w, s, strlen(s), 0)) -#define mvwdelch(w, y, x) \ - (wmove(w, y, x) == ERR ? ERR : wdelch(w)) -#define mvwgetch(w, y, x) \ - (wmove(w, y, x) == ERR ? ERR : wgetch(w)) -#define mvwgetstr(w, y, x, s) \ - (wmove(w, y, x) == ERR ? ERR : wgetstr(w, s)) -#define mvwinch(w, y, x) \ - (wmove(w, y, x) == ERR ? ERR : winch(w)) -#define mvwinsch(w, y, x, c) \ - (wmove(w, y, x) == ERR ? ERR : winsch(w, c)) - -/* Psuedo functions. */ -#define clearok(w, bf) \ - ((bf) ? ((w)->flags |= __CLEAROK) : ((w)->flags &= ~__CLEAROK)) -#define flushok(w, bf) \ - ((bf) ? ((w)->flags |= __FLUSH) : ((w)->flags &= ~__FLUSH)) -#define getyx(w, y, x) \ - (y) = (w)->cury, (x) = (w)->curx -#define leaveok(w, bf) \ - ((bf) ? ((w)->flags |= __LEAVEOK) : ((w)->flags &= ~__LEAVEOK)) -#define scrollok(w, bf) \ - ((bf) ? ((w)->flags |= __SCROLLOK) : ((w)->flags &= ~__SCROLLOK)) -#define winch(w) \ - ((w)->lines[(w)->cury]->line[(w)->curx].ch & 0177) - -/* Public function prototypes. */ -__BEGIN_DECLS -int box __P((WINDOW *, int, int)); -int cbreak __P((void)); -int delwin __P((WINDOW *)); -int echo __P((void)); -int endwin __P((void)); -char *fullname __P((char *, char *)); -char *getcap __P((char *)); -int gettmode __P((void)); -void idlok __P((WINDOW *, int)); -WINDOW *initscr __P((void)); -char *longname __P((char *, char *)); -int mvcur __P((int, int, int, int)); -int mvprintw __P((int, int, const char *, ...)); -int mvscanw __P((int, int, const char *, ...)); -int mvwin __P((WINDOW *, int, int)); -int mvwprintw __P((WINDOW *, int, int, const char *, ...)); -int mvwscanw __P((WINDOW *, int, int, const char *, ...)); -WINDOW *newwin __P((int, int, int, int)); -int nl __P((void)); -int nocbreak __P((void)); -int noecho __P((void)); -int nonl __P((void)); -int noraw __P((void)); -int overlay __P((WINDOW *, WINDOW *)); -int overwrite __P((WINDOW *, WINDOW *)); -int printw __P((const char *, ...)); -int raw __P((void)); -int resetty __P((void)); -int savetty __P((void)); -int scanw __P((const char *, ...)); -int scroll __P((WINDOW *)); -int setterm __P((char *)); -int sscans __P((WINDOW *, const char *, ...)); -WINDOW *subwin __P((WINDOW *, int, int, int, int)); -int suspendwin __P((void)); -int touchline __P((WINDOW *, int, int, int)); -int touchoverlap __P((WINDOW *, WINDOW *)); -int touchwin __P((WINDOW *)); -int vwprintw __P((WINDOW *, const char *, _BSD_VA_LIST_)); -int vwscanw __P((WINDOW *, const char *, _BSD_VA_LIST_)); -int waddch __P((WINDOW *, int)); -int waddnstr __P((WINDOW *, const char *, int)); -int wclear __P((WINDOW *)); -int wclrtobot __P((WINDOW *)); -int wclrtoeol __P((WINDOW *)); -int wdelch __P((WINDOW *)); -int wdeleteln __P((WINDOW *)); -int werase __P((WINDOW *)); -int wgetch __P((WINDOW *)); -int wgetstr __P((WINDOW *, char *)); -int winsch __P((WINDOW *, int)); -int winsertln __P((WINDOW *)); -int wmove __P((WINDOW *, int, int)); -int wprintw __P((WINDOW *, const char *, ...)); -int wrefresh __P((WINDOW *)); -int wscanw __P((WINDOW *, const char *, ...)); -int wstandend __P((WINDOW *)); -int wstandout __P((WINDOW *)); -int vwprintw __P((WINDOW *, const char *, _BSD_VA_LIST_)); - -/* Private functions that are needed for user programs prototypes. */ -void __cputchar __P((int)); -int __waddbytes __P((WINDOW *, const char *, int, int)); -__END_DECLS - -/* Private functions. */ -#ifdef _CURSES_PRIVATE -void __CTRACE __P((const char *, ...)); -unsigned int __hash __P((char *, int)); -void __id_subwins __P((WINDOW *)); -int __mvcur __P((int, int, int, int, int)); -void __restore_stophandler __P((void)); -void __set_stophandler __P((void)); -void __set_subwin __P((WINDOW *, WINDOW *)); -void __startwin __P((void)); -void __stop_signal_handler __P((int)); -void __swflags __P((WINDOW *)); -int __touchline __P((WINDOW *, int, int, int, int)); -int __touchwin __P((WINDOW *)); -char *__tscroll __P((const char *, int, int)); -int __waddch __P((WINDOW *, __LDATA *)); - -/* Private #defines. */ -#define min(a,b) (a < b ? a : b) -#define max(a,b) (a > b ? a : b) - -/* Private externs. */ -extern int __echoit; -extern int __endwin; -extern int __pfast; -extern int __rawmode; -extern int __noqch; +#define _NEWINDEX -1 + +typedef struct screen SCREEN; +typedef struct _win_st WINDOW; + +typedef chtype attr_t; /* ...must be at least as wide as chtype */ + +#ifdef _XOPEN_SOURCE_EXTENDED +#ifndef _WCHAR_T +typedef unsigned long wchar_t; +#endif /* _WCHAR_T */ +#ifndef _WINT_T +typedef long int wint_t; +#endif /* _WINT_T */ + +#define CCHARW_MAX 5 +typedef struct +{ + attr_t attr; + wchar_t chars[CCHARW_MAX]; +} +cchar_t; +#endif /* _XOPEN_SOURCE_EXTENDED */ + +struct _win_st { + short _cury, _curx; /* current cursor position */ + + /* window location and size */ + short _maxy, _maxx; /* maximums of x and y, NOT window size */ + short _begy, _begx; /* screen coords of upper-left-hand corner */ + + short _flags; /* window state flags */ + + /* attribute tracking */ + attr_t _attrs; /* current attribute for non-space character */ + chtype _bkgd; /* current background char/attribute pair */ + + /* option values set by user */ + bool _notimeout; /* no time out on function-key entry? */ + bool _clear; /* consider all data in the window invalid? */ + bool _leaveok; /* OK to not reset cursor on exit? */ + bool _scroll; /* OK to scroll this window? */ + bool _idlok; /* OK to use insert/delete line? */ + bool _idcok; /* OK to use insert/delete char? */ + bool _immed; /* window in immed mode? (not yet used) */ + bool _sync; /* window in sync mode? */ + bool _use_keypad; /* process function keys into KEY_ symbols? */ + int _delay; /* 0 = nodelay, <0 = blocking, >0 = delay */ + + /* the actual line data */ + struct ldat + { + chtype *text; /* text of the line */ + short firstchar; /* first changed character in the line */ + short lastchar; /* last changed character in the line */ + short oldindex; /* index of the line at last update */ + } + *_line; + + /* global screen state */ + short _regtop; /* top line of scrolling region */ + short _regbottom; /* bottom line of scrolling region */ + + /* these are used only if this is a sub-window */ + int _parx; /* x coordinate of this window in parent */ + int _pary; /* y coordinate of this window in parent */ + WINDOW *_parent; /* pointer to parent if a sub-window */ + + /* these are used only if this is a pad */ + struct pdat + { + short _pad_y, _pad_x; + short _pad_top, _pad_left; + short _pad_bottom, _pad_right; + } _pad; +}; + +extern WINDOW *stdscr, *curscr, *newscr; + +extern int LINES, COLS, TABSIZE; + +/* + * This global was an undocumented feature under AIX curses. + */ +extern int ESCDELAY; /* ESC expire time in milliseconds */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern char ttytype[]; /* needed for backward compatibility */ + +/* + * GCC (and some other compilers) define '__attribute__'; we're using this + * macro to alert the compiler to flag inconsistencies in printf/scanf-like + * function calls. Just in case '__attribute__' isn't defined, make a dummy. + */ +#if !defined(__GNUC__) && !defined(__attribute__) +#define __attribute__(p) /* nothing */ #endif -/* Termcap functions. */ -__BEGIN_DECLS -int tgetent __P((char *, char *)); -int tgetnum __P((char *)); -int tgetflag __P((char *)); -char *tgetstr __P((char *, char **)); -char *tgoto __P((char *, int, int)); -void tputs __P((char *, int, void (*)(int))); -__END_DECLS - -#endif /* !_CURSES_H_ */ +/* + * Function prototypes. This is the complete XSI Curses list of required + * functions. Those marked `generated' will have sources generated from the + * macro definitions later in this file, in order to satisfy XPG4.2 + * requirements. + */ + +extern int addch(const chtype); /* generated */ +extern int addchnstr(const chtype *, int); /* generated */ +extern int addchstr(const chtype *); /* generated */ +extern int addnstr(const char *, int); /* generated */ +extern int addstr(const char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int addnwstr(const wchar_t *, int); /* missing */ +extern int addwstr(const wchar_t *); /* missing */ +extern int add_wch(const cchar_t *); /* missing */ +extern int add_wchnstr(const cchar_t *, int); /* missing */ +extern int add_wchstr(const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int attroff(int); /* generated */ +extern int attron(int); /* generated */ +extern int attrset(int); /* generated */ +extern int attr_get(void); /* generated */ +extern int attr_off(int); /* implemented */ +extern int attr_on(int); /* implemented */ +extern int attr_set(int); /* generated */ +extern int baudrate(void); /* implemented */ +extern int beep(void); /* implemented */ +extern int bkgd(chtype); /* generated */ +extern void bkgdset(chtype); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int bkgrndset(const cchar_t *); /* missing */ +extern int bkgrnd(const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int border(chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int border_set(cchar_t,cchar_t,cchar_t,cchar_t,cchar_t,cchar_t,cchar_t,cchar_t); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int box(WINDOW *, chtype, chtype); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int box_set(WINDOW *, cchar_t, cchar_t); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern bool can_change_color(void); /* implemented */ +extern int cbreak(void); /* implemented */ +extern int chgat(int, attr_t, short, const void *); /* generated */ +extern int clear(void); /* generated */ +extern int clearok(WINDOW *,bool); /* implemented */ +extern int clrtobot(void); /* generated */ +extern int clrtoeol(void); /* generated */ +extern int color_content(short,short*,short*,short*); /* implemented */ +extern int COLOR_PAIR(int); /* generated */ +extern int copywin(const WINDOW*,WINDOW*,int,int,int,int,int,int,int); /* implemented */ +extern int curs_set(int); /* implemented */ +extern int def_prog_mode(void); /* implemented */ +extern int def_shell_mode(void); /* implemented */ +extern int delay_output(float); /* implemented */ +extern int delch(void); /* generated */ +extern void delscreen(SCREEN *); /* implemented */ +extern int delwin(WINDOW *); /* implemented */ +extern int deleteln(void); /* generated */ +extern WINDOW *derwin(WINDOW *,int,int,int,int); /* implemented */ +extern int doupdate(void); /* implemented */ +extern WINDOW *dupwin(WINDOW *); /* implemented */ +extern int echo(void); /* implemented */ +extern int echochar(const chtype); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int echo_wchar(const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int endwin(void); /* implemented */ +extern char erasechar(void); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int erase_wchar(wchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern void filter(void); /* implemented */ +extern int flash(void); /* implemented */ +extern int flushinp(void); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern chtype getbkgd(WINDOW *); /* missing */ +extern int getbkgrnd(cchar_t *); /* missing */ +extern int getcchar(const cchar_t *, wchar_t*, attr_t*, short*, void*); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int getch(void); /* generated */ +extern int getnstr(char *, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int getn_wstr(wint_t *, int n); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int getstr(char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int get_wch(wint_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern WINDOW *getwin(FILE *); /* not in XPG4 */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int get_wstr(wint_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int halfdelay(int); /* implemented */ +extern int has_colors(void); /* implemented */ +extern int has_ic(void); /* implemented */ +extern int has_il(void); /* implemented */ +extern int hline(chtype, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int hline_set(const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int idcok(WINDOW *, bool); /* implemented */ +extern int idlok(WINDOW *, bool); /* implemented */ +extern int immedok(WINDOW *, bool); /* implemented */ +extern chtype inch(void); /* generated */ +extern int inchnstr(chtype *, int); /* generated */ +extern int inchstr(chtype *); /* generated */ +extern WINDOW *initscr(void); /* implemented */ +extern int init_color(short,short,short,short); /* implemented */ +extern int init_pair(short,short,short); /* implemented */ +extern int innstr(char *, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int innwstr(wchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int insch(chtype); /* generated */ +extern int insdelln(int); /* generated */ +extern int insertln(void); /* generated */ +extern int insnstr(const char *, int); /* generated */ +extern int insstr(const char *); /* generated */ +extern int instr(char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int ins_nwstr(const wchar_t *, int); /* missing */ +extern int ins_wch(const cchar_t *); /* missing */ +extern int ins_wstr(const wchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int intrflush(WINDOW *,bool); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int inwstr(wchar_t *); /* missing */ +extern int in_wch(const cchar_t *); /* missing */ +extern int in_wchstr(const cchar_t *); /* missing */ +extern int in_wchntr(const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int isendwin(void); /* implemented */ +extern int is_linetouched(WINDOW *,int); /* implemented */ +extern int is_wintouched(WINDOW *); /* implemented */ +extern const char *keyname(int); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int key_name(wchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int keypad(WINDOW *,bool); /* implemented */ +extern char killchar(void); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int killwchar(wchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int leaveok(WINDOW *,bool); /* implemented */ +extern char *longname(void); /* implemented */ +extern int meta(WINDOW *,bool); /* implemented */ +extern int move(int, int); /* generated */ +extern int mvaddch(int, int, const chtype); /* generated */ +extern int mvaddchnstr(int, int, const chtype *, int); /* generated */ +extern int mvaddchstr(int, int, const chtype *); /* generated */ +extern int mvaddnstr(int, int, const char *, int); /* generated */ +extern int mvaddstr(int, int, const char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvaddnwstr(int, int, const wchar_t *, int); /* missing */ +extern int mvaddwstr(int, int, const wchar_t *); /* missing */ +extern int mvadd_wch(int, int, const cchar_t *); /* missing */ +extern int mvadd_wchnstr(int, int, const cchar_t *, int);/* missing */ +extern int mvadd_wchstr(int, int, const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvchgat(int, int, int, attr_t, short, const void *); /* generated */ +extern int mvcur(int,int,int,int); /* implemented */ +extern int mvdelch(int, int); /* generated */ +extern int mvderwin(WINDOW *, int, int); /* implemented */ +extern int mvgetch(int, int); /* generated */ +extern int mvgetnstr(int, int, char *, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvgetn_wstr(int, int, wint_t *, int n); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvgetstr(int, int, char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvget_wch(int, int, wint_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvget_wstr(int, int, wint_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvhline(int, int, chtype, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvhline_set(int, int, const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern chtype mvinch(int, int); /* generated */ +extern int mvinchnstr(int, int, chtype *, int); /* generated */ +extern int mvinchstr(int, int, chtype *); /* generated */ +extern int mvinnstr(int, int, char *, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvinnwstr(int, int, wchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvinsch(int, int, chtype); /* generated */ +extern int mvinsnstr(int, int, const char *, int); /* generated */ +extern int mvinsstr(int, int, const char *); /* generated */ +extern int mvinstr(int, int, char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvins_nwstr(int, int, const wchar_t *, int); /* missing */ +extern int mvins_wch(int, int, const cchar_t *); /* missing */ +extern int mvins_wstr(int, int, const wchar_t *); /* missing */ +extern int mvinwstr(int, int, wchar_t *); /* missing */ +extern int mvin_wch(int, int, const cchar_t *); /* missing */ +extern int mvin_wchstr(int, int, const cchar_t *); /* missing */ +extern int mvin_wchntr(int, int, const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvprintw(int,int,const char *,...); /* implemented */ +extern int mvscanw(int,int,const char *,...); /* implemented */ +extern int mvvline(int, int, chtype, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvvline_set(int, int, const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvwaddch(WINDOW *, int, int, const chtype); /* generated */ +extern int mvwaddchnstr(WINDOW *, int, int, const chtype *, int);/* generated */ +extern int mvwaddchstr(WINDOW *, int, int, const chtype *); /* generated */ +extern int mvwaddnstr(WINDOW *, int, int, const char *, int); /* generated */ +extern int mvwaddstr(WINDOW *, int, int, const char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwaddnwstr(WINDOW *, int, int, const wchar_t *, int);/* missing */ +extern int mvwaddwstr(WINDOW *, int, int, const wchar_t *); /* missing */ +extern int mvwadd_wch(WINDOW *, int, int, const cchar_t *); /* missing */ +extern int mvwadd_wchnstr(WINDOW *, int, int, const cchar_t *, int); /* missing */ +extern int mvwadd_wchstr(WINDOW *, int, int, const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *);/* generated */ +extern int mvwdelch(WINDOW *, int, int); /* generated */ +extern int mvwgetch(WINDOW *, int, int); /* generated */ +extern int mvwgetnstr(WINDOW *, int, int, char *, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwgetn_wstr(WINDOW *, int, int, wint_t *, int n);/* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvwgetstr(WINDOW *, int, int, char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwget_wch(WINDOW *, int, int, wint_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwget_wstr(WINDOW *, int, int, wint_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvwhline(WINDOW *, int, int, chtype, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwhline_set(WINDOW *, int, int, const cchar_t *, int);/* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvwin(WINDOW *,int,int); /* implemented */ +extern chtype mvwinch(WINDOW *, int, int); /* generated */ +extern int mvwinchnstr(WINDOW *, int, int, chtype *, int); /* generated */ +extern int mvwinchstr(WINDOW *, int, int, chtype *); /* generated */ +extern int mvwinnstr(WINDOW *, int, int, char *, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwinnwstr(WINDOW *, int, int, wchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvwinsch(WINDOW *, int, int, chtype); /* generated */ +extern int mvwinsnstr(WINDOW *, int, int, const char *, int); /* generated */ +extern int mvwinsstr(WINDOW *, int, int, const char *); /* generated */ +extern int mvwinstr(WINDOW *, int, int, char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwins_nwstr(WINDOW *, int,int, const wchar_t *,int); /* missing */ +extern int mvwins_wch(WINDOW *, int, int, const cchar_t *); /* missing */ +extern int mvwins_wstr(WINDOW *, int, int, const wchar_t *); /* missing */ +extern int mvwinwstr(WINDOW *, int, int, wchar_t *); /* missing */ +extern int mvwin_wch(WINDOW *, int, int, const cchar_t *); /* missing */ +extern int mvwin_wchnstr(WINDOW *, int,int,const cchar_t *,int); /* missing */ +extern int mvwin_wchstr(WINDOW *, int, int, const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int mvwprintw(WINDOW*,int,int,const char *,...); /* implemented */ +extern int mvwscanw(WINDOW *,int,int,const char *,...); /* implemented */ +extern int mvwvline(WINDOW *,int, int, chtype, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int mvwvline_set(WINDOW *, int,int, const cchar_t *,int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int napms(int); /* implemented */ +extern WINDOW *newpad(int,int); /* implemented */ +extern SCREEN *newterm(const char *,FILE *,FILE *); /* implemented */ +extern WINDOW *newwin(int,int,int,int); /* implemented */ +extern int nl(void); /* implemented */ +extern int nocbreak(void); /* implemented */ +extern int nodelay(WINDOW *,bool); /* implemented */ +extern int noecho(void); /* implemented */ +extern int nonl(void); /* implemented */ +extern int noqiflush(void); /* implemented */ +extern int noraw(void); /* implemented */ +extern int notimeout(WINDOW *,bool); /* implemented */ +extern int overlay(const WINDOW*,WINDOW *); /* implemented */ +extern int overwrite(const WINDOW*,WINDOW *); /* implemented */ +extern int pair_content(short,short*,short*); /* implemented */ +extern int PAIR_NUMBER(int); /* generated */ +extern int pechochar(WINDOW *, chtype); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int pecho_wchar(WINDOW *, const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int pnoutrefresh(WINDOW*,int,int,int,int,int,int);/* implemented */ +extern int prefresh(WINDOW *,int,int,int,int,int,int); /* implemented */ +extern int printw(const char *,...); /* implemented */ +extern int putp(const char *); /* implemented */ +extern int putwin(WINDOW *, FILE *); /* implemented */ +extern int qiflush(void); /* implemented */ +extern int raw(void); /* implemented */ +extern int redrawwin(WINDOW *); /* generated */ +extern int refresh(void); /* generated */ +extern int resetty(void); /* implemented */ +extern int reset_prog_mode(void); /* implemented */ +extern int reset_shell_mode(void); /* implemented */ +extern int ripoffline(int line, int (*init)(WINDOW *, int));/* implemented */ +extern int savetty(void); /* implemented */ +extern int scanw(const char *,...); /* implemented */ +extern int scr_dump(const char *); /* implemented */ +extern int scr_init(const char *); /* implemented */ +extern int scrl(int); /* generated */ +extern int scroll(WINDOW *); /* generated */ +extern int scrollok(WINDOW *,bool); /* implemented */ +extern int scr_restore(const char *); /* implemented */ +extern int scr_set(const char *); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int setcchar(cchar_t *, wchar_t *, attr_t, short, const void *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int setscrreg(int,int); /* generated */ +extern SCREEN *set_term(SCREEN *); /* implemented */ +extern int slk_attroff(chtype); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int slk_attr_off(attr_t); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int slk_attron(chtype); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int slk_attr_on(attr_t); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int slk_attrset(chtype); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int slk_attr_set(attr_t); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int slk_clear(void); /* implemented */ +extern int slk_init(int); /* implemented */ +extern char *slk_label(int); /* implemented */ +extern int slk_noutrefresh(void); /* implemented */ +extern int slk_refresh(void); /* implemented */ +extern int slk_restore(void); /* implemented */ +extern int slk_set(int,const char *,int); /* implemented */ +extern int slk_touch(void); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int slk_wset(int, wchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int standout(void); /* generated */ +extern int standend(void); /* generated */ +extern int start_color(void); /* implemented */ +extern WINDOW *subpad(WINDOW *, int, int, int, int); /* implemented */ +extern WINDOW *subwin(WINDOW *,int,int,int,int); /* implemented */ +extern int syncok(WINDOW *win, bool); /* implemented */ +extern attr_t termattrs(void); /* implemented */ +extern char *termname(void); /* implemented */ +extern int tigetflag(const char *); /* implemented */ +extern int tigetnum(const char *); /* implemented */ +extern char *tigetstr(const char *); /* implemented */ +extern int timeout(int); /* implemented */ +extern int typeahead(int); /* implemented */ +extern int ungetch(int); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int unget_wch(const wchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int untouchwin(WINDOW *); /* generated */ +extern int vidattr(chtype); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int vid_attr(attr_t); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int vidputs(chtype, int (*)(int)); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int vid_puts(attr_t, int (*)(int)); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int vline(chtype, int); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int vline_set(const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int vwprintw(WINDOW *,const char *,va_list); /* implemented */ +extern int vw_printw(WINDOW *,const char *,va_list); /* implemented */ +extern int vwscanw(WINDOW *,const char *,va_list); /* implemented */ +extern int vw_scanw(WINDOW *,const char *,va_list); /* implemented */ +extern int waddch(WINDOW *, const chtype); /* implemented */ +extern int waddchnstr(WINDOW *,const chtype *const,int); /* implemented */ +extern int waddchstr(WINDOW *,const chtype *); /* generated */ +extern int waddnstr(WINDOW *,const char *const,int); /* implemented */ +extern int waddstr(WINDOW *,const char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int waddwstr(WINDOW *,const wchar_t *); /* missing */ +extern int wadd_wch(WINDOW *,const cchar_t *); /* missing */ +extern int wadd_wchnstr(WINDOW *,const cchar_t *,int); /* missing */ +extern int wadd_wchstr(WINDOW *,const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int wattron(WINDOW *, int); /* generated */ +extern int wattroff(WINDOW *, int); /* generated */ +extern int wattrset(WINDOW *, int); /* generated */ +extern attr_t wattr_get(WINDOW *); /* generated */ +extern int wattr_on(WINDOW *, const attr_t); /* implemented */ +extern int wattr_off(WINDOW *, const attr_t); /* implemented */ +extern int wattr_set(WINDOW *, attr_t); /* implemented */ +extern int wbkgd(WINDOW *,const chtype); /* implemented */ +extern void wbkgdset(WINDOW *,chtype); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wbkgrndset(WINDOW *,const cchar_t *); /* missing */ +extern int wbkgrnd(WINDOW *,const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int wborder(WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wborder_set(WINDOW *,cchar_t,cchar_t,cchar_t,cchar_t,cchar_t,cchar_t,cchar_t,cchar_t); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int wchgat(WINDOW *, int, attr_t, short, const void *);/* implemented */ +extern int wclear(WINDOW *); /* implemented */ +extern int wclrtobot(WINDOW *); /* implemented */ +extern int wclrtoeol(WINDOW *); /* implemented */ +extern void wcursyncup(WINDOW *); /* implemented */ +extern int wdelch(WINDOW *); /* implemented */ +extern int wdeleteln(WINDOW *); /* generated */ +extern int wechochar(WINDOW *, const chtype); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wecho_wchar(WINDOW *, const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int werase(WINDOW *); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wgetbkgrnd(WINDOW *, cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int wgetch(WINDOW *); /* implemented */ +extern int wgetnstr(WINDOW *,char *,int); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wgetn_wstr(WINDOW *,wint_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int wgetstr(WINDOW *, char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wget_wch(WINDOW *, wint_t *); /* missing */ +extern int wget_wstr(WINDOW *, wint_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int whline(WINDOW *, chtype, int); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int whline_set(WINDOW *, const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern chtype winch(WINDOW *); /* generated */ +extern int winchnstr(WINDOW *, chtype *, int); /* implemented */ +extern int winchstr(WINDOW *, chtype *); /* generated */ +extern int winnstr(WINDOW *, char *, int); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int winnwstr(WINDOW *, wchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int winsch(WINDOW *, chtype); /* implemented */ +extern int winsdelln(WINDOW *,int); /* implemented */ +extern int winsertln(WINDOW *); /* generated */ +extern int winsnstr(WINDOW *, const char *,int); /* implemented */ +extern int winsstr(WINDOW *, const char *); /* generated */ +extern int winstr(WINDOW *, char *); /* generated */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wins_nwstr(WINDOW *, const wchar_t *, int); /* missing */ +extern int wins_wch(WINDOW *, const cchar_t *); /* missing */ +extern int wins_wstr(WINDOW *, const wchar_t *); /* missing */ +extern int winwstr(WINDOW *, wchar_t *); /* missing */ +extern int win_wch(WINDOW *, const cchar_t *); /* missing */ +extern int win_wchnstr(WINDOW *, const cchar_t *, int); /* missing */ +extern int win_wchstr(WINDOW *, const cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int wmove(WINDOW *,int,int); /* implemented */ +extern int wnoutrefresh(WINDOW *); /* implemented */ +extern int wprintw(WINDOW *,const char *,...); /* implemented */ +extern int wredrawln(WINDOW *,int,int); /* implemented */ +extern int wrefresh(WINDOW *); /* implemented */ +extern int wresize(WINDOW *, int, int); /* implemented */ +extern int wscanw(WINDOW *,const char *,...); /* implemented */ +extern int wscrl(WINDOW *,int); /* implemented */ +extern int wsetscrreg(WINDOW *,int,int); /* implemented */ +extern int wstandout(WINDOW *); /* generated */ +extern int wstandend(WINDOW *); /* generated */ +extern void wsyncdown(WINDOW *); /* implemented */ +extern void wsyncup(WINDOW *); /* implemented */ +extern int wtimeout(WINDOW *,int); /* implemented */ +extern int wtouchln(WINDOW *,int,int,int); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern wchar_t wunctrl(cchar_t *); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ +extern int wvline(WINDOW *,chtype,int); /* implemented */ +#ifdef _XOPEN_SOURCE_EXTENDED +extern int wvline_set(WINDOW *, const cchar_t *, int); /* missing */ +#endif /* _XOPEN_SOURCE_EXTENDED */ + +#ifdef __cplusplus +} +#endif + +/* attributes */ +#define A_ATTRIBUTES 0xffffff00 +#define A_NORMAL 0x00000000 +#define A_STANDOUT 0x00010000 +#define A_UNDERLINE 0x00020000 +#define A_REVERSE 0x00040000 +#define A_BLINK 0x00080000 +#define A_DIM 0x00100000 +#define A_BOLD 0x00200000 +#define A_ALTCHARSET 0x00400000 +#define A_INVIS 0x00800000 +#define A_PROTECT 0x01000000 +#define A_HORIZONTAL 0x02000000 /* XSI Curses attr -- not yet used */ +#define A_LEFT 0x04000000 /* XSI Curses attr -- not yet used */ +#define A_LOW 0x08000000 /* XSI Curses attr -- not yet used */ +#define A_RIGHT 0x10000000 /* XSI Curses attr -- not yet used */ +#define A_TOP 0x20000000 /* XSI Curses attr -- not yet used */ +#define A_VERTICAL 0x40000000 /* XSI Curses attr -- not yet used */ +#define A_CHARTEXT 0x000000ff +#define A_COLOR 0x0000ff00 +#define COLOR_PAIR(n) (n << 8) +#define PAIR_NUMBER(a) ((a & A_COLOR) >> 8) + +/* + * pseudo functions + */ +#define wgetstr(w, s) wgetnstr(w, s, -1) +#define getnstr(s, n) wgetnstr(stdscr, s, n) + +#define setterm(term) setupterm(term, 1, (int *)0) + +#define fixterm() reset_prog_mode() +#define resetterm() reset_shell_mode() +#define saveterm() def_prog_mode() +#define crmode() cbreak() +#define nocrmode() nocbreak() +#define gettmode() + +#define getyx(win,y,x) (y = (win)->_cury, x = (win)->_curx) +#define getbegyx(win,y,x) (y = (win)->_begy, x = (win)->_begx) +#define getmaxyx(win,y,x) (y = (win)->_maxy + 1, x = (win)->_maxx + 1) +#define getparyx(win,y,x) (y = (win)->_pary, x = (win)->_parx) +#define getsyx(y,x) getyx(stdscr, y, x) +#define setsyx(y,x) (stdscr->_cury = y, stdscr->_curx = x) + +#define wbkgdset(win,ch) ((win)->_bkgd = (ch)) + +/* It seems older SYSV curses versions define these */ +#define getattrs(win) ((win)->_attrs) +#define getmaxx(win) ((win)->_maxx + 1) +#define getmaxy(win) ((win)->_maxy + 1) + +#define winch(win) ((win)->_line[(win)->_cury].text[(win)->_curx]) +#define wstandout(win) (wattr_set(win,A_STANDOUT)) +#define wstandend(win) (wattr_set(win,A_NORMAL)) +#define wattr_set(win,at) ((win)->_attrs = (at)) + +#define wattron(win,at) wattr_on(win, at) +#define wattroff(win,at) wattr_off(win, at) +#define wattrset(win,at) wattr_set(win, at) + +#define scroll(win) wscrl(win,1) + +#define touchwin(win) wtouchln((win), 0, (win)->_maxy + 1, 1) +#define touchline(win, s, c) wtouchln((win), s, c, 1) +#define untouchwin(win) wtouchln((win), 0, (win)->_maxy + 1, 0) + +#define box(win, v, h) wborder(win, v, v, h, h, 0, 0, 0, 0) +#define border(ls, rs, ts, bs, tl, tr, bl, br) wborder(stdscr, ls, rs, ts, bs, tl, tr, bl, br) +#define hline(ch, n) whline(stdscr, ch, n) +#define vline(ch, n) wvline(stdscr, ch, n) + +#define winstr(w, s) winnstr(w, s, -1) +#define winchstr(w, s) winchnstr(w, s, -1) +#define winsstr(w, s) winsnstr(w, s, -1) + +#define redrawwin(w) wredrawln(w, 0, w->_maxy+1) +#define waddstr(win,str) waddnstr(win,str,-1) +#define waddchstr(win,str) waddchnstr(win,str,-1) + +/* + * pseudo functions for standard screen + */ + +#define bkgdset(ch) wbkgdset(stdscr,ch) +#define bkgd(ch) wbkgd(stdscr,ch) +#define inch() winch(stdscr) +#define standout() wstandout(stdscr) +#define standend() wstandend(stdscr) +#define attron(at) wattron(stdscr,at) +#define attroff(at) wattroff(stdscr,at) +#define attrset(at) wattrset(stdscr,at) +#define addch(ch) waddch(stdscr,ch) +#define echochar(c) wechochar(stdscr, c) +#define getch() wgetch(stdscr) +#define addstr(str) waddnstr(stdscr,str,-1) +#define getstr(str) wgetstr(stdscr,str) +#define move(y, x) wmove(stdscr,y,x) +#define clear() wclear(stdscr) +#define erase() werase(stdscr) +#define clrtobot() wclrtobot(stdscr) +#define clrtoeol() wclrtoeol(stdscr) +#define insertln() winsdelln(stdscr, 1) +#define winsertln(w) winsdelln(w, 1) +#define deleteln() winsdelln(stdscr, -1) +#define wdeleteln(w) winsdelln(w, -1) +#define refresh() wrefresh(stdscr) +#define insch(c) winsch(stdscr,c) +#define delch() wdelch(stdscr) +#define setscrreg(t,b) wsetscrreg(stdscr,t,b) +#define scrl(n) wscrl(stdscr,n) +#define timeout(delay) wtimeout(stdscr, delay) +#define addnstr(str,n) waddnstr(stdscr,str,n) +#define addchstr(str) waddchstr(stdscr,str) +#define addchnstr(str,n) waddchnstr(stdscr,str, n) +#define insdelln(n) winsdelln(stdscr, n) +#define insstr(s) winsstr(stdscr, s) +#define insnstr(s,n) winsnstr(stdscr, s, n) +#define instr(s) winstr(stdscr, s) +#define innstr(s,n) winnstr(stdscr, s, n) +#define inchstr(s) winchstr(stdscr, s) +#define inchnstr(s,n) winchnstr(stdscr, s, n) + +/* + * mv functions + */ + +#define mvwaddch(win,y,x,ch) (wmove(win,y,x) == ERR ? ERR : waddch(win,ch)) +#define mvwgetch(win,y,x) (wmove(win,y,x) == ERR ? ERR : wgetch(win)) +#define mvwaddchnstr(win,y,x,str,n) (wmove(win,y,x) == ERR ? ERR : waddchnstr(win,str,n)) +#define mvwaddchstr(win,y,x,str) (wmove(win,y,x) == ERR ? ERR : waddchnstr(win,str,-1)) +#define mvwaddnstr(win,y,x,str,n) (wmove(win,y,x) == ERR ? ERR : waddnstr(win,str,n)) +#define mvwaddstr(win,y,x,str) (wmove(win,y,x) == ERR ? ERR : waddnstr(win,str,-1)) +#define mvwgetstr(win,y,x,str) (wmove(win,y,x) == ERR ? ERR : wgetstr(win,str)) +#define mvgetnstr(y,x,str,n) (move(y,x) == ERR ? ERR : wgetnstr(stdscr,str,n)) +#define mvwgetnstr(win,y,x,str,n) (wmove(win,y,x) == ERR ? ERR : wgetnstr(win,str,n)) +#define mvwinch(win,y,x) (wmove(win,y,x) == ERR ? ERR : winch(win)) +#define mvwdelch(win,y,x) (wmove(win,y,x) == ERR ? ERR : wdelch(win)) +#define mvwinsch(win,y,x,c) (wmove(win,y,x) == ERR ? ERR : winsch(win,c)) +#define mvwhline(win,y,x,c,n) (wmove(win,y,x) == ERR ? ERR : whline(win,c,n)) +#define mvwvline(win,y,x,c,n) (wmove(win,y,x) == ERR ? ERR : wvline(win,c,n)) +#define mvaddch(y,x,ch) mvwaddch(stdscr,y,x,ch) +#define mvaddchnstr(y,x,str,n) mvwaddchnstr(stdscr,y,x,str,n) +#define mvaddchstr(y,x,str) mvwaddchstr(stdscr,y,x,str) +#define mvgetch(y,x) mvwgetch(stdscr,y,x) +#define mvaddnstr(y,x,str,n) mvwaddnstr(stdscr,y,x,str,n) +#define mvaddstr(y,x,str) mvwaddstr(stdscr,y,x,str) +#define mvgetstr(y,x,str) mvwgetstr(stdscr,y,x,str) +#define mvinch(y,x) mvwinch(stdscr,y,x) +#define mvdelch(y,x) mvwdelch(stdscr,y,x) +#define mvinsch(y,x,c) mvwinsch(stdscr,y,x,c) +#define mvhline(y,x,c,n) mvwhline(stdscr,y,x,c,n) +#define mvvline(y,x,c,n) mvwvline(stdscr,y,x,c,n) +#define mvwinsstr(w, y, x, s) (wmove(w,y,x) == ERR ? ERR : winsstr(w,s)) +#define mvwinsnstr(w, y, x, s, n) (wmove(w,y,x) == ERR ? ERR : winsnstr(w,s,n)) +#define mvinsstr(y,x,s) mvwinsstr(stdscr,y,x,s) +#define mvinsnstr(y,x,s,n) mvwinsnstr(stdscr,y,x,s,n) +#define mvwinstr(w, y, x, s) (wmove(w,y,x) == ERR ? ERR : winstr(w,s)) +#define mvwinnstr(w, y, x, s, n) (wmove(w,y,x) == ERR ? ERR : winnstr(w,s,n)) +#define mvinstr(y,x,s) mvwinstr(stdscr,y,x,s) +#define mvinnstr(y,x,s,n) mvwinnstr(stdscr,y,x,s,n) +#define mvwinchstr(w, y, x, s) (wmove(w,y,x) == ERR ? ERR : winchstr(w,s)) +#define mvwinchnstr(w, y, x, s, n) (wmove(w,y,x) == ERR ? ERR : winchnstr(w,s,n)) +#define mvinchstr(y,x,s) mvwinchstr(stdscr,y,x,s) +#define mvinchnstr(y,x,s,n) mvwinchnstr(stdscr,y,x,s,n) + +/* + * XSI curses macros for XPG4 conformance. + * The underling functions needed to make these work are: + * waddnwstr(), waddchnwstr(), wadd_wch(), wborder_set(), wchgat(), + * wecho_wchar(), wgetn_wstr(), wget_wch(), whline_set(), vhline_set(), + * winnwstr(), wins_nwstr(), wins_wch(), win_wch(), win_wchnstr(). + * Except for wchgat(), these are not yet implemented. They will be someday. + */ +#define addnwstr(wstr, n) waddnwstr(stdscr, wstr, n) +#define addwstr(wstr, n) waddnwstr(stdscr, wstr, -1) +#define mvaddnwstr(y,x,wstr, n) (wmove(stdscr,y,x) == ERR ? ERR : waddnwstr(stdscr, wstr, n)) +#define mvaddwstr(y,x,wstr, n) (wmove(stdscr,y,x) == ERR ? ERR : waddnwstr(stdscr, wstr, -1)) +#define mvwaddnwstr(y,x,win,wstr,n) (wmove(win,y,x) == ERR ? ERR : waddnwstr(stdscr, wstr, n)) +#define mvwaddwstr(y,x,win,wstr,n) (wmove(win,y,x) == ERR ? ERR : waddnwstr(stdscr, wstr, -1)) +#define waddwstr(win, wstr, n) waddnwstr(win, wstr, -1) +#define add_wch(c) wadd_wch(stsdscr, c) +#define mvadd_wch(y,x,c) (wmove(stdscr,y,x) == ERR ? ERR : wadd_wch(stsdscr, c)) +#define mvwadd_wch(y,x,win,c) (wmove(win,y,x) == ERR ? ERR : wadd_wch(stsdscr, c)) +#define wattr_get(win) ((win)->_attrs) +#define attr_get() wattr_get(stdscr) +#define attr_off(a) wattr_off(stdscr, a) +#define attr_on(a) wattr_on(stdscr, a) +#define attr_set(a) wattr_set(stdscr, a) +#define wgetbkgd(win) ((win)->_bkgd) +#define box_set(w,v,h) wborder_set(w,v,v,h,h,0,0,0,9) +#define chgat(n, a, c, o) wchgat(stdscr, n, a, c, o) +#define mvchgat(y,x, n,a,c, o) (move(y,x)==ERR ? ERR : wchgat(stdscr,n,a,c,o)) +#define mvwchgat(w,y,x,n,a,c,o) (wmove(w,y,x) == ERR ? ERR : wchgat(w,n,a,c,o)) +#define echo_wchar(c) wecho_wchar(stdscr, c) +#define getn_wstr(t, n) wgetn_wstr(stdscr, t, n) +#define get_wstr(t) wgetn_wstr(stdscr, t, -1) +#define mvgetn_wstr(y, x, t, n) (move(y,x)==ERR ? ERR:wgetn_wstr(stdscr,t,n)) +#define mvget_wstr(y, x, t) (move(y,x)==ERR ? ERR:wgetn_wstr(stdscr,t,-1)) +#define mvwgetn_wstr(w,y,x,t,n) (wmove(w,y,x)==ERR ? ERR : wgetn_wstr(w,t,n)) +#define mvwget_wstr(w, y, x, t) (wmove(w,y,x)==ERR ? ERR : wgetn_wstr(w,t,-1)) +#define wget_wstr(w, t) wgetn_wstr(w, t, -1) +#define get_wch(c) wget_wch(stdscr, c) +#define mvget_wch(y, x, c) (move(y,x) == ERR ? ERR : wget_wch(stdscr, c)) +#define mvwget_wch(y, x, c) (wmove(w,y,x) == ERR ? ERR : wget_wch(w, n)) +#define hline_set(c, n) whline_set(stdscr, c, n) +#define mvhline_set(y,x,c,n) (move(y,x)==ERR ? ERR : whline_set(stdscr,c,n)) +#define mvvline_set(y,x,c,n) (move(y,x)==ERR ? ERR : wvline_set(stdscr,c,n)) +#define mvwhline_set(w,y,x,c,n) (wmove(w,y,x)==ERR ? ERR : whline_set(w,c,n)) +#define mvwvline_set(w,y,x,c,n) (wmove(w,y,x)==ERR ? ERR : wvline_set(w,c,n)) +#define vline_set(c, n) vhline_set(stdscr, c, n) +#define innwstr(c, n) winnwstr(stdscr, c, n) +#define inwstr(c) winnwstr(stdscr, c, -1) +#define mvinnwstr(y, x, c, n) (move(y,x)==ERR ? ERR : winnwstr(stdscr, c, n)) +#define mvinwstr(y, x, c) (move(y,x)==ERR ? ERR : winnwstr(stdscr, c,-1)) +#define mvwinnwstr(w,y,x,c,n) (wmove(w,y,x)==ERR ? ERR:winnwstr(stdscr,c,n)) +#define mvwinwstr(w,y,x,c) (wmove(w,y,x)==ERR ? ERR:winnwstr(stdscr,c,-1)) +#define winwstr(w, c) winnwstr(w, c, -1) +#define ins_nwstr(t, n) wins_nwstr(stdscr, t, n) +#define ins_wstr(t) wins_nwstr(stdscr, t, -1) +#define mvins_nwstr(y,x,t,n) (move(y,x)==ERR ? ERR: wins_nwstr(stdscr,t,n)) +#define mvins_wstr(y,x,t) (move(y,x)==ERR ? ERR: wins_nwstr(stdscr,t,-1)) +#define mvwins_nwstr(w,y,x,t,n) (wmove(w,y,x)==ERR?ERR:wins_nwstr(stdscr,t,n)) +#define mvwins_wstr(w,y,x,t) (wmove(w,y,x)==ERR?ERR:wins_nwstr(stdscr,t,-1)) +#define wins_wstr(w, t) wins_nwstr(w, t, -1) +#define ins_wch(c) wins_wch(stdscr, c) +#define mvins_wch(y,x,c) (move(y,x) == ERR ? ERR : wins_wch(c)) +#define mwvins_wch(w,y,x,c) (wmove(w,y,x) == ERR ? ERR : wins_wch(c)) +#define in_wch(c) win_wch(stdscr, c) +#define mvin_wch(y,x,c) (move(y,x) == ERR ? ERR : win_wch(stdscr, c)) +#define mvwin_wch(w,y,x,c) (wmove(w, y,x) == ERR ? ERR : win_wch(w, c)) +#define in_wchnstr(c, n) win_wchnstr(stdscr, c, n) +#define in_wchstr(c) win_wchnstr(stdscr, c, -1) +#define mvin_wchnstr(y,x,c,n) (move(y,x)==ERR ? ERR:win_wchnstr(stdscr,c,n)) +#define mvin_wchstr(y, x, c) (move(y,x)==ERR ? ERR:win_wchnstr(stdscr,c,-1)) +#define mvwin_wchnstr(w,y,x,c,n) (wmove(w,y,x)==ERR ? ERR:win_wchnstr(stdscr,c,n)) +#define mvwin_wchstr(w,y,x,c) (wmove(w,y,x)==ERR ? ERR:win_wchnstr(stdscr,c,-1)) +#define win_wchstr(w, c) win_wchnstr(w, c, -1) + + +/* + * XSI curses deprecates SVr4 vwprintw/vwscanw, which are supposed to use + * varargs.h. It adds new calls vw_printw/vw_scanw, which are supposed to + * use POSIX stdarg.h. The ncurses versions of vwprintw/vwscanw already + * use stdarg.h, so... + */ +#define vw_printw vwprintw +#define vw_scanw vwscanw + +/* + * Pseudo-character tokens outside ASCII range. The curses wgetch() function + * will return any given one of these only if the corresponding k- capability + * is defined in your terminal's terminfo entry. + */ +#define KEY_CODE_YES 0400 /* A wchar_t contains a key code */ +#define KEY_MIN 0401 /* Minimum curses key */ +#define KEY_BREAK 0401 /* Break key (unreliable) */ +#define KEY_DOWN 0402 /* Down-arrow */ +#define KEY_UP 0403 /* Up-arrow */ +#define KEY_LEFT 0404 /* Left-arrow */ +#define KEY_RIGHT 0405 /* Right-arrow */ +#define KEY_HOME 0406 /* Home key (upward+left arrow) */ +#define KEY_BACKSPACE 0407 /* Backspace (unreliable) */ +#define KEY_F0 0410 /* Function keys. Space for 64 */ +#define KEY_F(n) (KEY_F0+(n)) /* Value of function key n */ +#define KEY_DL 0510 /* Delete line */ +#define KEY_IL 0511 /* Insert line */ +#define KEY_DC 0512 /* Delete character */ +#define KEY_IC 0513 /* Insert char or enter insert mode */ +#define KEY_EIC 0514 /* Exit insert char mode */ +#define KEY_CLEAR 0515 /* Clear screen */ +#define KEY_EOS 0516 /* Clear to end of screen */ +#define KEY_EOL 0517 /* Clear to end of line */ +#define KEY_SF 0520 /* Scroll 1 line forward */ +#define KEY_SR 0521 /* Scroll 1 line backward (reverse) */ +#define KEY_NPAGE 0522 /* Next page */ +#define KEY_PPAGE 0523 /* Previous page */ +#define KEY_STAB 0524 /* Set tab */ +#define KEY_CTAB 0525 /* Clear tab */ +#define KEY_CATAB 0526 /* Clear all tabs */ +#define KEY_ENTER 0527 /* Enter or send (unreliable) */ +#define KEY_SRESET 0530 /* Soft (partial) reset (unreliable) */ +#define KEY_RESET 0531 /* Reset or hard reset (unreliable) */ +#define KEY_PRINT 0532 /* Print */ +#define KEY_LL 0533 /* Home down or bottom (lower left) */ + +/* The keypad is arranged like this: */ +/* a1 up a3 */ +/* left b2 right */ +/* c1 down c3 */ + +#define KEY_A1 0534 /* Upper left of keypad */ +#define KEY_A3 0535 /* Upper right of keypad */ +#define KEY_B2 0536 /* Center of keypad */ +#define KEY_C1 0537 /* Lower left of keypad */ +#define KEY_C3 0540 /* Lower right of keypad */ +#define KEY_BTAB 0541 /* Back tab */ +#define KEY_BEG 0542 /* Beg (beginning) */ +#define KEY_CANCEL 0543 /* Cancel */ +#define KEY_CLOSE 0544 /* Close */ +#define KEY_COMMAND 0545 /* Cmd (command) */ +#define KEY_COPY 0546 /* Copy */ +#define KEY_CREATE 0547 /* Create */ +#define KEY_END 0550 /* End */ +#define KEY_EXIT 0551 /* Exit */ +#define KEY_FIND 0552 /* Find */ +#define KEY_HELP 0553 /* Help */ +#define KEY_MARK 0554 /* Mark */ +#define KEY_MESSAGE 0555 /* Message */ +#define KEY_MOVE 0556 /* Move */ +#define KEY_NEXT 0557 /* Next */ +#define KEY_OPEN 0560 /* Open */ +#define KEY_OPTIONS 0561 /* Options */ +#define KEY_PREVIOUS 0562 /* Prev (previous) */ +#define KEY_REDO 0563 /* Redo */ +#define KEY_REFERENCE 0564 /* Ref (reference) */ +#define KEY_REFRESH 0565 /* Refresh */ +#define KEY_REPLACE 0566 /* Replace */ +#define KEY_RESTART 0567 /* Restart */ +#define KEY_RESUME 0570 /* Resume */ +#define KEY_SAVE 0571 /* Save */ +#define KEY_SBEG 0572 /* Shifted Beg (beginning) */ +#define KEY_SCANCEL 0573 /* Shifted Cancel */ +#define KEY_SCOMMAND 0574 /* Shifted Command */ +#define KEY_SCOPY 0575 /* Shifted Copy */ +#define KEY_SCREATE 0576 /* Shifted Create */ +#define KEY_SDC 0577 /* Shifted Delete char */ +#define KEY_SDL 0600 /* Shifted Delete line */ +#define KEY_SELECT 0601 /* Select */ +#define KEY_SEND 0602 /* Shifted End */ +#define KEY_SEOL 0603 /* Shifted Clear line */ +#define KEY_SEXIT 0604 /* Shifted Dxit */ +#define KEY_SFIND 0605 /* Shifted Find */ +#define KEY_SHELP 0606 /* Shifted Help */ +#define KEY_SHOME 0607 /* Shifted Home */ +#define KEY_SIC 0610 /* Shifted Input */ +#define KEY_SLEFT 0611 /* Shifted Left arrow */ +#define KEY_SMESSAGE 0612 /* Shifted Message */ +#define KEY_SMOVE 0613 /* Shifted Move */ +#define KEY_SNEXT 0614 /* Shifted Next */ +#define KEY_SOPTIONS 0615 /* Shifted Options */ +#define KEY_SPREVIOUS 0616 /* Shifted Prev */ +#define KEY_SPRINT 0617 /* Shifted Print */ +#define KEY_SREDO 0620 /* Shifted Redo */ +#define KEY_SREPLACE 0621 /* Shifted Replace */ +#define KEY_SRIGHT 0622 /* Shifted Right arrow */ +#define KEY_SRSUME 0623 /* Shifted Resume */ +#define KEY_SSAVE 0624 /* Shifted Save */ +#define KEY_SSUSPEND 0625 /* Shifted Suspend */ +#define KEY_SUNDO 0626 /* Shifted Undo */ +#define KEY_SUSPEND 0627 /* Suspend */ +#define KEY_UNDO 0630 /* Undo */ +#define KEY_MOUSE 0631 /* Mouse event has occurred */ +#define KEY_MAX 0777 /* Maximum key value */ + +/* mouse interface */ +#define NCURSES_MOUSE_VERSION 1 + +/* event masks */ +#define BUTTON1_RELEASED 000000000001L +#define BUTTON1_PRESSED 000000000002L +#define BUTTON1_CLICKED 000000000004L +#define BUTTON1_DOUBLE_CLICKED 000000000010L +#define BUTTON1_TRIPLE_CLICKED 000000000020L +#define BUTTON1_RESERVED_EVENT 000000000040L +#define BUTTON2_RELEASED 000000000100L +#define BUTTON2_PRESSED 000000000200L +#define BUTTON2_CLICKED 000000000400L +#define BUTTON2_DOUBLE_CLICKED 000000001000L +#define BUTTON2_TRIPLE_CLICKED 000000002000L +#define BUTTON2_RESERVED_EVENT 000000004000L +#define BUTTON3_RELEASED 000000010000L +#define BUTTON3_PRESSED 000000020000L +#define BUTTON3_CLICKED 000000040000L +#define BUTTON3_DOUBLE_CLICKED 000000100000L +#define BUTTON3_TRIPLE_CLICKED 000000200000L +#define BUTTON3_RESERVED_EVENT 000000400000L +#define BUTTON4_RELEASED 000001000000L +#define BUTTON4_PRESSED 000002000000L +#define BUTTON4_CLICKED 000004000000L +#define BUTTON4_DOUBLE_CLICKED 000010000000L +#define BUTTON4_TRIPLE_CLICKED 000020000000L +#define BUTTON4_RESERVED_EVENT 000040000000L +#define BUTTON_CTRL 000100000000L +#define BUTTON_SHIFT 000200000000L +#define BUTTON_ALT 000400000000L +#define ALL_MOUSE_EVENTS 000777777777L +#define REPORT_MOUSE_POSITION 001000000000L + +/* macros to extract single event-bits from masks */ +#define BUTTON_RELEASE(e, x) ((e) & (001 << (6 * ((x) - 1)))) +#define BUTTON_PRESS(e, x) ((e) & (002 << (6 * ((x) - 1)))) +#define BUTTON_CLICK(e, x) ((e) & (004 << (6 * ((x) - 1)))) +#define BUTTON_DOUBLE_CLICK(e, x) ((e) & (010 << (6 * ((x) - 1)))) +#define BUTTON_TRIPLE_CLICK(e, x) ((e) & (020 << (6 * ((x) - 1)))) +#define BUTTON_RESERVED_EVENT(e, x) ((e) & (040 << (6 * ((x) - 1)))) + +typedef unsigned long mmask_t; + +typedef struct +{ + short id; /* ID to distinguish multiple devices */ + int x, y, z; /* event coordinates (character-cell) */ + mmask_t bstate; /* button state bits */ +} +MEVENT; + +int getmouse(MEVENT *event); +int ungetmouse(MEVENT *event); +mmask_t mousemask(mmask_t newmask, mmask_t *oldmask); +bool wenclose(WINDOW *win, int y, int x); +int mouseinterval(int); + +/* Debugging : use with libncurses_g.a */ + +extern void _tracef(const char *, ...) __attribute__((format(printf,1,2))); +extern void _tracedump(char *, WINDOW *); +extern char *_traceattr(attr_t mode); +extern char *_tracechar(const unsigned char); +extern char *_tracemouse(const MEVENT *); +extern void trace(const unsigned int tracelevel); + +/* trace masks */ +#define TRACE_DISABLE 0x00 /* turn off tracing */ +#define TRACE_UPDATE 0x01 /* trace update actions, old & new screens */ +#define TRACE_MOVE 0x02 /* trace cursor moves and scrolls */ +#define TRACE_CHARPUT 0x04 /* trace all character outputs */ +#define TRACE_ORDINARY 0x07 /* trace all update actions */ +#define TRACE_CALLS 0x08 /* trace all curses calls */ +#define TRACE_VIRTPUT 0x10 /* trace virtual character puts */ +#define TRACE_FIFO 0x20 /* also fifo actions by getch() */ +#define TRACE_MAXIMUM 0xff /* maximum trace level */ + +#ifdef TRACE +extern bool no_optimize; /* suppress optimization */ +#endif /* TRACE */ + +#endif /* __NCURSES_H */ diff --git a/lib/libcurses/curses.priv.h b/lib/libcurses/curses.priv.h new file mode 100644 index 00000000000..a1e023265d1 --- /dev/null +++ b/lib/libcurses/curses.priv.h @@ -0,0 +1,270 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* + * curses.priv.h + * + * Header file for curses library objects which are private to + * the library. + * + */ + +#include <config.h> + +#if HAVE_UNISTD_H +#include <unistd.h> +#endif + +#if HAVE_LIMITS_H +# include <limits.h> +#elif HAVE_SYS_PARAM_H +# include <sys/param.h> +#endif + +#ifndef PATH_MAX +# if defined(_POSIX_PATH_MAX) +# define PATH_MAX _POSIX_PATH_MAX +# elif defined(MAXPATHLEN) +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 255 /* the Posix minimum pathsize */ +# endif +#endif + +#include <assert.h> + +#include <curses.h> /* we'll use -Ipath directive to get the right one! */ + +/* The terminfo source is assumed to be 7-bit ASCII */ +#define is7bits(c) ((unsigned)(c) < 128) + +#ifndef min +#define min(a,b) ((a) > (b) ? (b) : (a)) +#endif + +#ifndef max +#define max(a,b) ((a) < (b) ? (b) : (a)) +#endif + +/* usually in <unistd.h> */ +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif + +#ifndef STDERR_FILENO +#define STDERR_FILENO 2 +#endif + +#ifndef R_OK +#define R_OK 4 /* Test for read permission. */ +#endif +#ifndef W_OK +#define W_OK 2 /* Test for write permission. */ +#endif +#ifndef X_OK +#define X_OK 1 /* Test for execute permission. */ +#endif +#ifndef F_OK +#define F_OK 0 /* Test for existence. */ +#endif + +#define TextOf(c) ((c) & (chtype)A_CHARTEXT) +#define AttrOf(c) ((c) & (chtype)A_ATTRIBUTES) + +#define BLANK (' '|A_NORMAL) + +#define CHANGED -1 + +/* + * ht/cbt expansion flakes out randomly under Linux 1.1.47, but only when + * we're throwing control codes at the screen at high volume. To see this, + * re-enable TABS_OK and run worm for a while. Other systems probably don't + * want to define this either due to uncertainties about tab delays and + * expansion in raw mode. + */ +#undef TABS_OK /* OK to use tab/backtab for local motions? */ + +#ifdef TRACE +#define T(a) if (_nc_tracing & TRACE_CALLS) _tracef a +#define TR(n, a) if (_nc_tracing & (n)) _tracef a +#define TPUTS_TRACE(s) _nc_tputs_trace = s; +extern unsigned _nc_tracing; +extern char *_nc_tputs_trace; +extern char *_nc_visbuf(const char *); +#else +#define T(a) +#define TR(n, a) +#define TPUTS_TRACE(s) +#endif + +/* lib_acs.c */ +extern void init_acs(void); /* no prefix, this name is traditional */ + +/* lib_mvcur.c */ +extern void _nc_mvcur_init(SCREEN *sp); +extern void _nc_mvcur_wrap(void); +extern int _nc_mvcur_scrolln(int, int, int, int); + +/* lib_mouse.c */ +extern void _nc_mouse_init(SCREEN *); +extern bool _nc_mouse_event(SCREEN *); +extern bool _nc_mouse_inline(SCREEN *); +extern bool _nc_mouse_parse(int); +extern void _nc_mouse_wrap(SCREEN *); +extern void _nc_mouse_resume(SCREEN *); +extern int _nc_max_click_interval; + +/* elsewhere ... */ +extern int _nc_keypad(bool flag); +extern WINDOW *_nc_makenew(int, int, int, int); +#ifdef EXTERN_TERMINFO +#define _nc_outch _ti_outc +#endif +extern int _nc_outch(int); +extern chtype _nc_render(WINDOW *, chtype, chtype); +extern int _nc_waddch_nosync(WINDOW *, const chtype); +extern void _nc_scroll_optimize(void); +extern void _nc_scroll_window(WINDOW *, int const, short const, short const); +extern int _nc_setupscreen(short, short const); +extern void _nc_backspace(WINDOW *win); +extern void _nc_outstr(char *str); +extern void _nc_signal_handler(bool); +extern void _nc_synchook(WINDOW *win); +extern int _nc_timed_wait(int fd, int wait, int *timeleft); +extern void _nc_do_color(int, int (*)(int)); + +struct try { + struct try *child; /* ptr to child. NULL if none */ + struct try *sibling; /* ptr to sibling. NULL if none */ + unsigned char ch; /* character at this node */ + unsigned short value; /* code of string so far. 0 if none. */ +}; + +/* + * Structure for soft labels. + */ + +typedef struct { + char dirty; /* all labels have changed */ + char hidden; /* soft lables are hidden */ + WINDOW *win; + struct slk_ent { + char text[9]; /* text for the label */ + char form_text[9]; /* formatted text (left/center/...) */ + int x; /* x coordinate of this field */ + char dirty; /* this label has changed */ + char visible; /* field is visible */ + } ent[8]; +} SLK; + +#define FIFO_SIZE 32 + +struct screen { + int _ifd; /* input file ptr for screen */ + FILE *_ofp; /* output file ptr for screen */ + int _checkfd; /* filedesc for typeahead check */ +#ifdef EXTERN_TERMINFO + struct _terminal *_term; /* terminal type information */ +#else + struct term *_term; /* terminal type information */ +#endif + short _lines; /* screen lines */ + short _columns; /* screen columns */ + WINDOW *_curscr; /* current screen */ + WINDOW *_newscr; /* virtual screen to be updated to */ + WINDOW *_stdscr; /* screen's full-window context */ + struct try *_keytry; /* "Try" for use with keypad mode */ + unsigned int _fifo[FIFO_SIZE]; /* input pushback buffer */ + signed char _fifohead, /* head of fifo queue */ + _fifotail, /* tail of fifo queue */ + _fifopeek; /* where to peek for next char */ + bool _endwin; /* are we out of window mode? */ + chtype _current_attr; /* terminal attribute current set */ + bool _coloron; /* is color enabled? */ + int _cursor; /* visibility of the cursor */ + int _cursrow; /* physical cursor row */ + int _curscol; /* physical cursor column */ + bool _nl; /* True if NL -> CR/NL is on */ + bool _raw; /* True if in raw mode */ + int _cbreak; /* 1 if in cbreak mode */ + /* > 1 if in halfdelay mode */ + bool _echo; /* True if echo on */ + bool _use_meta; /* use the meta key? */ + SLK *_slk; /* ptr to soft key struct / NULL */ + int _baudrate; /* used to compute padding */ + + /* cursor movement costs; units are 10ths of milliseconds */ + int _char_padding; /* cost of character put */ + int _cr_cost; /* cost of (carriage_return) */ + int _cup_cost; /* cost of (cursor_address) */ + int _home_cost; /* cost of (cursor_home) */ + int _ll_cost; /* cost of (cursor_to_ll) */ +#ifdef TABS_OK + int _ht_cost; /* cost of (tab) */ + int _cbt_cost; /* cost of (backtab) */ +#endif /* TABS_OK */ + int _cub1_cost; /* cost of (cursor_left) */ + int _cuf1_cost; /* cost of (cursor_right) */ + int _cud1_cost; /* cost of (cursor_down) */ + int _cuu1_cost; /* cost of (cursor_up) */ + int _cub_cost; /* cost of (parm_cursor_left) */ + int _cuf_cost; /* cost of (parm_cursor_right) */ + int _cud_cost; /* cost of (parm_cursor_down) */ + int _cuu_cost; /* cost of (parm_cursor_up) */ + int _hpa_cost; /* cost of (column_address) */ + int _vpa_cost; /* cost of (row_address) */ +}; + +/* + * On systems with a broken linker, define 'SP' as a function to force the + * linker to pull in the data-only module with 'SP'. + */ +#ifndef BROKEN_LINKER +#define BROKEN_LINKER 0 +#endif + +#if BROKEN_LINKER +#define SP _nc_screen() +extern SCREEN *_nc_screen(void); +extern int _nc_alloc_screen(void); +extern void _nc_set_screen(SCREEN *); +#else +extern SCREEN *SP; +#define _nc_alloc_screen() ((SP = (SCREEN *) calloc(1, sizeof(*SP))) != NULL) +#define _nc_set_screen(sp) SP = sp +#endif + +/* + * We don't want to use the lines or columns capabilities internally, + * because if the application is running multiple screens under + * X windows, it's quite possible they could all have type xterm + * but have different sizes! So... + */ +#define screen_lines SP->_lines +#define screen_columns SP->_columns + +extern int _slk_init; /* TRUE if slk_init() called */ +extern int slk_initialize(WINDOW *, int); + +#define MAXCOLUMNS 135 +#define MAXLINES 66 +#define UNINITIALISED ((struct try * ) -1) diff --git a/lib/libcurses/delch.c b/lib/libcurses/delch.c deleted file mode 100644 index b9cdc3140ed..00000000000 --- a/lib/libcurses/delch.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)delch.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <string.h> - -#include "curses.h" - -/* - * wdelch -- - * Do an insert-char on the line, leaving (cury, curx) unchanged. - */ -int -wdelch(win) - register WINDOW *win; -{ - register __LDATA *end, *temp1, *temp2; - - end = &win->lines[win->cury]->line[win->maxx - 1]; - temp1 = &win->lines[win->cury]->line[win->curx]; - temp2 = temp1 + 1; - while (temp1 < end) { - (void)memcpy(temp1, temp2, sizeof(__LDATA)); - temp1++, temp2++; - } - temp1->ch = ' '; - temp1->attr = 0; - __touchline(win, win->cury, win->curx, win->maxx - 1, 0); - return (OK); -} diff --git a/lib/libcurses/deleteln.c b/lib/libcurses/deleteln.c deleted file mode 100644 index 4cb08ea3794..00000000000 --- a/lib/libcurses/deleteln.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)deleteln.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <string.h> - -#include "curses.h" - -/* - * wdeleteln -- - * Delete a line from the screen. It leaves (cury, curx) unchanged. - */ -int -wdeleteln(win) - register WINDOW *win; -{ - register int y, i; - register __LINE *temp; - -#ifdef DEBUG - __CTRACE("deleteln: (%0.2o)\n", win); -#endif - temp = win->lines[win->cury]; - for (y = win->cury; y < win->maxy - 1; y++) { - win->lines[y]->flags &= ~__ISPASTEOL; - win->lines[y + 1]->flags &= ~__ISPASTEOL; - if (win->orig == NULL) - win->lines[y] = win->lines[y + 1]; - else - (void) memcpy(win->lines[y]->line, - win->lines[y + 1]->line, - win->maxx * __LDATASIZE); - __touchline(win, y, 0, win->maxx - 1, 0); - } - - if (win->orig == NULL) - win->lines[y] = temp; - else - temp = win->lines[y]; - - for(i = 0; i < win->maxx; i++) { - temp->line[i].ch = ' '; - temp->line[i].attr = 0; - } - __touchline(win, y, 0, win->maxx - 1, 0); - if (win->orig == NULL) - __id_subwins(win); - return (OK); -} diff --git a/lib/libcurses/delwin.c b/lib/libcurses/delwin.c deleted file mode 100644 index 7310db8588c..00000000000 --- a/lib/libcurses/delwin.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)delwin.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <stdlib.h> - -#include "curses.h" - -/* - * delwin -- - * Delete a window and release it back to the system. - */ -int -delwin(win) - register WINDOW *win; -{ - - register WINDOW *wp, *np; - - if (win->orig == NULL) { - /* - * If we are the original window, delete the space for all - * the subwindows, the line space and the window space. - */ - free(win->lspace); - free(win->wspace); - free(win->lines); - wp = win->nextp; - while (wp != win) { - np = wp->nextp; - delwin(wp); - wp = np; - } - } else { - /* - * If we are a subwindow, take ourselves out of the list. - * NOTE: if we are a subwindow, the minimum list is orig - * followed by this subwindow, so there are always at least - * two windows in the list. - */ - for (wp = win->nextp; wp->nextp != win; wp = wp->nextp) - continue; - wp->nextp = win->nextp; - } - free(win); - return (OK); -} diff --git a/lib/libcurses/erase.c b/lib/libcurses/erase.c deleted file mode 100644 index 42ca68a35a6..00000000000 --- a/lib/libcurses/erase.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)erase.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * werase -- - * Erases everything on the window. - */ -int -werase(win) - register WINDOW *win; -{ - - register int minx, y; - register __LDATA *sp, *end, *start, *maxx; - -#ifdef DEBUG - __CTRACE("werase: (%0.2o)\n", win); -#endif - for (y = 0; y < win->maxy; y++) { - minx = -1; - start = win->lines[y]->line; - end = &start[win->maxx]; - for (sp = start; sp < end; sp++) - if (sp->ch != ' ' || sp->attr != 0) { - maxx = sp; - if (minx == -1) - minx = sp - start; - sp->ch = ' '; - sp->attr = 0; - } - if (minx != -1) - __touchline(win, y, minx, maxx - win->lines[y]->line, - 0); - } - return (OK); -} diff --git a/lib/libcurses/fullname.c b/lib/libcurses/fullname.c deleted file mode 100644 index 3d05e5d6ef8..00000000000 --- a/lib/libcurses/fullname.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 1981, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)fullname.c 8.1 (Berkeley) 6/4/93"; -#endif /* not lint */ - -/* - * fullname -- - * This routine fills in "def" with the full name of the terminal. - * This is assumed to be the last name in the list of aliases. - */ -char * -fullname(bp, def) - register char *bp, *def; -{ - register char *cp; - - *def = '\0'; /* In case no name. */ - - while (*bp && *bp != ':') { - cp = def; /* Start of answer. */ - while (*bp && *bp != ':' && *bp != '|') - *cp++ = *bp++; /* Copy name over. */ - *cp = '\0'; /* Zero end of name. */ - if (*bp == '|') - bp++; /* Skip over '|' if that is case. */ - } - return (def); -} diff --git a/lib/libcurses/getch.c b/lib/libcurses/getch.c deleted file mode 100644 index 6108229708d..00000000000 --- a/lib/libcurses/getch.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)getch.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * wgetch -- - * Read in a character from the window. - */ -int -wgetch(win) - register WINDOW *win; -{ - register int inp, weset; - - if (!(win->flags & __SCROLLOK) && (win->flags & __FULLWIN) - && win->curx == win->maxx - 1 && win->cury == win->maxy - 1) - return (ERR); -#ifdef DEBUG - __CTRACE("wgetch: __echoit = %d, __rawmode = %d\n", - __echoit, __rawmode); -#endif - if (__echoit && !__rawmode) { - cbreak(); - weset = 1; - } else - weset = 0; - - inp = getchar(); -#ifdef DEBUG - __CTRACE("wgetch got '%s'\n", unctrl(inp)); -#endif - if (__echoit) { - mvwaddch(curscr, - win->cury + win->begy, win->curx + win->begx, inp); - waddch(win, inp); - } - if (weset) - nocbreak(); - return (inp); -} diff --git a/lib/libcurses/getstr.c b/lib/libcurses/getstr.c deleted file mode 100644 index daf8e61b7fd..00000000000 --- a/lib/libcurses/getstr.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)getstr.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * wgetstr -- - * Get a string starting at (cury, curx). - */ -int -wgetstr(win, str) - register WINDOW *win; - register char *str; -{ - while ((*str = wgetch(win)) != ERR && *str != '\n') - str++; - if (*str == ERR) { - *str = '\0'; - return (ERR); - } - *str = '\0'; - return (OK); -} diff --git a/lib/libcurses/hardscroll.c b/lib/libcurses/hardscroll.c new file mode 100644 index 00000000000..73d185b199e --- /dev/null +++ b/lib/libcurses/hardscroll.c @@ -0,0 +1,420 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/****************************************************************************** + +NAME + hardscroll.c -- hardware-scrolling optimization for ncurses + +SYNOPSIS + void _nc_scroll_optimize(void) + +DESCRIPTION + OVERVIEW + +This algorithm for computes optimum hardware scrolling to transform an +old screen (curscr) into a new screen (newscr) via vertical line moves. + +Because the screen has a `grain' (there are insert/delete/scroll line +operations but no insert/delete/scroll column operations), it is efficient +break the update algorithm into two pieces: a first stage that does only line +moves, optimizing the end product of user-invoked insertions, deletions, and +scrolls; and a second phase (corresponding to the present doupdate code in +ncurses) that does only line transformations. + +The common case we want hardware scrolling for is to handle line insertions +and deletions in screen-oriented text-editors. This two-stage approach will +accomplish that at a low computation and code-size cost. + + LINE-MOVE COMPUTATION + +Now, to a discussion of the line-move computation. + +For expository purposes, consider the screen lines to be represented by +integers 0..23 (with the understanding that the value of 23 may vary). +Let a new line introduced by insertion, scrolling, or at the bottom of +the screen following a line delete be given the index -1. + +Assume that the real screen starts with lines 0..23. Now, we have +the following possible line-oriented operations on the screen: + +Insertion: inserts a line at a given screen row, forcing all lines below +to scroll forward. The last screen line is lost. For example, an insertion +at line 5 would produce: 0..4 -1 5..23. + +Deletion: deletes a line at a given screen row, forcing all lines below +to scroll forward. The last screen line is made new. For example, a deletion +at line 7 would produce: 0..6 8..23 -1. + +Scroll up: move a range of lines up 1. The bottom line of the range +becomes new. For example, scrolling up the region from 9 to 14 will +produce 0..8 10..14 -1 15..23. + +Scroll down: move a range of lines down 1. The top line of the range +becomes new. For example, scrolling down the region from 12 to 16 will produce +0..11 -1 12..15 17..23. + +Now, an obvious property of all these operations is that they preserve the +order of old lines, though not their position in the sequence. + +The key trick of this algorithm is that the original line indices described +above are actually maintained as _line[].oldindex fields in the window +structure, and stick to each line through scroll and insert/delete operations. + +Thus, it is possible at update time to look at the oldnum fields and compute +an optimal set of il/dl/scroll operations that will take the real screen +lines to the virtual screen lines. Once these vertical moves have been done, +we can hand off to the second stage of the update algorithm, which does line +transformations. + +Note that the move computation does not need to have the full generality +of a diff algorithm (which it superficially resembles) because lines cannot +be moved out of order. + + THE ALGORITHM + +First, mark each line on the real screen that is *not* carried over to the +virtual screen discarded (that is, with a -1 oldnum index). + +Second, optionally run through each virtual line with a non -1 oldnum. If the +line is sufficiently changed, mark it -1 (we don't want to move it). The exact +test for "sufficiently changed" is not relevant to the control flow of this +algorithm. Cases the test should detect are those in which rewriting +the line from whatever might be on the real screen would be cheaper than the +move. Blank lines on a terminal with clear-to-eol probably meet this test. + +Here is pseudo-code for the remainder of the algorithm: + + repeat +1: first = 0; +2: no_hunk_moved = TRUE; + + # on each pass, try to find a movable hunk +3: while (first < screen_depth) + + # scan for start of hunk +4: while (oldnum field of first == -1) + first++ + + # if we have no hunk, quit this pass +5: if (first >= screen_depth) + break; + + # we found a hunk +6: last = (end of longest continues oldnum range starting here) + +7: ofirst = (first line's oldnum, where it was on real screen) +8: olast = (last line's oldnum, where it was on real screen) + + # figure the hunk's displacement +9: disp = first - (first virtual line's oldnum field) + + # does the hunk want to move? +10: if (disp != 0) + # is the hunk movable without destroying info? +11: if (real [ofirst+disp, olast+disp] are all in range or DISCARDED) +12: if (disp > 0) +13: scroll real [ofirst, olast+disp] down by disp + (mark [ofirst, olast+disp] DISCARDED) +14: else if (disp < 0) +15: scroll real [ofirst+disp, olast] up by disp + (mark [ofirst+disp, olast] DISCARDED) +16: no_hunk_moved = FALSE + + # done trying to move this hunk +17: first = last + 1; + end while + until +18: no_hunk_moved; # quit when a complete pass finds no movable hunks + +HOW TO TEST THIS: + +Use the following production: + +hardscroll: hardscroll.c + $(CC) -g -DMAINDEBUG hardscroll.c -o hardscroll + +Then just type scramble vectors and watch. The following test loads are +a representative sample of cases: + +----------------------------- CUT HERE ------------------------------------ +# No lines moved + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 +# +# A scroll up + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 -1 +# +# A scroll down +-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 +# +# An insertion (after line 12) + 0 1 2 3 4 5 6 7 8 9 10 11 12 -1 13 14 15 16 17 18 19 20 21 22 +# +# A simple deletion (line 10) + 0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 21 22 23 -1 +# +# A more complex case +-1 -1 -1 -1 -1 3 4 5 6 7 -1 -1 8 9 10 11 12 13 14 15 16 17 -1 -1 +----------------------------- CUT HERE ------------------------------------ + +AUTHOR + Eric S. Raymond <esr@snark.thyrsus.com>, November 1994 + +*****************************************************************************/ + +#include "curses.priv.h" + +#include <stdlib.h> +#include <string.h> + +#if defined(TRACE) || defined(MAINDEBUG) +static void linedump(void); +#endif /* defined(TRACE) || defined(MAINDEBUG) */ + +/* if only this number of lines is carried over, nuke the screen and redraw */ +#define CLEAR_THRESHOLD 3 + +#ifdef MAINDEBUG +#define LINES 24 +static int oldnums[LINES], reallines[LINES]; +#define OLDNUM(n) oldnums[n] +#define REAL(m) reallines[m] +#undef T +#define T(x) (void) printf x ; (void) putchar('\n'); +#else +#include <curses.h> +#define OLDNUM(n) newscr->_line[n].oldindex +#define REAL(m) curscr->_line[m].oldindex +#ifndef _NEWINDEX +#define _NEWINDEX -1 +#endif /* _NEWINDEX */ +#endif /* MAINDEBUG */ + +static bool all_discarded(int const top, int const bottom, int const disp) +/* has the given range of real lines been marked discarded? */ +{ + int n; + + for (n = top + disp; n <= bottom + disp; n++) + if (REAL(n) != _NEWINDEX && !(REAL(n) <= bottom && REAL(n) >= top)) + return(FALSE); + + return(TRUE); +} + +void _nc_scroll_optimize(void) +/* scroll optimization to transform curscr to newscr */ +{ + bool no_hunk_moved; /* no hunk moved on this pass? */ + int n, new_lines; +#if defined(TRACE) || defined(MAINDEBUG) + int pass = 0; +#endif /* defined(TRACE) || defined(MAINDEBUG) */ + + TR(TRACE_CALLS, ("_nc_scroll_optimize() begins")); + + /* mark any line not carried over with _NEWINDEX */ + for (n = 0; n < LINES; n++) + REAL(n) += (MAXLINES + 1); + for (n = 0; n < LINES; n++) + if (OLDNUM(n) != _NEWINDEX + && REAL(OLDNUM(n)) >= MAXLINES) + REAL(OLDNUM(n)) -= (MAXLINES + 1); + for (n = new_lines = 0; n < LINES; n++) + if (REAL(n) > MAXLINES) + { + REAL(n) = _NEWINDEX; + new_lines++; + } + + /* + * ^F in vi (which scrolls forward by LINES-2 in the file) exposes + * a weakness in this design. Ideally, vertical motion + * optimization should cost its actions and then force a + * ClrUpdate() and complete redraw if that would be faster than + * the scroll. Unfortunately, this would be a serious pain to + * arrange; hence, this hack. If there are few enough lines + * carried over, don't bother with the scrolling, we just nuke the + * screen and redraw the whole thing. Keith Bostic argues that + * this will be a win on strictly visual grounds even if the + * resulting update is theoretically sub-optimal. Experience + * with vi says he's probably right. + */ + if (LINES - new_lines <= CLEAR_THRESHOLD) + { + T(("too few lines carried over, nuking screen")); +#ifndef MAINDEBUG + clearok(stdscr, TRUE); +#endif /* MAINDEBUG */ + return; + } + +#ifdef TRACE + TR(TRACE_UPDATE | TRACE_MOVE, ("After real line marking:")); + if (_nc_tracing & (TRACE_UPDATE | TRACE_MOVE)) + linedump(); +#endif /* TRACE */ + + /* time to shuffle lines to do scroll optimization */ + do { + int first; /* first line of current hunk */ + int last; /* last line of current hunk */ + int ofirst; /* oldnum index of first line */ + int olast; /* oldnum index of last line */ + int disp; /* hunk displacement */ + + TR(TRACE_UPDATE | TRACE_MOVE, ("Pass %d:", pass++)); + + first = 0; /* start scan at top line */ + no_hunk_moved = TRUE; + + while (first < LINES) + { + /* find the beginning of a hunk */ + while (first < LINES && OLDNUM(first) == _NEWINDEX) + first++; + if (first >= LINES) + break; + + /* find the end of the hunk */ + for (last = first; last < LINES; last++) + if (last == LINES - 1 || OLDNUM(last + 1) != OLDNUM(last) + 1) + break; + + /* find the corresponding range on the old screen */ + ofirst = OLDNUM(first); + olast = OLDNUM(last); + + /* compute the hunk's displacement */ + disp = first - OLDNUM(first); + + TR(TRACE_UPDATE | TRACE_MOVE, ("found hunk: first = %2d, last = %2d, ofirst = %2d, olast = %2d, disp = %2d", + first, last, ofirst, olast, disp)); + + /* OK, time to try to move the hunk? */ + if (disp != 0) + if (all_discarded(ofirst, olast, disp)) + { + int m; + + if (disp > 0) + olast += disp; + else /* (disp < 0) */ + ofirst += disp; + + TR(TRACE_UPDATE | TRACE_MOVE, ("scroll [%d, %d] by %d", ofirst, olast, -disp)); +#ifndef MAINDEBUG + (void) _nc_mvcur_scrolln(-disp, ofirst, olast, LINES - 1); + _nc_scroll_window(curscr, -disp, ofirst, olast); +#endif /* MAINDEBUG */ + + for (m = ofirst; m <= olast; m++) + { + REAL(m) = _NEWINDEX; +#ifndef MAINDEBUG + /* + * This will tell the second stage of the optimizer + * that every line in the hunk on the real screen has + * been changed. + */ + curscr->_line[m].firstchar = 0; + curscr->_line[m].lastchar = curscr->_maxx; +#endif /* MAINDEBUG */ + } + for (m = first; m <= last; m++) + OLDNUM(m) = _NEWINDEX; + + no_hunk_moved = FALSE; + } + + /* OK, done with this hunk */ + first = last + 1; + } + } while + (!no_hunk_moved); +} + +#if defined(TRACE) || defined(MAINDEBUG) +static void linedump(void) +/* dump the state of the real and virtual oldnum fields */ +{ + int n; + char buf[BUFSIZ]; + + (void) strcpy(buf, "real"); + for (n = 0; n < LINES; n++) + (void) sprintf(buf + strlen(buf), " %02d", REAL(n)); + TR(TRACE_UPDATE | TRACE_MOVE, (buf)); + + (void) strcpy(buf, "virt"); + for (n = 0; n < LINES; n++) + (void) sprintf(buf + strlen(buf), " %02d", OLDNUM(n)); + TR(TRACE_UPDATE | TRACE_MOVE, (buf)); +} +#endif /* defined(TRACE) || defined(MAINDEBUG) */ + +#ifdef MAINDEBUG + +main() +{ + char line[BUFSIZ], *st; + + _nc_tracing = TRACE_MOVE; + for (;;) + { + int n; + + for (n = 0; n < LINES; n++) + { + reallines[n] = n; + oldnums[n] = _NEWINDEX; + } + + /* grab the test vector */ + if (fgets(line, sizeof(line), stdin) == (char *)NULL) + exit(0); + + /* parse it */ + n = 0; + if (line[0] == '#') + { + (void) fputs(line, stderr); + continue; + } + st = strtok(line, " "); + do { + oldnums[n++] = atoi(st); + } while + (st = strtok((char *)NULL, " ")); + + /* display it */ + (void) fputs("Initial input:\n", stderr); + linedump(); + + _nc_scroll_optimize(); + } +} + +#endif /* MAINDEBUG */ + +/* hardscroll.c ends here */ + diff --git a/lib/libcurses/id_subwins.c b/lib/libcurses/id_subwins.c deleted file mode 100644 index 3528348ff46..00000000000 --- a/lib/libcurses/id_subwins.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)id_subwins.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * __id_subwins -- - * Re-sync the pointers to lines for all the subwindows. - */ -void -__id_subwins(orig) - register WINDOW *orig; -{ - register WINDOW *win; - register int oy, realy, y; - - realy = orig->begy + orig->cury; - for (win = orig->nextp; win != orig; win = win->nextp) { - /* - * If the window ends before our current position, don't need - * to do anything. - */ - if (win->begy + win->maxy <= realy) - continue; - - oy = orig->cury; - for (y = realy - win->begy; y < win->maxy; y++, oy++) - win->lines[y]->line = - &orig->lines[oy]->line[win->ch_off]; - } -} diff --git a/lib/libcurses/idlok.c b/lib/libcurses/idlok.c deleted file mode 100644 index 4d3bb592697..00000000000 --- a/lib/libcurses/idlok.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)idlok.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * idlok -- - * Turn on and off using insert/deleteln sequences for the - * given window. - */ -void -idlok(win, bf) - WINDOW *win; - int bf; -{ - if (bf) - win->flags |= __IDLINE; - else - win->flags &= ~__IDLINE; -} diff --git a/lib/libcurses/initscr.c b/lib/libcurses/initscr.c deleted file mode 100644 index 1af8b6f34ea..00000000000 --- a/lib/libcurses/initscr.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)initscr.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <signal.h> -#include <stdlib.h> - -#include "curses.h" - -/* - * initscr -- - * Initialize the current and standard screen. - */ -WINDOW * -initscr() -{ - register char *sp; - -#ifdef DEBUG - __CTRACE("initscr\n"); -#endif - __echoit = 1; - __pfast = __rawmode = __noqch = 0; - - if (gettmode() == ERR) - return (NULL); - - /* - * If My_term is set, or can't find a terminal in the environment, - * use Def_term. - */ - if (My_term || (sp = getenv("TERM")) == NULL) - sp = Def_term; - if (setterm(sp) == ERR) - return (NULL); - - /* Need either homing or cursor motion for refreshes */ - if (!HO && !CM) - return (NULL); - - if (curscr != NULL) - delwin(curscr); - if ((curscr = newwin(LINES, COLS, 0, 0)) == ERR) - return (NULL); - clearok(curscr, 1); - - if (stdscr != NULL) - delwin(stdscr); - if ((stdscr = newwin(LINES, COLS, 0, 0)) == ERR) { - delwin(curscr); - return (NULL); - } - - __set_stophandler(); - -#ifdef DEBUG - __CTRACE("initscr: LINES = %d, COLS = %d\n", LINES, COLS); -#endif - __startwin(); - - return (stdscr); -} diff --git a/lib/libcurses/insch.c b/lib/libcurses/insch.c deleted file mode 100644 index 36cc0dee894..00000000000 --- a/lib/libcurses/insch.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)insch.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <string.h> - -#include "curses.h" - -/* - * winsch -- - * Do an insert-char on the line, leaving (cury, curx) unchanged. - */ -int -winsch(win, ch) - register WINDOW *win; - int ch; -{ - - register __LDATA *end, *temp1, *temp2; - - end = &win->lines[win->cury]->line[win->curx]; - temp1 = &win->lines[win->cury]->line[win->maxx - 1]; - temp2 = temp1 - 1; - while (temp1 > end) { - (void)memcpy(temp1, temp2, sizeof(__LDATA)); - temp1--, temp2--; - } - temp1->ch = ch; - temp1->attr &= ~__STANDOUT; - __touchline(win, win->cury, win->curx, win->maxx - 1, 0); - if (win->cury == LINES - 1 && - (win->lines[LINES - 1]->line[COLS - 1].ch != ' ' || - win->lines[LINES -1]->line[COLS - 1].attr != 0)) - if (win->flags & __SCROLLOK) { - wrefresh(win); - scroll(win); - win->cury--; - } else - return (ERR); - return (OK); -} diff --git a/lib/libcurses/insertln.c b/lib/libcurses/insertln.c deleted file mode 100644 index c2179f0f187..00000000000 --- a/lib/libcurses/insertln.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)insertln.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <string.h> - -#include "curses.h" - -/* - * winsertln -- - * Do an insert-line on the window, leaving (cury, curx) unchanged. - */ -int -winsertln(win) - register WINDOW *win; -{ - - register int y, i; - register __LINE *temp; - -#ifdef DEBUG - __CTRACE("insertln: (%0.2o)\n", win); -#endif - if (win->orig == NULL) - temp = win->lines[win->maxy - 1]; - for (y = win->maxy - 1; y > win->cury; --y) { - win->lines[y]->flags &= ~__ISPASTEOL; - win->lines[y - 1]->flags &= ~__ISPASTEOL; - if (win->orig == NULL) - win->lines[y] = win->lines[y - 1]; - else - (void)memcpy(win->lines[y]->line, - win->lines[y - 1]->line, - win->maxx * __LDATASIZE); - __touchline(win, y, 0, win->maxx - 1, 0); - } - if (win->orig == NULL) - win->lines[y] = temp; - else - temp = win->lines[y]; - for(i = 0; i < win->maxx; i++) { - temp->line[i].ch = ' '; - temp->line[i].attr = 0; - } - __touchline(win, y, 0, win->maxx - 1, 0); - if (win->orig == NULL) - __id_subwins(win); - return (OK); -} diff --git a/lib/libcurses/keys.list b/lib/libcurses/keys.list new file mode 100644 index 00000000000..f9e3dd657c8 --- /dev/null +++ b/lib/libcurses/keys.list @@ -0,0 +1,150 @@ +key_a1 KEY_A1 +key_a3 KEY_A3 +key_b2 KEY_B2 +key_backspace KEY_BACKSPACE +key_beg KEY_BEG +key_btab KEY_BTAB +key_c1 KEY_C1 +key_c3 KEY_C3 +key_cancel KEY_CANCEL +key_catab KEY_CATAB +key_clear KEY_CLEAR +key_close KEY_CLOSE +key_command KEY_COMMAND +key_copy KEY_COPY +key_create KEY_CREATE +key_ctab KEY_CTAB +key_dc KEY_DC +key_dl KEY_DL +key_down KEY_DOWN +key_eic KEY_EIC +key_end KEY_END +key_enter KEY_ENTER +key_eol KEY_EOL +key_eos KEY_EOS +key_exit KEY_EXIT +key_f0 KEY_F(0) +key_f1 KEY_F(1) +key_f2 KEY_F(2) +key_f3 KEY_F(3) +key_f4 KEY_F(4) +key_f5 KEY_F(5) +key_f6 KEY_F(6) +key_f7 KEY_F(7) +key_f8 KEY_F(8) +key_f9 KEY_F(9) +key_f10 KEY_F(10) +key_f11 KEY_F(11) +key_f12 KEY_F(12) +key_f13 KEY_F(13) +key_f14 KEY_F(14) +key_f15 KEY_F(15) +key_f16 KEY_F(16) +key_f17 KEY_F(17) +key_f18 KEY_F(18) +key_f19 KEY_F(19) +key_f20 KEY_F(20) +key_f21 KEY_F(21) +key_f22 KEY_F(22) +key_f23 KEY_F(23) +key_f24 KEY_F(24) +key_f25 KEY_F(25) +key_f26 KEY_F(26) +key_f27 KEY_F(27) +key_f28 KEY_F(28) +key_f29 KEY_F(29) +key_f30 KEY_F(30) +key_f31 KEY_F(31) +key_f32 KEY_F(32) +key_f33 KEY_F(33) +key_f34 KEY_F(34) +key_f35 KEY_F(35) +key_f36 KEY_F(36) +key_f37 KEY_F(37) +key_f38 KEY_F(38) +key_f39 KEY_F(39) +key_f40 KEY_F(40) +key_f41 KEY_F(41) +key_f42 KEY_F(42) +key_f43 KEY_F(43) +key_f44 KEY_F(44) +key_f45 KEY_F(45) +key_f46 KEY_F(46) +key_f47 KEY_F(47) +key_f48 KEY_F(48) +key_f49 KEY_F(49) +key_f50 KEY_F(50) +key_f51 KEY_F(51) +key_f52 KEY_F(52) +key_f53 KEY_F(53) +key_f54 KEY_F(54) +key_f55 KEY_F(55) +key_f56 KEY_F(56) +key_f57 KEY_F(57) +key_f58 KEY_F(58) +key_f59 KEY_F(59) +key_f60 KEY_F(60) +key_f61 KEY_F(61) +key_f62 KEY_F(62) +key_f63 KEY_F(63) +key_find KEY_FIND +key_help KEY_HELP +key_home KEY_HOME +key_ic KEY_IC +key_il KEY_IL +key_left KEY_LEFT +key_ll KEY_LL +key_mark KEY_MARK +key_message KEY_MESSAGE +key_move KEY_MOVE +key_next KEY_NEXT +key_npage KEY_NPAGE +key_open KEY_OPEN +key_options KEY_OPTIONS +key_ppage KEY_PPAGE +key_previous KEY_PREVIOUS +key_print KEY_PRINT +key_redo KEY_REDO +key_reference KEY_REFERENCE +key_refresh KEY_REFRESH +key_replace KEY_REPLACE +key_restart KEY_RESTART +key_resume KEY_RESUME +key_right KEY_RIGHT +key_save KEY_SAVE +key_sbeg KEY_SBEG +key_scancel KEY_SCANCEL +key_scommand KEY_SCOMMAND +key_scopy KEY_SCOPY +key_screate KEY_SCREATE +key_sdc KEY_SDC +key_sdl KEY_SDL +key_select KEY_SELECT +key_send KEY_SEND +key_seol KEY_SEOL +key_sexit KEY_SEXIT +key_sf KEY_SF +key_sfind KEY_SFIND +key_shelp KEY_SHELP +key_shome KEY_SHOME +key_sic KEY_SIC +key_sleft KEY_SLEFT +key_smessage KEY_SMESSAGE +key_smove KEY_SMOVE +key_snext KEY_SNEXT +key_soptions KEY_SOPTIONS +key_sprevious KEY_SPREVIOUS +key_sprint KEY_SPRINT +key_sr KEY_SR +key_sredo KEY_SREDO +key_sreplace KEY_SREPLACE +key_sright KEY_SRIGHT +key_srsume KEY_SRSUME +key_ssave KEY_SSAVE +key_ssuspend KEY_SSUSPEND +key_stab KEY_STAB +key_sundo KEY_SUNDO +key_suspend KEY_SUSPEND +key_undo KEY_UNDO +key_up KEY_UP +key_mouse KEY_MOUSE diff --git a/lib/libcurses/lib_acs.c b/lib/libcurses/lib_acs.c new file mode 100644 index 00000000000..ba867d7cc73 --- /dev/null +++ b/lib/libcurses/lib_acs.c @@ -0,0 +1,113 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +#include "curses.priv.h" +#include "term.h" /* ena_acs, acs_chars */ +#include <string.h> + +chtype acs_map[128]; + +void init_acs(void) +{ + T(("initializing ACS map")); + + /* + * Initializations for a UNIX-like multi-terminal environment. Use + * ASCII chars and count on the terminfo description to do better. + */ + ACS_ULCORNER = '+'; /* should be upper left corner */ + ACS_LLCORNER = '+'; /* should be lower left corner */ + ACS_URCORNER = '+'; /* should be upper right corner */ + ACS_LRCORNER = '+'; /* should be lower right corner */ + ACS_RTEE = '+'; /* should be tee pointing left */ + ACS_LTEE = '+'; /* should be tee pointing right */ + ACS_BTEE = '+'; /* should be tee pointing up */ + ACS_TTEE = '+'; /* should be tee pointing down */ + ACS_HLINE = '-'; /* should be horizontal line */ + ACS_VLINE = '|'; /* should be vertical line */ + ACS_PLUS = '+'; /* should be large plus or crossover */ + ACS_S1 = '~'; /* should be scan line 1 */ + ACS_S9 = '_'; /* should be scan line 9 */ + ACS_DIAMOND = '+'; /* should be diamond */ + ACS_CKBOARD = ':'; /* should be checker board (stipple) */ + ACS_DEGREE = '\''; /* should be degree symbol */ + ACS_PLMINUS = '#'; /* should be plus/minus */ + ACS_BULLET = 'o'; /* should be bullet */ + ACS_LARROW = '<'; /* should be arrow pointing left */ + ACS_RARROW = '>'; /* should be arrow pointing right */ + ACS_DARROW = 'v'; /* should be arrow pointing down */ + ACS_UARROW = '^'; /* should be arrow pointing up */ + ACS_BOARD = '#'; /* should be board of squares */ + ACS_LANTERN = '#'; /* should be lantern symbol */ + ACS_BLOCK = '#'; /* should be solid square block */ + /* these defaults were invented for ncurses */ + ACS_S3 = '-'; /* should be scan line 3 */ + ACS_S7 = '-'; /* should be scan line 7 */ + ACS_LEQUAL = '<'; /* should be less-than-or-equal-to */ + ACS_GEQUAL = '>'; /* should be greater-than-or-equal-to */ + ACS_PI = '*'; /* should be greek pi */ + ACS_NEQUAL = '!'; /* should be not-equal */ + ACS_STERLING = 'f'; /* should be pound-sterling symbol */ + +#ifdef ena_acs + if (ena_acs != NULL) + { + TPUTS_TRACE("ena_acs"); + putp(ena_acs); + } +#endif /* ena_acs */ + +#ifdef acs_chars +#define ALTCHAR(c) ((chtype)(c) & A_CHARTEXT) | A_ALTCHARSET + + if (acs_chars != NULL) { + size_t i = 0; + size_t length = strlen(acs_chars); + + while (i < length) + switch (acs_chars[i]) { + case 'l':case 'm':case 'k':case 'j': + case 'u':case 't':case 'v':case 'w': + case 'q':case 'x':case 'n':case 'o': + case 's':case '`':case 'a':case 'f': + case 'g':case '~':case ',':case '+': + case '.':case '-':case 'h':case 'I': + case '0':case 'p':case 'r':case 'y': + case 'z':case '{':case '|':case '}': + acs_map[(unsigned int)acs_chars[i]] = + ALTCHAR(acs_chars[i+1]); + i++; + /* FALLTHRU */ + default: + i++; + break; + } + } +#ifdef TRACE + else { + T(("acsc not defined, using default mapping")); + } +#endif /* TRACE */ +#endif /* acs_char */ +} + diff --git a/lib/libcurses/lib_addch.c b/lib/libcurses/lib_addch.c new file mode 100644 index 00000000000..005c5bfbd22 --- /dev/null +++ b/lib/libcurses/lib_addch.c @@ -0,0 +1,287 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_addch.c +** +** The routines waddch(), wattr_on(), wattr_off(), wchgat(). +** +*/ + +#include "curses.priv.h" +#include <ctype.h> +#include "unctrl.h" + +#define ALL_BUT_COLOR ((chtype)~(A_COLOR)) + +int wattr_on(WINDOW *win, const attr_t at) +{ + T(("wattr_on(%p,%s) current = %s", win, _traceattr(at), _traceattr(win->_attrs))); + if (PAIR_NUMBER(at) > 0x00) { + win->_attrs = (win->_attrs & ALL_BUT_COLOR) | at ; + T(("new attribute is %s", _traceattr(win->_attrs))); + } else { + win->_attrs |= at; + T(("new attribute is %s", _traceattr(win->_attrs))); + } + return OK; +} + +int wattr_off(WINDOW *win, const attr_t at) +{ +#define IGNORE_COLOR_OFF FALSE + + T(("wattr_off(%p,%s) current = %s", win, _traceattr(at), _traceattr(win->_attrs))); + if (IGNORE_COLOR_OFF == TRUE) { + if (PAIR_NUMBER(at) == 0xff) /* turn off color */ + win->_attrs &= ~at; + else /* leave color alone */ + win->_attrs &= ~(at|ALL_BUT_COLOR); + } else { + if (PAIR_NUMBER(at) > 0x00) /* turn off color */ + win->_attrs &= ~at; + else /* leave color alone */ + win->_attrs &= ~(at|ALL_BUT_COLOR); + } + T(("new attribute is %s", _traceattr(win->_attrs))); + return OK; +} + +int wchgat(WINDOW *win, int n, attr_t attr, short color, const void *opts) +{ + int i; + + for (i = win->_curx; i <= win->_maxx && (n == -1 || (n-- > 0)); i++) + win->_line[win->_cury].text[i] + = (win->_line[win->_cury].text[i] & A_CHARTEXT) + | attr + | COLOR_PAIR(color); + + return OK; +} + +/* + * Ugly microtweaking alert. Everything from here to end of module is + * likely to be speed-critical -- profiling data sure says it is! + * Most of the important screen-painting functions are shells around + * waddch(). So we make every effort to reduce function-call overhead + * by inlining stuff, even at the cost of making wrapped copies for + * export. Also we supply some internal versions that don't call the + * window sync hook, for use by string-put functions. + */ + +static __inline chtype render_char(WINDOW *win, chtype oldch, chtype newch) +/* compute a rendition of the given char correct for the current context */ +{ + if ((oldch & A_CHARTEXT) == ' ') + newch |= win->_bkgd; + else if (!(newch & A_ATTRIBUTES)) + newch |= (win->_bkgd & A_ATTRIBUTES); + TR(TRACE_VIRTPUT, ("bkg = %lx -> ch = %lx", win->_bkgd, newch)); + + return(newch); +} + +chtype _nc_render(WINDOW *win, chtype oldch, chtype newch) +/* make render_char() visible while still allowing us to inline it below */ +{ + return(render_char(win, oldch, newch)); +} + +/* actions needed to process a newline within addch_nosync() */ +#define DO_NEWLINE x = 0; \ + win->_flags &= ~_NEED_WRAP; \ + y++; \ + if (y > win->_regbottom) { \ + y--; \ + if (win->_scroll) \ + scroll(win); \ + } + +/* check if position is legal; if not, return error */ +#define CHECK_POSITION(win, x, y) \ + if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) { \ + TR(TRACE_VIRTPUT, ("Alert! Win=%p _curx = %d, _cury = %d " \ + "(_maxx = %d, _maxy = %d)", win, x, y, \ + win->_maxx, win->_maxy)); \ + win->_curx = win->_cury = 0; \ + win->_flags &= ~_NEED_WRAP; \ + return(ERR); \ + } + +static __inline +int waddch_literal(WINDOW *win, chtype ch) +{ +register int x, y; + + x = win->_curx; + y = win->_cury; + + CHECK_POSITION(win, x, y); + + if (win->_flags & _NEED_WRAP) { + TR(TRACE_MOVE, ("new char when NEED_WRAP set at %d,%d",y,x)); + DO_NEWLINE + } + + /* + * We used to pass in + * win->_line[y].text[x] + * as a second argument, but the value of the old character + * is not relevant here. + */ + ch = render_char(win, 0, ch); + + TR(TRACE_VIRTPUT, ("win attr = %s", _traceattr(win->_attrs))); + ch |= win->_attrs; + + if (win->_line[y].text[x] != ch) { + if (win->_line[y].firstchar == _NOCHANGE) + win->_line[y].firstchar = win->_line[y].lastchar = x; + else if (x < win->_line[y].firstchar) + win->_line[y].firstchar = x; + else if (x > win->_line[y].lastchar) + win->_line[y].lastchar = x; + + } + + win->_line[y].text[x++] = ch; + TR(TRACE_VIRTPUT, ("(%d, %d) = %s | %s", + y, x, + _tracechar((unsigned char)(ch & A_CHARTEXT)), + _traceattr((ch & (chtype)A_ATTRIBUTES)))); + if (x > win->_maxx) { + TR(TRACE_MOVE, ("NEED_WRAP set at %d,%d",y,x)); + win->_flags |= _NEED_WRAP; + x--; + } + + win->_curx = x; + win->_cury = y; + + return OK; +} + +static __inline +int waddch_nosync(WINDOW *win, const chtype c) +/* the workhorse function -- add a character to the given window */ +{ +register chtype ch = c; +register int x, y; +int newx; + + x = win->_curx; + y = win->_cury; + + CHECK_POSITION(win, x, y); + + if (ch & A_ALTCHARSET) + goto noctrl; + + switch ((int)(ch&A_CHARTEXT)) { + case '\t': + if (win->_flags & _NEED_WRAP) { + x = 0; + newx = min(TABSIZE, win->_maxx+1); + } else + newx = min(x + (TABSIZE-(x%TABSIZE)), win->_maxx+1); + while (win->_curx < newx) { + if (waddch_literal(win, ' ' | (ch&A_ATTRIBUTES)) == ERR) + return(ERR); + } + return(OK); + case '\n': + wclrtoeol(win); + DO_NEWLINE + break; + case '\r': + x = 0; + win->_flags &= ~_NEED_WRAP; + break; + case '\b': + if (win->_flags & _NEED_WRAP) + win->_flags &= ~_NEED_WRAP; + else if (--x < 0) + x = 0; + break; + default: + if (is7bits(ch & A_CHARTEXT) && iscntrl(ch & A_CHARTEXT)) + return(waddstr(win, unctrl((unsigned char)ch))); + + /* FALLTHRU */ + noctrl: + waddch_literal(win, ch); + return(OK); + } + + win->_curx = x; + win->_cury = y; + + return(OK); +} + +#undef DO_NEWLINE + +int _nc_waddch_nosync(WINDOW *win, const chtype c) +/* export copy of waddch_nosync() so the string-put functions can use it */ +{ + return(waddch_nosync(win, c)); +} + +/* + * The versions below call _nc_synhook(). We wanted to avoid this in the + * version exported for string puts; they'll call _nc_synchook once at end + * of run. + */ + +/* These are actual entry points */ + +int waddch(WINDOW *win, const chtype ch) +{ + TR(TRACE_VIRTPUT, ("waddch(%p, %s | %s) called", win, + _tracechar((unsigned char)(ch & A_CHARTEXT)), + _traceattr((ch & (chtype)A_ATTRIBUTES)))); + + if (waddch_nosync(win, ch) == ERR) + return(ERR); + else + { + _nc_synchook(win); + TR(TRACE_VIRTPUT, ("waddch() is done")); + return(OK); + } +} + +int wechochar(WINDOW *win, const chtype ch) +{ + TR(TRACE_VIRTPUT, ("wechochar(%p,%s (%s)) called", win, + _tracechar((unsigned char)(ch & A_CHARTEXT)), + _traceattr((ch & (chtype)A_ATTRIBUTES)))); + + if (waddch_literal(win, ch) == ERR) + return(ERR); + else + { + _nc_synchook(win); + TR(TRACE_VIRTPUT, ("wechochar() is done")); + return(OK); + } +} diff --git a/lib/libcurses/lib_addstr.c b/lib/libcurses/lib_addstr.c new file mode 100644 index 00000000000..6d98d0464c6 --- /dev/null +++ b/lib/libcurses/lib_addstr.c @@ -0,0 +1,88 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_addstr.c +* +** The routines waddnstr(), waddchnstr(). +** +*/ + +#include "curses.priv.h" +#include <string.h> + +int +waddnstr(WINDOW *win, const char *const astr, int n) +{ +unsigned char *str = (unsigned char *)astr; +int code = ERR; + + T(("waddnstr(%p,\"%s\",%d) called %s", win, _nc_visbuf(astr), n, _traceattr(win->_attrs))); + + if (str != NULL) { + + TR(TRACE_VIRTPUT, ("str is not null")); + code = OK; + if (n < 0) + n = (int)strlen(astr); + + while((n-- > 0) && (*str != '\0')) { + TR(TRACE_VIRTPUT, ("*str = %x", *str)); + if (_nc_waddch_nosync(win, (chtype)*str++) == ERR) { + code = ERR; + break; + } + } + } + _nc_synchook(win); + TR(TRACE_VIRTPUT, ("waddnstr returns %d", code)); + return code; +} + +int +waddchnstr(WINDOW *win, const chtype *const astr, int n) +{ +short oy = win->_cury; +short ox = win->_curx; +chtype *str = (chtype *)astr; +int code = OK; + + T(("waddchnstr(%p,%p,%d) called", win, str, n)); + + if (n < 0) { + n = 0; + while (*str++ != 0) + n++; + str = (chtype *)astr; + } + + while(n-- > 0) { + if (_nc_waddch_nosync(win, *str++) == ERR) { + code = ERR; + break; + } + } + + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + return code; +} diff --git a/lib/libcurses/lib_beep.c b/lib/libcurses/lib_beep.c new file mode 100644 index 00000000000..0beee7c160c --- /dev/null +++ b/lib/libcurses/lib_beep.c @@ -0,0 +1,79 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* + * beep.c + * + * Routines beep() and flash() + * + */ + +#include "curses.priv.h" +#include "term.h" /* beep, flash */ + +/* + * beep() + * + * Sound the current terminal's audible bell if it has one. If not, + * flash the screen if possible. + * + */ + +int beep(void) +{ + T(("beep() called")); + + /* should make sure that we are not in altchar mode */ + if (bell) { + TPUTS_TRACE("bell"); + return(putp(bell)); + } else if (flash_screen) { + TPUTS_TRACE("flash_screen"); + return(putp(flash_screen)); + } + else + return(ERR); +} + +/* + * flash() + * + * Flash the current terminal's screen if possible. If not, + * sound the audible bell if one exists. + * + */ + +int flash(void) +{ + T(("flash() called")); + + /* should make sure that we are not in altchar mode */ + if (flash_screen) { + TPUTS_TRACE("flash_screen"); + return(putp(flash_screen)); + } else if (bell) { + TPUTS_TRACE("bell"); + return(putp(bell)); + } + else + return(ERR); +} diff --git a/lib/libcurses/lib_bkgd.c b/lib/libcurses/lib_bkgd.c new file mode 100644 index 00000000000..aa6ff7a7ff1 --- /dev/null +++ b/lib/libcurses/lib_bkgd.c @@ -0,0 +1,41 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +#include "curses.priv.h" + +int wbkgd(WINDOW *win, const chtype ch) +{ +int x, y; + + T(("wbkgd(%p, %lx) called", win, ch)); + wbkgdset(win, ch); + + for (y = 0; y <= win->_maxy; y++) + for (x = 0; x <= win->_maxx; x++) + if ((win->_line[y].text[x]&A_CHARTEXT) == ' ') + win->_line[y].text[x] |= ch; + else + win->_line[y].text[x] |= (ch&A_ATTRIBUTES); + touchwin(win); + _nc_synchook(win); + return OK; +} + diff --git a/lib/libcurses/lib_box.c b/lib/libcurses/lib_box.c new file mode 100644 index 00000000000..bf45be33336 --- /dev/null +++ b/lib/libcurses/lib_box.c @@ -0,0 +1,146 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_box.c +** +** line drawing routines: +** wborder() +** whline() +** wvline() +** +*/ + +#include "curses.priv.h" + +int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, + chtype bs, chtype tl, chtype tr, chtype bl, chtype br) +{ +short i; +short endx, endy; + + T(("wborder() called")); + + if (ls == 0) ls = ACS_VLINE; + if (rs == 0) rs = ACS_VLINE; + if (ts == 0) ts = ACS_HLINE; + if (bs == 0) bs = ACS_HLINE; + if (tl == 0) tl = ACS_ULCORNER; + if (tr == 0) tr = ACS_URCORNER; + if (bl == 0) bl = ACS_LLCORNER; + if (br == 0) br = ACS_LRCORNER; + + ls |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + rs |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + ts |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + bs |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + tl |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + tr |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + bl |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + br |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + + T(("using %lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx", ls, rs, ts, bs, tl, tr, bl, br)); + + endx = win->_maxx; + endy = win->_maxy; + + for (i = 0; i <= endx; i++) { + win->_line[0].text[i] = ts; + win->_line[endy].text[i] = bs; + } + win->_line[endy].firstchar = win->_line[0].firstchar = 0; + win->_line[endy].lastchar = win->_line[0].lastchar = endx; + + for (i = 0; i <= endy; i++) { + win->_line[i].text[0] = ls; + win->_line[i].text[endx] = rs; + win->_line[i].firstchar = 0; + win->_line[i].lastchar = endx; + } + win->_line[0].text[0] = tl; + win->_line[0].text[endx] = tr; + win->_line[endy].text[0] = bl; + win->_line[endy].text[endx] = br; + + _nc_synchook(win); + return OK; +} + +int whline(WINDOW *win, chtype ch, int n) +{ +short line; +short start; +short end; + + T(("whline(%p,%lx,%d) called", win, ch, n)); + + line = win->_cury; + start = win->_curx; + end = start + n - 1; + if (end > win->_maxx) + end = win->_maxx; + + if (win->_line[line].firstchar == _NOCHANGE || win->_line[line].firstchar > start) + win->_line[line].firstchar = start; + if (win->_line[line].lastchar == _NOCHANGE || win->_line[line].lastchar < start) + win->_line[line].lastchar = end; + + if (ch == 0) + ch = ACS_HLINE; + while ( end >= start) { + win->_line[line].text[end] = ch | win->_attrs; + end--; + } + + return OK; +} + +int wvline(WINDOW *win, chtype ch, int n) +{ +short row, col; +short end; + + T(("wvline(%p,%lx,%d) called", win, ch, n)); + + row = win->_cury; + col = win->_curx; + end = row + n - 1; + if (end > win->_maxy) + end = win->_maxy; + + if (ch == 0) + ch = ACS_VLINE; + + while(end >= row) { + win->_line[end].text[col] = ch | win->_attrs; + if (win->_line[end].firstchar == _NOCHANGE || win->_line[end].firstchar > col) + win->_line[end].firstchar = col; + if (win->_line[end].lastchar == _NOCHANGE || win->_line[end].lastchar < col) + win->_line[end].lastchar = col; + end--; + } + + _nc_synchook(win); + return OK; +} + diff --git a/lib/libcurses/lib_clear.c b/lib/libcurses/lib_clear.c new file mode 100644 index 00000000000..6f329139818 --- /dev/null +++ b/lib/libcurses/lib_clear.c @@ -0,0 +1,40 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_clear.c +** +** The routine wclear(). +** +*/ + +#include "curses.priv.h" + +int wclear(WINDOW *win) +{ + T(("wclear(%p) called", win)); + + werase(win); + + win->_clear = TRUE; + + return OK; +} diff --git a/lib/libcurses/lib_clrbot.c b/lib/libcurses/lib_clrbot.c new file mode 100644 index 00000000000..f7feca7ec5d --- /dev/null +++ b/lib/libcurses/lib_clrbot.c @@ -0,0 +1,72 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_clrbot.c +** +** The routine wclrtobot(). +** +*/ + +#include "curses.priv.h" + +int wclrtobot(WINDOW *win) +{ +chtype *ptr, *end, *maxx = NULL; +short y, startx, minx; + + T(("wclrtobot(%p) called", win)); + + startx = win->_curx; + if (win->_flags & _NEED_WRAP) + startx++; + + T(("clearing from y = %d to y = %d with maxx = %d", win->_cury, win->_maxy, win->_maxx)); + + for (y = win->_cury; y <= win->_maxy; y++) { + minx = _NOCHANGE; + end = &win->_line[y].text[win->_maxx]; + + for (ptr = &win->_line[y].text[startx]; ptr <= end; ptr++) { + int blank = _nc_render(win, *ptr, BLANK); + + if (*ptr != blank) { + maxx = ptr; + if (minx == _NOCHANGE) + minx = ptr - win->_line[y].text; + *ptr = blank; + } + } + + if (minx != _NOCHANGE) { + if (win->_line[y].firstchar > minx + || win->_line[y].firstchar == _NOCHANGE) + win->_line[y].firstchar = minx; + + if (win->_line[y].lastchar < maxx - win->_line[y].text) + win->_line[y].lastchar = maxx - win->_line[y].text; + } + + startx = 0; + } + _nc_synchook(win); + return OK; +} diff --git a/lib/libcurses/lib_clreol.c b/lib/libcurses/lib_clreol.c new file mode 100644 index 00000000000..146432ac575 --- /dev/null +++ b/lib/libcurses/lib_clreol.c @@ -0,0 +1,70 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_clreol.c +** +** The routine wclrtoeol(). +** +*/ + +#include "curses.priv.h" + +int wclrtoeol(WINDOW *win) +{ +chtype *maxx, *ptr, *end; +short y, x, minx; + + T(("wclrtoeol(%p) called", win)); + + y = win->_cury; + x = win->_curx; + if (win->_flags & _NEED_WRAP + || y > win->_maxy + || x > win->_maxx) + return ERR; + + end = &win->_line[y].text[win->_maxx]; + minx = _NOCHANGE; + maxx = &win->_line[y].text[x]; + + for (ptr = maxx; ptr <= end; ptr++) { + int blank = _nc_render(win, win->_line[y].text[x], BLANK); + + if (*ptr != blank) { + maxx = ptr; + if (minx == _NOCHANGE) + minx = ptr - win->_line[y].text; + *ptr = blank; + } + } + + if (minx != _NOCHANGE) { + if (win->_line[y].firstchar > minx || win->_line[y].firstchar == _NOCHANGE) + win->_line[y].firstchar = minx; + + if (win->_line[y].lastchar < maxx - win->_line[y].text) + win->_line[y].lastchar = maxx - win->_line[y].text; + } + _nc_synchook(win); + return(OK); +} diff --git a/lib/libcurses/lib_color.c b/lib/libcurses/lib_color.c new file mode 100644 index 00000000000..b690cb71f33 --- /dev/null +++ b/lib/libcurses/lib_color.c @@ -0,0 +1,325 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* lib_color.c + * + * Handles color emulation of SYS V curses + * + */ + +#include "curses.priv.h" +#include <stdlib.h> +#include <string.h> +#include "term.h" + +int COLOR_PAIRS; +int COLORS; +unsigned char *color_pairs; + +typedef struct +{ + short red, green, blue; +} +color_t; +static color_t *color_table; + +static const color_t cga_palette[] = +{ + /* R G B */ + {0, 0, 0}, /* COLOR_BLACK */ + {1000, 0, 0}, /* COLOR_RED */ + {0, 1000, 0}, /* COLOR_GREEN */ + {1000, 1000, 0}, /* COLOR_YELLOW */ + {0, 0, 1000}, /* COLOR_BLUE */ + {1000, 0, 1000}, /* COLOR_MAGENTA */ + {0, 1000, 1000}, /* COLOR_CYAN */ + {1000, 1000, 1000}, /* COLOR_WHITE */ +}; +static const color_t hls_palette[] = +{ + /* H L S */ + {0, 0, 0}, /* COLOR_BLACK */ + {120, 50, 100}, /* COLOR_RED */ + {240, 50, 100}, /* COLOR_GREEN */ + {180, 50, 100}, /* COLOR_YELLOW */ + {330, 50, 100}, /* COLOR_BLUE */ + {60, 50, 100}, /* COLOR_MAGENTA */ + {300, 50, 100}, /* COLOR_CYAN */ + {0, 50, 100}, /* COLOR_WHITE */ +}; + +int start_color(void) +{ + T(("start_color() called.")); + +#ifdef orig_pair + if (orig_pair != NULL) + { + TPUTS_TRACE("orig_pair"); + putp(orig_pair); + } +#endif /* orig_pair */ +#ifdef orig_colors + if (orig_colors != NULL) + { + TPUTS_TRACE("orig_colors"); + putp(orig_colors); + } +#endif /* orig_colors */ +#if defined(orig_pair) && defined(orig_colors) + if (!orig_pair && !orig_colors) + return ERR; +#endif /* defined(orig_pair) && defined(orig_colors) */ + if (max_pairs != -1) + COLOR_PAIRS = max_pairs; + else + return ERR; + color_pairs = calloc((unsigned int)max_pairs, sizeof(char)); + if (max_colors != -1) + COLORS = max_colors; + else + return ERR; + SP->_coloron = 1; + +#ifdef hue_lightness_saturation + color_table = malloc(sizeof(color_t) * COLORS); + if (hue_lightness_saturation) + memcpy(color_table, hls_palette, sizeof(color_t) * COLORS); + else +#endif /* hue_lightness_saturation */ + memcpy(color_table, cga_palette, sizeof(color_t) * COLORS); + + if (orig_colors) + { + TPUTS_TRACE("orig_colors"); + putp(orig_colors); + } + + T(("started color: COLORS = %d, COLOR_PAIRS = %d", COLORS, COLOR_PAIRS)); + + return OK; +} + +#ifdef hue_lightness_saturation +static void rgb2hls(short r, short g, short b, short *h, short *l, short *s) +/* convert RGB to HLS system */ +{ + short min, max, t; + + if ((min = g < r ? g : r) > b) min = b; + if ((max = g > r ? g : r) < b) max = b; + + /* calculate lightness */ + *l = (min + max) / 20; + + if (min == max) /* black, white and all shades of gray */ + { + *h = 0; + *s = 0; + return; + } + + /* calculate saturation */ + if (*l < 50) + *s = ((max - min) * 100) / (max + min); + else *s = ((max - min) * 100) / (2000 - max - min); + + /* calculate hue */ + if (r == max) + t = 120 + ((g - b) * 60) / (max - min); + else + if (g == max) + t = 240 + ((b - r) * 60) / (max - min); + else + t = 360 + ((r - g) * 60) / (max - min); + + *h = t % 360; +} +#endif /* hue_lightness_saturation */ + +int init_pair(short pair, short f, short b) +{ + T(("init_pair( %d, %d, %d )", pair, f, b)); + + if ((pair < 1) || (pair >= COLOR_PAIRS)) + return ERR; + if ((f < 0) || (f >= COLORS) || (b < 0) || (b >= COLORS)) + return ERR; + + /* + * FIXME: when a pair's content is changed, replace its colors + * (if pair was initialized before a screen update is performed + * replacing original pair colors with the new ones) + */ + + color_pairs[pair] = ( (f & 0x0f) | (b & 0x0f) << 4 ); + + if (initialize_pair) + { + const color_t *tp = hue_lightness_saturation ? hls_palette : cga_palette; + + T(("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)\n", + pair, + tp[f].red, tp[f].green, tp[f].blue, + tp[b].red, tp[b].green, tp[b].blue)); + + if (initialize_pair) + { + TPUTS_TRACE("initialize_pair"); + putp(tparm(initialize_pair, + pair, + tp[f].red, tp[f].green, tp[f].blue, + tp[b].red, tp[b].green, tp[b].blue)); + } + } + + return OK; +} + +int init_color(short color, short r, short g, short b) +{ +#ifdef initialize_color + if (initialize_color == NULL) + return ERR; +#endif /* initialize_color */ + + if (color < 0 || color >= COLORS) + return ERR; +#ifdef hue_lightness_saturation + if (hue_lightness_saturation == TRUE) + if (r < 0 || r > 360 || g < 0 || g > 100 || b < 0 || b > 100) + return ERR; + if (hue_lightness_saturation == FALSE) +#endif /* hue_lightness_saturation */ + if (r < 0 || r > 1000 || g < 0 || g > 1000 || b < 0 || b > 1000) + return ERR; + +#ifdef hue_lightness_saturation + if (hue_lightness_saturation) + rgb2hls(r, g, b, + &color_table[color].red, + &color_table[color].green, + &color_table[color].blue); + else +#endif /* hue_lightness_saturation */ + { + color_table[color].red = r; + color_table[color].green = g; + color_table[color].blue = b; + } + +#ifdef initialize_color + if (initialize_color) + { + TPUTS_TRACE("initialize_color"); + putp(tparm(initialize_color, color, r, g, b)); + } +#endif /* initialize_color */ + return OK; +} + +bool can_change_color(void) +{ + return (can_change != 0); +} + +int has_colors(void) +{ + return ((orig_pair != NULL || orig_colors != NULL) + && (max_colors != -1) && (max_pairs != -1) + && + (((set_foreground != NULL) && (set_background != NULL)) + || ((set_a_foreground != NULL) && (set_a_background != NULL)) + || set_color_pair) + ); +} + +int color_content(short color, short *r, short *g, short *b) +{ + if (color < 0 || color > COLORS) + return ERR; + + *r = color_table[color].red; + *g = color_table[color].green; + *b = color_table[color].blue; + return OK; +} + +int pair_content(short pair, short *f, short *b) +{ + + if ((pair < 1) || (pair > COLOR_PAIRS)) + return ERR; + *f = color_pairs[pair] & 0x0f; + *b = color_pairs[pair] & 0xf0; + *b >>= 4; + return OK; +} + + +void _nc_do_color(int pair, int (*outc)(int)) +{ + short fg, bg; + + if (pair == 0) + { + if (orig_pair) + { + TPUTS_TRACE("orig_pair"); + tputs(orig_pair, 1, outc); + } + } + else + { + if (set_color_pair) + { + TPUTS_TRACE("set_color_pair"); + tputs(tparm(set_color_pair, pair), 1, outc); + } + else + { + pair_content(pair, &fg, &bg); + + T(("setting colors: pair = %d, fg = %d, bg = %d\n", pair, fg, bg)); + + if (set_a_foreground) + { + TPUTS_TRACE("set_a_foreground"); + tputs(tparm(set_a_foreground, fg), 1, outc); + } + else + { + TPUTS_TRACE("set_foreground"); + tputs(tparm(set_foreground, fg), 1, outc); + } + if (set_a_background) + { + TPUTS_TRACE("set_a_background"); + tputs(tparm(set_a_background, bg), 1, outc); + } + else + { + TPUTS_TRACE("set_background"); + tputs(tparm(set_background, bg), 1, outc); + } + } + } +} diff --git a/lib/libcurses/lib_data.c b/lib/libcurses/lib_data.c new file mode 100644 index 00000000000..b3c962e3c16 --- /dev/null +++ b/lib/libcurses/lib_data.c @@ -0,0 +1,64 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_data.c +** +** Common data that may/may not be allocated, but is referenced globally +** +*/ + +#include "curses.priv.h" + +#include <stdlib.h> + +WINDOW *stdscr, *curscr, *newscr; + +/* + * The variable 'SP' will be defined as a function on systems that cannot link + * data-only modules, since it is used in a lot of places within ncurses and we + * cannot guarantee that any application will use any particular function. We + * put the WINDOW variables in this module, because it appears that any + * application that uses them will also use 'SP'. + * + * This module intentionally does not reference other ncurses modules, to avoid + * module coupling that increases the size of the executable. + */ +#if BROKEN_LINKER +static SCREEN *my_screen; + +SCREEN *_nc_screen(void) +{ + return my_screen; +} + +int _nc_alloc_screen(void) +{ + return ((my_screen = (SCREEN *) calloc(sizeof(*SP), 1)) != NULL); +} + +void _nc_set_screen(SCREEN *sp) +{ + my_screen = sp; +} +#else +SCREEN *SP; +#endif diff --git a/lib/libcurses/lib_delch.c b/lib/libcurses/lib_delch.c new file mode 100644 index 00000000000..6f8f37185dd --- /dev/null +++ b/lib/libcurses/lib_delch.c @@ -0,0 +1,56 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_delch.c +** +** The routine wdelch(). +** +*/ + +#include "curses.priv.h" + +int wdelch(WINDOW *win) +{ +chtype *temp1, *temp2; +chtype *end; +chtype blank = _nc_render(win, ' ', BLANK | win->_attrs); + + T(("wdelch(%p) called", win)); + + end = &win->_line[win->_cury].text[win->_maxx]; + temp2 = &win->_line[win->_cury].text[win->_curx + 1]; + temp1 = temp2 - 1; + + while (temp1 < end) + *temp1++ = *temp2++; + + *temp1 = blank; + + win->_line[win->_cury].lastchar = win->_maxx; + + if (win->_line[win->_cury].firstchar == _NOCHANGE + || win->_line[win->_cury].firstchar > win->_curx) + win->_line[win->_cury].firstchar = win->_curx; + + _nc_synchook(win); + return OK; +} diff --git a/lib/libcurses/lib_delwin.c b/lib/libcurses/lib_delwin.c new file mode 100644 index 00000000000..b3453cad74a --- /dev/null +++ b/lib/libcurses/lib_delwin.c @@ -0,0 +1,53 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_delwin.c +** +** The routine delwin(). +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> + +int delwin(WINDOW *win) +{ +int i; + + T(("delwin(%p) called", win)); + + if (win == NULL) + return(ERR); + + if (! (win->_flags & _SUBWIN)) { + for (i = 0; i <= win->_maxy && win->_line[i].text; i++) + free(win->_line[i].text); + } + + free(win->_line); + + touchwin((win->_flags & _SUBWIN) ? win->_parent : curscr); + + free(win); + + return(OK); +} diff --git a/lib/libcurses/lib_doupdate.c b/lib/libcurses/lib_doupdate.c new file mode 100644 index 00000000000..3d6f2d79e38 --- /dev/null +++ b/lib/libcurses/lib_doupdate.c @@ -0,0 +1,840 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/*----------------------------------------------------------------- + * + * lib_doupdate.c + * + * The routine doupdate() and its dependents. Also _nc_outstr(), + * so all physcal output is concentrated here. + * + *-----------------------------------------------------------------*/ + +#include "curses.priv.h" +#include <stdlib.h> +#include <sys/types.h> +#if HAVE_SYS_TIME_H && ! SYSTEM_LOOKS_LIKE_SCO +#include <sys/time.h> +#endif +#if HAVE_SYS_SELECT_H +#include <sys/types.h> +#include <sys/select.h> +#endif +#include <string.h> +#include "term.h" + +/* + * This define controls the line-breakout optimization. Every once in a + * while during screen refresh, we want to check for input and abort the + * update if there's some waiting. CHECK_INTERVAL controls the number of + * changed lines to be emitted between input checks. + * + * Note: Input-check-and-abort is no longer done if the screen is being + * updated from scratch. This is a feature, not a bug. + */ +#define CHECK_INTERVAL 6 + +/* + * Enable checking to see if doupdate and friends are tracking the true + * cursor position correctly. NOTE: this is a debugging hack which will + * work ONLY on ANSI-compatible terminals! + */ +/* #define POSITION_DEBUG */ + +static void ClrUpdate( WINDOW *scr ); +static void TransformLine( int const lineno ); +static void NoIDcTransformLine( int const lineno ); +static void IDcTransformLine( int const lineno ); +static void ClearScreen( void ); +static int InsStr( chtype *line, int count ); +static void DelChar( int count ); + +#define UpdateAttrs(c) if (curscr->_attrs != AttrOf(c)) { \ + curscr->_attrs = AttrOf(c); \ + vidputs(curscr->_attrs, _nc_outch); \ + } + +#ifdef POSITION_DEBUG +/**************************************************************************** + * + * Debugging code. Only works on ANSI-standard terminals. + * + ****************************************************************************/ + +void position_check(int expected_y, int expected_x, char *legend) +/* check to see if the real cursor position matches the virtual */ +{ + static char buf[9]; + int y, x; + + if (_nc_tracing) + return; + + memset(buf, '\0', sizeof(buf)); + (void) write(1, "\033[6n", 4); /* only works on ANSI-compatibles */ + (void) read(0, (void *)buf, 8); + _tracef("probe returned %s", _nc_visbuf(buf)); + + /* try to interpret as a position report */ + if (sscanf(buf, "\033[%d;%dR", &y, &x) != 2) + _tracef("position probe failed in %s", legend); + else if (y - 1 != expected_y || x - 1 != expected_x) + _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s", + y-1, x-1, expected_y, expected_x, legend); + else + _tracef("position matches OK in %s", legend); +} +#endif /* POSITION_DEBUG */ + +/**************************************************************************** + * + * Optimized update code + * + ****************************************************************************/ + +static __inline void GoTo(int const row, int const col) +{ + chtype oldattr = SP->_current_attr; + + TR(TRACE_MOVE, ("GoTo(%d, %d) from (%d, %d)", + row, col, SP->_cursrow, SP->_curscol)); + +#ifdef POSITION_DEBUG + position_check(SP->_cursrow, SP->_curscol, "GoTo"); +#endif /* POSITION_DEBUG */ + + /* + * Force restore even if msgr is on when we're in an alternate + * character set -- these have a strong tendency to screw up the + * CR & LF used for local character motions! + */ + if ((oldattr & A_ALTCHARSET) + || (oldattr && !move_standout_mode)) + { + TR(TRACE_CHARPUT, ("turning off (%lx) %s before move", + oldattr, _traceattr(oldattr))); + vidattr(A_NORMAL); + curscr->_attrs = A_NORMAL; + } + + mvcur(SP->_cursrow, SP->_curscol, row, col); + SP->_cursrow = row; + SP->_curscol = col; +} + +static __inline void PutAttrChar(chtype ch) +{ + if (tilde_glitch && (TextOf(ch) == '~')) + ch = ('`' | AttrOf(ch)); + + TR(TRACE_CHARPUT, ("PutAttrChar(%s, %s) at (%d, %d)", + _tracechar((unsigned char)TextOf(ch)), + _traceattr(AttrOf(ch)), + SP->_cursrow, SP->_curscol)); + UpdateAttrs(ch); + putc((int)TextOf(ch), SP->_ofp); + SP->_curscol++; + if (char_padding) { + TPUTS_TRACE("char_padding"); + putp(char_padding); + } +} + +static bool check_pending(void) +/* check for pending input */ +{ + if (SP->_checkfd >= 0) { + fd_set fdset; + struct timeval ktimeout; + + ktimeout.tv_sec = + ktimeout.tv_usec = 0; + + FD_ZERO(&fdset); + FD_SET(SP->_checkfd, &fdset); + if (select(SP->_checkfd+1, &fdset, NULL, NULL, &ktimeout) != 0) + { + fflush(SP->_ofp); + return TRUE; + } + } + return FALSE; +} + +/* + * No one supports recursive inline functions. However, gcc is quieter if we + * instantiate the recursive part separately. + */ +#if CC_HAS_INLINE_FUNCS +static void callPutChar(chtype const); +#else +#define callPutChar(ch) PutChar(ch) +#endif + +static __inline void PutChar(chtype const ch) +/* insert character, handling automargin stuff */ +{ + if (!(SP->_cursrow == screen_lines-1 && SP->_curscol == screen_columns-1 + && auto_right_margin && !eat_newline_glitch)) + { + PutAttrChar(ch); /* normal case */ + } + else if (!auto_right_margin /* maybe we can suppress automargin */ + || (enter_am_mode && exit_am_mode)) + { + bool old_am = auto_right_margin; + + if (old_am) + { + TPUTS_TRACE("exit_am_mode"); + putp(exit_am_mode); + } + PutAttrChar(ch); + if (old_am) + { + TPUTS_TRACE("enter_am_mode"); + putp(enter_am_mode); + } + } + else + { + GoTo(screen_lines-1,screen_columns-2); + callPutChar(ch); + GoTo(screen_lines-1,screen_columns-2); + if (InsStr(newscr->_line[screen_lines-1].text+screen_columns-2,1)==ERR) + return; + } + + if (SP->_curscol >= screen_columns) + { + if (eat_newline_glitch) + { + /* + * xenl can manifest two different ways. The vt100 + * way is that, when you'd expect the cursor to wrap, + * it stays hung at the right margin (on top of the + * character just emitted) and doesn't wrap until the + * *next* graphic char is emitted. The c100 way is + * to ignore LF received just after an am wrap. + * + * An aggressive way to handle this would be to + * emit CR/LF after the char and then assume the wrap + * is done, you're on the first position of the next + * line, and the terminal out of its weird state. + * Here it's safe to just tell the code that the + * cursor is in hyperspace and let the next mvcur() + * call straighten things out. + */ + SP->_curscol = -1; + SP->_cursrow = -1; + } + else if (auto_right_margin) + { + SP->_curscol = 0; + SP->_cursrow++; + } + else + { + SP->_curscol--; + } + } +#ifdef POSITION_DEBUG + position_check(SP->_cursrow, SP->_curscol, "PutChar"); +#endif /* POSITION_DEBUG */ +} + +#if CC_HAS_INLINE_FUNCS +static void callPutChar(chtype const ch) +{ + PutChar(ch); +} +#endif + +int doupdate(void) +{ +int i; + + T(("doupdate() called")); + +#ifdef TRACE + if (_nc_tracing & TRACE_UPDATE) + { + if (curscr->_clear) + _tracef("curscr is clear"); + else + _tracedump("curscr", curscr); + _tracedump("newscr", newscr); + } +#endif /* TRACE */ + + _nc_signal_handler(FALSE); + + if (SP->_endwin == TRUE) { + T(("coming back from shell mode")); + reset_prog_mode(); + if (enter_ca_mode) + { + TPUTS_TRACE("enter_ca_mode"); + putp(enter_ca_mode); + } + /* + * Undo the effects of terminal init strings that assume + * they know the screen size. Useful when you're running + * a vt100 emulation through xterm. Note: this may change + * the physical cursor location. + */ + if (change_scroll_region) + { + TPUTS_TRACE("change_scroll_region"); + putp(tparm(change_scroll_region, 0, screen_lines - 1)); + } + _nc_mouse_resume(SP); + newscr->_clear = TRUE; + SP->_endwin = FALSE; + } + + /* + * FIXME: Full support for magic-cookie terminals could go in here. + * The theory: we scan the virtual screen looking for attribute + * changes. Where we find one, check to make sure it's realizable + * by seeing if the required number of un-attributed blanks are + * present before or after the change. If not, nuke the attributes + * out of the following or preceding cells on the virtual screen, + * forward to the next change or backwards to the previous one. If + * so, displace the change by the required number of characters. + */ + + if (curscr->_clear) { /* force refresh ? */ + T(("clearing and updating curscr")); + ClrUpdate(curscr); /* yes, clear all & update */ + curscr->_clear = FALSE; /* reset flag */ + } else { + if (newscr->_clear) { + T(("clearing and updating newscr")); + ClrUpdate(newscr); + newscr->_clear = FALSE; + } else { + int changedlines; + + _nc_scroll_optimize(); + + T(("Transforming lines")); + for (i = changedlines = 0; + i < min(screen_lines,newscr->_maxy+1); + i++) + { + /* + * newscr->line[i].firstchar is normally set + * by wnoutrefresh. curscr->line[i].firstchar + * is normally set by _nc_scroll_window in the + * vertical-movement optimization code, + */ + if (newscr->_line[i].firstchar != _NOCHANGE + || curscr->_line[i].firstchar != _NOCHANGE) + { + TransformLine(i); + changedlines++; + } + + /* mark line changed successfully */ + if (i <= newscr->_maxy) + { + newscr->_line[i].firstchar = _NOCHANGE; + newscr->_line[i].lastchar = _NOCHANGE; + newscr->_line[i].oldindex = i; + } + if (i <= curscr->_maxy) + { + curscr->_line[i].firstchar = _NOCHANGE; + curscr->_line[i].lastchar = _NOCHANGE; + curscr->_line[i].oldindex = i; + } + + /* + * Here is our line-breakout optimization. + */ + if ((changedlines % CHECK_INTERVAL) == changedlines-1 + && check_pending()) + goto cleanup; + } + } + } + + /* this code won't be executed often */ + for (i = screen_lines; i <= newscr->_maxy; i++) + { + newscr->_line[i].firstchar = _NOCHANGE; + newscr->_line[i].lastchar = _NOCHANGE; + newscr->_line[i].oldindex = i; + } + for (i = screen_lines; i <= curscr->_maxy; i++) + { + curscr->_line[i].firstchar = _NOCHANGE; + curscr->_line[i].lastchar = _NOCHANGE; + curscr->_line[i].oldindex = i; + } + + curscr->_curx = newscr->_curx; + curscr->_cury = newscr->_cury; + + GoTo(curscr->_cury, curscr->_curx); + + cleanup: + if (curscr->_attrs != A_NORMAL) + vidattr(curscr->_attrs = A_NORMAL); + + fflush(SP->_ofp); + + _nc_signal_handler(TRUE); + + return OK; +} + +/* +** ClrUpdate(scr) +** +** Update by clearing and redrawing the entire screen. +** +*/ + +static void ClrUpdate(WINDOW *scr) +{ +int i = 0, j = 0; +int lastNonBlank; + + T(("ClrUpdate(%p) called", scr)); + if (back_color_erase) { + T(("back_color_erase, turning attributes off")); + vidattr(A_NORMAL); + } + ClearScreen(); + + if (scr != curscr) { + for (i = 0; i < screen_lines ; i++) + for (j = 0; j < screen_columns; j++) + curscr->_line[i].text[j] = ' '; /* shouldn't this include the bkgd? */ + } + + T(("updating screen from scratch")); + for (i = 0; i < min(screen_lines, scr->_maxy + 1); i++) { + GoTo(i, 0); + lastNonBlank = scr->_maxx; + + while (scr->_line[i].text[lastNonBlank] == BLANK && lastNonBlank > 0) + lastNonBlank--; + + for (j = 0; j <= min(lastNonBlank, screen_columns); j++) { + PutChar(scr->_line[i].text[j]); + } + } + + + if (scr != curscr) { + for (i = 0; i < screen_lines ; i++) + for (j = 0; j < screen_columns; j++) + curscr->_line[i].text[j] = scr->_line[i].text[j]; + } +} + +/* +** ClrToEOL() +** +** Clear to EOL. Deal with background color erase if terminal has this +** glitch. This code forces the current color and highlight to A_NORMAL +** before emitting the erase sequence, then restores the current +** attribute. +*/ + +static void ClrToEOL(void) +{ +int j; +attr_t oldcolor = 0; /* initialization pacifies -Wall */ + + if (back_color_erase) { + TPUTS_TRACE("orig_pair"); + putp(orig_pair); + oldcolor = SP->_current_attr & A_COLOR; + SP->_current_attr &=~ A_COLOR; + } + TPUTS_TRACE("clr_eol"); + putp(clr_eol); + if (back_color_erase) + vidattr(SP->_current_attr | oldcolor); + + for (j = SP->_curscol; j < screen_columns; j++) + curscr->_line[SP->_cursrow].text[j] = ' '; +} + +static void ClrToBOL(void) +{ +int j; +attr_t oldcolor = 0; /* initialization pacifies -Wall */ + + if (back_color_erase) { + TPUTS_TRACE("orig_pair"); + putp(orig_pair); + oldcolor = SP->_current_attr & A_COLOR; + SP->_current_attr &=~ A_COLOR; + } + TPUTS_TRACE("clr_bol"); + putp(clr_bol); + if (back_color_erase) + vidattr(SP->_current_attr | oldcolor); + + for (j = 0; j <= SP->_curscol; j++) + curscr->_line[SP->_cursrow].text[j] = ' '; +} + +/* +** TransformLine(lineno) +** +** Call either IDcTransformLine or NoIDcTransformLine to do the +** update, depending upon availability of insert/delete character. +*/ + +static void TransformLine(int const lineno) +{ + + T(("TransformLine(%d) called",lineno)); + + if ( (insert_character || (enter_insert_mode && exit_insert_mode)) + && delete_character) + IDcTransformLine(lineno); + else + NoIDcTransformLine(lineno); +} + + + +/* +** NoIDcTransformLine(lineno) +** +** Transform the given line in curscr to the one in newscr, without +** using Insert/Delete Character. +** +** firstChar = position of first different character in line +** lastChar = position of last different character in line +** +** overwrite all characters between firstChar and lastChar. +** +*/ + +static void NoIDcTransformLine(int const lineno) +{ +int firstChar, lastChar; +chtype *newLine = newscr->_line[lineno].text; +chtype *oldLine = curscr->_line[lineno].text; +int k; +int attrchanged = 0; + + T(("NoIDcTransformLine(%d) called", lineno)); + + firstChar = 0; + while (firstChar < screen_columns - 1 && newLine[firstChar] == oldLine[firstChar]) { + if(ceol_standout_glitch) { + if(AttrOf(newLine[firstChar]) != AttrOf(oldLine[firstChar])) + attrchanged = 1; + } + firstChar++; + } + + T(("first char at %d is %lx", firstChar, newLine[firstChar])); + if (firstChar > screen_columns) + return; + + if(ceol_standout_glitch && attrchanged) { + firstChar = 0; + lastChar = screen_columns - 1; + GoTo(lineno, firstChar); + if(clr_eol) + ClrToEOL(); + } else { + lastChar = screen_columns - 1; + while (lastChar > firstChar && newLine[lastChar] == oldLine[lastChar]) + lastChar--; + GoTo(lineno, firstChar); + } + + T(("updating chars %d to %d", firstChar, lastChar)); + for (k = firstChar; k <= lastChar; k++) { + PutChar(newLine[k]); + oldLine[k] = newLine[k]; + } +} + +/* +** IDcTransformLine(lineno) +** +** Transform the given line in curscr to the one in newscr, using +** Insert/Delete Character. +** +** firstChar = position of first different character in line +** oLastChar = position of last different character in old line +** nLastChar = position of last different character in new line +** +** move to firstChar +** overwrite chars up to min(oLastChar, nLastChar) +** if oLastChar < nLastChar +** insert newLine[oLastChar+1..nLastChar] +** else +** delete oLastChar - nLastChar spaces +*/ + +static void IDcTransformLine(int const lineno) +{ +int firstChar, oLastChar, nLastChar; +chtype *newLine = newscr->_line[lineno].text; +chtype *oldLine = curscr->_line[lineno].text; +int k, n; +int attrchanged = 0; + + T(("IDcTransformLine(%d) called", lineno)); + + if(ceol_standout_glitch && clr_eol) { + firstChar = 0; + while(firstChar < screen_columns) { + if(AttrOf(newLine[firstChar]) != AttrOf(oldLine[firstChar])) + attrchanged = 1; + firstChar++; + } + } + + firstChar = 0; + + if (attrchanged) { + GoTo(lineno, firstChar); + ClrToEOL(); + for( k = 0 ; k <= (screen_columns-1) ; k++ ) + PutChar(newLine[k]); + } else { + while (firstChar < screen_columns && + newLine[firstChar] == oldLine[firstChar]) + firstChar++; + + if (firstChar >= screen_columns) + return; + + if (clr_bol) + { + int oFirstChar, nFirstChar; + + for (oFirstChar = 0; oFirstChar < screen_columns; oFirstChar++) + if (oldLine[oFirstChar] != BLANK) + break; + for (nFirstChar = 0; nFirstChar < screen_columns; nFirstChar++) + if (newLine[nFirstChar] != BLANK) + break; + + if (nFirstChar > oFirstChar + (int)strlen(clr_bol)) + { + GoTo(lineno, nFirstChar - 1); + ClrToBOL(); + + if(nFirstChar == screen_columns) + return; + + if (nFirstChar > firstChar) + firstChar = nFirstChar; + } + } + + oLastChar = screen_columns - 1; + while (oLastChar > firstChar && oldLine[oLastChar] == BLANK) + oLastChar--; + + nLastChar = screen_columns - 1; + while (nLastChar > firstChar && newLine[nLastChar] == BLANK) + nLastChar--; + + if((nLastChar == firstChar) + && clr_eol + && (curscr->_attrs == A_NORMAL)) { + GoTo(lineno, firstChar); + ClrToEOL(); + if(newLine[firstChar] != BLANK ) + PutChar(newLine[firstChar]); + } else if( newLine[nLastChar] != oldLine[oLastChar] ) { + n = max( nLastChar , oLastChar ); + + GoTo(lineno, firstChar); + for( k=firstChar ; k <= n ; k++ ) + PutChar(newLine[k]); + } else { + while (newLine[nLastChar] == oldLine[oLastChar]) { + if (nLastChar != 0 + && oLastChar != 0) { + nLastChar--; + oLastChar--; + } else { + break; + } + } + + n = min(oLastChar, nLastChar); + GoTo(lineno, firstChar); + + for (k=firstChar; k <= n; k++) + PutChar(newLine[k]); + + if (oLastChar < nLastChar) + InsStr(&newLine[k], nLastChar - oLastChar); + + else if (oLastChar > nLastChar ) { + /* + * The delete-char sequence will effectively + * shift in blanks from the right margin of the + * screen. Ensure that they are the right + * color by setting the video attributes from + * the last character on the row. + */ + UpdateAttrs(newLine[screen_columns-1]); + DelChar(oLastChar - nLastChar); + } + } + } + for (k = firstChar; k < screen_columns; k++) + oldLine[k] = newLine[k]; +} + +/* +** ClearScreen() +** +** Clear the physical screen and put cursor at home +** +*/ + +static void ClearScreen(void) +{ + + T(("ClearScreen() called")); + + if (clear_screen) { + TPUTS_TRACE("clear_screen"); + putp(clear_screen); + SP->_cursrow = SP->_curscol = 0; +#ifdef POSITION_DEBUG + position_check(SP->_cursrow, SP->_curscol, "ClearScreen"); +#endif /* POSITION_DEBUG */ + } else if (clr_eos) { + SP->_cursrow = SP->_curscol = -1; + GoTo(0,0); + + TPUTS_TRACE("clr_eos"); + putp(clr_eos); + } else if (clr_eol) { + SP->_cursrow = SP->_curscol = -1; + + while (SP->_cursrow < screen_lines) { + GoTo(SP->_cursrow, 0); + TPUTS_TRACE("clr_eol"); + putp(clr_eol); + } + GoTo(0,0); + } + T(("screen cleared")); +} + + +/* +** InsStr(line, count) +** +** Insert the count characters pointed to by line. +** +*/ + +static int InsStr(chtype *line, int count) +{ + T(("InsStr(%p,%d) called", line, count)); + + if (enter_insert_mode && exit_insert_mode) { + TPUTS_TRACE("enter_insert_mode"); + putp(enter_insert_mode); + while (count) { + PutAttrChar(*line); + line++; + count--; + } + TPUTS_TRACE("exit_insert_mode"); + putp(exit_insert_mode); + return(OK); + } else if (parm_ich) { + TPUTS_TRACE("parm_ich"); + tputs(tparm(parm_ich, count), count, _nc_outch); + while (count) { + PutAttrChar(*line); + line++; + count--; + } + return(OK); + } else { + while (count) { + TPUTS_TRACE("insert_character"); + putp(insert_character); + PutAttrChar(*line); + if (insert_padding) + { + TPUTS_TRACE("insert_padding"); + putp(insert_padding); + } + line++; + count--; + } + return(OK); + } +} + +/* +** DelChar(count) +** +** Delete count characters at current position +** +*/ + +static void DelChar(int count) +{ + T(("DelChar(%d) called, position = (%d,%d)", count, newscr->_cury, newscr->_curx)); + + if (parm_dch) { + TPUTS_TRACE("parm_dch"); + tputs(tparm(parm_dch, count), count, _nc_outch); + } else { + while (count--) + { + TPUTS_TRACE("delete_character"); + putp(delete_character); + } + } +} + +/* +** _nc_outstr(char *str) +** +** Emit a string without waiting for update. +*/ + +void _nc_outstr(char *str) +{ + FILE *ofp = SP ? SP->_ofp : stdout; + + (void) fputs(str, ofp); + (void) fflush(ofp); +} diff --git a/lib/libcurses/lib_endwin.c b/lib/libcurses/lib_endwin.c new file mode 100644 index 00000000000..065b5c7567b --- /dev/null +++ b/lib/libcurses/lib_endwin.c @@ -0,0 +1,55 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_endwin.c +** +** The routine endwin(). +** +*/ + +#include "curses.priv.h" +#include "term.h" + +int +endwin(void) +{ + T(("endwin() called")); + + SP->_endwin = TRUE; + + _nc_mouse_wrap(SP); + + mvcur(-1, -1, screen_lines - 1, 0); + + curs_set(1); /* set cursor to normal mode */ + + if (SP->_coloron == TRUE && orig_pair) + putp(orig_pair); + + _nc_mvcur_wrap(); /* wrap up cursor addressing */ + + if (curscr && (curscr->_attrs != A_NORMAL)) + vidattr(curscr->_attrs = A_NORMAL); + + return(reset_shell_mode()); +} diff --git a/lib/libcurses/lib_erase.c b/lib/libcurses/lib_erase.c new file mode 100644 index 00000000000..1a3ee5c8841 --- /dev/null +++ b/lib/libcurses/lib_erase.c @@ -0,0 +1,66 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_erase.c +** +** The routine werase(). +** +*/ + +#include "curses.priv.h" + +int werase(WINDOW *win) +{ +int y; +chtype *sp, *end, *start, *maxx = NULL; +short minx; + + T(("werase(%p) called", win)); + + for (y = 0; y <= win->_maxy; y++) { + minx = _NOCHANGE; + start = win->_line[y].text; + end = &start[win->_maxx]; + + maxx = start; + for (sp = start; sp <= end; sp++) { + maxx = sp; + if (minx == _NOCHANGE) + minx = sp - start; + *sp = _nc_render(win, *sp, BLANK); + } + + if (minx != _NOCHANGE) { + if (win->_line[y].firstchar > minx || + win->_line[y].firstchar == _NOCHANGE) + win->_line[y].firstchar = minx; + + if (win->_line[y].lastchar < maxx - win->_line[y].text) + win->_line[y].lastchar = maxx - win->_line[y].text; + } + } + win->_curx = win->_cury = 0; + win->_flags &= ~_NEED_WRAP; + _nc_synchook(win); + return OK; +} diff --git a/lib/libcurses/lib_getch.c b/lib/libcurses/lib_getch.c new file mode 100644 index 00000000000..12372bc0fc0 --- /dev/null +++ b/lib/libcurses/lib_getch.c @@ -0,0 +1,329 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_getch.c +** +** The routine getch(). +** +*/ + +#include "curses.priv.h" +#include <sys/types.h> +#include <string.h> +#include <errno.h> +#if !HAVE_EXTERN_ERRNO +extern int errno; +#endif + +#define head SP->_fifohead +#define tail SP->_fifotail +#define peek SP->_fifopeek + +#define h_inc() { head == FIFO_SIZE-1 ? head = 0 : head++; if (head == tail) head = -1, tail = 0;} +#define h_dec() { head == 0 ? head = FIFO_SIZE-1 : head--; if (head == tail) tail = -1;} +#define t_inc() { tail == FIFO_SIZE-1 ? tail = 0 : tail++; if (tail == head) tail = -1;} +#define p_inc() { peek == FIFO_SIZE-1 ? peek = 0 : peek++;} + +int ESCDELAY = 1000; /* max interval betw. chars in funkeys, in millisecs */ + +static int fifo_peek(void) +{ + T(("peeking at %d", peek+1)); + return SP->_fifo[++peek]; +} + +#ifdef TRACE +static __inline void fifo_dump(void) +{ +int i; + T(("head = %d, tail = %d, peek = %d", head, tail, peek)); + for (i = 0; i < 10; i++) + T(("char %d = %s", i, _tracechar(SP->_fifo[i]))); +} +#endif /* TRACE */ + +static __inline int fifo_pull(void) +{ +int ch; + ch = SP->_fifo[head]; + T(("pulling %d from %d", ch, head)); + + h_inc(); +#ifdef TRACE + if (_nc_tracing & TRACE_FIFO) fifo_dump(); +#endif + return ch; +} + +int ungetch(int ch) +{ + if (tail == -1) + return ERR; + if (head == -1) { + head = 0; + t_inc() + } else + h_dec(); + + SP->_fifo[head] = ch; + T(("ungetch ok")); +#ifdef TRACE + if (_nc_tracing & TRACE_FIFO) fifo_dump(); +#endif + return OK; +} + +static __inline int fifo_push(void) +{ +int n; +unsigned char ch; + + if (tail == -1) return ERR; + /* FALLTHRU */ +again: + n = read(SP->_ifd, &ch, 1); + if (n == -1 && errno == EINTR) + goto again; + T(("read %d characters", n)); + + SP->_fifo[tail] = ch; + if (head == -1) head = tail; + t_inc(); + T(("pushed %#x at %d", ch, tail)); +#ifdef TRACE + if (_nc_tracing & TRACE_FIFO) fifo_dump(); +#endif + return ch; +} + +static __inline void fifo_clear(void) +{ +int i; + for (i = 0; i < FIFO_SIZE; i++) + SP->_fifo[i] = 0; + head = -1; tail = peek = 0; +} + +static int kgetch(WINDOW *); + +void _nc_backspace(WINDOW *win) +{ + if (win->_curx == 0) + { + beep(); + return; + } + + mvwaddstr(curscr, win->_begy + win->_cury, win->_begx + win->_curx, "\b \b"); + waddstr(win, "\b \b"); + + /* + * This used to do the equivalent of _nc_outstr("\b \b"), which + * would fail on terminals with a non-backspace cursor_left + * character. + */ + mvcur(win->_begy + win->_cury, win->_begx + win->_curx, + win->_begy + win->_cury, win->_begx + win->_curx - 1); + _nc_outstr(" "); + mvcur(win->_begy + win->_cury, win->_begx + win->_curx, + win->_begy + win->_cury, win->_begx + win->_curx - 1); + SP->_curscol--; +} + +int +wgetch(WINDOW *win) +{ +bool setHere = FALSE; /* cbreak mode was set here */ +int ch; + + T(("wgetch(%p) called", win)); + + /* this should be eliminated */ + if (! win->_scroll && (SP->_echo) && (win->_flags & _FULLWIN) + && win->_curx == win->_maxx && win->_cury == win->_maxy) + return(ERR); + + if ((is_wintouched(win) || (win->_flags & _HASMOVED)) && !(win->_flags & _ISPAD)) + wrefresh(win); + + if (SP->_echo && ! (SP->_raw || SP->_cbreak)) { + cbreak(); + setHere = TRUE; + } + + if (!win->_notimeout && (win->_delay >= 0 || SP->_cbreak > 1)) { + int delay; + + T(("timed delay in wgetch()")); + if (SP->_cbreak > 1) + delay = (SP->_cbreak-1) * 100; + else + delay = win->_delay; + + T(("delay is %d microseconds", delay)); + + if (head == -1) /* fifo is empty */ + if (_nc_timed_wait(SP->_ifd, delay, NULL) == 0) + return ERR; + /* else go on to read data available */ + } + + /* + * Give the mouse interface a chance to pick up an event. + * If no mouse event, check for keyboard input. + */ + if (_nc_mouse_event(SP)) + ch = KEY_MOUSE; + else if (win->_use_keypad) { + /* + * This is tricky. We only want to get special-key + * events one at a time. But we want to accumulate + * mouse events until either (a) the mouse logic tells + * us it's picked up a complete gesture, or (b) + * there's a detectable time lapse after one. + * + * Note: if the mouse code starts failing to compose + * press/release events into clicks, you should probably + * increase _nc_max_click_interval. + */ + int runcount = 0; + + do { + ch = kgetch(win); + if (ch == KEY_MOUSE) + { + ++runcount; + if (_nc_mouse_inline(SP)) + break; + } + } while + (ch == KEY_MOUSE + && (_nc_timed_wait(SP->_ifd, _nc_max_click_interval, NULL) + || !_nc_mouse_parse(runcount))); + if (runcount > 0 && ch != KEY_MOUSE) + { + /* mouse event sequence ended by keystroke, push it */ + ungetch(ch); + ch = KEY_MOUSE; + } + } else { + if (head == -1) + fifo_push(); + ch = fifo_pull(); + } + + /* Strip 8th-bit if so desired. We do this only for characters that + * are in the range 128-255, to provide compatibility with terminals + * that display only 7-bit characters. Note that 'ch' may be a + * function key at this point, so we mustn't strip _those_. + */ + if ((ch < KEY_MIN) && (ch & 0x80)) + if (!SP->_use_meta) + ch &= 0x7f; + + if (!(win->_flags & _ISPAD) && SP->_echo) { + /* there must be a simpler way of doing this */ + if (ch == erasechar() || ch == KEY_BACKSPACE || ch == KEY_LEFT) + _nc_backspace(win); + else if (ch < KEY_MIN) { + mvwaddch(curscr, + win->_begy + win->_cury, + win->_begx + win->_curx, + (chtype)(ch | win->_attrs)); + waddch(win, (chtype)(ch | win->_attrs)); + } + else + beep(); + } + if (setHere) + nocbreak(); + + T(("wgetch returning : 0x%x = %s", + ch, + (ch > KEY_MIN) ? keyname(ch) : unctrl(ch))); + + return(ch); +} + + +/* +** int +** kgetch() +** +** Get an input character, but take care of keypad sequences, returning +** an appropriate code when one matches the input. After each character +** is received, set an alarm call based on ESCDELAY. If no more of the +** sequence is received by the time the alarm goes off, pass through +** the sequence gotten so far. +** +*/ + +static int +kgetch(WINDOW *win) +{ +struct try *ptr; +int ch = 0; +int timeleft = ESCDELAY; + + TR(TRACE_FIFO, ("kgetch(%p) called", win)); + + ptr = SP->_keytry; + + if (head == -1) { + ch = fifo_push(); + peek = 0; + while (ptr != NULL) { + TR(TRACE_FIFO, ("ch: %s", _tracechar((unsigned char)ch))); + while ((ptr != NULL) && (ptr->ch != (unsigned char)ch)) + ptr = ptr->sibling; +#ifdef TRACE + if (ptr == NULL) + {TR(TRACE_FIFO, ("ptr is null"));} + else + TR(TRACE_FIFO, ("ptr=%p, ch=%d, value=%d", + ptr, ptr->ch, ptr->value)); +#endif /* TRACE */ + + if (ptr != NULL) + if (ptr->value != 0) { /* sequence terminated */ + TR(TRACE_FIFO, ("end of sequence")); + fifo_clear(); + return(ptr->value); + } else { /* go back for another character */ + ptr = ptr->child; + TR(TRACE_FIFO, ("going back for more")); + } else + break; + + TR(TRACE_FIFO, ("waiting for rest of sequence")); + if (_nc_timed_wait(SP->_ifd, timeleft, &timeleft) < 1) { + TR(TRACE_FIFO, ("ran out of time")); + return(fifo_pull()); + } else { + TR(TRACE_FIFO, ("got more!")); + fifo_push(); + ch = fifo_peek(); + } + } + } + return(fifo_pull()); +} diff --git a/lib/libcurses/lib_getstr.c b/lib/libcurses/lib_getstr.c new file mode 100644 index 00000000000..5f4dbcd2b7c --- /dev/null +++ b/lib/libcurses/lib_getstr.c @@ -0,0 +1,131 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_getstr.c +** +** The routine wgetstr(). +** +*/ + +#include "curses.priv.h" +#include "unctrl.h" +#include <string.h> + +int wgetnstr(WINDOW *win, char *str, int maxlen) +{ +bool oldnl, oldecho, oldraw, oldcbreak, oldkeypad; +char erasec; +char killc; +char *oldstr; +int ch; + + T(("wgetnstr(%p,%p, %d) called", win, str, maxlen)); + + oldnl = SP->_nl; + oldecho = SP->_echo; + oldraw = SP->_raw; + oldcbreak = SP->_cbreak; + oldkeypad = win->_use_keypad; + nl(); + noecho(); + noraw(); + cbreak(); + keypad(win, TRUE); + + erasec = erasechar(); + killc = killchar(); + + oldstr = str; + + if (is_wintouched(win) || (win->_flags & _HASMOVED)) + wrefresh(win); + + while ((ch = wgetch(win)) != ERR) { + /* + * Some terminals (the Wyse-50 is the most common) generate + * a \n from the down-arrow key. With this logic, it's the + * user's choice whether to set kcud=\n for wgetch(); + * terminating *getstr() with \n should work either way. + */ + if (ch == '\n' || ch == '\r' || ch == KEY_DOWN) + break; + if (ch == erasec || ch == KEY_LEFT || ch == KEY_BACKSPACE) { + if (str > oldstr) { + str--; + if (oldecho == TRUE) + _nc_backspace(win); + } + } else if (ch == killc) { + while (str > oldstr) { + str--; + if (oldecho == TRUE) + _nc_backspace(win); + } + } else if (ch >= KEY_MIN + || (maxlen >= 0 && str - oldstr >= maxlen)) { + beep(); + } else { + if (oldecho == TRUE) { + char *glyph = unctrl(ch); + + mvwaddstr(curscr, win->_begy + win->_cury, + win->_begx + win->_curx, glyph); + waddstr(win, glyph); + _nc_outstr(glyph); + SP->_curscol += strlen(glyph); + } + *str++ = ch; + } + } + + win->_curx = 0; + win->_flags &= ~_NEED_WRAP; + if (win->_cury < win->_maxy) + win->_cury++; + wrefresh(win); + + if (oldnl == FALSE) + nonl(); + + if (oldecho == TRUE) + echo(); + + if (oldraw == TRUE) + raw(); + + if (oldcbreak == FALSE) + nocbreak(); + + if (oldkeypad == FALSE) + keypad(win, FALSE); + + if (ch == ERR) { + *str = '\0'; + return ERR; + } + *str = '\0'; + + T(("wgetnstr returns \"%s\"", _nc_visbuf(oldstr))); + + return(OK); +} diff --git a/lib/libcurses/lib_inchstr.c b/lib/libcurses/lib_inchstr.c new file mode 100644 index 00000000000..2dc64bff0d6 --- /dev/null +++ b/lib/libcurses/lib_inchstr.c @@ -0,0 +1,43 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_inchstr.c +** +** The routine winchnstr(). +** +*/ + +#include "curses.priv.h" + +int winchnstr(WINDOW *win, chtype *str, int n) +{ + int i; + + T(("winchnstr(%p,'%p',%d) called", win, str, n)); + + for (i = 0; (n < 0 || (i < n)) && (win->_curx + i <= win->_maxx); i++) + str[i] = win->_line[win->_cury].text[win->_curx + i]; + str[i] = (chtype)0; + + return(i); +} diff --git a/lib/libcurses/lib_initscr.c b/lib/libcurses/lib_initscr.c new file mode 100644 index 00000000000..b9c6fcaaad9 --- /dev/null +++ b/lib/libcurses/lib_initscr.c @@ -0,0 +1,75 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_initscr.c +** +** The routines initscr(), and termname(). +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> +#include <string.h> + +WINDOW *initscr(void) +{ +char *name = getenv("TERM"); + + if (name == 0) + name = "unknown"; + if (newterm(name, stdout, stdin) == NULL) { + fprintf(stderr, "Error opening terminal: %s.\n", name); + exit(1); + } + + /* allow user to set maximum escape delay from the environment */ + if ((name = getenv("ESCDELAY"))) + ESCDELAY = atoi(getenv("ESCDELAY")); + + def_shell_mode(); + + /* follow the XPG4 requirement to turn echo off at this point */ + noecho(); + +#ifdef _XOPEN_SOURCE_EXTENDED + /* for extended XPG4 conformance requires cbreak() at this point */ + cbreak(); +#endif /* _XOPEN_SOURCE_EXTENDED */ + + def_prog_mode(); + return(stdscr); +} + +char *termname(void) +{ +char *term = getenv("TERM"); +static char ret[15]; + + T(("termname() called")); + + if (term == (char *)NULL) + return(char *)NULL; + else { + (void) strncpy(ret, term, sizeof(ret) - 1); + return(ret); + } +} diff --git a/lib/libcurses/lib_insch.c b/lib/libcurses/lib_insch.c new file mode 100644 index 00000000000..b2f13744e5b --- /dev/null +++ b/lib/libcurses/lib_insch.c @@ -0,0 +1,54 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_insch.c +** +** The routine winsch(). +** +*/ + +#include "curses.priv.h" + +int winsch(WINDOW *win, chtype c) +{ +chtype *temp1, *temp2; +chtype *end; + + T(("winsch(%p,'%lx') called", win, c)); + + end = &win->_line[win->_cury].text[win->_curx]; + temp1 = &win->_line[win->_cury].text[win->_maxx]; + temp2 = temp1 - 1; + + while (temp1 > end) + *temp1-- = *temp2--; + + *temp1 = _nc_render(win, c, c | win->_attrs); + + win->_line[win->_cury].lastchar = win->_maxx; + if (win->_line[win->_cury].firstchar == _NOCHANGE + || win->_line[win->_cury].firstchar > win->_curx) + win->_line[win->_cury].firstchar = win->_curx; + return OK; +} diff --git a/lib/libcurses/lib_insdel.c b/lib/libcurses/lib_insdel.c new file mode 100644 index 00000000000..a6e6a86c78b --- /dev/null +++ b/lib/libcurses/lib_insdel.c @@ -0,0 +1,51 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_insdel.c +** +** The routine winsdelln(win, n). +** positive n insert n lines above current line +** negative n delete n lines starting from current line +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> + +int +winsdelln(WINDOW *win, int n) +{ + T(("winsdel(%p,%d) called", win, n)); + + if (n == 0) + return OK; + + _nc_scroll_window(win, -n, win->_cury, win->_maxy); + touchline(win, win->_cury, win->_maxy - win->_cury + 1); + + _nc_synchook(win); + return OK; +} + + diff --git a/lib/libcurses/lib_insstr.c b/lib/libcurses/lib_insstr.c new file mode 100644 index 00000000000..1d1d867ecc8 --- /dev/null +++ b/lib/libcurses/lib_insstr.c @@ -0,0 +1,61 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_insstr.c +** +** The routine winsnstr(). +** +*/ + +#include "curses.priv.h" +#include <ctype.h> + +int winsnstr(WINDOW *win, const char *str, int n) +{ +short oy = win->_cury; +short ox = win->_curx; +char *cp; + + T(("winsstr(%p,'%s',%d) called", win, str, n)); + + for (cp = (char *)str; *cp && (n <= 0 || (cp - str) < n); cp++) { + if (*cp == '\n' || *cp == '\r' || *cp == '\t' || *cp == '\b') + _nc_waddch_nosync(win, (chtype)(*cp)); + else if (is7bits(*cp) && iscntrl(*cp)) { + winsch(win, ' ' + (chtype)(*cp)); + winsch(win, '^'); + win->_curx += 2; + } else { + winsch(win, (chtype)(*cp)); + win->_curx++; + } + if (win->_curx > win->_maxx) + win->_curx = win->_maxx; + } + + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + return OK; +} diff --git a/lib/libcurses/lib_instr.c b/lib/libcurses/lib_instr.c new file mode 100644 index 00000000000..e1ef5272fd9 --- /dev/null +++ b/lib/libcurses/lib_instr.c @@ -0,0 +1,44 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_instr.c +** +** The routine winnstr(). +** +*/ + +#include "curses.priv.h" + +int winnstr(WINDOW *win, char *str, int n) +{ + int i; + + T(("winnstr(%p,'%p',%d) called", win, str, n)); + + for (i = 0; (n < 0 || (i < n)) && (win->_curx + i <= win->_maxx); i++) + str[i] = win->_line[win->_cury].text[win->_curx + i] & A_CHARTEXT; + str[i] = '\0'; + + return(i); +} + diff --git a/lib/libcurses/lib_isendwin.c b/lib/libcurses/lib_isendwin.c new file mode 100644 index 00000000000..bfd991e3cfb --- /dev/null +++ b/lib/libcurses/lib_isendwin.c @@ -0,0 +1,37 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_endwin.c +** +** The routine endwin(). +** +*/ + +#include "curses.priv.h" + +int isendwin(void) +{ + if (SP == NULL) + return FALSE; + return SP->_endwin; +} diff --git a/lib/libcurses/lib_kernel.c b/lib/libcurses/lib_kernel.c new file mode 100644 index 00000000000..622c549acea --- /dev/null +++ b/lib/libcurses/lib_kernel.c @@ -0,0 +1,309 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* + * lib_kernel.c + * + * Misc. low-level routines: + * napms() + * reset_prog_mode() + * reset_shell_mode() + * baudrate() + * delay_output() + * erasechar() + * killchar() + * flushinp() + * savetty() + * resetty() + * + * + */ + +#include "curses.priv.h" +#include "term.h" /* cur_term, pad_char */ +#include <errno.h> +#if !HAVE_EXTERN_ERRNO +extern int errno; +#endif + +int napms(int ms) +{ + T(("napms(%d) called", ms)); + + usleep(1000*(unsigned)ms); + return OK; +} + +#ifndef EXTERN_TERMINFO +int reset_prog_mode(void) +{ + T(("reset_prog_mode() called")); + +#ifdef TERMIOS + tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb); +#else + stty(cur_term->Filedes, &cur_term->Nttyb); +#endif + if (SP && stdscr && stdscr->_use_keypad) + _nc_keypad(TRUE); + + return OK; +} + + +int reset_shell_mode(void) +{ + T(("reset_shell_mode() called")); + + if (SP) + { + fflush(SP->_ofp); + _nc_keypad(FALSE); + } + +#ifdef TERMIOS + tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Ottyb); +#else + stty(cur_term->Filedes, &cur_term->Ottyb); +#endif + return OK; +} +#endif /* EXTERN_TERMINFO */ + +int delay_output(float ms) +{ + T(("delay_output(%f) called", ms)); + + if (SP == 0 || SP->_baudrate == ERR) + return(ERR); +#ifdef no_pad_char + else if (no_pad_char) + _nc_timed_wait(0, (int)ms, (int *)NULL); +#endif /* no_pad_char */ + else { + register int nullcount; + char null = '\0'; + +#ifdef pad_char + if (pad_char) + null = pad_char[0]; +#endif /* pad_char */ + + for (nullcount = ms * 1000 / SP->_baudrate; nullcount > 0; nullcount--) + putc(null, SP->_ofp); + (void) fflush(SP->_ofp); + } + + return OK; +} + +/* + * erasechar() + * + * Return erase character as given in cur_term->Ottyb. + * + */ + +char +erasechar(void) +{ + T(("erasechar() called")); + +#ifdef TERMIOS + return(cur_term->Ottyb.c_cc[VERASE]); +#else + return(cur_term->Ottyb.sg_erase); +#endif + +} + + + +/* + * killchar() + * + * Return kill character as given in cur_term->Ottyb. + * + */ + +char +killchar(void) +{ + T(("killchar() called")); + +#ifdef TERMIOS + return(cur_term->Ottyb.c_cc[VKILL]); +#else + return(cur_term->Ottyb.sg_kill); +#endif +} + + + +/* + * flushinp() + * + * Flush any input on cur_term->Filedes + * + */ + +int flushinp(void) +{ + T(("flushinp() called")); + +#ifdef TERMIOS + tcflush(cur_term->Filedes, TCIFLUSH); +#else + errno = 0; + do { + ioctl(cur_term->Filedes, TIOCFLUSH, 0); + } while + (errno == EINTR); +#endif + if (SP) { + SP->_fifohead = -1; + SP->_fifotail = 0; + SP->_fifopeek = 0; + } + return OK; + +} + + + +/* + * int + * baudrate() + * + * Returns the current terminal's baud rate. + * + */ + +struct speed { + speed_t s; + int sp; +}; + +static struct speed const speeds[] = { + {B0, 0}, + {B50, 50}, + {B75, 75}, + {B110, 110}, + {B134, 134}, + {B150, 150}, + {B200, 200}, + {B300, 300}, + {B600, 600}, + {B1200, 1200}, + {B1800, 1800}, + {B2400, 2400}, + {B4800, 4800}, + {B9600, 9600}, +#define MAX_BAUD B9600 +#ifdef B19200 +#undef MAX_BAUD +#define MAX_BAUD B19200 + {B19200, 19200}, +#else +#ifdef EXTA +#define MAX_BAUD EXTA + {EXTA, 19200}, +#endif +#endif +#ifdef B38400 +#undef MAX_BAUD +#define MAX_BAUD B38400 + {B38400, 38400}, +#else +#ifdef EXTB +#define MAX_BAUD EXTB + {EXTB, 38400}, +#endif +#endif +#ifdef B57600 +#undef MAX_BAUD +#define MAX_BAUD B57600 + {B57600, 57600}, +#endif +#ifdef B115200 +#undef MAX_BAUD +#define MAX_BAUD B115200 + {B115200, 115200}, +#endif +}; + +int +baudrate(void) +{ +int i, ret; + + T(("baudrate() called")); + +#ifdef TERMIOS + ret = cfgetospeed(&cur_term->Nttyb); +#else + ret = cur_term->Nttyb.sg_ospeed; +#endif + if(ret < 0 || ret > MAX_BAUD) + return ERR; + SP->_baudrate = ERR; + for (i = 0; i < (sizeof(speeds) / sizeof(struct speed)); i++) + if (speeds[i].s == ret) + { + SP->_baudrate = speeds[i].sp; + break; + } + return(SP->_baudrate); +} + + +/* +** savetty() and resetty() +** +*/ + +static TTY buf; + +int savetty(void) +{ + T(("savetty() called")); + +#ifdef TERMIOS + tcgetattr(cur_term->Filedes, &buf); +#else + gtty(cur_term->Filedes, &buf); +#endif + return OK; +} + +int resetty(void) +{ + T(("resetty() called")); + +#ifdef TERMIOS + tcsetattr(cur_term->Filedes, TCSANOW, &buf); +#else + stty(cur_term->Filedes, &buf); +#endif + return OK; +} + diff --git a/lib/libcurses/lib_longname.c b/lib/libcurses/lib_longname.c new file mode 100644 index 00000000000..d9883ae3d50 --- /dev/null +++ b/lib/libcurses/lib_longname.c @@ -0,0 +1,53 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_longname.c +** +** The routine longname(). +** +*/ + +#ifdef EXTERN_TERMINFO +#include <term.h> +#else +#include "curses.priv.h" +#endif +#include <string.h> + +char * +longname(void) +{ +#ifdef EXTERN_TERMINFO + return cur_term->name; +#else +char *ptr; + + T(("longname() called")); + + for (ptr = ttytype + strlen(ttytype); ptr > ttytype; ptr--) + if (*ptr == '|') + return(ptr + 1); + + return(ttytype); +#endif +} diff --git a/lib/libcurses/lib_mouse.c b/lib/libcurses/lib_mouse.c new file mode 100644 index 00000000000..e8f73f65f36 --- /dev/null +++ b/lib/libcurses/lib_mouse.c @@ -0,0 +1,580 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* + * This module is intended to encapsulate ncurses's interface to pointing + * devices. + * + * The first method used is xterm's internal mouse-tracking facility. + * The second (not yet implemented) will be Alessandro Rubini's GPM server. + * + * Notes for implementors of new mouse-interface methods: + * + * The code is logically split into a lower level that accepts event reports + * in a device-dependent format and an upper level that parses mouse gestures + * and filters events. The mediating data structure is a circular queue of + * MEVENT structures. + * + * Functionally, the lower level's job is to pick up primitive events and + * put them on the circular queue. This can happen in one of two ways: + * either (a) _nc_mouse_event() detects a series of incoming mouse reports + * and queues them, or (b) code in lib_getch.c detects the kmous prefix in + * the keyboard input stream and calls _nc_mouse_inline to queue up a series + * of adjacent mouse reports. + * + * In either case, _nc_mouse_parse() should be called after the series is + * accepted to parse the digested mouse reports (low-level MEVENTs) into + * a gesture (a high-level or composite MEVENT). + * + * Don't be too shy about adding new event types or modifiers, if you can find + * room for them in the 32-bit mask. The API is written so that users get + * feedback on which theoretical event types they won't see when they call + * mousemask. There's one bit per button (the RESERVED_EVENT bit) not being + * used yet, and a couple of bits open at the high end. + */ + +#include <curses.h> +#include <string.h> +#include "term.h" +#include "curses.priv.h" + +#define INVALID_EVENT -1 + +int _nc_max_click_interval = 166; /* max press/release separation */ + +static int mousetype; +#define M_XTERM -1 /* use xterm's mouse tracking? */ +#define M_NONE 0 /* no mouse device */ +#define M_GPM 1 /* use GPM (not yet implemented) */ + +static mmask_t eventmask; /* current event mask */ + +/* maintain a circular list of mouse events */ +#define EV_MAX 8 /* size of circular event queue */ +static MEVENT events[EV_MAX]; /* hold the last mouse event seen */ +static MEVENT *eventp = events; /* next free slot in event queue */ +#define NEXT(ep) ((ep == events + EV_MAX - 1) ? events : ep + 1) +#define PREV(ep) ((ep == events) ? events + EV_MAX - 1 : ep - 1) + +void _nc_mouse_init(SCREEN *sp) +/* initialize the mouse -- called at screen-setup time */ +{ + int i; + + T(("_nc_mouse_init() called")); + + for (i = 0; i < EV_MAX; i++) + events[i].id = INVALID_EVENT; + +#ifdef EXTERN_TERMINFO + /* we know how to recognize mouse events under xterm */ + if (!strncmp(cur_term->name, "xterm", 5) && key_mouse) + mousetype = M_XTERM; +#else + /* we know how to recognize mouse events under xterm */ + if (!strncmp(cur_term->type.term_names, "xterm", 5) && key_mouse) + mousetype = M_XTERM; +#endif + + /* GPM: initialize connection to gpm server */ +} + +bool _nc_mouse_event(SCREEN *sp) +/* query to see if there is a pending mouse event */ +{ + /* xterm: never have to query, mouse events are in the keyboard stream */ + /* GPM: query server for event, return TRUE if we find one */ + return(FALSE); /* no event waiting */ +} + +bool _nc_mouse_inline(SCREEN *sp) +/* mouse report received in the keyboard stream -- parse its info */ +{ + T(("_nc_mouse_inline() called")); + + if (mousetype == M_XTERM) + { + char kbuf[4]; + MEVENT *prev; + + /* This code requires that your xterm entry contain the kmous + * capability and that it be set to the \E[M documented in the + * Xterm Control Sequences reference. This is how we + * arrange for mouse events to be reported via a KEY_MOUSE + * return value from wgetch(). After this value is received, + * _nc_mouse_inline() gets called and is immediately + * responsible for parsing the mouse status information + * following the prefix. + * + * The following quotes from the ctrlseqs.ms document in the + * X distribution, describing the X mouse tracking feature: + * + * Parameters for all mouse tracking escape sequences + * generated by xterm encode numeric parameters in a single + * character as value+040. For example, ! is 1. + * + * On button press or release, xterm sends ESC [ M CbCxCy. + * The low two bits of Cb encode button information: 0=MB1 + * pressed, 1=MB2 pressed, 2=MB3 pressed, 3=release. The + * upper bits encode what modifiers were down when the + * button was pressed and are added together. 4=Shift, + * 8=Meta, 16=Control. Cx and Cy are the x and y coordinates + * of the mouse event. The upper left corner is (1,1). + * + * (End quote) By the time we get here, we've eaten the + * key prefix. + */ + (void) read(sp->_ifd, &kbuf, 3); + kbuf[3] = '\0'; + +#ifdef MOUSEDEBUG + T(("_nc_mouse_inline sees the following xterm data: '%s'", kbuf)); +#endif /* MOUSEDEBUG */ + + eventp->id = 0; /* there's only one mouse... */ + + /* processing code goes here */ + eventp->bstate = 0; + switch (kbuf[0] & 0x3) + { + case 0x0: + eventp->bstate = BUTTON1_PRESSED; + break; + + case 0x1: + eventp->bstate = BUTTON2_PRESSED; + break; + + case 0x2: + eventp->bstate = BUTTON3_PRESSED; + break; + + case 0x3: + /* + * Release events aren't reported for individual buttons, + * just for the button set as a whole... + */ + eventp->bstate = + (BUTTON1_RELEASED | + BUTTON2_RELEASED | + BUTTON3_RELEASED); + /* + * ...however, because there are no kinds of mouse events under + * xterm that can intervene between press and release, we can + * deduce which buttons were actually released by looking at the + * previous event. + */ + prev = PREV(eventp); + if (!(prev->bstate & BUTTON1_PRESSED)) + eventp->bstate &=~ BUTTON1_RELEASED; + if (!(prev->bstate & BUTTON2_PRESSED)) + eventp->bstate &=~ BUTTON2_RELEASED; + if (!(prev->bstate & BUTTON3_PRESSED)) + eventp->bstate &=~ BUTTON3_RELEASED; + break; + } + + if (kbuf[0] & 4) { + eventp->bstate |= BUTTON_SHIFT; + } + if (kbuf[0] & 8) { + eventp->bstate |= BUTTON_ALT; + } + if (kbuf[0] & 16) { + eventp->bstate |= BUTTON_CTRL; + } + + eventp->x = (kbuf[1] - ' ') - 1; + eventp->y = (kbuf[2] - ' ') - 1; + T(("_nc_mouse_inline: primitive mouse-event %s has slot %d", _tracemouse(eventp), eventp - events)); + + /* bump the next-free pointer into the circular list */ + eventp = NEXT(eventp); + } + + return(FALSE); +} + +static void mouse_activate(bool on) +{ + if (mousetype == M_XTERM) + { + if (on) + { + TPUTS_TRACE("xterm mouse initialization"); + putp("\033[?1000h"); + } + else + { + TPUTS_TRACE("xterm mouse deinitialization"); + putp("\033[?1000l"); + } + (void) fflush(SP->_ofp); + } +} + +/************************************************************************** + * + * Device-independent code + * + **************************************************************************/ + +bool _nc_mouse_parse(int runcount) +/* parse a run of atomic mouse events into a gesture */ +{ + MEVENT *ep, *runp, *next, *prev = PREV(eventp); + int n; + bool merge; + + T(("_nc_mouse_parse() called")); + /* + * When we enter this routine, the event list next-free pointer + * points just past a run of mouse events that we know were separated + * in time by less than the critical click interval. The job of this + * routine is to collaps this run into a single higher-level event + * or gesture. + * + * We accomplish this in two passes. The first pass merges press/release + * pairs into click events. The second merges runs of click events into + * double or triple-click events. + * + * It's possible that the run may not resolve to a single event (for + * example, if the user quadruple-clicks). If so, leading events + * in the run are ignored. + * + * Note that this routine is independent of the format of the specific + * format of the pointing-device's reports. We can use it to parse + * gestures on anything that reports press/release events on a per- + * button basis, as long as the device-dependent mouse code puts stuff + * on the queue in MEVENT format. + */ + if (runcount == 1) + { + T(("_nc_mouse_parse: returning simple mouse event %s at slot %d", + _tracemouse(prev), prev-events)); + return(PREV(prev)->bstate & eventmask); + } + + /* find the start of the run */ + runp = eventp; + for (n = runcount; n > 0; n--) + runp = PREV(runp); + +#ifdef MOUSEDEBUG + T(("before mouse press/release merge:")); + for (ep = events; ep < events + EV_MAX; ep++) + T(("mouse event queue slot %d = %s", ep-events, _tracemouse(ep))); + T(("_nc_mouse_parse: run starts at %d, ends at %d, count %d", + runp-events, ((eventp - events) + (EV_MAX - 1)) % EV_MAX, runcount)); +#endif /* MOUSEDEBUG */ + + /* first pass; merge press/release pairs */ + do { + merge = FALSE; + for (ep = runp; next = NEXT(ep), next != eventp; ep = next) + { + if (ep->x == next->x && ep->y == next->y + && (ep->bstate & (BUTTON1_PRESSED|BUTTON2_PRESSED|BUTTON3_PRESSED)) + && (!(ep->bstate & BUTTON1_PRESSED) + == !(next->bstate & BUTTON1_RELEASED)) + && (!(ep->bstate & BUTTON2_PRESSED) + == !(next->bstate & BUTTON2_RELEASED)) + && (!(ep->bstate & BUTTON3_PRESSED) + == !(next->bstate & BUTTON3_RELEASED)) + ) + { + if ((eventmask & BUTTON1_CLICKED) + && (ep->bstate & BUTTON1_PRESSED)) + { + ep->bstate &=~ BUTTON1_PRESSED; + ep->bstate |= BUTTON1_CLICKED; + merge = TRUE; + } + if ((eventmask & BUTTON2_CLICKED) + && (ep->bstate & BUTTON2_PRESSED)) + { + ep->bstate &=~ BUTTON2_PRESSED; + ep->bstate |= BUTTON2_CLICKED; + merge = TRUE; + } + if ((eventmask & BUTTON3_CLICKED) + && (ep->bstate & BUTTON3_PRESSED)) + { + ep->bstate &=~ BUTTON3_PRESSED; + ep->bstate |= BUTTON3_CLICKED; + merge = TRUE; + } + if (merge) + next->id = INVALID_EVENT; + } + } + } while + (merge); + +#ifdef MOUSEDEBUG + T(("before mouse click merges:")); + for (ep = events; ep < events + EV_MAX; ep++) + T(("mouse event queue slot %d = %s", ep-events, _tracemouse(ep))); + T(("_nc_mouse_parse: run starts at %d, ends at %d, count %d", + runp-events, ((eventp - events) + (EV_MAX - 1)) % EV_MAX, runcount)); +#endif /* MOUSEDEBUG */ + + /* + * Second pass; merge click runs. At this point, click events are + * each followed by one invalid event. We merge click events + * forward in the queue. + * + * NOTE: There is a problem with this design! If the application + * allows enough click events to pile up in the circular queue so + * they wrap around, it will cheerfully merge the newest forward + * into the oldest, creating a bogus doubleclick and confusing + * the queue-traversal logic rather badly. Generally this won't + * happen, because calling getmouse() marks old events invalid and + * ineligible for merges. The true solution to this problem would + * be to timestamp each MEVENT and perform the obvious sanity check, + * but the timer element would have to have sub-second resolution, + * which would get us into portability trouble. + */ + do { + MEVENT *follower; + + merge = FALSE; + for (ep = runp; next = NEXT(ep), next != eventp; ep = next) + if (ep->id != INVALID_EVENT) + { + if (next->id != INVALID_EVENT) + continue; + follower = NEXT(next); + if (follower->id == INVALID_EVENT) + continue; + + /* merge click events forward */ + if ((ep->bstate & + (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED)) + && (follower->bstate & + (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED))) + { + if ((eventmask & BUTTON1_DOUBLE_CLICKED) + && (follower->bstate & BUTTON1_CLICKED)) + { + follower->bstate &=~ BUTTON1_CLICKED; + follower->bstate |= BUTTON1_DOUBLE_CLICKED; + merge = TRUE; + } + if ((eventmask & BUTTON2_DOUBLE_CLICKED) + && (follower->bstate & BUTTON2_CLICKED)) + { + follower->bstate &=~ BUTTON2_CLICKED; + follower->bstate |= BUTTON2_DOUBLE_CLICKED; + merge = TRUE; + } + if ((eventmask & BUTTON3_DOUBLE_CLICKED) + && (follower->bstate & BUTTON3_CLICKED)) + { + follower->bstate &=~ BUTTON3_CLICKED; + follower->bstate |= BUTTON3_DOUBLE_CLICKED; + merge = TRUE; + } + if (merge) + ep->id = INVALID_EVENT; + } + + /* merge double-click events forward */ + if ((ep->bstate & + (BUTTON1_DOUBLE_CLICKED + | BUTTON2_DOUBLE_CLICKED + | BUTTON3_DOUBLE_CLICKED)) + && (follower->bstate & + (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED))) + { + if ((eventmask & BUTTON1_TRIPLE_CLICKED) + && (follower->bstate & BUTTON1_CLICKED)) + { + follower->bstate &=~ BUTTON1_CLICKED; + follower->bstate |= BUTTON1_TRIPLE_CLICKED; + merge = TRUE; + } + if ((eventmask & BUTTON2_TRIPLE_CLICKED) + && (follower->bstate & BUTTON2_CLICKED)) + { + follower->bstate &=~ BUTTON2_CLICKED; + follower->bstate |= BUTTON2_TRIPLE_CLICKED; + merge = TRUE; + } + if ((eventmask & BUTTON3_TRIPLE_CLICKED) + && (follower->bstate & BUTTON3_CLICKED)) + { + follower->bstate &=~ BUTTON3_CLICKED; + follower->bstate |= BUTTON3_TRIPLE_CLICKED; + merge = TRUE; + } + if (merge) + ep->id = INVALID_EVENT; + } + } + } while + (merge); + +#ifdef MOUSEDEBUG + T(("before mouse event queue compaction:")); + for (ep = events; ep < events + EV_MAX; ep++) + T(("mouse event queue slot %d = %s", ep-events, _tracemouse(ep))); + T(("_nc_mouse_parse: uncompacted run starts at %d, ends at %d, count %d", + runp-events, ((eventp - events) + (EV_MAX - 1)) % EV_MAX, runcount)); +#endif /* MOUSEDEBUG */ + + /* + * Now try to throw away trailing events flagged invalid, or that + * don't match the current event mask. + */ + for (; runcount; prev = PREV(eventp), runcount--) + if (prev->id == INVALID_EVENT || !(prev->bstate & eventmask)) + eventp = prev; + +#ifdef TRACE +#ifdef MOUSEDEBUG + T(("after mouse event queue compaction:")); + for (ep = events; ep < events + EV_MAX; ep++) + T(("mouse event queue slot %d = %s", ep-events, _tracemouse(ep))); + T(("_nc_mouse_parse: compacted run starts at %d, ends at %d, count %d", + runp-events, ((eventp - events) + (EV_MAX - 1)) % EV_MAX, runcount)); +#endif /* MOUSEDEBUG */ + for (ep = runp; ep != eventp; ep = NEXT(ep)) + if (ep->id != INVALID_EVENT) + T(("_nc_mouse_parse: returning composite mouse event %s at slot %d", + _tracemouse(ep), ep-events)); +#endif /* TRACE */ + + /* after all this, do we have a valid event? */ + return(PREV(eventp)->id != INVALID_EVENT); +} + +void _nc_mouse_wrap(SCREEN *sp) +/* release mouse -- called by endwin() before shellout/exit */ +{ + T(("_nc_mouse_wrap() called")); + + /* xterm: turn off reporting */ + if (mousetype == M_XTERM && eventmask) + { + mouse_activate(FALSE); + eventmask = 0; + } + + /* GPM: pass all mouse events to next client */ +} + +void _nc_mouse_resume(SCREEN *sp) +/* re-connect to mouse -- called by doupdate() after shellout */ +{ + T(("_nc_mouse_resume() called")); + + /* xterm: re-enable reporting */ + if (mousetype == M_XTERM && eventmask) + mouse_activate(TRUE); + + /* GPM: reclaim our event set */ +} + +/************************************************************************** + * + * Mouse interface entry points for the API + * + **************************************************************************/ + +int getmouse(MEVENT *aevent) +/* grab a copy of the current mouse event */ +{ + if (mousetype == M_XTERM) + { + /* compute the current-event pointer */ + MEVENT *prev = PREV(eventp); + + /* copy the event we find there */ + *aevent = *prev; + +#ifdef MOUSEDEBUG + T(("getmouse: returning event %s from slot %d", + _tracemouse(prev), prev-events)); +#endif /* MOUSEDEBUG */ + + prev->id = INVALID_EVENT; /* so the queue slot becomes free */ + return(OK); + } + return(ERR); +} + +int ungetmouse(MEVENT *aevent) +/* enqueue a synthesized mouse event to be seen by the next wgetch() */ +{ + /* stick the given event in the next-free slot */ + *eventp = *aevent; + + /* bump the next-free pointer into the circular list */ + eventp = NEXT(eventp); + + /* push back the notification event on the keyboard queue */ + return ungetch(KEY_MOUSE); +} + +mmask_t mousemask(mmask_t newmask, mmask_t *oldmask) +/* set the mouse event mask */ +{ + if (oldmask) + *oldmask = eventmask; + + if (mousetype == M_XTERM) + { + eventmask = newmask & + (BUTTON_ALT | BUTTON_CTRL | BUTTON_SHIFT + | BUTTON1_PRESSED | BUTTON1_RELEASED | BUTTON1_CLICKED + | BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED + | BUTTON2_PRESSED | BUTTON2_RELEASED | BUTTON2_CLICKED + | BUTTON2_DOUBLE_CLICKED | BUTTON2_TRIPLE_CLICKED + | BUTTON3_PRESSED | BUTTON3_RELEASED | BUTTON3_CLICKED + | BUTTON3_DOUBLE_CLICKED | BUTTON3_TRIPLE_CLICKED); + + mouse_activate(eventmask != 0); + + return(eventmask); + } + + return(0); +} + +bool wenclose(WINDOW *win, int y, int x) +/* check to see if given window encloses given screen location */ +{ + return + (win->_begy <= y && win->_begx <= x + && win->_maxx >= x && win->_maxy >= y); +} + +int mouseinterval(int maxclick) +/* set the maximum mouse interval within which to recognize a click */ +{ + int oldval = _nc_max_click_interval; + + _nc_max_click_interval = maxclick; + return(oldval); +} + +/* lib_mouse.c ends here */ diff --git a/lib/libcurses/lib_move.c b/lib/libcurses/lib_move.c new file mode 100644 index 00000000000..547aa1762e3 --- /dev/null +++ b/lib/libcurses/lib_move.c @@ -0,0 +1,48 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_move.c +** +** The routine wmove(). +** +*/ + +#include "curses.priv.h" + +int +wmove(WINDOW *win, int y, int x) +{ + T(("wmove(%p,%d,%d) called", win, y, x)); + + if (x >= 0 && x <= win->_maxx && + y >= 0 && y <= win->_maxy) + { + win->_curx = (short)x; + win->_cury = (short)y; + + win->_flags &= ~_NEED_WRAP; + win->_flags |= _HASMOVED; + return(OK); + } else + return(ERR); +} diff --git a/lib/libcurses/lib_mvcur.c b/lib/libcurses/lib_mvcur.c new file mode 100644 index 00000000000..b8483e95480 --- /dev/null +++ b/lib/libcurses/lib_mvcur.c @@ -0,0 +1,1389 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_mvcur.c +** +** The routines for moving the physical cursor and scrolling: +** +** void _nc_mvcur_init(void), mvcur_wrap(void) +** +** int mvcur(int old_y, int old_x, int new_y, int new_x) +** +** void _nc_mvcur_wrap(void) +** +** int _nc_mvcur_scrolln(int n, int top, int bot, int maxy) +** +** Comparisons with older movement optimizers: +** SVr3 curses mvcur() can't use cursor_to_ll or auto_left_margin. +** 4.4BSD curses can't use cuu/cud/cuf/cub/hpa/vpa/tab/cbt for local +** motions. It doesn't use tactics based on auto_left_margin. Weirdly +** enough, it doesn't use its own hardware-scrolling routine to scroll up +** destination lines for out-of-bounds addresses! +** old ncurses optimizer: less accurate cost computations (in fact, +** it was broken and had to be commented out!). +** +** Compile with -DMAIN to build an interactive tester/timer for the movement +** optimizer. You can use it to investigate the optimizer's behavior. +** You can also use it for tuning the formulas used to determine whether +** or not full optimization is attempted. +** +** This code has a nasty tendency to find bugs in terminfo entries, because it +** exercises the non-cup movement capabilities heavily. If you think you've +** found a bug, try deleting subsets of the following capabilities (arranged +** in decreasing order of suspiciousness): it, tab, cbt, hpa, vpa, cuu, cud, +** cuf, cub, cuu1, cud1, cuf1, cub1. It may be that one or more are wrong. +** +** Note: you should expect this code to look like a resource hog in a profile. +** That's because it does a lot of I/O, through the tputs() calls. The I/O +** cost swamps the computation overhead (and as machines get faster, this +** will become even more true). Comments in the test exerciser at the end +** go into detail about tuning and how you can gauge the optimizer's +** effectiveness. +**/ + +/**************************************************************************** + * + * Constants and macros for optimizer tuning. + * + ****************************************************************************/ + +/* + * The average overhead of a full optimization computation in character + * transmission times. If it's too high, the algorithm will be a bit + * over-biased toward using cup rather than local motions; if it's too + * low, the algorithm may spend more time than is strictly optimal + * looking for non-cup motions. Profile the optimizer using the `t' + * command of the exerciser (see below), and round to the nearest integer. + * + * Yes, I (esr) thought about computing expected overhead dynamically, say + * by derivation from a running average of optimizer times. But the + * whole point of this optimization is to *decrease* the frequency of + * system calls. :-) + */ +#define COMPUTE_OVERHEAD 1 /* I use a 90MHz Pentium @ 9.6Kbps */ + +/* + * LONG_DIST is the distance we consider to be just as costly to move over as a + * cup sequence is to emit. In other words, it's the length of a cup sequence + * adjusted for average computation overhead. The magic number is the length + * of "\033[yy;xxH", the typical cup sequence these days. + */ +#define LONG_DIST (8 - COMPUTE_OVERHEAD) + +/* + * Tell whether a motion is optimizable by local motions. Needs to be cheap to + * compute. In general, all the fast moves go to either the right or left edge + * of the screen. So any motion to a location that is (a) further away than + * LONG_DIST and (b) further inward from the right or left edge than LONG_DIST, + * we'll consider nonlocal. + */ +#define NOT_LOCAL(fy, fx, ty, tx) ((tx > LONG_DIST) && (tx < screen_lines - 1 - LONG_DIST) && (abs(ty-fy) + abs(tx-fx) > LONG_DIST)) + +/**************************************************************************** + * + * External interfaces + * + ****************************************************************************/ + +/* + * For this code to work OK, the following components must live in the + * screen structure: + * + * int _char_padding; // cost of character put + * int _cr_cost; // cost of (carriage_return) + * int _cup_cost; // cost of (cursor_address) + * int _home_cost; // cost of (cursor_home) + * int _ll_cost; // cost of (cursor_to_ll) + *#ifdef TABS_OK + * int _ht_cost; // cost of (tab) + * int _cbt_cost; // cost of (backtab) + *#endif TABS_OK + * int _cub1_cost; // cost of (cursor_left) + * int _cuf1_cost; // cost of (cursor_right) + * int _cud1_cost; // cost of (cursor_down) + * int _cuu1_cost; // cost of (cursor_up) + * int _cub_cost; // cost of (parm_cursor_left) + * int _cuf_cost; // cost of (parm_cursor_right) + * int _cud_cost; // cost of (parm_cursor_down) + * int _cuu_cost; // cost of (parm_cursor_up) + * int _hpa_cost; // cost of (column_address) + * int _vpa_cost; // cost of (row_address) + * + * The TABS_OK switch controls whether it is reliable to use tab/backtabs + * for local motions. On many systems, it's not, due to uncertainties about + * tab delays and whether or not tabs will be expanded in raw mode. If you + * have parm_right_cursor, tab motions don't win you a lot anyhow. + */ + +#include "curses.priv.h" +#include "term.h" + +#define NLMAPPING SP->_nl /* nl() on? */ +#define RAWFLAG SP->_raw /* raw() on? */ +#define CURRENT_ATTR SP->_current_attr /* current phys attribute */ +#define CURRENT_ROW SP->_cursrow /* phys cursor row */ +#define CURRENT_COLUMN SP->_curscol /* phys cursor column */ +#define REAL_ATTR SP->_current_attr /* phys current attribute */ +#define WANT_CHAR(y, x) SP->_newscr->_line[y].text[x] /* desired state */ +#define BAUDRATE SP->_baudrate /* bits per second */ + +#include <string.h> +#include <ctype.h> +#include <stdlib.h> + +#ifdef TRACE +bool no_optimize; /* suppress optimization */ +#endif /* TRACE */ + +#ifdef MAIN +#include <sys/time.h> + +static bool profiling = FALSE; +static float diff; +#endif /* MAIN */ + +#define OPT_SIZE 512 + +static char *address_cursor; +static int carriage_return_length; +static int cursor_home_length; +static int cursor_to_ll_length; + +static void save_curs(void); +static void restore_curs(void); + +/**************************************************************************** + * + * Initialization/wrapup (including cost pre-computation) + * + ****************************************************************************/ + +#define INFINITY 1000000 /* too high to use */ + +static int cost(char *cap, int affcnt) +/* compute the cost of a given operation */ +{ + if (cap == (char *)NULL) + return(INFINITY); + else + { + char *cp; + float cum_cost = 0; + + for (cp = cap; *cp; cp++) + { + /* extract padding, either mandatory or required */ + if (cp[0] == '$' && cp[1] == '<' && strchr(cp, '>')) + { + float number = 0; + + for (cp += 2; *cp != '>'; cp++) + { + if (isdigit(*cp)) + number = number * 10 + (*cp - '0'); + else if (*cp == '.') + number += (*++cp - 10) / 10.0; + else if (*cp == '*') + number *= affcnt; + } + + cum_cost += number * 10; + } + else + cum_cost += SP->_char_padding; + } + + return((int)cum_cost); + } +} + +void _nc_mvcur_init(SCREEN *sp) +/* initialize the cost structure */ +{ + /* + * 9 = 7 bits + 1 parity + 1 stop. + */ + if (BAUDRATE != 0) + SP->_char_padding = (9 * 1000 * 10) / BAUDRATE; + else + SP->_char_padding = 9 * 1000 * 10 / 9600; /* use some default if baudrate == 0 */ + + /* non-parameterized local-motion strings */ + SP->_cr_cost = cost(carriage_return, 0); + SP->_home_cost = cost(cursor_home, 0); + SP->_ll_cost = cost(cursor_to_ll, 0); +#ifdef TABS_OK + SP->_ht_cost = cost(tab, 0); + SP->_cbt_cost = cost(back_tab, 0); +#endif /* TABS_OK */ + SP->_cub1_cost = cost(cursor_left, 0); + SP->_cuf1_cost = cost(cursor_right, 0); + SP->_cud1_cost = cost(cursor_down, 0); + SP->_cuu1_cost = cost(cursor_up, 0); + + /* + * Assumption: if the terminal has memory_relative addressing, the + * initialization strings or smcup will set single-page mode so we + * can treat it like absolute screen addressing. This seems to be true + * for all cursor_mem_address terminal types in the terminfo database. + */ + address_cursor = cursor_address ? cursor_address : cursor_mem_address; + + /* + * Parametrized local-motion strings. This static cost computation + * depends on the following assumptions: + * + * (1) They never have * padding. In the entire master terminfo database + * as of March 1995, only the obsolete Zenith Z-100 pc violates this. + * (Proportional padding is found mainly in insert, delete and scroll + * capabilities). + * + * (2) The average case of cup has two two-digit parameters. Strictly, + * the average case for a 24 * 80 screen has ((10*10*(1 + 1)) + + * (14*10*(1 + 2)) + (10*70*(2 + 1)) + (14*70*4)) / (24*80) = 3.458 + * digits of parameters. On a 25x80 screen the average is 3.6197. + * On larger screens the value gets much closer to 4. + * + * (3) The average case of cub/cuf/hpa has 2 digits of parameters + * (strictly, (((10 * 1) + (70 * 2)) / 80) = 1.8750). + * + * (4) The average case of cud/cuu/vpa has 2 digits of parameters + * (strictly, (((10 * 1) + (14 * 2)) / 24) = 1.5833). + * + * All these averages depend on the assumption that all parameter values + * are equally probable. + */ + SP->_cup_cost = cost(tparm(address_cursor, 23, 23), 1); + SP->_cub_cost = cost(tparm(parm_left_cursor, 23), 1); + SP->_cuf_cost = cost(tparm(parm_right_cursor, 23), 1); + SP->_cud_cost = cost(tparm(parm_down_cursor, 23), 1); + SP->_cuu_cost = cost(tparm(parm_up_cursor, 23), 1); + SP->_hpa_cost = cost(tparm(column_address, 23), 1); + SP->_vpa_cost = cost(tparm(row_address, 23), 1); + + /* initialize screen for cursor access */ + if (enter_ca_mode) + { + TPUTS_TRACE("enter_ca_mode"); + putp(enter_ca_mode); + } + + /* pre-compute some capability lengths */ + carriage_return_length = carriage_return ? strlen(carriage_return) : 0; + cursor_home_length = cursor_home ? strlen(cursor_home) : 0; + cursor_to_ll_length = cursor_to_ll ? strlen(cursor_to_ll) : 0; +} + +void _nc_mvcur_wrap(void) +/* wrap up cursor-addressing mode */ +{ + /* change_scroll_region may trash the cursor location */ + save_curs(); + if (change_scroll_region) + { + TPUTS_TRACE("change_scroll_region"); + putp(tparm(change_scroll_region, 0, screen_lines - 1)); + } + restore_curs(); + + if (exit_ca_mode) + { + TPUTS_TRACE("exit_ca_mode"); + putp(exit_ca_mode); + } +} + +/**************************************************************************** + * + * Optimized cursor movement + * + ****************************************************************************/ + +/* + * Perform repeated-append, returning cost + */ +static __inline int +repeated_append (int total, int num, int repeat, char *dst, char *src) +{ + register size_t src_len = strlen(src); + register size_t dst_len = 0; + + if (dst) + dst_len = strlen(dst); + if ((dst_len + repeat * src_len) < OPT_SIZE-1) { + total += (num * repeat); + if (dst) { + dst += dst_len; + while (repeat-- > 0) { + (void) strcpy(dst, src); + dst += src_len; + } + } + } else { + total = INFINITY; + } + return total; +} + +#ifndef NO_OPTIMIZE +#define NEXTTAB(fr) (fr + init_tabs - (fr % init_tabs)) +#define LASTTAB(fr) (fr - init_tabs + (fr % init_tabs)) + +/* Note: we'd like to inline this for speed, but GNU C barfs on the attempt. */ + +static int +relative_move(char *result, int from_y,int from_x,int to_y,int to_x, bool ovw) +/* move via local motions (cuu/cuu1/cud/cud1/cub1/cub/cuf1/cuf/vpa/hpa) */ +{ + int n, vcost = 0, hcost = 0; + bool used_lf = FALSE; + + if (result) + result[0] = '\0'; + + if (to_y != from_y) + { + vcost = INFINITY; + + if (row_address) + { + if (result) + (void) strcpy(result, tparm(row_address, to_y)); + vcost = SP->_vpa_cost; + } + + if (to_y > from_y) + { + n = (to_y - from_y); + + if (parm_down_cursor && SP->_cud_cost < vcost) + { + if (result) + (void) strcpy(result, tparm(parm_down_cursor, n)); + vcost = SP->_cud_cost; + } + + if (cursor_down && (n * SP->_cud1_cost < vcost)) + { + if (result) + result[0] = '\0'; + if (cursor_down[0] == '\n') + used_lf = TRUE; + vcost = repeated_append(vcost, SP->_cud1_cost, n, result, cursor_down); + } + } + else /* (to_y < from_y) */ + { + n = (from_y - to_y); + + if (parm_up_cursor && SP->_cup_cost < vcost) + { + if (result) + (void) strcpy(result, tparm(parm_up_cursor, n)); + vcost = SP->_cup_cost; + } + + if (cursor_up && (n * SP->_cuu1_cost < vcost)) + { + if (result) + result[0] = '\0'; + vcost = repeated_append(vcost, SP->_cuu1_cost, n, result, cursor_up); + } + } + + if (vcost == INFINITY) + return(INFINITY); + } + + /* + * It may be that we're using a cud1 capability of \n with the + * side-effect of taking the cursor to column 0. Deal with this. + */ + if (used_lf && NLMAPPING && !RAWFLAG) + from_x = 0; + + if (result) + result += strlen(result); + + if (to_x != from_x) + { + char try[OPT_SIZE]; + + hcost = INFINITY; + + if (column_address) + { + if (result) + (void) strcpy(result, tparm(column_address, to_x)); + hcost = SP->_hpa_cost; + } + + if (to_x > from_x) + { + n = to_x - from_x; + + if (parm_right_cursor && SP->_cuf_cost < hcost) + { + if (result) + (void) strcpy(result, tparm(parm_right_cursor, n)); + hcost = SP->_cuf_cost; + } + + if (cursor_right) + { + int lhcost = 0; + + try[0] = '\0'; + +#ifdef TABS_OK + /* use hard tabs, if we have them, to do as much as possible */ + if (init_tabs > 0 && tab) + { + int nxt, fr; + + for (fr = from_x; (nxt = NEXTTAB(fr)) <= to_x; fr = nxt) + { + lhcost = repeated_append(lhcost, SP->_ht_cost, 1, try, tab); + if (lhcost == INFINITY) + break; + } + + n = to_x - fr; + from_x = fr; + } +#endif /* TABS_OK */ + +#if defined(REAL_ATTR) && defined(WANT_CHAR) + /* + * If we have no attribute changes, overwrite is cheaper. + * Note: must suppress this by passing in ovw = FALSE whenever + * WANT_CHAR would return invalid data. In particular, this + * is true between the time a hardware scroll has been done + * and the time the structure WANT_CHAR would access has been + * updated. + */ + if (ovw) + { + int i; + + for (i = 0; i < n; i++) + if ((WANT_CHAR(to_y, from_x + i) & A_ATTRIBUTES) != CURRENT_ATTR) + { + ovw = FALSE; + break; + } + } + if (ovw) + { + char *sp; + int i; + + sp = try + strlen(try); + + for (i = 0; i < n; i++) + *sp++ = WANT_CHAR(to_y, from_x + i); + *sp = '\0'; + lhcost += n * SP->_char_padding; + } + else +#endif /* defined(REAL_ATTR) && defined(WANT_CHAR) */ + { + lhcost = repeated_append(lhcost, SP->_cuf1_cost, n, try, cursor_right); + } + + if (lhcost < hcost) + { + if (result) + (void) strcpy(result, try); + hcost = lhcost; + } + } + } + else /* (to_x < from_x) */ + { + n = from_x - to_x; + + if (parm_left_cursor && SP->_cub_cost < hcost) + { + if (result) + (void) strcpy(result, tparm(parm_left_cursor, n)); + hcost = SP->_cub_cost; + } + + if (cursor_left) + { + int lhcost = 0; + + try[0] = '\0'; + +#ifdef TABS_OK + if (init_tabs > 0 && back_tab) + { + int nxt, fr; + + for (fr = from_x; (nxt = LASTTAB(fr)) >= to_x; fr = nxt) + { + lhcost = repeated_append(lhcost, SP->_cbt_cost, 1, try, back_tab); + if (lhcost == INFINITY) + break; + } + + n = to_x - fr; + } +#endif /* TABS_OK */ + + lhcost = repeated_append(lhcost, SP->_cub1_cost, n, try, cursor_left); + + if (lhcost < hcost) + { + if (result) + (void) strcpy(result, try); + hcost = lhcost; + } + } + } + + if (hcost == INFINITY) + return(INFINITY); + } + + return(vcost + hcost); +} +#endif /* !NO_OPTIMIZE */ + +/* + * With the machinery set up above, it's conceivable that + * onscreen_mvcur could be modified into a recursive function that does + * an alpha-beta search of motion space, as though it were a chess + * move tree, with the weight function being boolean and the search + * depth equated to length of string. However, this would jack up the + * computation cost a lot, especially on terminals without a cup + * capability constraining the search tree depth. So we settle for + * the simpler method below. + */ + +static __inline int +onscreen_mvcur(int yold,int xold,int ynew,int xnew, bool ovw) +/* onscreen move from (yold, xold) to (ynew, xnew) */ +{ + char use[OPT_SIZE], *sp; + int tactic = 0, newcost, usecost = INFINITY; + +#ifdef MAIN + struct timeval before, after; + + gettimeofday(&before, NULL); +#endif /* MAIN */ + + /* tactic #0: use direct cursor addressing */ + sp = tparm(address_cursor, ynew, xnew); + if (sp) + { + tactic = 0; + (void) strcpy(use, sp); + usecost = SP->_cup_cost; + +#ifdef TRACE + if (no_optimize) + xold = yold = -1; +#endif /* TRACE */ + + /* + * We may be able to tell in advance that the full optimization + * will probably not be worth its overhead. Also, don't try to + * use local movement if the current attribute is anything but + * A_NORMAL...there are just too many ways this can screw up + * (like, say, local-movement \n getting mapped to some obscure + * character because A_ALTCHARSET is on). + */ + if (yold == -1 || xold == -1 || + REAL_ATTR != A_NORMAL || NOT_LOCAL(yold, xold, ynew, xnew)) + { +#ifdef MAIN + if (!profiling) + { + (void) fputs("nonlocal\n", stderr); + goto nonlocal; /* always run the optimizer if profiling */ + } +#else + goto nonlocal; +#endif /* MAIN */ + } + } + +#ifndef NO_OPTIMIZE + /* tactic #1: use local movement */ + if (yold != -1 && xold != -1 + && ((newcost=relative_move(NULL, yold, xold, ynew, xnew, ovw))!=INFINITY) + && newcost < usecost) + { + tactic = 1; + usecost = newcost; + } + + /* tactic #2: use carriage-return + local movement */ + if (yold < screen_lines - 1 && xold < screen_columns - 1) + { + if (carriage_return + && ((newcost=relative_move(NULL, yold,0,ynew,xnew, ovw)) != INFINITY) + && SP->_cr_cost + newcost < usecost) + { + tactic = 2; + usecost = SP->_cr_cost + newcost; + } + } + + /* tactic #3: use home-cursor + local movement */ + if (cursor_home + && ((newcost=relative_move(NULL, 0, 0, ynew, xnew, ovw)) != INFINITY) + && SP->_home_cost + newcost < usecost) + { + tactic = 3; + usecost = SP->_home_cost + newcost; + } + + /* tactic #4: use home-down + local movement */ + if (cursor_to_ll + && ((newcost=relative_move(NULL, screen_lines-1, 0, ynew, xnew, ovw)) != INFINITY) + && SP->_ll_cost + newcost < usecost) + { + tactic = 4; + usecost = SP->_ll_cost + newcost; + } + + /* + * tactic #5: use left margin for wrap to right-hand side, + * unless strange wrap behavior indicated by xenl might hose us. + */ + if (auto_left_margin && !eat_newline_glitch + && yold > 0 && yold < screen_lines - 1 && cursor_left + && ((newcost=relative_move(NULL, yold-1, screen_columns-1, ynew, xnew, ovw)) != INFINITY) + && SP->_cr_cost + SP->_cub1_cost + newcost + newcost < usecost) + { + tactic = 5; + usecost = SP->_cr_cost + SP->_cub1_cost + newcost; + } + + /* + * These cases are ordered by estimated relative frequency. + */ + if (tactic) + { + if (tactic == 1) + (void) relative_move(use, yold, xold, ynew, xnew, ovw); + else if (tactic == 2) + { + (void) strcpy(use, carriage_return); + (void) relative_move(use + carriage_return_length, + yold,0,ynew,xnew, ovw); + } + else if (tactic == 3) + { + (void) strcpy(use, cursor_home); + (void) relative_move(use + cursor_home_length, + 0, 0, ynew, xnew, ovw); + } + else if (tactic == 4) + { + (void) strcpy(use, cursor_to_ll); + (void) relative_move(use + cursor_to_ll_length, + screen_lines-1, 0, ynew, xnew, ovw); + } + else /* if (tactic == 5) */ + { + use[0] = '\0'; + if (xold > 0) + (void) strcat(use, carriage_return); + (void) strcat(use, cursor_left); + (void) relative_move(use + strlen(use), + yold-1, screen_columns-1, ynew, xnew, ovw); + } + } +#endif /* !NO_OPTIMIZE */ + +#ifdef MAIN + gettimeofday(&after, NULL); + diff = after.tv_usec - before.tv_usec + + (after.tv_sec - before.tv_sec) * 1000000; + if (!profiling) + (void) fprintf(stderr, "onscreen: %d msec, %f 28.8Kbps char-equivalents\n", + (int)diff, diff/288); +#endif /* MAIN */ + + nonlocal: + if (usecost != INFINITY) + { + TPUTS_TRACE("mvcur"); + tputs(use, 1, _nc_outch); + return(OK); + } + else + return(ERR); +} + +int mvcur(int yold, int xold, int ynew, int xnew) +/* optimized cursor move from (yold, xold) to (ynew, xnew) */ +{ + TR(TRACE_MOVE, ("mvcur(%d,%d,%d,%d) called", yold, xold, ynew, xnew)); + + if (yold == ynew && xold == xnew) + return(OK); + + /* + * Most work here is rounding for terminal boundaries getting the + * column position implied by wraparound or the lack thereof and + * rolling up the screen to get ynew on the screen. + */ + + if (xnew >= screen_columns) + { + ynew += xnew / screen_columns; + xnew %= screen_columns; + } + if (xold >= screen_columns) + { + int l; + + l = (xold + 1) / screen_columns; + yold += l; + xold %= screen_columns; + if (!auto_right_margin) + { + while (l > 0) { + if (newline) + { + TPUTS_TRACE("newline"); + tputs(newline, 0, _nc_outch); + } + else + putchar('\n'); + l--; + } + xold = 0; + } + if (yold > screen_lines - 1) + { + ynew -= yold - (screen_lines - 1); + yold = screen_lines - 1; + } + } + +#ifdef CURSES_OVERRUN /* not used, it takes us out of sync with curscr */ + /* + * The destination line is offscreen. Try to scroll the screen to + * bring it onscreen. Note: this is not a documented feature of the + * API. It's here for compatibility with archaic curses code, a + * feature no one seems to have actually used in a long time. + */ + if (ynew >= screen_lines) + { + if (mvcur_scrolln((ynew - (screen_lines - 1)), 0, screen_lines - 1, screen_lines - 1) == OK) + ynew = screen_lines - 1; + else + return(ERR); + } +#endif /* CURSES_OVERRUN */ + + /* destination location is on screen now */ + return(onscreen_mvcur(yold, xold, ynew, xnew, TRUE)); +} + +/**************************************************************************** + * + * Cursor save_restore + * + ****************************************************************************/ + +/* assumption: sc/rc is faster than cursor addressing */ + +static int oy, ox; /* ugh, mvcur_scrolln() needs to see this */ + +static void save_curs(void) +{ + if (save_cursor && restore_cursor) + { + TPUTS_TRACE("save_cursor"); + putp(save_cursor); + } + + oy = CURRENT_ROW; + ox = CURRENT_COLUMN; +} + +static void restore_curs(void) +{ + if (save_cursor && restore_cursor) + { + TPUTS_TRACE("restore_cursor"); + putp(restore_cursor); + } + else + onscreen_mvcur(-1, -1, oy, ox, FALSE); +} + +/**************************************************************************** + * + * Physical-scrolling support + * + ****************************************************************************/ + +int _nc_mvcur_scrolln(int n, int top, int bot, int maxy) +/* scroll region from top to bot by n lines */ +{ + int i; + + TR(TRACE_MOVE, ("mvcur_scrolln(%d, %d, %d, %d)", n, top, bot, maxy)); + + save_curs(); + + /* + * This code was adapted from Keith Bostic's hardware scrolling + * support for 4.4BSD curses. I (esr) translated it to use terminfo + * capabilities, narrowed the call interface slightly, and cleaned + * up some convoluted tests. I also added support for the memory_above + * memory_below, and non_dest_scroll_region capabilities. + * + * For this code to work, we must have either + * change_scroll_region and scroll forward/reverse commands, or + * insert and delete line capabilities. + * When the scrolling region has been set, the cursor has to + * be at the last line of the region to make the scroll + * happen. + * + * This code makes one aesthetic decision in the opposite way from + * BSD curses. BSD curses preferred pairs of il/dl operations + * over scrolls, allegedly because il/dl looked faster. We, on + * the other hand, prefer scrolls because (a) they're just as fast + * on modern terminals and (b) using them avoids bouncing an + * unchanged bottom section of the screen up and down, which is + * visually nasty. + */ + if (n > 0) + { + /* + * Do explicit clear to end of region if it's possible that the + * terminal might hold on to stuff we push off the end. + */ + if (non_dest_scroll_region || (memory_below && bot == maxy)) + { + if (bot == maxy && clr_eos) + { + mvcur(-1, -1, lines - n, 0); + TPUTS_TRACE("clr_eos"); + tputs(clr_eos, n, _nc_outch); + } + else if (clr_eol) + { + for (i = 0; i < n; i++) + { + mvcur(-1, -1, lines - n + i, 0); + TPUTS_TRACE("clr_eol"); + tputs(clr_eol, n, _nc_outch); + } + } + } + + if (change_scroll_region && (scroll_forward || parm_index)) + { + TPUTS_TRACE("change_scroll_region"); + tputs(tparm(change_scroll_region, top, bot), 0, _nc_outch); + onscreen_mvcur(-1, -1, bot, 0, TRUE); + if (parm_index != NULL) + { + TPUTS_TRACE("parm_index"); + tputs(tparm(parm_index, n, 0), n, _nc_outch); + } + else + for (i = 0; i < n; i++) + { + TPUTS_TRACE("scroll_forward"); + tputs(scroll_forward, 0, _nc_outch); + } + TPUTS_TRACE("change_scroll_region"); + tputs(tparm(change_scroll_region, 0, maxy), 0, _nc_outch); + restore_curs(); + return(OK); + } + + /* Scroll up the block. */ + if (parm_index && top == 0) + { + onscreen_mvcur(oy, ox, bot, 0, TRUE); + TPUTS_TRACE("parm_index"); + tputs(tparm(parm_index, n, 0), n, _nc_outch); + } + else if (parm_delete_line) + { + onscreen_mvcur(oy, ox, top, 0, TRUE); + TPUTS_TRACE("parm_delete_line"); + tputs(tparm(parm_delete_line, n, 0), n, _nc_outch); + } + else if (delete_line) + { + onscreen_mvcur(oy, ox, top, 0, TRUE); + for (i = 0; i < n; i++) + { + TPUTS_TRACE("parm_index"); + tputs(delete_line, 0, _nc_outch); + } + } + else if (scroll_forward && top == 0) + { + onscreen_mvcur(oy, ox, bot, 0, TRUE); + for (i = 0; i < n; i++) + { + TPUTS_TRACE("scroll_forward"); + tputs(scroll_forward, 0, _nc_outch); + } + } + else + return(ERR); + + /* Push down the bottom region. */ + if (parm_insert_line) + { + onscreen_mvcur(top, 0, bot - n + 1, 0, FALSE); + TPUTS_TRACE("parm_insert_line"); + tputs(tparm(parm_insert_line, n, 0), n, _nc_outch); + } + else if (insert_line) + { + onscreen_mvcur(top, 0, bot - n + 1, 0, FALSE); + for (i = 0; i < n; i++) + { + TPUTS_TRACE("insert_line"); + tputs(insert_line, 0, _nc_outch); + } + } + else + return(ERR); + restore_curs(); + } + else /* (n < 0) */ + { + /* + * Explicitly clear if stuff pushed off top of region might + * be saved by the terminal. + */ + if (non_dest_scroll_region || (memory_above && top == 0)) + for (i = 0; i < n; i++) + { + mvcur(-1, -1, i, 0); + TPUTS_TRACE("clr_eol"); + tputs(clr_eol, n, _nc_outch); + } + + if (change_scroll_region && (scroll_reverse || parm_rindex)) + { + TPUTS_TRACE("change_scroll_region"); + tputs(tparm(change_scroll_region, top, bot), 0, _nc_outch); + onscreen_mvcur(-1, -1, top, 0, TRUE); + if (parm_rindex) + { + TPUTS_TRACE("parm_rindex"); + tputs(tparm(parm_rindex, -n, 0), -n, _nc_outch); + } + else + for (i = n; i < 0; i++) + { + TPUTS_TRACE("scroll_reverse"); + tputs(scroll_reverse, 0, _nc_outch); + } + TPUTS_TRACE("change_scroll_region"); + tputs(tparm(change_scroll_region, 0, maxy), 0, _nc_outch); + restore_curs(); + return(OK); + } + + /* Preserve the bottom lines. */ + onscreen_mvcur(oy, ox, bot + n + 1, 0, TRUE); + if (parm_rindex && bot == maxy) + { + TPUTS_TRACE("parm_rindex"); + tputs(tparm(parm_rindex, -n, 0), -n, _nc_outch); + } + else if (parm_delete_line) + { + TPUTS_TRACE("parm_delete_line"); + tputs(tparm(parm_delete_line, -n, 0), -n, _nc_outch); + } + else if (delete_line) + for (i = n; i < 0; i++) + { + TPUTS_TRACE("delete_line"); + tputs(delete_line, 0, _nc_outch); + } + else if (scroll_reverse && bot == maxy) + for (i = n; i < 0; i++) + { + TPUTS_TRACE("scroll_reverse"); + tputs(scroll_reverse, 0, _nc_outch); + } + else + return(ERR); + + /* Scroll the block down. */ + if (parm_insert_line) + { + onscreen_mvcur(bot + n + 1, 0, top, 0, FALSE); + TPUTS_TRACE("parm_insert_line"); + tputs(tparm(parm_insert_line, -n, 0), -n, _nc_outch); + } + else if (insert_line) + { + onscreen_mvcur(bot + n + 1, 0, top, 0, FALSE); + for (i = n; i < 0; i++) + { + TPUTS_TRACE("insert_line"); + tputs(insert_line, 0, _nc_outch); + } + } + else + return(ERR); + restore_curs(); + } + + return(OK); +} + +#ifdef MAIN +/**************************************************************************** + * + * Movement optimizer test code + * + ****************************************************************************/ + +#if HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <string.h> +#include <stdlib.h> +#include "tic.h" +#include "dump_entry.h" + +char *_nc_progname = "mvcur"; + +static unsigned long xmits; + +int tputs(const char *string, int affcnt, int (*outc)(int)) +/* stub tputs() that dumps sequences in a visible form */ +{ + if (profiling) + xmits += strlen(string); + else + (void) fputs(_nc_visbuf(string), stdout); + return(OK); +} + +int putp(const char *string) +{ + return(tputs(string, 1, _nc_outch)); +} + +int _nc_outch(int ch) +{ + putc(ch, stdout); + return OK; +} + +static char tname[BUFSIZ]; + +static void load_term(void) +{ + (void) setupterm(tname, STDOUT_FILENO, NULL); +} + +static int roll(int n) +{ + int i, j; + + i = (RAND_MAX / n) * n; + while ((j = rand()) >= i) + continue; + return (j % n); +} + +int main(int argc, char *argv[]) +{ + (void) strcpy(tname, getenv("TERM")); + load_term(); + _nc_setupscreen(lines, columns); + baudrate(); + + _nc_mvcur_init(SP); +#if HAVE_SETVBUF || HAVE_SETBUFFER + /* + * Undo the effects of our optimization hack, otherwise our interactive + * prompts don't flush properly. + */ +#if HAVE_SETVBUF + (void) setvbuf(SP->_ofp, malloc(BUFSIZ), _IOLBF, BUFSIZ); +#elif HAVE_SETBUFFER + (void) setbuffer(SP->_ofp, malloc(BUFSIZ), BUFSIZ); +#endif +#endif /* HAVE_SETVBUF || HAVE_SETBUFFER */ + + (void) puts("The mvcur tester. Type ? for help"); + + fputs("smcup:", stdout); + putchar('\n'); + + for (;;) + { + int fy, fx, ty, tx, n, i; + char buf[BUFSIZ], capname[BUFSIZ]; + + (void) fputs("> ", stdout); + (void) fgets(buf, sizeof(buf), stdin); + + if (buf[0] == '?') + { +(void) puts("? -- display this help message"); +(void) puts("fy fx ty tx -- (4 numbers) display (fy,fx)->(ty,tx) move"); +(void) puts("s[croll] n t b m -- display scrolling sequence"); +(void) printf("r[eload] -- reload terminal info for %s\n", + getenv("TERM")); +(void) puts("l[oad] <term> -- load terminal info for type <term>"); +(void) puts("nl -- assume NL -> CR/LF when computing (default)"); +(void) puts("nonl -- don't assume NL -> CR/LF when computing"); +(void) puts("d[elete] <cap> -- delete named capability"); +(void) puts("i[nspect] -- display terminal capabilities"); +(void) puts("c[ost] -- dump cursor-optimization cost table"); +(void) puts("o[optimize] -- toggle movement optimization"); +(void) puts("t[orture] <num> -- torture-test with <num> random moves"); +(void) puts("q[uit] -- quit the program"); + } + else if (sscanf(buf, "%d %d %d %d", &fy, &fx, &ty, &tx) == 4) + { + struct timeval before, after; + + putchar('"'); + + gettimeofday(&before, NULL); + mvcur(fy, fx, ty, tx); + gettimeofday(&after, NULL); + + printf("\" (%ld msec)\n", + after.tv_usec - before.tv_usec + (after.tv_sec - before.tv_sec) * 1000000); + } + else if (sscanf(buf, "s %d %d %d %d", &fy, &fx, &ty, &tx) == 4) + { + struct timeval before, after; + + putchar('"'); + + gettimeofday(&before, NULL); + _nc_mvcur_scrolln(fy, fx, ty, tx); + gettimeofday(&after, NULL); + + printf("\" (%ld msec)\n", + after.tv_usec - before.tv_usec + (after.tv_sec - before.tv_sec) * 1000000); + } + else if (buf[0] == 'r') + { + (void) strcpy(tname, getenv("TERM")); + load_term(); + } + else if (sscanf(buf, "l %s", tname) == 1) + { + load_term(); + } + else if (strncmp(buf, "nl", 2) == 0) + { + NLMAPPING = TRUE; + (void) puts("NL -> CR/LF will be assumed."); + } + else if (strncmp(buf, "nonl", 4) == 0) + { + NLMAPPING = FALSE; + (void) puts("NL -> CR/LF will not be assumed."); + } + else if (sscanf(buf, "d %s", capname) == 1) + { + struct name_table_entry const *np = _nc_find_entry(capname, + _nc_info_hash_table); + + if (np == NULL) + (void) printf("No such capability as \"%s\"\n", capname); + else + { + switch(np->nte_type) + { + case BOOLEAN: + cur_term->type.Booleans[np->nte_index] = FALSE; + (void) printf("Boolean capability `%s' (%d) turned off.\n", + np->nte_name, np->nte_index); + break; + + case NUMBER: + cur_term->type.Numbers[np->nte_index] = -1; + (void) printf("Number capability `%s' (%d) set to -1.\n", + np->nte_name, np->nte_index); + break; + + case STRING: + cur_term->type.Strings[np->nte_index] = (char *)NULL; + (void) printf("String capability `%s' (%d) deleted.\n", + np->nte_name, np->nte_index); + break; + } + } + } + else if (buf[0] == 'i') + { + dump_init((char *)NULL, F_TERMINFO, S_TERMINFO, 70, 0); + dump_entry(&cur_term->type, NULL); + putchar('\n'); + } + else if (buf[0] == 'o') + { + if (no_optimize) + { + no_optimize = FALSE; + (void) puts("Optimization is now on."); + } + else + { + no_optimize = TRUE; + (void) puts("Optimization is now off."); + } + } + /* + * You can use the `t' test to profile and tune the movement + * optimizer. Use iteration values in three digits or more. + * At above 5000 iterations the profile timing averages are stable + * to within a millisecond or three. + * + * The `overhead' field of the report will help you pick a + * COMPUTE_OVERHEAD figure appropriate for your processor and + * expected line speed. The `total estimated time' is + * computation time plus a character-transmission time + * estimate computed from the number of transmits and the baud + * rate. + * + * Use this together with the `o' command to get a read on the + * optimizer's effectiveness. Compare the total estimated times + * for `t' runs of the same length in both optimized and un-optimized + * modes. As long as the optimized times are less, the optimizer + * is winning. + */ + else if (sscanf(buf, "t %d", &n) == 1) + { + float cumtime = 0, perchar; + int speeds[] = {2400, 9600, 14400, 19200, 28800, 38400, 0}; + + srand((unsigned)(getpid() + time((time_t *)0))); + profiling = TRUE; + xmits = 0; + for (i = 0; i < n; i++) + { + /* + * This does a move test between two random locations, + * Random moves probably short-change the optimizer, + * which will work better on the short moves probably + * typical of doupdate()'s usage pattern. Still, + * until we have better data... + */ +#ifdef FIND_COREDUMP + int from_y = roll(lines); + int to_y = roll(lines); + int from_x = roll(columns); + int to_x = roll(columns); + + printf("(%d,%d) -> (%d,%d)\n", from_y, from_x, to_y, to_x); + mvcur(from_y, from_x, to_y, to_x); +#else + mvcur(roll(lines), roll(columns), roll(lines), roll(columns)); +#endif /* FIND_COREDUMP */ + if (diff) + cumtime += diff; + } + profiling = FALSE; + + /* + * Average milliseconds per character optimization time. + * This is the key figure to watch when tuning the optimizer. + */ + perchar = cumtime / n; + + (void) printf("%d moves (%ld chars) in %d msec, %f msec each:\n", + n, xmits, (int)cumtime, perchar); + + for (i = 0; speeds[i]; i++) + { + /* + * Total estimated time for the moves, computation and + * transmission both. Transmission time is an estimate + * assuming 9 bits/char, 8 bits + 1 stop bit. + */ + float totalest = cumtime + xmits * 9 * 1e6 / speeds[i]; + + /* + * Per-character optimization overhead in character transmits + * at the current speed. Round this to the nearest integer + * to figure COMPUTE_OVERHEAD for the speed. + */ + float overhead = speeds[i] * perchar / 1e6; + + (void) printf("%6d bps: %3.2f char-xmits overhead; total estimated time %15.2f\n", + speeds[i], overhead, totalest); + } + } + else if (buf[0] == 'c') + { + (void) printf("char padding: %d\n", SP->_char_padding); + (void) printf("cr cost: %d\n", SP->_cr_cost); + (void) printf("cup cost: %d\n", SP->_cup_cost); + (void) printf("home cost: %d\n", SP->_home_cost); + (void) printf("ll cost: %d\n", SP->_ll_cost); +#ifdef TABS_OK + (void) printf("ht cost: %d\n", SP->_ht_cost); + (void) printf("cbt cost: %d\n", SP->_cbt_cost); +#endif /* TABS_OK */ + (void) printf("cub1 cost: %d\n", SP->_cub1_cost); + (void) printf("cuf1 cost: %d\n", SP->_cuf1_cost); + (void) printf("cud1 cost: %d\n", SP->_cud1_cost); + (void) printf("cuu1 cost: %d\n", SP->_cuu1_cost); + (void) printf("cub cost: %d\n", SP->_cub_cost); + (void) printf("cuf cost: %d\n", SP->_cuf_cost); + (void) printf("cud cost: %d\n", SP->_cud_cost); + (void) printf("cuu cost: %d\n", SP->_cuu_cost); + (void) printf("hpa cost: %d\n", SP->_hpa_cost); + (void) printf("vpa cost: %d\n", SP->_vpa_cost); + } + else if (buf[0] == 'x' || buf[0] == 'q') + break; + else + (void) puts("Invalid command."); + } + + (void) fputs("rmcup:", stdout); + _nc_mvcur_wrap(); + putchar('\n'); + + return(0); +} + +#endif /* MAIN */ + +/* lib_mvcur.c ends here */ diff --git a/lib/libcurses/lib_mvwin.c b/lib/libcurses/lib_mvwin.c new file mode 100644 index 00000000000..f84f6941239 --- /dev/null +++ b/lib/libcurses/lib_mvwin.c @@ -0,0 +1,55 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_mvwin.c +** +** The routine mvwin(). +** +*/ + +#include "curses.priv.h" + +int mvwin(WINDOW *win, int by, int bx) +{ + T(("mvwin(%p,%d,%d) called", win, by, bx)); + + if (win->_flags & _SUBWIN) + return(ERR); + + if (by + win->_maxy > screen_lines - 1 + || bx + win->_maxx > screen_columns - 1 + || by < 0 + || bx < 0) + return(ERR); + + /* + * Whether or not the window is moved, touch the window's contents so + * that a following call to 'wrefresh()' will paint the window at the + * new location. This ensures that if the caller has refreshed another + * window at the same location, that this one will be displayed. + */ + win->_begy = by; + win->_begx = bx; + return touchwin(win); +} diff --git a/lib/libcurses/lib_newterm.c b/lib/libcurses/lib_newterm.c new file mode 100644 index 00000000000..b2551b56764 --- /dev/null +++ b/lib/libcurses/lib_newterm.c @@ -0,0 +1,189 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_newterm.c +** +** The newterm() function. +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> +#include "term.h" /* clear_screen, cup & friends, cur_term */ + +/* This should moved to TERMINAL */ +static filter_mode = FALSE; + +void filter(void) +{ + filter_mode = TRUE; +} + +SCREEN * newterm(const char *term, FILE *ofp, FILE *ifp) +{ +int errret; +#ifdef TRACE +char *t = getenv("NCURSES_TRACE"); + + if (t) + trace(strtol(t, 0, 0)); +#endif + + T(("newterm(\"%s\",%p,%p) called", term, ofp, ifp)); + + /* this loads the capability entry, then sets LINES and COLS */ + if (setupterm(term, fileno(ofp), &errret) != 1) + return NULL; + + /* optional optimization hack -- do before any output to ofp */ +#if HAVE_SETVBUF || HAVE_SETBUFFER + { + /* + * If the output file descriptor is connected to a tty + * (the typical case) it will probably be line-buffered. + * Keith Bostic pointed out that we don't want this; it + * hoses people running over networks by forcing out a + * bunch of small packets instead of one big one, so + * screen updates on ptys look jerky. Restore block + * buffering to prevent this minor lossage. + * + * The buffer size is a compromise. Ideally we'd like a + * buffer that can hold the maximum possible update size + * (the whole screen plus cup commands to change lines as + * it's painted). On a modern 66-line xterm this can + * become excessive. So we min it with the amount of data + * we think we can get through two Ethernet packets + * (maximum packet size - 100 for TCP/IP overhead). + * + * Why two ethernet packets? It used to be one, on the theory + * that said packets define the maximum size of atomic update. + * But that's less than the 2000 chars on a 25 x 80 screen, and + * we don't want local updates to flicker either. Two packet + * lengths will handle up to a 35 x 80 screen. + * + * The magic '6' is the estimated length of the end-of-line + * cup sequence to go to the next line. It's generous. We + * used to mess with the buffering in init_mvcur() after cost + * computation, but that lost the sequences emitted by init_acs() + * in setupscreen(). + * + * "The setvbuf function may be used only after the stream pointed + * to by stream as been associated with an open file and before any + * other operation is performed on the stream." (ISO 7.9.5.6.) + * + * Grrrr... + */ + unsigned int bufsiz = min(LINES * (COLS + 6), 2800); + +#if HAVE_SETVBUF + /* + * If your code core-dumps here, you are probably running + * some bastard offspring of an SVR3 on which the setvbuffer(3) + * arguments are reversed. Autoconf has a test macro for this + * but I have too much else to do to figure out how it works. + * Send us a patch if you care. + */ + (void) setvbuf(ofp, malloc(bufsiz), _IOFBF, bufsiz); +#elif HAVE_SETBUFFER + (void) setbuffer(ofp, malloc(bufsiz), (int)bufsiz); +#endif + } +#endif /* HAVE_SETVBUF || HAVE_SETBUFFER */ + + /* implement filter mode */ + if (filter_mode) { + LINES = 1; + +#ifdef init_tabs + if (init_tabs != -1) + TABSIZE = init_tabs; + else +#endif /* init_tabs */ + TABSIZE = 8; + + T(("TABSIZE = %d", TABSIZE)); + +#ifdef clear_screen + clear_screen = (char *)NULL; + cursor_down = parm_down_cursor = (char *)NULL; + cursor_address = (char *)NULL; + cursor_up = parm_up_cursor = (char *)NULL; + row_address = (char *)NULL; + + cursor_home = carriage_return; +#endif /* clear_screen */ + } + + /* if we must simulate soft labels, grab off the line to be used */ +#ifdef num_labels + if (num_labels <= 0) +#endif /* num_labels */ + if (_slk_init) + ripoffline(-1, slk_initialize); + + /* this actually allocates the screen structure */ + if (_nc_setupscreen(LINES, COLS) == ERR) + return NULL; + +#ifdef num_labels + /* if the terminal type has real soft labels, set those up */ + if (_slk_init && num_labels > 0) + slk_initialize(stdscr, COLS); +#endif /* num_labels */ + + SP->_ifd = fileno(ifp); + SP->_checkfd = fileno(ifp); + typeahead(fileno(ifp)); + SP->_ofp = ofp; +#ifdef TERMIOS + SP->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 && + !(cur_term->Ottyb.c_iflag & ISTRIP)); +#else + SP->_use_meta = FALSE; +#endif + SP->_endwin = FALSE; + + baudrate(); /* sets a field in the SP structure */ + + /* compute movement costs so we can do better move optimization */ + _nc_mvcur_init(SP); + +#if 0 + /* initialize soft labels */ + if (_slk_init) + if (num_labels <= 0) + ripoffline(-1, slk_initialize); + else + slk_initialize(stdscr, COLS); +#endif + _nc_signal_handler(TRUE); + + /* open a connection to the screen's associated mouse, if any */ + _nc_mouse_init(SP); + + T(("newterm returns %p", SP)); + + return(SP); +} + diff --git a/lib/libcurses/lib_newwin.c b/lib/libcurses/lib_newwin.c new file mode 100644 index 00000000000..0fd8d16db36 --- /dev/null +++ b/lib/libcurses/lib_newwin.c @@ -0,0 +1,193 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_newwin.c +** +** The routines newwin(), subwin() and their dependent +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> + +WINDOW * newwin(int num_lines, int num_columns, int begy, int begx) +{ +WINDOW *win; +chtype *ptr; +int i, j; + + T(("newwin(%d,%d,%d,%d) called", num_lines, num_columns, begy, begx)); + + if (num_lines == 0) + num_lines = screen_lines - begy; + if (num_columns == 0) + num_columns = screen_columns - begx; + + if (num_columns + begx > SP->_columns || num_lines + begy > SP->_lines) + return NULL; + + if ((win = _nc_makenew(num_lines, num_columns, begy, begx)) == NULL) + return NULL; + + for (i = 0; i < num_lines; i++) { + if ((win->_line[i].text = (chtype *) calloc((unsigned)num_columns, sizeof(chtype))) == NULL) { + for (j = 0; j < i; j++) + free(win->_line[j].text); + + free(win->_line); + free(win); + + return NULL; + } + else + for (ptr = win->_line[i].text; ptr < win->_line[i].text + num_columns; ) + *ptr++ = ' '; + } + + T(("newwin: returned window is %p", win)); + + return(win); +} + +WINDOW * derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) +{ +WINDOW *win; +int i; + + T(("derwin(%p, %d,%d,%d,%d) called", orig, num_lines, num_columns, begy, begx)); + + /* + ** make sure window fits inside the original one + */ + if ( begy < 0 || begx < 0) + return NULL; + if ( begy + num_lines > orig->_maxy + 1 + || begx + num_columns > orig->_maxx + 1) + return NULL; + + if (num_lines == 0) + num_lines = orig->_maxy - begy; + + if (num_columns == 0) + num_columns = orig->_maxx - begx; + + if ((win = _nc_makenew(num_lines, num_columns, orig->_begy + begy, orig->_begx + begx)) == NULL) + return NULL; + + win->_pary = begy; + win->_parx = begx; + win->_attrs = orig->_attrs; + win->_bkgd = orig->_bkgd; + + for (i = 0; i < num_lines; i++) + win->_line[i].text = &orig->_line[begy++].text[begx]; + + win->_flags = _SUBWIN; + win->_parent = orig; + + T(("derwin: returned window is %p", win)); + + return(win); +} + + +WINDOW *subwin(WINDOW *w, int l, int c, int y, int x) +{ + T(("subwin(%p, %d, %d, %d, %d) called", w, l, c, y, x)); + T(("parent has begy = %d, begx = %d", w->_begy, w->_begx)); + + return derwin(w, l, c, y - w->_begy, x - w->_begx); +} + +WINDOW * +_nc_makenew(int num_lines, int num_columns, int begy, int begx) +{ +int i; +WINDOW *win; + + T(("_nc_makenew(%d,%d,%d,%d)", num_lines, num_columns, begy, begx)); + + if (num_lines <= 0 || num_columns <= 0) + return NULL; + + if ((win = (WINDOW *) calloc(1, sizeof(WINDOW))) == NULL) + return NULL; + + if ((win->_line = (struct ldat *) calloc((unsigned)num_lines, sizeof (struct ldat))) == NULL) { + free(win); + return NULL; + } + + win->_curx = 0; + win->_cury = 0; + win->_maxy = num_lines - 1; + win->_maxx = num_columns - 1; + win->_begy = begy; + win->_begx = begx; + + win->_flags = 0; + win->_attrs = A_NORMAL; + win->_bkgd = A_NORMAL; + + win->_clear = (num_lines == screen_lines && num_columns == screen_columns); + win->_idlok = FALSE; + win->_idcok = TRUE; + win->_scroll = FALSE; + win->_leaveok = FALSE; + win->_use_keypad = FALSE; + win->_delay = -1; + win->_immed = FALSE; + win->_sync = 0; + win->_parx = -1; + win->_pary = -1; + win->_parent = (WINDOW *)NULL; + + win->_regtop = 0; + win->_regbottom = num_lines - 1; + + win->_pad._pad_y = -1; + win->_pad._pad_x = -1; + win->_pad._pad_top = -1; + win->_pad._pad_bottom = -1; + win->_pad._pad_left = -1; + win->_pad._pad_right = -1; + + for (i = 0; i < num_lines; i++) + { + win->_line[i].firstchar = win->_line[i].lastchar = _NOCHANGE; + win->_line[i].oldindex = i; + } + + if (begx + num_columns == screen_columns) { + win->_flags |= _ENDLINE; + + if (begx == 0 && num_lines == screen_lines && begy == 0) + win->_flags |= _FULLWIN; + + if (begy + num_lines == screen_lines) + win->_flags |= _SCROLLWIN; + } + + return(win); +} diff --git a/lib/libcurses/lib_options.c b/lib/libcurses/lib_options.c new file mode 100644 index 00000000000..c2a73db8a7d --- /dev/null +++ b/lib/libcurses/lib_options.c @@ -0,0 +1,364 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_options.c +** +** The routines to handle option setting. +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> +#include "term.h" /* keypad_xmit, keypad_local, meta_on, meta_off */ + /* cursor_visible,cursor_normal,cursor_invisible */ + +int has_ic(void) +{ + T(("has_ic() called")); + return (insert_character || parm_ich) + && (delete_character || parm_dch); +} + +int has_il(void) +{ + T(("has_il() called")); + return (insert_line || parm_insert_line) + && (delete_line || parm_delete_line); +} + +int idlok(WINDOW *win, bool flag) +{ + T(("idlok(%p,%d) called", win, flag)); + + win->_idlok = flag && (has_il() || change_scroll_region); + return OK; +} + + +int idcok(WINDOW *win, bool flag) +{ + T(("idcok(%p,%d) called", win, flag)); + + win->_idcok = flag && has_ic(); + + return OK; +} + + +int clearok(WINDOW *win, bool flag) +{ + T(("clearok(%p,%d) called", win, flag)); + + if (win == curscr) + newscr->_clear = flag; + else + win->_clear = flag; + return OK; +} + + +int immedok(WINDOW *win, bool flag) +{ + T(("immedok(%p,%d) called", win, flag)); + + win->_immed = flag; + return OK; +} + +int leaveok(WINDOW *win, bool flag) +{ + T(("leaveok(%p,%d) called", win, flag)); + + win->_leaveok = flag; + if (flag == TRUE) + curs_set(0); + else + curs_set(1); + return OK; +} + + +int scrollok(WINDOW *win, bool flag) +{ + T(("scrollok(%p,%d) called", win, flag)); + + win->_scroll = flag; + return OK; +} + +int halfdelay(int t) +{ + T(("halfdelay(%d) called", t)); + + if (t < 1 || t > 255) + return ERR; + + cbreak(); + SP->_cbreak = t+1; + return OK; +} + +int nodelay(WINDOW *win, bool flag) +{ + T(("nodelay(%p,%d) called", win, flag)); + + if (flag == TRUE) + win->_delay = 0; + else win->_delay = -1; + return OK; +} + +int notimeout(WINDOW *win, bool f) +{ + T(("notimout(%p,%d) called", win, f)); + + win->_notimeout = f; + return OK; +} + +int wtimeout(WINDOW *win, int delay) +{ + T(("wtimeout(%p,%d) called", win, delay)); + + win->_delay = delay; + return OK; +} + +static void init_keytry(void); +static void add_to_try(char *, short); + +/* Turn the keypad on/off + * + * Note: we flush the output because changing this mode causes some terminals + * to emit different escape sequences for cursor and keypad keys. If we don't + * flush, then the next wgetch may get the escape sequence that corresponds to + * the terminal state _before_ switching modes. + */ +int _nc_keypad(bool flag) +{ + if (flag && keypad_xmit) + { + TPUTS_TRACE("keypad_xmit"); + putp(keypad_xmit); + (void) fflush(SP->_ofp); + } + else if (! flag && keypad_local) + { + TPUTS_TRACE("keypad_local"); + putp(keypad_local); + (void) fflush(SP->_ofp); + } + + if (SP->_keytry == UNINITIALISED) + init_keytry(); + return OK; +} + +int keypad(WINDOW *win, bool flag) +{ + T(("keypad(%p,%d) called", win, flag)); + + win->_use_keypad = flag; + return (_nc_keypad(flag)); +} + + +int meta(WINDOW *win, bool flag) +{ + T(("meta(%p,%d) called", win, flag)); + + SP->_use_meta = flag; + + if (flag && meta_on) + { + TPUTS_TRACE("meta_on"); + putp(meta_on); + } + else if (! flag && meta_off) + { + TPUTS_TRACE("meta_off"); + putp(meta_off); + } + return OK; +} + +/* curs_set() moved here to narrow the kernel interface */ + +int curs_set(int vis) +{ +int cursor = SP->_cursor; + + T(("curs_set(%d)", vis)); + + if (vis < 0 || vis > 2) + return ERR; + + switch(vis) { + case 2: + if (cursor_visible) + { + TPUTS_TRACE("cursor_visible"); + putp(cursor_visible); + } + break; + case 1: + if (cursor_normal) + { + TPUTS_TRACE("cursor_normal"); + putp(cursor_normal); + } + break; + case 0: + if (cursor_invisible) + { + TPUTS_TRACE("cursor_invisible"); + putp(cursor_invisible); + } + break; + } + SP->_cursor = vis; + return cursor; +} + +/* +** init_keytry() +** +** Construct the try for the current terminal's keypad keys. +** +*/ + + +static struct try *newtry; + +static void init_keytry(void) +{ + newtry = NULL; + +#include "keys.tries" + + SP->_keytry = newtry; +} + + +static void add_to_try(char *str, short code) +{ +static bool out_of_memory = FALSE; +struct try *ptr, *savedptr; + + if (! str || out_of_memory) + return; + + if (newtry != NULL) { + ptr = savedptr = newtry; + + for (;;) { + while (ptr->ch != (unsigned char) *str + && ptr->sibling != NULL) + ptr = ptr->sibling; + + if (ptr->ch == (unsigned char) *str) { + if (*(++str)) { + if (ptr->child != NULL) + ptr = ptr->child; + else + break; + } else { + ptr->value = code; + return; + } + } else { + if ((ptr->sibling = (struct try *) malloc(sizeof *ptr)) == NULL) { + out_of_memory = TRUE; + return; + } + + savedptr = ptr = ptr->sibling; + ptr->child = ptr->sibling = NULL; + if (*str == '\200') + ptr->ch = '\0'; + else + ptr->ch = (unsigned char) *str; + str++; + ptr->value = (short) NULL; + + break; + } + } /* end for (;;) */ + } else { /* newtry == NULL :: First sequence to be added */ + savedptr = ptr = newtry = (struct try *) malloc(sizeof *ptr); + + if (ptr == NULL) { + out_of_memory = TRUE; + return; + } + + ptr->child = ptr->sibling = NULL; + if (*str == '\200') + ptr->ch = '\0'; + else + ptr->ch = (unsigned char) *str; + str++; + ptr->value = (short) NULL; + } + + /* at this point, we are adding to the try. ptr->child == NULL */ + + while (*str) { + ptr->child = (struct try *) malloc(sizeof *ptr); + + ptr = ptr->child; + + if (ptr == NULL) { + out_of_memory = TRUE; + + ptr = savedptr; + while (ptr != NULL) { + savedptr = ptr->child; + free(ptr); + ptr = savedptr; + } + + return; + } + + ptr->child = ptr->sibling = NULL; + if (*str == '\200') + ptr->ch = '\0'; + else + ptr->ch = (unsigned char) *str; + str++; + ptr->value = (short) NULL; + } + + ptr->value = code; + return; +} + +int typeahead(int fd) +{ + + T(("typeahead(%d) called", fd)); + SP->_checkfd = fd; + return OK; +} + diff --git a/lib/libcurses/lib_overlay.c b/lib/libcurses/lib_overlay.c new file mode 100644 index 00000000000..867c2e178d5 --- /dev/null +++ b/lib/libcurses/lib_overlay.c @@ -0,0 +1,135 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_overlay.c +** +** The routines overlay(), copywin(), and overwrite(). +** +*/ + +#include "curses.priv.h" + +static void overlap(const WINDOW *const s, WINDOW *const d, int const flag) +{ +int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol; + + T(("overlap : sby %d, sbx %d, smy %d, smx %d, dby %d, dbx %d, dmy %d, dmx %d", + s->_begy, s->_begx, s->_maxy, s->_maxx, + d->_begy, d->_begx, d->_maxy, d->_maxx)); + sminrow = max(s->_begy, d->_begy) - s->_begy; + smincol = max(s->_begx, d->_begx) - s->_begx; + dminrow = max(s->_begy, d->_begy) - d->_begy; + dmincol = max(s->_begx, d->_begx) - d->_begx; + dmaxrow = min(s->_maxy+s->_begy, d->_maxy+d->_begy) - d->_begy; + dmaxcol = min(s->_maxx+s->_begx, d->_maxx+d->_begx) - d->_begx; + + copywin(s, d, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, flag); +} + +/* +** +** overlay(win1, win2) +** +** +** overlay() writes the overlapping area of win1 behind win2 +** on win2 non-destructively. +** +**/ + +int overlay(const WINDOW *win1, WINDOW *win2) +{ + overlap(win1, win2, TRUE); + return OK; +} + +/* +** +** overwrite(win1, win2) +** +** +** overwrite() writes the overlapping area of win1 behind win2 +** on win2 destructively. +** +**/ + +int overwrite(const WINDOW *win1, WINDOW *win2) +{ + overlap(win1, win2, FALSE); + return OK; +} + +int copywin(const WINDOW *src, WINDOW *dst, + int sminrow, int smincol, + int dminrow, int dmincol, int dmaxrow, int dmaxcol, + int over) +{ +int sx, sy, dx, dy; +int touched; + + T(("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)", + src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over)); + + /* make sure rectangle exists in source */ + if ((sminrow + dmaxrow - dminrow) > (src->_maxy + 1) || + (smincol + dmaxcol - dmincol) > (src->_maxx + 1)) { + return ERR; + } + + T(("rectangle exists in source")); + + /* make sure rectangle fits in destination */ + if (dmaxrow > dst->_maxy || dmaxcol > dst->_maxx) { + return ERR; + } + + T(("rectangle fits in destination")); + + for (dy = dminrow, sy = sminrow; dy <= dmaxrow; sy++, dy++) { + touched=0; + for(dx=dmincol, sx=smincol; dx <= dmaxcol; sx++, dx++) + { + if (over) + { + if (((src->_line[sy].text[sx] & A_CHARTEXT)!=' ') && + (dst->_line[dy].text[dx]!=src->_line[sy].text[sx])) + { + dst->_line[dy].text[dx] = src->_line[sy].text[sx]; + touched=1; + } + } + else { + if (dst->_line[dy].text[dx] != src->_line[sy].text[sx]) + { + dst->_line[dy].text[dx] = src->_line[sy].text[sx]; + touched=1; + } + } + } + if (touched) + { + touchline(dst,0,getmaxy(dst)); + } + } + T(("finished copywin")); + return OK; +} diff --git a/lib/libcurses/lib_pad.c b/lib/libcurses/lib_pad.c new file mode 100644 index 00000000000..392305f658d --- /dev/null +++ b/lib/libcurses/lib_pad.c @@ -0,0 +1,258 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* + * lib_pad.c + * newpad -- create a new pad + * pnoutrefresh -- refresh a pad, no update + * pechochar -- add a char to a pad and refresh + */ + +#include "curses.priv.h" + +#include <stdlib.h> +#include <errno.h> + +#if !HAVE_EXTERN_ERRNO +extern int errno; +#endif + +WINDOW *newpad(int l, int c) +{ +WINDOW *win; +chtype *ptr; +int i, j; + + T(("newpad(%d, %d) called", l, c)); + + if (l <= 0 || c <= 0) + return NULL; + + if ((win = _nc_makenew(l,c,0,0)) == NULL) + return NULL; + + win->_flags |= _ISPAD; + + for (i = 0; i < l; i++) { + win->_line[i].oldindex = _NEWINDEX; + if ((win->_line[i].text = (chtype *) calloc((size_t)c, sizeof(chtype))) == NULL) { + for (j = 0; j < i; j++) + free(win->_line[j].text); + + free(win->_line); + free(win); + + errno = ENOMEM; + return NULL; + } + else + for (ptr = win->_line[i].text; ptr < win->_line[i].text + c; ) + *ptr++ = ' '; + } + + T(("newpad: returned window is %p", win)); + + return(win); +} + +WINDOW *subpad(WINDOW *orig, int l, int c, int begy, int begx) +{ +WINDOW *win; + + T(("subpad(%d, %d) called", l, c)); + + if ((win = derwin(orig, l, c, begy, begx)) == NULL) + return NULL; + + win->_flags |= _ISPAD; + + T(("subpad: returned window is %p", win)); + + return(win); +} + +int prefresh(WINDOW *win, int pminrow, int pmincol, + int sminrow, int smincol, int smaxrow, int smaxcol) +{ + T(("prefresh() called")); + if (pnoutrefresh(win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) != ERR + && doupdate() != ERR) { + return OK; + } + return ERR; +} + +int pnoutrefresh(WINDOW *win, int pminrow, int pmincol, + int sminrow, int smincol, int smaxrow, int smaxcol) +{ +short i, j; +short m, n; +short pmaxrow; +short pmaxcol; +short displaced; +bool wide; + + T(("pnoutrefresh(%p, %d, %d, %d, %d, %d, %d) called", + win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)); + + if (win == 0) + return ERR; + + if (!(win->_flags & _ISPAD)) + return ERR; + + /* negative values are interpreted as zero */ + if (pminrow < 0) pminrow = 0; + if (pmincol < 0) pmincol = 0; + if (sminrow < 0) sminrow = 0; + if (smincol < 0) smincol = 0; + + if (smaxrow > screen_lines + || smaxcol > screen_columns + || sminrow > smaxrow + || smincol > smaxcol) + return ERR; + + pmaxrow = pminrow + smaxrow - sminrow; + pmaxcol = pmincol + smaxcol - smincol; + + T((" pminrow + smaxrow - sminrow %d, win->_maxy %d", pmaxrow, win->_maxy)); + T((" pmincol + smaxcol - smincol %d, win->_maxx %d", pmaxcol, win->_maxx)); + if ((pmaxrow > win->_maxy) + || (pmaxcol > win->_maxx)) + return ERR; + + T(("pad being refreshed")); + + if (win->_pad._pad_y >= 0) { + displaced = pminrow - win->_pad._pad_y + -(sminrow - win->_pad._pad_top); + T(("pad being shifted by %d line(s)", displaced)); + } else + displaced = 0; + + /* + * For pure efficiency, we'd want to transfer scrolling information + * from the pad to newscr whenever the window is wide enough that + * its update will dominate the cost of the update for the horizontal + * band of newscr that it occupies. Unfortunately, this threshold + * tends to be complex to estimate, and in any case scrolling the + * whole band and rewriting the parts outside win's image would look + * really ugly. So. What we do is consider the pad "wide" if it + * either (a) occupies the whole width of newscr, or (b) occupies + * all but at most one column on either vertical edge of the screen + * (this caters to fussy people who put boxes around full-screen + * windows). Note that changing this formula will not break any code, + * merely change the costs of various update cases. + */ + wide = (sminrow <= 1 && win->_maxx >= (newscr->_maxx - 1)); + + for (i = pminrow, m = sminrow; i <= pmaxrow; i++, m++) { + register struct ldat *nline = &newscr->_line[m]; + register struct ldat *oline = &win->_line[i]; + + for (j = pmincol, n = smincol; j <= pmaxcol; j++, n++) { + if (oline->text[j] != nline->text[n]) { + nline->text[n] = oline->text[j]; + + if (nline->firstchar == _NOCHANGE) + nline->firstchar = nline->lastchar = n; + else if (n < nline->firstchar) + nline->firstchar = n; + else if (n > nline->lastchar) + nline->lastchar = n; + } + } + + if (wide) { + int nind = m + displaced; + if (oline->oldindex < 0 + || nind < sminrow + || nind > smaxrow) + nind = _NEWINDEX; + + nline->oldindex = nind; + } + oline->firstchar = oline->lastchar = _NOCHANGE; + oline->oldindex = i; + } + + /* + * Clean up debris from scrolling or resizing the pad, so we do not + * accidentally pick up the index value during the next call to this + * procedure. The only rows that should have an index value are those + * that are displayed during this cycle. + */ + for (i = pminrow-1; (i >= 0) && (win->_line[i].oldindex >= 0); i--) + win->_line[i].oldindex = _NEWINDEX; + for (i = pmaxrow+1; (i <= win->_maxy) && (win->_line[i].oldindex >= 0); i++) + win->_line[i].oldindex = _NEWINDEX; + + win->_begx = smincol; + win->_begy = sminrow; + + if (win->_clear) { + win->_clear = FALSE; + newscr->_clear = TRUE; + } + + /* + * Use the pad's current position, if it will be visible. + * If not, don't do anything; it's not an error. + */ + if (win->_leaveok == FALSE + && win->_cury >= pminrow + && win->_curx >= pmincol + && win->_cury <= pmaxrow + && win->_curx <= pmaxcol) { + newscr->_cury = win->_cury - pminrow + win->_begy; + newscr->_curx = win->_curx - pmincol + win->_begx; + } + win->_flags &= ~_HASMOVED; + + /* + * Update our cache of the line-numbers that we displayed from the pad. + * We will use this on subsequent calls to this function to derive + * values to stuff into 'oldindex[]' -- for scrolling optimization. + */ + win->_pad._pad_y = pminrow; + win->_pad._pad_x = pmincol; + win->_pad._pad_top = sminrow; + win->_pad._pad_left = smincol; + win->_pad._pad_bottom = smaxrow; + win->_pad._pad_right = smaxcol; + + return OK; +} + +int pechochar(WINDOW *pad, chtype ch) +{ + T(("echochar(%p, %lx)", pad, ch)); + + if (pad->_flags & _ISPAD) + return ERR; + + waddch(curscr, ch); + doupdate(); + return OK; +} + diff --git a/lib/libcurses/lib_printw.c b/lib/libcurses/lib_printw.c new file mode 100644 index 00000000000..22ad9c7cd8b --- /dev/null +++ b/lib/libcurses/lib_printw.c @@ -0,0 +1,93 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_printw.c +** +** The routines printw(), wprintw() and friends. +** +*/ + +#include "curses.priv.h" + +int printw(const char *fmt, ...) +{ +va_list argp; +char buf[BUFSIZ]; + + T(("printw(\"%s\",...) called", fmt)); + + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + return(waddstr(stdscr, buf)); +} + + + +int wprintw(WINDOW *win, const char *fmt, ...) +{ +va_list argp; +char buf[BUFSIZ]; + + T(("wprintw(%p,\"%s\",...) called", win, fmt)); + + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + return(waddstr(win, buf)); +} + + + +int mvprintw(int y, int x, const char *fmt, ...) +{ +va_list argp; +char buf[BUFSIZ]; + + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + return(move(y, x) == OK ? waddstr(stdscr, buf) : ERR); +} + + + +int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...) +{ +va_list argp; +char buf[BUFSIZ]; + + va_start(argp, fmt); + vsprintf(buf, fmt, argp); + va_end(argp); + return(wmove(win, y, x) == OK ? waddstr(win, buf) : ERR); +} + +int vwprintw(WINDOW *win, const char *fmt, va_list argp) +{ +char buf[BUFSIZ]; + + vsprintf(buf, fmt, argp); + return(waddstr(win, buf)); +} diff --git a/lib/libcurses/lib_raw.c b/lib/libcurses/lib_raw.c new file mode 100644 index 00000000000..1971f9651bf --- /dev/null +++ b/lib/libcurses/lib_raw.c @@ -0,0 +1,322 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* + * raw.c + * + * Routines: + * raw() + * echo() + * nl() + * cbreak() + * noraw() + * noecho() + * nonl() + * nocbreak() + * qiflush() + * noqiflush() + * intrflush() + * + */ + +#include "curses.priv.h" +#include "term.h" /* cur_term */ + +/* + * COOKED_INPUT defines the collection of input mode bits to be + * cleared when entering raw mode, then re-set by noraw(). + * + * We used to clear ISTRIP and INPCK when going to raw mode. Keith + * Bostic says that's wrong, because those are hardware bits that the + * user has to get right in his/her initial environment -- he says + * curses can't do any good by clearing these, and may do harm. In + * 1995's world of 8N1 connections over error-correcting modems, all + * the parity-check stuff is pretty nearly irrelevant anyway. + * + * What's supposed to happen when noraw() executes has never been very + * well-defined. Yes, it should reset ISIG/ICANON/OPOST (historical + * practice is for it to attempt to take the driver back to cooked + * mode, rather going to some half-baked cbreak-like intermediate + * level). + * + * We make a design choice here to turn off CR/LF translation a la BSD + * when raw() is enabled, on the theory that a programmer requesting + * raw() ideally wants an 8-bit data stream that's been messed with as + * little as possible. The man pages document this. + * + * We originally opted for the simplest way to handle noraw(); just set all + * the flags we cleared. Unfortunately, having noraw() set IGNCR + * turned out to be too painful. So raw() now clears the COOKED_INPUT + * flags, but also clears (ICRNL|INLCR|IGNCR) which noraw() doesn't + * restore. + * + * Unfortunately, this means noraw() may still force some COOKED_INPUT + * flags on that the user had initially cleared via stty. It'll all + * come out in the wash when endwin() restores the user's original + * input bits (we hope...) + * + */ +#define COOKED_INPUT (IXON|IGNBRK|BRKINT|PARMRK) + +int raw(void) +{ + T(("raw() called")); + + SP->_raw = TRUE; + SP->_cbreak = TRUE; + +#ifdef TERMIOS + cur_term->Nttyb.c_lflag &= ~(ICANON|ISIG|IEXTEN); + cur_term->Nttyb.c_iflag &= ~(COOKED_INPUT|ICRNL|INLCR|IGNCR); + cur_term->Nttyb.c_oflag &= ~(OPOST); + cur_term->Nttyb.c_cc[VMIN] = 1; + cur_term->Nttyb.c_cc[VTIME] = 0; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags |= RAW; + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif +} + +int cbreak(void) +{ + T(("cbreak() called")); + + SP->_cbreak = TRUE; + +#ifdef TERMIOS + cur_term->Nttyb.c_lflag &= ~ICANON; + cur_term->Nttyb.c_lflag |= ISIG; + cur_term->Nttyb.c_cc[VMIN] = 1; + cur_term->Nttyb.c_cc[VTIME] = 0; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags |= CBREAK; + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif +} + +int echo(void) +{ + T(("echo() called")); + + SP->_echo = TRUE; + +#ifdef TERMIOS + cur_term->Nttyb.c_lflag |= ECHO; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags |= ECHO; + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif +} + + +int nl(void) +{ + T(("nl() called")); + + SP->_nl = TRUE; + +#ifdef TERMIOS + /* the code used to set IXON|IXOFF here, Ghod knows why... */ + cur_term->Nttyb.c_iflag |= ICRNL; + cur_term->Nttyb.c_oflag |= OPOST|ONLCR; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags |= CRMOD; + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif +} + + +int qiflush(void) +{ + T(("qiflush() called")); + + /* + * Note: this implementation may be wrong. See the comment under + * intrflush(). + */ + +#ifdef TERMIOS + cur_term->Nttyb.c_lflag &= ~(NOFLSH); + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + return ERR; +#endif +} + + +int noraw(void) +{ + T(("noraw() called")); + + SP->_raw = FALSE; + SP->_cbreak = FALSE; + +#ifdef TERMIOS + cur_term->Nttyb.c_lflag |= ISIG|ICANON|IEXTEN; + cur_term->Nttyb.c_iflag |= COOKED_INPUT; + cur_term->Nttyb.c_oflag |= OPOST; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags &= ~(RAW|CBREAK); + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif + +} + + +int nocbreak(void) +{ + T(("nocbreak() called")); + + SP->_cbreak = 0; + +#ifdef TERMIOS + cur_term->Nttyb.c_lflag |= ICANON; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags &= ~CBREAK; + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif +} + +int noecho(void) +{ + T(("noecho() called")); + + SP->_echo = FALSE; + +#ifdef TERMIOS + /* + * Turn off ECHONL to avoid having \n still be echoed when + * cooked mode is in effect (that is, ICANON is on). + */ + cur_term->Nttyb.c_lflag &= ~(ECHO|ECHONL); + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags &= ~ECHO; + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif +} + + +int nonl(void) +{ + T(("nonl() called")); + + SP->_nl = FALSE; + +#ifdef TERMIOS + cur_term->Nttyb.c_iflag &= ~ICRNL; + cur_term->Nttyb.c_oflag &= ~ONLCR; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + cur_term->Nttyb.sg_flags &= ~CRMOD; + stty(cur_term->Filedes, &cur_term->Nttyb); + return OK; +#endif +} + +int noqiflush(void) +{ + T(("noqiflush() called")); + + /* + * Note: this implementation may be wrong. See the comment under + * intrflush(). + */ + +#ifdef TERMIOS + cur_term->Nttyb.c_lflag |= NOFLSH; + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + return ERR; +#endif +} + +int intrflush(WINDOW *win, bool flag) +{ + T(("intrflush() called")); + + /* + * This call does the same thing as the qiflush()/noqiflush() + * pair. We know for certain that SVr3 intrflush() tweaks the + * NOFLSH bit; on the other hand, the match (in the SVr4 man + * pages) between the language describing NOFLSH in termio(7) + * and the language describing qiflush()/noqiflush() in + * curs_inopts(3x) is too exact to be coincidence. + */ + +#ifdef TERMIOS + if (flag) + cur_term->Nttyb.c_lflag &= ~(NOFLSH); + else + cur_term->Nttyb.c_lflag |= (NOFLSH); + if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1) + return ERR; + else + return OK; +#else + return ERR; +#endif +} + diff --git a/lib/libcurses/lib_refresh.c b/lib/libcurses/lib_refresh.c new file mode 100644 index 00000000000..1dfa1a94355 --- /dev/null +++ b/lib/libcurses/lib_refresh.c @@ -0,0 +1,141 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* + * lib_refresh.c + * + * The routines wredrawln(), wrefresh() and wnoutrefresh(). + * + */ + +#include "curses.priv.h" + +int wredrawln(WINDOW *win, int beg, int num) +{ + T(("wredrawln(%p,%d,%d) called", win, beg, num)); + touchline(win, beg, num); + wrefresh(win); + return OK; +} + +int wrefresh(WINDOW *win) +{ + T(("wrefresh(%p) called", win)); + + if (win == curscr) + curscr->_clear = TRUE; + else + wnoutrefresh(win); + return(doupdate()); +} + +int wnoutrefresh(WINDOW *win) +{ +short i, j; +short begx = win->_begx; +short begy = win->_begy; +short m, n; +bool wide; + + T(("wnoutrefresh(%p) called", win)); + + /* + * If 'newscr' has a different background than the window that we're + * trying to refresh, we'll have to copy the whole thing. + */ + if (win->_bkgd != newscr->_bkgd) { + touchwin(win); + newscr->_bkgd = win->_bkgd; + } + + /* merge in change information from all subwindows of this window */ + wsyncdown(win); + + /* + * For pure efficiency, we'd want to transfer scrolling information + * from the window to newscr whenever the window is wide enough that + * its update will dominate the cost of the update for the horizontal + * band of newscr that it occupies. Unfortunately, this threshold + * tends to be complex to estimate, and in any case scrolling the + * whole band and rewriting the parts outside win's image would look + * really ugly. So. What we do is consider the window "wide" if it + * either (a) occupies the whole width of newscr, or (b) occupies + * all but at most one column on either vertical edge of the screen + * (this caters to fussy people who put boxes around full-screen + * windows). Note that changing this formula will not break any code, + * merely change the costs of various update cases. + */ + wide = (begx <= 1 && win->_maxx >= (newscr->_maxx - 1)); + + win->_flags &= ~_HASMOVED; + + /* + * Microtweaking alert! This double loop is one of the genuine + * hot spots in the code. Even gcc doesn't seem to do enough + * common-subexpression chunking to make it really tense, + * so we'll force the issue. + */ + for (i = 0, m = begy; i <= win->_maxy && m <= newscr->_maxy; i++, m++) { + register struct ldat *nline = &newscr->_line[m]; + register struct ldat *oline = &win->_line[i]; + + if (oline->firstchar != _NOCHANGE) { + + for (j = oline->firstchar, n = j + begx; j <= oline->lastchar; j++, n++) { + if (oline->text[j] != nline->text[n]) { + nline->text[n] = oline->text[j]; + + if (nline->firstchar == _NOCHANGE) + nline->firstchar = nline->lastchar = n; + else if (n < nline->firstchar) + nline->firstchar = n; + else if (n > nline->lastchar) + nline->lastchar = n; + } + } + + } + + if (wide) { + int oind = oline->oldindex; + + nline->oldindex = (oind == _NEWINDEX) ? _NEWINDEX : begy + oind; + } + + oline->firstchar = oline->lastchar = _NOCHANGE; + oline->oldindex = i; + } + + if (win->_clear) { + win->_clear = FALSE; +#if 0 + newscr->_clear = TRUE; +#endif + } + + if (! win->_leaveok) { + newscr->_cury = win->_cury + win->_begy; + newscr->_curx = win->_curx + win->_begx; + } + return(OK); +} diff --git a/lib/libcurses/lib_resize.c b/lib/libcurses/lib_resize.c new file mode 100644 index 00000000000..b1052f042d4 --- /dev/null +++ b/lib/libcurses/lib_resize.c @@ -0,0 +1,152 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* + * Note: This code is not part of the SVr4/XSI Curses API! + */ + +#include "curses.priv.h" +#include <stdlib.h> + +int wresize(WINDOW *win, int new_lines, int new_cols) +{ + chtype blank = _nc_render(win, ' ', BLANK); + register int i, j; + + T(("wresize(win=%p, lines=%d, cols=%d) called", win, new_lines, new_cols)); + + if (new_lines <= 0 || new_cols <= 0) + return ERR; + + /* window height is different, must mess with the line vector */ + if (new_lines != win->_maxy+1) + { + struct ldat *tp; + + /* free old lines no longer used */ + if (!(win->_flags & _SUBWIN)) + for (i = new_lines + 1; i <= win->_maxy; i++) + free((char *)(win->_line[i].text)); + + /* resize the window line vector */ + if (!(win->_line = realloc(win->_line, sizeof(struct ldat) * new_lines))) + return(ERR); + + /* grab new lines for the window if needed */ + for (tp=&win->_line[i=win->_maxy+1]; tp<&win->_line[new_lines]; i++,tp++) + { + if (win->_flags & _SUBWIN) /* set up alias pointers */ + tp->text = &(win->_parent->_line[win->_pary+i].text[win->_parx]); + else /* allocate new lines if needed */ + { + if (!(tp->text = (chtype *)malloc(sizeof(chtype) * new_cols))) + return(ERR); + for (j = 0; j < new_cols; j++) + tp->text[j] = blank; + } + + tp->firstchar = 0; + tp->lastchar = new_cols; + tp->oldindex = i; + } + + /* + * This is kind of nasty. We have to clip the scrolling region to + * within the new window size. We also have to assume that if the + * bottom of the scrolling region is the last line, the user wants + * that bottom to stick to the bottom of the resized window. The + * real problem here is that the API doesn't distinguish between + * resetting the scroll region to the entire window and setting it + * to an explicit scroll region that happens to include the whole + * window. + */ + if (win->_regtop > new_lines - 1 || win->_regtop == win->_maxy) + win->_regtop = new_lines - 1; + if (win->_regbottom > new_lines - 1 || win->_regbottom == win->_maxy) + win->_regbottom = new_lines - 1; + } + + /* window width is different, resize all old lines */ + if (new_cols != win->_maxx+1) + for (i = 0; i < min(new_lines, win->_maxy+1); i++) + { + /* if not a subwindow, we have our own storage; resize each line */ + if (!(win->_flags & _SUBWIN)) + { + win->_line[i].text=realloc(win->_line[i].text,sizeof(chtype)*new_cols); + if (win->_line[i].text == (chtype *)NULL) + return(ERR); + } + + if (new_cols > win->_maxx+1) /* window is growing horizontally */ + { + if (win->_line[i].firstchar == _NOCHANGE) + win->_line[i].firstchar = win->_maxx+1; + win->_line[i].lastchar = new_cols; + for (j = win->_maxx+1; j < new_cols; j++) /* blank-fill ends */ + win->_line[i].text[j] = blank; + } + else /* window is shrinking horizontally */ + { + if (win->_line[i].firstchar > win->_maxx+1) + win->_line[i].firstchar = _NOCHANGE; + else if (win->_line[i].lastchar > new_cols) + win->_line[i].lastchar = new_cols; + } + } + + /* clip the cursor position to within the new size */ + if (win->_curx > new_cols - 1) + win->_curx = new_cols - 1; + if (win->_cury > new_lines - 1) + win->_cury = new_lines - 1; + + /* whether this is a full-width or full-depth window may have changed */ + win->_flags &=~ (_ENDLINE|_FULLWIN|_SCROLLWIN); + if (win->_begx + new_cols == screen_columns) + { + win->_flags |= _ENDLINE; + + if (win->_begx == 0 && new_lines == screen_lines && win->_begy == 0) + win->_flags |= _FULLWIN; + + if (win->_begy + new_lines == screen_lines) + win->_flags |= _SCROLLWIN; + } + + /* right margin may have moved, set _NEED_WRAP properly */ + if ((win->_flags & _NEED_WRAP) && win->_curx != new_cols - 1) + { + win->_curx++; + win->_flags &=~ _NEED_WRAP; + } + if (!(win->_flags & _NEED_WRAP) && win->_curx == new_cols) + { + win->_curx--; + win->_flags |= _NEED_WRAP; + } + + /* finally, update size members */ + win->_maxy = new_lines - 1; + win->_maxx = new_cols - 1; + + return OK; +} diff --git a/lib/libcurses/lib_scanw.c b/lib/libcurses/lib_scanw.c new file mode 100644 index 00000000000..02d1814ba63 --- /dev/null +++ b/lib/libcurses/lib_scanw.c @@ -0,0 +1,88 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_scanw.c +** +** The routines scanw(), wscanw() and friends. +** +*/ + +#include "curses.priv.h" +#include <stdio.h> + +#if !HAVE_VSSCANF +extern int vsscanf(const char *str, const char *format, ...); +#endif + +int vwscanw(WINDOW *win, const char *fmt, va_list argp) +{ +char buf[BUFSIZ]; + + if (wgetstr(win, buf) == ERR) + return(ERR); + + return(vsscanf(buf, fmt, argp)); +} + +int scanw(const char *fmt, ...) +{ +va_list ap; + + T(("scanw(\"%s\",...) called", fmt)); + + va_start(ap, fmt); + return(vwscanw(stdscr, fmt, ap)); +} + +int wscanw(WINDOW *win, const char *fmt, ...) +{ +va_list ap; + + T(("wscanw(%p,\"%s\",...) called", win, fmt)); + + va_start(ap, fmt); + return(vwscanw(win, fmt, ap)); +} + + + +int mvscanw(int y, int x, const char *fmt, ...) +{ +va_list ap; + + va_start(ap, fmt); + return(move(y, x) == OK ? vwscanw(stdscr, fmt, ap) : ERR); +} + + + +int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...) +{ +va_list ap; + + va_start(ap, fmt); + return(wmove(win, y, x) == OK ? vwscanw(win, fmt, ap) : ERR); +} + + diff --git a/lib/libcurses/lib_screen.c b/lib/libcurses/lib_screen.c new file mode 100644 index 00000000000..73b4e63b14e --- /dev/null +++ b/lib/libcurses/lib_screen.c @@ -0,0 +1,171 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +#include "curses.priv.h" + +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <time.h> +#include "term.h" /* exit_ca_mode, non_rev_rmcup */ + +static time_t dumptime; + +WINDOW *getwin(FILE *filep) +{ + WINDOW try, *nwin; + int n; + + (void) fread(&try, sizeof(WINDOW), 1, filep); + if (ferror(filep)) + return (WINDOW *)NULL; + + if ((nwin = newwin(try._maxy+1, try._maxx+1, 0, 0)) == (WINDOW *)NULL) + return (WINDOW *)NULL; + + /* + * We deliberately do not restore the _parx, _pary, or _parent + * fields, because the window hierarchy within which they + * made sense is probably gone. + */ + nwin->_curx = try._curx; + nwin->_cury = try._cury; + nwin->_maxy = try._maxy; + nwin->_maxx = try._maxx; + nwin->_begy = try._begy; + nwin->_begx = try._begx; + nwin->_flags = try._flags; + + nwin->_attrs = try._attrs; + nwin->_bkgd = try._bkgd; + + nwin->_clear = try._clear; + nwin->_scroll = try._scroll; + nwin->_leaveok = try._leaveok; + nwin->_use_keypad = try._use_keypad; + nwin->_delay = try._delay; + nwin->_immed = try._immed; + nwin->_sync = try._sync; + + nwin->_regtop = try._regtop; + nwin->_regbottom = try._regbottom; + + for (n = 0; n < nwin->_maxy + 1; n++) + { + (void) fread(nwin->_line[n].text, + sizeof(chtype), (size_t)(nwin->_maxx + 1), filep); + if (ferror(filep)) + { + delwin(nwin); + return((WINDOW *)NULL); + } + } + touchwin(nwin); + + return nwin; +} + +int putwin(WINDOW *win, FILE *filep) +{ + int n; + + (void) fwrite(win, sizeof(WINDOW), 1, filep); + if (ferror(filep)) + return ERR; + + for (n = 0; n < win->_maxy + 1; n++) + { + (void) fwrite(win->_line[n].text, + sizeof(chtype), (size_t)(win->_maxx + 1), filep); + if (ferror(filep)) + return(ERR); + } + + return(OK); +} + +int scr_restore(const char *file) +{ + FILE *fp; + + if ((fp = fopen(file, "r")) == (FILE *)NULL) + return ERR; + else + { + delwin(newscr); + newscr = getwin(fp); + (void) fclose(fp); + return OK; + } +} + +int scr_dump(const char *file) +{ + FILE *fp; + + if ((fp = fopen(file, "w")) == (FILE *)NULL) + return ERR; + else + { + (void) putwin(newscr, fp); + (void) fclose(fp); + dumptime = time((time_t *)0); + return OK; + } +} + +int scr_init(const char *file) +{ + FILE *fp; + struct stat stb; + +#ifdef exit_ca_mode + if (exit_ca_mode && non_rev_rmcup) + return(ERR); +#endif /* exit_ca_mode */ + + if ((fp = fopen(file, "r")) == (FILE *)NULL) + return ERR; + else if (fstat(STDOUT_FILENO, &stb) || stb.st_mtime > dumptime) + return ERR; + else + { + delwin(curscr); + curscr = getwin(fp); + (void) fclose(fp); + return OK; + } +} + +int scr_set(const char *file) +{ + if (scr_init(file) == ERR) + return(ERR); + else + { + delwin(newscr); + newscr = dupwin(curscr); + return(OK); + } +} + + diff --git a/lib/libcurses/lib_scroll.c b/lib/libcurses/lib_scroll.c new file mode 100644 index 00000000000..d8350a38344 --- /dev/null +++ b/lib/libcurses/lib_scroll.c @@ -0,0 +1,110 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_scroll.c +** +** The routine wscrl(win, n). +** positive n scroll the window up (ie. move lines down) +** negative n scroll the window down (ie. move lines up) +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> +#include <string.h> + +void _nc_scroll_window(WINDOW *win, int const n, short const top, short const bottom) +{ +int line, j; +chtype blank = _nc_render(win, ' ', BLANK); + + TR(TRACE_MOVE, ("_nc_scroll_window(%p, %d, %d, %d)", win, n, top,bottom)); + + /* + * This used to do a line-text pointer-shuffle instead of text copies. + * That (a) doesn't work when the window is derived and doesn't have + * its own storage, (b) doesn't save you a lot on modern machines + * anyway. Your typical memcpy implementations are coded in + * assembler using a tight BLT loop; for the size of copies we're + * talking here, the total execution time is dominated by the one-time + * setup cost. So there is no point in trying to be excessively + * clever -- esr. + */ + + /* shift n lines downwards */ + if (n < 0) { + for (line = bottom; line >= top-n; line--) { + memcpy(win->_line[line].text, + win->_line[line+n].text, + (size_t)(sizeof(chtype) * (win->_maxx+1))); + win->_line[line].oldindex = win->_line[line+n].oldindex; + } + for (line = top; line < top-n; line++) { + for (j = 0; j <= win->_maxx; j ++) + win->_line[line].text[j] = blank; + win->_line[line].oldindex = _NEWINDEX; + win->_line[line].firstchar = 0; + win->_line[line].lastchar = win->_maxx; + } + } + + /* shift n lines upwards */ + if (n > 0) { + for (line = top; line <= bottom-n; line++) { + memcpy(win->_line[line].text, + win->_line[line+n].text, + (size_t)(sizeof(chtype) * (win->_maxx+1))); + win->_line[line].oldindex = win->_line[line+n].oldindex; + } + for (line = bottom; line > bottom-n; line--) { + for (j = 0; j <= win->_maxx; j ++) + win->_line[line].text[j] = blank; + win->_line[line].oldindex = _NEWINDEX; + win->_line[line].firstchar = 0; + win->_line[line].lastchar = win->_maxx; + } + } +} + +int +wscrl(WINDOW *win, int n) +{ + T(("wscrl(%p,%d) called", win, n)); + + if (! win->_scroll) + return ERR; + + if (n == 0) + return OK; + + if ((n > (win->_regbottom - win->_regtop)) || + (-n > (win->_regbottom - win->_regtop))) + return ERR; + + _nc_scroll_window(win, n, win->_regtop, win->_regbottom); + touchline(win, win->_regtop, (int)(win->_regbottom - win->_regtop + 1)); + + _nc_synchook(win); + return OK; +} diff --git a/lib/libcurses/lib_scrreg.c b/lib/libcurses/lib_scrreg.c new file mode 100644 index 00000000000..6a741304dbe --- /dev/null +++ b/lib/libcurses/lib_scrreg.c @@ -0,0 +1,47 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_scrreg.c +** +** The routine wsetscrreg(). +** +*/ + +#include "curses.priv.h" + +int wsetscrreg(WINDOW *win, int top, int bottom) +{ + T(("wsetscrreg(%p,%d,%d) called", win, top, bottom)); + + if (top >= 0 && top <= win->_maxy && + bottom >= 0 && bottom <= win->_maxy && + bottom > top) + { + win->_regtop = (short)top; + win->_regbottom = (short)bottom; + + return(OK); + } else + return(ERR); +} diff --git a/lib/libcurses/lib_set_term.c b/lib/libcurses/lib_set_term.c new file mode 100644 index 00000000000..6df38903072 --- /dev/null +++ b/lib/libcurses/lib_set_term.c @@ -0,0 +1,141 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** lib_set_term.c +** +** The routine set_term(). +** +*/ + +#include "curses.priv.h" +#include <stdlib.h> +#include "term.h" /* cur_term */ + +struct screen * set_term(struct screen *screen) +{ +struct screen *oldSP; + + T(("set_term(%p) called", screen)); + + oldSP = SP; + _nc_set_screen(screen); + + cur_term = SP->_term; + curscr = SP->_curscr; + newscr = SP->_newscr; + stdscr = SP->_stdscr; + + return(oldSP); +} + +void delscreen(SCREEN *sp) +{ + free(sp); +} + +struct ripoff_t +{ + int line; + int (*hook)(WINDOW *, int); +} +rippedoff[5], *rsp = rippedoff; + +int _nc_setupscreen(short slines, short const scolumns) +/* OS-independent screen initializations */ +{ +int stolen, topstolen; + + if (!_nc_alloc_screen()) + return ERR; + + SP->_term = cur_term; + SP->_lines = slines; + SP->_columns = scolumns; + SP->_cursrow = -1; + SP->_curscol = -1; + SP->_keytry = UNINITIALISED; + SP->_nl = TRUE; + SP->_raw = FALSE; + SP->_cbreak = FALSE; + SP->_echo = TRUE; + SP->_fifohead = -1; + SP->_fifotail = 0; + SP->_fifopeek = 0; + SP->_endwin = TRUE; + SP->_ofp = stdout; /* (may be overridden later) */ + SP->_coloron = 0; + + init_acs(); + + T(("creating newscr")); + if ((newscr = newwin(slines, scolumns, 0, 0)) == (WINDOW *)NULL) + return ERR; + + T(("creating curscr")); + if ((curscr = newwin(slines, scolumns, 0, 0)) == (WINDOW *)NULL) + return ERR; + + SP->_newscr = newscr; + SP->_curscr = curscr; + + newscr->_clear = TRUE; + curscr->_clear = FALSE; + + stolen = topstolen = 0; + for (rsp = rippedoff; rsp->line; rsp++) { + if (rsp->hook) + if (rsp->line < 0) + rsp->hook(newwin(1,scolumns, slines-1,0), scolumns); + else + rsp->hook(newwin(1,scolumns, topstolen++,0), scolumns); + --slines; + stolen++; + } + + T(("creating stdscr")); + if ((stdscr = newwin(LINES = slines, scolumns, topstolen, 0)) == NULL) + return ERR; + SP->_stdscr = stdscr; + + def_shell_mode(); + def_prog_mode(); + + return OK; +} + +int +ripoffline(int line, int (*init)(WINDOW *, int)) +{ + if (line == 0) + return(OK); + + if (rsp >= rippedoff + sizeof(rippedoff)/sizeof(rippedoff[0])) + return(ERR); + + rsp->line = line; + rsp->hook = init; + rsp++; + + return(OK); +} diff --git a/lib/libcurses/lib_slk.c b/lib/libcurses/lib_slk.c new file mode 100644 index 00000000000..973a3ab6ae3 --- /dev/null +++ b/lib/libcurses/lib_slk.c @@ -0,0 +1,328 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* + * lib_slk.c + * Soft key routines. + */ + +#include "curses.priv.h" +#include <string.h> +#include <stdlib.h> +#include "term.h" /* num_labels, label_*, plab_norm */ + +#define MAX_SKEY 8 /* count of soft keys */ +#define MAX_SKEY_LEN 8 /* max length of soft key text */ + +/* + * We'd like to move these into the screen context structure, but cannot, + * because slk_init() is called before initscr()/newterm(). + */ +int _slk_init; /* TRUE if slk_init() called */ + +static int _slk_format; /* format specified in slk_init() */ +static chtype _slk_attr = A_STANDOUT; /* soft label attribute */ +static int maxlab; /* number of labels */ +static int maxlen; /* maximum length of label */ + +/* + * Fetch the label text. + */ + +char * +slk_label(int n) +{ + T(("slk_label(%d)", n)); + + if (SP->_slk == NULL || n < 1 || n > MAX_SKEY) + return NULL; + return(SP->_slk->ent[n-1].text); +} + +/* + * Write the soft labels to the soft-key window. + */ + +static void +slk_intern_refresh(SLK *slk) +{ +int i; + for (i = 0; i < MAX_SKEY; i++) { + if (slk->dirty || slk->ent[i].dirty) { + if (slk->ent[i].visible) { +#ifdef num_labels + if (num_labels > 0) + { + TPUTS_TRACE("plab_norm"); + putp(tparm(plab_norm, i, slk->win,slk->ent[i].form_text)); + } + else +#endif /* num_labels */ + { + wmove(slk->win,0,slk->ent[i].x); + wattrset(slk->win,_slk_attr); + waddstr(slk->win,slk->ent[i].form_text); + wattrset(slk->win,A_NORMAL); + } + } + slk->ent[i].dirty = FALSE; + } + } + slk->dirty = FALSE; + +#ifdef num_labels + if (num_labels > 0) + if (slk->hidden) + { + TPUTS_TRACE("label_off"); + putp(label_off); + } + else + { + TPUTS_TRACE("label_on"); + putp(label_on); + } +#endif /* num_labels */ +} + +/* + * Refresh the soft labels. + */ + +int +slk_noutrefresh(void) +{ + T(("slk_noutrefresh()")); + + if (SP->_slk == NULL) + return(ERR); + if (SP->_slk->hidden) + return(OK); + slk_intern_refresh(SP->_slk); + return(wnoutrefresh(SP->_slk->win)); +} + +/* + * Refresh the soft labels. + */ + +int +slk_refresh(void) +{ + T(("slk_refresh()")); + + if (SP->_slk == NULL) + return(ERR); + if (SP->_slk->hidden) + return(OK); + slk_intern_refresh(SP->_slk); + return(wrefresh(SP->_slk->win)); +} + +/* + * Restore the soft labels on the screen. + */ + +int +slk_restore(void) +{ + T(("slk_restore()")); + + if (SP->_slk == NULL) + return(ERR); + SP->_slk->hidden = FALSE; + SP->_slk->dirty = TRUE; + return slk_refresh(); +} + +/* + * Set soft label text. + */ + +int +slk_set(int i, const char *astr, int format) +{ +SLK *slk = SP->_slk; +size_t len; +const char *str = astr; + + T(("slk_set(%d, \"%s\", %d)", i, str, format)); + + if (slk == NULL || i < 1 || i > maxlab || format < 0 || format > 2) + return(ERR); + if (str == NULL) + str = ""; + --i; + (void) strncpy(slk->ent[i].text, str, (unsigned)maxlen); + memset(slk->ent[i].form_text,' ', (unsigned)maxlen); + slk->ent[i].text[maxlen] = 0; + slk->ent[i].form_text[maxlen] = 0; + len = strlen(slk->ent[i].text); + + switch(format) { + case 0: /* left-justified */ + memcpy(slk->ent[i].form_text, + slk->ent[i].text, + len); + break; + case 1: /* centered */ + memcpy(slk->ent[i].form_text+(MAX_SKEY_LEN-len)/2, + slk->ent[i].text, + len); + break; + case 2: /* right-justified */ + memcpy(slk->ent[i].form_text+MAX_SKEY_LEN-len, + slk->ent[i].text, + len); + break; + } + slk->ent[i].dirty = TRUE; + return(OK); +} + +/* + * Force the code to believe that the soft keys have been changed. + */ + +int +slk_touch(void) +{ + T(("slk_touch()")); + + if (SP->_slk == NULL) + return(ERR); + SP->_slk->dirty = TRUE; + return(OK); +} + +/* + * Remove soft labels from the screen. + */ + +int +slk_clear(void) +{ + T(("slk_clear()")); + + if (SP->_slk == NULL) + return(ERR); + SP->_slk->hidden = TRUE; + werase(SP->_slk->win); + return wrefresh(SP->_slk->win); +} + +/* + * Initialize soft labels. + * Called from newterm() + */ + +int +slk_initialize(WINDOW *stwin, int cols) +{ +SLK *slk; +int i, x; + + T(("slk_initialize()")); + + if ((SP->_slk = slk = (SLK*) calloc(1,sizeof(SLK))) == NULL) + return(OK); + +#ifdef num_labels + maxlab = (num_labels > 0) ? num_labels : MAX_SKEY; + maxlen = (num_labels > 0) ? label_width * label_height : MAX_SKEY_LEN; +#else + maxlab = MAX_SKEY; + maxlen = MAX_SKEY_LEN; +#endif /* num_labels */ + + for (i = 0; i < MAX_SKEY; i++) { + memset(slk->ent[i].form_text, ' ', (unsigned)maxlen); + slk->ent[i].visible = i < maxlab; + } + if (_slk_format == 1) { /* 4-4 */ + int gap = cols - (MAX_SKEY * MAX_SKEY_LEN) - 6; + + if (gap < 1) + gap = 1; + for (i = x = 0; i < MAX_SKEY; i++) { + slk->ent[i].x = x; + x += MAX_SKEY_LEN; + x += (i == 3) ? gap : 1; + } + } + else { /* 0 -> 3-2-3 */ + int gap = (cols - (MAX_SKEY * MAX_SKEY_LEN) - 5) / 2; + + if (gap < 1) + gap = 1; + for (i = x = 0; i < MAX_SKEY; i++) { + slk->ent[i].x = x; + x += MAX_SKEY_LEN; + x += (i == 2 || i == 4) ? gap : 1; + } + } + slk->dirty = TRUE; + if ((slk->win = stwin) == NULL) + { + free(slk); + return(ERR); + } + + return(OK); +} + +/* + * Initialize soft labels. Called by the user before initscr(). + */ + +int +slk_init(int format) +{ + if (format < 0 || format > 1) + return(ERR); + _slk_format = format; + _slk_init = TRUE; + return(OK); +} + +/* Functions to manipulate the soft-label attribute */ + +int +slk_attrset(attr_t attr) +{ + _slk_attr = attr; + return(OK); +} + +int +slk_attron(attr_t attr) +{ + _slk_attr |= attr; + return(OK); +} + +int +slk_attroff(attr_t attr) +{ + _slk_attr &=~ attr; + return(OK); +} + diff --git a/lib/libcurses/lib_touch.c b/lib/libcurses/lib_touch.c new file mode 100644 index 00000000000..b2b29ac5859 --- /dev/null +++ b/lib/libcurses/lib_touch.c @@ -0,0 +1,64 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_touch.c +** +** The routines untouchwin(), +** wtouchln(), +** is_linetouched() +** is_wintouched(). +** +*/ + +#include "curses.priv.h" + +int is_linetouched(WINDOW *win, int line) +{ + if (line > win->_maxy || line < 0) + return ERR; + if (win->_line[line].firstchar != _NOCHANGE) return TRUE; + return FALSE; +} + +int is_wintouched(WINDOW *win) +{ +int i; + + for (i = 0; i <= win->_maxy; i++) + if (win->_line[i].firstchar != _NOCHANGE) + return TRUE; + return FALSE; +} + +int wtouchln(WINDOW *win, int y, int n, int changed) +{ +int i; + + T(("wtouchln(%p,%d,%d,%d)", win, y, n, changed)); + + for (i = y; i < y+n; i++) { + win->_line[i].firstchar = changed ? 0 : _NOCHANGE; + win->_line[i].lastchar = changed ? win->_maxx : _NOCHANGE; + } + return OK; +} + diff --git a/lib/libcurses/lib_tstp.c b/lib/libcurses/lib_tstp.c new file mode 100644 index 00000000000..73be68af51c --- /dev/null +++ b/lib/libcurses/lib_tstp.c @@ -0,0 +1,252 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* +** lib_tstp.c +** +** The routine _nc_signal_handler(). +** +*/ + +#include "curses.priv.h" + +#include <signal.h> +#include <stdlib.h> + +#if HAVE_SIGACTION +#if !HAVE_TYPE_SIGACTION +typedef struct sigaction sigaction_t; +#endif +#else +#include "SigAction.h" +#endif + +#ifdef SVR4_ACTION +#define _POSIX_SOURCE +#endif + +/* + * Note: This code is fragile! Its problem is that different OSs + * handle restart of system calls interrupted by signals differently. + * The ncurses code needs signal-call restart to happen -- otherwise, + * interrupted wgetch() calls will return FAIL, probably making the + * application think the input stream has ended and it should + * terminate. In particular, you know you have this problem if, when + * you suspend an ncurses-using lynx with ^Z and resume, it dies + * immediately. + * + * Default behavior of POSIX sigaction(2) is not to restart + * interrupted system calls, but Linux's sigaction does it anyway (at + * least, on and after the 1.1.47 I (esr) use). Thus this code works + * OK under Linux. The 4.4BSD sigaction(2) supports a (non-portable) + * SA_RESTART flag that forces the right behavior. Thus, this code + * should work OK under BSD/OS, NetBSD, and FreeBSD (let us know if it + * does not). + * + * Stock System Vs (and anything else using a strict-POSIX + * sigaction(2) without SA_RESTART) may have a problem. Possible + * solutions: + * + * sigvec restarts by default (SV_INTERRUPT flag to not restart) + * signal restarts by default in SVr4 (assuming you link with -lucb) + * and BSD, but not SVr3. + * sigset restarts, but is only available under SVr4/Solaris. + * + * The signal(3) call is mandated by the ANSI standard, and its + * interaction with sigaction(2) is described in the POSIX standard + * (3.3.4.2, page 72,line 934). According to section 8.1, page 191, + * however, signal(3) itself is not required by POSIX.1. And POSIX is + * silent on whether it is required to restart signals. + * + * So. The present situation is, we use sigaction(2) with no + * guarantee of restart anywhere but on Linux and BSD. We could + * switch to signal(3) and collar Linux, BSD, and SVr4. Any way + * we slice it, System V UNIXes older than SVr4 will probably lose + * (this may include XENIX). + * + * This implementation will probably be changed to use signal(3) in + * the future. If nothing else, it's simpler... + */ + +#ifdef SIGTSTP +static void tstp(int dummy) +{ + sigset_t mask, omask; + sigaction_t act, oact; + + T(("tstp() called")); + + /* + * The user may have changed the prog_mode tty bits, so save them. + */ + def_prog_mode(); + + /* + * Block window change and timer signals. The latter + * is because applications use timers to decide when + * to repaint the screen. + */ + (void)sigemptyset(&mask); + (void)sigaddset(&mask, SIGALRM); +#ifdef SIGWINCH + (void)sigaddset(&mask, SIGWINCH); +#endif + (void)sigprocmask(SIG_BLOCK, &mask, &omask); + + /* + * End window mode, which also resets the terminal state to the + * original (pre-curses) modes. + */ + endwin(); + + /* Unblock SIGTSTP. */ + (void)sigemptyset(&mask); + (void)sigaddset(&mask, SIGTSTP); + (void)sigprocmask(SIG_UNBLOCK, &mask, NULL); + + /* Now we want to resend SIGSTP to this process and suspend it */ + act.sa_handler = SIG_DFL; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; +#ifdef SA_RESTART + act.sa_flags |= SA_RESTART; +#endif /* SA_RESTART */ + sigaction(SIGTSTP, &act, &oact); + kill(getpid(), SIGTSTP); + + /* Process gets suspended...time passes...process resumes */ + + T(("SIGCONT received")); + sigaction(SIGTSTP, &oact, NULL); + flushinp(); + + /* + * If the user modified the tty state while suspended, he wants + * those changes to stick. So save the new "default" terminal state. + */ + def_shell_mode(); + + /* + * This relies on the fact that doupdate() will restore the + * program-mode tty state, and issue enter_ca_mode if need be. + */ + doupdate(); + + /* Reset the signals. */ + (void)sigprocmask(SIG_SETMASK, &omask, NULL); +} +#endif /* defined(SIGTSTP) */ + +static void cleanup(int sig) +{ + /* + * Actually, doing any sort of I/O from within an signal handler is + * "unsafe". But we'll _try_ to clean up the screen and terminal + * settings on the way out. + */ + if (sig == SIGINT + || sig == SIGQUIT) { + sigaction_t act; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + act.sa_handler = SIG_IGN; + if (sigaction(sig, &act, (sigaction_t *)0) == 0) { + endwin(); + } + } + exit(1); +} + +/* + * If the given signal is still in its default state, set it to the given + * handler. + */ +static int CatchIfDefault(int sig, sigaction_t *act) +{ + sigaction_t old_act; + +#ifdef SA_RESTART + act->sa_flags |= SA_RESTART; +#endif /* SA_RESTART */ + if (sigaction(sig, (sigaction_t *)0, &old_act) == 0 + && old_act.sa_handler == SIG_DFL) { + (void)sigaction(sig, act, (sigaction_t *)0); + return TRUE; + } + return FALSE; +} + +/* + * This is invoked once at the beginning (e.g., from 'initscr()'), to + * initialize the signal catchers, and thereafter when spawning a shell (and + * returning) to disable/enable the SIGTSTP (i.e., ^Z) catcher. + * + * If the application has already set one of the signals, we'll not modify it + * (during initialization). + * + * The XSI document implies that we shouldn't keep the SIGTSTP handler if + * the caller later changes its mind, but that doesn't seem correct. + */ +void _nc_signal_handler(bool enable) +{ +#ifdef SIGTSTP /* Xenix 2.x doesn't have this */ +static sigaction_t act, oact; +static int ignore; + + if (!ignore) + { + if (!enable) + { + act.sa_handler = SIG_IGN; + sigaction(SIGTSTP, &act, &oact); + } + else if (act.sa_handler) + { + sigaction(SIGTSTP, &oact, NULL); + } + else /*initialize */ + { + sigemptyset(&act.sa_mask); + act.sa_flags = 0; +#ifdef SA_RESTART + act.sa_flags |= SA_RESTART; +#endif /* SA_RESTART */ + + act.sa_handler = cleanup; + CatchIfDefault(SIGINT, &act); + CatchIfDefault(SIGTERM, &act); + + act.sa_handler = tstp; + if (!CatchIfDefault(SIGTSTP, &act)) + ignore = TRUE; + } + } +#else + if (enable) + { + static sigaction_t act; + act.sa_handler = cleanup; + CatchIfDefault(SIGINT, &act); + CatchIfDefault(SIGTERM, &act); + } +#endif +} diff --git a/lib/libcurses/lib_twait.c b/lib/libcurses/lib_twait.c new file mode 100644 index 00000000000..c9dee4e07be --- /dev/null +++ b/lib/libcurses/lib_twait.c @@ -0,0 +1,118 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_twait.c +** +** The routine _nc_timed_wait(). +** +*/ + +#include "curses.priv.h" + +#include <sys/types.h> /* some systems can't live without this */ +#include <string.h> + +#if HAVE_SYS_TIME_H && ! SYSTEM_LOOKS_LIKE_SCO +#include <sys/time.h> +#endif + +#if HAVE_UNISTD_H +#include <unistd.h> +#endif + +#if HAVE_SYS_SELECT_H +#include <sys/select.h> +#endif + +/* + * We want to define GOOD_SELECT if the last argument of select(2) is + * modified to indicate time left. The code will deal gracefully with + * the other case, this is just an optimization to reduce the number + * of system calls per input event. + * + * In general, expect System-V-like UNIXes to have this behavior and BSD-like + * ones to not have it. Check your manual page. If it doesn't explicitly + * say the last argument is modified, assume it's not. + * + * (We'd really like configure to autodetect this, but writing a proper test + * turns out to be hard.) + */ +#if defined(linux) +#define GOOD_SELECT +#endif + +#if !HAVE_USLEEP +int usleep(unsigned int usec) +{ +struct timeval tval; + + tval.tv_sec = usec / 1000000; + tval.tv_usec = usec % 1000000; + select(0, NULL, NULL, NULL, &tval); + +} +#endif + +int _nc_timed_wait(int fd, int wait, int *timeleft) +{ +int result; +struct timeval ntimeout; +static fd_set set; +#if !defined(GOOD_SELECT) && HAVE_GETTIMEOFDAY +struct timeval starttime, returntime; + + gettimeofday(&starttime, NULL); +#endif + + FD_ZERO(&set); + FD_SET(fd, &set); + + /* the units of wait are milliseconds */ + ntimeout.tv_sec = wait / 1000; + ntimeout.tv_usec = (wait % 1000) * 1000; + + T(("start twait: sec = %ld, usec = %ld", ntimeout.tv_sec, ntimeout.tv_usec)); + + result = select(fd+1, &set, NULL, NULL, &ntimeout); + +#if !defined(GOOD_SELECT) && HAVE_GETTIMEOFDAY + gettimeofday(&returntime, NULL); + ntimeout.tv_sec -= (returntime.tv_sec - starttime.tv_sec); + ntimeout.tv_usec -= (returntime.tv_usec - starttime.tv_usec); + if (ntimeout.tv_usec < 0 && ntimeout.tv_sec > 0) { + ntimeout.tv_sec--; + ntimeout.tv_usec += 1000000; + } + if (ntimeout.tv_sec < 0) + ntimeout.tv_sec = ntimeout.tv_usec = 0; +#endif + + /* return approximate time left on the ntimeout, in milliseconds */ + if (timeleft) + *timeleft = (ntimeout.tv_sec * 1000) + (ntimeout.tv_usec / 1000); + + T(("end twait: returned %d, sec = %ld, usec = %ld (%d msec)", + result, ntimeout.tv_sec, ntimeout.tv_usec, + timeleft ? *timeleft : -1)); + + return(result); +} diff --git a/lib/libcurses/lib_unctrl.c b/lib/libcurses/lib_unctrl.c new file mode 100644 index 00000000000..2511ecfb0e8 --- /dev/null +++ b/lib/libcurses/lib_unctrl.c @@ -0,0 +1,47 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +#include <unctrl.h> + +char *unctrl(register chtype uch) +{ + static char buffer[3] = "^x"; + + if ((uch & 0x60) != 0 && uch != 0x7F) { + /* + * Printable character. Simply return the character as a one-character + * string. + */ + buffer[1] = uch; + return &buffer[1]; + } + /* + * It is a control character. DEL is handled specially (^?). All others + * use ^x notation, where x is the character code for the control character + * with 0x40 ORed in. (Control-A becomes ^A etc.). + */ + buffer[1] = (uch == 0x7F ? '?' : (uch | 0x40)); + + return buffer; + +} diff --git a/lib/libcurses/lib_vidattr.c b/lib/libcurses/lib_vidattr.c new file mode 100644 index 00000000000..8c6ffc8a35a --- /dev/null +++ b/lib/libcurses/lib_vidattr.c @@ -0,0 +1,275 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* + * vidputs(newmode, outc) + * + * newmode is taken to be the logical 'or' of the symbols in curses.h + * representing graphic renditions. The teminal is set to be in all of + * the given modes, if possible. + * + * if the new attribute is normal + * if exit-alt-char-set exists + * emit it + * emit exit-attribute-mode + * else if set-attributes exists + * use it to set exactly what you want + * else + * if exit-attribute-mode exists + * turn off everything + * else + * turn off those which can be turned off and aren't in + * newmode. + * turn on each mode which should be on and isn't, one by one + * + * NOTE that this algorithm won't achieve the desired mix of attributes + * in some cases, but those are probably just those cases in which it is + * actually impossible, anyway, so... + */ + +#include "curses.priv.h" +#include <string.h> +#include "term.h" + +int vidputs(attr_t newmode, int (*outc)(int)) +{ +static attr_t previous_attr; +attr_t turn_on, turn_off; + + T(("vidputs(%lx) called %s", newmode, _traceattr(newmode))); + + /* this allows us to go on whether or not newterm() has been called */ + if (SP) + previous_attr = SP->_current_attr; + + T(("previous attribute was %s", _traceattr(previous_attr))); + + turn_off = (~newmode & previous_attr) & (chtype)(~A_COLOR); + turn_on = (newmode & ~previous_attr) & (chtype)(~A_COLOR); + + if (newmode == previous_attr) + return OK; + if (newmode == A_NORMAL) { + if((previous_attr & A_ALTCHARSET) && exit_alt_charset_mode) { + TPUTS_TRACE("exit_alt_charset_mode"); + tputs(exit_alt_charset_mode, 1, outc); + previous_attr &= ~A_ALTCHARSET; + } + if (previous_attr & A_COLOR) { + TPUTS_TRACE("orig_pair"); + tputs(orig_pair, 1, outc); + } + if (previous_attr) { + TPUTS_TRACE("exit_attribute_mode"); + tputs(exit_attribute_mode, 1, outc); + } + + } else if (set_attributes) { + if (turn_on || turn_off) { + TPUTS_TRACE("set_attributes"); + tputs(tparm(set_attributes, + (newmode & A_STANDOUT) != 0, + (newmode & A_UNDERLINE) != 0, + (newmode & A_REVERSE) != 0, + (newmode & A_BLINK) != 0, + (newmode & A_DIM) != 0, + (newmode & A_BOLD) != 0, + (newmode & A_INVIS) != 0, + (newmode & A_PROTECT) != 0, + (newmode & A_ALTCHARSET) != 0), 1, outc); + /* + * Setting attributes in this way tends to unset the + * ones (such as color) that weren't specified. + */ + turn_off |= A_COLOR; + } + } else { + + T(("turning %s off", _traceattr(turn_off))); + + if ((turn_off & A_ALTCHARSET) && exit_alt_charset_mode) { + TPUTS_TRACE("exit_alt_charset_mode"); + tputs(exit_alt_charset_mode, 1, outc); + turn_off &= ~A_ALTCHARSET; + } + + if ((turn_off & A_UNDERLINE) && exit_underline_mode) { + TPUTS_TRACE("exit_underline_mode"); + tputs(exit_underline_mode, 1, outc); + turn_off &= ~A_UNDERLINE; + } + + if ((turn_off & A_STANDOUT) && exit_standout_mode) { + TPUTS_TRACE("exit_standout_mode"); + tputs(exit_standout_mode, 1, outc); + turn_off &= ~A_STANDOUT; + } + + if (turn_off && exit_attribute_mode) { + TPUTS_TRACE("exit_attribute_mode"); + tputs(exit_attribute_mode, 1, outc); + turn_on |= (newmode & (chtype)(~A_COLOR)); + turn_off |= A_COLOR; + } + + T(("turning %s on", _traceattr(turn_on))); + + if ((turn_on & A_ALTCHARSET) && enter_alt_charset_mode) { + TPUTS_TRACE("enter_alt_charset_mode"); + tputs(enter_alt_charset_mode, 1, outc); + } + + if ((turn_on & A_BLINK) && enter_blink_mode) { + TPUTS_TRACE("enter_blink_mode"); + tputs(enter_blink_mode, 1, outc); + } + + if ((turn_on & A_BOLD) && enter_bold_mode) { + TPUTS_TRACE("enter_bold_mode"); + tputs(enter_bold_mode, 1, outc); + } + + if ((turn_on & A_DIM) && enter_dim_mode) { + TPUTS_TRACE("enter_dim_mode"); + tputs(enter_dim_mode, 1, outc); + } + + if ((turn_on & A_REVERSE) && enter_reverse_mode) { + TPUTS_TRACE("enter_reverse_mode"); + tputs(enter_reverse_mode, 1, outc); + } + + if ((turn_on & A_STANDOUT) && enter_standout_mode) { + TPUTS_TRACE("enter_standout_mode"); + tputs(enter_standout_mode, 1, outc); + } + + if ((turn_on & A_PROTECT) && enter_protected_mode) { + TPUTS_TRACE("enter_protected_mode"); + tputs(enter_protected_mode, 1, outc); + } + + if ((turn_on & A_INVIS) && enter_secure_mode) { + TPUTS_TRACE("enter_secure_mode"); + tputs(enter_secure_mode, 1, outc); + } + + if ((turn_on & A_UNDERLINE) && enter_underline_mode) { + TPUTS_TRACE("enter_underline_mode"); + tputs(enter_underline_mode, 1, outc); + } + + if ((turn_on & A_HORIZONTAL) && enter_horizontal_hl_mode) { + TPUTS_TRACE("enter_horizontal_hl_mode"); + tputs(enter_horizontal_hl_mode, 1, outc); + } + + if ((turn_on & A_LEFT) && enter_left_hl_mode) { + TPUTS_TRACE("enter_left_hl_mode"); + tputs(enter_left_hl_mode, 1, outc); + } + + if ((turn_on & A_LOW) && enter_low_hl_mode) { + TPUTS_TRACE("enter_low_hl_mode"); + tputs(enter_low_hl_mode, 1, outc); + } + + if ((turn_on & A_RIGHT) && enter_right_hl_mode) { + TPUTS_TRACE("enter_right_hl_mode"); + tputs(enter_right_hl_mode, 1, outc); + } + + if ((turn_on & A_TOP) && enter_top_hl_mode) { + TPUTS_TRACE("enter_top_hl_mode"); + tputs(enter_top_hl_mode, 1, outc); + } + + if ((turn_on & A_VERTICAL) && enter_vertical_hl_mode) { + TPUTS_TRACE("enter_vertical_hl_mode"); + tputs(enter_vertical_hl_mode, 1, outc); + } + } + + /* if there is no crrent screen, assume we *can* do color */ + if (!SP || SP->_coloron) { + int pair = PAIR_NUMBER(newmode); + int current_pair = PAIR_NUMBER(previous_attr); + + T(("old pair = %d -- new pair = %d", current_pair, pair)); + if (pair != current_pair || (turn_off && pair)) { + _nc_do_color(pair, outc); + } + } + + if (SP) + SP->_current_attr = newmode; + + T(("vidputs finished")); + return OK; +} + +#undef vidattr + +int vidattr(attr_t newmode) +{ + + T(("vidattr(%lx) called", newmode)); + + return(vidputs(newmode, _nc_outch)); +} + +attr_t termattrs(void) +{ + int attrs = A_NORMAL; + + if (enter_alt_charset_mode) + attrs |= A_ALTCHARSET; + + if (enter_blink_mode) + attrs |= A_BLINK; + + if (enter_bold_mode) + attrs |= A_BOLD; + + if (enter_dim_mode) + attrs |= A_DIM; + + if (enter_reverse_mode) + attrs |= A_REVERSE; + + if (enter_standout_mode) + attrs |= A_STANDOUT; + + if (enter_protected_mode) + attrs |= A_PROTECT; + + if (enter_secure_mode) + attrs |= A_INVIS; + + if (enter_underline_mode) + attrs |= A_UNDERLINE; + + if (SP->_coloron) + attrs |= A_COLOR; + + return(attrs); +} + diff --git a/lib/libcurses/lib_window.c b/lib/libcurses/lib_window.c new file mode 100644 index 00000000000..3e9f58af704 --- /dev/null +++ b/lib/libcurses/lib_window.c @@ -0,0 +1,173 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* +** lib_window.c +** +** +*/ + +#include "curses.priv.h" +#include <string.h> + +void _nc_synchook(WINDOW *win) +/* hook to be called after each window change */ +{ + if (win->_immed) wrefresh(win); + if (win->_sync) wsyncup(win); +} + +int mvderwin(WINDOW *win, int y, int x) +/* move a derived window */ +{ + WINDOW *orig = win->_parent; + int i; + + if (orig) + { + if (win->_parx==x && win->_pary==y) + return OK; + if (x<0 || y<0) + return ERR; + if ( (x+getmaxx(win) > getmaxx(orig)) || + (y+getmaxy(win) > getmaxy(orig)) ) + return ERR; + } + else + return ERR; + wsyncup(win); + win->_parx = x; + win->_pary = y; + for(i=0;i<getmaxy(win);i++) + win->_line[i].text = &(orig->_line[y++].text[x]); + return OK; +} + +int syncok(WINDOW *win, bool bf) +/* enable/disable automatic wsyncup() on each change to window */ +{ + if (win) { + win->_sync = bf; + return(OK); + } else + return(ERR); +} + +void wsyncup(WINDOW *win) +/* mark changed every cell in win's ancestors that is changed in win */ +{ + WINDOW *wp; + + if (win->_parent) + for (wp = win; wp->_parent; wp = wp->_parent) + { + int i; + WINDOW *pp = wp->_parent; + + for (i = 0; i <= wp->_maxy; i++) + { + if (pp->_line[wp->_pary + i].firstchar >= 0 + && pp->_line[wp->_pary + i].firstchar < wp->_line[i].firstchar) + wp->_line[i].firstchar = pp->_line[wp->_pary + i].firstchar; + if (pp->_line[wp->_pary + i].lastchar > wp->_line[i].lastchar) + wp->_line[i].lastchar = pp->_line[wp->_pary + i].lastchar; + } + } +} + +void wsyncdown(WINDOW *win) +/* mark changed every cell in win that is changed in any of its ancestors */ +{ + WINDOW *wp; + + if (win->_parent) + for (wp = win; wp->_parent; wp = wp->_parent) + { + int i; + WINDOW *pp = wp->_parent; + + for (i = 0; i <= wp->_maxy; i++) + { + if (wp->_line[i].firstchar >= 0 + && wp->_line[i].firstchar < pp->_line[wp->_pary + i].firstchar) + pp->_line[wp->_pary + i].firstchar = wp->_line[i].firstchar; + if (wp->_line[i].lastchar > pp->_line[wp->_pary + i].lastchar) + pp->_line[wp->_pary + i].lastchar = wp->_line[i].lastchar; + } + } +} + +void wcursyncup(WINDOW *win) +/* sync the cursor in all derived windows to its value in the base window */ +{ + WINDOW *wp; + for( wp = win; wp && wp->_parent; wp = wp->_parent ) { + wmove( wp->_parent, wp->_pary + wp->_cury, wp->_parx + wp->_curx ); + } +} + +WINDOW *dupwin(WINDOW *win) +/* make an exact duplicate of the given window */ +{ +WINDOW *nwin; +size_t linesize; +int i; + + T(("dupwin(%p) called", win)); + + if ((nwin = newwin(win->_maxy + 1, win->_maxx + 1, win->_begy, win->_begx)) == NULL) + return NULL; + + nwin->_curx = win->_curx; + nwin->_cury = win->_cury; + nwin->_maxy = win->_maxy; + nwin->_maxx = win->_maxx; + nwin->_begy = win->_begy; + nwin->_begx = win->_begx; + + nwin->_flags = win->_flags; + nwin->_attrs = win->_attrs; + nwin->_bkgd = win->_bkgd; + + nwin->_clear = win->_clear; + nwin->_scroll = win->_scroll; + nwin->_leaveok = win->_leaveok; + nwin->_use_keypad = win->_use_keypad; + nwin->_delay = win->_delay; + nwin->_immed = win->_immed; + nwin->_sync = win->_sync; + nwin->_parx = win->_parx; + nwin->_pary = win->_pary; + nwin->_parent = win->_parent; + + nwin->_regtop = win->_regtop; + nwin->_regbottom = win->_regbottom; + + linesize = (win->_maxx + 1) * sizeof(chtype); + for (i = 0; i <= nwin->_maxy; i++) { + memcpy(nwin->_line[i].text, win->_line[i].text, linesize); + nwin->_line[i].firstchar = win->_line[i].firstchar; + nwin->_line[i].lastchar = win->_line[i].lastchar; + } + + return nwin; +} + diff --git a/lib/libcurses/longname.c b/lib/libcurses/longname.c deleted file mode 100644 index fd54630f161..00000000000 --- a/lib/libcurses/longname.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 1981, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)longname.c 8.1 (Berkeley) 6/4/93"; -#endif /* not lint */ - -/* - * longname -- - * Fill in "def" with the long name of the terminal. - */ -char * -longname(bp, def) - register char *bp, *def; -{ - register char *cp; - - while (*bp && *bp != ':' && *bp != '|') - bp++; - if (*bp == '|') { - for (cp = def, ++bp; *bp && *bp != ':' && *bp != '|';) - *cp++ = *bp++; - *cp = '\0'; - } - return (def); -} diff --git a/lib/libcurses/move.c b/lib/libcurses/move.c deleted file mode 100644 index 1e22fb0648d..00000000000 --- a/lib/libcurses/move.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)move.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * wmove -- - * Moves the cursor to the given point. - */ -int -wmove(win, y, x) - register WINDOW *win; - register int y, x; -{ - -#ifdef DEBUG - __CTRACE("wmove: (%d, %d)\n", y, x); -#endif - if (x < 0 || y < 0) - return (ERR); - if (x >= win->maxx || y >= win->maxy) - return (ERR); - win->curx = x; - win->lines[win->cury]->flags &= ~__ISPASTEOL; - win->cury = y; - win->lines[y]->flags &= ~__ISPASTEOL; - return (OK); -} diff --git a/lib/libcurses/mvwin.c b/lib/libcurses/mvwin.c deleted file mode 100644 index 1471b27e186..00000000000 --- a/lib/libcurses/mvwin.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)mvwin.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * mvwin -- - * Relocate the starting position of a window. - */ -int -mvwin(win, by, bx) - register WINDOW *win; - register int by, bx; -{ - register WINDOW *orig; - register int dy, dx; - - if (by + win->maxy > LINES || bx + win->maxx > COLS) - return (ERR); - dy = by - win->begy; - dx = bx - win->begx; - orig = win->orig; - if (orig == NULL) { - orig = win; - do { - win->begy += dy; - win->begx += dx; - __swflags(win); - win = win->nextp; - } while (win != orig); - } else { - if (by < orig->begy || win->maxy + dy > orig->maxy) - return (ERR); - if (bx < orig->begx || win->maxx + dx > orig->maxx) - return (ERR); - win->begy = by; - win->begx = bx; - __swflags(win); - __set_subwin(orig, win); - } - __touchwin(win); - return (OK); -} diff --git a/lib/libcurses/newwin.c b/lib/libcurses/newwin.c deleted file mode 100644 index 8f09cbf7966..00000000000 --- a/lib/libcurses/newwin.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)newwin.c 8.3 (Berkeley) 7/27/94"; -#endif /* not lint */ - -#include <stdlib.h> - -#include "curses.h" - -#undef nl /* Don't need it here, and it interferes. */ - -static WINDOW *__makenew __P((int, int, int, int, int)); - -void __set_subwin __P((WINDOW *, WINDOW *)); - -/* - * newwin -- - * Allocate space for and set up defaults for a new window. - */ -WINDOW * -newwin(nl, nc, by, bx) - register int nl, nc, by, bx; -{ - register WINDOW *win; - register __LINE *lp; - register int i, j; - register __LDATA *sp; - - if (nl == 0) - nl = LINES - by; - if (nc == 0) - nc = COLS - bx; - - if ((win = __makenew(nl, nc, by, bx, 0)) == NULL) - return (NULL); - - win->nextp = win; - win->ch_off = 0; - win->orig = NULL; - -#ifdef DEBUG - __CTRACE("newwin: win->ch_off = %d\n", win->ch_off); -#endif - - for (i = 0; i < nl; i++) { - lp = win->lines[i]; - lp->flags = 0; - for (sp = lp->line, j = 0; j < nc; j++, sp++) { - sp->ch = ' '; - sp->attr = 0; - } - lp->hash = __hash((char *) lp->line, nc * __LDATASIZE); - } - return (win); -} - -WINDOW * -subwin(orig, nl, nc, by, bx) - register WINDOW *orig; - register int by, bx, nl, nc; -{ - int i; - __LINE *lp; - register WINDOW *win; - - /* Make sure window fits inside the original one. */ -#ifdef DEBUG - __CTRACE("subwin: (%0.2o, %d, %d, %d, %d)\n", orig, nl, nc, by, bx); -#endif - if (by < orig->begy || bx < orig->begx - || by + nl > orig->maxy + orig->begy - || bx + nc > orig->maxx + orig->begx) - return (NULL); - if (nl == 0) - nl = orig->maxy + orig->begy - by; - if (nc == 0) - nc = orig->maxx + orig->begx - bx; - if ((win = __makenew(nl, nc, by, bx, 1)) == NULL) - return (NULL); - win->nextp = orig->nextp; - orig->nextp = win; - win->orig = orig; - - /* Initialize flags here so that refresh can also use __set_subwin. */ - for (lp = win->lspace, i = 0; i < win->maxy; i++, lp++) - lp->flags = 0; - __set_subwin(orig, win); - return (win); -} - -/* - * This code is shared with mvwin(). - */ -void -__set_subwin(orig, win) - register WINDOW *orig, *win; -{ - int i; - __LINE *lp, *olp; - - win->ch_off = win->begx - orig->begx; - /* Point line pointers to line space. */ - for (lp = win->lspace, i = 0; i < win->maxy; i++, lp++) { - win->lines[i] = lp; - olp = orig->lines[i + win->begy]; - lp->line = &olp->line[win->begx]; - lp->firstchp = &olp->firstch; - lp->lastchp = &olp->lastch; - lp->hash = __hash((char *) lp->line, win->maxx * __LDATASIZE); - } - -#ifdef DEBUG - __CTRACE("__set_subwin: win->ch_off = %d\n", win->ch_off); -#endif -} - -/* - * __makenew -- - * Set up a window buffer and returns a pointer to it. - */ -static WINDOW * -__makenew(nl, nc, by, bx, sub) - register int by, bx, nl, nc; - int sub; -{ - register WINDOW *win; - register __LINE *lp; - int i; - - -#ifdef DEBUG - __CTRACE("makenew: (%d, %d, %d, %d)\n", nl, nc, by, bx); -#endif - if ((win = malloc(sizeof(*win))) == NULL) - return (NULL); -#ifdef DEBUG - __CTRACE("makenew: nl = %d\n", nl); -#endif - - /* - * Set up line pointer array and line space. - */ - if ((win->lines = malloc (nl * sizeof(__LINE *))) == NULL) { - free(win); - return NULL; - } - if ((win->lspace = malloc (nl * sizeof(__LINE))) == NULL) { - free (win); - free (win->lines); - return NULL; - } - - /* Don't allocate window and line space if it's a subwindow */ - if (!sub) { - /* - * Allocate window space in one chunk. - */ - if ((win->wspace = - malloc(nc * nl * sizeof(__LDATA))) == NULL) { - free(win->lines); - free(win->lspace); - free(win); - return NULL; - } - - /* - * Point line pointers to line space, and lines themselves into - * window space. - */ - for (lp = win->lspace, i = 0; i < nl; i++, lp++) { - win->lines[i] = lp; - lp->line = &win->wspace[i * nc]; - lp->firstchp = &lp->firstch; - lp->lastchp = &lp->lastch; - lp->firstch = 0; - lp->lastch = 0; - } - } -#ifdef DEBUG - __CTRACE("makenew: nc = %d\n", nc); -#endif - win->cury = win->curx = 0; - win->maxy = nl; - win->maxx = nc; - - win->begy = by; - win->begx = bx; - win->flags = 0; - __swflags(win); -#ifdef DEBUG - __CTRACE("makenew: win->flags = %0.2o\n", win->flags); - __CTRACE("makenew: win->maxy = %d\n", win->maxy); - __CTRACE("makenew: win->maxx = %d\n", win->maxx); - __CTRACE("makenew: win->begy = %d\n", win->begy); - __CTRACE("makenew: win->begx = %d\n", win->begx); -#endif - return (win); -} - -void -__swflags(win) - register WINDOW *win; -{ - win->flags &= ~(__ENDLINE | __FULLWIN | __SCROLLWIN | __LEAVEOK); - if (win->begx + win->maxx == COLS) { - win->flags |= __ENDLINE; - if (win->begx == 0 && win->maxy == LINES && win->begy == 0) - win->flags |= __FULLWIN; - if (win->begy + win->maxy == LINES) - win->flags |= __SCROLLWIN; - } -} diff --git a/lib/libcurses/overlay.c b/lib/libcurses/overlay.c deleted file mode 100644 index 9f35c79e3fb..00000000000 --- a/lib/libcurses/overlay.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)overlay.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <ctype.h> - -#include "curses.h" - -/* - * overlay -- - * Writes win1 on win2 non-destructively. - */ -int -overlay(win1, win2) - register WINDOW *win1, *win2; -{ - - register int x, y, y1, y2, endy, endx, starty, startx; - register __LDATA *sp, *end; - -#ifdef DEBUG - __CTRACE("overlay: (%0.2o, %0.2o);\n", win1, win2); -#endif - starty = max(win1->begy, win2->begy); - startx = max(win1->begx, win2->begx); - endy = min(win1->maxy + win1->begy, win2->maxy + win2->begx); - endx = min(win1->maxx + win1->begx, win2->maxx + win2->begx); -#ifdef DEBUG - __CTRACE("overlay: from (%d,%d) to (%d,%d)\n", - starty, startx, endy, endx); -#endif - if (starty >= endy || startx >= endx) - return (OK); - y1 = starty - win1->begy; - y2 = starty - win2->begy; - for (y = starty; y < endy; y++, y1++, y2++) { - end = &win1->lines[y1]->line[endx - win1->begx]; - x = startx - win2->begx; - for (sp = &win1->lines[y1]->line[startx - win1->begx]; - sp < end; sp++) { - if (!isspace(sp->ch)) { - wmove(win2, y2, x); - __waddch(win2, sp); - } - x++; - } - } - return (OK); -} diff --git a/lib/libcurses/overwrite.c b/lib/libcurses/overwrite.c deleted file mode 100644 index e2d91bd0a8c..00000000000 --- a/lib/libcurses/overwrite.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)overwrite.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <ctype.h> -#include <string.h> - -#include "curses.h" - -/* - * overwrite -- - * Writes win1 on win2 destructively. - */ -int -overwrite(win1, win2) - register WINDOW *win1, *win2; -{ - register int x, y, endy, endx, starty, startx; - -#ifdef DEBUG - __CTRACE("overwrite: (%0.2o, %0.2o);\n", win1, win2); -#endif - starty = max(win1->begy, win2->begy); - startx = max(win1->begx, win2->begx); - endy = min(win1->maxy + win1->begy, win2->maxy + win2->begx); - endx = min(win1->maxx + win1->begx, win2->maxx + win2->begx); - if (starty >= endy || startx >= endx) - return (OK); -#ifdef DEBUG - __CTRACE("overwrite: from (%d, %d) to (%d, %d)\n", - starty, startx, endy, endx); -#endif - x = endx - startx; - for (y = starty; y < endy; y++) { - (void)memcpy( - &win2->lines[y - win2->begy]->line[startx - win2->begx], - &win1->lines[y - win1->begy]->line[startx - win1->begx], - x * __LDATASIZE); - __touchline(win2, y, startx - win2->begx, endx - win2->begx, - 0); - } - return (OK); -} diff --git a/lib/libcurses/printw.c b/lib/libcurses/printw.c deleted file mode 100644 index ae6ea49dabf..00000000000 --- a/lib/libcurses/printw.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)printw.c 8.3 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#include "curses.h" - -/* - * printw and friends. - * - * These routines make nonportable assumptions about varargs if __STDC__ - * is not in effect. - */ - -static int __winwrite __P((void *, const char *, int)); - -/* - * printw -- - * Printf on the standard screen. - */ -int -#ifdef __STDC__ -printw(const char *fmt, ...) -#else -printw(fmt, va_alist) - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - ret = vwprintw(stdscr, fmt, ap); - va_end(ap); - return (ret); -} - -/* - * wprintw -- - * Printf on the given window. - */ -int -#ifdef __STDC__ -wprintw(WINDOW * win, const char *fmt, ...) -#else -wprintw(win, fmt, va_alist) - WINDOW *win; - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - ret = vwprintw(win, fmt, ap); - va_end(ap); - return (ret); -} - -/* - * mvprintw, mvwprintw -- - * Implement the mvprintw commands. Due to the variable number of - * arguments, they cannot be macros. Sigh.... - */ -int -#ifdef __STDC__ -mvprintw(register int y, register int x, const char *fmt, ...) -#else -mvprintw(y, x, fmt, va_alist) - register int y, x; - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - if (move(y, x) != OK) - return (ERR); - ret = vwprintw(stdscr, fmt, ap); - va_end(ap); - return (ret); -} - -int -#ifdef __STDC__ -mvwprintw(register WINDOW * win, register int y, register int x, - const char *fmt, ...) -#else -mvwprintw(win, y, x, fmt, va_alist) - register WINDOW *win; - register int y, x; - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - if (wmove(win, y, x) != OK) - return (ERR); - - ret = vwprintw(win, fmt, ap); - va_end(ap); - return (ret); -} - -/* - * Internal write-buffer-to-window function. - */ -static int -__winwrite(cookie, buf, n) - void *cookie; - register const char *buf; - int n; -{ - register WINDOW *win; - register int c; - - for (c = n, win = cookie; --c >= 0;) - if (waddch(win, *buf++) == ERR) - return (-1); - return (n); -} - -/* - * vwprintw -- - * This routine actually executes the printf and adds it to the window. - */ -int -vwprintw(win, fmt, ap) - WINDOW *win; - const char *fmt; - va_list ap; -{ - FILE *f; - - if ((f = funopen(win, NULL, __winwrite, NULL, NULL)) == NULL) - return (ERR); - (void)vfprintf(f, fmt, ap); - return (fclose(f) ? ERR : OK); -} diff --git a/lib/libcurses/putchar.c b/lib/libcurses/putchar.c deleted file mode 100644 index 2ed5bb4755c..00000000000 --- a/lib/libcurses/putchar.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)putchar.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -void -__cputchar(ch) - int ch; -{ - -#ifdef DEBUG - __CTRACE("__cputchar: %s\n", unctrl(ch)); -#endif - (void)putchar(ch); -} diff --git a/lib/libcurses/refresh.c b/lib/libcurses/refresh.c deleted file mode 100644 index 3271bd9101e..00000000000 --- a/lib/libcurses/refresh.c +++ /dev/null @@ -1,827 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)refresh.c 8.7 (Berkeley) 8/13/94"; -#endif /* not lint */ - -#include <string.h> - -#include "curses.h" - -static int curwin; -static short ly, lx; - -static void domvcur __P((int, int, int, int)); -static int makech __P((WINDOW *, int)); -static void quickch __P((WINDOW *)); -static void scrolln __P((WINDOW *, int, int, int, int, int)); - -/* - * wrefresh -- - * Make the current screen look like "win" over the area coverd by - * win. - */ -int -wrefresh(win) - register WINDOW *win; -{ - register __LINE *wlp; - register int retval; - register short wy; - int dnum; - - /* Initialize loop parameters. */ - ly = curscr->cury; - lx = curscr->curx; - wy = 0; - curwin = (win == curscr); - - if (!curwin) - for (wy = 0; wy < win->maxy; wy++) { - wlp = win->lines[wy]; - if (wlp->flags & __ISDIRTY) - wlp->hash = __hash((char *)wlp->line, - win->maxx * __LDATASIZE); - } - - if (win->flags & __CLEAROK || curscr->flags & __CLEAROK || curwin) { - if ((win->flags & __FULLWIN) || curscr->flags & __CLEAROK) { - tputs(CL, 0, __cputchar); - ly = 0; - lx = 0; - if (!curwin) { - curscr->flags &= ~__CLEAROK; - curscr->cury = 0; - curscr->curx = 0; - werase(curscr); - } - __touchwin(win); - } - win->flags &= ~__CLEAROK; - } - if (!CA) { - if (win->curx != 0) - putchar('\n'); - if (!curwin) - werase(curscr); - } -#ifdef DEBUG - __CTRACE("wrefresh: (%0.2o): curwin = %d\n", win, curwin); - __CTRACE("wrefresh: \tfirstch\tlastch\n"); -#endif - -#ifndef NOQCH - if ((win->flags & __FULLWIN) && !curwin) { - /* - * Invoke quickch() only if more than a quarter of the lines - * in the window are dirty. - */ - for (wy = 0, dnum = 0; wy < win->maxy; wy++) - if (win->lines[wy]->flags & (__ISDIRTY | __FORCEPAINT)) - dnum++; - if (!__noqch && dnum > (int) win->maxy / 4) - quickch(win); - } -#endif - -#ifdef DEBUG -{ int i, j; - __CTRACE("#####################################\n"); - for (i = 0; i < curscr->maxy; i++) { - __CTRACE("C: %d:", i); - __CTRACE(" 0x%x \n", curscr->lines[i]->hash); - for (j = 0; j < curscr->maxx; j++) - __CTRACE("%c", - curscr->lines[i]->line[j].ch); - __CTRACE("\n"); - for (j = 0; j < curscr->maxx; j++) - __CTRACE("%x", - curscr->lines[i]->line[j].attr); - __CTRACE("\n"); - __CTRACE("W: %d:", i); - __CTRACE(" 0x%x \n", win->lines[i]->hash); - __CTRACE(" 0x%x ", win->lines[i]->flags); - for (j = 0; j < win->maxx; j++) - __CTRACE("%c", - win->lines[i]->line[j].ch); - __CTRACE("\n"); - for (j = 0; j < win->maxx; j++) - __CTRACE("%x", - win->lines[i]->line[j].attr); - __CTRACE("\n"); - } -} -#endif /* DEBUG */ - - for (wy = 0; wy < win->maxy; wy++) { -#ifdef DEBUG - __CTRACE("%d\t%d\t%d\n", - wy, *win->lines[wy]->firstchp, *win->lines[wy]->lastchp); -#endif - if (!curwin) - curscr->lines[wy]->hash = win->lines[wy]->hash; - if (win->lines[wy]->flags & (__ISDIRTY | __FORCEPAINT)) { - if (makech(win, wy) == ERR) - return (ERR); - else { - if (*win->lines[wy]->firstchp >= win->ch_off) - *win->lines[wy]->firstchp = win->maxx + - win->ch_off; - if (*win->lines[wy]->lastchp < win->maxx + - win->ch_off) - *win->lines[wy]->lastchp = win->ch_off; - if (*win->lines[wy]->lastchp < - *win->lines[wy]->firstchp) { -#ifdef DEBUG - __CTRACE("wrefresh: line %d notdirty \n", wy); -#endif - win->lines[wy]->flags &= ~__ISDIRTY; - } - } - - } -#ifdef DEBUG - __CTRACE("\t%d\t%d\n", *win->lines[wy]->firstchp, - *win->lines[wy]->lastchp); -#endif - } - -#ifdef DEBUG - __CTRACE("refresh: ly=%d, lx=%d\n", ly, lx); -#endif - - if (win == curscr) - domvcur(ly, lx, win->cury, win->curx); - else { - if (win->flags & __LEAVEOK) { - curscr->cury = ly; - curscr->curx = lx; - ly -= win->begy; - lx -= win->begx; - if (ly >= 0 && ly < win->maxy && lx >= 0 && - lx < win->maxx) { - win->cury = ly; - win->curx = lx; - } else - win->cury = win->curx = 0; - } else { - domvcur(ly, lx, win->cury + win->begy, - win->curx + win->begx); - curscr->cury = win->cury + win->begy; - curscr->curx = win->curx + win->begx; - } - } - retval = OK; - - (void)fflush(stdout); - return (retval); -} - -/* - * makech -- - * Make a change on the screen. - */ -static int -makech(win, wy) - register WINDOW *win; - int wy; -{ - static __LDATA blank = {' ', 0}; - __LDATA *nsp, *csp, *cp, *cep; - u_int force; - int clsp, nlsp; /* Last space in lines. */ - int lch, wx, y; - char *ce; - - /* Is the cursor still on the end of the last line? */ - if (wy > 0 && win->lines[wy - 1]->flags & __ISPASTEOL) { - domvcur(ly, lx, ly + 1, 0); - ly++; - lx = 0; - } - wx = *win->lines[wy]->firstchp - win->ch_off; - if (wx < 0) - wx = 0; - else if (wx >= win->maxx) - return (OK); - lch = *win->lines[wy]->lastchp - win->ch_off; - if (lch < 0) - return (OK); - else if (lch >= (int) win->maxx) - lch = win->maxx - 1; - y = wy + win->begy; - - if (curwin) - csp = ␣ - else - csp = &curscr->lines[wy + win->begy]->line[wx + win->begx]; - - nsp = &win->lines[wy]->line[wx]; - force = win->lines[wy]->flags & __FORCEPAINT; - win->lines[wy]->flags &= ~__FORCEPAINT; - if (CE && !curwin) { - for (cp = &win->lines[wy]->line[win->maxx - 1]; - cp->ch == ' ' && cp->attr == 0; cp--) - if (cp <= win->lines[wy]->line) - break; - nlsp = cp - win->lines[wy]->line; - } - if (!curwin) - ce = CE; - else - ce = NULL; - - if (force) { - if (CM) - tputs(tgoto(CM, lx, ly), 0, __cputchar); - else { - tputs(HO, 0, __cputchar); - __mvcur(0, 0, ly, lx, 1); - } - } - - while (wx <= lch) { - if (!force && memcmp(nsp, csp, sizeof(__LDATA)) == 0) { - if (wx <= lch) { - while (wx <= lch && - memcmp(nsp, csp, sizeof(__LDATA)) == 0) { - nsp++; - if (!curwin) - ++csp; - ++wx; - } - continue; - } - break; - } - domvcur(ly, lx, y, wx + win->begx); - -#ifdef DEBUG - __CTRACE("makech: 1: wx = %d, ly= %d, lx = %d, newy = %d, newx = %d, force =%d\n", - wx, ly, lx, y, wx + win->begx, force); -#endif - ly = y; - lx = wx + win->begx; - while ((force || memcmp(nsp, csp, sizeof(__LDATA)) != 0) - && wx <= lch) { - - if (ce != NULL && - win->maxx + win->begx == curscr->maxx && - wx >= nlsp && nsp->ch == ' ' && nsp->attr == 0) { - /* Check for clear to end-of-line. */ - cep = &curscr->lines[wy]->line[win->maxx - 1]; - while (cep->ch == ' ' && cep->attr == 0) - if (cep-- <= csp) - break; - clsp = cep - curscr->lines[wy]->line - - win->begx * __LDATASIZE; -#ifdef DEBUG - __CTRACE("makech: clsp = %d, nlsp = %d\n", clsp, nlsp); -#endif - if ((clsp - nlsp >= strlen(CE) - && clsp < win->maxx * __LDATASIZE) || - wy == win->maxy - 1) { - if (curscr->flags & __WSTANDOUT) { - tputs(SE, 0, __cputchar); - curscr->flags &= ~__WSTANDOUT; - } - tputs(CE, 0, __cputchar); - lx = wx + win->begx; - while (wx++ <= clsp) { - csp->ch = ' '; - csp->attr = 0; - csp++; - } - return (OK); - } - ce = NULL; - } - - /* - * Enter/exit standout mode as appropriate. - * XXX - * Should use UC if SO/SE not available. - */ - if (nsp->attr & __STANDOUT) { - if (!(curscr->flags & __WSTANDOUT) && - SO != NULL && SE != NULL) { - tputs(SO, 0, __cputchar); - curscr->flags |= __WSTANDOUT; - } - } else - if (curscr->flags & __WSTANDOUT && - SE != NULL) { - tputs(SE, 0, __cputchar); - curscr->flags &= ~__WSTANDOUT; - } - - wx++; - if (wx >= win->maxx && wy == win->maxy - 1 && !curwin) - if (win->flags & __SCROLLOK) { - if (curscr->flags & __WSTANDOUT - && win->flags & __ENDLINE) - if (!MS) { - tputs(SE, 0, - __cputchar); - curscr->flags &= - ~__WSTANDOUT; - } - if (!(win->flags & __SCROLLWIN)) { - if (!curwin) { - csp->attr = nsp->attr; - putchar(csp->ch = nsp->ch); - } else - putchar(nsp->ch); - } - if (wx + win->begx < curscr->maxx) { - domvcur(ly, wx + win->begx, - win->begy + win->maxy - 1, - win->begx + win->maxx - 1); - } - ly = win->begy + win->maxy - 1; - lx = win->begx + win->maxx - 1; - return (OK); - } - if (wx < win->maxx || wy < win->maxy - 1 || - !(win->flags & __SCROLLWIN)) { - if (!curwin) { - csp->attr = nsp->attr; - putchar(csp->ch = nsp->ch); - csp++; - } else - putchar(nsp->ch); - } -#ifdef DEBUG - __CTRACE("makech: putchar(%c)\n", nsp->ch & 0177); -#endif - if (UC && (nsp->attr & __STANDOUT)) { - putchar('\b'); - tputs(UC, 0, __cputchar); - } - nsp++; -#ifdef DEBUG - __CTRACE("makech: 2: wx = %d, lx = %d\n", wx, lx); -#endif - } - if (lx == wx + win->begx) /* If no change. */ - break; - lx = wx + win->begx; - if (lx >= COLS && AM) - lx = COLS - 1; - else if (wx >= win->maxx) { - domvcur(ly, lx, ly, win->maxx + win->begx - 1); - lx = win->maxx + win->begx - 1; - } - -#ifdef DEBUG - __CTRACE("makech: 3: wx = %d, lx = %d\n", wx, lx); -#endif - } - - /* Don't leave the screen in standout mode. */ - if (curscr->flags & __WSTANDOUT) { - tputs(SE, 0, __cputchar); - curscr->flags &= ~__WSTANDOUT; - } - return (OK); -} - -/* - * domvcur -- - * Do a mvcur, leaving standout mode if necessary. - */ -static void -domvcur(oy, ox, ny, nx) - int oy, ox, ny, nx; -{ - if (curscr->flags & __WSTANDOUT && !MS) { - tputs(SE, 0, __cputchar); - curscr->flags &= ~__WSTANDOUT; - } - - __mvcur(oy, ox, ny, nx, 1); -} - -/* - * Quickch() attempts to detect a pattern in the change of the window - * in order to optimize the change, e.g., scroll n lines as opposed to - * repainting the screen line by line. - */ - -static void -quickch(win) - WINDOW *win; -{ -#define THRESH (int) win->maxy / 4 - - register __LINE *clp, *tmp1, *tmp2; - register int bsize, curs, curw, starts, startw, i, j; - int n, target, cur_period, bot, top, sc_region; - __LDATA buf[1024]; - u_int blank_hash; - - /* - * Find how many lines from the top of the screen are unchanged. - */ - for (top = 0; top < win->maxy; top++) - if (win->lines[top]->flags & __FORCEPAINT || - win->lines[top]->hash != curscr->lines[top]->hash - || memcmp(win->lines[top]->line, - curscr->lines[top]->line, - win->maxx * __LDATASIZE) != 0) - break; - else - win->lines[top]->flags &= ~__ISDIRTY; - /* - * Find how many lines from bottom of screen are unchanged. - */ - for (bot = win->maxy - 1; bot >= 0; bot--) - if (win->lines[bot]->flags & __FORCEPAINT || - win->lines[bot]->hash != curscr->lines[bot]->hash - || memcmp(win->lines[bot]->line, - curscr->lines[bot]->line, - win->maxx * __LDATASIZE) != 0) - break; - else - win->lines[bot]->flags &= ~__ISDIRTY; - -#ifdef NO_JERKINESS - /* - * If we have a bottom unchanged region return. Scrolling the - * bottom region up and then back down causes a screen jitter. - * This will increase the number of characters sent to the screen - * but it looks better. - */ - if (bot < win->maxy - 1) - return; -#endif /* NO_JERKINESS */ - - /* - * Search for the largest block of text not changed. - * Invariants of the loop: - * - Startw is the index of the beginning of the examined block in win. - * - Starts is the index of the beginning of the examined block in - * curscr. - * - Curs is the index of one past the end of the exmined block in win. - * - Curw is the index of one past the end of the exmined block in - * curscr. - * - bsize is the current size of the examined block. - */ - for (bsize = bot - top; bsize >= THRESH; bsize--) { - for (startw = top; startw <= bot - bsize; startw++) - for (starts = top; starts <= bot - bsize; - starts++) { - for (curw = startw, curs = starts; - curs < starts + bsize; curw++, curs++) - if (win->lines[curw]->flags & - __FORCEPAINT || - (win->lines[curw]->hash != - curscr->lines[curs]->hash || - memcmp(win->lines[curw]->line, - curscr->lines[curs]->line, - win->maxx * __LDATASIZE) != 0)) - break; - if (curs == starts + bsize) - goto done; - } - } - done: - /* Did not find anything */ - if (bsize < THRESH) - return; - -#ifdef DEBUG - __CTRACE("quickch:bsize=%d,starts=%d,startw=%d,curw=%d,curs=%d,top=%d,bot=%d\n", - bsize, starts, startw, curw, curs, top, bot); -#endif - - /* - * Make sure that there is no overlap between the bottom and top - * regions and the middle scrolled block. - */ - if (bot < curs) - bot = curs - 1; - if (top > starts) - top = starts; - - n = startw - starts; - -#ifdef DEBUG - __CTRACE("#####################################\n"); - for (i = 0; i < curscr->maxy; i++) { - __CTRACE("C: %d:", i); - __CTRACE(" 0x%x \n", curscr->lines[i]->hash); - for (j = 0; j < curscr->maxx; j++) - __CTRACE("%c", - curscr->lines[i]->line[j].ch); - __CTRACE("\n"); - for (j = 0; j < curscr->maxx; j++) - __CTRACE("%x", - curscr->lines[i]->line[j].attr); - __CTRACE("\n"); - __CTRACE("W: %d:", i); - __CTRACE(" 0x%x \n", win->lines[i]->hash); - __CTRACE(" 0x%x ", win->lines[i]->flags); - for (j = 0; j < win->maxx; j++) - __CTRACE("%c", - win->lines[i]->line[j].ch); - __CTRACE("\n"); - for (j = 0; j < win->maxx; j++) - __CTRACE("%x", - win->lines[i]->line[j].attr); - __CTRACE("\n"); - } -#endif - - /* So we don't have to call __hash() each time */ - for (i = 0; i < win->maxx; i++) { - buf[i].ch = ' '; - buf[i].attr = 0; - } - blank_hash = __hash((char *) buf, win->maxx * __LDATASIZE); - - /* - * Perform the rotation to maintain the consistency of curscr. - * This is hairy since we are doing an *in place* rotation. - * Invariants of the loop: - * - I is the index of the current line. - * - Target is the index of the target of line i. - * - Tmp1 points to current line (i). - * - Tmp2 and points to target line (target); - * - Cur_period is the index of the end of the current period. - * (see below). - * - * There are 2 major issues here that make this rotation non-trivial: - * 1. Scrolling in a scrolling region bounded by the top - * and bottom regions determined (whose size is sc_region). - * 2. As a result of the use of the mod function, there may be a - * period introduced, i.e., 2 maps to 4, 4 to 6, n-2 to 0, and - * 0 to 2, which then causes all odd lines not to be rotated. - * To remedy this, an index of the end ( = beginning) of the - * current 'period' is kept, cur_period, and when it is reached, - * the next period is started from cur_period + 1 which is - * guaranteed not to have been reached since that would mean that - * all records would have been reached. (think about it...). - * - * Lines in the rotation can have 3 attributes which are marked on the - * line so that curscr is consistent with the visual screen. - * 1. Not dirty -- lines inside the scrolled block, top region or - * bottom region. - * 2. Blank lines -- lines in the differential of the scrolling - * region adjacent to top and bot regions - * depending on scrolling direction. - * 3. Dirty line -- all other lines are marked dirty. - */ - sc_region = bot - top + 1; - i = top; - tmp1 = curscr->lines[top]; - cur_period = top; - for (j = top; j <= bot; j++) { - target = (i - top + n + sc_region) % sc_region + top; - tmp2 = curscr->lines[target]; - curscr->lines[target] = tmp1; - /* Mark block as clean and blank out scrolled lines. */ - clp = curscr->lines[target]; -#ifdef DEBUG - __CTRACE("quickch: n=%d startw=%d curw=%d i = %d target=%d ", - n, startw, curw, i, target); -#endif - if ((target >= startw && target < curw) || target < top - || target > bot) { -#ifdef DEBUG - __CTRACE("-- notdirty"); -#endif - win->lines[target]->flags &= ~__ISDIRTY; - } else if ((n > 0 && target >= top && target < top + n) || - (n < 0 && target <= bot && target > bot + n)) { - if (clp->hash != blank_hash || memcmp(clp->line, - buf, win->maxx * __LDATASIZE) !=0) { - (void)memcpy(clp->line, buf, - win->maxx * __LDATASIZE); -#ifdef DEBUG - __CTRACE("-- blanked out: dirty"); -#endif - clp->hash = blank_hash; - __touchline(win, target, 0, win->maxx - 1, 0); - } else { - __touchline(win, target, 0, win->maxx - 1, 0); -#ifdef DEBUG - __CTRACE(" -- blank line already: dirty"); -#endif - } - } else { -#ifdef DEBUG - __CTRACE(" -- dirty"); -#endif - __touchline(win, target, 0, win->maxx - 1, 0); - } -#ifdef DEBUG - __CTRACE("\n"); -#endif - if (target == cur_period) { - i = target + 1; - tmp1 = curscr->lines[i]; - cur_period = i; - } else { - tmp1 = tmp2; - i = target; - } - } -#ifdef DEBUG - __CTRACE("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); - for (i = 0; i < curscr->maxy; i++) { - __CTRACE("C: %d:", i); - for (j = 0; j < curscr->maxx; j++) - __CTRACE("%c", - curscr->lines[i]->line[j].ch); - __CTRACE("\n"); - __CTRACE("W: %d:", i); - for (j = 0; j < win->maxx; j++) - __CTRACE("%c", win->lines[i]->line[j].ch); - __CTRACE("\n"); - } -#endif - if (n != 0) { - WINDOW *wp; - scrolln(win, starts, startw, curs, bot, top); - /* - * Need to repoint any subwindow lines to the rotated - * line structured. - */ - for (wp = win->nextp; wp != win; wp = wp->nextp) - __set_subwin(win, wp); - } -} - -/* - * scrolln -- - * Scroll n lines, where n is starts - startw. - */ -static void -scrolln(win, starts, startw, curs, bot, top) - WINDOW *win; - int starts, startw, curs, bot, top; -{ - int i, oy, ox, n; - - oy = curscr->cury; - ox = curscr->curx; - n = starts - startw; - - /* - * XXX - * The initial tests that set __noqch don't let us reach here unless - * we have either CS + HO + SF/sf/SR/sr, or AL + DL. SF/sf and SR/sr - * scrolling can only shift the entire scrolling region, not just a - * part of it, which means that the quickch() routine is going to be - * sadly disappointed in us if we don't have CS as well. - * - * If CS, HO and SF/sf are set, can use the scrolling region. Because - * the cursor position after CS is undefined, we need HO which gives us - * the ability to move to somewhere without knowledge of the current - * location of the cursor. Still call __mvcur() anyway, to update its - * idea of where the cursor is. - * - * When the scrolling region has been set, the cursor has to be at the - * last line of the region to make the scroll happen. - * - * Doing SF/SR or AL/DL appears faster on the screen than either sf/sr - * or al/dl, and, some terminals have AL/DL, sf/sr, and CS, but not - * SF/SR. So, if we're scrolling almost all of the screen, try and use - * AL/DL, otherwise use the scrolling region. The "almost all" is a - * shameless hack for vi. - */ - if (n > 0) { - if (CS != NULL && HO != NULL && (SF != NULL || - (AL == NULL || DL == NULL || - top > 3 || bot + 3 < win->maxy) && sf != NULL)) { - tputs(__tscroll(CS, top, bot + 1), 0, __cputchar); - __mvcur(oy, ox, 0, 0, 1); - tputs(HO, 0, __cputchar); - __mvcur(0, 0, bot, 0, 1); - if (SF != NULL) - tputs(__tscroll(SF, n, 0), 0, __cputchar); - else - for (i = 0; i < n; i++) - tputs(sf, 0, __cputchar); - tputs(__tscroll(CS, 0, win->maxy), 0, __cputchar); - __mvcur(bot, 0, 0, 0, 1); - tputs(HO, 0, __cputchar); - __mvcur(0, 0, oy, ox, 1); - return; - } - - /* Scroll up the block. */ - if (SF != NULL && top == 0) { - __mvcur(oy, ox, bot, 0, 1); - tputs(__tscroll(SF, n, 0), 0, __cputchar); - } else if (DL != NULL) { - __mvcur(oy, ox, top, 0, 1); - tputs(__tscroll(DL, n, 0), 0, __cputchar); - } else if (dl != NULL) { - __mvcur(oy, ox, top, 0, 1); - for (i = 0; i < n; i++) - tputs(dl, 0, __cputchar); - } else if (sf != NULL && top == 0) { - __mvcur(oy, ox, bot, 0, 1); - for (i = 0; i < n; i++) - tputs(sf, 0, __cputchar); - } else - abort(); - - /* Push down the bottom region. */ - __mvcur(top, 0, bot - n + 1, 0, 1); - if (AL != NULL) - tputs(__tscroll(AL, n, 0), 0, __cputchar); - else if (al != NULL) - for (i = 0; i < n; i++) - tputs(al, 0, __cputchar); - else - abort(); - __mvcur(bot - n + 1, 0, oy, ox, 1); - } else { - /* - * !!! - * n < 0 - * - * If CS, HO and SR/sr are set, can use the scrolling region. - * See the above comments for details. - */ - if (CS != NULL && HO != NULL && (SR != NULL || - (AL == NULL || DL == NULL || - top > 3 || bot + 3 < win->maxy) && sr != NULL)) { - tputs(__tscroll(CS, top, bot + 1), 0, __cputchar); - __mvcur(oy, ox, 0, 0, 1); - tputs(HO, 0, __cputchar); - __mvcur(0, 0, top, 0, 1); - - if (SR != NULL) - tputs(__tscroll(SR, -n, 0), 0, __cputchar); - else - for (i = n; i < 0; i++) - tputs(sr, 0, __cputchar); - tputs(__tscroll(CS, 0, win->maxy), 0, __cputchar); - __mvcur(top, 0, 0, 0, 1); - tputs(HO, 0, __cputchar); - __mvcur(0, 0, oy, ox, 1); - return; - } - - /* Preserve the bottom lines. */ - __mvcur(oy, ox, bot + n + 1, 0, 1); - if (SR != NULL && bot == win->maxy) - tputs(__tscroll(SR, -n, 0), 0, __cputchar); - else if (DL != NULL) - tputs(__tscroll(DL, -n, 0), 0, __cputchar); - else if (dl != NULL) - for (i = n; i < 0; i++) - tputs(dl, 0, __cputchar); - else if (sr != NULL && bot == win->maxy) - for (i = n; i < 0; i++) - tputs(sr, 0, __cputchar); - else - abort(); - - /* Scroll the block down. */ - __mvcur(bot + n + 1, 0, top, 0, 1); - if (AL != NULL) - tputs(__tscroll(AL, -n, 0), 0, __cputchar); - else if (al != NULL) - for (i = n; i < 0; i++) - tputs(al, 0, __cputchar); - else - abort(); - __mvcur(top, 0, oy, ox, 1); - } -} diff --git a/lib/libcurses/scanw.c b/lib/libcurses/scanw.c deleted file mode 100644 index d8d79fd2355..00000000000 --- a/lib/libcurses/scanw.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)scanw.c 8.3 (Berkeley) 5/4/94"; -#endif /* not lint */ - -/* - * scanw and friends. - */ - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#include "curses.h" - -/* - * scanw -- - * Implement a scanf on the standard screen. - */ -int -#ifdef __STDC__ -scanw(const char *fmt, ...) -#else -scanw(fmt, va_alist) - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - ret = vwscanw(stdscr, fmt, ap); - va_end(ap); - return (ret); -} - -/* - * wscanw -- - * Implements a scanf on the given window. - */ -int -#ifdef __STDC__ -wscanw(WINDOW *win, const char *fmt, ...) -#else -wscanw(win, fmt, va_alist) - WINDOW *win; - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - ret = vwscanw(win, fmt, ap); - va_end(ap); - return (ret); -} - -/* - * mvscanw, mvwscanw -- - * Implement the mvscanw commands. Due to the variable number of - * arguments, they cannot be macros. Another sigh.... - */ -int -#ifdef __STDC__ -mvscanw(register int y, register int x, const char *fmt,...) -#else -mvscanw(y, x, fmt, va_alist) - register int y, x; - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - - if (move(y, x) != OK) - return (ERR); -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - ret = vwscanw(stdscr, fmt, ap); - va_end(ap); - return (ret); -} - -int -#ifdef __STDC__ -mvwscanw(register WINDOW * win, register int y, register int x, - const char *fmt, ...) -#else -mvwscanw(win, y, x, fmt, va_alist) - register WINDOW *win; - register int y, x; - char *fmt; - va_dcl -#endif -{ - va_list ap; - int ret; - - if (move(y, x) != OK) - return (ERR); -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - ret = vwscanw(win, fmt, ap); - va_end(ap); - return (ret); -} - -/* - * vwscanw -- - * This routine actually executes the scanf from the window. - */ -int -vwscanw(win, fmt, ap) - WINDOW *win; - const char *fmt; - va_list ap; -{ - - char buf[1024]; - - return (wgetstr(win, buf) == OK ? - vsscanf(buf, fmt, ap) : ERR); -} diff --git a/lib/libcurses/scroll.c b/lib/libcurses/scroll.c deleted file mode 100644 index 8aad91c0285..00000000000 --- a/lib/libcurses/scroll.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)scroll.c 8.3 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * scroll -- - * Scroll the window up a line. - */ -int -scroll(win) - register WINDOW *win; -{ - register int oy, ox; - -#ifdef DEBUG - __CTRACE("scroll: (%0.2o)\n", win); -#endif - - if (!(win->flags & __SCROLLOK)) - return (ERR); - - getyx(win, oy, ox); - wmove(win, 0, 0); - wdeleteln(win); - wmove(win, oy, ox); - - if (win == curscr) { - putchar('\n'); - if (!NONL) - win->curx = 0; -#ifdef DEBUG - __CTRACE("scroll: win == curscr\n"); -#endif - } - return (OK); -} diff --git a/lib/libcurses/setterm.c b/lib/libcurses/setterm.c deleted file mode 100644 index 1d134903c11..00000000000 --- a/lib/libcurses/setterm.c +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)setterm.c 8.7 (Berkeley) 7/27/94"; -#endif /* not lint */ - -#include <sys/ioctl.h> /* TIOCGWINSZ on old systems. */ - -#include <stdlib.h> -#include <string.h> -#include <termios.h> -#include <unistd.h> - -#include "curses.h" - -static void zap __P((void)); - -static char *sflags[] = { - /* am bs da eo hc in mi ms */ - &AM, &BS, &DA, &EO, &HC, &IN, &MI, &MS, - /* nc ns os ul xb xn xt xs xx */ - &NC, &NS, &OS, &UL, &XB, &XN, &XT, &XS, &XX - }; - -static char *_PC, - **sstrs[] = { - /* AL bc bt cd ce cl cm cr cs */ - &AL, &BC, &BT, &CD, &CE, &CL, &CM, &CR, &CS, - /* dc DL dm do ed ei k0 k1 k2 */ - &DC, &DL, &DM, &DO, &ED, &EI, &K0, &K1, &K2, - /* k3 k4 k5 k6 k7 k8 k9 ho ic */ - &K3, &K4, &K5, &K6, &K7, &K8, &K9, &HO, &IC, - /* im ip kd ke kh kl kr ks ku */ - &IM, &IP, &KD, &KE, &KH, &KL, &KR, &KS, &KU, - /* ll ma nd nl pc rc sc se SF */ - &LL, &MA, &ND, &NL, &_PC, &RC, &SC, &SE, &SF, - /* so SR ta te ti uc ue up us */ - &SO, &SR, &TA, &TE, &TI, &UC, &UE, &UP, &US, - /* vb vs ve al dl sf sr AL */ - &VB, &VS, &VE, &al, &dl, &sf, &sr, &AL_PARM, - /* DL UP DO LE */ - &DL_PARM, &UP_PARM, &DOWN_PARM, &LEFT_PARM, - /* RI */ - &RIGHT_PARM, - }; - -static char *aoftspace; /* Address of _tspace for relocation */ -static char tspace[2048]; /* Space for capability strings */ - -char *ttytype; - -int -setterm(type) - register char *type; -{ - static char genbuf[1024]; - static char __ttytype[1024]; - register int unknown; - struct winsize win; - char *p; - -#ifdef DEBUG - __CTRACE("setterm: (\"%s\")\nLINES = %d, COLS = %d\n", - type, LINES, COLS); -#endif - if (type[0] == '\0') - type = "xx"; - unknown = 0; - if (tgetent(genbuf, type) != 1) { - unknown++; - strcpy(genbuf, "xx|dumb:"); - } -#ifdef DEBUG - __CTRACE("setterm: tty = %s\n", type); -#endif - - /* Try TIOCGWINSZ, and, if it fails, the termcap entry. */ - if (ioctl(STDERR_FILENO, TIOCGWINSZ, &win) != -1 && - win.ws_row != 0 && win.ws_col != 0) { - LINES = win.ws_row; - COLS = win.ws_col; - } else { - LINES = tgetnum("li"); - COLS = tgetnum("co"); - } - - /* POSIX 1003.2 requires that the environment override. */ - if ((p = getenv("LINES")) != NULL) - LINES = strtol(p, NULL, 10); - if ((p = getenv("COLUMNS")) != NULL) - COLS = strtol(p, NULL, 10); - - /* - * Want cols > 4, otherwise things will fail. - */ - if (COLS <= 4) - return (ERR); - -#ifdef DEBUG - __CTRACE("setterm: LINES = %d, COLS = %d\n", LINES, COLS); -#endif - aoftspace = tspace; - zap(); /* Get terminal description. */ - - /* If we can't tab, we can't backtab, either. */ - if (!GT) - BT = NULL; - - /* - * Test for cursor motion capbility. - * - * XXX - * This is truly stupid -- tgoto returns "OOPS" if it can't - * do cursor motions. - */ - if (tgoto(CM, 0, 0)[0] == 'O') { - CA = 0; - CM = 0; - } else - CA = 1; - - PC = _PC ? _PC[0] : 0; - aoftspace = tspace; - ttytype = longname(genbuf, __ttytype); - - /* If no scrolling commands, no quick change. */ - __noqch = - (CS == NULL || HO == NULL || - SF == NULL && sf == NULL || SR == NULL && sr == NULL) && - (AL == NULL && al == NULL || DL == NULL && dl == NULL); - - return (unknown ? ERR : OK); -} - -/* - * zap -- - * Gets all the terminal flags from the termcap database. - */ -static void -zap() -{ - register char *namp, ***sp; - register char **fp; - char tmp[3]; -#ifdef DEBUG - register char *cp; -#endif - tmp[2] = '\0'; - - namp = "ambsdaeohcinmimsncnsosulxbxnxtxsxx"; - fp = sflags; - do { - *tmp = *namp; - *(tmp + 1) = *(namp + 1); - *(*fp++) = tgetflag(tmp); -#ifdef DEBUG - __CTRACE("2.2s = %s\n", namp, *fp[-1] ? "TRUE" : "FALSE"); -#endif - namp += 2; - - } while (*namp); - namp = "ALbcbtcdceclcmcrcsdcDLdmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullmandnlpcrcscseSFsoSRtatetiucueupusvbvsvealdlsfsrALDLUPDOLERI"; - sp = sstrs; - do { - *tmp = *namp; - *(tmp + 1) = *(namp + 1); - *(*sp++) = tgetstr(tmp, &aoftspace); -#ifdef DEBUG - __CTRACE("2.2s = %s", namp, *sp[-1] == NULL ? "NULL\n" : "\""); - if (*sp[-1] != NULL) { - for (cp = *sp[-1]; *cp; cp++) - __CTRACE("%s", unctrl(*cp)); - __CTRACE("\"\n"); - } -#endif - namp += 2; - } while (*namp); - if (XS) - SO = SE = NULL; - else { - if (tgetnum("sg") > 0) - SO = NULL; - if (tgetnum("ug") > 0) - US = NULL; - if (!SO && US) { - SO = US; - SE = UE; - } - } -} - -/* - * getcap -- - * Return a capability from termcap. - */ -char * -getcap(name) - char *name; -{ - return (tgetstr(name, &aoftspace)); -} diff --git a/lib/libcurses/shlib_version b/lib/libcurses/shlib_version deleted file mode 100644 index c6e3f4d3fc0..00000000000 --- a/lib/libcurses/shlib_version +++ /dev/null @@ -1,2 +0,0 @@ -major=2 -minor=1 diff --git a/lib/libcurses/standout.c b/lib/libcurses/standout.c deleted file mode 100644 index 8851d63d446..00000000000 --- a/lib/libcurses/standout.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)standout.c 8.3 (Berkeley) 8/10/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * wstandout - * Enter standout mode. - */ -int -wstandout(win) - WINDOW *win; -{ - /* - * If standout/standend strings, or can underline, set the - * screen standout bit. - */ - if (SO != NULL && SE != NULL || UC != NULL) - win->flags |= __WSTANDOUT; - return (1); -} - -/* - * wstandend -- - * Exit standout mode. - */ -int -wstandend(win) - WINDOW *win; -{ - win->flags &= ~__WSTANDOUT; - return (1); -} diff --git a/lib/libcurses/toucholap.c b/lib/libcurses/toucholap.c deleted file mode 100644 index 955c204147f..00000000000 --- a/lib/libcurses/toucholap.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)toucholap.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * touchoverlap -- - * Touch, on win2, the part that overlaps with win1. - */ -int -touchoverlap(win1, win2) - register WINDOW *win1, *win2; -{ - register int y, endy, endx, starty, startx; - -#ifdef DEBUG - __CTRACE("touchoverlap: (%0.2o, %0.2o);\n", win1, win2); -#endif - starty = max(win1->begy, win2->begy); - startx = max(win1->begx, win2->begx); - endy = min(win1->maxy + win1->begy, win2->maxy + win2->begx); - endx = min(win1->maxx + win1->begx, win2->maxx + win2->begx); -#ifdef DEBUG - __CTRACE("touchoverlap: from (%d,%d) to (%d,%d)\n", - starty, startx, endy, endx); - __CTRACE("touchoverlap: win1 (%d,%d) to (%d,%d)\n", - win1->begy, win1->begx, win1->begy + win1->maxy, - win1->begx + win1->maxx); - __CTRACE("touchoverlap: win2 (%d,%d) to (%d,%d)\n", - win2->begy, win2->begx, win2->begy + win2->maxy, - win2->begx + win2->maxx); -#endif - if (starty >= endy || startx >= endx) - return (OK); - starty -= win2->begy; - startx -= win2->begx; - endy -= win2->begy; - endx -= win2->begx; - for (--endx, y = starty; y < endy; y++) - __touchline(win2, y, startx, endx, 0); - return (OK); -} - diff --git a/lib/libcurses/touchwin.c b/lib/libcurses/touchwin.c deleted file mode 100644 index 36f487e5b8f..00000000000 --- a/lib/libcurses/touchwin.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)touchwin.c 8.2 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include "curses.h" - -/* - * touchline -- - * Touch a given line. - */ -int -touchline(win, y, sx, ex) - WINDOW *win; - register int y, sx, ex; -{ - return (__touchline(win, y, sx, ex, 1)); -} - - -/* - * touchwin -- - * Make it look like the whole window has been changed. - */ -int -touchwin(win) - register WINDOW *win; -{ - register int y, maxy; - -#ifdef DEBUG - __CTRACE("touchwin: (%0.2o)\n", win); -#endif - maxy = win->maxy; - for (y = 0; y < maxy; y++) - __touchline(win, y, 0, win->maxx - 1, 1); - return (OK); -} - - -int -__touchwin(win) - register WINDOW *win; -{ - register int y, maxy; - -#ifdef DEBUG - __CTRACE("touchwin: (%0.2o)\n", win); -#endif - maxy = win->maxy; - for (y = 0; y < maxy; y++) - __touchline(win, y, 0, win->maxx - 1, 0); - return (OK); -} - -int -__touchline(win, y, sx, ex, force) - register WINDOW *win; - register int y, sx, ex; - int force; -{ -#ifdef DEBUG - __CTRACE("touchline: (%0.2o, %d, %d, %d, %d)\n", win, y, sx, ex, force); - __CTRACE("touchline: first = %d, last = %d\n", - *win->lines[y]->firstchp, *win->lines[y]->lastchp); -#endif - if (force) - win->lines[y]->flags |= __FORCEPAINT; - sx += win->ch_off; - ex += win->ch_off; - if (!(win->lines[y]->flags & __ISDIRTY)) { - win->lines[y]->flags |= __ISDIRTY; - *win->lines[y]->firstchp = sx; - *win->lines[y]->lastchp = ex; - } else { - if (*win->lines[y]->firstchp > sx) - *win->lines[y]->firstchp = sx; - if (*win->lines[y]->lastchp < ex) - *win->lines[y]->lastchp = ex; - } -#ifdef DEBUG - __CTRACE("touchline: first = %d, last = %d\n", - *win->lines[y]->firstchp, *win->lines[y]->lastchp); -#endif - return (OK); -} - - diff --git a/lib/libcurses/tscroll.c b/lib/libcurses/tscroll.c deleted file mode 100644 index 359b3969c63..00000000000 --- a/lib/libcurses/tscroll.c +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)tscroll.c 8.4 (Berkeley) 7/27/94"; -#endif /* not lint */ - -#include "curses.h" - -#define MAXRETURNSIZE 64 - -/* - * Routine to perform scrolling. Derived from tgoto.c in tercamp(3) - * library. Cap is a string containing printf type escapes to allow - * scrolling. The following escapes are defined for substituting n: - * - * %d as in printf - * %2 like %2d - * %3 like %3d - * %. gives %c hacking special case characters - * %+x like %c but adding x first - * - * The codes below affect the state but don't use up a value. - * - * %>xy if value > x add y - * %i increments n - * %% gives % - * %B BCD (2 decimal digits encoded in one byte) - * %D Delta Data (backwards bcd) - * - * all other characters are ``self-inserting''. - */ -char * -__tscroll(cap, n1, n2) - const char *cap; - int n1, n2; -{ - static char result[MAXRETURNSIZE]; - int c, n; - char *dp; - - if (cap == NULL) - goto err; - for (n = n1, dp = result; (c = *cap++) != '\0';) { - if (c != '%') { - *dp++ = c; - continue; - } - switch (c = *cap++) { - case 'n': - n ^= 0140; - continue; - case 'd': - if (n < 10) - goto one; - if (n < 100) - goto two; - /* FALLTHROUGH */ - case '3': - *dp++ = (n / 100) | '0'; - n %= 100; - /* FALLTHROUGH */ - case '2': -two: *dp++ = n / 10 | '0'; -one: *dp++ = n % 10 | '0'; - n = n2; - continue; - case '>': - if (n > *cap++) - n += *cap++; - else - cap++; - continue; - case '+': - n += *cap++; - /* FALLTHROUGH */ - case '.': - *dp++ = n; - continue; - case 'i': - n++; - continue; - case '%': - *dp++ = c; - continue; - case 'B': - n = (n / 10 << 4) + n % 10; - continue; - case 'D': - n = n - 2 * (n % 16); - continue; - /* - * XXX - * System V terminfo files have lots of extra gunk. - * The only one we've seen in scrolling strings is - * %pN, and it seems to work okay if we ignore it. - */ - case 'p': - ++cap; - continue; - default: - goto err; - } - } - *dp = '\0'; - return (result); - -err: return("curses: __tscroll failed"); -} diff --git a/lib/libcurses/tstp.c b/lib/libcurses/tstp.c deleted file mode 100644 index 07debf42fe1..00000000000 --- a/lib/libcurses/tstp.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 1981, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)tstp.c 8.3 (Berkeley) 5/4/94"; -#endif /* not lint */ - -#include <errno.h> -#include <signal.h> -#include <termios.h> -#include <unistd.h> - -#include "curses.h" - -/* - * stop_signal_handler -- - * Handle stop signals. - */ -void -__stop_signal_handler(signo) - int signo; -{ - struct termios save; - sigset_t oset, set; - - /* Get the current terminal state (which the user may have changed). */ - if (tcgetattr(STDIN_FILENO, &save)) - return; - - /* - * Block window change and timer signals. The latter is because - * applications use timers to decide when to repaint the screen. - */ - (void)sigemptyset(&set); - (void)sigaddset(&set, SIGALRM); - (void)sigaddset(&set, SIGWINCH); - (void)sigprocmask(SIG_BLOCK, &set, &oset); - - /* - * End the window, which also resets the terminal state to the - * original modes. - */ - endwin(); - - /* Unblock SIGTSTP. */ - (void)sigemptyset(&set); - (void)sigaddset(&set, SIGTSTP); - (void)sigprocmask(SIG_UNBLOCK, &set, NULL); - - /* Stop ourselves. */ - __restore_stophandler(); - (void)kill(0, SIGTSTP); - - /* Time passes ... */ - - /* Reset the curses SIGTSTP signal handler. */ - __set_stophandler(); - - /* save the new "default" terminal state */ - (void)tcgetattr(STDIN_FILENO, &__orig_termios); - - /* Reset the terminal state to the mode just before we stopped. */ - (void)tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, &save); - - /* Restart the screen. */ - __startwin(); - - /* Repaint the screen. */ - wrefresh(curscr); - - /* Reset the signals. */ - (void)sigprocmask(SIG_SETMASK, &oset, NULL); -} - -static void (*otstpfn)() = SIG_DFL; - -/* - * Set the TSTP handler. - */ -void -__set_stophandler() -{ - otstpfn = signal(SIGTSTP, __stop_signal_handler); -} - -/* - * Restore the TSTP handler. - */ -void -__restore_stophandler() -{ - (void)signal(SIGTSTP, otstpfn); -} diff --git a/lib/libcurses/tty.c b/lib/libcurses/tty.c deleted file mode 100644 index d04586d853f..00000000000 --- a/lib/libcurses/tty.c +++ /dev/null @@ -1,281 +0,0 @@ -/*- - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)tty.c 8.5 (Berkeley) 8/13/94"; -#endif /* not lint */ - -#include <stdlib.h> -#include <termios.h> -#include <unistd.h> - -#include "curses.h" - -/* - * In general, curses should leave tty hardware settings alone (speed, parity, - * word size). This is most easily done in BSD by using TCSASOFT on all - * tcsetattr calls. On other systems, it would be better to get and restore - * those attributes at each change, or at least when stopped and restarted. - * See also the comments in getterm(). - */ -#ifdef TCSASOFT -int __tcaction = 1; /* Ignore hardware settings. */ -#else -int __tcaction = 0; -#endif - -struct termios __orig_termios, __baset; -static struct termios cbreakt, rawt, *curt; -static int useraw; - -#ifndef OXTABS -#ifdef XTABS /* SMI uses XTABS. */ -#define OXTABS XTABS -#else -#define OXTABS 0 -#endif -#endif - -/* - * gettmode -- - * Do terminal type initialization. - */ -int -gettmode() -{ - useraw = 0; - - if (tcgetattr(STDIN_FILENO, &__orig_termios)) - return (ERR); - - __baset = __orig_termios; - __baset.c_oflag &= ~OXTABS; - - GT = 0; /* historical. was used before we wired OXTABS off */ - NONL = (__baset.c_oflag & ONLCR) == 0; - - /* - * XXX - * System V and SMI systems overload VMIN and VTIME, such that - * VMIN is the same as the VEOF element, and VTIME is the same - * as the VEOL element. This means that, if VEOF was ^D, the - * default VMIN is 4. Majorly stupid. - */ - cbreakt = __baset; - cbreakt.c_lflag &= ~ICANON; - cbreakt.c_cc[VMIN] = 1; - cbreakt.c_cc[VTIME] = 0; - - rawt = cbreakt; - rawt.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|INLCR|IGNCR|ICRNL|IXON); - rawt.c_oflag &= ~OPOST; - rawt.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - - /* - * In general, curses should leave hardware-related settings alone. - * This includes parity and word size. Older versions set the tty - * to 8 bits, no parity in raw(), but this is considered to be an - * artifact of the old tty interface. If it's desired to change - * parity and word size, the TCSASOFT bit has to be removed from the - * calls that switch to/from "raw" mode. - */ - if (!__tcaction) { - rawt.c_iflag &= ~ISTRIP; - rawt.c_cflag &= ~(CSIZE|PARENB); - rawt.c_cflag |= CS8; - } - - curt = &__baset; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -raw() -{ - useraw = __pfast = __rawmode = 1; - curt = &rawt; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -noraw() -{ - useraw = __pfast = __rawmode = 0; - curt = &__baset; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -cbreak() -{ - - __rawmode = 1; - curt = useraw ? &rawt : &cbreakt; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -nocbreak() -{ - - __rawmode = 0; - curt = useraw ? &rawt : &__baset; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -echo() -{ - rawt.c_lflag |= ECHO; - cbreakt.c_lflag |= ECHO; - __baset.c_lflag |= ECHO; - - __echoit = 1; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -noecho() -{ - rawt.c_lflag &= ~ECHO; - cbreakt.c_lflag &= ~ECHO; - __baset.c_lflag &= ~ECHO; - - __echoit = 0; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -nl() -{ - rawt.c_iflag |= ICRNL; - rawt.c_oflag |= ONLCR; - cbreakt.c_iflag |= ICRNL; - cbreakt.c_oflag |= ONLCR; - __baset.c_iflag |= ICRNL; - __baset.c_oflag |= ONLCR; - - __pfast = __rawmode; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -int -nonl() -{ - rawt.c_iflag &= ~ICRNL; - rawt.c_oflag &= ~ONLCR; - cbreakt.c_iflag &= ~ICRNL; - cbreakt.c_oflag &= ~ONLCR; - __baset.c_iflag &= ~ICRNL; - __baset.c_oflag &= ~ONLCR; - - __pfast = 1; - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); -} - -void -__startwin() -{ - static char *stdbuf; - static size_t len; - - (void)fflush(stdout); - - /* - * Some C libraries default to a 1K buffer when talking to a tty. - * With a larger screen, especially across a network, we'd like - * to get it to all flush in a single write. Make it twice as big - * as just the characters (so that we have room for cursor motions - * and standout information) but no more than 8K. - */ - if (stdbuf == NULL) { - if ((len = LINES * COLS * 2) > 8192) - len = 8192; - if ((stdbuf = malloc(len)) == NULL) - len = 0; - } - (void)setvbuf(stdout, stdbuf, _IOFBF, len); - - tputs(TI, 0, __cputchar); - tputs(VS, 0, __cputchar); -} - -int -endwin() -{ - __restore_stophandler(); - - if (curscr != NULL) { - if (curscr->flags & __WSTANDOUT) { - tputs(SE, 0, __cputchar); - curscr->flags &= ~__WSTANDOUT; - } - __mvcur(curscr->cury, curscr->cury, curscr->maxy - 1, 0, 0); - } - - (void)tputs(VE, 0, __cputchar); - (void)tputs(TE, 0, __cputchar); - (void)fflush(stdout); - (void)setvbuf(stdout, NULL, _IOLBF, 0); - - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, &__orig_termios) ? ERR : OK); -} - -/* - * The following routines, savetty and resetty are completely useless and - * are left in only as stubs. If people actually use them they will almost - * certainly screw up the state of the world. - */ -static struct termios savedtty; -int -savetty() -{ - return (tcgetattr(STDIN_FILENO, &savedtty) ? ERR : OK); -} - -int -resetty() -{ - return (tcsetattr(STDIN_FILENO, __tcaction ? - TCSASOFT | TCSADRAIN : TCSADRAIN, &savedtty) ? ERR : OK); -} diff --git a/lib/libcurses/unctrl.c b/lib/libcurses/unctrl.c deleted file mode 100644 index ff52230b2e9..00000000000 --- a/lib/libcurses/unctrl.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 1981, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char sccsid[] = "@(#)unctrl.c 8.1 (Berkeley) 6/4/93"; -#endif /* not lint */ - -char *__unctrl[256] = { - "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", - "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O", - "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", - "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_", - " ", "!", "\"", "#", "$", "%", "&", "'", - "(", ")", "*", "+", ",", "-", ".", "/", - "0", "1", "2", "3", "4", "5", "6", "7", - "8", "9", ":", ";", "<", "=", ">", "?", - "@", "A", "B", "C", "D", "E", "F", "G", - "H", "I", "J", "K", "L", "M", "N", "O", - "P", "Q", "R", "S", "T", "U", "V", "W", - "X", "Y", "Z", "[", "\\", "]", "^", "_", - "`", "a", "b", "c", "d", "e", "f", "g", - "h", "i", "j", "k", "l", "m", "n", "o", - "p", "q", "r", "s", "t", "u", "v", "w", - "x", "y", "z", "{", "|", "}", "~", "^?", - - "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87", - "0x88", "0x89", "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", "0x8f", - "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97", - "0x98", "0x99", "0x9a", "0x9b", "0x9c", "0x9d", "0x9e", "0x9f", - "0xa0", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", "0xa7", - "0xa8", "0xa9", "0xaa", "0xab", "0xac", "0xad", "0xae", "0xaf", - "0xb0", "0xb1", "0xb2", "0xb3", "0xb4", "0xb5", "0xb6", "0xb7", - "0xb8", "0xb9", "0xba", "0xbb", "0xbc", "0xbd", "0xbe", "0xbf", - "0xc0", "0xc1", "0xc2", "0xc3", "0xc4", "0xc5", "0xc6", "0xc7", - "0xc8", "0xc9", "0xca", "0xcb", "0xcc", "0xcd", "0xce", "0xcf", - "0xd0", "0xd1", "0xd2", "0xd3", "0xd4", "0xd5", "0xd6", "0xd7", - "0xd8", "0xd9", "0xda", "0xdb", "0xdc", "0xdd", "0xde", "0xdf", - "0xe0", "0xe1", "0xe2", "0xe3", "0xe4", "0xe5", "0xe6", "0xe7", - "0xe8", "0xe9", "0xea", "0xeb", "0xec", "0xed", "0xee", "0xef", - "0xf0", "0xf1", "0xf2", "0xf3", "0xf4", "0xf5", "0xf6", "0xf7", - "0xf8", "0xf9", "0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff", -}; - -char __unctrllen[256] = { - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -}; diff --git a/lib/libcurses/unctrl.h b/lib/libcurses/unctrl.h new file mode 100644 index 00000000000..a503aa76a8f --- /dev/null +++ b/lib/libcurses/unctrl.h @@ -0,0 +1,45 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + +/* + * unctrl.h + * + * Display a printable version of a control character. + * Control characters are displayed in caret notation (^x), DELETE is displayed + * as ^?. Printable characters are displayed as is. + * + * The returned pointer points to a static buffer which gets overwritten by + * each call. Therefore, you must copy the resulting string to a safe place + * before calling unctrl() again. + * + */ +#ifndef _UNCTRL_H +#define _UNCTRL_H 1 +#define NCURSES_VERSION "1.9.9e" + +#ifndef _CHTYPE_T_ +#define _CHTYPE_T_ unsigned long +typedef _CHTYPE_T_ chtype; +#endif + +extern char *unctrl(chtype); + +#endif /* _UNCTRL_H */ |