X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_newwin.c;h=564c07fbb1f9e32f85e743880147e992547036e9;hp=e7a30bf937ce3501e9263399e5708490044dd88e;hb=603f0cb25b7acc8f04f4b18d2a2fe6f90039829a;hpb=7a6bbc8cf41c5186d46accc3d08622dc86526b34 diff --git a/ncurses/base/lib_newwin.c b/ncurses/base/lib_newwin.c index e7a30bf9..564c07fb 100644 --- a/ncurses/base/lib_newwin.c +++ b/ncurses/base/lib_newwin.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 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.54 2009/04/18 21:02:34 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) @@ -62,6 +62,17 @@ remove_window_from_screen(WINDOW *win) { SCREEN *sp; +#ifdef USE_SP_WINDOWLIST + if ((sp = _nc_screen_of(win)) != 0) { + if (window_is(curscr)) { + remove_window(curscr); + } else if (window_is(stdscr)) { + remove_window(stdscr); + } else if (window_is(newscr)) { + remove_window(newscr); + } + } +#else for (each_screen(sp)) { if (window_is(curscr)) { remove_window(curscr); @@ -74,29 +85,37 @@ remove_window_from_screen(WINDOW *win) break; } } +#endif } 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 */ +#endif - T((T_CALLED("_nc_freewin(%p)"), win)); + T((T_CALLED("_nc_freewin(%p)"), (void *) win)); if (win != 0) { - if (_nc_try_global(curses) == 0) { + + if (_nc_nonsp_try_global(curses) == 0) { + WINDOWLIST *p, *q; + q = 0; - for (each_window(p)) { + for (each_window(SP_PARM, p)) { + if (&(p->win) == win) { remove_window_from_screen(win); if (q == 0) - _nc_windows = p->next; + WindowList(SP_PARM) = p->next; else q->next = p->next; if (!(win->_flags & _SUBWIN)) { + int i; + for (i = 0; i <= win->_maxy; i++) FreeIfNeeded(win->_line[i].text); } @@ -104,12 +123,12 @@ _nc_freewin(WINDOW *win) free(p); result = OK; - T(("...deleted win=%p", win)); + T(("...deleted win=%p", (void *) win)); break; } q = p; } - _nc_unlock_global(curses); + _nc_nonsp_unlock_global(curses); } } returnCode(result); @@ -123,9 +142,14 @@ NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx NCURSES_CH_T *ptr; int i; - T((T_CALLED("newwin(%d,%d,%d,%d)"), num_lines, num_columns, begy, begx)); + 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) @@ -133,7 +157,9 @@ NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx if (num_columns == 0) num_columns = screen_columns(SP_PARM) - begx; - if ((win = _nc_makenew(num_lines, num_columns, begy, begx, 0)) == 0) + win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx + num_lines, num_columns, begy, begx, 0); + if (win == 0) returnWin(0); for (i = 0; i < num_lines; i++) { @@ -155,9 +181,12 @@ NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx NCURSES_EXPORT(WINDOW *) newwin(int num_lines, int num_columns, int begy, int begx) { - return NCURSES_SP_NAME(newwin) (CURRENT_SCREEN, - num_lines, num_columns, - begy, begx); + WINDOW *win; + _nc_sp_lock_global(curses); + win = NCURSES_SP_NAME(newwin) (CURRENT_SCREEN, + num_lines, num_columns, begy, begx); + _nc_sp_unlock_global(curses); + return (win); } #endif @@ -167,8 +196,11 @@ derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) WINDOW *win; int i; int flags = _SUBWIN; +#if NCURSES_SP_FUNCS + SCREEN *sp = _nc_screen_of(orig); +#endif - T((T_CALLED("derwin(%p,%d,%d,%d,%d)"), orig, num_lines, num_columns, + T((T_CALLED("derwin(%p,%d,%d,%d,%d)"), (void *) orig, num_lines, num_columns, begy, begx)); /* @@ -189,8 +221,10 @@ derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) if (orig->_flags & _ISPAD) flags |= _ISPAD; - if ((win = _nc_makenew(num_lines, num_columns, orig->_begy + begy, - orig->_begx + begx, flags)) == 0) + win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx num_lines, num_columns, + orig->_begy + begy, + orig->_begx + begx, flags); + if (win == 0) returnWin(0); win->_pary = begy; @@ -209,16 +243,21 @@ 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) { - T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), w, l, c, y, x)); - T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx)); + WINDOW *result = 0; - returnWin(derwin(w, l, c, y - w->_begy, x - w->_begx)); + T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), (void *) w, l, c, y, x)); + if (w != 0) { + T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx)); + + result = derwin(w, l, c, y - w->_begy, x - w->_begx); + } + returnWin(result); } static bool dimension_limit(int value) { - NCURSES_SIZE_T test = value; + NCURSES_SIZE_T test = (NCURSES_SIZE_T) value; return (test == value && value > 0); } @@ -233,9 +272,10 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx int i; WINDOWLIST *wp; WINDOW *win; - bool is_pad = (flags & _ISPAD); + bool is_padwin = (flags & _ISPAD); - T((T_CALLED("_nc_makenew(%d,%d,%d,%d)"), num_lines, num_columns, begy, begx)); + T((T_CALLED("_nc_makenew(%p,%d,%d,%d,%d)"), + (void *) SP_PARM, num_lines, num_columns, begy, begx)); if (SP_PARM == 0) returnWin(0); @@ -249,25 +289,25 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx win = &(wp->win); if ((win->_line = typeCalloc(struct ldat, ((unsigned) num_lines))) == 0) { - free(win); + free(wp); returnWin(0); } - _nc_lock_global(curses); + _nc_nonsp_lock_global(curses); win->_curx = 0; win->_cury = 0; - win->_maxy = num_lines - 1; - win->_maxx = num_columns - 1; - win->_begy = begy; - win->_begx = begx; + win->_maxy = (NCURSES_SIZE_T) (num_lines - 1); + win->_maxx = (NCURSES_SIZE_T) (num_columns - 1); + win->_begy = (NCURSES_SIZE_T) begy; + win->_begx = (NCURSES_SIZE_T) begx; win->_yoffset = SP_PARM->_topstolen; - win->_flags = flags; + win->_flags = (short) flags; WINDOW_ATTRS(win) = A_NORMAL; SetChar(win->_nc_bkgd, BLANK_TEXT, BLANK_ATTR); - win->_clear = (is_pad + win->_clear = (is_padwin ? FALSE : (num_lines == screen_lines(SP_PARM) && num_columns == screen_columns(SP_PARM))); @@ -284,7 +324,7 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx win->_parent = 0; win->_regtop = 0; - win->_regbottom = num_lines - 1; + win->_regbottom = (NCURSES_SIZE_T) (num_lines - 1); win->_pad._pad_y = -1; win->_pad._pad_x = -1; @@ -314,12 +354,12 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx * So that's how we want ncurses to behave. */ win->_line[i].firstchar = 0; - win->_line[i].lastchar = num_columns - 1; + win->_line[i].lastchar = (NCURSES_SIZE_T) (num_columns - 1); if_USE_SCROLL_HINTS(win->_line[i].oldindex = i); } - if (!is_pad && (begx + num_columns == screen_columns(SP_PARM))) { + if (!is_padwin && (begx + num_columns == screen_columns(SP_PARM))) { win->_flags |= _ENDLINE; if (begx == 0 && num_lines == screen_lines(SP_PARM) && begy == 0) @@ -329,39 +369,37 @@ NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx win->_flags |= _SCROLLWIN; } - wp->next = _nc_windows; + wp->next = WindowList(SP_PARM); wp->screen = SP_PARM; - _nc_windows = wp; + WindowList(SP_PARM) = wp; - T((T_CREATE("window %p"), win)); + T((T_CREATE("window %p"), (void *) win)); - _nc_unlock_global(curses); + _nc_nonsp_unlock_global(curses); returnWin(win); } -#if NCURSES_SP_FUNCS -NCURSES_EXPORT(WINDOW *) -_nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) -{ - return NCURSES_SP_NAME(_nc_makenew) (CURRENT_SCREEN, - num_lines, num_columns, - begy, begx, flags); -} -#endif - /* * 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) +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(WINDOW *) +_nc_curscr_of(SCREEN *sp) { - SCREEN *sp = 0; + return sp == 0 ? 0 : CurScreen(sp); +} - if (win != 0) { - WINDOWLIST *wp = (WINDOWLIST *) win; - sp = wp->screen; - } - return (sp); +NCURSES_EXPORT(WINDOW *) +_nc_newscr_of(SCREEN *sp) +{ + return sp == 0 ? 0 : NewScreen(sp); } + +NCURSES_EXPORT(WINDOW *) +_nc_stdscr_of(SCREEN *sp) +{ + return sp == 0 ? 0 : StdScreen(sp); +} +#endif