From 19f9784c693d6d2be80e13a61b51a4aabd4bd7a9 Mon Sep 17 00:00:00 2001 From: Edward Wang Date: Wed, 14 Sep 1983 21:17:22 -0800 Subject: [PATCH] Off screen windows!!!!!! SCCS-vsn: usr.bin/window/wwopen.c 3.11 SCCS-vsn: usr.bin/window/ww.h 3.13 SCCS-vsn: usr.bin/window/cmd1.c 3.11 SCCS-vsn: usr.bin/window/wwwrite.c 3.10 SCCS-vsn: usr.bin/window/wwframe.c 3.9 SCCS-vsn: usr.bin/window/cmd5.c 3.5 SCCS-vsn: usr.bin/window/:ww 1.3 SCCS-vsn: usr.bin/window/wwadd.c 3.4 SCCS-vsn: usr.bin/window/wwdelete.c 3.4 SCCS-vsn: usr.bin/window/wwinsline.c 3.4 SCCS-vsn: usr.bin/window/wwdelline.c 3.4 SCCS-vsn: usr.bin/window/wwclreol.c 3.8 SCCS-vsn: usr.bin/window/wwflush.c 3.4 SCCS-vsn: usr.bin/window/wwinschar.c 3.7 SCCS-vsn: usr.bin/window/wwdelchar.c 3.5 SCCS-vsn: usr.bin/window/wwscroll.c 3.9 SCCS-vsn: usr.bin/window/wwredrawwin.c 3.4 SCCS-vsn: usr.bin/window/wwcursor.c 3.2 --- usr/src/usr.bin/window/:ww | 2 + usr/src/usr.bin/window/cmd1.c | 7 +- usr/src/usr.bin/window/cmd5.c | 49 ++++++++++--- usr/src/usr.bin/window/ww.h | 3 +- usr/src/usr.bin/window/wwadd.c | 24 ++++--- usr/src/usr.bin/window/wwclreol.c | 80 +++++++++++++-------- usr/src/usr.bin/window/wwcursor.c | 17 +++-- usr/src/usr.bin/window/wwdelchar.c | 51 +++++++++----- usr/src/usr.bin/window/wwdelete.c | 26 ++++--- usr/src/usr.bin/window/wwdelline.c | 16 ++--- usr/src/usr.bin/window/wwflush.c | 8 ++- usr/src/usr.bin/window/wwframe.c | 22 +++--- usr/src/usr.bin/window/wwinschar.c | 52 +++++++++----- usr/src/usr.bin/window/wwinsline.c | 14 ++-- usr/src/usr.bin/window/wwopen.c | 24 ++++--- usr/src/usr.bin/window/wwredrawwin.c | 23 +++--- usr/src/usr.bin/window/wwscroll.c | 96 ++++++++++++------------- usr/src/usr.bin/window/wwwrite.c | 100 +++++++++++++++------------ 18 files changed, 369 insertions(+), 245 deletions(-) diff --git a/usr/src/usr.bin/window/:ww b/usr/src/usr.bin/window/:ww index 3b61ee992c..64a726d9d5 100644 --- a/usr/src/usr.bin/window/:ww +++ b/usr/src/usr.bin/window/:ww @@ -2,6 +2,8 @@ +/"xxx"8t"index"8t"order"nbbb++ +/"w.nr"16t"w.nc"nDDn +/"w.t"16t"w.b"16t"w.l"16t"w.r"nDDDD ++/"i.nr"16t"i.nc"nDDn ++/"i.t"16t"i.b"16t"i.l"16t"i.r"nDDDD +/"nline"16t"scroll"16t"cur.r"16t"cur.c"nDDDD +/"win"16t"buf"16t"cov"16t"fmap"16tnpppp +/"nvis"np diff --git a/usr/src/usr.bin/window/cmd1.c b/usr/src/usr.bin/window/cmd1.c index cdc9f28e9f..b4ae41a338 100644 --- a/usr/src/usr.bin/window/cmd1.c +++ b/usr/src/usr.bin/window/cmd1.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)cmd1.c 3.10 83/08/31"; +static char *sccsid = "@(#)cmd1.c 3.11 83/09/14"; #endif #include "defs.h" @@ -149,8 +149,9 @@ int id, nrow, ncol, row, col; if (id < 0 && (id = findid()) < 0) return 0; - if (row <= 0) { - error("Bad row number."); + if (row + nrow <= 0 || row > wwnrow - 1 + || col + ncol <= 0 || col > wwncol - 1) { + error("Illegal window size or position."); return 0; } if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0) { diff --git a/usr/src/usr.bin/window/cmd5.c b/usr/src/usr.bin/window/cmd5.c index 6d27abdca2..022cb69458 100644 --- a/usr/src/usr.bin/window/cmd5.c +++ b/usr/src/usr.bin/window/cmd5.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)cmd5.c 3.4 83/09/01"; +static char *sccsid = "@(#)cmd5.c 3.5 83/09/14"; #endif #include "defs.h" @@ -11,6 +11,9 @@ c_move(w) register struct ww *w; { int col, row; + int mincol, minrow; + int maxcol, maxrow; + int curcol, currow; struct ww *back = w->ww_back; col = w->ww_w.l; @@ -18,12 +21,15 @@ register struct ww *w; wwadd(boxwin, framewin->ww_back); for (;;) { wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2); - wwsetcursor(row, col); + getminmax(row, w->ww_w.nr, 1, wwnrow, + &currow, &minrow, &maxrow); + getminmax(col, w->ww_w.nc, 0, wwncol, + &curcol, &mincol, &maxcol); + wwsetcursor(currow, curcol); while (bpeekc() < 0) bread(); wwunbox(boxwin); - switch (getpos(&row, &col, 1, 0, - wwnrow - w->ww_w.nr, wwncol - w->ww_w.nc)) { + switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) { case -1: wwdelete(boxwin); if (!terse) @@ -41,10 +47,37 @@ register struct ww *w; (void) wwputs("\r\n", cmdwin); wwcurtowin(cmdwin); wwdelete(w); - w->ww_w.t = row; - w->ww_w.l = col; - w->ww_w.b = row + w->ww_w.nr; - w->ww_w.r = col + w->ww_w.nc; + wwmove(w, row, col); wwadd(w, back); reframe(); } + +/* + * Weird stufff, don't ask. + */ +getminmax(x, n, a, b, curx, minx, maxx) +register x, n, a, b; +int *curx, *minx, *maxx; +{ + if (x < a) { + *curx = x + n - 1; + *minx = 1 - n; + *maxx = a; + } else if (x == a) { + *curx = x; + *minx = 1 - n; + *maxx = b - n; + } else if (x < b - n) { + *curx = x; + *minx = a; + *maxx = b - n; + } else if (x == b - n) { + *curx = x; + *minx = a; + *maxx = b - 1; + } else { + *curx = x; + *minx = b - n; + *maxx = b - 1; + } +} diff --git a/usr/src/usr.bin/window/ww.h b/usr/src/usr.bin/window/ww.h index b45f11c320..a722bf5d15 100644 --- a/usr/src/usr.bin/window/ww.h +++ b/usr/src/usr.bin/window/ww.h @@ -1,5 +1,5 @@ /* - * @(#)ww.h 3.12 83/09/01 + * @(#)ww.h 3.13 83/09/14 */ #include @@ -33,6 +33,7 @@ struct ww { char ww_index; /* the index, for wwindex[] */ char ww_order; /* the overlapping order */ struct ww_dim ww_w; /* window dimemsions */ + struct ww_dim ww_i; /* the part inside the screen */ int ww_nline; /* size of the buffer */ int ww_scroll; /* where the window is relative to the buffer */ struct ww_pos ww_cur; /* the cursor position, relative to ww_w */ diff --git a/usr/src/usr.bin/window/wwadd.c b/usr/src/usr.bin/window/wwadd.c index ad012d916a..f564983f11 100644 --- a/usr/src/usr.bin/window/wwadd.c +++ b/usr/src/usr.bin/window/wwadd.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwadd.c 3.3 83/08/16"; +static char *sccsid = "@(#)wwadd.c 3.4 83/09/14"; #endif #include "ww.h" @@ -12,12 +12,14 @@ wwadd(w1, w2) register struct ww *w1, *w2; { if (w1->ww_forw != 0 || w1->ww_back != 0) - abort(); + return; /* sanity */ + w1->ww_order = w2->ww_order + 1; w1->ww_back = w2; w1->ww_forw = w2->ww_forw; w2->ww_forw->ww_back = w1; w2->ww_forw = w1; + { register struct ww *wp; @@ -29,16 +31,18 @@ register struct ww *w1, *w2; } } { - int i = w1->ww_w.t; + int i = w1->ww_i.t; char *touched = &wwtouched[i]; - for (; i < w1->ww_w.b; i++, touched++) { - int j = w1->ww_w.nc; - register char *win = w1->ww_win[i - w1->ww_w.t]; - register char *smap = &wwsmap[i][w1->ww_w.l]; - register union ww_char *ns = &wwns[i][w1->ww_w.l]; - register union ww_char *buf = w1->ww_buf[w1->ww_scroll - + i - w1->ww_w.t]; + for (; i < w1->ww_i.b; i++, touched++) { + int j = w1->ww_i.nc; + register char *win = &w1->ww_win[i - w1->ww_w.t] + [w1->ww_i.l - w1->ww_w.l]; + register char *smap = &wwsmap[i][w1->ww_i.l]; + register union ww_char *ns = &wwns[i][w1->ww_i.l]; + register union ww_char *buf + = &w1->ww_buf[w1->ww_scroll + i - w1->ww_w.t] + [w1->ww_i.l - w1->ww_w.l]; while (--j >= 0) { if ((*win & (WWM_GLS|WWM_COV)) == 0) { diff --git a/usr/src/usr.bin/window/wwclreol.c b/usr/src/usr.bin/window/wwclreol.c index ccc1cb7039..5052d663e6 100644 --- a/usr/src/usr.bin/window/wwclreol.c +++ b/usr/src/usr.bin/window/wwclreol.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwclreol.c 3.7 83/08/18"; +static char *sccsid = "@(#)wwclreol.c 3.8 83/09/14"; #endif #include "ww.h" @@ -25,44 +25,70 @@ char cleared; int row = line - w->ww_scroll; int srow = w->ww_w.t + row; int scol = w->ww_w.l + col; - register union ww_char *s, *buf; - register char *smap, *win; - char *touched; int nblank, ncleared; - if (row < 0 || row >= w->ww_w.nr) { - /* can't even see it, so just clear the buffer */ + /* + * Clear the buffer right off + */ + { + register union ww_char *buf; + buf = &w->ww_buf[line][col]; for (i = w->ww_w.nc - col; --i >= 0;) buf++->c_w = ' '; - return; } - smap = &wwsmap[srow][scol]; - s = &wwns[srow][scol]; - touched = &wwtouched[srow]; - win = &w->ww_win[row][col]; - buf = &w->ww_buf[line][col]; - ncleared = nblank = 0; - for (i = w->ww_w.nc - col; --i >= 0;) { - buf++->c_w = ' '; - if (*smap++ != w->ww_index) { - if (s++->c_w == ' ') + + /* + * If can't see it, just return. + */ + if (srow < w->ww_i.t || srow >= w->ww_i.b + || w->ww_i.r <= 0 || w->ww_i.r <= scol) + return; + + if (scol < w->ww_i.l) + scol = w->ww_i.l; + col = scol - w->ww_w.l; + + /* + * Now find out how much is actually cleared, and fix wwns. + */ + { + register union ww_char *s; + register char *smap, *win; + register char *touched; + + smap = &wwsmap[srow][scol]; + s = &wwns[srow][scol]; + touched = &wwtouched[srow]; + win = &w->ww_win[row][col]; + ncleared = nblank = 0; + + for (i = w->ww_i.r - scol; --i >= 0;) { + if (*smap++ != w->ww_index) { + if (s++->c_w == ' ') + nblank++; + win++; + continue; + } + ncleared++; + *touched = 1; + if (*win == 0) { nblank++; - win++; - continue; + s++->c_w = ' '; + win++; + } else + s++->c_w = ' ' | *win++ << WWC_MSHIFT; } - ncleared++; - *touched = 1; - if (*win == 0) { - nblank++; - s++->c_w = ' '; - win++; - } else - s++->c_w = ' ' | *win++ << WWC_MSHIFT; } + + /* + * Can/Should we use clear eol? + */ if (!cleared && tt.tt_clreol != 0 && ncleared > wwncol - scol - nblank && nblank > (wwncol - scol) / 2) { + register union ww_char *s; + /* clear to the end */ (*tt.tt_move)(srow, scol); (*tt.tt_clreol)(); diff --git a/usr/src/usr.bin/window/wwcursor.c b/usr/src/usr.bin/window/wwcursor.c index fdb331db04..86e15450ea 100644 --- a/usr/src/usr.bin/window/wwcursor.c +++ b/usr/src/usr.bin/window/wwcursor.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwcursor.c 3.1 83/08/19"; +static char *sccsid = "@(#)wwcursor.c 3.2 83/09/14"; #endif #include "ww.h" @@ -26,11 +26,14 @@ register struct ww *w; else if (*win == wwcursormodes) w->ww_nvis[w->ww_cur.r]++; *win ^= wwcursormodes; - } - r = wwcurrow(w); - c = wwcurcol(w); - if (wwsmap[r][c] == w->ww_index) { - wwns[r][c].c_m ^= wwcursormodes; - wwtouched[r] = 1; + r = wwcurrow(w); + c = wwcurcol(w); + if (r < w->ww_i.t || r >= w->ww_i.b + || c < w->ww_i.l || c >= w->ww_i.r) + return; + if (wwsmap[r][c] == w->ww_index) { + wwns[r][c].c_m ^= wwcursormodes; + wwtouched[r] = 1; + } } } diff --git a/usr/src/usr.bin/window/wwdelchar.c b/usr/src/usr.bin/window/wwdelchar.c index 2ff08e024e..2a28c74ae5 100644 --- a/usr/src/usr.bin/window/wwdelchar.c +++ b/usr/src/usr.bin/window/wwdelchar.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwdelchar.c 3.4 83/08/16"; +static char *sccsid = "@(#)wwdelchar.c 3.5 83/09/14"; #endif #include "ww.h" @@ -10,8 +10,13 @@ register struct ww *w; { register i; int row = line - w->ww_scroll; + int srow = row + w->ww_w.t; + int scol = col + w->ww_w.l; int nvis; + /* + * First, shift the line. + */ { register union ww_char *p, *q; @@ -21,8 +26,21 @@ register struct ww *w; *p++ = *q++; p->c_w = ' '; } - if (row < 0 || row >= w->ww_w.nr) + + /* + * If can't see it, just return. + */ + if (srow < w->ww_i.t || srow >= w->ww_i.b + || w->ww_i.r <= 0 || w->ww_i.r <= scol) return; + + if (scol < w->ww_i.l) + scol = w->ww_i.l; + col = scol - w->ww_w.l; + + /* + * Now find out how much is actually changed, and fix wwns. + */ { register union ww_char *buf; register char *win; @@ -31,20 +49,15 @@ register struct ww *w; char *touched; nvis = 0; - smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l]; - for (i = w->ww_w.nc - col; i > 0; i--) - if (*smap == w->ww_index) - break; - else { - smap++; - col++; - } + smap = &wwsmap[srow][scol]; + for (i = w->ww_i.r - scol; i > 0 && *smap++ != w->ww_index; i--) + col++, scol++; if (i <= 0) return; buf = &w->ww_buf[line][col]; win = &w->ww_win[row][col]; - ns = &wwns[row + w->ww_w.t][col + w->ww_w.l]; - touched = &wwtouched[row + w->ww_w.t]; + ns = &wwns[srow][scol]; + touched = &wwtouched[srow]; for (; --i >= 0;) { if (*win) { if ((*win & (WWM_COV|WWM_GLS)) != 0) { @@ -63,17 +76,19 @@ register struct ww *w; } } } - col += w->ww_w.l; - row += w->ww_w.t; - if (nvis > (wwncol - col) / 2) { + + /* + * Can/Should we use delete character? + */ + if (tt.tt_delchar != 0 && nvis > (wwncol - scol) / 2) { register union ww_char *p, *q; - (*tt.tt_move)(row, col); + (*tt.tt_move)(srow, scol); (*tt.tt_delchar)(); - p = &wwos[row][col]; + p = &wwos[srow][scol]; q = p + 1; - for (i = wwncol - col - 1; --i >= 0;) + for (i = wwncol - scol; --i > 0;) *p++ = *q++; p->c_w = ' '; } diff --git a/usr/src/usr.bin/window/wwdelete.c b/usr/src/usr.bin/window/wwdelete.c index b7089e0892..a1d6500a31 100644 --- a/usr/src/usr.bin/window/wwdelete.c +++ b/usr/src/usr.bin/window/wwdelete.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwdelete.c 3.3 83/08/16"; +static char *sccsid = "@(#)wwdelete.c 3.4 83/09/14"; #endif #include "ww.h" @@ -10,16 +10,19 @@ static char *sccsid = "@(#)wwdelete.c 3.3 83/08/16"; wwdelete(w) register struct ww *w; { + if (w->ww_forw == 0 || w->ww_back == 0) + return; /* sanity */ + { - register i = w->ww_w.t; + register i = w->ww_i.t; register char *touched = &wwtouched[i]; - for (; i < w->ww_w.b; i++, touched++) { - register int j = w->ww_w.l; + for (; i < w->ww_i.b; i++, touched++) { + register int j = w->ww_i.l; register char *smap = &wwsmap[i][j]; register union ww_char *ns = &wwns[i][j]; - for (j = w->ww_w.nc; --j >= 0;) { + for (j = w->ww_i.nc; --j >= 0;) { if (*smap == w->ww_index) { *touched = 1; *smap++ = WWX_NOBODY; @@ -42,14 +45,17 @@ register struct ww *w; { register i; - for (i = 0; i < w->ww_w.nr; i++) { + for (i = w->ww_i.t; i < w->ww_i.b; i++) { register j; - register char *win = w->ww_win[i]; - register char *cov = w->ww_cov[i]; - for (j = w->ww_w.nc; --j >= 0;) { + register char *win = &w->ww_win[i - w->ww_w.t] + [w->ww_i.l - w->ww_w.l]; + register char *cov = &w->ww_cov[i - w->ww_w.t] + [w->ww_i.l - w->ww_w.l]; + + for (j = w->ww_i.nc; --j >= 0;) { if (*win != 0) { if ((*win++ &= ~WWM_COV) == 0) - w->ww_nvis[i]++; + w->ww_nvis[i - w->ww_w.t]++; } else win++; *cov++ = WWX_NOBODY; diff --git a/usr/src/usr.bin/window/wwdelline.c b/usr/src/usr.bin/window/wwdelline.c index 151b1ed96d..fc57420ad4 100644 --- a/usr/src/usr.bin/window/wwdelline.c +++ b/usr/src/usr.bin/window/wwdelline.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwdelline.c 3.3 83/08/18"; +static char *sccsid = "@(#)wwdelline.c 3.4 83/09/14"; #endif #include "ww.h" @@ -11,21 +11,21 @@ int line; register i; register union ww_char **cpp, **cqq; register union ww_char *cp; - int srow, erow; + int row1, row2; char deleted; int visible; /* * Scroll first. */ - if ((srow = line - w->ww_scroll) < 0) - srow = 0; - if ((erow = w->ww_nline - w->ww_scroll - 1) >= w->ww_w.nr) { - erow = w->ww_w.nr - 1; + if ((row1 = line - w->ww_scroll) < w->ww_i.t - w->ww_w.t) + row1 = w->ww_i.t - w->ww_w.t; + if ((row2 = w->ww_nline - w->ww_scroll) > w->ww_i.b - w->ww_w.t) { + row2 = w->ww_i.b - w->ww_w.t; visible = 0; } else visible = 1; - deleted = wwscroll1(w, srow, erow, 1, visible); + deleted = wwscroll1(w, row1, row2, 1, visible); /* * Fix the buffer. @@ -34,7 +34,7 @@ int line; cpp = &w->ww_buf[line]; cqq = cpp + 1; cp = *cpp; - for (i = w->ww_nline - line - 1; --i >= 0;) + for (i = w->ww_nline - line; --i > 0;) *cpp++ = *cqq++; *cpp = cp; diff --git a/usr/src/usr.bin/window/wwflush.c b/usr/src/usr.bin/window/wwflush.c index f37dd6f1b2..2c1a83a069 100644 --- a/usr/src/usr.bin/window/wwflush.c +++ b/usr/src/usr.bin/window/wwflush.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwflush.c 3.3 83/08/15"; +static char *sccsid = "@(#)wwflush.c 3.4 83/09/14"; #endif #include "ww.h" @@ -7,6 +7,10 @@ static char *sccsid = "@(#)wwflush.c 3.3 83/08/15"; wwflush() { - (*tt.tt_move)(wwcursorrow, wwcursorcol); + if (wwcursorrow < 0 || wwcursorrow >= wwnrow + || wwcursorcol < 0 || wwcursorcol >= wwncol) + (*tt.tt_move)(0, 0); + else + (*tt.tt_move)(wwcursorrow, wwcursorcol); (void) fflush(stdout); } diff --git a/usr/src/usr.bin/window/wwframe.c b/usr/src/usr.bin/window/wwframe.c index 0ecbd87fa1..833ae242d8 100644 --- a/usr/src/usr.bin/window/wwframe.c +++ b/usr/src/usr.bin/window/wwframe.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwframe.c 3.8 83/08/23"; +static char *sccsid = "@(#)wwframe.c 3.9 83/09/14"; #endif #include "ww.h" @@ -21,14 +21,14 @@ struct ww *wframe; if (w->ww_w.t > 0) { r = w->ww_w.t - 1; - c = w->ww_w.l - 1; + c = w->ww_i.l - 1; smap = &wwsmap[r + 1][c + 1]; a1 = 0; a2 = 0; b1 = 0; b2 = c < 0 || frameok(w, r, c); - for (; c < w->ww_w.r; c++) { + for (; c < w->ww_i.r; c++) { if (c + 1 >= wwncol) { a3 = 1; b3 = 1; @@ -56,14 +56,14 @@ struct ww *wframe; if (w->ww_w.b < wwnrow) { r = w->ww_w.b; - c = w->ww_w.l - 1; + c = w->ww_i.l - 1; smap = &wwsmap[r - 1][c + 1]; a1 = 0; a2 = 0; b1 = 0; b2 = c < 0 || frameok(w, r, c); - for (; c < w->ww_w.r; c++) { + for (; c < w->ww_i.r; c++) { if (c + 1 >= wwncol) { a3 = 1; b3 = 1; @@ -90,14 +90,14 @@ struct ww *wframe; } if (w->ww_w.l > 0) { - r = w->ww_w.t - 1; + r = w->ww_i.t - 1; c = w->ww_w.l - 1; a1 = 0; a2 = 0; b1 = 0; b2 = r < 0 || frameok(w, r, c); - for (; r < w->ww_w.b; r++) { + for (; r < w->ww_i.b; r++) { if (r + 1 >= wwnrow) { a3 = 1; b3 = 1; @@ -124,14 +124,14 @@ struct ww *wframe; } if (w->ww_w.r < wwncol) { - r = w->ww_w.t - 1; + r = w->ww_i.t - 1; c = w->ww_w.r; a1 = 0; a2 = 0; b1 = 0; b2 = r < 0 || frameok(w, r, c); - for (; r < w->ww_w.b; r++) { + for (; r < w->ww_i.b; r++) { if (r + 1 >= wwnrow) { a3 = 1; b3 = 1; @@ -166,8 +166,8 @@ char code; register r, c; char oldcode; - if (rr < f->ww_w.t || rr >= f->ww_w.b - || cc < f->ww_w.l || cc >= f->ww_w.r) + if (rr < f->ww_i.t || rr >= f->ww_i.b + || cc < f->ww_i.l || cc >= f->ww_i.r) return; { register struct ww *w; diff --git a/usr/src/usr.bin/window/wwinschar.c b/usr/src/usr.bin/window/wwinschar.c index 53a17ce802..3f81496e67 100644 --- a/usr/src/usr.bin/window/wwinschar.c +++ b/usr/src/usr.bin/window/wwinschar.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwinschar.c 3.6 83/08/17"; +static char *sccsid = "@(#)wwinschar.c 3.7 83/09/14"; #endif #include "ww.h" @@ -11,8 +11,13 @@ short c; { register i; int row = line - w->ww_scroll; + int srow = row + w->ww_w.t; + int scol = col + w->ww_w.l; int nvis; + /* + * First, shift the line. + */ { register union ww_char *p, *q; @@ -22,8 +27,21 @@ short c; *--p = *--q; q->c_w = c; } - if (row < 0 || row >= w->ww_w.nr) + + /* + * If can't see it, just return. + */ + if (srow < w->ww_i.t || srow >= w->ww_i.b + || w->ww_i.r <= 0 || w->ww_i.r <= scol) return; + + if (scol < w->ww_i.l) + scol = w->ww_i.l; + col = scol - w->ww_w.l; + + /* + * Now find out how much is actually changed, and fix wwns. + */ { register union ww_char *buf; register char *win; @@ -32,20 +50,15 @@ short c; char *touched; nvis = 0; - smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l]; - for (i = w->ww_w.nc - col; i > 0; i--) - if (*smap == w->ww_index) - break; - else { - smap++; - col++; - } + smap = &wwsmap[srow][scol]; + for (i = w->ww_i.r - scol; i > 0 && *smap++ != w->ww_index; i--) + col++, scol++; if (i <= 0) return; buf = &w->ww_buf[line][col]; win = &w->ww_win[row][col]; - ns = &wwns[row + w->ww_w.t][col + w->ww_w.l]; - touched = &wwtouched[row + w->ww_w.t]; + ns = &wwns[srow][scol]; + touched = &wwtouched[srow]; c = buf->c_w ^ *win << WWC_MSHIFT; for (; --i >= 0;) { if (*win) { @@ -65,21 +78,22 @@ short c; } } } - col += w->ww_w.l; - row += w->ww_w.t; - if (tt.tt_setinsert != 0 && nvis > (wwncol - col) / 2 - && col != wwncol - 1) { + + /* + * Can/Should we use delete character? + */ + if (tt.tt_setinsert != 0 && nvis > (wwncol - scol) / 2) { register union ww_char *p, *q; (*tt.tt_setinsert)(1); - (*tt.tt_move)(row, col); + (*tt.tt_move)(srow, scol); (*tt.tt_setmodes)(c >> WWC_MSHIFT); (*tt.tt_putc)(c & WWC_CMASK); (*tt.tt_setinsert)(0); - p = &wwos[row][wwncol]; + p = &wwos[srow][wwncol]; q = p - 1; - for (i = wwncol - col - 1; --i >= 0;) + for (i = wwncol - scol; --i > 0;) *--p = *--q; q->c_w = c; } diff --git a/usr/src/usr.bin/window/wwinsline.c b/usr/src/usr.bin/window/wwinsline.c index e5a105125e..79fc6bb299 100644 --- a/usr/src/usr.bin/window/wwinsline.c +++ b/usr/src/usr.bin/window/wwinsline.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwinsline.c 3.3 83/08/18"; +static char *sccsid = "@(#)wwinsline.c 3.4 83/09/14"; #endif #include "ww.h" @@ -11,21 +11,21 @@ int line; register i; register union ww_char **cpp, **cqq; register union ww_char *cp; - int srow, erow; + int row11, row2; char deleted; int visible; /* * Scroll first. */ - if ((srow = line - w->ww_scroll) < 0) { - srow = 0; + if ((row11 = line - w->ww_scroll) < w->ww_i.t - w->ww_w.t) { + row11 = 0; visible = 0; } else visible = 1; - if ((erow = w->ww_nline - w->ww_scroll - 1) >= w->ww_w.nr) - erow = w->ww_w.nr - 1; - deleted = wwscroll1(w, srow, erow, -1, visible); + if ((row2 = w->ww_nline - w->ww_scroll) > w->ww_i.b - w->ww_w.t) + row2 = w->ww_i.b - w->ww_w.t; + deleted = wwscroll1(w, row11, row2, -1, visible); /* * Fix the buffer. diff --git a/usr/src/usr.bin/window/wwopen.c b/usr/src/usr.bin/window/wwopen.c index dc0cee7aea..39abe3b335 100644 --- a/usr/src/usr.bin/window/wwopen.c +++ b/usr/src/usr.bin/window/wwopen.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwopen.c 3.10 83/08/26"; +static char *sccsid = "@(#)wwopen.c 3.11 83/09/14"; #endif #include "ww.h" @@ -26,15 +26,19 @@ wwopen(flags, nrow, ncol, row, col, nline) } w->ww_index = i; - if ((w->ww_w.nr = nrow) <= 0 - || (w->ww_w.nc = ncol) <= 0 - || (w->ww_w.l = col) < 0 - || (w->ww_w.r = col + ncol) > wwncol - || (w->ww_w.t = row) < 0 - || (w->ww_w.b = row + nrow) > wwnrow) { - wwerrno = WWE_SIZE; - goto bad; - } + w->ww_w.t = row; + w->ww_w.b = row + nrow; + w->ww_w.l = col; + w->ww_w.r = col + ncol; + w->ww_w.nr = nrow; + w->ww_w.nc = ncol; + w->ww_i.t = MAX(w->ww_w.t, 0); + w->ww_i.b = MIN(w->ww_w.b, wwnrow); + w->ww_i.l = MAX(w->ww_w.l, 0); + w->ww_i.r = MIN(w->ww_w.r, wwncol); + w->ww_i.nr = w->ww_i.b - w->ww_i.t; + w->ww_i.nc = w->ww_i.r - w->ww_i.l; + w->ww_nline = MAX(nline, w->ww_w.nr); if (flags & WWO_PTY) { diff --git a/usr/src/usr.bin/window/wwredrawwin.c b/usr/src/usr.bin/window/wwredrawwin.c index 58cc246d82..2d684ab9a3 100644 --- a/usr/src/usr.bin/window/wwredrawwin.c +++ b/usr/src/usr.bin/window/wwredrawwin.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwredrawwin.c 3.3 83/08/18"; +static char *sccsid = "@(#)wwredrawwin.c 3.4 83/09/14"; #endif #include "ww.h" @@ -7,12 +7,13 @@ static char *sccsid = "@(#)wwredrawwin.c 3.3 83/08/18"; wwredrawwin(w) register struct ww *w; { - wwredrawwin1(w, 0, w->ww_w.nr - 1, w->ww_scroll); + wwredrawwin1(w, w->ww_i.t - w->ww_w.t, w->ww_i.b - w->ww_w.t, + w->ww_scroll); } -wwredrawwin1(w, srow, erow, offset) +wwredrawwin1(w, row1, row2, scroll) register struct ww *w; -int srow, erow, offset; +int row1, row2, scroll; { int i; register j; @@ -22,13 +23,13 @@ int srow, erow, offset; register union ww_char *ns; char *touched; - touched = &wwtouched[srow + w->ww_w.t]; - for (i = srow; i <= erow; i++, touched++) { - ns = &wwns[i + w->ww_w.t][w->ww_w.l]; - smap = &wwsmap[i + w->ww_w.t][w->ww_w.l]; - buf = w->ww_buf[offset + i]; - win = w->ww_win[i]; - for (j = w->ww_w.nc; --j >= 0;) + touched = &wwtouched[row1 + w->ww_w.t]; + for (i = row1; i < row2; i++, touched++) { + ns = &wwns[i + w->ww_w.t][w->ww_i.l]; + smap = &wwsmap[i + w->ww_w.t][w->ww_i.l]; + buf = &w->ww_buf[scroll + i][w->ww_i.l - w->ww_w.l]; + win = &w->ww_win[i][w->ww_i.l - w->ww_w.l]; + for (j = w->ww_i.nc; --j >= 0;) if (*smap++ != w->ww_index) win++, ns++, buf++; else { diff --git a/usr/src/usr.bin/window/wwscroll.c b/usr/src/usr.bin/window/wwscroll.c index accaa10490..e2f4f828f5 100644 --- a/usr/src/usr.bin/window/wwscroll.c +++ b/usr/src/usr.bin/window/wwscroll.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwscroll.c 3.8 83/08/24"; +static char *sccsid = "@(#)wwscroll.c 3.9 83/09/14"; #endif #include "ww.h" @@ -21,9 +21,10 @@ register n; else if (scroll > w->ww_nline - w->ww_w.nr) scroll = w->ww_nline - w->ww_w.nr; n = abs(scroll - w->ww_scroll); - if (n < w->ww_w.nr) { + if (n < w->ww_i.nr) { while (--n >= 0) { - (void) wwscroll1(w, 0, w->ww_w.nr - 1, dir, 0); + (void) wwscroll1(w, w->ww_i.t - w->ww_w.t, + w->ww_i.b - w->ww_w.t, dir, 0); w->ww_scroll += dir; } } else { @@ -33,43 +34,42 @@ register n; } /* - * Scroll one line, between 'srow' and 'erow', in direction 'dir'. + * Scroll one line, between 'row1' and 'row2', in direction 'dir'. * Don't adjust ww_scroll. * And don't redraw 'leaveit' lines. */ -wwscroll1(w, srow, erow, dir, leaveit) +wwscroll1(w, row1, row2, dir, leaveit) register struct ww *w; -int srow, erow, dir; +int row1, row2, dir; int leaveit; { register i; - int srow1, erow1; + int row1x, row2x; int nvis; int nvismax; int deleted = 0; /* * See how many lines on the screen are affected. - * And calculate srow, erow, and left at the same time. + * And calculate row1x, row2x, and left at the same time. */ - for (i = srow; i <= erow && w->ww_nvis[i] == 0; i++) + for (i = row1; i < row2 && w->ww_nvis[i] == 0; i++) ; - if ((srow1 = i) > erow) { - /* can't do any fancy stuff */ - erow1 = srow1 - 1; + if (i >= row2) /* can't do any fancy stuff */ goto out; - } - for (i = erow; i >= srow && w->ww_nvis[i] == 0; i--) + row1x = i; + for (i = row2 - 1; i >= row1 && w->ww_nvis[i] == 0; i--) ; - if ((erow1 = i) == srow1) + if (i <= row1x) goto out; /* just one line is easy */ + row2x = i + 1; /* * See how much of this window is visible. */ - nvismax = wwncol * (erow1 - srow1 + 1); + nvismax = wwncol * (row2x - row1x); nvis = 0; - for (i = srow1; i <= erow1; i++) + for (i = row1x; i < row2x; i++) nvis += w->ww_nvis[i]; /* @@ -85,37 +85,37 @@ int leaveit; * But do worry when scrolling up. For hp2621. */ if (dir > 0) { - (*tt.tt_move)(srow1 + w->ww_w.t, 0); + (*tt.tt_move)(row1x + w->ww_w.t, 0); (*tt.tt_delline)(); - if (erow1 + w->ww_w.t != wwnrow - 1) { - (*tt.tt_move)(erow1 + w->ww_w.t, 0); + if (row2x + w->ww_w.t < wwnrow) { + (*tt.tt_move)(row2x + w->ww_w.t - 1, 0); (*tt.tt_insline)(); } /* * Fix up the old screen. */ - cpp = &wwos[srow1 + w->ww_w.t]; + cpp = &wwos[row1x + w->ww_w.t]; cqq = cpp + 1; tmp = *cpp; - for (i = erow1 - srow1; --i >= 0;) + for (i = row2x - row1x; --i > 0;) *cpp++ = *cqq++; *cpp = tmp; for (i = wwncol; --i >= 0;) tmp++->c_w = ' '; } else { - if (tt.tt_retain || erow1 + w->ww_w.t != wwnrow - 1) { - (*tt.tt_move)(erow1 + w->ww_w.t, 0); + if (tt.tt_retain || row2x + w->ww_w.t != wwnrow) { + (*tt.tt_move)(row2x + w->ww_w.t - 1, 0); (*tt.tt_delline)(); } - (*tt.tt_move)(srow1 + w->ww_w.t, 0); + (*tt.tt_move)(row1x + w->ww_w.t, 0); (*tt.tt_insline)(); /* * Fix up the old screen. */ - cqq = &wwos[erow1 + w->ww_w.t]; - cpp = cqq + 1; + cpp = &wwos[row2x + w->ww_w.t]; + cqq = cpp - 1; tmp = *cqq; - for (i = erow1 - srow1; --i >= 0;) + for (i = row2x - row1x; --i > 0;) *--cpp = *--cqq; *cqq = tmp; for (i = wwncol; --i >= 0;) @@ -136,69 +136,69 @@ int leaveit; register union ww_char *tmp; register union ww_char **cpp, **cqq; - cpp = &wwns[srow1 + w->ww_w.t]; + cpp = &wwns[row1x + w->ww_w.t]; cqq = cpp + 1; tmp = *cpp; - for (i = erow1 - srow1; --i >= 0;) + for (i = row2x - row1x; --i > 0;) *cpp++ = *cqq++; *cpp = tmp; } if (deleted) { register char *p, *q; - p = &wwtouched[srow1 + w->ww_w.t]; + p = &wwtouched[row1x + w->ww_w.t]; q = p + 1; - for (i = erow1 - srow1; --i >= 0;) + for (i = row2x - row1x; --i > 0;) *p++ = *q++; *p = 1; } else { register char *p; - p = &wwtouched[srow1 + w->ww_w.t]; - for (i = erow1 - srow1 + 1; --i >= 0;) + p = &wwtouched[row1x + w->ww_w.t]; + for (i = row2x - row1x; --i >= 0;) *p++ = 1; } - wwredrawwin1(w, srow, srow1 - 1, w->ww_scroll + dir); - wwredrawwin1(w, erow1, erow - leaveit, + wwredrawwin1(w, row1, row1x, w->ww_scroll + dir); + wwredrawwin1(w, row2x - 1, row2 - leaveit, w->ww_scroll + dir); } else { { register union ww_char *tmp; register union ww_char **cpp, **cqq; - cqq = &wwns[erow1 + w->ww_w.t]; - cpp = cqq + 1; + cpp = &wwns[row2x + w->ww_w.t]; + cqq = cpp - 1; tmp = *cqq; - for (i = erow1 - srow1; --i >= 0;) + for (i = row2x - row1x; --i > 0;) *--cpp = *--cqq; *cqq = tmp; } if (deleted) { register char *p, *q; - q = &wwtouched[erow1 + w->ww_w.t]; - p = q + 1; - for (i = erow1 - srow1; --i >= 0;) + p = &wwtouched[row2x + w->ww_w.t]; + q = p - 1; + for (i = row2x - row1x; --i > 0;) *--p = *--q; *q = 1; } else { register char *p; - p = &wwtouched[srow1 + w->ww_w.t]; - for (i = erow1 - srow1 + 1; --i >= 0;) + p = &wwtouched[row1x + w->ww_w.t]; + for (i = row2x - row1x; --i >= 0;) *p++ = 1; } - wwredrawwin1(w, srow + leaveit, srow1, + wwredrawwin1(w, row1 + leaveit, row1x - 1, w->ww_scroll + dir); - wwredrawwin1(w, erow1 + 1, erow, w->ww_scroll + dir); + wwredrawwin1(w, row2x, row2, w->ww_scroll + dir); } } else { out: if (dir > 0) - wwredrawwin1(w, srow, erow - leaveit, + wwredrawwin1(w, row1, row2 - leaveit, w->ww_scroll + dir); else - wwredrawwin1(w, srow + leaveit, erow, + wwredrawwin1(w, row1 + leaveit, row2, w->ww_scroll + dir); } return deleted; diff --git a/usr/src/usr.bin/window/wwwrite.c b/usr/src/usr.bin/window/wwwrite.c index 1e44f480f9..a6e8baee55 100644 --- a/usr/src/usr.bin/window/wwwrite.c +++ b/usr/src/usr.bin/window/wwwrite.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)wwwrite.c 3.9 83/08/26"; +static char *sccsid = "@(#)wwwrite.c 3.10 83/09/14"; #endif #include "ww.h" @@ -9,50 +9,57 @@ register struct ww *w; register char *p; int n; { - char c; - char hascursor = 0; + char hascursor; wwnwrite++; wwnwritec += n; if (hascursor = w->ww_hascursor) wwcursor(w, 0); - while (--n >= 0) { - c = *p++ & 0x7f; - switch (w->ww_wstate) { - case 0: - if (!ISCTRL(c)) { - int i, j; - register union ww_char *bp; - union ww_char *bq; + while (n > 0) { + if (w->ww_wstate == 0 && !ISCTRL(*p)) { + register i; + int crow, ccol; + register union ww_char *bp; + union ww_char *bq; + + if (w->ww_insert) { + n--; + wwinschar(w, w->ww_scroll + w->ww_cur.r, + w->ww_cur.c, + *p++ | w->ww_modes << WWC_MSHIFT); + goto right; + } + + bp = bq = &w->ww_buf[w->ww_scroll+w->ww_cur.r] + [w->ww_cur.c]; + if ((i = w->ww_w.nc - w->ww_cur.c) > n) + i = n; + while (--i >= 0 && !ISCTRL(*p)) + bp++->c_w = *p++ | w->ww_modes << WWC_MSHIFT; + i = bp - bq; + n -= i; + bp = bq; + + crow = wwcurrow(w); + ccol = wwcurcol(w); + if (ccol < w->ww_i.l) { + bp += w->ww_i.l - ccol; + ccol = w->ww_i.l; + } + w->ww_cur.c += i; + if (crow >= w->ww_i.t && crow < w->ww_i.b) { register union ww_char *ns; register char *smap; register char *win; char *touched; - if (w->ww_insert) { - wwinschar(w, w->ww_scroll + w->ww_cur.r, - w->ww_cur.c, - c | w->ww_modes << WWC_MSHIFT); - goto right; - } - i = w->ww_w.nc - w->ww_cur.c - 1; - bp = bq = &w->ww_buf[w->ww_scroll+w->ww_cur.r] - [w->ww_cur.c]; - bp++->c_w = c | w->ww_modes << WWC_MSHIFT; - while (n > 0 && --i >= 0 && !ISCTRL(*p)) { - n--; - bp++->c_w = *p++ & 0x7f - | w->ww_modes << WWC_MSHIFT; - } - win = &w->ww_win[w->ww_cur.r][w->ww_cur.c]; - i = wwcurrow(w); - j = wwcurcol(w); - smap = &wwsmap[i][j]; - ns = &wwns[i][j]; - touched = &wwtouched[i]; - j = i = bp - bq; - bp = bq; - while (--i >= 0) { + win = &w->ww_win[w->ww_cur.r][ccol - w->ww_w.l]; + smap = &wwsmap[crow][ccol]; + ns = &wwns[crow][ccol]; + touched = &wwtouched[crow]; + if (i > w->ww_i.r - ccol) + i = w->ww_i.r - ccol; + while (--i >= 0) if (*smap++ == w->ww_index) { *touched = 1; ns++->c_w = bp++->c_w @@ -62,14 +69,17 @@ int n; bp++; win++; } - } - if ((w->ww_cur.c += j) >= w->ww_w.nc) { - w->ww_cur.c = 0; - goto lf; - } - break; } - switch (c) { + if (w->ww_cur.c >= w->ww_w.nc) { + w->ww_cur.c = 0; + goto lf; + } + continue; + } + n--; + switch (w->ww_wstate) { + case 0: + switch (*p++) { case '\n': if (w->ww_mapnl) w->ww_cur.c = 0; @@ -110,7 +120,7 @@ int n; break; case 1: w->ww_wstate = 0; - switch (c) { + switch (*p++) { case '@': w->ww_insert = 1; break; @@ -175,11 +185,11 @@ int n; } break; case 2: - w->ww_cur.r = (c - ' ') % w->ww_w.nr; + w->ww_cur.r = (*p++ - ' ') % w->ww_w.nr; w->ww_wstate++; break; case 3: - w->ww_cur.c = (c - ' ') % w->ww_w.nc; + w->ww_cur.c = (*p++ - ' ') % w->ww_w.nc; w->ww_wstate = 0; break; } -- 2.20.1