X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_newterm.c;h=f52562cec1069c615831baec74a0180b089d2b9e;hp=7da4069b5b8505271bc6380ce51f33911de7b501;hb=c4d90db4f4e50bb8a971955ce4812262da4a50bc;hpb=c633e5103a29a38532cf1925257b91cea33fd090 diff --git a/ncurses/base/lib_newterm.c b/ncurses/base/lib_newterm.c index 7da4069b..f52562ce 100644 --- a/ncurses/base/lib_newterm.c +++ b/ncurses/base/lib_newterm.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,1999,2000 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 * @@ -29,6 +29,7 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * ****************************************************************************/ /* @@ -47,7 +48,7 @@ #include /* clear_screen, cup & friends, cur_term */ #include -MODULE_ID("$Id: lib_newterm.c,v 1.48 2000/09/02 18:11:42 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 @@ -61,21 +62,30 @@ MODULE_ID("$Id: lib_newterm.c,v 1.48 2000/09/02 18:11:42 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; + /* for extended XPG4 conformance requires cbreak() at this point */ /* (SVr4 curses does this anyway) */ - cbreak(); + if (cbreak() == OK) { + TTY buf; + buf = cur_term->Nttyb; #ifdef TERMIOS - cur_term->Nttyb.c_lflag &= ~(ECHO | ECHONL); - cur_term->Nttyb.c_iflag &= ~(ICRNL | INLCR | IGNCR); - cur_term->Nttyb.c_oflag &= ~(ONLCR); + buf.c_lflag &= ~(ECHO | ECHONL); + buf.c_iflag &= ~(ICRNL | INLCR | IGNCR); + buf.c_oflag &= ~(ONLCR); +#elif HAVE_SGTTY_H + buf.sg_flags &= ~(ECHO | CRMOD); #else - cur_term->Nttyb.sg_flags &= ~(ECHO | CRMOD); + memset(&buf, 0, sizeof(buf)); #endif - return _nc_set_tty_mode(&cur_term->Nttyb); + if ((result = _nc_set_tty_mode(&buf)) == OK) + cur_term->Nttyb = buf; + } + return result; } /* @@ -84,144 +94,127 @@ _nc_initscr(void) * aside from possibly delaying a filter() call until some terminals have been * initialized. */ -static int filter_mode = FALSE; - -void +NCURSES_EXPORT(void) filter(void) { - filter_mode = TRUE; + START_TRACE(); + T((T_CALLED("filter"))); + _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 -SCREEN * -newterm(NCURSES_CONST char *name, FILE * ofp, FILE * ifp) +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; -#ifdef TRACE - int t = _nc_getenv_num("NCURSES_TRACE"); - - if (t >= 0) - trace(t); -#endif + 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) - return 0; - - /* implement filter mode */ - if (filter_mode) { - LINES = 1; - - if (VALID_NUMERIC(init_tabs)) - TABSIZE = init_tabs; - else - TABSIZE = 8; - - T(("TABSIZE = %d", TABSIZE)); - - 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)) - return 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); - return 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); - SP->_checkfd = 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); - -#if USE_WIDEC_SUPPORT - /* - * XFree86 xterm can be configured to support UTF-8 based on environment - * variable settings. - */ - { - char *s; - s = getenv("LC_ALL"); - if (s == NULL || *s == '\0') { - s = getenv("LC_CTYPE"); - if (s == NULL || *s == '\0') { - s = getenv("LANG"); - } - } - if (s != NULL && *s != '\0' && strstr(s, "UTF-8") != NULL) { - SP->_outch = _nc_utf8_outch; - } - } -#endif + 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(); + /* compute movement costs so we can do better move optimization */ + _nc_mvcur_init(); - /* initialize terminal to a sane state */ - _nc_screen_init(); + /* initialize terminal to a sane state */ + _nc_screen_init(); - /* Initialize the terminal line settings. */ - _nc_initscr(); + /* Initialize the terminal line settings. */ + _nc_initscr(); - _nc_signal_handler(TRUE); + _nc_signal_handler(TRUE); - T((T_RETURN("%p"), SP)); - return (SP); + result = SP; + } + } + returnSP(result); }