static char *sccsid
= "@(#)wwscroll.c 3.6 83/08/22";
scroll
= w
->ww_scroll
+ 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
);
(void) wwscroll1(w
, 0, w
->ww_w
.nr
- 1, dir
, 0);
* 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
)
* See how many lines on the screen are affected.
* And calculate srow, erow, and left at the same time.
for (i
= srow
; i
<= erow
&& w
->ww_nvis
[i
] == 0; i
++)
if ((srow1
= i
) > erow
) {
/* can't do any fancy stuff */
for (i
= erow
; i
>= srow
&& w
->ww_nvis
[i
] == 0; i
--)
if ((erow1
= i
) == srow1
)
goto out
; /* just one line is easy */
* See how much of this window is visible.
nvismax
= wwncol
* (erow1
- srow1
+ 1);
for (i
= srow1
; i
<= erow1
; i
++)
* If it's a good idea to use delete and insert line
* and the terminal can, then do it.
if (nvis
> nvismax
/ 2 && tt
.tt_delline
&& tt
.tt_insline
) {
register union ww_char
*tmp
;
register union ww_char
**cpp
, **cqq
;
(*tt
.tt_move
)(srow1
+ w
->ww_w
.t
, 0);
if (erow1
+ w
->ww_w
.t
!= wwnrow
- 1) {
(*tt
.tt_move
)(erow1
+ w
->ww_w
.t
, 0);
cpp
= &wwos
[srow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
; --i
>= 0;)
for (i
= wwncol
; --i
>= 0;)
if (erow1
+ w
->ww_w
.t
!= wwnrow
- 1) {
(*tt
.tt_move
)(erow1
+ w
->ww_w
.t
, 0);
(*tt
.tt_move
)(srow1
+ w
->ww_w
.t
, 0);
cqq
= &wwos
[erow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
; --i
>= 0;)
for (i
= wwncol
; --i
>= 0;)
register union ww_char
*tmp
;
register union ww_char
**cpp
, **cqq
;
cpp
= &wwns
[srow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
; --i
>= 0;)
p
= &wwtouched
[srow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
; --i
>= 0;)
p
= &wwtouched
[srow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
+ 1; --i
>= 0;)
wwredrawwin1(w
, srow
, srow1
- 1, w
->ww_scroll
+ dir
);
wwredrawwin1(w
, erow1
, erow
- leaveit
,
register union ww_char
*tmp
;
register union ww_char
**cpp
, **cqq
;
cqq
= &wwns
[erow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
; --i
>= 0;)
q
= &wwtouched
[erow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
; --i
>= 0;)
p
= &wwtouched
[srow1
+ w
->ww_w
.t
];
for (i
= erow1
- srow1
+ 1; --i
>= 0;)
wwredrawwin1(w
, srow
+ leaveit
, srow1
,
wwredrawwin1(w
, erow1
+ 1, erow
, w
->ww_scroll
+ dir
);
wwredrawwin1(w
, srow
, erow
- leaveit
,
wwredrawwin1(w
, srow
+ leaveit
, erow
,