Window source #3 [of 0-7]: misc source

chris at umcp-cs.UUCP chris at umcp-cs.UUCP
Sun Jul 3 17:14:46 AEST 1983


: 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
/bin/echo 'Extracting cleanup.c'
sed 's/^X//' <<'//go.sysin dd *' >cleanup.c
X/* Initialize, suspend, resume, and exit routines */
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X/*	Original code copyright (c) 1981,1980 James Gosling	*/
X
X/* ACT 11-Nov-1982 modified for window package */
X
X#include "win.h"
X#include "display.h"
X#include <sys/ioctl.h>
X#include <sgtty.h>
X#include <stdio.h>
X#include <signal.h>
X
Xstruct sgttyb WOld;		/* The initial tty mode bits */
Xint	WTtyFd;			/* File descriptor for stty/gtty */
Xint	(*sigset())();
Xextern	Wexit (), Wsuspend ();
X
XWcleanup () {
X    if (SigMagic) {
X	sigignore (SIGTSTP);
X	sigignore (SIGINT);
X    }
X    if (W_tt.t_window) (*W_tt.t_window) (0);
X    (*W_tt.t_topos) (ScreenLength, 1);
X    (*W_tt.t_wipeline) (0, ScreenWidth);
X    (*W_tt.t_cleanup) ();
X    fflush (stdout);
X    ioctl (WTtyFd, TIOCSETN, &WOld);
X    if (SigMagic) {
X	sigset (SIGTSTP, SIG_DFL);
X	sigset (SIGINT, SIG_DFL);
X    }
X    WindowsActive = 0;
X    return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 cleanup.c
	/bin/echo -n '	'; /bin/ls -ld cleanup.c
fi
/bin/echo 'Extracting clear.c'
sed 's/^X//' <<'//go.sysin dd *' >clear.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Clear inside of window w, and corresponding portion of text buffer */
XWclear (w, howto)
Xregister Win *w;
Xint howto;
X{
X	register Ch *cp, *bp;
X	register Buf *b = w -> w_textbuf;
X	register i, j;
X	int i2;
X
X	switch (howto) {
X	case 0:			/* Clear from cursor to end */
X	default:
X		Wclearline (w, 0);/* Clr ln from cursor */
X		cp = w -> w_winbuf +
X			(w -> w_cursor.row + 1 + w -> IYO) * w -> OXE +
X			w -> IXO;
X		bp = b -> b_contents +
X			(w->w_cursor.row+1+w->IYO+w->w_bstart.row)*b->b_ncols +
X			w -> w_bstart.col + w -> IXO;
X		i2 = w -> IYE - w -> w_cursor.row - 1;
X		break;
X	case 1:			/* Clear from beginning to cursor */
X		Wclearline (w, 1);/* Clr ln to cursor */
X		cp = w -> w_winbuf + w -> IYO * w -> OXE + w -> IXO;
X		bp = b -> b_contents +
X			(w -> w_bstart.row + w -> IYO) * b -> b_ncols +
X			w -> w_bstart.col + w -> IXO;
X		i2 = w -> w_cursor.row;
X		break;
X	case 2:			/* Clear all of window */
X		cp = w -> w_winbuf + w -> IYO * w -> OXE + w -> IXO;
X		bp = b -> b_contents +
X			(w -> w_bstart.row + w -> IYO) * b -> b_ncols +
X			(w -> w_bstart.col + w -> IXO);
X		i2 = w -> IYE;
X		break;
X	}
X	for (i = 0; i < i2; i++) {
X		for (j = 0; j < w -> IXE; j++) {
X			cp -> Mode &= ~MODEMASK;
X			cp -> Mode |= WBUF;
X			cp++ -> Char = ' ';
X			bp++ -> ch_all = ' ' | (w -> w_mode << NBPB);
X		}
X		cp += w -> OXE - j;
X		bp += b -> b_ncols - j;
X	}
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 clear.c
	/bin/echo -n '	'; /bin/ls -ld clear.c
fi
/bin/echo 'Extracting clearline.c'
sed 's/^X//' <<'//go.sysin dd *' >clearline.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Clear cursor line of window and corresponding portion of buffer */
XWclearline (w, howto)
Xregister Win *w;
Xint howto;
X{
X	register Ch *cp, *bp;
X	register Buf *b = w -> w_textbuf;
X	register i, i2;
X
X	cp = w -> w_winbuf +
X		(w -> w_cursor.row + w -> IYO) * w -> OXE + w -> IXO;
X	bp = b -> b_contents +
X		(w->w_cursor.row + w->IYO + w->w_bstart.row) * b->b_ncols +
X		w -> IXO + w -> w_bstart.col;
X	switch (howto) {
X	case 0:			/* Cursor to end of line */
X	default:
X		cp += w -> w_cursor.col;
X		bp += w -> w_cursor.col;
X		i2 = w -> IXE - w -> w_cursor.col;
X		break;
X	case 1:			/* Cursor to begin. of line */
X		i2 = w -> w_cursor.col;
X		break;
X	case 2:			/* Entire line */
X		i2 = w -> IXE;
X		break;
X	}
X	for (i = 0; i < i2; i++) {
X		cp -> Mode &= ~MODEMASK;
X		cp -> Mode |= WBUF;
X		cp++ -> Char = ' ';
X		bp++ -> ch_all = ' ' | (w -> w_mode << NBPB);
X	}
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 clearline.c
	/bin/echo -n '	'; /bin/ls -ld clearline.c
fi
/bin/echo 'Extracting close.c'
sed 's/^X//' <<'//go.sysin dd *' >close.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Close a window */
XWclose (w)
Xregister Win *w;
X{
X	register Win *p;
X
X	WErase (w);		/* Clean it off screen */
X	WRemoveCoverList (w);	/* Uncover all other windows */
X
X	/* Unlink window & free space */
X
X	if (WinList == w)
X		WinList = w -> w_next;
X	else {
X		for (p = WinList; p -> w_next != w; p = p -> w_next)
X			;
X		p -> w_next = w -> w_next;
X	}
X	free (w -> w_winbuf);
X	if (--(w -> w_textbuf -> b_nwins) <= 0) {
X		free (w -> w_textbuf -> b_contents);
X		free (w -> w_textbuf);
X	}
X	free (w);
X	if (w == CurWin)
X		CurWin = WinList;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 close.c
	/bin/echo -n '	'; /bin/ls -ld close.c
fi
/bin/echo 'Extracting closeall.c'
sed 's/^X//' <<'//go.sysin dd *' >closeall.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Close all windows (for "resetting") */
XWcloseall () {
X	register Win *w;
X
X	for (w = WinList; w; w = w -> w_next)
X		Wclose (w);
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 closeall.c
	/bin/echo -n '	'; /bin/ls -ld closeall.c
fi
/bin/echo 'Extracting cover.c'
sed 's/^X//' <<'//go.sysin dd *' >cover.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Routines dealing with cover information */
X
X/* Compute all windows that w covers or that cover w; place them on the
X   appropriate list. */
XWComputeCover (w)
Xregister Win *w;
X{
X	register Win *wp;
X	register after = 0;	/* Initial windows cover w */
X
X	for (wp = WinList; wp; wp = wp -> w_next) {
X		if (wp == w)
X			after++;/* w covers remaining windows */
X		if (wp == w || (wp -> w_status & WHIDDEN))
X			continue;
X
X		/* Do they overlap? */
X
X		if (w -> OXO + w -> OXE <= wp -> OXO)
X			continue;
X		if (w -> OYO + w -> OYE <= wp -> OYO)
X			continue;
X		if (w -> OXO >= wp -> OXO + wp -> OXE)
X			continue;
X		if (w -> OYO >= wp -> OYO + wp -> OYE)
X			continue;
X
X		/* Yes, they overlap */
X
X		if (after)	/* w covers wp */
X			WDoCover (w, wp);
X		else		/* wp covers w */
X			WDoCover (wp, w);
X	}
X}
X
X/* Window t covers window b.  Update cover list and WINVIS bits. */
Xstatic
XWDoCover (t, b)
Xregister Win *t, *b;
X{
X	register i, j;
X	int i2, j2;
X	register Cov *c;
X	register Ch *cp;
X
X	t -> w_status |= WCOVERING;/* This window is covering others */
X	b -> w_status |= WCOVERED;/* This window is covered by others */
X	for (c = WCovList; c; c = c -> c_next) {
X		if (c -> c_top == t && c -> c_bot == b) {
X			i = c -> c_area.xorigin;
X			j = c -> c_area.yorigin;
X			i2 = c -> c_area.xextent;
X			j2 = c -> c_area.yextent;
X			goto mark;/* ASSUMPTION: SAME INTERSECTION */
X		}
X	}
X
X	/* They didnt intersect before, but now they do */
X
X	c = (Cov *) malloc (sizeof (Cov));
X	c -> c_top = t;
X	c -> c_bot = b;
X	c -> c_next = WCovList;
X	WCovList = c;
X
X	/* Mark the chars in b that are covered by t */
X
X	i = Max (t -> OXO, b -> OXO);
X	j = Max (t -> OYO, b -> OYO);
X	i2 = Min (t -> OXO + t -> OXE, b -> OXO + b -> OXE) - i;
X	j2 = Min (t -> OYO + t -> OYE, b -> OYO + b -> OYE) - j;
X	i -= b -> OXO;
X	j -= b -> OYO;
X
X	/* (i,j),(i+i2,j+j2) are the upper left and lower right corners of
X	   the intersection of the two windows.  Values are relative to b */
X
X	c -> c_area.xorigin = i;
X	c -> c_area.yorigin = j;
X	c -> c_area.xextent = i2;
X	c -> c_area.yextent = j2;
X
Xmark:
X	cp = b -> w_winbuf + j * b -> OXE + i;
X	for (j = 0; j < j2; j++) {
X		for (i = 0; i < i2; i++)
X			cp++ -> Mode |= WINVIS;
X		cp += b -> OXE - i;
X	}
X}
X
X/* Remove all information about window w from the cover list.  This also
X   un-invisbles all chars in w and all chars that w covered (which means that
X   cover info is recomputed for windows that w covered). */
XWRemoveCoverList (w)
Xregister Win *w;
X{
X	register Cov *c, *cc;
X	char ostatus;
X
X	if ((w -> w_status & (WCOVERED|WCOVERING)) == 0)
X		return;		/* Nothing needs to be done */
X	w -> w_status &= ~(WCOVERING|WCOVERED);
X	ostatus = w -> w_status;
X	w -> w_status |= WHIDDEN;/* Dont consider w in recomputations */
X	for (c = WCovList; c; c = c -> c_next) {
X		if (c -> c_top == w) {
X			if (c == WCovList)
X				WCovList = c -> c_next;
X			else
X				cc -> c_next = c -> c_next;
X			c -> c_bot -> w_status &= ~WCOVERED;
X			WUnMarkCoverArea (c);
X			WComputeCover (c -> c_bot);/* Recompute excl. w */
X			free (c);
X		}
X		else if (c -> c_bot == w) {
X			if (c == WCovList)
X				WCovList = c -> c_next;
X			else
X				cc -> c_next = c -> c_next;
X/*			c -> c_top -> w_status &= ~WCOVERING; */
X			WUnMarkCoverArea (c);
X			free (c);
X		}
X		else
X			cc = c;
X	}
X	w -> w_status = ostatus;
X}
X
X/* Unmark chars in c->c_bot which used to be covered by c->c_top */
X/* NOTE: CALL WComputeCover ON c->c_bot AFTERWARDS IF IT IS STILL AROUND */
Xstatic
XWUnMarkCoverArea (c)
Xregister Cov *c;
X{
X	register i, j;
X	int i2, j2;
X	register Ch *cp;
X	register Win *b = c -> c_bot;
X
X	i2 = c -> c_area.yextent;
X	j2 = c -> c_area.xextent;
X	cp = b -> w_winbuf + c -> c_area.yorigin * b -> OXE +
X		c -> c_area.xorigin;
X	for (i = 0; i < i2; i++) {
X		for (j = 0; j < j2; j++)
X			cp++ -> Mode &= ~WINVIS;
X		cp += b -> OXE - j;
X	}
X	b -> w_status |= WDUMP;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 cover.c
	/bin/echo -n '	'; /bin/ls -ld cover.c
fi
/bin/echo 'Extracting delchars.c'
sed 's/^X//' <<'//go.sysin dd *' >delchars.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Delete n chars at cursor in window w */
XWdelchars (w, n)
Xregister Win *w;
Xint n;
X{
X	register Buf *b;
X	register Ch *cp, *ct, *end;
X	int blank;
X
X	if (n < 0)
X		return -1;
X	if (n == 0)
X		return 0;
X	blank = ' ' | (w -> w_mode << NBPB);
X	b = w -> w_textbuf;
X
X	/* w->w_winbuf */
X	ct = w -> w_winbuf + (w -> IYO + w -> w_cursor.row) * w -> OXE +
X		w -> IXO;
X	end = ct + w -> IXE;
X	ct += w -> w_cursor.col;
X	cp = ct + n;
X	while (cp < end) {
X		ct -> Char = cp -> Char;
X		ct -> Mode &= WINVIS;
X		ct++ -> Mode |= cp++ -> Mode & ~WINVIS;
X	}
X	while (ct < end) {
X		ct -> Char = ' ';
X		ct -> Mode &= WINVIS;
X		ct++ -> Mode |= WBUF;
X	}
X	/* w->w_textbuf */
X	ct = b -> b_contents +
X	  (w -> IYO + w -> w_bstart.row + w -> w_cursor.row) * b -> b_ncols +
X	  w -> w_bstart.col + w -> IXO;
X	end = ct + w -> IXE;
X	ct += w -> w_cursor.col;
X	cp = ct + n;
X	while (cp < end)
X		ct++ -> ch_all = cp++ -> ch_all;
X	while (ct < end)
X		ct++ -> ch_all = blank;
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 delchars.c
	/bin/echo -n '	'; /bin/ls -ld delchars.c
fi
/bin/echo 'Extracting delcols.c'
sed 's/^X//' <<'//go.sysin dd *' >delcols.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Delete n columns before cursor in window w */
XWdelcols (w, n)
Xregister Win *w;
Xint n;
X{
X	register Buf *b;
X	register Ch *cp, *ct;
X	register j;
X	int i, blank, nm;
X
X	if (n < 0)
X		return -1;
X	if (n == 0)
X		return 0;
X	if (n + w -> w_cursor.col > w -> IXE)
X		n = w -> IXE - w -> w_cursor.col;
X	blank = ' ' | (w -> w_mode << NBPB);
X	b = w -> w_textbuf;
X	nm = w -> IXE - n - w -> w_cursor.col;
X
X	/* w->w_winbuf */
X	ct = w -> w_winbuf + w -> IYO * w -> OXE +
X		w -> IXO + w -> w_cursor.col;
X	cp = ct + n;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < nm; j++) {
X			ct -> Char = cp -> Char;
X			ct -> Mode &= WINVIS;
X			ct++ -> Mode |= cp++ -> Mode & ~WINVIS;
X		}
X		ct += w -> OXE - j;
X		cp += w -> OXE - j;
X	}
X	ct = w -> w_winbuf + w -> IYO * w -> OXE +
X		w -> IXO + w -> w_cursor.col + nm;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < n; j++) {
X			ct -> Char = ' ';
X			ct -> Mode &= WINVIS;
X			ct++ -> Mode |= WBUF;
X		}
X		ct += w -> OXE - j;
X	}
X	/* w->w_textbuf */
X	ct = b -> b_contents +
X		(w -> IYO + w -> w_bstart.row) * b -> b_ncols +
X		w -> IXO + w -> w_bstart.col + w -> w_cursor.col;
X	cp = ct + n;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < nm; j++)
X			ct++ -> ch_all = cp++ -> ch_all;
X		ct += b -> b_ncols - j;
X		cp += b -> b_ncols - j;
X	}
X	ct = b -> b_contents +
X		(w -> IYO + w -> w_bstart.row) * b -> b_ncols +
X		w -> IXO + w -> w_bstart.col + w -> w_cursor.col + nm;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < n; j++)
X			ct++ -> ch_all = blank;
X		ct += b -> b_ncols - j;
X	}
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 delcols.c
	/bin/echo -n '	'; /bin/ls -ld delcols.c
fi
/bin/echo 'Extracting dellines.c'
sed 's/^X//' <<'//go.sysin dd *' >dellines.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Delete n lines at cursor in window w */
XWdellines (w, n)
Xregister Win *w;
Xint n;
X{
X	register Buf *b;
X	register Ch *cp, *ct;
X	register j;
X	int i, blank, nup;
X
X	if (n < 0)
X		return -1;
X	if (n == 0)
X		return 0;
X	blank = ' ' | (w -> w_mode << NBPB);
X	b = w -> w_textbuf;
X	if (n + w -> w_cursor.row > w -> IYE)
X		n = w -> IYE - w -> w_cursor.row;
X	nup = w -> IYE - n - w -> w_cursor.row;
X
X	/* w->w_winbuf */
X	ct = w -> w_winbuf +
X		(w -> IYO + w -> w_cursor.row) * w -> OXE + w -> IXO;
X	cp = ct + n * w -> OXE;
X	for (i = 0; i < nup; i++) {
X		for (j = 0; j < w -> IXE; j++) {
X			ct -> Char = cp -> Char;
X			ct -> Mode &= WINVIS;
X			ct++ -> Mode |= cp++ -> Mode & ~WINVIS;
X		}
X		ct += w -> OXE - j;
X		cp += w -> OXE - j;
X	}
X	for (i = 0; i < n; i++) {
X		for (j = 0; j < w -> IXE; j++) {
X			ct -> Char = ' ';
X			ct -> Mode &= WINVIS;
X			ct++ -> Mode |= WBUF;
X		}
X		ct += w -> OXE - j;
X	}
X	/* w->w_textbuf */
X	ct = b -> b_contents +
X		(w -> IYO + w->w_cursor.row + w->w_bstart.row) * b->b_ncols +
X		w -> IXO + w -> w_bstart.col;
X	cp = ct + n * b -> b_ncols;
X	for (i = 0; i < nup; i++) {
X		for (j = 0; j < w -> IXE; j++)
X			ct++ -> ch_all = cp++ -> ch_all;
X		ct += b -> b_ncols - j;
X		cp += b -> b_ncols - j;
X	}
X	for (i = 0; i < n; i++) {
X		for (j = 0; j < w -> IXE; j++)
X			ct++ -> ch_all = blank;
X		ct += b -> b_ncols - j;
X	}
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X	MajorUpdate = 1;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 dellines.c
	/bin/echo -n '	'; /bin/ls -ld dellines.c
fi
/bin/echo 'Extracting disp.c'
sed 's/^X//' <<'//go.sysin dd *' >disp.c
X/* Things having to do with putting windows on the (virtual) display */
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X#include "win.h"
X#include "display.h"
X#include <stdio.h>
X#include <signal.h>
X#include <sys/ioctl.h>
X
Xstatic TouchedDisp;		/* True iff DispPut has been called */
X
X/* Return the size of the screen */
XWscreensize (rows, cols)
Xint *rows, *cols;
X{
X    *rows = ScreenLength;
X    *cols = ScreenWidth;
X    return 0;
X}
X
X/* Refresh the display */
XWrefresh (SkipInputCheck) {
X    register Win *w;
X    register i;
X    static inrefresh;		/* to avoid recursive refresh, which just
X				   plain does not work! */
X
X    if (inrefresh)
X	return 0;
X    inrefresh++;
X    if (!WindowsActive) {
X	fprintf (stderr, "Bad call to Wrefresh() - windows not active\n");
X	fflush (stderr);
X	inrefresh = 0;
X	return -1;
X    }
X#ifdef FIONREAD
X    if (SkipInputCheck == 0
X	    && ioctl (0, FIONREAD, &InputPending) == 0
X	    && InputPending) {
X	inrefresh = 0;
X	return 0;		/* Dont bother if input is pending */
X    }
X#endif FIONREAD
X    if (SigMagic) {
X	sighold (SIGTSTP);
X	sighold (SIGINT);
X    }
X    if (ScreenGarbaged || LastRedisplayPaused) {
X	for (i = 1; i <= ScreenLength; i++)
X	    WDclearline (i);
X	for (w = WinList; w; w = w -> w_next) {
X	    if ((w -> w_status & WHIDDEN) == 0)
X		WDoDump (w);
X	}
X    }
X    else {
X	i = TouchedDisp | WSetRealCursor | WBoxActive;
X	for (w = WinList; w; w = w -> w_next) {
X	    if (w -> w_status & WHIDDEN) continue;
X	    if (w -> w_status & WDUMP || w -> w_textbuf -> b_nmodw)
X		i++, WDoDump (w);
X	}
X	if (i == 0)		/* Nothing changed */
X	    goto out;
X    }
X    TouchedDisp = WBoxActive;
X    if (WBoxActive)
X	WBoxToggle ();
X    WDUpdateScreen (MajorUpdate, SkipInputCheck);
X    if (WBoxActive)
X	WBoxToggle ();
Xout:
X    MajorUpdate = 0;
X    inrefresh = 0;
X    if (SigMagic) {
X	sigrelse (SIGTSTP);
X	sigrelse (SIGINT);
X    }
X    fflush (stdout);
X    return 0;
X}
X
X/* Write contents of window w to virtual screen */
Xstatic
XWDoDump (w)
Xregister Win *w;
X{
X    register Ch *wt, *ww;
X    register i, j;
X    register Buf *b = w -> w_textbuf;
X
X    wt = b -> b_contents + w -> w_bstart.row * b -> b_ncols +
X	 w -> w_bstart.col;
X    ww = w -> w_winbuf;
X    for (i = 1; i <= w -> OYE; i++) {
X	WDsetpos (w -> OYO + i, w -> OXO + 1);
X	for (j = 0; j < w -> OXE; j++) {
X	    if (ww -> Mode & WINVIS)
X		dspskip (1);
X	    else if (ww -> Mode & WBUF)
X		dsputc (wt -> Char, wt -> Mode ^ ww -> Mode);
X	    else
X		dsputc (ww -> Char, ww -> Mode);
X	    wt++, ww++;
X	}
X	wt += b -> b_ncols - /* w -> OXE */ j;
X    }
X    if ((w -> w_status & WCURSOR) == 0) {/* Put up a cursor */
X	i = w -> IYO + w -> w_cursor.row;
X	j = w -> IXO + w -> w_cursor.col;
X	if (((w -> w_winbuf + i * w -> OXE + j) -> Mode & WINVIS) == 0) {
X	    WDsetpos (w -> OYO + i + 1, w -> OXO + j + 1);
X	    dspxor (WBLINK|WINVERSE);
X	}
X    }
X    w -> w_status &= ~WDUMP;
X    if (b -> b_nmodw == -1)
X	b -> b_nmodw = b -> b_nwins - 1;
X    else if (b -> b_nmodw)
X	b -> b_nmodw--;
X}
X
X/* Put up the character at position row, col, possibly with cursor */
X/* row, col should already have w -> IYE, w -> IXE added if needed */
XWDispPut (w, row, col, curs)
Xregister Win *w;
Xregister row, col, curs;
X{
X    register Ch *p;
X
X    if (w -> w_status & WHIDDEN)
X	return;
X    p = w -> w_winbuf + row * w -> OXE + col;
X    if (p -> Mode & WINVIS)
X	return;
X    WDsetpos (row + w -> OYO + 1, col + w -> OXO + 1);
X    curs = curs ? WBLINK|WINVERSE : 0;
X    if (p -> Mode & WBUF) {
X	register Buf *b;
X	curs ^= p -> Mode;
X	b = w -> w_textbuf;
X	p = b -> b_contents + (w -> w_bstart.row + row) * b -> b_ncols +
X	    w -> w_bstart.col + col;
X    }
X    dsputc (p -> Char, p -> Mode ^ curs);
X    TouchedDisp++;
X}
X
X/* THIS FUNCTION COULD BE SUBSUMED BY THE LastRedisplayPaused VARIABLE */
X/* Erase visible portions of window w from display */
XWErase (w)
Xregister Win *w;
X{
X    register Ch *wp;
X    register i, j;
X
X    if (w -> w_status & WHIDDEN)/* No need to erase */
X	return;
X    wp = w -> w_winbuf;
X    for (i = 1; i <= w -> OYE; i++) {
X	WDsetpos (w -> OYO + i, w -> OXO + 1);
X	for (j = 0; j < w -> OXE; j++) {
X	    if (wp++ -> Mode & WINVIS)
X		dspskip (1);
X	    else
X		dsputc (' ', 0);
X	}
X    }
X    TouchedDisp++;
X}
X
X/* Toggle the box on the virtual display (write it if it's not there, remove
X   it if it is). */
Xstatic
XWBoxToggle () {
X	register i, j;
X
X	WDsetpos (j = WBox.yorigin + 1, WBox.xorigin + 1);
X	for (i = 0; i < WBox.xextent; i++)
X		dspxor (WINVERSE);
X	for (i = 2; i < WBox.yextent; i++) {
X		WDsetpos (++j, WBox.xorigin + 1);
X		dspxor (WINVERSE);
X		if (WBox.xextent > 1) {
X			dspskip (WBox.xextent - 2);
X			dspxor (WINVERSE);
X		}
X	}
X	if (WBox.yextent > 1) {
X		WDsetpos (++j, WBox.xorigin + 1);
X		for (i = 0; i < WBox.xextent; i++)
X			dspxor (WINVERSE);
X	}
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 disp.c
	/bin/echo -n '	'; /bin/ls -ld disp.c
fi
-- 
UUCP:	{seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet:	chris at umcp-cs
ARPA:	chris.umcp-cs at UDel-Relay



More information about the Comp.sources.unix mailing list