Minix2.0/src/lib/curses/winscrol.c

/****************************************************************/
/* Scroll() routine of the PCcurses package			*/
/*								*/
/****************************************************************/
/* This version of curses is based on ncurses, a curses version	*/
/* Originally written by Pavel Curtis at Cornell University.	*/
/* I have made substantial changes to make it run on IBM PC's,	*/
/* And therefore consider myself free to make it public domain.	*/
/*		Bjorn Larsson (...mcvax!enea!infovax!bl)	*/
/****************************************************************/
/* 1.0:	Release:					870515	*/
/****************************************************************/
/* Modified to run under the MINIX operating system by Don Cope */
/* These changes are also released into the public domain.      */
/* 							900906  */
/****************************************************************/

#include <curses.h>
#include "curspriv.h"

/****************************************************************/
/* Scroll() scrolls the scrolling region of 'win', but only if	*/
/* Scrolling is allowed and if the cursor is inside the scrol-	*/
/* Ling region.							*/
/****************************************************************/

void scroll(win)
WINDOW *win;
{
  int i;
  int *ptr;
  int *temp;
  static int blank;

  blank = ' ' | (win->_attrs & ATR_MSK);
  if ((!win->_scroll)		/* check if window scrolls */
      ||(win->_cury < win->_regtop)	/* and cursor in region */
      ||(win->_cury > win->_regbottom)
	)
	return;

  temp = win->_line[win->_regtop];
  for (i = win->_regtop; i < win->_regbottom; i++) {
	win->_line[i] = win->_line[i + 1];	/* re-arrange line pointers */
	win->_minchng[i] = 0;
	win->_maxchng[i] = win->_maxx;
  }
  for (ptr = temp; ptr - temp <= win->_maxx; ptr++)
	*ptr = blank;		/* make a blank line */
  win->_line[win->_regbottom] = temp;
  if (win->_cury > win->_regtop)/* if not on top line */
	win->_cury--;		/* cursor scrolls too */
  win->_minchng[win->_regbottom] = 0;
  win->_maxchng[win->_regbottom] = win->_maxx;
}				/* scroll */