]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/base/lib_set_term.c
ncurses 5.0
[ncurses.git] / ncurses / base / lib_set_term.c
similarity index 76%
rename from ncurses/lib_set_term.c
rename to ncurses/base/lib_set_term.c
index 12ac5fd6f5dfac820e4950d91451f329b81a8d35..443236cf9cdafadf0e163d846fbf4a65d098876b 100644 (file)
@@ -31,8 +31,6 @@
  *     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;
@@ -166,6 +102,11 @@ void delscreen(SCREEN *sp)
        FreeIfNeeded(sp->_color_table);
        FreeIfNeeded(sp->_color_pairs);
 
+       FreeIfNeeded(sp->oldhash);
+       FreeIfNeeded(sp->newhash);
+
+       del_curterm(sp->_term);
+
        free(sp);
 
        /*
@@ -200,13 +141,13 @@ int _nc_setupscreen(short slines, short const scolumns, FILE *output)
 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;
@@ -216,12 +157,15 @@ size_t    i;
        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;
@@ -268,14 +212,17 @@ size_t    i;
                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;