(FILECREATED "17-Jul-84 12:16:52" {ERIS}<LISP>FUGUE.6>PATCHES>CHATPATCH.;1 4172
changes to: (VARS CHATPATCHCOMS)
(FNS CHAT.HANDLECHARACTER))
(* Copyright (c) 1984 by Xerox Corporation. All rights reserved.)
(PRETTYCOMPRINT CHATPATCHCOMS)
(RPAQQ CHATPATCHCOMS ((FNS CHAT.HANDLECHARACTER)))
(DEFINEQ
(CHAT.HANDLECHARACTER
[LAMBDA (CHAR) (* bvm: "17-Jul-84 12:16")
(DECLARE (USEDFREE WINDOW DSP OUTSTREAM DINGED EATLF EATCRLF EATTOCRLF AUTOLF TTYWIDTH TTYHEIGHT
XPOS YPOS ADDRESSING IDMODE ROLLMODE BLINKMODE FONT PLAINFONT CHATBOLDFONT
FONTWIDTH FONTHEIGHT FONTDESCENT HOMEPOS)
(GLOBALVARS INVERTWINDOWFN)) (* Here and/or below)
(PROG NIL
[COND
((EQ CHAR (CHARCODE BELL))
(RETURN (COND
((NOT DINGED)
(APPLY* INVERTWINDOWFN WINDOW) (* Complement window)
(SETQ DINGED T]
(COND
(DINGED (APPLY* INVERTWINDOWFN WINDOW)
(SETQ DINGED NIL)))
(COND
((AND AUTOLF (OR (NEQ CHAR (CHARCODE CR))
(NOT EATTOCRLF)))
(* We last received a CR, so DM wants auto LF after it. However, we postpone doing so until the next char is
received, so that we get scroll holding right)
(CHAT.DOWN)
(SETQ AUTOLF NIL)))
[COND
(ADDRESSING (COND
((CHAT.ADDRESS CHAR)
(RETURN]
[COND
((AND (IGEQ CHAR (CHARCODE SPACE))
(ILESSP CHAR (CHARCODE DEL))) (* Normal char)
(SETQ EATLF (SETQ EATCRLF NIL))
(RETURN (COND
((NOT EATTOCRLF) (* Print the char)
(COND
(IDMODE (* Spec discourages this, but what the hell...)
(CHAT.ADDCHAR)))
(CHAT.PRINTCHAR CHAR]
[COND
(EATLF (SETQ EATLF NIL) (* LF is ignored after CR)
(COND
((EQ CHAR (CHARCODE LF))
(RETURN]
[COND
(EATCRLF (* We just wrapped around, so ignore CR and/or LF if
next)
(COND
((EQ CHAR (CHARCODE CR))
(SETQ EATLF T)
(RETURN (SETQ EATCRLF NIL)))
(T (* Intervening control characters do not stop the
eating, except for a few inconsistent exceptions...)
(SELCHARQ CHAR
((↑B ↑\ ↑↑ ↑←)
(SETQ EATCRLF NIL))
NIL]
(SELCHARQ CHAR
[LF (COND
(IDMODE (CHAT.ADDLINE))
(T (CHAT.DOWN]
(CR (SETQ EATTOCRLF NIL)
(CHAT.NEWLINE T))
[BS (COND
(IDMODE (CHAT.DELCHAR))
(T (CHAT.LEFT]
(↑W (* Erase to end of line)
(CHAT.ERASE.TO.EOL))
(↑L (* Start of cursor address)
(SETQ ADDRESSING -1))
(↑B (* Homes cursor, cancels some modes)
(CHAT.HOME)
(CHAT.CLEARMODES))
(↑X (* Cancel --resets modes)
(CHAT.CLEARMODES)
(SETQ ROLLMODE))
((↑↑ ↑←) (* Master Reset -- Clears screen, modes)
(CHAT.CLEAR))
[↑\ (* Forward space)
(COND
((NOT EATTOCRLF)
(COND
(IDMODE (CHAT.ADDCHAR))
(T (CHAT.RIGHT]
[↑Z (* Up)
(COND
(IDMODE (CHAT.DELETELINE))
(T (CHAT.UP]
[(↑N ↑O) (* Enter blink mode, enter protected mode.
Do both as embolden)
(COND
((NOT BLINKMODE)
(SETQ BLINKMODE T)
(DSPFONT [SETQ FONT (OR CHATBOLDFONT (SETQ CHATBOLDFONT
(FONTCOPY PLAINFONT (QUOTE WEIGHT)
(QUOTE BOLD]
DSP]
(↑P (* Enter i/d mode)
(SETQ IDMODE T))
(↑%] (* Set roll mode)
(SETQ ROLLMODE T))
NIL])
)
(PUTPROPS CHATPATCH COPYRIGHT ("Xerox Corporation" 1984))
(DECLARE: DONTCOPY
(FILEMAP (NIL (319 4092 (CHAT.HANDLECHARACTER 329 . 4090)))))
STOP