X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_newwin.c;h=587e83a920092f57bc3e48712d61d59e48ea6fdb;hp=835bb0bccae1e58b570dde770523352d5fecbfd5;hb=1f21085964c1dcb515970035e43b7f25ac2cfdf6;hpb=d44d7f381ba0173521cb788ba3adb12e261e5c96;ds=sidebyside diff --git a/ncurses/base/lib_newwin.c b/ncurses/base/lib_newwin.c index 835bb0bc..587e83a9 100644 --- a/ncurses/base/lib_newwin.c +++ b/ncurses/base/lib_newwin.c @@ -42,41 +42,37 @@ #include #include -MODULE_ID("$Id: lib_newwin.c,v 1.45 2008/02/23 20:57:58 tom Exp $") +MODULE_ID("$Id: lib_newwin.c,v 1.52 2008/06/07 13:58:09 tom Exp $") + +#define window_is(name) ((sp)->_##name == win) + +#if USE_REENTRANT +#define remove_window(name) \ + sp->_##name = 0 +#else +#define remove_window(name) \ + sp->_##name = 0; \ + if (win == name) \ + name = 0 +#endif -static WINDOW * +static void remove_window_from_screen(WINDOW *win) { - SCREEN **scan = &_nc_screen_chain; - - while (*scan) { - SCREEN *sp = *scan; - if (sp->_curscr == win) { - sp->_curscr = 0; -#if !USE_REENTRANT - if (win == curscr) - curscr = 0; -#endif - } else if (sp->_stdscr == win) { - sp->_stdscr = 0; -#if !USE_REENTRANT - if (win == stdscr) - stdscr = 0; -#endif - } else if (sp->_newscr == win) { - sp->_newscr = 0; -#if !USE_REENTRANT - if (win == newscr) - newscr = 0; -#endif - } else { - scan = &(*scan)->_next_screen; - continue; + SCREEN *sp; + + for (each_screen(sp)) { + if (window_is(curscr)) { + remove_window(curscr); + break; + } else if (window_is(stdscr)) { + remove_window(stdscr); + break; + } else if (window_is(newscr)) { + remove_window(newscr); + break; } - break; } - - return 0; } NCURSES_EXPORT(int) @@ -89,8 +85,9 @@ _nc_freewin(WINDOW *win) T((T_CALLED("_nc_freewin(%p)"), win)); if (win != 0) { - if (_nc_try_global(windowlist) == 0) { - for (p = _nc_windows, q = 0; p != 0; q = p, p = p->next) { + if (_nc_try_global(curses) == 0) { + q = 0; + for (each_window(p)) { if (&(p->win) == win) { remove_window_from_screen(win); if (q == 0) @@ -109,8 +106,9 @@ _nc_freewin(WINDOW *win) T(("...deleted win=%p", win)); break; } + q = p; } - _nc_unlock_global(windowlist); + _nc_unlock_global(curses); } } returnCode(result); @@ -231,8 +229,6 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) if ((wp = typeCalloc(WINDOWLIST, 1)) == 0) returnWin(0); - _nc_mutex_init(&(wp->mutex_use_window)); - win = &(wp->win); if ((win->_line = typeCalloc(struct ldat, ((unsigned) num_lines))) == 0) { @@ -240,7 +236,7 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) returnWin(0); } - _nc_lock_global(windowlist); + _nc_lock_global(curses); win->_curx = 0; win->_cury = 0; @@ -315,10 +311,28 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) } wp->next = _nc_windows; + wp->screen = SP; _nc_windows = wp; T((T_CREATE("window %p"), win)); - _nc_unlock_global(windowlist); + _nc_unlock_global(curses); returnWin(win); } + +/* + * wgetch() and other functions with a WINDOW* parameter may use a SCREEN* + * internally, and it is useful to allow those to be invoked without switching + * SCREEN's, e.g., for multi-threaded applications. + */ +NCURSES_EXPORT(SCREEN *) +_nc_screen_of(WINDOW *win) +{ + SCREEN *sp = 0; + + if (win != 0) { + WINDOWLIST *wp = (WINDOWLIST *) win; + sp = wp->screen; + } + return (sp); +}