* and: Eric S. Raymond <esr@snark.thyrsus.com> *
****************************************************************************/
-
-
/*
** lib_set_term.c
**
#include <term.h> /* cur_term */
-MODULE_ID("$Id: lib_set_term.c,v 1.37 1998/02/11 12:13:57 tom Exp $")
+MODULE_ID("$Id: lib_set_term.c,v 1.46 1999/07/24 20:05:49 tom Exp $")
-/*
- * 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 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
- * has been associated with an open file and before any other operation is
- * performed on the stream." (ISO 7.9.5.6.)
- *
- * Grrrr...
- */
-void _nc_set_buffer(FILE *ofp, bool buffered)
-{
- /* optional optimization hack -- do before any output to ofp */
-#if HAVE_SETVBUF || HAVE_SETBUFFER
- unsigned buf_len;
- char *buf_ptr;
-
- if (buffered) {
- buf_len = min(LINES * (COLS + 6), 2800);
- buf_ptr = malloc(buf_len);
- } else {
- buf_len = 0;
- buf_ptr = 0;
- }
-
-#if HAVE_SETVBUF
-#ifdef SETVBUF_REVERSED /* pre-svr3? */
- (void) setvbuf(ofp, buf_ptr, buf_len, buf_len ? _IOFBF : _IONBF);
-#else
- (void) setvbuf(ofp, buf_ptr, buf_len ? _IOFBF : _IONBF, buf_len);
-#endif
-#elif HAVE_SETBUFFER
- (void) setbuffer(ofp, buf_ptr, (int)buf_len);
-#endif
-
- if (!buffered) {
- FreeIfNeeded(SP->_setbuf);
- }
- SP->_setbuf = buf_ptr;
-
-#endif /* HAVE_SETVBUF || HAVE_SETBUFFER */
-}
-
-SCREEN * set_term(SCREEN *screen)
+SCREEN * set_term(SCREEN *screenp)
{
SCREEN *oldSP;
- T((T_CALLED("set_term(%p)"), screen));
+ T((T_CALLED("set_term(%p)"), screenp));
oldSP = SP;
- _nc_set_screen(screen);
+ _nc_set_screen(screenp);
set_curterm(SP->_term);
curscr = SP->_curscr;
FreeIfNeeded(sp->_color_table);
FreeIfNeeded(sp->_color_pairs);
+ FreeIfNeeded(sp->oldhash);
+ FreeIfNeeded(sp->newhash);
+
+ del_curterm(sp->_term);
+
free(sp);
/*
int bottom_stolen = 0;
size_t i;
- assert(SP==0); /* has been reset in newterm() ! */
+ assert(SP==0); /* has been reset in newterm() ! */
if (!_nc_alloc_screen())
return ERR;
SP->_next_screen = _nc_screen_chain;
_nc_screen_chain = SP;
-
+
_nc_set_buffer(output, TRUE);
SP->_term = cur_term;
SP->_lines = slines;
SP->_curscol = -1;
SP->_nl = TRUE;
SP->_raw = FALSE;
- SP->_cbreak = FALSE;
+ SP->_cbreak = 0;
SP->_echo = TRUE;
SP->_fifohead = -1;
SP->_endwin = TRUE;
SP->_ofp = output;
SP->_cursor = -1; /* cannot know real cursor shape */
+#ifdef NCURSES_NO_PADDING
+ SP->_no_padding = getenv("NCURSES_NO_PADDING") != 0;
+#endif
SP->_maxclick = DEFAULT_MAXCLICK;
SP->_mouse_event = no_mouse_event;
acs_chars = 0;
#endif
}
- init_acs();
+ _nc_init_acs();
memcpy(SP->_acs_map, acs_map, sizeof(chtype)*ACS_LEN);
_nc_idcok = TRUE;
_nc_idlok = FALSE;
-
+
_nc_windows = 0; /* no windows yet */
+ SP->oldhash = 0;
+ SP->newhash = 0;
+
T(("creating newscr"));
if ((newscr = newwin(slines, scolumns, 0, 0)) == 0)
return ERR;