diff options
Diffstat (limited to 'lib/libcurses/lib_set_term.c')
-rw-r--r-- | lib/libcurses/lib_set_term.c | 141 |
1 files changed, 141 insertions, 0 deletions
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); +} |