blob: ffe8d0d94a7d90323d0f59c379c10b067e2280ad [file] [log] [blame]
/* PDCurses */
#include <curspriv.h>
/*man-start**************************************************************
scroll
------
### Synopsis
int scroll(WINDOW *win);
int scrl(int n);
int wscrl(WINDOW *win, int n);
### Description
scroll() causes the window to scroll up one line. This involves
moving the lines in the window data strcture.
With a positive n, scrl() and wscrl() scroll the window up n lines
(line i + n becomes i); otherwise they scroll the window down n
lines.
For these functions to work, scrolling must be enabled via
scrollok(). Note also that scrolling is not allowed if the supplied
window is a pad.
### Return Value
All functions return OK on success and ERR on error.
### Portability
X/Open ncurses NetBSD
scroll Y Y Y
scrl Y Y Y
wscrl Y Y Y
**man-end****************************************************************/
int wscrl(WINDOW *win, int n)
{
int i, l, dir, start, end;
chtype blank, *temp;
/* Check if window scrolls. Valid for window AND pad */
if (!win || !win->_scroll || !n)
return ERR;
blank = win->_bkgd;
if (n > 0)
{
start = win->_tmarg;
end = win->_bmarg;
dir = 1;
}
else
{
start = win->_bmarg;
end = win->_tmarg;
dir = -1;
}
for (l = 0; l < (n * dir); l++)
{
temp = win->_y[start];
/* re-arrange line pointers */
for (i = start; i != end; i += dir)
win->_y[i] = win->_y[i + dir];
win->_y[end] = temp;
/* make a blank line */
for (i = 0; i < win->_maxx; i++)
*temp++ = blank;
}
touchline(win, win->_tmarg, win->_bmarg - win->_tmarg + 1);
PDC_sync(win);
return OK;
}
int scrl(int n)
{
PDC_LOG(("scrl() - called\n"));
return wscrl(stdscr, n);
}
int scroll(WINDOW *win)
{
PDC_LOG(("scroll() - called\n"));
return wscrl(win, 1);
}