diff options
Diffstat (limited to 'contrib/ncurses/ncurses/base/lib_newwin.c')
-rw-r--r-- | contrib/ncurses/ncurses/base/lib_newwin.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/contrib/ncurses/ncurses/base/lib_newwin.c b/contrib/ncurses/ncurses/base/lib_newwin.c index 3cd8238..ba51633 100644 --- a/contrib/ncurses/ncurses/base/lib_newwin.c +++ b/contrib/ncurses/ncurses/base/lib_newwin.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. * + * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -29,6 +29,7 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * * and: Eric S. Raymond <esr@snark.thyrsus.com> * + * and: Thomas E. Dickey 1996-on * ****************************************************************************/ /* @@ -40,7 +41,36 @@ #include <curses.priv.h> -MODULE_ID("$Id: lib_newwin.c,v 1.33 2001/12/19 01:06:30 tom Exp $") +MODULE_ID("$Id: lib_newwin.c,v 1.38 2006/10/14 20:31:19 tom Exp $") + +static WINDOW * +remove_window_from_screen(WINDOW *win) +{ + SCREEN **scan = &_nc_screen_chain; + + while (*scan) { + SCREEN *sp = *scan; + if (sp->_curscr == win) { + sp->_curscr = 0; + if (win == curscr) + curscr = 0; + } else if (sp->_stdscr == win) { + sp->_stdscr = 0; + if (win == stdscr) + stdscr = 0; + } else if (sp->_newscr == win) { + sp->_newscr = 0; + if (win == newscr) + newscr = 0; + } else { + scan = &(*scan)->_next_screen; + continue; + } + break; + } + + return 0; +} NCURSES_EXPORT(int) _nc_freewin(WINDOW *win) @@ -52,6 +82,7 @@ _nc_freewin(WINDOW *win) if (win != 0) { for (p = _nc_windows, q = 0; p != 0; q = p, p = p->next) { if (&(p->win) == win) { + remove_window_from_screen(win); if (q == 0) _nc_windows = p->next; else @@ -64,13 +95,6 @@ _nc_freewin(WINDOW *win) free(win->_line); free(p); - if (win == curscr) - curscr = 0; - if (win == stdscr) - stdscr = 0; - if (win == newscr) - newscr = 0; - result = OK; T(("...deleted win=%p", win)); break; @@ -97,9 +121,6 @@ newwin(int num_lines, int num_columns, int begy, int begx) if (num_columns == 0) num_columns = screen_columns - begx; - if (num_columns + begx > SP->_columns || num_lines + begy > SP->_lines_avail) - returnWin(0); - if ((win = _nc_makenew(num_lines, num_columns, begy, begx, 0)) == 0) returnWin(0); @@ -152,7 +173,7 @@ derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) win->_pary = begy; win->_parx = begx; - win->_attrs = orig->_attrs; + WINDOW_ATTRS(win) = WINDOW_ATTRS(orig); win->_nc_bkgd = orig->_nc_bkgd; for (i = 0; i < num_lines; i++) @@ -167,7 +188,7 @@ NCURSES_EXPORT(WINDOW *) subwin(WINDOW *w, int l, int c, int y, int x) { T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), w, l, c, y, x)); - T(("parent has begy = %d, begx = %d", w->_begy, w->_begx)); + T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx)); returnWin(derwin(w, l, c, y - w->_begy, x - w->_begx)); } @@ -189,6 +210,9 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) T(("_nc_makenew(%d,%d,%d,%d)", num_lines, num_columns, begy, begx)); + if (SP == 0) + return 0; + if (!dimension_limit(num_lines) || !dimension_limit(num_columns)) return 0; @@ -211,7 +235,7 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) win->_yoffset = SP->_topstolen; win->_flags = flags; - win->_attrs = A_NORMAL; + WINDOW_ATTRS(win) = A_NORMAL; SetChar(win->_nc_bkgd, BLANK_TEXT, BLANK_ATTR); win->_clear = is_pad ? FALSE : (num_lines == screen_lines |