* Copyright (c) 1983 Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Edward Wang at The University of California, Berkeley.
* Redistribution and use in source and binary forms are permitted provided
* that: (1) source distributions retain this entire copyright notice and
* comment, and (2) distributions including binaries display the following
* acknowledgement: ``This product includes software developed by the
* University of California, Berkeley and its contributors'' in the
* documentation or other materials provided with the distribution and in
* all advertising materials mentioning features or use of this software.
* Neither the name of the University nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
static char sccsid
[] = "@(#)wwscroll.c 3.24 (Berkeley) 6/6/90";
else if (top
+ w
->ww_b
.nr
< w
->ww_w
.b
)
top
= w
->ww_w
.b
- w
->ww_b
.nr
;
n
= abs(top
- w
->ww_b
.t
);
(void) wwscroll1(w
, w
->ww_i
.t
, w
->ww_i
.b
, dir
, 0);
w
->ww_buf
-= top
- w
->ww_b
.t
;
w
->ww_b
.b
= top
+ w
->ww_b
.nr
;
* Scroll one line, between 'row1' and 'row2', in direction 'dir'.
* Don't adjust ww_scroll.
* And don't redraw 'leaveit' lines.
wwscroll1(w
, row1
, row2
, dir
, leaveit
)
* See how many lines on the screen are affected.
* And calculate row1x, row2x, and left at the same time.
for (i
= row1
; i
< row2
&& w
->ww_nvis
[i
] == 0; i
++)
if (i
>= row2
) /* can't do any fancy stuff */
for (i
= row2
- 1; i
>= row1
&& w
->ww_nvis
[i
] == 0; i
--)
goto out
; /* just one line is easy */
* See how much of this window is visible.
nvismax
= wwncol
* (row2x
- row1x
);
for (i
= row1x
; i
< row2x
; i
++)
* If it's a good idea to scroll and the terminal can, then do it.
goto no_scroll
; /* not worth it */
if ((dir
> 0 ? tt
.tt_scroll_down
== 0 : tt
.tt_scroll_up
== 0) ||
(tt
.tt_scroll_top
!= row1x
|| tt
.tt_scroll_bot
!= row2x
- 1) &&
if (tt
.tt_delline
== 0 || tt
.tt_insline
== 0)
xxscroll(dir
, row1x
, row2x
);
register union ww_char
*tmp
;
register union ww_char
**cpp
, **cqq
;
for (i
= row2x
- row1x
; --i
> 0;)
for (i
= row2x
- row1x
; --i
> 0;)
for (i
= wwncol
; --i
>= 0;)
register union ww_char
*tmp
;
register union ww_char
**cpp
, **cqq
;
for (i
= row2x
- row1x
; --i
> 0;)
for (i
= row2x
- row1x
; --i
> 0;)
for (i
= row2x
- row1x
; --i
>= 0;)
wwredrawwin1(w
, row1
, row1x
, dir
);
wwredrawwin1(w
, row2x
- 1, row2
- leaveit
, dir
);
register union ww_char
*tmp
;
register union ww_char
**cpp
, **cqq
;
for (i
= row2x
- row1x
; --i
> 0;)
for (i
= row2x
- row1x
; --i
> 0;)
for (i
= row2x
- row1x
; --i
>= 0;)
wwredrawwin1(w
, row1
+ leaveit
, row1x
+ 1, dir
);
wwredrawwin1(w
, row2x
, row2
, dir
);
for (i
= row2x
- row1x
; --i
>= 0;)
wwredrawwin1(w
, row1
, row2
- leaveit
, dir
);
wwredrawwin1(w
, row1
+ leaveit
, row2
, dir
);