From b0d4d9e2a677e0a009fa2d90dd584228adc4a127 Mon Sep 17 00:00:00 2001 From: Edward Wang Date: Thu, 18 Aug 1983 22:30:17 -0800 Subject: [PATCH] scrolling has come SCCS-vsn: usr.bin/window/cmd.c 3.3 SCCS-vsn: usr.bin/window/wwwrite.c 3.5 SCCS-vsn: usr.bin/window/cmd1.c 3.3 SCCS-vsn: usr.bin/window/wwscroll.c 3.4 SCCS-vsn: usr.bin/window/wwredrawwin.c 3.3 SCCS-vsn: usr.bin/window/cmd5.c 3.2 --- usr/src/usr.bin/window/cmd.c | 20 ++++--- usr/src/usr.bin/window/cmd1.c | 4 +- usr/src/usr.bin/window/cmd5.c | 22 +------ usr/src/usr.bin/window/wwredrawwin.c | 4 +- usr/src/usr.bin/window/wwscroll.c | 90 ++++++++++++++++++---------- usr/src/usr.bin/window/wwwrite.c | 22 +++++-- 6 files changed, 93 insertions(+), 69 deletions(-) diff --git a/usr/src/usr.bin/window/cmd.c b/usr/src/usr.bin/window/cmd.c index 408d7753b0..0dc9cd3df1 100644 --- a/usr/src/usr.bin/window/cmd.c +++ b/usr/src/usr.bin/window/cmd.c @@ -1,5 +1,5 @@ #ifndef lint -static char *sccsid = "@(#)cmd.c 3.2 83/08/17"; +static char *sccsid = "@(#)cmd.c 3.3 83/08/18"; #endif #include "defs.h" @@ -27,6 +27,8 @@ top: goto foo; break; case 'h': case 'j': case 'k': case 'l': + case CTRL(y): + case CTRL(e): case CTRL(u): case CTRL(d): case CTRL(b): @@ -108,20 +110,24 @@ top: case 'l': (void) wwwrite(selwin, "\033C", 2); break; - /* + case CTRL(e): + wwscroll(selwin, 1); + break; + case CTRL(y): + wwscroll(selwin, -1); + break; case CTRL(d): - c_scroll(1); + wwscroll(selwin, selwin->ww_w.nr / 2); break; case CTRL(u): - c_scroll(-1); + wwscroll(selwin, - selwin->ww_w.nr / 2); break; case CTRL(f): - c_scroll(2); + wwscroll(selwin, selwin->ww_w.nr); break; case CTRL(b): - c_scroll(-2); + wwscroll(selwin, - selwin->ww_w.nr); break; - */ case CTRL(s): (void) write(selwin->ww_pty, &wwwintty.ww_tchars.t_stopc, 1); diff --git a/usr/src/usr.bin/window/cmd1.c b/usr/src/usr.bin/window/cmd1.c index 47fd3699b0..b6d992b938 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.2 83/08/12"; +static char *sccsid = "@(#)cmd1.c 3.3 83/08/18"; #endif #include "defs.h" @@ -150,7 +150,7 @@ int id, nrow, ncol, row, col; return 0; if (id < 0 && (id = findid()) < 0) return 0; - if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, 0)) == 0) + if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, 48)) == 0) return 0; w->ww_id = id; window[id] = w; diff --git a/usr/src/usr.bin/window/cmd5.c b/usr/src/usr.bin/window/cmd5.c index 2b87d28e8e..0004c9b5b6 100644 --- a/usr/src/usr.bin/window/cmd5.c +++ b/usr/src/usr.bin/window/cmd5.c @@ -1,23 +1,3 @@ #ifndef lint -static char *sccsid = "@(#)cmd5.c 3.1 83/08/11"; +static char *sccsid = "@(#)cmd5.c 3.2 83/08/18"; #endif - -#include "defs.h" - -/* -c_scroll(dir) -int dir; -{ - register brow = selwin->ww_scroll; - - brow += dir * selwin->ww_w.nrow / 2; - if (brow < 0) - brow = 0; - else if (brow + selwin->ww_w.nrow > selwin->ww_nline) - brow = selwin->ww_nline - selwin->ww_w.nrow; - if (brow != selwin->ww_scroll) { - selwin->ww_scroll = brow; - wwredrawwin(selwin); - } -} -*/ diff --git a/usr/src/usr.bin/window/wwredrawwin.c b/usr/src/usr.bin/window/wwredrawwin.c index a7f89b7ec0..58cc246d82 100644 --- a/usr/src/usr.bin/window/wwredrawwin.c +++ b/usr/src/usr.bin/window/wwredrawwin.c @@ -1,16 +1,14 @@ #ifndef lint -static char *sccsid = "@(#)wwredrawwin.c 3.2 83/08/16"; +static char *sccsid = "@(#)wwredrawwin.c 3.3 83/08/18"; #endif #include "ww.h" -/* nobody calls it wwredrawwin(w) register struct ww *w; { wwredrawwin1(w, 0, w->ww_w.nr - 1, w->ww_scroll); } -*/ wwredrawwin1(w, srow, erow, offset) register struct ww *w; diff --git a/usr/src/usr.bin/window/wwscroll.c b/usr/src/usr.bin/window/wwscroll.c index 3cb0891d45..b8b3a6f630 100644 --- a/usr/src/usr.bin/window/wwscroll.c +++ b/usr/src/usr.bin/window/wwscroll.c @@ -1,21 +1,49 @@ #ifndef lint -static char *sccsid = "@(#)wwscroll.c 3.3 83/08/16"; +static char *sccsid = "@(#)wwscroll.c 3.4 83/08/18"; #endif #include "ww.h" #include "tt.h" +wwscroll(w, n) +register struct ww *w; +register n; +{ + int dir; + register scroll; + + if (n == 0) + return; + dir = n < 0 ? -1 : 1; + scroll = w->ww_scroll + n; + if (scroll < 0) + scroll = 0; + 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) { + while (--n >= 0) { + wwscroll1(w, 0, w->ww_w.nr - 1, dir, 0); + w->ww_scroll += dir; + } + } else { + w->ww_scroll = scroll; + wwredrawwin(w); + } +} + /* - * Scroll down one line, starting at 'line'. + * Scroll one line, between 'srow' and 'erow', in direction 'dir'. * Don't adjust ww_scroll. + * And don't redraw 'leaveit' lines. */ wwscroll1(w, srow, erow, dir, leaveit) register struct ww *w; int srow, erow, dir; -char leaveit; +int leaveit; { register i; - int startrow, endrow; + int srow1, erow1; int nvis; int nvismax; int deleted = 0; @@ -26,22 +54,22 @@ char leaveit; */ for (i = srow; i <= erow && w->ww_nvis[i] == 0; i++) ; - if ((startrow = i) > erow) { + if ((srow1 = i) > erow) { /* can't do any fancy stuff */ - endrow = startrow - 1; + erow1 = srow1 - 1; goto out; } for (i = erow; i >= srow && w->ww_nvis[i] == 0; i--) ; - if ((endrow = i) == startrow) + if ((erow1 = i) == srow1) goto out; /* just one line is easy */ /* * See how much of this window is visible. */ - nvismax = wwncol * (endrow - startrow + 1); + nvismax = wwncol * (erow1 - srow1 + 1); nvis = 0; - for (i = startrow; i <= endrow; i++) + for (i = srow1; i <= erow1; i++) nvis += w->ww_nvis[i]; /* @@ -53,37 +81,37 @@ char leaveit; register union ww_char **cpp, **cqq; if (dir > 0) { - (*tt.tt_move)(startrow + w->ww_w.t, 0); + (*tt.tt_move)(srow1 + w->ww_w.t, 0); (*tt.tt_delline)(); - if (endrow + w->ww_w.t != wwnrow - 1) { - (*tt.tt_move)(endrow + w->ww_w.t, 0); + if (erow1 + w->ww_w.t != wwnrow - 1) { + (*tt.tt_move)(erow1 + w->ww_w.t, 0); (*tt.tt_insline)(); } /* * Fix up the old screen. */ - cpp = &wwos[startrow + w->ww_w.t]; + cpp = &wwos[srow1 + w->ww_w.t]; cqq = cpp + 1; tmp = *cpp; - for (i = endrow - startrow; --i >= 0;) + for (i = erow1 - srow1; --i >= 0;) *cpp++ = *cqq++; *cpp = tmp; for (i = wwncol; --i >= 0;) tmp++->c_w = ' '; } else { - if (endrow + w->ww_w.t != wwnrow - 1) { - (*tt.tt_move)(endrow + w->ww_w.t, 0); + if (erow1 + w->ww_w.t != wwnrow - 1) { + (*tt.tt_move)(erow1 + w->ww_w.t, 0); (*tt.tt_delline)(); } - (*tt.tt_move)(startrow + w->ww_w.t, 0); + (*tt.tt_move)(srow1 + w->ww_w.t, 0); (*tt.tt_insline)(); /* * Fix up the old screen. */ - cqq = &wwos[endrow + w->ww_w.t]; + cqq = &wwos[erow1 + w->ww_w.t]; cpp = cqq + 1; tmp = *cqq; - for (i = endrow - startrow; --i >= 0;) + for (i = erow1 - srow1; --i >= 0;) *--cpp = *--cqq; *cqq = tmp; for (i = wwncol; --i >= 0;) @@ -104,49 +132,49 @@ char leaveit; register union ww_char *tmp; register union ww_char **cpp, **cqq; - cpp = &wwns[startrow + w->ww_w.t]; + cpp = &wwns[srow1 + w->ww_w.t]; cqq = cpp + 1; tmp = *cpp; - for (i = endrow - startrow; --i >= 0;) + for (i = erow1 - srow1; --i >= 0;) *cpp++ = *cqq++; *cpp = tmp; } { register char *p, *q; - p = &wwtouched[startrow + w->ww_w.t]; + p = &wwtouched[srow1 + w->ww_w.t]; q = p + 1; - for (i = endrow - startrow; --i >= 0;) + for (i = erow1 - srow1; --i >= 0;) *p++ = *q++; *p = 1; } - wwredrawwin1(w, srow, startrow - 1, w->ww_scroll + dir); - wwredrawwin1(w, endrow + 1, erow - leaveit, + wwredrawwin1(w, srow, srow1 - 1, w->ww_scroll + dir); + wwredrawwin1(w, erow1, erow - leaveit, w->ww_scroll + dir); } else { { register union ww_char *tmp; register union ww_char **cpp, **cqq; - cqq = &wwns[endrow + w->ww_w.t]; + cqq = &wwns[erow1 + w->ww_w.t]; cpp = cqq + 1; tmp = *cqq; - for (i = endrow - startrow; --i >= 0;) + for (i = erow1 - srow1; --i >= 0;) *--cpp = *--cqq; *cqq = tmp; } { register char *p, *q; - q = &wwtouched[endrow + w->ww_w.t]; + q = &wwtouched[erow1 + w->ww_w.t]; p = q + 1; - for (i = endrow - startrow; --i >= 0;) + for (i = erow1 - srow1; --i >= 0;) *--p = *--q; *q = 1; } - wwredrawwin1(w, srow + leaveit, startrow - 1, + wwredrawwin1(w, srow + leaveit, srow1, w->ww_scroll + dir); - wwredrawwin1(w, endrow + 1, erow, w->ww_scroll + dir); + wwredrawwin1(w, erow1 + 1, erow, w->ww_scroll + dir); } } else { out: diff --git a/usr/src/usr.bin/window/wwwrite.c b/usr/src/usr.bin/window/wwwrite.c index dcc0c76fda..cd7fe60849 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.4 83/08/17"; +static char *sccsid = "@(#)wwwrite.c 3.5 83/08/18"; #endif #include "ww.h" @@ -75,7 +75,11 @@ int n; lf: if (++w->ww_cur.r >= w->ww_w.nr) { w->ww_cur.r = w->ww_w.nr - 1; - wwdelline(w, 0); + if (w->ww_scroll + w->ww_w.nr + < w->ww_nline) + wwscroll(w, 1); + else + wwdelline(w, 0); } break; case '\t': @@ -87,8 +91,10 @@ int n; } break; case '\b': - if (--w->ww_cur.c < 0) - w->ww_cur.c = 0; + if (--w->ww_cur.c < 0) { + w->ww_cur.c = w->ww_w.nc - 1; + goto up; + } break; case '\r': w->ww_cur.c = 0; @@ -108,8 +114,14 @@ int n; w->ww_insert = 1; break; case 'A': - if (--w->ww_cur.r < 0) + up: + if (--w->ww_cur.r < 0) { w->ww_cur.r = 0; + if (w->ww_scroll > 0) + wwscroll(w, -1); + else + wwinsline(w, 0); + } break; case 'B': goto lf; -- 2.20.1