#include <curses.priv.h>
MODULE_ID("$Id: wresize.c,v 1.1.1.2 2002/01/03 23:53:42 jevans Exp $")
#define DOALLOC(p,t,n) typeRealloc(t, n, p)
#define ld_ALLOC(p,n) DOALLOC(p,struct ldat,n)
#define c_ALLOC(p,n) DOALLOC(p,NCURSES_CH_T,n)
NCURSES_EXPORT(int)
wresize(WINDOW *win, int ToLines, int ToCols)
{
register int row;
int size_x, size_y;
struct ldat *pline;
NCURSES_CH_T blank;
#ifdef TRACE
T((T_CALLED("wresize(%p,%d,%d)"), win, ToLines, ToCols));
if (win) {
TR(TRACE_UPDATE, ("...beg (%d, %d), max(%d,%d), reg(%d,%d)",
win->_begy, win->_begx,
win->_maxy, win->_maxx,
win->_regtop, win->_regbottom));
if (_nc_tracing & TRACE_UPDATE)
_tracedump("...before", win);
}
#endif
if (!win || --ToLines < 0 || --ToCols < 0)
returnCode(ERR);
size_x = win->_maxx;
size_y = win->_maxy;
if (ToLines == size_y
&& ToCols == size_x)
returnCode(OK);
if ((win->_flags & _SUBWIN)) {
if (win->_pary + ToLines > win->_parent->_maxy
|| win->_parx + ToCols > win->_parent->_maxx) {
returnCode(ERR);
}
pline = win->_parent->_line;
} else {
pline = 0;
}
if (ToLines != size_y) {
if (!(win->_flags & _SUBWIN)) {
for (row = ToLines + 1; row <= size_y; row++)
free((char *) (win->_line[row].text));
}
win->_line = ld_ALLOC(win->_line, ToLines + 1);
if (win->_line == 0)
returnCode(ERR);
for (row = size_y + 1; row <= ToLines; row++) {
win->_line[row].text = 0;
win->_line[row].firstchar = 0;
win->_line[row].lastchar = ToCols;
if ((win->_flags & _SUBWIN)) {
win->_line[row].text =
&pline[win->_pary + row].text[win->_parx];
}
}
}
blank = win->_nc_bkgd;
for (row = 0; row <= ToLines; row++) {
NCURSES_CH_T *s = win->_line[row].text;
int begin = (s == 0) ? 0 : size_x + 1;
int end = ToCols;
if_USE_SCROLL_HINTS(win->_line[row].oldindex = row);
if (ToCols != size_x || s == 0) {
if (!(win->_flags & _SUBWIN)) {
win->_line[row].text = s = c_ALLOC(s, ToCols + 1);
if (win->_line[row].text == 0)
returnCode(ERR);
} else if (s == 0) {
win->_line[row].text = s =
&pline[win->_pary + row].text[win->_parx];
}
if (end >= begin) {
if (win->_line[row].firstchar < begin)
win->_line[row].firstchar = begin;
win->_line[row].lastchar = ToCols;
do {
s[end] = blank;
} while (--end >= begin);
} else {
win->_line[row].firstchar = 0;
win->_line[row].lastchar = ToCols;
}
}
}
win->_maxx = ToCols;
win->_maxy = ToLines;
if (win->_regtop > win->_maxy)
win->_regtop = win->_maxy;
if (win->_regbottom > win->_maxy
|| win->_regbottom == size_y)
win->_regbottom = win->_maxy;
if (win->_curx > win->_maxx)
win->_curx = win->_maxx;
if (win->_cury > win->_maxy)
win->_cury = win->_maxy;
#ifdef TRACE
TR(TRACE_UPDATE, ("...beg (%d, %d), max(%d,%d), reg(%d,%d)",
win->_begy, win->_begx,
win->_maxy, win->_maxx,
win->_regtop, win->_regbottom));
if (_nc_tracing & TRACE_UPDATE)
_tracedump("...after:", win);
#endif
returnCode(OK);
}