X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Fbase%2Flib_set_term.c;h=3f84706016318dd48686599e56c5f9514087e43f;hb=60014650d5e3f088e2d5e8835925cce96db00c33;hp=e44850c6a15a2fb81e2eb728a76ca3c2da8e7edd;hpb=920d493ac02ed9bbbe1e5472e665c718bfdee471;p=ncurses.git diff --git a/ncurses/base/lib_set_term.c b/ncurses/base/lib_set_term.c index e44850c6..3f847060 100644 --- a/ncurses/base/lib_set_term.c +++ b/ncurses/base/lib_set_term.c @@ -44,7 +44,7 @@ #include /* cur_term */ #include -MODULE_ID("$Id: lib_set_term.c,v 1.103 2008/02/03 20:31:08 tom Exp $") +MODULE_ID("$Id: lib_set_term.c,v 1.106 2008/03/29 22:47:24 tom Exp $") NCURSES_EXPORT(SCREEN *) set_term(SCREEN *screenp) @@ -58,14 +58,25 @@ set_term(SCREEN *screenp) oldSP = SP; _nc_set_screen(screenp); - set_curterm(SP->_term); + if (SP != 0) { + set_curterm(SP->_term); #if !USE_REENTRANT - curscr = SP->_curscr; - newscr = SP->_newscr; - stdscr = SP->_stdscr; - COLORS = SP->_color_count; - COLOR_PAIRS = SP->_pair_count; + curscr = SP->_curscr; + newscr = SP->_newscr; + stdscr = SP->_stdscr; + COLORS = SP->_color_count; + COLOR_PAIRS = SP->_pair_count; #endif + } else { + set_curterm(0); +#if !USE_REENTRANT + curscr = 0; + newscr = 0; + stdscr = 0; + COLORS = 0; + COLOR_PAIRS = 0; +#endif + } _nc_unlock_global(set_SP); @@ -94,81 +105,83 @@ delscreen(SCREEN *sp) T((T_CALLED("delscreen(%p)"), sp)); - _nc_lock_global(set_SP); - while (*scan) { - if (*scan == sp) { - *scan = sp->_next_screen; - break; + if (sp != 0) { + _nc_lock_global(set_SP); + while (*scan) { + if (*scan == sp) { + *scan = sp->_next_screen; + break; + } + scan = &(*scan)->_next_screen; } - scan = &(*scan)->_next_screen; - } - - (void) _nc_freewin(sp->_curscr); - (void) _nc_freewin(sp->_newscr); - (void) _nc_freewin(sp->_stdscr); - if (sp->_slk != 0) { - if (sp->_slk->ent != 0) { - for (i = 0; i < sp->_slk->labcnt; ++i) { - FreeIfNeeded(sp->_slk->ent[i].ent_text); - FreeIfNeeded(sp->_slk->ent[i].form_text); + (void) _nc_freewin(sp->_curscr); + (void) _nc_freewin(sp->_newscr); + (void) _nc_freewin(sp->_stdscr); + + if (sp->_slk != 0) { + if (sp->_slk->ent != 0) { + for (i = 0; i < sp->_slk->labcnt; ++i) { + FreeIfNeeded(sp->_slk->ent[i].ent_text); + FreeIfNeeded(sp->_slk->ent[i].form_text); + } + free(sp->_slk->ent); } - free(sp->_slk->ent); + free(sp->_slk); + sp->_slk = 0; } - free(sp->_slk); - sp->_slk = 0; - } - _nc_free_keytry(sp->_keytry); - sp->_keytry = 0; + _nc_free_keytry(sp->_keytry); + sp->_keytry = 0; - _nc_free_keytry(sp->_key_ok); - sp->_key_ok = 0; + _nc_free_keytry(sp->_key_ok); + sp->_key_ok = 0; - FreeIfNeeded(sp->_current_attr); + FreeIfNeeded(sp->_current_attr); - FreeIfNeeded(sp->_color_table); - FreeIfNeeded(sp->_color_pairs); + FreeIfNeeded(sp->_color_table); + FreeIfNeeded(sp->_color_pairs); - FreeIfNeeded(sp->oldhash); - FreeIfNeeded(sp->newhash); - FreeIfNeeded(sp->hashtab); + FreeIfNeeded(sp->oldhash); + FreeIfNeeded(sp->newhash); + FreeIfNeeded(sp->hashtab); - FreeIfNeeded(sp->_acs_map); - FreeIfNeeded(sp->_screen_acs_map); + FreeIfNeeded(sp->_acs_map); + FreeIfNeeded(sp->_screen_acs_map); - del_curterm(sp->_term); + del_curterm(sp->_term); - /* - * If the associated output stream has been closed, we can discard the - * set-buffer. Limit the error check to EBADF, since fflush may fail - * for other reasons than trying to operate upon a closed stream. - */ - if (sp->_ofp != 0 - && sp->_setbuf != 0 - && fflush(sp->_ofp) != 0 - && errno == EBADF) { - free(sp->_setbuf); - } + /* + * If the associated output stream has been closed, we can discard the + * set-buffer. Limit the error check to EBADF, since fflush may fail + * for other reasons than trying to operate upon a closed stream. + */ + if (sp->_ofp != 0 + && sp->_setbuf != 0 + && fflush(sp->_ofp) != 0 + && errno == EBADF) { + free(sp->_setbuf); + } - free(sp); + free(sp); - /* - * If this was the current screen, reset everything that the - * application might try to use (except cur_term, which may have - * multiple references in different screens). - */ - if (sp == SP) { + /* + * If this was the current screen, reset everything that the + * application might try to use (except cur_term, which may have + * multiple references in different screens). + */ + if (sp == SP) { #if !USE_REENTRANT - curscr = 0; - newscr = 0; - stdscr = 0; - COLORS = 0; - COLOR_PAIRS = 0; + curscr = 0; + newscr = 0; + stdscr = 0; + COLORS = 0; + COLOR_PAIRS = 0; #endif - _nc_set_screen(0); + _nc_set_screen(0); + } + _nc_unlock_global(set_SP); } - _nc_unlock_global(set_SP); returnVoid; } @@ -512,8 +525,6 @@ _nc_setupscreen(int slines GCC_UNUSED, _nc_idcok = TRUE; _nc_idlok = FALSE; - _nc_windows = 0; /* no windows yet */ - SP->oldhash = 0; SP->newhash = 0;