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