X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_newterm.c;h=f52562cec1069c615831baec74a0180b089d2b9e;hp=ad7b122be8ad1baecee24607cd0ade96c2e8f41c;hb=88d50b5d7057d4f59c586c93ff290d0a39528f70;hpb=55ccd2b959766810cf7db8d1c4462f338ce0afc8 diff --git a/ncurses/base/lib_newterm.c b/ncurses/base/lib_newterm.c index ad7b122b..f52562ce 100644 --- a/ncurses/base/lib_newterm.c +++ b/ncurses/base/lib_newterm.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2002,2004 Free Software Foundation, Inc. * + * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -48,7 +48,7 @@ #include /* clear_screen, cup & friends, cur_term */ #include -MODULE_ID("$Id: lib_newterm.c,v 1.58 2004/08/14 20:36:39 tom Exp $") +MODULE_ID("$Id: lib_newterm.c,v 1.68 2008/01/12 20:24:40 tom Exp $") #ifndef ONLCR /* Allows compilation under the QNX 4.2 OS */ #define ONLCR 0 @@ -62,7 +62,7 @@ MODULE_ID("$Id: lib_newterm.c,v 1.58 2004/08/14 20:36:39 tom Exp $") * The newterm function also initializes terminal settings, and since initscr * is supposed to behave as if it calls newterm, we do it here. */ -static inline int +static NCURSES_INLINE int _nc_initscr(void) { int result = ERR; @@ -77,8 +77,10 @@ _nc_initscr(void) buf.c_lflag &= ~(ECHO | ECHONL); buf.c_iflag &= ~(ICRNL | INLCR | IGNCR); buf.c_oflag &= ~(ONLCR); -#else +#elif HAVE_SGTTY_H buf.sg_flags &= ~(ECHO | CRMOD); +#else + memset(&buf, 0, sizeof(buf)); #endif if ((result = _nc_set_tty_mode(&buf)) == OK) cur_term->Nttyb = buf; @@ -92,120 +94,127 @@ _nc_initscr(void) * aside from possibly delaying a filter() call until some terminals have been * initialized. */ -static int filter_mode = FALSE; - NCURSES_EXPORT(void) filter(void) { + START_TRACE(); T((T_CALLED("filter"))); - filter_mode = TRUE; + _nc_prescreen.filter_mode = TRUE; returnVoid; } +#if NCURSES_EXT_FUNCS +/* + * An extension, allowing the application to open a new screen without + * requiring it to also be filtered. + */ +NCURSES_EXPORT(void) +nofilter(void) +{ + START_TRACE(); + T((T_CALLED("nofilter"))); + _nc_prescreen.filter_mode = FALSE; + returnVoid; +} +#endif + NCURSES_EXPORT(SCREEN *) newterm(NCURSES_CONST char *name, FILE *ofp, FILE *ifp) { + int value; int errret; - int slk_format = _nc_slk_format; + int slk_format = _nc_globals.slk_format; SCREEN *current; + SCREEN *result = 0; START_TRACE(); T((T_CALLED("newterm(\"%s\",%p,%p)"), name, ofp, ifp)); /* this loads the capability entry, then sets LINES and COLS */ - if (setupterm(name, fileno(ofp), &errret) == ERR) - returnSP(0); - - /* implement filter mode */ - if (filter_mode) { - LINES = 1; - - clear_screen = 0; - cursor_down = parm_down_cursor = 0; - cursor_address = 0; - cursor_up = parm_up_cursor = 0; - row_address = 0; - - cursor_home = carriage_return; - } - - /* If we must simulate soft labels, grab off the line to be used. - We assume that we must simulate, if it is none of the standard - formats (4-4 or 3-2-3) for which there may be some hardware - support. */ - if (num_labels <= 0 || !SLK_STDFMT(slk_format)) - if (slk_format) { - if (ERR == _nc_ripoffline(-SLK_LINES(slk_format), - _nc_slk_initialize)) - returnSP(0); + if (setupterm(name, fileno(ofp), &errret) == ERR) { + result = 0; + } else { + /* + * This actually allocates the screen structure, and saves the original + * terminal settings. + */ + current = SP; + _nc_set_screen(0); + + /* allow user to set maximum escape delay from the environment */ + if ((value = _nc_getenv_num("ESCDELAY")) >= 0) { +#if USE_REENTRANT + SP->_ESCDELAY = value; +#else + ESCDELAY = value; +#endif } - /* this actually allocates the screen structure, and saves the - * original terminal settings. - */ - current = SP; - _nc_set_screen(0); - if (_nc_setupscreen(LINES, COLS, ofp) == ERR) { - _nc_set_screen(current); - returnSP(0); - } - - /* if the terminal type has real soft labels, set those up */ - if (slk_format && num_labels > 0 && SLK_STDFMT(slk_format)) - _nc_slk_initialize(stdscr, COLS); - SP->_ifd = fileno(ifp); - typeahead(fileno(ifp)); + if (_nc_setupscreen(LINES, + COLS, + ofp, + _nc_prescreen.filter_mode, + slk_format) == ERR) { + _nc_set_screen(current); + result = 0; + } else { + /* if the terminal type has real soft labels, set those up */ + if (slk_format && num_labels > 0 && SLK_STDFMT(slk_format)) + _nc_slk_initialize(stdscr, COLS); + + SP->_ifd = fileno(ifp); + typeahead(fileno(ifp)); #ifdef TERMIOS - SP->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 && - !(cur_term->Ottyb.c_iflag & ISTRIP)); + SP->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 && + !(cur_term->Ottyb.c_iflag & ISTRIP)); #else - SP->_use_meta = FALSE; + SP->_use_meta = FALSE; #endif - SP->_endwin = FALSE; - - /* Check whether we can optimize scrolling under dumb terminals in case - * we do not have any of these capabilities, scrolling optimization - * will be useless. - */ - SP->_scrolling = ((scroll_forward && scroll_reverse) || - ((parm_rindex || parm_insert_line || insert_line) && - (parm_index || parm_delete_line || delete_line))); - - baudrate(); /* sets a field in the SP structure */ - - SP->_keytry = 0; - - /* - * Check for mismatched graphic-rendition capabilities. Most SVr4 - * terminfo trees contain entries that have rmul or rmso equated to - * sgr0 (Solaris curses copes with those entries). We do this only for - * curses, since many termcap applications assume that smso/rmso and - * smul/rmul are paired, and will not function properly if we remove - * rmso or rmul. Curses applications shouldn't be looking at this - * detail. - */ + SP->_endwin = FALSE; + + /* + * Check whether we can optimize scrolling under dumb terminals in + * case we do not have any of these capabilities, scrolling + * optimization will be useless. + */ + SP->_scrolling = ((scroll_forward && scroll_reverse) || + ((parm_rindex || + parm_insert_line || + insert_line) && + (parm_index || + parm_delete_line || + delete_line))); + + baudrate(); /* sets a field in the SP structure */ + + SP->_keytry = 0; + + /* + * Check for mismatched graphic-rendition capabilities. Most SVr4 + * terminfo trees contain entries that have rmul or rmso equated to + * sgr0 (Solaris curses copes with those entries). We do this only + * for curses, since many termcap applications assume that + * smso/rmso and smul/rmul are paired, and will not function + * properly if we remove rmso or rmul. Curses applications + * shouldn't be looking at this detail. + */ #define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode)) - SP->_use_rmso = SGR0_TEST(exit_standout_mode); - SP->_use_rmul = SGR0_TEST(exit_underline_mode); - - /* compute movement costs so we can do better move optimization */ - _nc_mvcur_init(); + SP->_use_rmso = SGR0_TEST(exit_standout_mode); + SP->_use_rmul = SGR0_TEST(exit_underline_mode); - /* initialize terminal to a sane state */ - _nc_screen_init(); + /* compute movement costs so we can do better move optimization */ + _nc_mvcur_init(); - /* Initialize the terminal line settings. */ - _nc_initscr(); + /* initialize terminal to a sane state */ + _nc_screen_init(); - _nc_signal_handler(TRUE); + /* Initialize the terminal line settings. */ + _nc_initscr(); -#if USE_SIZECHANGE - /* - * Pretend we received a SIGWINCH, just in case we're starting up in a - * terminal that cannot initialize its size properly (Debian #265631). - */ - SP->_sig_winch = TRUE; -#endif + _nc_signal_handler(TRUE); - returnSP(SP); + result = SP; + } + } + returnSP(result); }