X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_set_term.c;h=eee1cfc7b2590b463e4695e5483c77a8851f91ed;hp=3f84706016318dd48686599e56c5f9514087e43f;hb=ed530db2c5b10aa19d06104dfe82cf248a813860;hpb=6209b84e2f9cc5a53527760499be2cba5fc4e95c diff --git a/ncurses/base/lib_set_term.c b/ncurses/base/lib_set_term.c index 3f847060..eee1cfc7 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.106 2008/03/29 22:47:24 tom Exp $") +MODULE_ID("$Id: lib_set_term.c,v 1.108 2008/05/03 22:42:43 tom Exp $") NCURSES_EXPORT(SCREEN *) set_term(SCREEN *screenp) @@ -94,26 +94,39 @@ _nc_free_keytry(TRIES * kt) } } +static bool +delink_screen(SCREEN *sp) +{ + SCREEN *last = 0; + SCREEN *temp; + bool result = FALSE; + + for (each_screen(temp)) { + if (temp == sp) { + if (last) + last = sp->_next_screen; + else + _nc_screen_chain = sp->_next_screen; + result = TRUE; + break; + } + last = temp; + } + return result; +} + /* * Free the storage associated with the given SCREEN sp. */ NCURSES_EXPORT(void) delscreen(SCREEN *sp) { - SCREEN **scan = &_nc_screen_chain; int i; T((T_CALLED("delscreen(%p)"), sp)); - if (sp != 0) { - _nc_lock_global(set_SP); - while (*scan) { - if (*scan == sp) { - *scan = sp->_next_screen; - break; - } - scan = &(*scan)->_next_screen; - } + _nc_lock_global(set_SP); + if (delink_screen(sp)) { (void) _nc_freewin(sp->_curscr); (void) _nc_freewin(sp->_newscr); @@ -180,8 +193,8 @@ delscreen(SCREEN *sp) #endif _nc_set_screen(0); } - _nc_unlock_global(set_SP); } + _nc_unlock_global(set_SP); returnVoid; } @@ -267,7 +280,7 @@ _nc_setupscreen(int slines GCC_UNUSED, /* * We should always check the screensize, just in case. */ - _nc_get_screensize(&slines, &scolumns); + _nc_get_screensize(SP, &slines, &scolumns); SET_LINES(slines); SET_COLS(scolumns); T((T_CREATE("screen %s %dx%d"), termname(), LINES, COLS));