/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for * * details. If they are missing then this copy is in violation of * * the copyright conditions. */ /* ** lib_newterm.c ** ** The newterm() function. ** */ #include #include "curses.priv.h" #include "terminfo.h" #ifdef SVR4_ACTION #define _POSIX_SOURCE #endif #include #ifdef MYTINFO int LINES, COLS; #endif static void cleanup(int sig) { if (sig == SIGSEGV) fprintf(stderr, "Got a segmentation violation signal, cleaning up and exiting\n"); endwin(); exit(1); } static void size_change(int sig) { struct ttysize ws; if (ioctl(0, TIOCGSIZE, &ws) != -1) { LINES = ws.ts_lines; COLS = ws.ts_cols; } } WINDOW *stdscr, *curscr, *newscr; SCREEN *SP; struct ripoff_t { int line; int (*hook)(); } rippedoff[5], *rsp = rippedoff; SCREEN * newterm(char *term, FILE *ofp, FILE *ifp) { sigaction_t act; int errret; int stolen, topstolen; extern char _ncurses_copyright[]; char *use_it = _ncurses_copyright; use_it = use_it; /* shut up compiler */ #ifdef TRACE _init_trace(); T(("newterm(\"%s\",%x,%x) called", term, ofp, ifp)); #endif #ifdef MYTINFO if (setupterm(term, fileno(ofp), &errret) != OK) return NULL; COLS = columns; LINES = lines; #else if (setupterm(term, fileno(ofp), &errret) != 1) return NULL; #endif if ((SP = (SCREEN *) malloc(sizeof *SP)) == NULL) return NULL; if (ofp == stdout && ifp == stdin) { SP->_ofp = stdout; SP->_ifp = stdin; } else { SP->_ofp = ofp; SP->_ifp = ofp; } SP->_term = cur_term; SP->_cursrow = -1; SP->_curscol = -1; SP->_keytry = UNINITIALISED; SP->_nl = TRUE; SP->_raw = FALSE; SP->_cbreak = FALSE; SP->_echo = TRUE; SP->_nlmapping = TRUE; SP->_fifohead = -1; SP->_fifotail = 0; SP->_fifopeek = 0; SP->_endwin = FALSE; SP->_checkfd = fileno(ifp); typeahead(fileno(ifp)); if (enter_ca_mode) putp(enter_ca_mode); init_acs(); T(("creating newscr")); if ((newscr = newwin(lines, columns, 0, 0)) == (WINDOW *)NULL) return(NULL); T(("creating curscr")); if ((curscr = newwin(lines, columns, 0, 0)) == (WINDOW *)NULL) return(NULL); 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,COLS, LINES-1,0), COLS); else rsp->hook(newwin(1,COLS, topstolen++,0), COLS); } --LINES; stolen++; } act.sa_handler = tstp; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGTSTP, &act, NULL); act.sa_handler = cleanup; sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); #if 0 sigaction(SIGSEGV, &act, NULL); #endif act.sa_handler = size_change; act.sa_flags = SA_RESTART; sigaction(SIGWINCH, &act, NULL); /* this must restart read() */ if ((stdscr = newwin(lines - stolen, columns, topstolen, 0)) == NULL) return(NULL); SP->_stdscr = stdscr; def_shell_mode(); def_prog_mode(); T(("newterm returns %x", SP)); return(SP); } 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); }