X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_newwin.c;h=78a18b88631e95760ec8bc75b4a5b110c0f03713;hp=84763c93fc27277803d39d67aa63611a2d44cb18;hb=bd7ef7c2309fd00aa4576168c46f557c622cb9c3;hpb=6a5e1ae3015763934a358df2680a77458ca3e342 diff --git a/ncurses/base/lib_newwin.c b/ncurses/base/lib_newwin.c index 84763c93..78a18b88 100644 --- a/ncurses/base/lib_newwin.c +++ b/ncurses/base/lib_newwin.c @@ -42,9 +42,9 @@ #include #include -MODULE_ID("$Id: lib_newwin.c,v 1.46 2008/04/05 19:16:42 tom Exp $") +MODULE_ID("$Id: lib_newwin.c,v 1.51 2008/05/31 21:50:09 tom Exp $") -#define window_is(name) (sp->_##name == win) +#define window_is(name) ((sp)->_##name == win) #if USE_REENTRANT #define remove_window(name) \ @@ -56,27 +56,23 @@ MODULE_ID("$Id: lib_newwin.c,v 1.46 2008/04/05 19:16:42 tom Exp $") name = 0 #endif -static WINDOW * +static void remove_window_from_screen(WINDOW *win) { - SCREEN **scan = &_nc_screen_chain; + SCREEN *sp; - while (*scan) { - SCREEN *sp = *scan; + 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); - } else { - scan = &(*scan)->_next_screen; - continue; + break; } - break; } - - return 0; } NCURSES_EXPORT(int) @@ -90,7 +86,8 @@ _nc_freewin(WINDOW *win) if (win != 0) { if (_nc_try_global(windowlist) == 0) { - for (p = _nc_windows, q = 0; p != 0; q = p, p = p->next) { + q = 0; + for (each_window(p)) { if (&(p->win) == win) { remove_window_from_screen(win); if (q == 0) @@ -109,6 +106,7 @@ _nc_freewin(WINDOW *win) T(("...deleted win=%p", win)); break; } + q = p; } _nc_unlock_global(windowlist); } @@ -315,6 +313,7 @@ _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)); @@ -322,3 +321,20 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) _nc_unlock_global(windowlist); 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); +}