1
0
mirror of synced 2026-01-15 00:12:24 +00:00

TEDITWINDOW: Fix offscreen scrolling #669

This commit is contained in:
rmkaplan 2022-02-19 18:32:24 -08:00
parent ac1fcd2e2e
commit 160cf35f91
2 changed files with 223 additions and 245 deletions

View File

@ -1,12 +1,12 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "21-Jan-2022 23:14:36" 
{DSK}<Users>kaplan>Local>medley3.5>my-medley>library>TEDITWINDOW.;32 189300
(FILECREATED "18-Feb-2022 14:54:02" 
{DSK}<Users>kaplan>Local>medley3.5>my-medley>library>TEDITWINDOW.;33 187007
:CHANGES-TO (FNS TEDIT.GETINPUT)
:CHANGES-TO (FNS \TEDIT.SCROLLFN)
:PREVIOUS-DATE " 1-Jan-2022 23:55:46"
{DSK}<Users>kaplan>Local>medley3.5>my-medley>library>TEDITWINDOW.;31)
:PREVIOUS-DATE "21-Jan-2022 23:14:36"
{DSK}<Users>kaplan>Local>medley3.5>my-medley>library>TEDITWINDOW.;32)
(* ; "
@ -1969,9 +1969,13 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
])
(\TEDIT.SCROLLFN
[LAMBDA (W DX DY) (* ; "Edited 19-Sep-2021 23:10 by rmk:")
(* Handle scrolling of the edit
 window)
[LAMBDA (W DX DY)
(* ;;
 "Edited 18-Feb-2022 14:53 by rmk: Repaint after scrolling for windows that are partially off-screen")
(* ;; "Edited 19-Sep-2021 23:10 by rmk:")
(* Handle scrolling of the edit window)
(TOTOPW W)
(PROG* (WHEIGHT (TEXTOBJ (WINDOWPROP W 'TEXTOBJ))
(PRIORCR 0)
@ -1985,34 +1989,30 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
((ZEROP (SETQ TEXTLEN (fetch (TEXTOBJ TEXTLEN) of TEXTOBJ)))
(* Don't scroll a zero-length file)
(RETURN))
((fetch (TEXTOBJ EDITOPACTIVE) of TEXTOBJ)
(* Don't scroll while something
 interesting is happening!)
((fetch (TEXTOBJ EDITOPACTIVE) of TEXTOBJ) (* Don't scroll while something
 interesting is happening!)
(TEDIT.PROMPTPRINT TEXTOBJ "Edit operation in progress." T)
(RETURN))) (* Displaystream for the window)
(SETQ WHEIGHT (fetch HEIGHT of WREG)) (* Height of the window)
(SETQ LOWESTY WHEIGHT) (* Lowest Y of a line-bottom yet
 seet)
(SETQ WWIDTH (fetch WIDTH of WREG)) (* Width of the window)
(SETQ WHEIGHT (fetch HEIGHT of WREG)) (* Height of the window)
(SETQ LOWESTY WHEIGHT) (* Lowest Y of a line-bottom yet seet)
(SETQ WWIDTH (fetch WIDTH of WREG)) (* Width of the window)
(SETQ LINES (WINDOWPROP W 'LINES)) (* List of formatted lines)
(AND PRESCROLLFN (DOUSERFNS PRESCROLLFN W)) (* If there's a pre-scroll fn,
 execute it now.)
(AND PRESCROLLFN (DOUSERFNS PRESCROLLFN W)) (* If there's a pre-scroll fn, execute
 it now.)
(COND
((fetch (SELECTION SET) of (SETQ SEL (fetch (TEXTOBJ SEL) of TEXTOBJ)))
(* Turn off the selection during the
 scroll.)
 scroll.)
(SETQ SELWASON (fetch (SELECTION ONFLG) of SEL))
(\SHOWSEL SEL NIL NIL)))
(SETQ SHIFTEDSELWASON (fetch (SELECTION ONFLG) of (fetch (TEXTOBJ SHIFTEDSEL)
of TEXTOBJ)))
(SETQ SHIFTEDSELWASON (fetch (SELECTION ONFLG) of (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ))
)
(\SHOWSEL (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ)
NIL NIL)
(SETQ MOVESELWASON (fetch (SELECTION ONFLG) of (fetch (TEXTOBJ MOVESEL)
of TEXTOBJ)))
(SETQ MOVESELWASON (fetch (SELECTION ONFLG) of (fetch (TEXTOBJ MOVESEL) of TEXTOBJ)))
(\SHOWSEL (fetch (TEXTOBJ MOVESEL) of TEXTOBJ)
NIL NIL)
(SETQ DELETESELWASON (fetch (SELECTION ONFLG) of (fetch (TEXTOBJ DELETESEL)
of TEXTOBJ)))
(SETQ DELETESELWASON (fetch (SELECTION ONFLG) of (fetch (TEXTOBJ DELETESEL) of TEXTOBJ)))
(\SHOWSEL (fetch (TEXTOBJ DELETESEL) of TEXTOBJ)
NIL NIL)
(COND
@ -2023,83 +2023,69 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
[(ILESSP 0 DY) (* Scroll text up)
(SETQ LINE LINES)
(while (AND LINE (IGEQ (fetch (LINEDESCRIPTOR YBOT) of LINE)
WHEIGHT)) do (SETQ LINE (fetch (LINEDESCRIPTOR
NEXTLINE)
of LINE)))
WHEIGHT)) do (SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE)
of LINE)))
(first [COND
((AND LINE (ILESSP (fetch (LINEDESCRIPTOR YBOT) of LINE)
TRUEY)) (* Make sure we scroll up at least
 one line.)
(replace (LINEDESCRIPTOR YBASE) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR DESCENT) of
LINE)
(replace (LINEDESCRIPTOR YBOT) of LINE
with WHEIGHT)))
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE]
while LINE do (* Find the line whose top is to
 move to the top of the window)
[COND
((ILESSP (fetch (LINEDESCRIPTOR YBOT) of LINE)
TRUEY)
(RETURN))
(T (replace (LINEDESCRIPTOR YBASE) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR
DESCENT)
of LINE)
(replace (LINEDESCRIPTOR
YBOT) of LINE
with WHEIGHT]
(SETQ PREVLINE LINE)
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE)
of LINE)))
((AND LINE (ILESSP (fetch (LINEDESCRIPTOR YBOT) of LINE)
TRUEY)) (* Make sure we scroll up at least one
 line.)
(replace (LINEDESCRIPTOR YBASE) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR DESCENT) of LINE)
(replace (LINEDESCRIPTOR YBOT) of LINE with WHEIGHT)))
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE] while LINE
do (* Find the line whose top is to move
 to the top of the window)
[COND
((ILESSP (fetch (LINEDESCRIPTOR YBOT) of LINE)
TRUEY)
(RETURN))
(T (replace (LINEDESCRIPTOR YBASE) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR DESCENT) of LINE)
(replace (LINEDESCRIPTOR YBOT) of LINE with WHEIGHT]
(SETQ PREVLINE LINE)
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE)))
[COND
(LINE (* There is a line to go to the top)
(SETQ RHEIGHT (IPLUS (fetch (LINEDESCRIPTOR YBASE) of LINE)
(fetch (LINEDESCRIPTOR ASCENT) of LINE)))
(* Find the Ypos of the top of the
 line's image)
 line's image)
(BITBLT W 0 0 W 0 (IDIFFERENCE WHEIGHT RHEIGHT)
WWIDTH RHEIGHT 'INPUT 'REPLACE)
(BITBLT NIL 0 0 W 0 0 WWIDTH (IDIFFERENCE WHEIGHT RHEIGHT)
'TEXTURE
'REPLACE WHITESHADE)
[bind NL (PL _ PREVLINE) for I from 1 to 50 while
PL
do (* Let him keep 50 lines above what
 he can see on the screen)
(SETQ PL (fetch (LINEDESCRIPTOR PREVLINE) of PL))
[bind NL (PL _ PREVLINE) for I from 1 to 50 while PL
do (* Let him keep 50 lines above what he
 can see on the screen)
(SETQ PL (fetch (LINEDESCRIPTOR PREVLINE) of PL))
finally (COND
((AND PL (NEQ PL LINES))
((AND PL (NEQ PL LINES))
(* There were more than 50 lines
 (and we aren't pointing at the root)
 %, so lop the spare ones off.)
(SETQ NL (fetch (LINEDESCRIPTOR NEXTLINE)
of LINES))
(UNINTERRUPTABLY
(replace (LINEDESCRIPTOR NEXTLINE)
of LINES with PL)
(replace (LINEDESCRIPTOR PREVLINE)
of PL with LINES))
(bind NNL while (AND NL (NEQ NL PL))
do (SETQ NNL NL)
(SETQ NL (fetch (LINEDESCRIPTOR NEXTLINE)
of NL))
(replace (LINEDESCRIPTOR NEXTLINE)
of NNL with NIL]
 (and we aren't pointing at the root)%,
 so lop the spare ones off.)
(SETQ NL (fetch (LINEDESCRIPTOR NEXTLINE) of LINES))
(UNINTERRUPTABLY
(replace (LINEDESCRIPTOR NEXTLINE) of LINES
with PL)
(replace (LINEDESCRIPTOR PREVLINE) of PL with LINES))
(bind NNL while (AND NL (NEQ NL PL))
do (SETQ NNL NL)
(SETQ NL (fetch (LINEDESCRIPTOR NEXTLINE)
of NL))
(replace (LINEDESCRIPTOR NEXTLINE) of NNL
with NIL]
(while (AND LINE (IGEQ (fetch (LINEDESCRIPTOR YBOT) of LINE)
(fetch BOTTOM of WREG)))
do (* Update the bottom and baseline)
(replace (LINEDESCRIPTOR YBOT) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR YBOT) of
LINE)
(IDIFFERENCE WHEIGHT RHEIGHT)))
(replace (LINEDESCRIPTOR YBASE) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR YBOT) of
LINE)
(fetch (LINEDESCRIPTOR DESCENT)
of LINE)))
(SETQ PREVLINE LINE)
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE]
(fetch BOTTOM of WREG)))
do (* Update the bottom and baseline)
(replace (LINEDESCRIPTOR YBOT) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR YBOT) of LINE)
(IDIFFERENCE WHEIGHT RHEIGHT)))
(replace (LINEDESCRIPTOR YBASE) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR YBOT) of LINE)
(fetch (LINEDESCRIPTOR DESCENT) of LINE)))
(SETQ PREVLINE LINE)
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE]
(COND
((AND LINE (IGEQ (fetch (LINEDESCRIPTOR YBOT) of LINE)
(fetch BOTTOM of WREG)))
@ -2108,72 +2094,67 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
LINE TEXTOBJ NIL W))
(PREVLINE (\FILLWINDOW (fetch (LINEDESCRIPTOR YBOT) of PREVLINE)
PREVLINE TEXTOBJ NIL W]
(T (* Scroll text down in window,
 adding lines at top to fill.)
(T (* Scroll text down in window, adding
 lines at top to fill.)
(SETQ PREVLINE (SETQ TOPLINE LINES)) (* Find the top line on the screen%:)
[while TOPLINE do
(* Run thru the lines, until we hit the first one that is below the top of the
 edit window)
 edit window)
(COND
((ILESSP (fetch (LINEDESCRIPTOR YBOT)
of TOPLINE)
WHEIGHT)
(RETURN))
(T (SETQ PREVLINE TOPLINE)
(SETQ TOPLINE (fetch (LINEDESCRIPTOR NEXTLINE
) of TOPLINE]
(COND
((ILESSP (fetch (LINEDESCRIPTOR YBOT) of TOPLINE)
WHEIGHT)
(RETURN))
(T (SETQ PREVLINE TOPLINE)
(SETQ TOPLINE (fetch (LINEDESCRIPTOR NEXTLINE)
of TOPLINE]
[COND
((AND (EQ PREVLINE LINES)
(OR (NOT (fetch (LINEDESCRIPTOR NEXTLINE) of PREVLINE))
(IGREATERP (fetch (LINEDESCRIPTOR CHAR1)
of (fetch (LINEDESCRIPTOR NEXTLINE)
of PREVLINE))
(IGREATERP (fetch (LINEDESCRIPTOR CHAR1) of (fetch (LINEDESCRIPTOR
NEXTLINE)
of PREVLINE))
1))) (* There's nothing between us and
 start of file that's formatted;
 start by making some.)
 start of file that's formatted;
 start by making some.)
(SETQ PREVLINE (\BACKFORMAT LINES TEXTOBJ WHEIGHT]
(SETQ THEIGHT 0)
(* Accumulates the heights of the lines we've backed over.
 When this exceeds the scrolling distance, we've found the line.)
 When this exceeds the scrolling distance, we've found the line.)
(bind (FIRSTTIME _ T) while (OR FIRSTTIME
(AND (ILESSP THEIGHT (IABS DY))
(IGEQ (fetch (LINEDESCRIPTOR
CHAR1)
of PREVLINE)
1)))
(bind (FIRSTTIME _ T) while (OR FIRSTTIME (AND (ILESSP THEIGHT (IABS DY))
(IGEQ (fetch (LINEDESCRIPTOR
CHAR1) of PREVLINE)
1)))
do
(* Starting with PREVLINE, accumulate LHEIGHTs until we hit top of text or have
 accumulated enough lines to fill the screen)
 accumulated enough lines to fill the screen)
(add THEIGHT (fetch (LINEDESCRIPTOR LHEIGHT) of PREVLINE))
(SETQ PREVLINE (fetch (LINEDESCRIPTOR PREVLINE) of PREVLINE))
[COND
((OR (NOT PREVLINE)
(ILESSP (fetch (LINEDESCRIPTOR CHAR1) of PREVLINE)
1)) (* We need to format some lines
 above where we are --
 go do it.)
(SETQ PREVLINE (\BACKFORMAT LINES TEXTOBJ WHEIGHT]
(SETQ FIRSTTIME NIL))
(add THEIGHT (fetch (LINEDESCRIPTOR LHEIGHT) of PREVLINE))
(SETQ PREVLINE (fetch (LINEDESCRIPTOR PREVLINE) of PREVLINE))
[COND
((OR (NOT PREVLINE)
(ILESSP (fetch (LINEDESCRIPTOR CHAR1) of PREVLINE)
1)) (* We need to format some lines above
 where we are -- go do it.)
(SETQ PREVLINE (\BACKFORMAT LINES TEXTOBJ WHEIGHT]
(SETQ FIRSTTIME NIL))
[COND
([OR (EQ TOPLINE (fetch (LINEDESCRIPTOR NEXTLINE) of PREVLINE))
(EQ TOPLINE (fetch (LINEDESCRIPTOR NEXTLINE)
of (fetch (LINEDESCRIPTOR NEXTLINE) of
PREVLINE
]
(EQ TOPLINE (fetch (LINEDESCRIPTOR NEXTLINE) of (fetch (LINEDESCRIPTOR
NEXTLINE)
of PREVLINE]
(* Always move at least one line backward.
 So if we're about to move no lines, force a single line.)
 So if we're about to move no lines, force a single line.)
)
((ILESSP (IABS DY)
THEIGHT) (* BACK UP ONE LINE TO GET TO THE
 ONE WHICH PUSHED US OVER TOP)
THEIGHT) (* BACK UP ONE LINE TO GET TO THE ONE
 WHICH PUSHED US OVER TOP)
(SETQ PREVLINE (fetch (LINEDESCRIPTOR NEXTLINE) of PREVLINE))
(SETQ THEIGHT (IDIFFERENCE THEIGHT (fetch (LINEDESCRIPTOR LHEIGHT)
of PREVLINE]
@ -2181,7 +2162,7 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
((NEQ TOPLINE (fetch (LINEDESCRIPTOR NEXTLINE) of PREVLINE))
(SETQ PREVLINE (fetch (LINEDESCRIPTOR NEXTLINE) of PREVLINE]
(* Move to the first line to be
 formatted.-)
 formatted.-)
(BITBLT W 0 THEIGHT W 0 0 WWIDTH (IDIFFERENCE WHEIGHT THEIGHT)
'INPUT
'REPLACE)
@ -2189,27 +2170,25 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
WWIDTH THEIGHT 'TEXTURE 'REPLACE WHITESHADE)
(bind (LINE _ TOPLINE) while LINE
do (COND
((IGEQ (fetch (LINEDESCRIPTOR YBOT) of LINE)
(IPLUS (fetch BOTTOM of WREG)
THEIGHT)) (* This line will be on screen.
 Adjust its YBOT/YBASE)
(replace (LINEDESCRIPTOR YBOT) of LINE
with (IDIFFERENCE (fetch (LINEDESCRIPTOR YBOT)
of LINE)
THEIGHT))
(replace (LINEDESCRIPTOR YBASE) of LINE
with (IDIFFERENCE (fetch (LINEDESCRIPTOR YBASE)
of LINE)
THEIGHT))
(SETQ LOWESTY (fetch (LINEDESCRIPTOR YBOT) of LINE)))
(T (replace (LINEDESCRIPTOR YBOT) of LINE
with (SUB1 (fetch BOTTOM of WREG)))
(replace (LINEDESCRIPTOR NEXTLINE)
of (fetch (LINEDESCRIPTOR PREVLINE) of LINE)
with NIL)
(SETQ LINE (fetch (LINEDESCRIPTOR PREVLINE) of LINE))
(RETURN)))
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE))
((IGEQ (fetch (LINEDESCRIPTOR YBOT) of LINE)
(IPLUS (fetch BOTTOM of WREG)
THEIGHT)) (* This line will be on screen.
 Adjust its YBOT/YBASE)
(replace (LINEDESCRIPTOR YBOT) of LINE
with (IDIFFERENCE (fetch (LINEDESCRIPTOR YBOT) of LINE)
THEIGHT))
(replace (LINEDESCRIPTOR YBASE) of LINE
with (IDIFFERENCE (fetch (LINEDESCRIPTOR YBASE) of LINE)
THEIGHT))
(SETQ LOWESTY (fetch (LINEDESCRIPTOR YBOT) of LINE)))
(T (replace (LINEDESCRIPTOR YBOT) of LINE
with (SUB1 (fetch BOTTOM of WREG)))
(replace (LINEDESCRIPTOR NEXTLINE) of (fetch (LINEDESCRIPTOR
PREVLINE)
of LINE) with NIL)
(SETQ LINE (fetch (LINEDESCRIPTOR PREVLINE) of LINE))
(RETURN)))
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE))
(* Clear anything below us))
(BITBLT NIL 0 0 W 0 (fetch BOTTOM of WREG)
WWIDTH
@ -2221,104 +2200,89 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
do
(* Move down lines to be added, adjusting YBOT/YBASE and DISPALYLINE-ing them,
 until the next line to do EQ TOPLINE)
 until the next line to do EQ TOPLINE)
[replace (LINEDESCRIPTOR YBOT) of PREVLINE
with (COND
[(AND (fetch (LINEDESCRIPTOR PREVLINE) of
PREVLINE
)
(IGREATERP (fetch (LINEDESCRIPTOR CHAR1)
of PREVLINE)
0)
(fetch (FMTSPEC FMTBASETOBASE)
of (fetch (LINEDESCRIPTOR LFMTSPEC)
of PREVLINE)))
(SETQ YBOT (IDIFFERENCE
(IPLUS YBOT (fetch (LINEDESCRIPTOR
DESCENT)
of (fetch
(LINEDESCRIPTOR
PREVLINE)
of PREVLINE)))
(IPLUS (fetch (FMTSPEC FMTBASETOBASE)
of (fetch (LINEDESCRIPTOR
LFMTSPEC)
of PREVLINE))
(fetch (LINEDESCRIPTOR DESCENT)
of PREVLINE]
(T (SETQ YBOT (IDIFFERENCE YBOT (fetch (
[replace (LINEDESCRIPTOR YBOT) of PREVLINE
with (COND
[(AND (fetch (LINEDESCRIPTOR PREVLINE) of PREVLINE)
(IGREATERP (fetch (LINEDESCRIPTOR CHAR1) of PREVLINE)
0)
(fetch (FMTSPEC FMTBASETOBASE) of (fetch (LINEDESCRIPTOR
LFMTSPEC)
of PREVLINE)))
(SETQ YBOT (IDIFFERENCE (IPLUS YBOT (fetch (LINEDESCRIPTOR
DESCENT)
of (fetch (
LINEDESCRIPTOR
LHEIGHT)
of PREVLINE]
(replace (LINEDESCRIPTOR YBASE) of PREVLINE
with (IPLUS (fetch (LINEDESCRIPTOR YBOT) of PREVLINE)
(fetch (LINEDESCRIPTOR DESCENT) of PREVLINE)
))
(\DISPLAYLINE TEXTOBJ PREVLINE W)
(SETQ PREVLINE (fetch (LINEDESCRIPTOR NEXTLINE) of PREVLINE]
PREVLINE)
of PREVLINE)))
(IPLUS (fetch (FMTSPEC FMTBASETOBASE)
of (fetch (LINEDESCRIPTOR LFMTSPEC
) of PREVLINE))
(fetch (LINEDESCRIPTOR DESCENT)
of PREVLINE]
(T (SETQ YBOT (IDIFFERENCE YBOT (fetch (LINEDESCRIPTOR LHEIGHT)
of PREVLINE]
(replace (LINEDESCRIPTOR YBASE) of PREVLINE
with (IPLUS (fetch (LINEDESCRIPTOR YBOT) of PREVLINE)
(fetch (LINEDESCRIPTOR DESCENT) of PREVLINE)))
(\DISPLAYLINE TEXTOBJ PREVLINE W)
(SETQ PREVLINE (fetch (LINEDESCRIPTOR NEXTLINE) of PREVLINE]
((FLOATP DY) (* Do a thumbing-type scroll)
(SETQ CH# (IMAX (IMIN (SUB1 TEXTLEN)
(FIXR (FTIMES TEXTLEN DY)))
1))
(SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINES))
[while (AND LINE (ILESSP (fetch (LINEDESCRIPTOR CHARLIM) of LINE)
CH#)) do (SETQ LINE (fetch (LINEDESCRIPTOR
NEXTLINE)
of LINE))
CH#)) do (SETQ LINE (fetch (LINEDESCRIPTOR NEXTLINE)
of LINE))
finally (COND
((AND LINE (IGREATERP (fetch (LINEDESCRIPTOR CHAR1) of
LINE)
CH#))
(SETQ LINE NIL] (* find out if any line currently
 formatted includes the target char)
((AND LINE (IGREATERP (fetch (LINEDESCRIPTOR CHAR1) of LINE)
CH#))
(SETQ LINE NIL] (* find out if any line currently
 formatted includes the target char)
(COND
((AND LINE (fetch (LINEDESCRIPTOR NEXTLINE) of LINE)
(IGEQ (fetch (LINEDESCRIPTOR CHAR1) of LINE)
1))
(* If so, let's do this as a fast scroll, rather than a complete repaint of the
 screen)
 screen)
[SETQ DY (COND
[(ILEQ WHEIGHT (fetch (LINEDESCRIPTOR YBOT) of LINE))
(* this line is off the top of the
 window)
 window)
(IMINUS (for (DESCENDLINE _ (fetch (LINEDESCRIPTOR NEXTLINE)
of LINE))
by (fetch (LINEDESCRIPTOR NEXTLINE) of
DESCENDLINE
)
while (AND DESCENDLINE (ILEQ WHEIGHT
(fetch (
of LINE))
by (fetch (LINEDESCRIPTOR NEXTLINE) of DESCENDLINE)
while (AND DESCENDLINE (ILEQ WHEIGHT (fetch (
LINEDESCRIPTOR
YBOT)
of DESCENDLINE)))
of DESCENDLINE)))
sum
(* sum the heights of all the lines in between the new top line and the present
 top line)
 top line)
(fetch (LINEDESCRIPTOR LHEIGHT) of
DESCENDLINE
]
(fetch (LINEDESCRIPTOR LHEIGHT) of DESCENDLINE]
(T (IDIFFERENCE (IDIFFERENCE WHEIGHT (fetch (LINEDESCRIPTOR YBOT)
of LINE))
(fetch (LINEDESCRIPTOR LHEIGHT) of LINE]
(\TEDIT.SCROLLFN W 0 DY)
(* recurse telling to normally scroll instead of thumb scroll so that the
 screen is not blanked and reformatted unnecessarily)
(* recurse telling to normally scroll instead of thumb scroll so that the screen
 is not blanked and reformatted unnecessarily)
)
(T [for LINE inside (fetch (SELECTION L1) of SEL) when LINE
do (replace (LINEDESCRIPTOR YBOT) of LINE
with (SUB1 (fetch BOTTOM of WREG]
do (replace (LINEDESCRIPTOR YBOT) of LINE with (SUB1 (fetch BOTTOM
of WREG]
(* Make sure it thinks the old
 selection is off-screen for now)
 selection is off-screen for now)
[for LINE inside (fetch (SELECTION LN) of SEL) when LINE
do (replace (LINEDESCRIPTOR YBOT) of LINE
with (SUB1 (fetch BOTTOM of WREG]
do (replace (LINEDESCRIPTOR YBOT) of LINE with (SUB1 (fetch BOTTOM
of WREG]
(BITBLT NIL 0 0 W 0 (fetch BOTTOM of WREG)
WWIDTH
(IDIFFERENCE WHEIGHT (fetch BOTTOM of WREG))
@ -2326,20 +2290,20 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
'REPLACE WHITESHADE)
(SETQ LINE (\TEDIT.FIND.FIRST.LINE TEXTOBJ WHEIGHT CH# W))
(* Find the first line to go in the
 window)
(replace (LINEDESCRIPTOR YBOT) of LINE with
(IDIFFERENCE WHEIGHT
(fetch (LINEDESCRIPTOR
LHEIGHT)
of LINE)))
 window)
(replace (LINEDESCRIPTOR YBOT) of LINE with (IDIFFERENCE WHEIGHT
(fetch (LINEDESCRIPTOR
LHEIGHT)
of LINE)))
(* Set it up as the top line.)
(replace (LINEDESCRIPTOR YBASE) of LINE
with (IPLUS (fetch (LINEDESCRIPTOR YBOT) of LINE)
(fetch (LINEDESCRIPTOR DESCENT) of LINE)))
(replace (LINEDESCRIPTOR YBASE) of LINE with (IPLUS (fetch (LINEDESCRIPTOR
YBOT) of LINE)
(fetch (LINEDESCRIPTOR
DESCENT)
of LINE)))
(\DISPLAYLINE TEXTOBJ LINE W)
(\FILLWINDOW (fetch (LINEDESCRIPTOR YBOT) of LINE)
LINE TEXTOBJ NIL W))) (* And fill out the window from
 there.)
LINE TEXTOBJ NIL W))) (* And fill out the window from there.)
))
(AND POSTSCROLLFN (DOUSERFNS POSTSCROLLFN W)) (* For user subsystem cleanup)
[COND
@ -2364,7 +2328,21 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
TEXTOBJ)
(AND DELETESELWASON (\SHOWSEL (fetch (TEXTOBJ DELETESEL) of TEXTOBJ)
NIL T]
(\TEDIT.SET.WINDOW.EXTENT TEXTOBJ W])
(\TEDIT.SET.WINDOW.EXTENT TEXTOBJ W))
(* ;; "rmk: This makes scrolling for partially off-screen window work properly.")
(CL:UNLESS (LET [(WREG (WINDOWPROP W 'REGION]
(AND (IGEQ (FETCH (REGION BOTTOM) OF WREG)
0)
(IGEQ (FETCH (REGION LEFT) OF WREG)
0)
(ILEQ (FETCH (REGION PTOP) OF WREG)
SCREENHEIGHT)
(ILEQ (FETCH (REGION PRIGHT) OF WREG)
SCREENWIDTH)))
(\TEDIT.REPAINTFN W))
NIL])
)
@ -2874,25 +2852,25 @@ Copyright (c) 1983-1991, 1993-1994, 1999, 2021 by John Sybalsky & Xerox Corporat
(PUTPROPS TEDITWINDOW COPYRIGHT ("John Sybalsky & Xerox Corporation" 1983 1984 1985 1986 1987 1988
1989 1990 1991 1993 1994 1999 2021))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (7221 95655 (TEDIT.CREATEW 7231 . 9985) (\TEDIT.CREATEW.FROM.REGION 9987 . 10971) (
TEDIT.CURSORMOVEDFN 10973 . 22359) (TEDIT.CURSOROUTFN 22361 . 22896) (TEDIT.WINDOW.SETUP 22898 . 24707
) (TEDIT.MINIMAL.WINDOW.SETUP 24709 . 32498) (\TEDIT.ACTIVE.WINDOWP 32500 . 33481) (
\TEDIT.BUTTONEVENTFN 33483 . 58473) (\TEDIT.WINDOW.OPS 58475 . 62436) (\TEDIT.EXPANDFN 62438 . 62841)
(\TEDIT.MAINW 62843 . 64132) (\TEDIT.PRIMARYW 64134 . 65346) (\TEDIT.COPYINSERTFN 65348 . 66319) (
\TEDIT.NEWREGIONFN 66321 . 68788) (\TEDIT.SET.WINDOW.EXTENT 68790 . 74892) (\TEDIT.SHRINK.ICONCREATE
74894 . 77166) (\TEDIT.SHRINKFN 77168 . 77743) (\TEDIT.SPLITW 77745 . 83846) (\TEDIT.UNSPLITW 83848 .
89542) (\TEDIT.WINDOW.SETUP 89544 . 95264) (\SAFE.FIRST 95266 . 95653)) (96985 97892 (TEDITWINDOWP
96995 . 97890)) (97929 100502 (TEDIT.GETINPUT 97939 . 99999) (\TEDIT.MAKEFILENAME 100001 . 100500)) (
100551 107002 (TEDIT.PROMPTPRINT 100561 . 103465) (TEDIT.PROMPTFLASH 103467 . 105422) (
\TEDIT.PROMPT.PAGEFULLFN 105424 . 107000)) (107237 111230 (TEXTSTREAM.TITLE 107247 . 107868) (
\TEDIT.ORIGINAL.WINDOW.TITLE 107870 . 109846) (\TEDIT.WINDOW.TITLE 109848 . 110518) (
\TEXTSTREAM.FILENAME 110520 . 111228)) (111273 156172 (TEDIT.DEACTIVATE.WINDOW 111283 . 118590) (
\TEDIT.REPAINTFN 118592 . 121449) (\TEDIT.RESHAPEFN 121451 . 127071) (\TEDIT.SCROLLFN 127073 . 156170)
) (156214 158263 (\TEDIT.PROCIDLEFN 156224 . 157573) (\TEDIT.PROCENTRYFN 157575 . 157868) (
\TEDIT.PROCEXITFN 157870 . 158261)) (158342 169342 (\EDIT.DOWNCARET 158352 . 159033) (\EDIT.FLIPCARET
159035 . 160570) (TEDIT.FLASHCARET 160572 . 161686) (\EDIT.UPCARET 161688 . 162141) (
TEDIT.NORMALIZECARET 162143 . 168094) (\SETCARET 168096 . 169016) (\TEDIT.CARET 169018 . 169340)) (
169376 183131 (TEDIT.ADD.MENUITEM 169386 . 171301) (TEDIT.DEFAULT.MENUFN 171303 . 180570) (
TEDIT.REMOVE.MENUITEM 180572 . 181573) (\TEDIT.CREATEMENU 181575 . 182028) (\TEDIT.MENU.WHENHELDFN
182030 . 182800) (\TEDIT.MENU.WHENSELECTEDFN 182802 . 183129)))))
(FILEMAP (NIL (7222 95656 (TEDIT.CREATEW 7232 . 9986) (\TEDIT.CREATEW.FROM.REGION 9988 . 10972) (
TEDIT.CURSORMOVEDFN 10974 . 22360) (TEDIT.CURSOROUTFN 22362 . 22897) (TEDIT.WINDOW.SETUP 22899 . 24708
) (TEDIT.MINIMAL.WINDOW.SETUP 24710 . 32499) (\TEDIT.ACTIVE.WINDOWP 32501 . 33482) (
\TEDIT.BUTTONEVENTFN 33484 . 58474) (\TEDIT.WINDOW.OPS 58476 . 62437) (\TEDIT.EXPANDFN 62439 . 62842)
(\TEDIT.MAINW 62844 . 64133) (\TEDIT.PRIMARYW 64135 . 65347) (\TEDIT.COPYINSERTFN 65349 . 66320) (
\TEDIT.NEWREGIONFN 66322 . 68789) (\TEDIT.SET.WINDOW.EXTENT 68791 . 74893) (\TEDIT.SHRINK.ICONCREATE
74895 . 77167) (\TEDIT.SHRINKFN 77169 . 77744) (\TEDIT.SPLITW 77746 . 83847) (\TEDIT.UNSPLITW 83849 .
89543) (\TEDIT.WINDOW.SETUP 89545 . 95265) (\SAFE.FIRST 95267 . 95654)) (96986 97893 (TEDITWINDOWP
96996 . 97891)) (97930 100503 (TEDIT.GETINPUT 97940 . 100000) (\TEDIT.MAKEFILENAME 100002 . 100501)) (
100552 107003 (TEDIT.PROMPTPRINT 100562 . 103466) (TEDIT.PROMPTFLASH 103468 . 105423) (
\TEDIT.PROMPT.PAGEFULLFN 105425 . 107001)) (107238 111231 (TEXTSTREAM.TITLE 107248 . 107869) (
\TEDIT.ORIGINAL.WINDOW.TITLE 107871 . 109847) (\TEDIT.WINDOW.TITLE 109849 . 110519) (
\TEXTSTREAM.FILENAME 110521 . 111229)) (111274 153879 (TEDIT.DEACTIVATE.WINDOW 111284 . 118591) (
\TEDIT.REPAINTFN 118593 . 121450) (\TEDIT.RESHAPEFN 121452 . 127072) (\TEDIT.SCROLLFN 127074 . 153877)
) (153921 155970 (\TEDIT.PROCIDLEFN 153931 . 155280) (\TEDIT.PROCENTRYFN 155282 . 155575) (
\TEDIT.PROCEXITFN 155577 . 155968)) (156049 167049 (\EDIT.DOWNCARET 156059 . 156740) (\EDIT.FLIPCARET
156742 . 158277) (TEDIT.FLASHCARET 158279 . 159393) (\EDIT.UPCARET 159395 . 159848) (
TEDIT.NORMALIZECARET 159850 . 165801) (\SETCARET 165803 . 166723) (\TEDIT.CARET 166725 . 167047)) (
167083 180838 (TEDIT.ADD.MENUITEM 167093 . 169008) (TEDIT.DEFAULT.MENUFN 169010 . 178277) (
TEDIT.REMOVE.MENUITEM 178279 . 179280) (\TEDIT.CREATEMENU 179282 . 179735) (\TEDIT.MENU.WHENHELDFN
179737 . 180507) (\TEDIT.MENU.WHENSELECTEDFN 180509 . 180836)))))
STOP

Binary file not shown.