[net.sources] Window library changes

chris@umcp-cs.UUCP (07/24/83)

Well, here's a new set of fixes and fixed files for the window
package.  There's also a man 3 page at the end.  This set of changes
marks version 1.05 of the Maryland Window Library.

				- Chris

: Run this shell script with "sh" not "csh"
PATH=:/bin:/usr/bin:/usr/ucb
export PATH
all=FALSE
if [ $1x = -ax ]; then
	all=TRUE
fi
cat <<'eof' | tee CHANGE
Changes to make to the documentation:
	The SetReal macro was incorrect.  The capital Es should be
	capital Os, ie w->IXE should read w->IXO.

	In the alphabetical list of functions (appendix 2), Wretroline
	was missing the third argument "inwin", and Wsetmargins
	listed had its arguments listed in the wrong order.  The
	correct order is Wsetmargins(w,inxorg,inyorg,inxext,inyext).

Other changes to make:
	Set the version number in open.c to 1.05 and the release
	date to 24-Jul-1983.  Apply the diff -c listing for display.c.

Notes:
	There is a new, hopefully more coherent, README.  There
	is a man page.
eof
/bin/chmod 644 CHANGE
/bin/echo -n '	'; /bin/ls -ld CHANGE
/bin/echo 'Extracting read.c'
sed 's/^X//' <<'//go.sysin dd *' >read.c
#include "win.h"

X/* Copyright (c) 1983 University of Maryland Computer Science Department */

X/* Read back from window at cursor, and advance cursor */
X/* If charonly set returns only char (not mode<<NBPB | char) */
X/* If winonly set returns only char from window (even if not visible) */
Wread (w, charonly, winonly)
register Win *w;
int charonly, winonly;
{
	register Ch *c = w -> w_winbuf +
		(w -> w_cursor.row + w -> IYO) * w -> OXE +
		w -> w_cursor.col + w -> IXO;
	int rv;

	if (!winonly && (c -> Mode & WBUF))
		c = w -> w_bcursor;
	rv = charonly ? c -> Char : c -> ch_all;
	w -> w_cursor.col++;
	w -> w_bcursor++;
	if (w -> w_cursor.col >= w -> IXE) {
		w -> w_cursor.col = 0;
		w -> w_cursor.row++;
		if (w -> w_cursor.row >= w -> IYE)
			w -> w_cursor.row = 0;
		WFixCursor (w);
	}
	if ((w -> w_status & WCURSOR) == 0)
		w -> w_status |= WDUMP;
	return rv;
}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 read.c
	/bin/echo -n '	'; /bin/ls -ld read.c
fi
/bin/echo 'Extracting suspend.c'
sed 's/^X//' <<'//go.sysin dd *' >suspend.c
#include "win.h"
#include <signal.h>

X/* Copyright (c) 1983 University of Maryland Computer Science Department */

int	(*sigset())();

X/* Suspend window system (called on ^Z) */
X/* NOTE: if SigMagic is not set user must make sure that SIGTSTP does what he
   wants */
Wsuspend () {
    int (*oldtstp) (), (*oldint) ();
    static nest, restart;	/* Dont want to recurse */
    if (nest)
	return restart++, 0;
    nest = 1;
top:
    if (SigMagic) {		/* Then save signal definitions */
	sigrelse (SIGTSTP);
	sigrelse (SIGINT);	/* Make sure they arent held */
	/* NOTE: if sigrelse calls Wsuspend "nest" gets us back */
	oldtstp = sigset (SIGTSTP, SIG_IGN);
	oldint = sigset (SIGINT, SIG_IGN);
    }
    restart = 0;
    Wcleanup ();		/* If SigMagic, resets sigs to SIG_DFL */
    kill (0, SIGTSTP);		/* SCREECHing halt */
    if (SigMagic) {
	sighold (SIGTSTP);
	sighold (SIGINT);	/* Hold these for Winit to do its stuff, */
	sigset (SIGTSTP, oldtstp);
	sigset (SIGINT, oldint);/* putting them back where they were */
    }
    /* (void) */ Winit (1, 1);	/* (void) breaks some compilers */
    if (SigMagic) {
	sigrelse (SIGTSTP);
	sigrelse (SIGINT);
	if (restart)		/* If TSTP signal occurred during Winit */
	    goto top;		/* Note: the oldxxx=sigset() is OK because we
				   have already restored the settings */
	Wrefresh ();
	if (restart)		/* If the Wrefresh was suspended */
	    goto top;
    }
    return nest = 0;
}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 suspend.c
	/bin/echo -n '	'; /bin/ls -ld suspend.c
fi
/bin/echo 'Extracting win.h'
sed 's/^X//' <<'//go.sysin dd *' >win.h
X/* Copyright (c) 1983 University of Maryland Computer Science Department */

#define	NBPB	8		/* Number of bits per byte */

union chr {
	struct {
		char ch;	/* NOTE: this is known to be low byte */
		char mode;
	} ch_two;
	short	ch_all;
};

X/* ch_all is set to ' ' or (' '|(WBUF<<NBPB)) so Char must be low byte, and
   Mode must be high byte. */

#define	Char	ch_two.ch
#define	Mode	ch_two.mode

typedef struct {
	int	row, col;
} Pos;

typedef struct {
	int	xorigin, yorigin;
	int	xextent, yextent;
} Rect;

struct coverlist {
	struct coverlist *c_next;
	struct window *c_top,	/* Window on top */
		      *c_bot;	/* Window on bottom */
	Rect	c_area;		/* Area of intersection */
};

typedef union chr		Ch;

struct buffer {
	Ch	*b_contents;
	int	b_nwins;	/* Number of windows using this buffer */
	int	b_nrows,	/* Number of rows of text */
		b_ncols;	/* Number of cols */
	Pos	b_cursor;	/* Buffer cursor (WBputc ()) */
	int	b_nmodw;	/* If zero buffer not modified [see disp.c] */
};

typedef struct coverlist	Cov;
typedef struct buffer		Buf;
typedef struct window		Win;

struct window {
	Win	*w_next;	/* Next window in list */
	int	w_id;		/* Window ID */
	Rect	w_outside;	/* Describes whole window */
	Rect	w_inside;	/* Describes inner part of window */
	Buf	*w_textbuf;	/* Pointer to buffer containing text */
	Ch	*w_winbuf;	/* Pointer to window chars */
	Pos	w_bstart;	/* Coordinates of win projection on w_buf */
	Pos	w_cursor;	/* Coordinates of cursor */
	Pos	w_auxcursor;	/* Coordinates of aux cursor */
	Ch	*w_bcursor;	/* Cursor ptr into text [w_textbuf] */
	Ch	*w_wcursor;	/* Cursor ptr into window [w_auxcursor] */
	int	w_popup;	/* Number of lines to scroll */
	char	w_mode;		/* Current text-writing mode */
	char	w_status;	/* Status bits */
};

#define	OXO	w_outside.xorigin
#define	OXE	w_outside.xextent
#define	OYO	w_outside.yorigin
#define	OYE	w_outside.yextent

#define	IXO	w_inside.xorigin
#define	IXE	w_inside.xextent
#define	IYO	w_inside.yorigin
#define	IYE	w_inside.yextent

X/* Mode bits (w_mode, ch_two.mode) */
#define	WBOLD	0x01		/* Bold */
#define	WULINE	0x02		/* Underlined */
#define	WBLINK	0x04		/* Blinking */
#define	WINVERSE 0x08		/* Inverse video */
#define	MODEMASK (WBOLD|WULINE|WBLINK|WINVERSE)  /* [all chars] */
#define	WINVIS	0x10		/* Invisible [windows only] */
#define	WBUF	0x20		/* From buffer [windows only] */

X/* Status bits (w_status) */
#define	WWRAPOFF 0x01		/* Auto-wrap is off */
#define	WHIDDEN  0x02		/* Window is hidden */
#define	WNEWLINE 0x04		/* \r, \n act like \r\n */
#define	WCURSOR  0x08		/* Cursor is hidden */
#define	WDUMP	 0x10		/* Window contents need dumping to screen */
#define	WCOVERED 0x20		/* Window is covered */
#define	WCOVERING 0x40		/* Window is covering others */
#define	WBORDERED 0x80		/* Window has been bordered (framed) */

extern Win *WinList;		/* Base of window list */
extern Win *CurWin;		/* Current window */
extern Cov *WCovList;		/* Base of coverings list */
extern Rect WBox;		/* Information on the (single) box */
extern int MajorUpdate;		/* True iff maximum optimization wanted */
extern int SigMagic;		/* True iff sigset() magic is wanted */
extern long InputPending;	/* True iff keyboard input is pending */
extern int LastRedisplayPaused;	/* True iff last redisplay paused */
extern int ScreenGarbaged;	/* True iff screen contents uncertain */
extern int WBoxActive;		/* True iff box is active */
extern int WSetRealCursor;	/* True iff want terminal cursor positioning */
extern int WRCurRow;		/* Set real cursor to this row, */
extern int WRCurCol;		/* ... this col [both 0 origin] */
extern int VisibleBell;		/* True iff want ^G to flash */
extern int WindowsActive;	/* Set while windows (stty settings) active */

#define	Max(a,b)	((a)>(b)?(a):(b))
#define	Min(a,b)	((a)<(b)?(a):(b))
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 win.h
	/bin/echo -n '	'; /bin/ls -ld win.h
fi
/bin/echo 'Extracting window.h'
sed 's/^X//' <<'//go.sysin dd *' >window.h
X/* Copyright (c) 1983 University of Maryland Computer Science Department */

#include "win.h"

#define	Wwrap(w,on)	((w)->w_status &= ~WWRAPOFF,	\
			 (w)->w_status |= (on)?0:WWRAPOFF, 0)
#define	Wnewline(w,on)	((w)->w_status &= ~WNEWLINE,	\
			 (w)->w_status |= (on)?WNEWLINE:0, 0)
#define	Wsetmode(w,m)	((w)->w_mode &= ~MODEMASK,	\
			 (w)->w_mode |= (m) & MODEMASK, 0)
#define	Wsetpopup(w,p)	((w)->w_popup = (p), 0)
#define	Wcurup(w,n)	(WAcursor (w,			\
			 (w)->w_cursor.row+(w)->w_bstart.row-(n),\
			 (w)->w_cursor.col+(w)->w_bstart.col))
#define	Wcurdown(w,n)	(WAcursor (w,			\
			 (w)->w_cursor.row+(w)->w_bstart.row+(n),\
			 (w)->w_cursor.col+(w)->w_bstart.col))
#define	Wcurleft(w,n)	(WAcursor (w,			\
			 (w)->w_cursor.row+(w)->w_bstart.row,\
			 (w)->w_cursor.col+(w)->w_bstart.col-(n)))
#define	Wcurright(w,n)	(WAcursor (w,			\
			 (w)->w_cursor.row+(w)->w_bstart.row,\
			 (w)->w_cursor.col+(w)->w_bstart.col+(n)))
#define	WWtoBcursor(w)	(WAcursor (w,			\
			 (w)->w_textbuf->b_cursor.row-(w)->IYO,\
			 (w)->w_textbuf->b_cursor.col-(w)->IXO))

X/* NOTE: THESE MACROS MAY BE SYSTEM DEPENDENT */
#define	WCHAROF(c)	((c)&0377)
#define	WMODEOF(c)	((c)>>NBPB)

X/* Function types for non-integer functions */
Win *Wopen (), *Wlink (), *Wfind (), *Wboxfind ();
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 window.h
	/bin/echo -n '	'; /bin/ls -ld window.h
fi
/bin/echo 'Extracting bdelchars.c'
sed 's/^X//' <<'//go.sysin dd *' >bdelchars.c
#include "win.h"

X/* Copyright (c) 1983 University of Maryland Computer Science Department */

X/* Delete n chars from buffer at cursor */
WBdelchars (w, n)
Win *w;
int n;
{
	register Buf *b;
	register Ch *cp, *ct, *cend;
	int blank;

	if (n < 0)
		return -1;
	if (n == 0)
		return 0;
	b = w -> w_textbuf;
	if (n + b -> b_cursor.col > b -> b_ncols)
		n = b -> b_ncols - b -> b_cursor.col;
	blank = ' ' | (w -> w_mode << NBPB);

	ct = b -> b_contents + b -> b_cursor.row * b -> b_ncols;
	cend = ct + b -> b_ncols;
	ct += b -> b_cursor.col;
	cp = ct + n;
	while (cp < cend)
		ct++ -> ch_all = cp++ -> ch_all;
	while (ct < cend)
		ct++ -> ch_all = blank;
	b -> b_nmodw = -1;
	return 0;
}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 bdelchars.c
	/bin/echo -n '	'; /bin/ls -ld bdelchars.c
fi
/bin/echo 'Extracting binschars.c'
sed 's/^X//' <<'//go.sysin dd *' >binschars.c
#include "win.h"

X/* Copyright (c) 1983 University of Maryland Computer Science Department */

X/* Insert n blanks in buffer at cursor */
WBinschars (w, n)
Win *w;
int n;
{
	register Buf *b;
	register Ch *cp, *ct, *start;
	int blank;

	if (n < 0)
		return -1;
	if (n == 0)
		return 0;
	b = w -> w_textbuf;
	if (n + b -> b_cursor.col > b -> b_ncols)
		n = b -> b_ncols - b -> b_cursor.col;
	blank = ' ' | (w -> w_mode << NBPB);

	ct = b -> b_contents + b -> b_cursor.row * b -> b_ncols;
	start = ct + b -> b_cursor.col;
	ct += b -> b_ncols;
	cp = ct - n;
	while (cp > start)
		(--ct) -> ch_all = (--cp) -> ch_all;
	while (ct > start)
		(--ct) -> ch_all = blank;
	b -> b_nmodw = -1;
	return 0;
}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 binschars.c
	/bin/echo -n '	'; /bin/ls -ld binschars.c
fi
/bin/echo 'Extracting README'
sed 's/^X//' <<'//go.sysin dd *' >README
Note:  Comments are in [square brackets].

Installation
------------

Look at the Makefile for installation instructions.  Everything is
set up for a Vax running Berkeley Unix.  If you're running Berkeley
Unix, you should only need to ``make winlib.a'' followed by a ``make
install''.

Not on a Vax?
-------------

If you're not on a Vax, several changes are in order.  First, take
out the -DVAX flag in the Makefile.  Second, find out whether the
definition of union chr in win.h must be changed.  For a 68000,
the two char elements should be reversed.  Third, you'll probably
get a name conflict on WBclear and WBclearline, and on setmode and
setmodes in TrmTERM.c.  [Wonderful how the eight-character limit
turns into 7 after compiling]  For the first, add the following
line to win.h:

#define WBclearline     WBclrln

For the second, add the following line to the top of TrmTERM.c:

#define setmodes        smodes

Fourth, you may get an error in init.c (something like "Undefined:
_IOLBF").  If so, change the appropriate line to remove the "_IOLBF|"
from it.  [So much for "standard" I/O]

Finally, you may not have ranlib.  See the Makefile for an alternative.

The above changes were sufficient to make winlib run on a Sun
Microsystems workstation and on a Codata CTW-300.  (Both are 68000
based.)

Berkeley 2.8, Anyone?
---------------------

More changes were sent from someone bringing up windows on a PDP11
running Berkeley 2.8+ (2.8 with many 4.1a features):

1.  Ranlib didn't work correctly; using the TSORT file worked.

2.  globals.c didn't properly define the global variables because
it includes win.h (which marks them external).  [This sounds like
a compiler bug]  The solution used was to extract the type definitions
from win.h and put them in globals.c, and to define a routine
Windummy(){} in globals.c and call it from init.c (otherwise the
linker ignored globals.o [sounds like a linker bug]).  [Another
possibility is to move the definition of NoOperation to globals.c,
although it doesn't really belong there.]

Too big?
--------

Windows is undeniably large.  It can be shrunk considerably by
changing two constants defined in display.c, namely MScreenLength
and MScreenWidth.  These are the sizes-plus-one of the largest
screen that can be handled.  It's currently set up to handle up to
60 lines and up to 135 columns.

Also, you could eliminate some of the Trm*.c terminal drivers.
This requires a bit of modification to display.c as well.  Near
the bottom of display.c there is a table of terminal types and
drivers.  It should be reasonably obvious how to modify this.

But it's so slow!
-----------------

The TrmTERM.c code for cursor motion is ridiculous.  I will probably
eventually rewrite the whole module.  For now, if you have a
particular terminal, write a special driver for it.  See the second
paragraph under "Too Big?" for more info.

For greater speed, you may want to try rewriting bcopy (bcopy.c)
and/or CopyLine (display.c) in assembly code.  I found rewriting
bcopy to copy by words and changing CopyLine to call bcopy to copy
the line text sufficient on the Sun.
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 README
	/bin/echo -n '	'; /bin/ls -ld README
fi
/bin/echo 'Extracting diff-c-display'
sed 's/^X//' <<'//go.sysin dd *' >diff-c-display
*** display.c.old	Sun Jul 17 19:34:44 1983
--- display.c	Mon Jul 18 01:25:55 1983
***************
*** 77,82
  #define	ScreenWidth (W_tt.t_width)
  #define ScreenLength (W_tt.t_length)
  
  #define MScreenWidth 135
  #define MScreenLength 60
  #define min(a,b) (a<b ? a : b)

--- 77,84 -----
  #define	ScreenWidth (W_tt.t_width)
  #define ScreenLength (W_tt.t_length)
  
+ /* These two numbers are actually one greater than the maximum allowed
+    screen width/length */
  #define MScreenWidth 135
  #define MScreenLength 61
  #define min(a,b) (a<b ? a : b)
***************
*** 78,84
  #define ScreenLength (W_tt.t_length)
  
  #define MScreenWidth 135
! #define MScreenLength 60
  #define min(a,b) (a<b ? a : b)
  #define max(a,b) (a>b ? a : b)
  #define hidden static

--- 80,86 -----
  /* These two numbers are actually one greater than the maximum allowed
     screen width/length */
  #define MScreenWidth 135
! #define MScreenLength 61
  #define min(a,b) (a<b ? a : b)
  #define max(a,b) (a>b ? a : b)
  #define hidden static
***************
*** 180,187
  
  visible int
  	    ScreenGarbaged,	/* set to 1 iff screen content is
! 				   uncertain. */
! 	    InputPending,	/* true iff input is known to be pending */
  	    LastRedisplayPaused,/* true iff last redisplay paused */
  #ifdef DEBUG
  	    RDdebug,		/* line redraw debug switch */

--- 182,188 -----
  
  visible int
  	    ScreenGarbaged,	/* set to 1 iff screen content is
! 	    			   uncertain. */
  	    LastRedisplayPaused,/* true iff last redisplay paused */
  #ifdef DEBUG
  	    RDdebug,		/* line redraw debug switch */
***************
*** 191,196
  				   virtual screen. */
  	    WDleft;		/* number of columns left on the current
  				   line of the virtual screen. */
  visible Ch
  	    *WDcursor;		/* pointer into a line object, indicates
  				   where to put the next character */

--- 192,199 -----
  				   virtual screen. */
  	    WDleft;		/* number of columns left on the current
  				   line of the virtual screen. */
+ visible long
+ 	    InputPending;	/* true iff input is known to be pending */
  visible Ch
  	    *WDcursor;		/* pointer into a line object, indicates
  				   where to put the next character */
***************
*** 220,228
  	    && (p = DesiredScreen[WDCurrentLine]) -> length
  	    <= (n = ScreenWidth - WDleft))
  	p -> length = WDleft > 0 ? n : ScreenWidth;
!     if (!DesiredScreen[row])
! 	DesiredScreen[row] = newline ();
!     (p = DesiredScreen[row]) -> hash = 0;
      p -> touched = 1;
      WDcursor = &p -> body[col - 1];
      WDCurrentLine = row;

--- 223,231 -----
  	    && (p = DesiredScreen[WDCurrentLine]) -> length
  	    <= (n = ScreenWidth - WDleft))
  	p -> length = WDleft > 0 ? n : ScreenWidth;
!     if ((p = DesiredScreen[row]) == 0)
! 	DesiredScreen[row] = p = newline ();
!     p -> hash = 0;
      p -> touched = 1;
      WDcursor = &p -> body[col - 1];
      WDCurrentLine = row;
***************
*** 244,250
  /* 'hashline' computes a hash value for a line, unless the hash value
     is already known.  This hash code has a few important properties:
  	- it is independant of the number of leading and trailing spaces
! 	- it will never be zero
   
     As a side effect, an estimate of the cost of redrawing the line is
     calculated */

--- 247,253 -----
  /* 'hashline' computes a hash value for a line, unless the hash value
     is already known.  This hash code has a few important properties:
  	- it is independant of the number of leading and trailing spaces
! 	- it will never be zero (nor 12345)
   
     As a side effect, an estimate of the cost of redrawing the line is
     calculated */
***************
*** 989,998
      rv = (*W_tt.t_init) (baud_rate);
      if (rv)
  	return rv;
!     if (W_tt.t_length > MScreenLength)
! 	W_tt.t_length = MScreenLength;
!     if (W_tt.t_width > MScreenWidth)
! 	W_tt.t_width = MScreenWidth;
      (*W_tt.t_reset) ();
      return 0;
  }

--- 992,1001 -----
      rv = (*W_tt.t_init) (baud_rate);
      if (rv)
  	return rv;
!     if (W_tt.t_length >= MScreenLength)
! 	W_tt.t_length = MScreenLength - 1;
!     if (W_tt.t_width >= MScreenWidth)
! 	W_tt.t_width = MScreenWidth - 1;
      (*W_tt.t_reset) ();
      return 0;
  }
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 diff-c-display
	/bin/echo -n '	'; /bin/ls -ld diff-c-display
fi
/bin/echo 'Extracting winlib.3'
sed 's/^X//' <<'//go.sysin dd *' >winlib.3
X.TH WINLIB 3 "U of Maryland"
X.SH NAME
winlib \- high level window display and screen control package
X.SH SYNOPSIS
X.B cc
[ flags ] files
X.B \-lwinlib \-ljobs \-ltermlib
[ libraries ]
X.SH DESCRIPTION
These routines allow for the creation, manipulation, and destruction of
X.BR windows .
In order to use them the user must
X.BR "#include <local/window.h>" .
The function
X.I Winit(settings,nomagic)
initializes the window system;
X.I Wrefresh(SkipInputCheck)
updates the screen; and
X.I Wcleanup()
cleans up after the mess.  The parameters to
X.I Winit()
are noramally both zero, but
X.I settings
may be a pointer to a
X.B "struct sgttyb"
and nomagic may be non-zero to disable default signal handling.  The
argument to
X.I Wrefresh()
is normally zero, but may be nonzero to force a refresh regardless of
pending input.  The functions are listed below.  In the listing,
X.I w
implies a parameter of type
X.BR "Win\ *" ,
X.I c
implies type
X.BR char ,
X.I s
implies type
X.BR "char\ *" ,
and
X.I m
is an integer parameter made up of zero or more of the constants WBOLD,
WULINE, WINVERSE, and WBLINK (\fImode\fRs).
Other parameters are of type
X.B int
unless otherwise specified.
X.SH SEE ALSO
X.I "The Maryland Window Library,"
Chris Torek,
X.br
signal(2),
stty(2),
jobs(3j),
setenv(3),
tty(4),
termcap(5)
X.SH AUTHOR
Chris Torek
X.SH FUNCTIONS
X.nf
X.ta 3i
X.tc .
Ding()	ring terminal's bell
Max(a,b)	return the maximum of (a,b)
Min(a,b)	return the minimum of (a,b)
WAcursor(w,row,col)	move window cursor absolute
WAread(w,charonly)	read window at aux cursor
WBclear(w,howto)	clear buffer
WBclearline(w,howto)	clear buffer line
WBcursor(w,row,col)	move buffer cursor
WBdelchars(w,n)	delete characters from buffer
WBdelcols(w,n)	delete columns from buffer
WBdellines(w,n)	delete lines from buffer
WBinschars(w,n)	insert characters in buffer
WBinscols(w,n)	insert columns in buffer
WBinslines(w,n)	insert lines in buffer
WBputc(c,w)	put character to buffer
WBputs(s,w)	put string to buffer
WBread(w,charonly)	read back from buffer
WBscroll(w,rows)	scroll buffer
WBtoWcursor(w)	move buffer cursor to underneath window cursor
WCHAROF(c)	character portion of read-back integer \fIc\fR
WMODEOF(c)	mode portion of read-back integer \fIc\fR
WWcursor(w,row,col)	move window cursor window relative
WWtoBcursor(w)	move window cursor to above buffer cursor
Waputc(c,m,w)	put character to winbuf at aux cursor
Waputs(s,m,w)	put string to winbuf at aux cursor
Wauxcursor(w,row,col)	move aux cursor
Wback(w)	move window to the back of the screen
Wborder(w,ulc,top,urc,left,right,llc,bottom,lrc)	border window with specified characters
Wbox(xorg,yorg,xext,yext)	activate the box
\fBWin *\fRWboxfind()	return window pointed to by the box
Wcleanup()	clean up terminal settings
Wclear(w,howto)	clear window
Wclearline(w,howto)	clear window line
Wclose(w)	close window
Wcloseall()	close all windows
Wcurdown(w,n)	move window cursor down
Wcurleft(w,n)	move window cursor left
Wcurright(w,n)	move window cursor right
Wcurup(w,n)	move window cursor up
Wdelchars(w,n)	delete characters from window
Wdelcols(w,n)	delete columns from window
Wdellines(w,n)	delete lines from window
Wexit(code)	call Wcleanup(), call exit(code)
Wfiledump(file)	dump virtual screen to named \fBchar *\fIfile\fR
\fBWin *\fRWfind(id)	return window with id \fIid\fR
Wframe(w)	frame window
Wfront(w)	move window to the front of the screen
Wgetframe(ulc,top,urc,left,right,llc,bottom,lrc)	set the \fBchar *\fR arguments to the frame characters
Whide(w)	hide window
Winit(settings,nomagic)	initialize windows
Winschars(w,n)	insert characters in window
Winscols(w,n)	insert columns in window
Winslines(w,n)	insert lines in window
Wlabel(w,label,bottom,center)	label window with \fBchar *\fIlabel\fR
\fBWin *\fRWlink(ew,id,xorg,yorg,xext,yext,bcols,brows)	link to existing window \fIew\fR
Wmove(w,xorg,yorg)	reposition window
Wnewline(w,on)	set auto-newline mode
Woncursor(w,on)	set window cursor visibility
\fBWin *\fRWopen(id,xorg,yorg,xext,yext,bcols,brows)	open a window
Wputc(c,w)	put character to window
Wputs(s,w)	put string to window
Wread(w,charonly,winonly)	read back from window
Wrefresh(SkipInputCheck)	refresh screen
Wrelscroll(w,rows,cols,cwin)	scroll window over buffer
Wretroline(w,m,inwin)	retroactively paint a line
Wscreensize(rows,cols)	set \fBint *\fIrows, *cols\fR to screen size
Wscroll(w)	scroll window w
Wsetbuf(w,bcols,brows)	set buffering
Wsetframe(ulc,top,urc,left,right,llc,bottom,lrc)	set the frame characters
Wsetmargins(w,inxorg,inyorg,inxext,inyext)	set window margins
Wsetmode(w,m)	set text-writing mode
Wsetpopup(w,p)	set popup
Wsize(w,xext,yext)	change window size
Wsuspend()	suspend session (^Z)
Wunhide(w)	unhide window
Wwrap(w,n)	set autowrap mode
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 winlib.3
	/bin/echo -n '	'; /bin/ls -ld winlib.3
fi
-- 
In-Real-Life:	Chris Torek, Univ of MD Comp Sci
UUCP:		{seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet:		chris@umcp-cs
ARPA:		chris.umcp-cs@UDel-Relay