X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_newwin.c;h=564c07fbb1f9e32f85e743880147e992547036e9;hp=2b120eac10c79c3adc303c2039040470f7a41c36;hb=76a479337308b4b5e749fa8c38b7b7f482998c5b;hpb=70322aa06a4a97ebff76d2869ad923cdf51ee0a9 diff --git a/ncurses/base/lib_newwin.c b/ncurses/base/lib_newwin.c index 2b120eac..564c07fb 100644 --- a/ncurses/base/lib_newwin.c +++ b/ncurses/base/lib_newwin.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright (c) 1998-2011,2016 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 * @@ -43,7 +43,7 @@ #include #include -MODULE_ID("$Id: lib_newwin.c,v 1.68 2011/01/22 20:34:15 tom Exp $") +MODULE_ID("$Id: lib_newwin.c,v 1.72 2016/05/28 23:11:26 tom Exp $") #define window_is(name) ((sp)->_##name == win) @@ -91,8 +91,6 @@ remove_window_from_screen(WINDOW *win) NCURSES_EXPORT(int) _nc_freewin(WINDOW *win) { - WINDOWLIST *p, *q; - int i; int result = ERR; #ifdef USE_SP_WINDOWLIST SCREEN *sp = _nc_screen_of(win); /* pretend this is parameter */ @@ -101,9 +99,13 @@ _nc_freewin(WINDOW *win) T((T_CALLED("_nc_freewin(%p)"), (void *) win)); if (win != 0) { + if (_nc_nonsp_try_global(curses) == 0) { + WINDOWLIST *p, *q; + q = 0; for (each_window(SP_PARM, p)) { + if (&(p->win) == win) { remove_window_from_screen(win); if (q == 0) @@ -112,6 +114,8 @@ _nc_freewin(WINDOW *win) q->next = p->next; if (!(win->_flags & _SUBWIN)) { + int i; + for (i = 0; i <= win->_maxy; i++) FreeIfNeeded(win->_line[i].text); } @@ -141,7 +145,11 @@ NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx T((T_CALLED("newwin(%p, %d,%d,%d,%d)"), (void *) SP_PARM, num_lines, num_columns, begy, begx)); - if (begy < 0 || begx < 0 || num_lines <= 0 || num_columns <= 0) + if (begy < 0 + || begx < 0 + || num_lines < 0 + || num_columns < 0 + || SP_PARM == 0) returnWin(0); if (num_lines == 0) @@ -198,7 +206,7 @@ derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) /* * make sure window fits inside the original one */ - if (begy < 0 || begx < 0 || orig == 0 || num_lines <= 0 || num_columns <= 0) + if (begy < 0 || begx < 0 || orig == 0 || num_lines < 0 || num_columns < 0) returnWin(0); if (begy + num_lines > orig->_maxy + 1 || begx + num_columns > orig->_maxx + 1) @@ -235,10 +243,15 @@ derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) NCURSES_EXPORT(WINDOW *) subwin(WINDOW *w, int l, int c, int y, int x) { + WINDOW *result = 0; + T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), (void *) w, l, c, y, x)); - T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx)); + if (w != 0) { + T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx)); - returnWin(derwin(w, l, c, y - w->_begy, x - w->_begx)); + result = derwin(w, l, c, y - w->_begy, x - w->_begx); + } + returnWin(result); } static bool