Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / nvs / vs100.mud
diff --git a/mim/development/mim/vax/nvs/vs100.mud b/mim/development/mim/vax/nvs/vs100.mud
new file mode 100644 (file)
index 0000000..285c7a1
--- /dev/null
@@ -0,0 +1,3141 @@
+
+<PACKAGE "VS100">
+
+<ENTRY VS100 
+       BLACK WHITE GRAY WINDOW-BITS
+       VS100-DIRECTORY
+       CHANGE-COLOR CURRENT-FONT LINE-HEIGHT CHAR-WIDTH SET-FONT
+       MAP UNMAP CURRENT-FONT
+       HOR-POS-ABS VER-POS-ABS
+       TEXT-CURSOR MOUSE-CURSOR
+       MAKE-MENU-WINDOW
+       WRITE-TO-MENU-WINDOW
+       INVERT-MENU-WINDOW
+       CLEAR-MENU-WINDOW
+       SELECT-MENU-WINDOW
+       BIT-BLT
+       DEFINE-PATTERN
+       SET-HIGHLIGHT
+       PAGE-TOP
+       PAGE-LEFT
+       FREE-PATTERN
+       INITIAL-FONT
+       INITIAL-BORDER
+       INITIAL-BACKGROUND
+       INITIAL-MOUSE-CURSOR
+       INITIAL-TEXT-CURSOR
+       LOAD-KEYMAPS
+       MOUSE-MOVE?
+       WARP-MOUSE
+       DRAW
+       DRAW-FILLED
+       DRAW-DASHED
+       DRAW-LINE
+       MOUSE-MOVE-WINDOW
+       MOUSE-RESIZE-WINDOW
+       MOUSE-OPEN-WINDOW
+       MAKE-TEMP-WINDOW
+       BUFTREE
+       MOVE-CURSOR-ABS
+       RECYCLE-EVENTS
+       PAGE-X-ABS
+       PAGE-Y-ABS
+       PAGE-WIDTH-ABS
+       PAGE-HEIGHT-ABS
+       MOVE-WINDOW
+       RESIZE
+       WINDOW-NAME
+       CLEAR-REGION
+       FILL-REGION
+       CUT-BUFFER
+       WINDOW-PARENT
+       WINDOW-CHILDREN
+       WINDOW-FUNCTION
+       DRAW-LEFT
+       DRAW-TOP
+       DRAW-WIDTH
+       DRAW-HEIGHT
+       INTERPRET-LOCATOR
+       DISPLAY-CURSOR
+       QUERY-MOUSE
+       RAISE-WINDOW
+       LOWER-WINDOW
+       CIRC-WINDOW
+       SCALED-TO-ABSOLUTE
+       ABSOLUTE-TO-SCALED
+       MOUSE-LOWER-WINDOW
+       ICONIFY
+       ICON?
+       ICONIFIED?
+       DE-ICONIFY
+       INVERT-ICON
+       KILL-SUBWINDOWS
+       SET-RESIZE-HINT
+       INVERSE-VIDEO
+       UNDERLINE>
+
+<USE "NETBASE" "NEWSTRUC" "HOSTS" "VSBASE">
+
+<EXPORT "TTY">
+
+<INCLUDE "VSTYPES" "VSUTYPES">
+
+<INCLUDE-WHEN <COMPILING? "VS100"> "NETDEFS" "VSDEFS" "VSOPS" "VSUDEFS">
+
+<NEW-CHANNEL-TYPE VS100 <>
+                 OPEN VS-OPEN
+                 CLOSE VS-CLOSE
+                 READ-BYTE-IMMEDIATE VS-READ-IMMEDIATE
+                 WRITE-BUFFER VS-NORMAL-OUT
+                 IMAGE-OUT VS-IMAGE-OUT
+                 CHANGE-COLOR VS-CHANGE-COLOR
+                 CLEAR-EOL VS-CLEAR-EOL
+                 MAP VS-MAP
+                 UNMAP VS-UNMAP
+                 SET-FONT VS-SET-FONT
+                 BUFOUT VS-BUFOUT
+                 BUFTREE VS-BUFTREE
+                 CURRENT-FONT VS-SET-FONT
+                 CLEAR-EOS VS-CLEAR-EOS
+                 CLEAR-SCREEN VS-CLEAR-SCREEN
+                 DOWN-CURSOR VS-DOWN-CURSOR
+                 UP-CURSOR VS-UP-CURSOR
+                 FORWARD-CURSOR VS-FORWARD-CURSOR
+                 BACK-CURSOR VS-BACK-CURSOR
+                 MOVE-CURSOR VS-MOVE-CURSOR
+                 MOVE-CURSOR-ABS VS-MOVE-CURSOR-ABS
+                 HOME-CURSOR VS-HOME-CURSOR
+                 BOTTOM-CURSOR VS-BOTTOM-CURSOR
+                 HOR-POS-CURSOR VS-HOR-POS
+                 VER-POS-CURSOR VS-VER-POS
+                 HOR-POS-ABS VS-HOR-POS-ABS
+                 VER-POS-ABS VS-VER-POS-ABS
+                 TEXT-CURSOR VS-TEXT-CURSOR
+                 MOUSE-CURSOR VS-MOUSE-CURSOR
+                 FRESH-LINE VS-FRESH-LINE
+                 MAKE-MENU-WINDOW VS-MENU-WINDOW
+                 WRITE-TO-MENU-WINDOW VS-WRITE-TO-MENU
+                 INVERT-MENU-WINDOW VS-INVERT-MENU
+                 CLEAR-MENU-WINDOW VS-CLEAR-MENU-WINDOW
+                 SELECT-MENU-WINDOW VS-SELECT-MENU-WINDOW
+                 BIT-BLT VS-BIT-BLT
+                 INSERT-LINE VS-INSERT-LINE
+                 INSERT-CHAR VS-INSERT-CHAR
+                 ERASE-CHAR VS-ERASE-CHAR
+                 KILL-CHAR VS-KILL-CHAR
+                 DEFINE-PATTERN DEFINE-PATTERN
+                 SET-HIGHLIGHT VS-SET-HIGHLIGHT
+                 LOAD-KEYMAPS VS-LOAD-KEYMAPS
+                 MOUSE-MOVE? VS-MOUSE-MOVE?
+                 WARP-MOUSE VS-WARP-MOUSE
+                 DRAW VS-DRAW
+                 DRAW-DASHED VS-DRAW-DASHED
+                 DRAW-FILLED VS-DRAW-FILLED
+                 DRAW-LINE VS-DRAW-LINE
+                 MOUSE-MOVE-WINDOW MOUSE-MOVE-WINDOW
+                 MOUSE-RESIZE-WINDOW MOUSE-RESIZE-WINDOW
+                 MOUSE-OPEN-WINDOW MOUSE-OPEN-WINDOW
+                 MAKE-TEMP-WINDOW MAKE-TEMP-WINDOW
+                 PAGE-X VS-HOR-POS
+                 PAGE-X-ABS VS-HOR-POS-ABS
+                 PAGE-Y VS-VER-POS
+                 PAGE-Y-ABS VS-VER-POS-ABS
+                 PAGE-HEIGHT VS-PAGE-HEIGHT
+                 PAGE-WIDTH VS-PAGE-WIDTH
+                 PAGE-TOP PAGE-LOC
+                 PAGE-LEFT PAGE-LOC
+                 PAGE-HEIGHT-ABS VS-PAGE-HEIGHT-ABS
+                 PAGE-WIDTH-ABS VS-PAGE-WIDTH-ABS
+                 RESIZE VS-RESIZE
+                 MOVE-WINDOW VS-MOVE-WINDOW
+                 WINDOW-NAME VS-WINDOW-NAME
+                 CLEAR-REGION VS-CLEAR-REGION
+                 FILL-REGION VS-FILL-REGION
+                 FREE-PATTERN FREE-PATTERN
+                 LINE-HEIGHT VS-LINE-HEIGHT
+                 CHAR-WIDTH VS-CHAR-WIDTH
+                 CUT-BUFFER VS-CUT-BUFFER
+                 WINDOW-PARENT WINDOW-PARENT
+                 WINDOW-CHILDREN WINDOW-CHILDREN
+                 TYPE-AHEAD? VS100-TYPE-AHEAD?
+                 WINDOW-FUNCTION VS-WINDOW-FUNCTION
+                 DRAW-LEFT VS-SCALE
+                 DRAW-TOP VS-SCALE
+                 DRAW-WIDTH VS-SCALE
+                 DRAW-HEIGHT VS-SCALE
+                 INTERPRET-LOCATOR INTERPRET-LOCATOR
+                 DISPLAY-CURSOR VS-DISPLAY-CURSOR
+                 QUERY-MOUSE VS-QUERY-MOUSE
+                 RAISE-WINDOW RAISE-WINDOW
+                 LOWER-WINDOW LOWER-WINDOW
+                 CIRC-WINDOW CIRC-WINDOW
+                 SCALED-TO-ABSOLUTE SCALED-TO-ABSOLUTE
+                 ABSOLUTE-TO-SCALED ABSOLUTE-TO-SCALED
+                 ICON? ICON?
+                 ICONIFIED? ICONIFIED?
+                 ICONIFY ICONIFY
+                 DE-ICONIFY DE-ICONIFY
+                 MOUSE-LOWER-WINDOW MOUSE-LOWER-WINDOW
+                 KILL-SUBWINDOWS KILL-SUBWINDOWS
+                 REDISPLAY-ICON REDISPLAY-ICON
+                 INVERT-ICON INVERT-ICON
+                 SET-RESIZE-HINT SET-RESIZE-HINT
+                 WINDOW-BITS WINDOW-BITS
+                 INVERSE-VIDEO INVERSE-VIDEO
+                 UNDERLINE UNDERLINE>
+
+<GDECL (VS100-LIST)
+       <LIST [REST VS]>
+       (INITIAL-FONT)
+       STRING
+       (INITIAL-BORDER INITIAL-BACKGROUND)
+       <OR FIX ATOM>
+       (INITIAL-TEXT-CURSOR)
+       <OR ATOM FALSE VECTOR CURSOR>
+       (VS100-DIRECTORY) <OR STRING FALSE>
+       (INITIAL-MOUSE-CURSOR)
+       <OR ATOM FALSE VECTOR CURSOR>>
+
+<SETG INITIAL-BORDER BLACK>
+
+<SETG INITIAL-BACKGROUND WHITE>
+
+<SETG INITIAL-FONT "8X13">
+
+<SETG INITIAL-TEXT-CURSOR T>
+
+<SETG VS100-DIRECTORY <>>
+
+<DEFINE RAISE-WINDOW (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+       <VSOP <VW-VS100 .VW> X-RAISE-WINDOW <VW-ID .VW>>>
+
+<DEFINE LOWER-WINDOW (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+       <VSOP <VW-VS100 .VW> X-LOWER-WINDOW <VW-ID .VW>>>
+
+<DEFINE CIRC-WINDOW (CHN:VSCHAN OPER "OPT" (UP? T)
+                    "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+   <COND (.UP?
+         <VSOP <VW-VS100 .VW> X-CIRC-WINDOW-UP <VW-ID .VW>>)
+        (T
+         <VSOP <VW-VS100 .VW> X-CIRC-WINDOW-DOWN <VW-ID .VW>>)>>
+
+<DEFINE VS100-TYPE-AHEAD? (CHN:VSCHAN OPER) 
+       <ANY-INPUT? <VW-VS100 <CHANNEL-DATA .CHN>:VSW>>>
+
+<DEFINE SCALED-TO-ABSOLUTE (CHN:VSCHAN OPER:ATOM FIRST:<OR FIX FLOAT VECTOR>
+                           "OPT" (SECOND:<OR FIX FLOAT FALSE> <>) 
+                           (REL?:<OR ATOM FALSE> <>)
+                           "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                                 (SC:<OR SCALE FALSE> <VW-SCALE .VW>))
+       <COND (<NOT <TYPE? .FIRST VECTOR>>
+              <SET FIRST
+                   <VECTOR .FIRST
+                           <COND (<NOT .SECOND>
+                                  <CHANNEL-OP .CHN DRAW-TOP>)
+                                 (T .SECOND)>>>)>
+       <SCALE-POINT .FIRST .VW .REL?>
+       .FIRST>
+
+<DEFINE ABSOLUTE-TO-SCALED (CHN:VSCHAN OPER:ATOM FIRST:<OR FIX VECTOR>
+                           "OPT" (SECOND:<OR FIX FALSE> <>)
+                           (REL?:<OR ATOM FALSE> <>)
+                           "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                                 (SC:<OR SCALE FALSE> <VW-SCALE .VW>)
+                                 NUM:FLOAT)
+       <COND (<NOT <TYPE? .FIRST VECTOR>>
+              <SET FIRST
+                   <VECTOR .FIRST
+                           <COND (<ASSIGNED? SECOND> .SECOND) (T 0)>>>)>
+       <COND (<NOT .SC> .FIRST)
+             (T
+              <1 .FIRST
+                 <+ </ <SET NUM <FLOAT <1 .FIRST>>> <S-WSCALE .SC>>
+                    <COND (<NOT .REL?> <S-LEFT .SC>) (T 0.0)>>>
+              <2 .FIRST
+                 <+ </ <SET NUM <FLOAT <2 .FIRST>>> <S-HSCALE .SC>>
+                    <COND (.REL? 0.0)(T <S-TOP .SC>)>>>)>
+       .FIRST>
+
+<DEFINE VS-SCALE (CHN:VSCHAN OPER:ATOM
+                 "OPT" FROB:<OR FIX FLOAT FALSE>
+                 "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                       (SC:<OR SCALE FALSE> <VW-SCALE .VW>) (OLD <>)
+                       TEMP:<OR FLOAT FALSE>)
+   <COND (.SC
+         <SET OLD
+              <COND (<==? .OPER DRAW-LEFT>
+                     <COND (<==? <SET OLD <S-LEFT .SC>> 0.0> <>) (T .OLD)>)
+                    (<==? .OPER DRAW-TOP>
+                     <COND (<==? <SET OLD <S-TOP .SC>> 0.0> <>) (T .OLD)>)
+                    (<==? .OPER DRAW-HEIGHT> <S-HEIGHT .SC>)
+                    (<==? .OPER DRAW-WIDTH> <S-WIDTH .SC>)>>)>
+   <COND (<ASSIGNED? FROB>
+         <COND (<NOT .SC>
+                <SET SC <CHTYPE [0.0 0.0 <> <> 1.0 1.0] SCALE>>
+                <VW-SCALE .VW .SC>)>
+         <COND (<TYPE? .FROB FIX> <SET FROB <FLOAT .FROB>>)>
+         <COND (<==? .OPER DRAW-LEFT>
+                <COND (<NOT .FROB> <S-LEFT .SC 0.0>) (T <S-LEFT .SC .FROB>)>)
+               (<==? .OPER DRAW-TOP>
+                <COND (<NOT .FROB> <S-TOP .SC 0.0>) (T <S-TOP .SC .FROB>)>)
+               (<==? .OPER DRAW-WIDTH> <S-WIDTH .SC .FROB>)
+               (<==? .OPER DRAW-HEIGHT> <S-HEIGHT .SC .FROB>)>
+         <COND (<AND <NOT <S-HEIGHT .SC>>
+                     <NOT <S-WIDTH .SC>>
+                     <==? <S-TOP .SC> 0.0>
+                     <==? <S-LEFT .SC> 0.0>>
+                <VW-SCALE .VW <>>)
+               (T
+                <COND (<NOT <SET TEMP <S-WIDTH .SC>>> <S-WSCALE .SC 1.0>)
+                      (T <S-WSCALE .SC </ <FLOAT <VW-WIDTH .VW>> .TEMP>>)>
+                <COND (<NOT <SET TEMP <S-HEIGHT .SC>>> <S-HSCALE .SC 1.0>)
+                      (T
+                       <S-HSCALE .SC </ <FLOAT <VW-HEIGHT .VW>> .TEMP>>)>)>)>
+   .OLD>
+
+<DEFINE VS-QUERY-MOUSE (CHN:VSCHAN OPER UV:<UVECTOR [2 FIX]>
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>) P)
+       <COND (<SET P <VSOP <VW-VS100 .VW> X-QUERY-MOUSE <VW-ID .VW>>>
+              <1 .UV <I-SPAR2 .P>>
+              <2 .UV <I-SPAR3 .P>>)>>
+
+<DEFINE INTERPRET-LOCATOR (CHN:VSCHAN OPER LOC:FIX UV:<UVECTOR [2 FIX]>
+                          "AUX" (VW:VSW <CHANNEL-DATA .CHN>) P)
+       <COND (<SET P
+                   <VSOP <VW-VS100 .VW> X-INTERPRET-LOCATOR <VW-ID .VW> .LOC>>
+              <1 .UV <I-SPAR2 .P>>
+              <2 .UV <I-SPAR3 .P>>
+              .UV)>>
+
+<DEFINE VS-WINDOW-FUNCTION (CHN:VSCHAN OPER
+                           "OPT" FROB:<OR ATOM APPLICABLE FALSE>
+                           "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <COND (<NOT <ASSIGNED? FROB>> <VW-FUNCTION .VW>)
+             (T <VW-FUNCTION .VW .FROB> .FROB)>>
+
+<DEFINE WINDOW-PARENT (CH:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CH>)) 
+       <COND (<==? <VW-PARENT .VW> <VS-TOPCHAN <VW-VS100 .VW>>> <>)
+             (T <VW-PARENT .VW>)>>
+
+<DEFINE WINDOW-CHILDREN (CH:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CH>)) 
+       <VW-KIDS .VW>>
+
+<DEFINE PRINT-VSW (VW:VSW
+                  "OPTIONAL" (OUTCHAN:CHANNEL .OUTCHAN)
+                             (VS:VS <VW-VS100 .VW>))
+       <PRINC "#VSW [">
+       <COND (<VS-HOST .VS> <PRIN1 <VS-HOST .VS>>)>
+       <PRINT-MANY .OUTCHAN
+                   PRINC
+                   !\:
+                   <VS-WHICH .VS>
+                   !\ 
+                   "ID:"
+                   <VW-ID .VW>
+                   !\ 
+                   <VW-WIDTH .VW>
+                   !\x
+                   <VW-HEIGHT .VW>
+                   " ("
+                   <VW-X .VW>
+                   !\,
+                   <VW-Y .VW>
+                   ") "
+                   !\"
+                   <COND (<VW-CFONT .VW> <FONT-NAME <VW-CFONT .VW>>)>
+                   !\">
+       <COND (<VW-CURSOR .VW> <PRINC " CURSOR">)>
+       <COND (<==? <VW-BG .VW> <VS-BLACK .VS>> <PRINC " BLACK">)
+             (<==? <VW-BG .VW> <VS-WHITE .VS>> <PRINC " WHITE">)
+             (<==? <VW-BG .VW> <VS-GRAY .VS>> <PRINC " GRAY">)
+             (T <PRINT-MANY .OUTCHAN PRINC " BG:" <VW-BG .VW>>)>
+       <COND (<VW-OBUF .VW>
+              <PRINT-MANY .OUTCHAN
+                          PRINC
+                          " OBUF:"
+                          <VW-OCT .VW>
+                          !\/
+                          <LENGTH <VW-TOBUF .VW>>>)>
+       <PRINC !\]>
+       .VW>
+
+<COND (<GASSIGNED? PRINT-VSW> <PRINTTYPE VSW ,PRINT-VSW>)>
+
+<DEFINE PRINT-VS (VS:VS "OPTIONAL" (OUTCHAN:CHANNEL .OUTCHAN)) 
+   <PRINT-MANY
+    .OUTCHAN
+    PRINC
+    "#VS ["
+    <VS-HOST .VS>
+    !\:
+    <VS-WHICH .VS>
+    !\ 
+    <COND (<VS-TOPCHAN .VS> <VW-ID <CHANNEL-DATA <VS-TOPCHAN .VS>>>)>
+    " KIDS:"
+    <COND (<VS-TOPCHAN .VS>
+          <LENGTH <VW-KIDS <CHANNEL-DATA <VS-TOPCHAN .VS>>>>)>
+    " ALL:"
+    </ <LENGTH <VS-ALL .VS>> 2>
+    " FONTS:"
+    </ <LENGTH <VS-FONTS .VS>> 2>
+    " REQ:"
+    <VS-REQ .VS>
+    " OBUF:"
+    <COND (<VS-BUFFER .VS>
+          <- <LENGTH <VS-BUFFER-TOP .VS>:STRING>
+             <LENGTH <VS-BUFFER .VS>:STRING>>)
+         (T <>)>
+    " IBUF:"
+    <LENGTH <VS-IBUFFER .VS>>
+    " MAP:"
+    <VS-MAPNAME .VS>
+    "]">
+   T>
+
+<COND (<GASSIGNED? PRINT-VS> <PRINTTYPE VS ,PRINT-VS>)>
+
+<DEFINE PRINT-WE (WE:WINDOW-EVENT "OPT" (OUTCHAN:CHANNEL .OUTCHAN) "AUX" KIND) 
+       <PRINT-MANY .OUTCHAN
+                   PRINC
+                   "#WINDOW-EVENT ["
+                   <CASE ,==?
+                         <SET KIND <WE-KIND .WE>>
+                         (,WE-EXPOSE-WINDOW "EXPOSE")
+                         (,WE-EXPOSE-REGION "EXPOSE-REGION")
+                         (,WE-EXPOSE-COPY "EXPOSE-COPY")
+                         (,WE-RESIZE-WINDOW "RESIZE")
+                         (,WE-UNMAP-WINDOW "UNMAP")>
+                   !\ 
+                   <WE-WINDOW .WE>
+                   !\ 
+                   <WE-SUBWINDOW .WE>>
+       <COND (<OR <==? .KIND ,WE-EXPOSE-REGION>
+                  <==? .KIND ,WE-EXPOSE-COPY>
+                  <==? .KIND ,WE-RESIZE-WINDOW>>
+              <MAPF <>
+                    <FUNCTION (R:WE-RECTANGLE)
+                       <PRINT-MANY .OUTCHAN
+                          PRINC
+                          " ("
+                          <REC-LEFT .R>
+                          !\,
+                          <REC-TOP .R>
+                          ") "
+                          <REC-WIDTH .R>
+                          "x"
+                          <REC-HEIGHT .R>>>
+                    <WE-CHANGES .WE>>)>
+       <PRINC !\]>>
+
+<COND (<GASSIGNED? PRINT-WE> <PRINTTYPE WINDOW-EVENT ,PRINT-WE>)>
+
+<DEFINE PRINT-ME (ME:MOUSE-EVENT
+                 "OPT" (OUTCHAN:CHANNEL .OUTCHAN)
+                 "AUX" KIND (PREL 0))
+   <PRINT-MANY
+    .OUTCHAN
+    PRINC
+    "#MOUSE-EVENT ["
+    <COND (<NOT <0? <ANDB <SET KIND <ME-KIND .ME>> ,ME-PRESSED-MASK>>>
+          <SET PREL 1>
+          "PRESSED")
+         (<NOT <0? <ANDB .KIND ,ME-RELEASED-MASK>>> <SET PREL -1> "RELEASED")
+         (<==? .KIND ,ME-MOVED> "MOVED")
+         (<==? .KIND ,ME-ENTER-WINDOW> "ENTER")
+         (<==? .KIND ,ME-LEAVE-WINDOW> "LEAVE")>
+    !\ 
+    <COND (<NOT <0? .PREL>>
+          <COND (<NOT <0? <ANDB .KIND
+                                <+ ,ME-LEFT-PRESSED ,ME-LEFT-RELEASED>>>>
+                 "LEFT ")
+                (<NOT <0? <ANDB .KIND
+                                <+ ,ME-MIDDLE-PRESSED ,ME-MIDDLE-RELEASED>>>>
+                 "MIDDLE ")
+                (T "RIGHT ")>)
+         (T "")>
+    <ME-STATE .ME>
+    " ("
+    <ME-X .ME>
+    !\,
+    <ME-Y .ME>
+    ") "
+    <ME-TIME .ME>
+    !\ 
+    <ME-WINDOW .ME>
+    !\ 
+    <ME-SUBWINDOW .ME>
+    !\]>>
+
+<COND (<GASSIGNED? PRINT-ME> <PRINTTYPE MOUSE-EVENT ,PRINT-ME>)>
+
+<DEFINE VS-READ-IMMEDIATE (CHANNEL:VSCHAN OPER
+                          "OPT" (NOWAIT?:<OR ATOM FALSE> <>)
+                          "AUX" (VW:VSW <CHANNEL-DATA .CHANNEL>)
+                                (VS:VS <VW-VS100 .VW>))
+       <GET-EVENT .VS <NOT .NOWAIT?>>>
+
+<DEFINE RECYCLE-EVENTS ("TUPLE" STUFF) 
+       <MAPF <>
+             <FUNCTION (X:ANY "AUX" L) 
+                     <COND (<TYPE? .X MOUSE-EVENT>
+                            <1 <SET L <ME-CELL .X>> .X>
+                            <SETG FREE-MOUSE-EVENTS
+                                  <PUTREST .L ,FREE-MOUSE-EVENTS>>)
+                           (<TYPE? .X WINDOW-EVENT>
+                            <PUTREST <REST <SET L <WE-CHANGES .X>>
+                                           <- <LENGTH .L> 1>>
+                                     ,FREE-RECTANGLES>
+                            <SETG FREE-RECTANGLES .L>
+                            <WE-CHANGES .X ()>
+                            <1 <SET L <WE-CELL .X>> .X>
+                            <SETG FREE-WINDOW-EVENTS
+                                  <PUTREST .L ,FREE-WINDOW-EVENTS>>)>>
+             .STUFF>
+       T>
+
+<DEFINE GET-VS100 (DESC:<OR STRING <PRIMTYPE LIST>>) 
+   <COND
+    (<OR <NOT .DESC> <TYPE? .DESC STRING>>
+     <PROG (STR:<OR STRING FALSE> TS (HOST <>) (NUM <>))
+          <COND
+           (<SET STR <OR .DESC <GET-ENV-STR "DISPLAY">>>
+            <COND (<SET TS <MEMQ !\: .STR>>
+                   <SET NUM <PARSE <REST .TS>>>
+                   <COND (<N==? .TS .STR>
+                          <SET HOST
+                               <SUBSTRUC .STR
+                                         0
+                                         <- <LENGTH .STR> <LENGTH .TS>>>>
+                          <SET HOST <HOST .HOST>>)>
+                   <SET DESC (.NUM)>
+                   <COND (.HOST <SET DESC (.HOST !.DESC)>)>)
+                  (T <SET DESC '(0)>)>)
+           (T <SET DESC '(0)>)>>)>
+   <COND (<==? <LENGTH .DESC:LIST> 1> <VS100-INIT <1 .DESC> <>>)
+        (T <VS100-INIT <2 .DESC> <1 .DESC>>)>>
+
+<DEFINE VS100-INIT (WHICH:FIX HOST:<OR FIX FALSE>
+                   "AUX" CH L NVS P:<OR UVECTOR FALSE> BUF:STRING NVW
+                         BLACK WHITE GRAY ROOT PLANES
+                         CURRENT-ROOT-ID:<SPECIAL FIX>)
+       <COND (<NOT <GASSIGNED? VS100-LIST>> <SETG VS100-LIST <SET L ()>>)
+             (T <SET L ,VS100-LIST>)>
+       <COND
+        (<SET NVS <FIND-VS100 .WHICH .HOST>>)
+        (T
+         <COND (<NOT .HOST>
+                <SET CH
+                     <CHANNEL-OPEN NETWORK
+                                   <STRING "VS" <UNPARSE .WHICH>>
+                                   <+ ,SERV-VS100 .WHICH>>>)
+               (T
+                <SET CH
+                     <CHANNEL-OPEN NETWORK
+                                   <STRING <UNPARSE .HOST>
+                                           ":VS"
+                                           <UNPARSE .WHICH>>
+                                   <+ ,SERV-VS100 .WHICH>
+                                   .HOST>>)>
+         <COND (.CH
+                <SET NVS
+                     <CHTYPE [.CH
+                              .WHICH
+                              .HOST
+                              <>
+                              T
+                              ()
+                              ()
+                              0
+                              0
+                              0
+                              0
+                              <SET BUF <REQUEST-BUFFER <> STRING <>>>
+                              0
+                              .BUF
+                              ()
+                              ()
+                              <>
+                              <>
+                              <>]
+                             VS>>
+                <LOAD-KEYMAPS .NVS ,X-DEFAULT-KEYMAP>
+                <COND (<SET P <VSOP .NVS X-SETUP 0>>
+                       <SET ROOT <I-LPAR0 .P>>
+                       <SET CURRENT-ROOT-ID .ROOT>
+                       <SET PLANES <I-SPAR4 .P>>
+                       <COND (<NOT <SET BLACK <VSOP .NVS X-MAKE-PIXMAP 0
+                                                    0 0 0>>>
+                              <ERROR CANT-MAKE-BLACK!-ERRORS .BLACK>)>
+                       <COND (<NOT <SET WHITE <VSOP .NVS X-MAKE-PIXMAP 0
+                                                    0 1 0>>>
+                              <ERROR CANT-MAKE-WHITE!-ERRORS .WHITE>)>
+                       <COND (<NOT <SET GRAY <VSOP .NVS X-STORE-PIXMAP
+                                                   0 0 <* 16 .PLANES>
+                                                   <* 16 .PLANES>
+                                                   <ISTRING <* 32 .PLANES>
+                                                            <CHTYPE *252*
+                                                                    CHARACTER>>>>>
+                              <ERROR CANT-MAKE-GRAY!-ERRORS .GRAY>)>
+                       <VS-TOPCHAN .NVS
+                                   <CHTYPE [VS100
+                                            "Toplevel"
+                                            <>
+                                            T
+                                            <SET NVW
+                                                 <CHTYPE [.NVS
+                                                          .ROOT
+                                                          <>
+                                                          ()
+                                                          0
+                                                          0
+                                                          0
+                                                          0
+                                                          <>
+                                                          ,GX-XOR
+                                                          .GRAY
+                                                          .GRAY
+                                                          0
+                                                          <>
+                                                          <>
+                                                          0
+                                                          0
+                                                          0
+                                                          0
+                                                          <>
+                                                          <>
+                                                          ()
+                                                          <>
+                                                          <>
+                                                          -1
+                                                          <>
+                                                          <>
+                                                          <>
+                                                          <>
+                                                          <>
+                                                          <>
+                                                          <>
+                                                          <>]
+                                                         VSW>>
+                                            <>]
+                                           CHANNEL>>
+                       <VS-ALL .NVS (<VW-ID .NVW> <VS-TOPCHAN .NVS>)>
+                       <VS-BLACK .NVS .BLACK>
+                       <VS-WHITE .NVS .WHITE>
+                       <VS-GRAY .NVS .GRAY>
+                       <SET P <VSOP .NVS X-QUERY-WINDOW <VW-ID .NVW>>>
+                       <VW-WIDTH .NVW <I-SPAR1 .P:UVECTOR>>
+                       <VW-HEIGHT .NVW <I-SPAR0 .P:UVECTOR>>
+                       <VW-BWIDTH .NVW <I-SPAR4 .P:UVECTOR>>
+                       <SET L (.NVS !.L)>
+                       <SETG VS100-LIST .L>
+                       .NVS)
+                      (T <CLOSE .CH> .P)>)>)>>
+
+<DEFINE VS-LOAD-KEYMAPS (CH:VSCHAN OPER STR:STRING "OPT" (FORCE? <>)) 
+       <LOAD-KEYMAPS <VW-VS100 <CHANNEL-DATA .CH>:VSW> .STR .FORCE?>>
+
+<DEFINE LOAD-KEYMAPS (VS:VS STR:<OR STRING FALSE> "OPT" (FORCE? <>) "AUX" M1 M2
+                     (LOADS:<SPECIAL FIX> 0)) 
+       <COND (<OR .FORCE? <N=? .STR <VS-MAPNAME .VS>>>
+              <SET M1 <LOAD-MAP .STR "NORMAL">>
+              <SET M2 <LOAD-MAP .STR "FUNCTION">>
+              <COND (<AND .M1 .M2>
+                     <COND (<==? .LOADS 2>
+                            <VS-MAPNAME .VS T>)
+                           (<NOT .STR>
+                            <VS-MAPNAME .VS "">)
+                           (T
+                            <VS-MAPNAME .VS .STR>)>
+                     <VS-MAPS .VS [.M1 .M2]>)>)
+             (T)>>
+
+<DEFINE LOAD-MAP (STR:<OR STRING FALSE> NM2:<SPECIAL STRING>
+                 "AUX" CH:<OR FALSE <CHANNEL 'DISK>> V:VECTOR BASE:FIX
+                       (BUF <STACK <IUVECTOR 6>>) CT:FIX TEMP)
+   <COND (<SET CH <GEN-OPEN <COND (,VS100-DIRECTORY
+                                  <STRING ,VS100-DIRECTORY
+                                          !\/ .STR>)
+                                 (.STR)> "READ" "BINARY" DISK>>
+         <SET LOADS <+ .LOADS:FIX 1>>
+         <SET V <IVECTOR <CHANNEL-OP .CH READ-BYTE> <>>>
+         <SET BASE <CHANNEL-OP .CH READ-BYTE>>
+         <REPEAT ()
+            <COND (<0? <SET CT <CHANNEL-OP .CH READ-BUFFER .BUF>>>
+                   <RETURN>)>
+            <PUT .V
+                 <- <1 .BUF> .BASE -1>
+                 <CHTYPE <SUBSTRUC .BUF 1 5> KEY>>>
+         <CLOSE .CH>
+         [.BASE .V])
+        (<COND (<=? .NM2 "NORMAL"> <SET TEMP ,X-NORMAL-KEYMAP>)
+               (T <SET TEMP ,X-FUNCTION-KEYMAP>)>
+         .TEMP)
+        (T
+         <ERROR MISSING-KEYMAP!-ERRORS .NM2 LOAD-KEYMAP>)>>
+
+<DEFINE FIND-VS100 (WHICH:FIX HOST:<OR FIX FALSE> "AUX" (L:LIST ,VS100-LIST)) 
+       <REPEAT (VS:VS)
+               <COND (<EMPTY? .L> <RETURN <>>)>
+               <COND (<AND <==? <VS-WHICH <SET VS <1 .L>>> .WHICH>
+                           <==? <VS-HOST .VS> .HOST>>
+                      <RETURN .VS>)>
+               <SET L <REST .L>>>>
+
+<DEFINE MAKE-TEMP-WINDOW MTW
+   (DESC:<OR VSCHAN <PRIMTYPE LIST> STRING> OPER
+    "OPT" (HEIGHT:<OR FIX FALSE> <>)
+    (WIDTH:<OR FIX FALSE> <>) (LEFT:FIX -1)
+    (TOP:FIX -1) (BWIDTH:<OR FIX FALSE> <>)
+    (BPATTERN:<OR ATOM FIX> WHITE)
+    (BACKGROUND:<OR ATOM FIX> BLACK)
+    (FONT:STRING ,INITIAL-FONT)
+    "AUX" PARENT:VSCHAN MX:FIX MY:FIX NVS
+    VW:VSW VS:VS SAVE-HEIGHT SAVE-WIDTH
+    (SAVE-RASTER:<SPECIAL <OR FIX FALSE>> <>)
+    P:UVECTOR)
+   <COND (<NOT <TYPE? .DESC CHANNEL>>
+         <COND (<SET NVS <GET-VS100 .DESC>>
+                <SET PARENT <VS-TOPCHAN .NVS>>)
+               (T
+                <RETURN .NVS .MTW>)>)
+        (T
+         <SET PARENT .DESC>)>
+   <SET VW <CHANNEL-DATA .PARENT>>
+   <SET VS <VW-VS100 .VW>>
+   <VW-FLUSH-BUFFER .VW>
+   <COND (<NOT .BWIDTH> <SET BWIDTH 2>)>
+   <COND (<OR <L? .LEFT 0> <L? .TOP 0>>
+         <SET P <VSOP .VS X-QUERY-MOUSE <VW-ID .VW>>>
+         <COND (<L? .LEFT 0> <SET LEFT <I-SPAR2 .P>>)>
+         <COND (<L? .TOP 0> <SET TOP <I-SPAR3 .P>>)>)>
+   <COND (<NOT .HEIGHT>
+         <SET HEIGHT <- <VW-HEIGHT .VW> <* 2 .BWIDTH> .TOP>>)>
+   <COND (<NOT .WIDTH>
+         <SET WIDTH <- <VW-WIDTH .VW> <* 2 .BWIDTH> .LEFT>>)>
+   <SET SAVE-WIDTH
+       <MIN <- <VW-WIDTH .VW> .LEFT> <+ .WIDTH <* 2 .BWIDTH>>>>
+   <SET SAVE-HEIGHT
+       <MIN <- <VW-HEIGHT .VW> .TOP> <+ .HEIGHT <* 2 .BWIDTH>>>>
+   <SET SAVE-RASTER
+       <VSOP .VS
+             X-PIXMAP-SAVE
+             <VW-ID .VW>
+             .SAVE-HEIGHT
+             .SAVE-WIDTH
+             .LEFT
+             .TOP>>
+   <CHANNEL-OPEN VS100
+                "MENU"
+                .PARENT
+                .HEIGHT
+                .WIDTH
+                .LEFT
+                .TOP
+                .BWIDTH
+                .BPATTERN
+                .BACKGROUND
+                .FONT
+                <>>>
+
+<DEFINE KILL-SUBWINDOWS (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                        L)
+   <MAPF <>
+        <FUNCTION (CHN:VSCHAN)
+           <CLOSE .CHN>>
+        <VW-KIDS .VW>>
+   <COND (<NOT <EMPTY? <SET L <VW-MENU-WINDS .VW>>>>
+         <VSOP <VW-VS100 .VW> X-DESTROY-SUBWINDOWS <VW-ID .VW>>
+         <PUTREST <REST .L <- <LENGTH .L> 1>>
+                  ,MENU-WINDOW-LIST>
+         <SETG MENU-WINDOW-LIST .L>
+         <VW-MENU-WINDS .VW ()>)>
+   T>
+
+<DEFINE VS-OPEN VO (STYPE OPER NAME DESC:<OR VSCHAN VS <PRIMTYPE LIST> STRING>
+                   "OPT" (HEIGHT:<OR FIX FALSE> <>) (WIDTH:<OR FIX FALSE> <>)
+                         (LEFT:FIX 0) (TOP:FIX 0) (BWIDTH:<OR FIX FALSE> <>)
+                         (BPATTERN:<OR ATOM FIX FALSE> <>)
+                         (BACKGROUND:<OR ATOM FIX FALSE> <>)
+                         (FONT:<OR STRING FALSE> <>) (BUF? T)
+                         (MIN-HEIGHT:FIX 0) (MIN-WIDTH:FIX 0)
+                   "AUX" NVS WID F INPUTS PATTERN TEMP TPATTERN
+                         (OBUF <COND (.BUF? <ISTRING 320>)>) NVW:VSW
+                         P:<OR FALSE UVECTOR> RH:FIX RW:FIX PARENT:VSCHAN
+                         (CC:CHANNEL .CURRENT-CHANNEL))
+       <COND (<NOT <TYPE? .DESC CHANNEL>>
+              <COND (<NOT .BWIDTH> <SET BWIDTH 2>)>
+              <COND (<TYPE? .DESC VS>
+                     <SET NVS .DESC>)
+                    (<NOT <SET NVS <GET-VS100 .DESC>>>
+                     <RETURN .NVS .VO>)>
+              <SET PARENT <VS-TOPCHAN .NVS>>)
+             (T <SET PARENT .DESC>)>
+       <SET NVW <CHANNEL-DATA .PARENT>>
+       <COND (<VW-REAL .NVW>
+              <RETURN #FALSE ("ICONS CAN'T HAVE CHILDREN") .VO>)>
+       <VW-FLUSH-BUFFER .NVW>
+       <COND (<NOT .BWIDTH> <SET BWIDTH <VW-BWIDTH .NVW>>)>
+       <COND (<NOT .HEIGHT> <SET HEIGHT <- <VW-HEIGHT .NVW> <* 2 .BWIDTH>>>)>
+       <COND (<NOT .WIDTH> <SET WIDTH <- <VW-WIDTH .NVW> <* 2 .BWIDTH>>>)>
+       <SET NVS <VW-VS100 .NVW>>
+       <COND (.BPATTERN
+              <SET BPATTERN <TRANSLATE-COLOR .BPATTERN .NVS>>)
+             (<==? .PARENT .DESC>
+              ; "Inherit border from parent if there is one"
+              <SET BPATTERN <VW-BORDER .NVW>>)
+             (T
+              ; "Otherwise use initial setting"
+              <SET BPATTERN <TRANSLATE-COLOR ,INITIAL-BORDER .NVS>>)>
+       <COND (.BACKGROUND
+              <SET BACKGROUND <TRANSLATE-COLOR .BACKGROUND .NVS>>)
+             (<==? .PARENT .DESC>
+              ; "Same for background"
+              <SET BACKGROUND <VW-BG .NVW>>)
+             (T
+              <SET BACKGROUND <TRANSLATE-COLOR ,INITIAL-BACKGROUND .NVS>>)>
+       <COND (<NOT .FONT>
+              ; "And font"
+              <COND (<N==? .PARENT .DESC>
+                     <SET FONT ,INITIAL-FONT>)
+                    (T
+                     <SET FONT <FONT-NAME <VW-CFONT .NVW>>>)>)>
+       <COND
+        (<SET F <GET-FONT .FONT .NVS>>
+         <SET MIN-WIDTH <* <FONT-WIDTH .F> .MIN-WIDTH>>
+         <SET MIN-HEIGHT <* <FONT-HEIGHT .F> .MIN-HEIGHT>>
+         <COND (<SET WID
+                     <VSOP .NVS
+                           X-CREATE-WINDOW
+                           .BWIDTH
+                           <VW-ID <CHANNEL-DATA .PARENT:VSCHAN>:VSW>
+                           .HEIGHT
+                           .WIDTH
+                           .LEFT
+                           .TOP
+                           .BPATTERN
+                           .BACKGROUND>>
+                <SET MIN-HEIGHT <MAX 0 .MIN-HEIGHT>>
+                <SET MIN-WIDTH <MAX 0 .MIN-WIDTH>>
+                <VSOP .NVS
+                      X-SET-RESIZE-HINT
+                      .WID
+                      .MIN-HEIGHT
+                      <FONT-HEIGHT .F>
+                      .MIN-WIDTH
+                      <FONT-WIDTH .F>>
+                <VS-ALL .NVS (.WID .CC !<VS-ALL .NVS>)>
+                <VW-KIDS <CHANNEL-DATA .PARENT:VSCHAN>:VSW
+                         (.CC
+                          !<VW-KIDS <CHANNEL-DATA .PARENT:VSCHAN>:VSW>)>
+                <VSOP .NVS
+                      X-STORE-NAME
+                      .WID
+                      <LENGTH <CHANNEL-NAME .CC>:STRING>
+                      <CHANNEL-NAME .CC>>
+                <COND (<NOT <GASSIGNED? INITIAL-MOUSE-CURSOR>>
+                       <SET TEMP ,MDL-CURSOR>)
+                      (T <SET TEMP ,INITIAL-MOUSE-CURSOR>)>
+                <COND (<OR <AND <TYPE? .TEMP CURSOR> <SET PATTERN .TEMP>>
+                           <AND <TYPE? .TEMP VECTOR>
+                                <SET PATTERN <MAKE-PATTERN .NVS !.TEMP>>>>
+                       <VSOP .NVS
+                             X-DEFINE-CURSOR .WID
+                             <C-CURSOR .PATTERN>>)
+                      (.TEMP
+                       <VSOP .NVS X-DEFINE-CURSOR  .WID 0>
+                       <SET PATTERN T>)
+                      (T <SET PATTERN <>>)>
+                <COND (<NOT <GASSIGNED? INITIAL-TEXT-CURSOR>> <SET TEMP T>)
+                      (T <SET TEMP ,INITIAL-TEXT-CURSOR>)>
+                <COND (<AND <TYPE? .TEMP VECTOR>
+                            <SET TPATTERN <MAKE-PATTERN .NVS !.TEMP>>>)
+                      (.TEMP <SET TPATTERN .TEMP>)
+                      (T <SET TPATTERN <>>)>
+                <VSOP .NVS
+                      X-SELECT-INPUT
+                      .WID
+                      <COND (<==? .PARENT <VS-TOPCHAN .NVS>>
+                             <SET INPUTS
+                                  <ORB ,KEY-PRESSED
+                                       ,BUTTON-PRESSED
+                                       ,BUTTON-RELEASED
+                                       ,ENTER-WINDOW
+                                       ,LEAVE-WINDOW
+                                       ,EXPOSE-WINDOW
+                                       ,UNMAP-WINDOW
+                                       ,EXPOSE-REGION
+                                       ,EXPOSE-COPY>>)
+                            (T
+                             <SET INPUTS
+                                  <ORB ,ENTER-WINDOW
+                                       ,LEAVE-WINDOW
+                                       ,BUTTON-PRESSED
+                                       ,BUTTON-RELEASED
+                                       ,UNMAP-WINDOW
+                                       ,EXPOSE-REGION
+                                       ,EXPOSE-COPY>>)>>
+                <VSOP .NVS X-MAP-WINDOW .WID>
+                <CHTYPE [.NVS
+                         .WID
+                         .PARENT
+                         ()
+                         .WIDTH
+                         .HEIGHT
+                         0
+                         0
+                         .F
+                         <COND (<==? .BACKGROUND <VS-BLACK .NVS>> ,GX-COPY)
+                               (<==? .BACKGROUND <VS-WHITE .NVS>>
+                                ,GX-COPY-INVERTED)
+                               (T ,GX-XOR)>
+                         .BACKGROUND
+                         .BPATTERN
+                         .BWIDTH
+                         .OBUF
+                         .OBUF
+                         0
+                         0
+                         0
+                         <+ ,VWM-DEFAULT ,VWM-UNSEEN>
+                         <>
+                         T
+                         ()
+                         <>
+                         <>
+                         .INPUTS
+                         .TPATTERN
+                         <AND <ASSIGNED? SAVE-RASTER> .SAVE-RASTER>
+                         .PATTERN
+                         <>
+                         <>
+                         <>
+                         <>
+                         <>
+                         <>]
+                        VSW>)>)>>
+
+<DEFINE VS-WARP-MOUSE (CHN:VSCHAN OPER X:FIX Y:FIX
+                      "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <VW-FLUSH-BUFFER .VW>
+       <VSOP <VW-VS100 .VW> X-WARP-MOUSE <VW-ID .VW> .X .Y>
+       .CHN>
+
+<DEFINE VS-DRAW-LINE (CHN:VSCHAN OPER FUNC:<OR FIX FALSE>
+                     "TUPLE" POINTS
+                     "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <VW-FLUSH-BUFFER .VW>
+       <COND (<OR <NOT <0? <MOD <LENGTH .POINTS> 2>>> <L? <LENGTH .POINTS> 4>>
+              <ERROR WRONG-NUMBER-OF-ARGS!-ERRORS DRAW-LINE>)>
+       <SCALE-POINT .POINTS .VW>
+       <REPEAT ((X1 <1 .POINTS>) (Y1 <2 .POINTS>) (VV <REST .POINTS 2>))
+               <SCALE-POINT .VV .VW>
+               <VSOP <VW-VS100 .VW>
+                     X-LINE
+                     <COND (<NOT .FUNC> ,GX-XOR) (.FUNC)>
+                     -1               ;"plane mask"
+                     <VW-ID .VW>
+                     .X1
+                     .Y1
+                     <1 .VV>
+                     <2 .VV>
+                     1 1 1>
+               <SET X1 <1 .VV>>
+               <SET Y1 <2 .VV>>
+               <COND (<EMPTY? <SET VV <REST .VV 2>>> <RETURN>)>>
+       T>
+
+<DEFINE SCALE-POINT (PT:<<PRIMTYPE VECTOR> [2 <OR FIX FLOAT>]> VW:VSW
+                    "OPT" (RELATIVE?:<OR ATOM FALSE> <>)
+                    "AUX" (SC:<OR FALSE SCALE> <VW-SCALE .VW>) NUM)
+       <COND (<NOT .SC>
+              <COND (<TYPE? <SET NUM <1 .PT>> FLOAT>
+                     <1 .PT <FIX <+ .NUM 0.5>>>)>
+              <COND (<TYPE? <SET NUM <2 .PT>> FLOAT>
+                     <2 .PT <FIX <+ .NUM 0.5>>>)>)
+             (T
+              <COND (<TYPE? <SET NUM <1 .PT>> FIX> <SET NUM <FLOAT .NUM>>)>
+              <1 .PT
+                 <FIX <+ <* <COND (.RELATIVE? .NUM) (T <- .NUM <S-LEFT .SC>>)>
+                            <S-WSCALE .SC>>
+                         0.5>>>
+              <COND (<TYPE? <SET NUM <2 .PT>> FIX> <SET NUM <FLOAT .NUM>>)>
+              <2 .PT
+                 <FIX <+ <* <COND (.RELATIVE? .NUM) (T <- .NUM <S-TOP .SC>>)>
+                            <S-HSCALE .SC>>
+                         0.5>>>)>>
+
+<DEFINE VS-DRAW-FILLED 
+       (CHN:VSCHAN OPER FUNC:<OR FIX FALSE>
+        FILL-PATTERN:<SPECIAL <OR ATOM FIX>> BORDER?:<SPECIAL <OR ATOM FALSE>>
+        X1:FIX Y1:FIX DFLAGS:<OR FIX FALSE>
+        "TUPLE" STUFF)
+       <COND (<TYPE? .FILL-PATTERN ATOM>
+              <SET FILL-PATTERN
+                   <TRANSLATE-COLOR .FILL-PATTERN
+                                    <VW-VS100 <CHANNEL-DATA .CHN>:VSW>>>)>
+       <VS-DRAW .CHN .OPER .FUNC .X1 .Y1 .DFLAGS !.STUFF>>
+
+<DEFINE VS-DRAW-DASHED (CHN:VSCHAN OPER FUNC:<OR FIX FALSE> 
+                       DASHED-PATTERN:<SPECIAL FIX>
+                       DP-LENGTH:<SPECIAL <OR FIX FALSE>>
+                       DP-MULT:<SPECIAL <OR FIX FALSE>>
+                       X1:<OR FIX FLOAT> Y1:<OR FIX FLOAT> DFLAGS:<OR FIX FALSE>
+                       "TUPLE" STUFF)
+   <COND (<NOT .DP-LENGTH> <SET DP-LENGTH 16>)>
+   <COND (<NOT .DP-MULT> <SET DP-MULT 1>)>
+   <VS-DRAW .CHN .OPER .FUNC .X1 .Y1 .DFLAGS !.STUFF>>
+
+<DEFINE VS-DRAW 
+       (CHN:VSCHAN OPER FUNC:<OR FIX FALSE> X1:<OR FIX FLOAT>
+        Y1:<OR FIX FLOAT> DFLAGS:<OR FIX FALSE>
+        "TUPLE" STUFF
+        "AUX" (VERTS <STACK <ISTRING <* 2 <+ 3 <LENGTH .STUFF>>>>>) (CT 1)
+              (VW:VSW <CHANNEL-DATA .CHN>) (P1 <STACK <VECTOR .X1 .Y1>>)
+              (VS:VS <VW-VS100 .VW>))
+   <VW-FLUSH-BUFFER .VW>
+   <COND (<NOT .FUNC> <SET FUNC ,GX-XOR>)>
+   <COND (<NOT .DFLAGS> <SET DFLAGS 0>)>
+   <SCALE-POINT .P1 .VW>
+   <PUT-WORD .VERTS .CT <1 .P1>>
+   <PUT-WORD .VERTS <SET CT <+ .CT 1>> <2 .P1>>
+   <PUT-WORD .VERTS
+            <SET CT <+ .CT 1>>
+            <ANDB .DFLAGS <XORB ,VERTEX-RELATIVE -1>>>
+   <REPEAT ((VC 1))
+          <COND
+           (<EMPTY? .STUFF>
+            <COND (<ASSIGNED? DASHED-PATTERN>
+                   <VSOP .VS
+                         X-DRAW
+                         .FUNC
+                         -1
+                         <VW-ID .VW>
+                         .VC
+                         1
+                         1
+                         1
+                         1
+                         0
+                         .DASHED-PATTERN
+                         .DP-LENGTH
+                         .DP-MULT
+                         .VERTS>)
+                  (<ASSIGNED? FILL-PATTERN>
+                   <VSOP .VS
+                         X-DRAW-FILLED
+                         .FUNC
+                         -1
+                         <VW-ID .VW>
+                         .VC
+                         1
+                         .FILL-PATTERN
+                         .VERTS>
+                   <COND (.BORDER?
+                          <VSOP .VS
+                                X-DRAW
+                                <COND (<==? <VW-BG .VW> <VS-WHITE .VS>>
+                                       ,GX-CLEAR)
+                                      (T ,GX-SET)>
+                                -1
+                                <VW-ID .VW>
+                                .VC
+                                1
+                                1
+                                1
+                                0
+                                0
+                                0
+                                0
+                                0
+                                .VERTS>)>)
+                  (T <VSOP .VS X-DRAW .FUNC -1 <VW-ID .VW> .VC
+                           1 1 1 0 0 0 0 0 .VERTS>)>
+            <RETURN>)>
+          <COND (<L? <LENGTH .STUFF> 3>
+                 <ERROR BAD-VERTICES!-ERRORS .STUFF DRAW>
+                 <RETURN>)>
+          <SET VC <+ .VC 1>>
+          <SCALE-POINT .STUFF
+                       .VW
+                       <NOT <0? <ANDB <OR <3 .STUFF> .DFLAGS>
+                                      ,VERTEX-RELATIVE>>>>
+          <PUT-WORD .VERTS <SET CT <+ .CT 1>> <1 .STUFF>>
+          <PUT-WORD .VERTS <SET CT <+ .CT 1>> <2 .STUFF>>
+          <PUT-WORD .VERTS <SET CT <+ .CT 1>> <COND (<3 .STUFF>) (T .DFLAGS)>>
+          <SET STUFF <REST .STUFF 3>>>>
+
+<DEFINE PUT-WORD (BYTES:STRING OFFS:FIX WD:FIX "AUX" (TOFFS <* .OFFS 2>)) 
+       <PUT .BYTES .TOFFS <CHTYPE <LSH .WD -8> CHARACTER>>
+       <PUT .BYTES <- .TOFFS 1> <CHTYPE <ANDB .WD 255> CHARACTER>>>
+
+<DEFINE VS-MOUSE-MOVE? (CHN:VSCHAN OPER
+                       "OPT" ON?:<OR ATOM FALSE FIX>
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                             (VS:VS <VW-VS100 .VW>) OLD IP)
+       <SET OLD <ANDB <SET IP <VW-INPUTS .VW>> ,MOTION-BITS>>
+       <COND (<TYPE? .ON? ATOM> <SET ON? ,MOUSE-MOVED>)
+             (<NOT .ON?> <SET ON? 0>)
+             (<==? .ON? ,MOUSE-LEFT> <SET ON? ,LEFT-DOWN-MOTION>)
+             (<==? .ON? ,MOUSE-RIGHT> <SET ON? ,RIGHT-DOWN-MOTION>)
+             (<==? .ON? ,MOUSE-CENTER> <SET ON? ,MIDDLE-DOWN-MOTION>)
+             (T
+              <ERROR UNKNOWN-BIT-PATTERN!-ERRORS .ON? MOUSE-MOVE?>
+              <SET ON? .OLD>)>
+       <COND (<AND <ASSIGNED? ON?> <N==? .ON? .OLD>>
+              <SET IP <ORB <ANDB .IP <XORB ,MOTION-BITS -1>> .ON?>>
+              <VW-INPUTS .VW .IP>
+              <VSOP .VS X-SELECT-INPUT <VW-ID .VW> .IP>)>
+       <COND (<==? .OLD ,MOUSE-MOVED> T)
+             (<==? .OLD ,LEFT-DOWN-MOTION> ,MOUSE-LEFT)
+             (<==? .OLD ,RIGHT-DOWN-MOTION> ,MOUSE-RIGHT)
+             (<==? .OLD ,MIDDLE-DOWN-MOTION> ,MOUSE-CENTER)
+             (<0? .OLD> <>)>>
+
+<DEFINE DEFINE-PATTERN 
+       (CHN:<OR VSCHAN <PRIMTYPE LIST> STRING> OPER
+        BITS:<OR <UVECTOR [8 FIX]> <BYTES [32 FIX]>>
+        "AUX" VW:VSW VS:<OR VS FALSE>)
+       <COND (<TYPE? .CHN CHANNEL>
+              <SET VS <VW-VS100 <SET VW <CHANNEL-DATA .CHN>>>>)
+             (T
+              <SET VS <GET-VS100 .CHN>>)>
+       <COND (.VS
+              <VSOP .VS X-STORE-PIXMAP 0 0 16 16 .BITS>)>>
+
+<DEFINE FREE-PATTERN (CHN:<OR VSCHAN <PRIMTYPE LIST> STRING> OPER PAT:FIX
+                        "AUX" VW:VSW VS:<OR VS FALSE>)
+   <COND (<TYPE? .CHN CHANNEL>
+         <SET VS <VW-VS100 <SET VW <CHANNEL-DATA .CHN>>>>)
+        (T
+         <SET VS <GET-VS100 .CHN>>)>
+   <COND (.VS
+         <VSOP <VW-VS100 .VW> X-FREE-PIXMAP 0 .PAT>)>>
+
+<DEFINE VS-CLEAR-REGION 
+       (CHN:VSCHAN OPER HEIGHT:<OR FIX FLOAT> WIDTH:<OR FIX FLOAT>
+        LEFT:<OR FIX FLOAT> TOP:<OR FIX FLOAT>
+        "OPT" FUNC:FIX
+        "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (VS:VS <VW-VS100 .VW>)
+              (CC <STACK <VECTOR .WIDTH .HEIGHT .LEFT .TOP>>))
+       <COND (<NOT <ASSIGNED? FUNC>>
+              <COND (<==? <VW-BG .VW> <VS-WHITE .VS>> <SET FUNC ,GX-SET>)
+                    (T <SET FUNC ,GX-CLEAR>)>)>
+       <VW-FLUSH-BUFFER .VW>
+       <SCALE-POINT .CC .VW T>
+       <SCALE-POINT <REST .CC 2> .VW>
+       <VSOP .VS
+             X-PIX-FILL
+             .FUNC
+             -1
+             <VW-ID .VW>
+             <2 .CC>
+             <1 .CC>
+             <3 .CC>
+             <4 .CC>
+             1
+             0>>
+
+<DEFINE VS-FILL-REGION 
+       (CHN:VSCHAN OPER PAT:<OR ATOM FIX> HEIGHT:<OR FIX FLOAT>
+        WIDTH:<OR FIX FLOAT> LEFT:<OR FIX FLOAT> TOP:<OR FIX FLOAT> FUNC:FIX
+        "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (VS:VS <VW-VS100 .VW>)
+              (CC <STACK <VECTOR .WIDTH .HEIGHT .LEFT .TOP>>))
+       <COND (<TYPE? .PAT ATOM> <SET PAT <TRANSLATE-COLOR .PAT .VS>>)>
+       <VW-FLUSH-BUFFER .VW>
+       <SCALE-POINT .CC .VW T>
+       <SCALE-POINT <REST .CC 2> .VW>
+       <VSOP .VS
+             X-TILE-FILL
+             .FUNC
+             -1
+             <VW-ID .VW>
+             <2 .CC>
+             <1 .CC>
+             <3 .CC>
+             <4 .CC>
+             .PAT
+             0>>
+
+<DEFINE INVERSE-VIDEO (CHN:<OR VSCHAN VSW> OPER "OPT" ON?:<OR ATOM FALSE>
+                      (CURSOFF? <>)
+                      "AUX" (VW:VSW <COND (<TYPE? .CHN VSW> .CHN)
+                                          (T <CHANNEL-DATA .CHN>)>) OLD)
+   <SET OLD <TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-INVERT>>
+   <COND (<ASSIGNED? ON?>
+         <VW-FLUSH-BUFFER .VW .CURSOFF?>
+         <COND (.ON?
+                <VW-OUTMODE .VW <ORB <VW-OUTMODE .VW> ,VWM-INVERT>>)
+               (T
+                <VW-OUTMODE .VW <ANDB <VW-OUTMODE .VW> <XORB ,VWM-INVERT -1>>>)>)>
+   .OLD>
+
+<DEFINE UNDERLINE (CHN:<OR VSCHAN VSW> OPER "OPT" ON?:<OR ATOM FALSE>
+                  (CURSOFF? <>)
+                  "AUX" (VW:VSW <COND (<TYPE? .CHN VSW> .CHN)
+                                      (T <CHANNEL-DATA .CHN>)>) OLD)
+   <SET OLD <TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-UNDER>>
+   <COND (<ASSIGNED? ON?>
+         <VW-FLUSH-BUFFER .VW .CURSOFF?>
+         <COND (.ON?
+                <COND (<NOT <VW-HIGHX .VW>>
+                       <VW-HIGHX .VW <VW-X .VW>>)>
+                <VW-OUTMODE .VW <ORB <VW-OUTMODE .VW> ,VWM-UNDER>>)
+               (T
+                <COND (<NOT <VW-HIGHLIGHT .VW>>
+                       <VW-HIGHX .VW <>>)>
+                <VW-OUTMODE .VW <ANDB <VW-OUTMODE .VW> <XORB ,VWM-UNDER -1>>>)>)>
+   .OLD>
+
+<DEFINE VS-SET-HIGHLIGHT (CHN:<OR VSCHAN VSW> OPER
+                         "OPT" PAT:<OR FIX FALSE>
+                               (CURSOFF?:<OR ATOM FALSE> <>)
+                         "AUX" (VW:VSW
+                                <COND (<TYPE? .CHN VSW> .CHN)
+                                      (T <CHANNEL-DATA .CHN>)>))
+       <COND (<NOT <ASSIGNED? PAT>> <VW-HIGHLIGHT .VW>)
+             (T
+              <VW-FLUSH-BUFFER .VW <NOT .CURSOFF?>>
+              <VW-HIGHLIGHT .VW .PAT>
+              <COND (<TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-UNDER>)
+                    (<AND .PAT <NOT <0? .PAT>>>
+                     <VW-HIGHX .VW <VW-X .VW>>)
+                    (T
+                     <VW-HIGHX .VW <>>)>)>>
+
+<DEFINE TRANSLATE-COLOR (CLR:<OR ATOM FIX> VS:VS) 
+       <COND (<TYPE? .CLR FIX> .CLR)
+             (<==? .CLR BLACK> <VS-BLACK .VS>)
+             (<==? .CLR WHITE> <VS-WHITE .VS>)
+             (<==? .CLR GRAY> <VS-GRAY .VS>)
+             (T <ERROR BAD-COLOR-NAME!-ERRORS .CLR TRANSLATE-COLOR>)>>
+
+<DEFINE VS-CHANGE-COLOR (CHANNEL:VSCHAN OPER BG:<OR ATOM FIX>
+                        "OPT" BORDER:<OR ATOM FIX>
+                        "AUX" (VW:VSW <CHANNEL-DATA .CHANNEL>)
+                              (VS <VW-VS100 .VW>))
+       <VW-FLUSH-BUFFER .VW>
+       <SET BG <TRANSLATE-COLOR .BG .VS>>
+       <COND (<NOT <ASSIGNED? BORDER>> <SET BORDER <VW-BORDER .VW>>)
+             (T <SET BORDER <TRANSLATE-COLOR .BORDER .VS>>)>
+       <COND (<N==? .BG <VW-BG .VW>>
+              <VW-BG .VW .BG>
+              <COND (<==? .BG <VS-BLACK .VS>>
+                     <VW-TEXT-OP .VW ,GX-COPY>)
+                    (<==? .BG <VS-WHITE .VS>>
+                     <VW-TEXT-OP .VW ,GX-COPY-INVERTED>)
+                    (T
+                     <VW-TEXT-OP .VW ,GX-XOR>)>
+              <VSOP .VS X-CHANGE-BACKGROUND .VW .BG>)>
+       <COND (<N==? .BORDER <VW-BORDER .VW>>
+              <VW-BORDER .VW .BORDER>
+              <VSOP .VS X-CHANGE-BORDER .VW .BORDER>)>
+       T>
+
+<DEFINE VS-MAP MW (CHN:VSCHAN OPER
+                  "AUX" (VW:VSW <CHANNEL-DATA .CHN>) P TOP:FIX LEFT:FIX
+                        WIDTH:FIX HEIGHT:FIX (VS:VS <VW-VS100 .VW>) BWIDTH
+                        NVW:VSW SAVE-RASTER)
+       <VW-FLUSH-BUFFER .VW>
+       <COND (<SET SAVE-RASTER <VW-SAVE .VW>>
+              <COND (<SET P <VSOP .VS X-QUERY-WINDOW <VW-ID .VW>>>
+                     <COND (<NOT <0? <I-BPAR10 .P>>> <RETURN .CHN .MW>)>
+                     <COND (<NOT <0? .SAVE-RASTER>>
+                            <VSOP .VS X-FREE-PIXMAP 0 .SAVE-RASTER>)>
+                     <SET HEIGHT <I-SPAR0 .P>>
+                     <SET WIDTH <I-SPAR1 .P>>
+                     <SET TOP <I-SPAR3 .P>>
+                     <SET LEFT <I-SPAR2 .P>>
+                     <SET BWIDTH <I-SPAR4 .P>>
+                     <SET NVW <CHANNEL-DATA <VW-PARENT .VW>:VSCHAN>>
+                     <SET WIDTH
+                          <MIN <- <VW-WIDTH .NVW> .LEFT>
+                               <+ .WIDTH <* 2 .BWIDTH>>>>
+                     <SET HEIGHT
+                          <MIN <- <VW-HEIGHT .NVW> .TOP>
+                               <+ .HEIGHT <* 2 .BWIDTH>>>>
+                     <COND (<SET SAVE-RASTER
+                                 <VSOP .VS
+                                       X-PIXMAP-SAVE
+                                       <VW-ID .NVW>
+                                       .HEIGHT
+                                       .WIDTH
+                                       .LEFT
+                                       .TOP>>
+                            <VW-SAVE .VW .SAVE-RASTER>)>)>)>
+       <VSOP <VW-VS100 .VW> X-MAP-WINDOW <VW-ID .VW>>>
+
+<DEFINE VS-UNMAP (CHN:VSCHAN OPER "OPT" (QUIET? <>)
+                 "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+       <VW-FLUSH-BUFFER .VW>
+       <COND (<OR .QUIET?
+                  <AND <VW-PARENT .VW> <VW-SAVE .VW> <NOT <0? <VW-SAVE .VW>>>>>
+              ; "Inhibit redisplay events in this case"
+              <VSOP <VW-VS100 .VW> X-UNMAP-TRANSPARENT <VW-ID .VW>>
+              <RESTORE-WIND .VW>)
+             (T
+              <VSOP <VW-VS100 .VW> X-UNMAP-WINDOW <VW-ID .VW>>)>>
+
+<DEFINE RESTORE-WIND RW (VW:VSW
+                        "AUX" (RAST <VW-SAVE .VW>) P CM
+                              (PCH:<OR FALSE VSCHAN> <VW-PARENT .VW>) NVW:VSW
+                              (VS:VS <VW-VS100 .VW>) TOP:FIX LEFT:FIX)
+       <COND (<AND .PCH .RAST <NOT <0? .RAST>>>
+              <COND (<SET P <VSOP .VS X-QUERY-WINDOW <VW-ID .VW>>>
+                     <SET TOP <I-SPAR3 .P>>
+                     <SET LEFT <I-SPAR2 .P>>)
+                    (T
+                     <SET TOP 0>
+                     <SET LEFT 0>)>
+              <SET NVW <CHANNEL-DATA .PCH>>
+              <COND (<AND <> <SET P <VSOP .VS X-QUERY-WINDOW <VW-ID .NVW>>>>
+                     ; "Doesn't seem to be any way to get clipmode"
+                     <COND (<0? <I-BPAR10 .P>> <RETURN .VW .RW>)>
+                     <SET CM <I-SPAR6 .P>>)
+                    (T <SET CM 0>)>
+              <VSOP .VS X-CLIPMODE 1 <VW-ID .NVW>>
+              <VSOP .VS
+                    X-PIXMAP-PUT
+                    ,GX-COPY
+                    -1
+                    <VW-ID .NVW>
+                    <MIN <- <VW-HEIGHT .NVW> .TOP>
+                         <+ <* 2 <VW-BWIDTH .VW>> <VW-HEIGHT .VW>>>
+                    <MIN <- <VW-WIDTH .NVW> .LEFT>
+                         <+ <* 2 <VW-BWIDTH .VW>> <VW-WIDTH .VW>>>
+                    0
+                    0
+                    .RAST
+                    .LEFT
+                    .TOP>
+              <VSOP .VS X-CLIPMODE .CM <VW-ID .NVW>>
+              <VSOP .VS X-FREE-PIXMAP 0 .RAST>
+              <VW-SAVE .VW 0>
+              <VSB-DUMP .VS>)>>
+
+<DEFINE VS-CLOSE (CHN:VSCHAN OPER
+                 "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                       (OC <AND <ASSIGNED? CLOSING?> .CLOSING?>)
+                       (CLOSING?:<SPECIAL ATOM> T) (VS:VS <VW-VS100 .VW>)
+                       PC:CHANNEL NVW:VSW CD RAST P CM TC)
+   <COND (<SET TC <VW-REAL .VW>>
+         <VW-ICON <CHANNEL-DATA .TC>:VSW <>>
+         <CLOSE .TC>)
+        (<SET TC <VW-ICON .VW>>
+         <VW-REAL <CHANNEL-DATA .TC>:VSW <>>
+         <CLOSE .TC>)>
+   <MAPF <> <FUNCTION (C:VSCHAN) <CLOSE .C>> <VW-KIDS .VW>>
+   <COND (<AND <SET CD <VW-CURS-DESC .VW>> <NOT <TYPE? .CD ATOM>>>
+         <DESTROY-CURSOR .CD .VS>)>
+   <COND (<NOT <EMPTY? <VW-MENU-WINDS .VW>>>
+         <PUTREST <REST <VW-MENU-WINDS .VW>
+                        <- <LENGTH <VW-MENU-WINDS .VW>> 1>>
+                  ,MENU-WINDOW-LIST>
+         <SETG MENU-WINDOW-LIST <VW-MENU-WINDS .VW>>
+         <VW-MENU-WINDS .VW ()>)>
+   <COND (<NOT .OC>
+         <VW-KIDS <SET NVW <CHANNEL-DATA <SET PC <VW-PARENT .VW>>>>
+                  <SPLICE-OUT .CHN <VW-KIDS .NVW>>>
+         <VS-ALL .VS <SPLICE-OUT <VW-ID .VW> <VS-ALL .VS> 2>>
+         <COND (<AND <VW-SAVE .VW> <NOT <0? <VW-SAVE .VW>>>>
+                ; "There's something underneath this"
+                <CHANNEL-OP .CHN UNMAP T>
+                ; "So unmap it quietly, which will restore the window")>
+         <VSOP .VS X-DESTROY-WINDOW <VW-ID .VW>>)
+        (<AND <VW-SAVE .VW> <NOT <0? <VW-SAVE .VW>>>>
+         <VSOP .VS X-FREE-PIXMAP 0 <VW-SAVE .VW>>)>
+   .CHN>
+
+<DEFINE SPLICE-OUT (FROB:ANY L:LIST "OPT" (N:FIX 1) "AUX" TL:<OR LIST FALSE>) 
+       <COND (<SET TL <MEMQ .FROB .L>>
+              <COND (<==? .TL .L> <REST .TL .N>)
+                    (T
+                     <SET TL <REST .L <- <LENGTH .L> <LENGTH .TL> 1>>>
+                     <PUTREST .TL <REST .TL <+ .N 1>>>
+                     .L)>)
+             (T .L)>>
+
+<SETG MENU-WINDOW-LIST ()>
+
+<GDECL (MENU-WINDOW-LIST) <LIST [REST MENU-WINDOW]>>
+
+<DEFINE VS-MENU-WINDOW 
+       (CHN:VSCHAN OPER HEIGHT:<OR FIX FALSE> WIDTH:FIX LEFT:FIX TOP:FIX
+        "OPT" (OBJ:ANY <>) TXT:<OR STRING FALSE>
+        "AUX" WID (VW:VSW <CHANNEL-DATA .CHN>) (VS:VS <VW-VS100 .VW>)
+              (MWL:LIST ,MENU-WINDOW-LIST) MW:MENU-WINDOW)
+   <COND (<NOT .HEIGHT> <SET HEIGHT <FONT-HEIGHT <VW-CFONT .VW>>>)>
+   <VW-FLUSH-BUFFER .VW>
+   <COND
+    (<SET WID
+         <VSOP .VS
+               X-CREATE-WINDOW
+               0
+               <VW-ID .VW>
+               .HEIGHT
+               .WIDTH
+               .LEFT
+               .TOP
+               <VW-BORDER .VW>
+               <VW-BG .VW>>>
+     <VSOP .VS X-DEFINE-CURSOR .WID 0>
+     <VSOP .VS X-MAP-WINDOW .WID>
+     <COND (<EMPTY? .MWL>
+           <VW-MENU-WINDS .VW
+                          (<SET MW
+                                <CHTYPE <VECTOR .WID
+                                                .HEIGHT
+                                                .WIDTH
+                                                .OBJ
+                                                ,VWM-UNSEEN>
+                                        MENU-WINDOW>>
+                           !<VW-MENU-WINDS .VW>)>)
+          (T
+           <SET MW <1 .MWL>>
+           <MW-ID .MW .WID>
+           <MW-HEIGHT .MW .HEIGHT>
+           <MW-WIDTH .MW .WIDTH>
+           <MW-OBJ .MW .OBJ>
+           <MW-BITS .MW ,VWM-UNSEEN>
+           <SETG MENU-WINDOW-LIST <REST .MWL>>
+           <VW-MENU-WINDS .VW <PUTREST .MWL <VW-MENU-WINDS .VW>>>)>
+     <COND (<NOT <ASSIGNED? TXT>>
+           <COND (<TYPE? .OBJ STRING> <SET TXT .OBJ>) (T <SET TXT <>>)>)>
+     <COND (.TXT <CHANNEL-OP .CHN WRITE-TO-MENU-WINDOW .MW .TXT>)>
+     .MW)>>
+
+<DEFINE VS-CLEAR-MENU-WINDOW (CHN:VSCHAN OPER MW:MENU-WINDOW
+                             "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                                   (VS:VS <VW-VS100 .VW>))
+       <VSOP .VS X-CLEAR <MW-ID .MW>>
+       <MW-OBJ .MW <>>>
+
+<DEFINE VS-SELECT-MENU-WINDOW (CHN:VSCHAN OPER
+                              "OPT" (MW:<OR MENU-WINDOW FALSE> <>)
+                              "AUX" (VW:VSW <CHANNEL-DATA .CHN>) L)
+       <COND (<NOT .MW>
+              <COND (<NOT <EMPTY? <SET L <VW-MENU-WINDS .VW>>>>
+                     <SET MW <NTH .L <LENGTH .L>>>)>)>
+       <COND (.MW
+              <VSOP <VW-VS100 .VW>
+                    X-WARP-MOUSE
+                    <MW-ID .MW>
+                    </ <MW-WIDTH .MW> 2>
+                    </ <MW-HEIGHT .MW> 2>>)>>
+
+<DEFINE VS-WRITE-TO-MENU (CHN:VSCHAN OPER MW:MENU-WINDOW TXT:STRING
+                         "OPT" (X:FIX 0) (Y:FIX 0) FONT:STRING
+                         "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                               (CFONT:<OR FONT FALSE> <VW-CFONT .VW>)
+                               (VS:VS <VW-VS100 .VW>))
+       <COND (<ASSIGNED? FONT> <SET CFONT <GET-FONT .FONT .VS>>)>
+       <COND (.CFONT
+              <MW-OBJ .MW .TXT>
+              <VSOP .VS
+                    X-TEXT
+                    <VW-TEXT-OP .VW>
+                    -1
+                    <MW-ID .MW>
+                    0
+                    0
+                    <FONT-ID .CFONT>
+                    1 0
+                    <LENGTH .TXT>
+                    0 0               ;"PADDING BETWEEN CHARS"
+                    .TXT>)>>
+
+<DEFINE VS-INVERT-MENU (CHN:VSCHAN OPER MW:MENU-WINDOW) 
+       <VSOP <VW-VS100 <CHANNEL-DATA .CHN>:VSW>
+             X-PIX-FILL
+             ,GX-INVERT
+             -1
+             <MW-ID .MW>
+             <MW-HEIGHT .MW>
+             <MW-WIDTH .MW>
+             0
+             0
+             1
+             0>
+       T>
+
+<DEFINE VS-SET-FONT (CHN:VSCHAN OPER
+                    "OPT" FONT:STRING
+                    "AUX" (VW:VSW <CHANNEL-DATA .CHN>) TF
+                          (VS:VS <VW-VS100 .VW>) P (MH 0) (MW 0))
+       <COND (<NOT <ASSIGNED? FONT>>
+              <COND (<SET TF <VW-CFONT .VW>> <FONT-NAME .TF>)>)
+             (<SET TF <GET-FONT .FONT <VW-VS100 .VW>>>
+              <COND (<SET P <VSOP .VS X-GET-RESIZE-HINT <VW-ID .VW>>>
+                     <SET MH <I-SPAR0 .P>>
+                     <SET MW <I-SPAR2 .P>>)>
+              <VSOP .VS
+                    X-SET-RESIZE-HINT
+                    <VW-ID .VW>
+                    .MH
+                    <FONT-HEIGHT .TF>
+                    .MW
+                    <FONT-WIDTH .TF>>
+              <CURSOR-OFF .VW>
+              <VW-CFONT .VW .TF>
+              <CURSOR-ON .VW>
+              .FONT)>>
+
+<SETG BUF1 <ISTRING 1>>
+
+<GDECL (BUF1) STRING>
+
+<DEFINE VS-IMAGE-OUT (CHANNEL:VSCHAN OPER CHRS:<OR STRING CHARACTER>
+                     "OPT" (LENGTH:<OR FIX FALSE> <>)
+                           (X:<OR FIX FLOAT FALSE> <>)
+                           (Y:<OR FIX FLOAT FALSE> <>)
+                           (FONT:<OR FONT STRING FALSE> <>)
+                           (DOP:<OR FIX FALSE> <>)
+                     "AUX" (VW:VSW <CHANNEL-DATA .CHANNEL>)
+                           (PP <STACK <VECTOR .X .Y>>) (CFONT <VW-CFONT .VW>)
+                           (VS:VS <VW-VS100 .VW>))
+       <VW-FLUSH-BUFFER .VW>
+       <COND (.FONT
+              <COND (<TYPE? .FONT FONT> <SET CFONT .FONT>)
+                    (T <SET CFONT <GET-FONT .FONT .VS>>)>)>
+       <GET-COORDS .VW .PP>
+       <COND (<NOT .DOP> <SET DOP <VW-TEXT-OP .VW>>)>
+       <COND (<TYPE? .CHRS CHARACTER> <SET CHRS <1 ,BUF1 .CHRS>>)>
+       <COND (<NOT .LENGTH> <SET LENGTH <LENGTH .CHRS>>)
+             (T <SET LENGTH <MIN .LENGTH <LENGTH .CHRS>>>)>
+       <VSOP .VS
+             X-TEXT
+             .DOP
+             -1
+             <VW-ID .VW>
+             <1 .PP>
+             <2 .PP>
+             <FONT-ID .CFONT>
+             1
+             0
+             .LENGTH
+             0 0
+             .CHRS>
+       .LENGTH>
+
+<DEFINE GET-COORDS (VW:VSW PP:<<PRIMTYPE VECTOR> [2 <OR FIX FLOAT FALSE>]>
+                   "AUX" (SC <VW-SCALE .VW>) (OX <VW-X .VW>) (OY <VW-Y .VW>)
+                         (X <1 .PP>) (Y <2 .PP>))
+       <COND (<NOT .SC>
+              <COND (<TYPE? .X FLOAT> <SET X <FIX <+ .X 0.5>>>)>
+              <1 .PP <OR .X .OX>>
+              <COND (<TYPE? .Y FLOAT> <SET Y <FIX <+ .Y 0.5>>>)>
+              <2 .PP <OR .Y .OY>>)
+             (<AND <NOT .X> <NOT .Y>> <1 .PP .OX> <2 .PP .OY>)
+             (T
+              <COND (<NOT .X>
+                     <1 .PP <S-LEFT .SC>>
+                     <SCALE-POINT .PP .VW>
+                     <1 .PP .OX>)
+                    (<NOT .Y>
+                     <1 .PP <S-TOP .SC>>
+                     <SCALE-POINT .PP .VW>
+                     <2 .PP .OY>)
+                    (T <SCALE-POINT .PP .VW>)>)>>
+
+<DEFINE VS-NORMAL-OUT (CHANNEL:VSCHAN OPER CHRS:<OR STRING CHARACTER>
+                      "OPT" (LENGTH:<OR FIX FALSE> <>)
+                            (X:<OR FIX FLOAT FALSE> <>)
+                            (Y:<OR FIX FLOAT FALSE> <>)
+                            (FONT:<OR FONT STRING FALSE> <>)
+                            (DOP:<OR FIX FALSE> <>)
+                      "AUX" (VW:VSW <CHANNEL-DATA .CHANNEL>) ODOP
+                            (CFONT <VW-CFONT .VW>) (RFONT .CFONT) HIGH
+                            (PP <STACK <VECTOR .X .Y>>))
+   <COND (<TYPE? .CHRS CHARACTER> <SET CHRS <1 ,BUF1 .CHRS>> <SET LENGTH 1>)
+        (<NOT .LENGTH> <SET LENGTH <LENGTH .CHRS>>)
+        (T <SET LENGTH <MIN .LENGTH <LENGTH .CHRS>>>)>
+   <COND
+    (<G? .LENGTH 0>
+     <COND
+      (<COND (<NOT .FONT> T)
+            (<TYPE? .FONT FONT> <SET RFONT .FONT>)
+            (T <SET RFONT <GET-FONT .FONT <VW-VS100 .VW>>>)>
+       <GET-COORDS .VW .PP>
+       <SET X <1 .PP>>
+       <SET Y <2 .PP>>
+       <COND (<==? .DOP <SET ODOP <VW-TEXT-OP .VW>>> <SET DOP <>>)>
+       <COND (<OR <N==? .RFONT .CFONT>
+                 <N==? .Y:FIX <VW-Y .VW>>
+                 <N==? .X:FIX <VW-X .VW>>
+                 .DOP>
+             <CURSOR-OFF .VW>
+             <COND (<G? <VW-OCT .VW> 0> <VW-FLUSH-BUFFER .VW T>)>
+             <CHANNEL-OP .CHANNEL MOVE-CURSOR-ABS .X .Y <> <>>
+             <VW-CFONT .VW .RFONT>)>
+       <COND (.DOP <VW-TEXT-OP .VW .DOP>)>
+       <REPEAT ((CT:FIX 0) CHR:CHARACTER (LAST <CHTYPE -1 CHARACTER>))
+        <SET CHR <CHTYPE <ANDB <1 .CHRS> 127> CHARACTER>>
+        <SET CHRS <REST .CHRS>>
+        <SET CT <+ .CT 1>>
+        <COND (<AND <G=? <ASCII .CHR> 33> <L=? <ASCII .CHR> 126>>
+               <VS-CHAR .CHANNEL .VW .CHR>)
+              (<==? .CHR <ASCII 27>> <VS-CHAR .CHANNEL .VW !\$>)
+              (<==? .CHR <ASCII 32>>
+               <COND (<TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-UNDER>
+                      <VW-FLUSH-BUFFER .VW <>>
+                      <CHANNEL-OP .CHANNEL UNDERLINE <>>
+                      <VS-CHAR .CHANNEL .VW .CHR>
+                      <CHANNEL-OP .CHANNEL UNDERLINE T>)
+                     (T
+                      <VS-CHAR .CHANNEL .VW .CHR>)>)
+              (<AND <==? .CHR <ASCII 10>> <==? .LAST <ASCII 13>>>)
+              (<OR <==? .CHR <ASCII 13>> <==? .CHR <ASCII 10>>>
+               <DO-LF .CHANNEL .VW>)
+              (<==? .CHR <ASCII 9>>
+               <CURSOR-OFF .VW>
+               <VW-FLUSH-BUFFER .VW <>>
+               <SET HIGH <>>
+               <COND (<TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-UNDER>
+                      <SET HIGH <CHANNEL-OP .CHANNEL UNDERLINE <>>>
+                      <CURSOR-OFF .VW>)>
+               <PROG ((X <VW-X .VW>) (AW <FONT-WIDTH <VW-CFONT .VW>>)
+                      (LEN <- <* 8 .AW> <MOD .X <* 8 .AW>>>) OH)
+                     <COND (<G? <SET X <+ .X .LEN>> <VW-WIDTH .VW>>
+                            <COND (<SET OH <VW-HIGHLIGHT .VW>>
+                                   <CHANNEL-OP .CHANNEL SET-HIGHLIGHT <>>)>
+                            <VW-X .VW 0>
+                            <CHANNEL-OP .CHANNEL DOWN-CURSOR>
+                            <CHANNEL-OP .CHANNEL CLEAR-EOL>
+                            <COND (.OH
+                                   <CHANNEL-OP .CHANNEL SET-HIGHLIGHT .OH>)>
+                            <VW-X .VW <- .X <VW-WIDTH .VW>>>)
+                           (T <VW-X .VW .X>)>
+                     <VW-OX .VW .X>>
+               <COND (.HIGH
+                      <CHANNEL-OP .CHANNEL UNDERLINE T>)>
+               <CURSOR-ON .VW>)
+              (<==? .CHR <ASCII 7>>
+               <VW-FLUSH-BUFFER .VW>
+               <VSOP <VW-VS100 .VW> X-FEEP 0 <VW-ID .VW>>)
+              (<N==? .CHR <ASCII 127>>
+               <VS-CHAR .CHANNEL
+                        .VW
+                        !\^
+                        <ASCII <ANDB <+ <ASCII .CHR> 64> 127>>>)>
+        <SET LAST .CHR>
+        <COND (<G=? .CT .LENGTH> <RETURN .CT>)>>
+       <COND (<OR .DOP <N==? .CFONT .RFONT>>
+             <VW-FLUSH-BUFFER .VW T>
+             <VW-TEXT-OP .VW .DOP>
+             <VW-CFONT .VW .CFONT>)>
+       .LENGTH)>)>>
+
+<DEFINE DO-LF (CHN:VSCHAN VW:VSW
+              "AUX" (Y <VW-Y .VW>) (X <VW-X .VW>) (HEIGHT <VW-HEIGHT .VW>)
+                    (LH <FONT-HEIGHT <VW-CFONT .VW>>)
+                    (MODE <VW-OUTMODE .VW>))
+       <CURSOR-OFF .VW>
+       <VW-FLUSH-BUFFER .VW <>>
+       <COND (<G? <SET Y <+ .Y .LH>> <- .HEIGHT .LH>> <SET Y 0>)>
+       <VW-Y .VW .Y>
+       <VW-X .VW 0>
+       <VW-OY .VW .Y>
+       <VW-OX .VW 0>
+       <VS-CLEAR-EOL .CHN CLEAR-EOL>>
+
+<DEFINE VS-CLEAR-EOL (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+       <VW-CURSOR .VW <>>
+       <VW-FLUSH-BUFFER .VW <>>
+       <VSOP <VW-VS100 .VW>
+             X-TILE-FILL
+             ,GX-COPY
+             -1
+             <VW-ID .VW>
+             <FONT-HEIGHT <VW-CFONT .VW>>
+             <- <VW-WIDTH .VW> <VW-X .VW>>
+             <VW-X .VW>
+             <VW-Y .VW>
+             <VW-BG .VW>
+             0>
+       <CURSOR-ON .VW>>
+
+<DEFINE VS-CLEAR-SCREEN (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+       <VW-HIGHLIGHT .VW <>>
+       <VW-HIGHX .VW <>>
+       <VW-OUTMODE .VW
+                   <ANDB <VW-OUTMODE .VW> <XORB -1 <ORB ,VWM-UNDER ,VWM-INVERT>>>>
+       <VW-CURSOR .VW <>>
+       <VW-OCT .VW 0>
+       <VW-OBUF .VW <VW-TOBUF .VW>>
+       <VW-X .VW 0>
+       <VW-Y .VW 0>
+       <VW-OX .VW 0>
+       <VW-OY .VW 0>
+       <VSOP <VW-VS100 .VW> X-CLEAR <VW-ID .VW>>
+       <CURSOR-ON .VW>
+       <UPDATE-MC .CHN 0 0>>
+
+<DEFINE VS-CLEAR-EOS (CHN:VSCHAN OPER
+                     "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (Y <VW-Y .VW>))
+       <VW-CURSOR .VW <>>
+       <VW-FLUSH-BUFFER .VW <>>
+       <COND (<NOT <0? <VW-X .VW>>>
+              <CHANNEL-OP .CHN CLEAR-EOL>
+              <SET Y <+ .Y <FONT-HEIGHT <VW-CFONT .VW>>>>)>
+       <VSOP <VW-VS100 .VW>
+             X-TILE-FILL
+             ,GX-COPY
+             -1
+             <VW-ID .VW>
+             <- <VW-HEIGHT .VW> .Y>
+             <VW-WIDTH .VW>
+             0
+             .Y
+             <VW-BG .VW>
+             0>
+       <CURSOR-ON .VW>>
+
+<SETG CRLF-STRING <STRING <ASCII 13> <ASCII 10>>>
+
+<DEFINE VS-CHAR (CHN:VSCHAN VW:VSW
+                "TUPLE" CHARS:<<PRIMTYPE VECTOR> [REST CHARACTER]>
+                "AUX" (X:FIX <VW-X .VW>) (FONT:FONT <VW-CFONT .VW>)
+                      (WIDTH:FIX <COND (<TYPE? <CHANNEL-USER .CHN> MUD-CHAN>
+                                        <* <M-HLEN .CHN> <FONT-WIDTH .FONT>>)
+                                       (T
+                                        <VW-WIDTH .VW>)>)
+                      HIGH UNDER)
+       <MAPF <>
+             <FUNCTION (CHR:CHARACTER "AUX" WID) 
+                     <COND (<G? <SET X
+                                     <+ .X <SET WID <CHAR-WIDTH .CHR .FONT>>>>
+                                .WIDTH>
+                            <OUTPUT-STRING .CHN !\!>
+                            <SET HIGH <VW-HIGHLIGHT .VW>>
+                            <SET UNDER <CHANNEL-OP .CHN UNDERLINE <>>>
+                            <CHANNEL-OP .CHN SET-HIGHLIGHT <>>
+                            <VS-NORMAL-OUT .CHN NORMAL-OUT ,CRLF-STRING>
+                            <CHANNEL-OP .CHN SET-HIGHLIGHT .HIGH>
+                            <CHANNEL-OP .CHN UNDERLINE .UNDER>
+                            <SET X .WID>)>
+                     <VW-X .VW .X>
+                     <OUTPUT-STRING .CHN .CHR>>
+             .CHARS>>
+
+<DEFINE OUTPUT-STRING (CHN:VSCHAN CHR:<OR CHARACTER STRING>
+                      "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (OBUF <VW-OBUF .VW>)
+                            (OCT <VW-OCT .VW>) LEN:FIX)
+   <COND (<TYPE? .CHR CHARACTER> <SET LEN 1> <SET CHR <1 ,BUF1 .CHR>>)
+        (T <SET LEN <LENGTH .CHR>>)>
+   <COND
+    (<NOT .OBUF>
+     <CURSOR-OFF .VW>
+     <VSOP <VW-VS100 .VW>
+          X-TEXT
+          <COND (<TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-INVERT>
+                 <COND (<==? <VW-TEXT-OP .VW> ,GX-COPY> ,GX-COPY-INVERTED)
+                       (<==? <VW-TEXT-OP .VW> ,GX-COPY-INVERTED> ,GX-COPY)
+                       (T ,GX-EQUIV)>)
+                (T <VW-TEXT-OP .VW>)>
+          -1
+          <VW-ID .VW>
+          <VW-OX .VW>
+          <VW-OY .VW>
+          <FONT-ID <VW-CFONT .VW>>
+          1 0
+          .LEN
+          0 0
+          .CHR>
+     <VW-OX .VW <VW-X .VW>>
+     <VW-OY .VW <VW-Y .VW>>
+     <CURSOR-ON .VW>)
+    (T
+     <PROG ((TRANS 0) (CURSOR-IS-OFF <>))
+       <COND (<G? .LEN <SET TRANS <LENGTH .OBUF>>>
+             <COND (<0? .OCT>
+                    <CURSOR-OFF .VW>
+                    <SET CURSOR-IS-OFF T>
+                    <VSOP <VW-VS100 .VW>
+                          X-TEXT
+                          <COND (<TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-INVERT>
+                                 <COND (<==? <VW-TEXT-OP .VW> ,GX-COPY>
+                                        ,GX-COPY-INVERTED)
+                                       (<==? <VW-TEXT-OP .VW>
+                                             ,GX-COPY-INVERTED>
+                                        ,GX-COPY)
+                                       (T ,GX-EQUIV)>)
+                                (T <VW-TEXT-OP .VW>)>
+                          -1
+                          <VW-ID .VW>
+                          <VW-OX .VW>
+                          <VW-OY .VW>
+                          <FONT-ID <VW-CFONT .VW>>
+                          1 0
+                          .LEN
+                          0 0
+                          .CHR>
+                    <VW-OX .VW <VW-X .VW>>
+                    <VW-OY .VW <VW-Y .VW>>)
+                   (T
+                    <COND (<NOT <EMPTY? .OBUF>>
+                           <SUBSTRUC .CHR 0 .TRANS .OBUF>
+                           <VW-OCT .VW <+ .OCT .TRANS>>)>
+                    <CURSOR-OFF .VW>
+                    <VW-FLUSH-BUFFER .VW <>>
+                    <SET CURSOR-IS-OFF T>
+                    <SET OCT 0>
+                    <SET OBUF <VW-TOBUF .VW>:STRING>
+                    <SET CHR <REST .CHR .TRANS>>
+                    <SET LEN <- .LEN .TRANS>>
+                    <AGAIN>)>)
+            (T
+             <SUBSTRUC .CHR 0 .LEN .OBUF>
+             <VW-OCT .VW <+ .OCT .LEN>>
+             <VW-OBUF .VW <REST .OBUF .LEN>>)>
+       <COND (.CURSOR-IS-OFF <CURSOR-ON .VW>)>>)>>
+
+<DEFINE CURSOR-OFF (VW:VSW) 
+       <COND (<VW-CURSOR .VW> <SHOW-CURSOR .VW> <VW-CURSOR .VW <>>)>>
+
+<DEFINE CURSOR-ON (VW:VSW) 
+       <COND (<NOT <VW-CURSOR .VW>> <SHOW-CURSOR .VW> <VW-CURSOR .VW T>)>>
+
+<DEFINE SHOW-CURSOR (VW:VSW "AUX" F:FONT (CD <VW-CURS-DESC .VW>)) 
+       <COND (<TYPE? .CD ATOM>
+              <SET F <VW-CFONT .VW>>
+              <VSOP <VW-VS100 .VW>
+                    X-TILE-FILL
+                    ,GX-XOR
+                    -1
+                    <VW-ID .VW>
+                    <FONT-HEIGHT .F>
+                    <FONT-WIDTH .F>
+                    <VW-OX .VW>
+                    <VW-OY .VW>
+                    <VS-WHITE <VW-VS100 .VW>>
+                    0>)
+             (<NOT .CD>)
+             (T
+              <VSOP <VW-VS100 .VW>
+                    X-TILE-FILL
+                    ,GX-XOR
+                    -1
+                    <VW-ID .VW>
+                    <C-HEIGHT .CD>
+                    <C-WIDTH .CD>
+                    <+ <VW-OX .VW> <C-LEFT .CD>>
+                    <+ <VW-OY .VW> <C-TOP .CD>>
+                    <VS-WHITE <VW-VS100 .VW>>
+                    <C-RASTER .CD>>)>
+       T>
+
+<DEFINE VW-FLUSH-BUFFER (VW:VSW
+                        "OPT" (CURS:<OR ATOM FALSE> T)
+                        "AUX" (VS:VS <VW-VS100 .VW>) (W:FIX <VW-ID .VW>)
+                              F:FONT Y)
+       <COND (<G? <VW-OCT .VW> 0>
+              <SET F <VW-CFONT .VW>>
+              <VSOP <VW-VS100 .VW>
+                    X-TEXT
+                    <COND (<TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-INVERT>
+                           <COND (<==? <VW-TEXT-OP .VW> ,GX-COPY>
+                                  ,GX-COPY-INVERTED)
+                                 (<==? <VW-TEXT-OP .VW> ,GX-COPY-INVERTED>
+                                  ,GX-COPY)
+                                 (T ,GX-EQUIV)>)
+                          (T <VW-TEXT-OP .VW>)>
+                    -1
+                    <VW-ID .VW>
+                    <VW-OX .VW>
+                    <VW-OY .VW>
+                    <FONT-ID <VW-CFONT .VW>>
+                    1 0
+                    <VW-OCT .VW>
+                    0 0
+                    <VW-TOBUF .VW>:STRING>
+              <VW-OX .VW <VW-X .VW>>
+              <VW-OY .VW <VW-Y .VW>>
+              <VW-OCT .VW 0>
+              <VW-OBUF .VW <VW-TOBUF .VW>>)>
+       <COND (<VW-HIGHX .VW>
+              <COND (<TEST-VW-MODE <VW-OUTMODE .VW> ,VWM-UNDER>
+                     <VSOP <VW-VS100 .VW> X-LINE ,GX-XOR -1
+                           <VW-ID .VW> 
+                           <MIN <VW-X .VW> <VW-HIGHX .VW>>
+                           <SET Y <- <+ <VW-Y .VW> <FONT-HEIGHT <VW-CFONT .VW>>>
+                                     1>>
+                           <MAX <VW-X .VW> <VW-HIGHX .VW>>
+                           .Y 1 1 1>)>
+              <COND (<VW-HIGHLIGHT .VW>
+                     <VSOP <VW-VS100 .VW>
+                           X-TILE-FILL
+                           ,GX-XOR
+                           -1
+                           <VW-ID .VW>
+                           <FONT-HEIGHT <VW-CFONT .VW>>
+                           <ABS <- <VW-X .VW> <VW-HIGHX .VW>>>
+                           <MIN <VW-X .VW> <VW-HIGHX .VW>>
+                           <VW-Y .VW>
+                           <VW-HIGHLIGHT .VW>
+                           0>)>
+              <VW-HIGHX .VW <VW-X .VW>>)>
+       <COND (.CURS <CURSOR-ON .VW>)>>
+
+<DEFINE VS-BUFOUT (CHN:VSCHAN OPER
+                  "OPT" (FORCE? <>)
+                  "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (CDONE? <>))
+       <COND (<G? <VW-OCT .VW> 0>
+              <SET CDONE? T>
+              <CURSOR-OFF .VW>
+              <VW-FLUSH-BUFFER .VW T>)>
+       <COND (.FORCE?
+              <COND (<NOT .CDONE?>
+                     <CURSOR-OFF .VW>
+                     <CURSOR-ON .VW>)>
+              <VSB-DUMP <VW-VS100 .VW>>)>
+       T>
+
+<DEFINE VS-BUFTREE (CHN:VSCHAN OPER
+                   "OPT" (FORCE? <>)
+                   "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <COND (<G? <VW-OCT .VW> 0> <CURSOR-OFF .VW> <VW-FLUSH-BUFFER .VW T>)>
+       <MAPF <>
+             <FUNCTION (KID:VSCHAN) <CHANNEL-OP .KID BUFTREE <>>>
+             <VW-KIDS .VW>>
+       <COND (.FORCE? <VSB-DUMP <VW-VS100 .VW>>)>
+       T>
+
+<DEFINE VS-DOWN-CURSOR (CHN:VSCHAN OPER
+                       "OPT" (CT:FIX 1)
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (Y <VW-Y .VW>)
+                             (CH <FONT-HEIGHT <VW-CFONT .VW>>))
+       <SET Y <+ .Y <* .CT .CH>>>
+       <CHANNEL-OP .CHN MOVE-CURSOR-ABS <VW-X .VW> .Y T>>
+
+<DEFINE VS-UP-CURSOR (CHN:VSCHAN OPER
+                     "OPT" (CT:FIX 1)
+                     "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (Y <VW-Y .VW>))
+       <SET Y <- .Y <* .CT <FONT-HEIGHT <VW-CFONT .VW>>>>>
+       <CHANNEL-OP .CHN MOVE-CURSOR-ABS <VW-X .VW> .Y T>>
+
+<DEFINE VS-HOME-CURSOR (CHN:VSCHAN OPER) 
+       <CHANNEL-OP .CHN MOVE-CURSOR-ABS 0 0 <> <>>>
+
+<DEFINE VS-BOTTOM-CURSOR (CHN:VSCHAN OPER
+                         "AUX" (VW:VSW <CHANNEL-DATA .CHN>) H CH)
+       <CHANNEL-OP .CHN
+                   MOVE-CURSOR-ABS
+                   0
+                   <* <- </ <SET H <VW-HEIGHT .VW>>
+                            <SET CH <FONT-HEIGHT <VW-CFONT .VW>>>>
+                         1>
+                      .CH>
+                   <>
+                   <>>>
+
+<DEFINE VS-HOR-POS (CHN:VSCHAN OPER
+                   "OPT" X:FIX
+                   "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <COND (<ASSIGNED? X>
+              <CHANNEL-OP .CHN
+                          MOVE-CURSOR-ABS
+                          <* .X <FONT-WIDTH <VW-CFONT .VW>>>
+                          <VW-Y .VW>
+                          <>
+                          <>>
+              .X)
+             (T </ <VW-X .VW> <FONT-WIDTH <VW-CFONT .VW>>>)>>
+
+<DEFINE VS-VER-POS (CHN:VSCHAN OPER
+                   "OPT" Y:<OR FIX FLOAT>
+                   "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <COND (<ASSIGNED? Y>
+              <CHANNEL-OP .CHN
+                          MOVE-CURSOR-ABS
+                          <VW-X .VW>
+                          <* .Y <FONT-HEIGHT <VW-CFONT .VW>>>
+                          <>
+                          <>>
+              .Y)
+             (T </ <VW-Y .VW> <FONT-HEIGHT <VW-CFONT .VW>>>)>>
+
+<DEFINE VS-HOR-POS-ABS (CHN:VSCHAN OPER
+                       "OPT" X:<OR FIX FLOAT>
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <COND (<ASSIGNED? X>
+              <CHANNEL-OP .CHN MOVE-CURSOR-ABS .X <VW-Y .VW>>
+              <VW-X .VW>)
+             (T <VW-X .VW>)>>
+
+<DEFINE VS-VER-POS-ABS (CHN:VSCHAN OPER
+                       "OPT" Y:FIX
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+       <COND (<ASSIGNED? Y> <CHANNEL-OP .CHN MOVE-CURSOR-ABS <VW-X .VW> .Y>)
+             (T <VW-Y .VW>)>>
+
+<DEFINE VS-MOVE-CURSOR (CHN:VSCHAN OPER X:FIX Y:FIX
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>) F)
+       <CHANNEL-OP .CHN
+                   MOVE-CURSOR-ABS
+                   <* .X <FONT-WIDTH <SET F <VW-CFONT .VW>>>>
+                   <* .Y <FONT-HEIGHT .F>>
+                   T>>
+
+<DEFINE VS-MOVE-CURSOR-ABS (CHN:VSCHAN OPER NX:<OR FIX FLOAT> NY:<OR FIX FLOAT>
+                           "OPT" (CHAR?:<OR ATOM FALSE> <>)
+                                 (SCALE?:<OR ATOM FALSE> <NOT .CHAR?>)
+                           "AUX" (VW:VSW <CHANNEL-DATA .CHN>) BOT RIGHT
+                                 (CH <FONT-HEIGHT <VW-CFONT .VW>>)
+                                 (CW <FONT-WIDTH <VW-CFONT .VW>>) (RCH .CH)
+                                 (RCW .CW) (PP <STACK <VECTOR .NX .NY>>) X:FIX
+                                 Y:FIX)
+       <COND (.SCALE? <SCALE-POINT .PP .VW> <SET X <1 .PP>> <SET Y <2 .PP>>)
+             (T
+              <COND (<TYPE? .NX FLOAT> <SET X <FIX <+ .NX 0.5>>>)
+                    (T <SET X .NX>)>
+              <COND (<TYPE? .NY FLOAT> <SET Y <FIX <+ .NY 0.5>>>)
+                    (T <SET Y .NY>)>)>
+       <COND (<OR <N==? .X <VW-X .VW>> <N==? .Y <VW-Y .VW>>>
+              <CURSOR-OFF .VW>
+              <PROG (YC)
+                    <SET YC <>>
+                    <COND (.CHAR?
+                           <SET BOT </ <VW-HEIGHT .VW> .CH>>
+                           <SET RIGHT </ <VW-WIDTH .VW> .CW>>
+                           <SET Y </ .Y .CH>>
+                           <SET X </ .X .CW>>)
+                          (T
+                           <SET BOT <VW-HEIGHT .VW>>
+                           <SET RIGHT <VW-WIDTH .VW>>
+                           <SET CH 1>
+                           <SET CW 1>)>
+                    <COND (<L? .Y 0>
+                           <REPEAT ()
+                                   <SET Y <+ .Y .BOT>>
+                                   <COND (<G? .Y 0> <RETURN>)>>)>
+                    <COND (<G=? .Y .BOT> <SET Y <MOD .Y .BOT>>)>
+                    <COND (.CHAR? <SET Y <* .Y .CH>>)>
+                    <COND (<L? .X 0>
+                           <REPEAT ()
+                                   <SET X <+ .X .RIGHT>>
+                                   <SET Y <+ .Y .CH>>
+                                   <SET YC T>
+                                   <COND (<G? .X 0> <RETURN>)>>)>
+                    <COND (<G=? .X .RIGHT>
+                           <SET Y <+ .Y <* .CH </ .X .RIGHT>>>>
+                           <SET YC T>
+                           <SET X <MOD .X .RIGHT>>)>
+                    <COND (.CHAR? <SET X <* .X .CW>>)>
+                    <COND (.YC <AGAIN>)>>
+              <COND (<G? <VW-OCT .VW> 0> <VW-FLUSH-BUFFER .VW <>>)>
+              <VW-X .VW .X>
+              <VW-OX .VW .X>
+              <VW-Y .VW .Y>
+              <VW-OY .VW .Y>
+              <CURSOR-ON .VW>)>
+       <UPDATE-MC .CHN </ .X .RCW> </ .Y .RCH>>
+       .CHN>
+
+<DEFINE VS-FORWARD-CURSOR (CHN:VSCHAN OPER
+                          "OPT" (CT:FIX 1)
+                          "AUX" (VW:VSW <CHANNEL-DATA .CHN>) X)
+       <SET X <+ <VW-X .VW> <* .CT <FONT-WIDTH <VW-CFONT .VW>>>>>
+       <CHANNEL-OP .CHN MOVE-CURSOR-ABS .X <VW-Y .VW> T>>
+
+<DEFINE VS-BACK-CURSOR (CHN:VSCHAN OPER
+                       "OPT" (CT:FIX 1)
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>) X)
+       <SET X <- <VW-X .VW> <* .CT <FONT-WIDTH <VW-CFONT .VW>>>>>
+       <CHANNEL-OP .CHN MOVE-CURSOR-ABS .X <VW-Y .VW> T>>
+
+<DEFINE DESTROY-CURSOR (CD:<OR CURSOR ATOM> VS:VS) 
+       <COND (<TYPE? .CD ATOM>)
+             (T
+              <C-REF .CD <- <C-REF .CD> 1>>
+              <COND (<L=? <C-REF .CD> 0>
+                     <VSOP .VS X-FREE-CURSOR 0 <C-CURSOR .CD>>
+                     <COND (<NOT <0? <C-MASK .CD>>>
+                            <VSOP .VS X-FREE-BITMAP 0 <C-MASK .CD>>)>
+                     <VSOP .VS X-FREE-BITMAP 0 <C-RASTER .CD>>)>)>
+       T>
+
+<DEFINE VS-MOUSE-CURSOR (CHN:VSCHAN OPER
+                        "OPT" PATTERN:<OR STRING BYTES FALSE CURSOR ATOM>
+                              WIDTH:FIX HEIGHT:FIX (TOP:FIX 0) (LEFT:FIX 0)
+                              (MASK:<OR FALSE STRING BYTES> <>)
+                              (DISPLAY:FIX ,GX-XOR)
+                              (PRESERVE?:<OR ATOM FALSE> T)
+                        "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                              (VS:VS <VW-VS100 .VW>) (OLD <VW-MOUSE-DESC .VW>)
+                              R CURSOR)
+       <COND (<AND <ASSIGNED? PATTERN> <N=? .PATTERN .OLD>>
+              <VW-FLUSH-BUFFER .VW>
+              <COND (<TYPE? .PATTERN CURSOR>
+                     <COND (<G? <C-REF .PATTERN> 0>
+                            <C-REF .PATTERN <+ <C-REF .PATTERN> 1>>
+                            <VW-MOUSE-DESC .VW .PATTERN>)
+                           (T
+                            <ERROR DEAD-CURSOR!-ERRORS
+                                   .PATTERN
+                                   MOUSE-CURSOR>)>)
+                    (<OR <NOT .PATTERN> <TYPE? .PATTERN ATOM>>
+                     <COND (<TYPE? .OLD CURSOR> <DESTROY-CURSOR .OLD .VS>)>
+                     <VW-MOUSE-DESC .VW .PATTERN>)
+                    (<SET PATTERN
+                          <MAKE-PATTERN .VS
+                                        .PATTERN
+                                        .WIDTH
+                                        .HEIGHT
+                                        .TOP
+                                        .LEFT
+                                        .MASK
+                                        .DISPLAY>>
+                     <COND (<AND <TYPE? .OLD CURSOR> <NOT .PRESERVE?>>
+                            <DESTROY-CURSOR .OLD .VS>)>
+                     <VW-MOUSE-DESC .VW .PATTERN>)>
+              <COND (<NOT <VW-MOUSE-DESC .VW>>
+                     <VSOP .VS X-DEFINE-CURSOR <VW-ID .VW> 0>)
+                    (<TYPE? <VW-MOUSE-DESC .VW> ATOM>
+                     <VSOP .VS
+                           X-DEFINE-CURSOR <VW-ID .VW> 0>)
+                    (T
+                     <VSOP .VS
+                           X-DEFINE-CURSOR
+                           <VW-ID .VW>
+                           <C-CURSOR <SET CURSOR <VW-MOUSE-DESC .VW>>>>)>)>
+       .OLD>
+
+<DEFINE MAKE-PATTERN 
+       (VS:VS PATTERN:<OR STRING BYTES> WIDTH:FIX HEIGHT:FIX TOP:FIX LEFT:FIX
+        "OPT" (MASK:<OR STRING BYTES FALSE> <>) (DISPLAY:FIX ,GX-XOR)
+        "AUX" R (NR 0) CURSOR)
+       <COND (<N==? <LENGTH .PATTERN> <* 2 .HEIGHT </ <+ .WIDTH 15> 16>>>
+              <ERROR CURSOR-PATTERN-WRONG-LENGTH!-ERRORS
+                     .PATTERN
+                     .WIDTH
+                     .HEIGHT
+                     MAKE-PATTERN>)
+             (<AND .MASK <N==? <LENGTH .PATTERN> <LENGTH .MASK>>>
+              <ERROR MASK-IS-WRONG-LENGTH!-ERRORS
+                     .MASK
+                     .PATTERN
+                     MAKE-PATTERN>)
+             (<SET R <VSOP .VS X-STORE-BITMAP 0 .HEIGHT .WIDTH .PATTERN>>
+              <COND (<OR <NOT .MASK>
+                         <SET NR
+                              <VSOP .VS
+                                    X-STORE-BITMAP
+                                    0
+                                    .HEIGHT
+                                    .WIDTH
+                                    .MASK>>>
+                     <COND
+                      (<SET CURSOR <VSOP .VS X-STORE-CURSOR
+                                         .DISPLAY 0 .R 1 0 .NR .TOP .LEFT>>
+                       <CHTYPE [.R .NR .HEIGHT .WIDTH .TOP .LEFT 1 .DISPLAY
+                                .CURSOR]
+                               CURSOR>)
+                      (T
+                       <VSOP .VS X-FREE-BITMAP 0 .R>
+                       <COND (.MASK
+                              <VSOP .VS X-FREE-BITMAP 0 .NR>)>
+                       .CURSOR)>)
+                    (T <VSOP .VS X-FREE-BITMAP 0 .R> .NR)>)>>
+
+<DEFINE VS-TEXT-CURSOR (CHN:VSCHAN OPER
+                       "OPT" PATTERN:<OR STRING BYTES FALSE CURSOR ATOM>
+                             WIDTH:FIX HEIGHT:FIX (TOP:FIX 0) (LEFT:FIX 0)
+                             (PRESERVE?:<OR ATOM FALSE> T)
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                             (VS:VS <VW-VS100 .VW>) (OLD <VW-CURS-DESC .VW>)
+                             R)
+       <COND (<ASSIGNED? PATTERN>
+              <VW-FLUSH-BUFFER .VW>
+              <CURSOR-OFF .VW>
+              <COND (<TYPE? .PATTERN CURSOR>
+                     <COND (<L=? <C-REF .PATTERN> 0>
+                            <ERROR DEAD-CURSOR!-ERRORS .PATTERN TEXT-CURSOR>)
+                           (T
+                            <C-REF .PATTERN <+ <C-REF .PATTERN> 1>>
+                            <VW-CURS-DESC .VW .PATTERN>)>)
+                    (<OR <NOT .PATTERN> <TYPE? .PATTERN ATOM>>
+                     <COND (<AND .OLD
+                                 <NOT <TYPE? .OLD ATOM>>
+                                 <NOT .PRESERVE?>>
+                            <DESTROY-CURSOR .OLD .VS>)>
+                     <VW-CURS-DESC .VW .PATTERN>)
+                    (T
+                     <COND (<SET PATTERN
+                                 <MAKE-PATTERN .VS
+                                               .PATTERN
+                                               .WIDTH
+                                               .HEIGHT
+                                               .TOP
+                                               .LEFT>>
+                            <COND (.OLD <DESTROY-CURSOR .OLD .VS>)>
+                            <VW-CURS-DESC .VW .PATTERN>)>)>
+              <CURSOR-ON .VW>)>
+       .OLD>
+
+<DEFINE VS-DISPLAY-CURSOR (CHN:VSCHAN OPER PAT:<OR CURSOR ATOM FALSE>
+                          "OPT" (X:<OR FIX FLOAT FALSE> <>)
+                                (Y:<OR FIX FLOAT FALSE> <>)
+                          "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                                (PP <STACK <VECTOR .X .Y>>) F)
+       <VW-FLUSH-BUFFER .VW>
+       <GET-COORDS .VW .PP>
+       <COND (<==? .PAT TEXT-CURSOR> <SET PAT <VW-CURS-DESC .VW>>)
+             (<TYPE? .PAT ATOM> <SET PAT <VW-MOUSE-DESC .VW>>)>
+       <COND (<NOT .PAT>)
+             (<NOT <TYPE? .PAT CURSOR>>
+              <VSOP <VW-VS100 .VW>
+                    X-TILE-FILL
+                    ,GX-XOR
+                    -1
+                    <VW-ID .VW>
+                    <FONT-HEIGHT <SET F <VW-CFONT .VW>>>
+                    <FONT-WIDTH .F>
+                    <1 .PP>
+                    <2 .PP>
+                    <VS-WHITE <VW-VS100 .VW>>
+                    0>)
+             (T
+              <VSOP <VW-VS100 .VW>
+                    X-TILE-FILL
+                    ,GX-XOR
+                    -1
+                    <VW-ID .VW>
+                    <C-HEIGHT .PAT>
+                    <C-WIDTH .PAT>
+                    <+ <1 .PP>:FIX <C-LEFT .PAT>>
+                    <+ <2 .PP>:FIX <C-TOP .PAT>>
+                    <VS-WHITE <VW-VS100 .VW>>
+                    <C-RASTER .PAT>>)>>
+
+<DEFINE VS-FRESH-LINE (CHN:VSCHAN OPER
+                      "OPT" (N:FIX 1)
+                      "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                            (H <FONT-HEIGHT <VW-CFONT .VW>>))
+       <COND (<NOT <0? <VW-X .VW>>>
+              <CHANNEL-OP .CHN MOVE-CURSOR-ABS 0 <+ <VW-Y .VW> .H> <> T>
+              <CHANNEL-OP .CHN CLEAR-EOL>
+              <SET N <- .N 1>>)>
+       <COND (<G? .N 0>
+              <REPEAT ()
+                      <CHANNEL-OP .CHN
+                                  MOVE-CURSOR-ABS
+                                  0
+                                  <+ <VW-Y .VW> .H>
+                                  <>
+                                  T>
+                      <COND (<L=? <SET N <- .N 1>> 0> <RETURN>)>>)>
+       .CHN>
+
+<DEFINE VS-BIT-BLT 
+       (CHN:VSCHAN OPER HEIGHT:FIX WIDTH:FIX SLEFT:FIX STOP:FIX DLEFT:FIX
+        DTOP:FIX
+        "OPT" (FCN:FIX ,GX-COPY) (DOCURS?:<OR ATOM FALSE> T)
+        "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (VS:VS <VW-VS100 .VW>))
+       <COND (.DOCURS? <CURSOR-OFF .VW>)>
+       <VW-FLUSH-BUFFER .VW <>>
+       <VSOP .VS
+             X-COPY-AREA
+             .FCN
+             -1
+             <VW-ID .VW>
+             .HEIGHT
+             .WIDTH
+             .SLEFT
+             .STOP
+             .DLEFT
+             .DTOP>
+       <COND (.DOCURS? <CURSOR-ON .VW>)>
+       .CHN>
+
+<DEFINE VS-INSERT-LINE (CHN:VSCHAN OPER
+                       "OPT" (N:FIX 1) (TOP:<OR FALSE FIX> <>)
+                             (BOT:<OR FALSE FIX> <>)
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                             (FONT <VW-CFONT .VW>) (H:FIX <FONT-HEIGHT .FONT>)
+                             TEMP (RBOT <- <VW-HEIGHT .VW> 1>))
+       <COND (<NOT .TOP> <SET TOP <VW-Y .VW>>) (T <SET TOP <* .TOP .H>>)>
+       <COND (<NOT .BOT> <SET BOT .RBOT>) (T <SET BOT <* .BOT .H>>)>
+       <COND (<G? .TOP .BOT> <SET TEMP .BOT> <SET BOT .TOP> <SET TOP .TEMP>)>
+       <COND (<AND <L=? .TOP .RBOT> <NOT <0? .N>>>
+              <SET BOT <MIN .BOT .RBOT>>
+              <CURSOR-OFF .VW>
+              <CHANNEL-OP .CHN
+                          BIT-BLT
+                          <- .BOT .TOP <* <ABS .N> .H>>
+                          <VW-WIDTH .VW>
+                          0
+                          <COND (<G? .N 0> .TOP) (T <+ .TOP <* <- .N> .H>>)>
+                          0
+                          <COND (<G? .N 0> <+ .TOP <* .N .H>>) (T .TOP)>
+                          ,GX-COPY
+                          <>>
+              <VSOP <VW-VS100 .VW>
+                    X-TILE-FILL
+                    ,GX-COPY
+                    -1
+                    <VW-ID .VW>
+                    <* <ABS .N> .H>
+                    <VW-WIDTH .VW>
+                    0
+                    <COND (<G? .N 0> .TOP) (T <+ .BOT <* .N .H>>)>
+                    <VW-BG .VW>
+                    0>
+              <CURSOR-ON .VW>
+              .CHN)>>
+
+<DEFINE VS-INSERT-CHAR (CHN:VSCHAN OPER
+                       "OPT" (N:FIX 1) (LEFT:<OR FALSE FIX> <>)
+                             (RIGHT:<OR FALSE FIX> <>)
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                             (FONT <VW-CFONT .VW>) (W:FIX <FONT-WIDTH .FONT>)
+                             TEMP (RRIGHT <- <VW-WIDTH .VW> 1>))
+       <COND (<NOT .LEFT> <SET LEFT <VW-X .VW>>) (T <SET LEFT <* .LEFT .W>>)>
+       <COND (<NOT .RIGHT> <SET RIGHT .RRIGHT>) (T <SET RIGHT <* .RIGHT .W>>)>
+       <COND (<G? .LEFT .RIGHT>
+              <SET TEMP .LEFT>
+              <SET LEFT .RIGHT>
+              <SET RIGHT .TEMP>)>
+       <COND (<AND <L=? .LEFT .RRIGHT> <NOT <0? .N>>>
+              <CURSOR-OFF .VW>
+              <CHANNEL-OP .CHN
+                          BIT-BLT
+                          <FONT-HEIGHT .FONT>
+                          <- .RIGHT .LEFT <* <ABS .N> .W>>
+                          <COND (<G? .N 0> .LEFT) (T <+ .LEFT <* <- .N> .W>>)>
+                          <VW-Y .VW>
+                          <COND (<G? .N 0> <+ .LEFT <* .N .W>>) (T .LEFT)>
+                          <VW-Y .VW>
+                          ,GX-COPY
+                          <>>
+              <VSOP <VW-VS100 .VW>
+                    X-TILE-FILL
+                    ,GX-COPY
+                    -1
+                    <VW-ID .VW>
+                    <FONT-HEIGHT .FONT>
+                    <* <ABS .N> .W>
+                    <COND (<G? .N 0> .LEFT) (T <+ .RIGHT <* .N .W>>)>
+                    <VW-Y .VW>
+                    <VW-BG .VW>
+                    0>
+              <CURSOR-ON .VW>
+              .CHN)>>
+
+<DEFINE VS-ERASE-CHAR (CHN:VSCHAN OPER
+                      "OPTIONAL" (N:FIX 1)
+                      "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (X <VW-X .VW>)
+                            (FONT <VW-CFONT .VW>) (W <FONT-WIDTH .FONT>)
+                            (H <FONT-HEIGHT .FONT>) (VS:VS <VW-VS100 .VW>))
+   <COND
+    (<G? .N 0>
+     <VW-FLUSH-BUFFER .VW>
+     <REPEAT (NX (NY <VW-Y .VW>) (DIST <* .N .W>))
+            <COND
+             (<G=? .X .W>
+              <COND (<G? .DIST .X> <SET NX 0> <SET DIST <- .DIST .X>>)
+                    (T <SET NX <- .X .DIST>> <SET DIST 0>)>
+              <VSOP .VS
+                    X-TILE-FILL
+                    ,GX-COPY
+                    -1
+                    <VW-ID .VW>
+                    .H
+                    <- .X .NX>
+                    .NX
+                    .NY
+                    <VW-BG .VW>
+                    0>
+              <COND (<G? .DIST 0>
+                     <COND (<L? <SET NY <- .NY .H>> 0>
+                            <SET NY <- <* </ <VW-HEIGHT .VW> .H> .H> .H>>)>
+                     <SET X <- <VW-WIDTH .VW> .W>>)
+                    (T
+                     <CHANNEL-OP .CHN MOVE-CURSOR-ABS .NX .NY <> <>>
+                     <RETURN>)>)>>)>>
+
+<DEFINE VS-KILL-CHAR (CHN:VSCHAN OPER
+                     "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                           (FONT <VW-CFONT .VW>))
+       <CHANNEL-OP .CHN BACK-CURSOR>
+       <CURSOR-OFF .VW>
+       <VSOP <VW-VS100 .VW>
+             X-TILE-FILL
+             ,GX-COPY
+             -1
+             <VW-ID .VW>
+             <FONT-HEIGHT .FONT>
+             <FONT-WIDTH .FONT>
+             <VW-X .VW>
+             <VW-Y .VW>
+             <VW-BG .VW>
+             0>
+       <CHANNEL-OP .CHN FORWARD-CURSOR>>
+
+\f
+
+<DEFINE ICON? (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+   <VW-REAL .VW>>
+
+<DEFINE ICONIFIED? (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>))
+   <VW-ICON .VW>>
+
+<DEFINE INVERT-ICON (CHN:<OR VSCHAN FALSE> OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                    (VS:VS <VW-VS100 .VW>))
+   <COND (<NOT <VW-REAL .VW>>
+         <SET CHN <VW-ICON .VW>>)>
+   <COND (.CHN
+         <SET VW <CHANNEL-DATA .CHN>>
+         <CHANNEL-OP .CHN
+                     CHANGE-COLOR
+                     <COND (<==? <VW-BG .VW> <VS-BLACK .VS>>
+                            <VS-WHITE .VS>)
+                           (T
+                            <VS-BLACK .VS>)>
+                     <COND (<==? <VW-BORDER .VW> <VS-BLACK .VS>>
+                            <VS-WHITE .VS>)
+                           (T
+                            <VS-WHITE .VS>)>>
+         <CHANNEL-OP .CHN REDISPLAY-ICON>
+         T)>>
+
+<DEFINE ICONIFY (CHN:VSCHAN OPER X:FIX Y:FIX 
+                "OPT" (IN?:<OR VSCHAN FALSE> <>)
+                "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                (VS:VS <VW-VS100 .VW>) FONT NCH NAME:STRING
+                WID:FIX HIGH:FIX)
+   <COND (<VW-REAL .VW> #FALSE ("CAN'T ICONIFY AN ICON"))
+        (<VW-ICON .VW>)
+        (<SET FONT <GET-FONT ,INITIAL-FONT .VS>>
+         <SET NAME <CHANNEL-NAME .CHN>>
+         <SET HIGH <+ 8 <FONT-HEIGHT .FONT>>>
+         <SET WID <+ 8 <* <FONT-WIDTH .FONT> <LENGTH .NAME>>>>
+         <COND (<SET NCH <CHANNEL-OPEN VS100 <STRING "ICON-" .NAME>
+                                       <OR .IN? .VS>
+                                       .HIGH .WID .X .Y
+                                       1 BLACK WHITE
+                                       ,INITIAL-FONT
+                                       <>>>
+                <VW-ICON .VW .NCH>
+                <CHANNEL-OP .NCH MOUSE-CURSOR !,CROSS-CURSOR 
+                            ,GX-COPY-INVERTED <>>
+                <CHANNEL-OP .NCH TEXT-CURSOR <>>
+                <SET VW <CHANNEL-DATA .NCH>>
+                <VW-REAL .VW .CHN>
+                <CHANNEL-OP .CHN UNMAP>
+                <CHANNEL-OP .NCH REDISPLAY-ICON>
+                .NCH)>)>>
+
+<DEFINE REDISPLAY-ICON (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                       REAL:<OR VSCHAN FALSE> (VS:VS <VW-VS100 .VW>)
+                       NAME:STRING)
+   <COND (<NOT <SET REAL <VW-REAL .VW>>>
+         <COND (<SET REAL <VW-ICON .VW>>
+                <SET REAL .CHN>
+                <SET CHN <VW-ICON .VW>>
+                <SET VW <CHANNEL-DATA .CHN>>)>)>
+   <COND (.REAL
+         <VSOP .VS X-CLEAR <VW-ID .VW>>
+         <VSOP .VS X-TILE-FILL ,GX-COPY -1 <VW-ID .VW>
+               <VW-HEIGHT .VW> <VW-WIDTH .VW> 0 0 <VS-GRAY .VS> 0>
+         <VSOP .VS X-TEXT <COND (<==? <VW-BG .VW> <VS-WHITE .VS>>
+                                 ,GX-COPY-INVERTED)
+                                (T
+                                 ,GX-COPY)>
+               -1
+               <VW-ID .VW> 4 4
+               <FONT-ID <VW-CFONT .VW>>
+               1 0
+               <LENGTH <SET NAME <CHANNEL-NAME .REAL>>>
+               0 0
+               .NAME>
+         <VSB-DUMP .VS>)>>
+
+<DEFINE DE-ICONIFY (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                   REAL)
+   <COND (<SET REAL <VW-REAL .VW>>
+         ; "We were given the icon"
+         <VW-REAL .VW <>>
+         ; "Break the link, so close won't kill the real thing"
+         <CLOSE .CHN>
+         <CHANNEL-OP .REAL MAP>
+         <VW-ICON <CHANNEL-DATA .REAL>:VSW <>>
+         .REAL)
+        (<SET REAL <VW-ICON .VW>>
+         ; "Well, there is an icon"
+         <CHANNEL-OP .REAL DE-ICONIFY>)>>
+
+<DEFINE MOUSE-LOWER-WINDOW (CHN:VSCHAN OPER EVENT:MOUSE-EVENT "OPT" (SLOP:FIX 20)
+                           (ICON-PARENT:<OR VSCHAN FALSE> <>)
+                           "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                           (VS:VS <VW-VS100 .VW>)
+                           OLD-X:FIX OLD-Y:FIX
+                           (OLD-EVENT <ME-KIND .EVENT>) OLD
+                           EXEVENT VAL P (UV <STACK <IUVECTOR 2>>))
+   <COND
+    (<VW-REAL .VW>
+     <CHANNEL-OP .CHN LOWER-WINDOW>)
+    (T
+     <CHANNEL-OP .CHN INTERPRET-LOCATOR <ME-LOCATOR .EVENT> .UV>
+     ; "Get coordinates relative to this window"
+     <SET OLD-X <1 .UV>>
+     <SET OLD-Y <2 .UV>>
+     <COND (<==? .OLD-EVENT ,ME-LEFT-PRESSED> <SET EXEVENT ,ME-LEFT-RELEASED>)
+          (<==? .OLD-EVENT ,ME-MIDDLE-PRESSED> <SET EXEVENT ,ME-MIDDLE-RELEASED>)
+          (<==? .OLD-EVENT ,ME-RIGHT-PRESSED> <SET EXEVENT ,ME-RIGHT-RELEASED>)
+          (T <SET EXEVENT ,ME-LEFT-RELEASED>)>
+     <SET OLD <CHANNEL-OP .CHN MOUSE-MOVE? T>>
+     <SET SLOP <* .SLOP .SLOP>>
+     <SET VAL
+      <GRAB-MOUSE-AND-DO
+       <BIND (VAL)
+       <REPEAT (EV (ICON? <>) KIND TFIX:FIX NEW-CURS)
+         <COND
+          (<SET EV <CHANNEL-OP .CHN READ-BYTE-IMMEDIATE>>
+           <COND
+            (<TYPE? .EV MOUSE-EVENT>
+             <COND (<==? <SET KIND <ME-KIND .EV>> .EXEVENT>
+                    <COND (.ICON?
+                           <DESTROY-CURSOR .NEW-CURS .VS>
+                           <SET P <VSOP .VS X-INTERPRET-LOCATOR
+                                        <VW-ID 
+                                         <CHANNEL-DATA
+                                          <OR .ICON-PARENT
+                                              <VS-TOPCHAN .VS>>:VSCHAN>:VSW>
+                                        <ME-LOCATOR .EV>>>
+                           <SET VAL
+                                <CHANNEL-OP .CHN ICONIFY <I-SPAR2 .P:UVECTOR>
+                                            <I-SPAR3 .P:UVECTOR> .ICON-PARENT>>)
+                          (T
+                           <CHANNEL-OP .CHN LOWER-WINDOW>
+                           <SET VAL .CHN>)>
+                    <RECYCLE-EVENTS .EV>
+                    <RETURN .VAL>)
+                   (<NOT <0? <ANDB .KIND ,ME-PRESSED-MASK>>>
+                    <RETURN <>>)
+                   (<==? .KIND ,MOUSE-MOVED>
+                    <COND (<AND <NOT .ICON?>
+                                <G? <+ <* <SET TFIX <- <ME-X .EV> .OLD-X>> .TFIX>
+                                       <* <SET TFIX <- <ME-Y .EV> .OLD-Y>> .TFIX>>
+                                    .SLOP>>
+                           <SET ICON? T>
+                           <SET NEW-CURS
+                                <MAKE-PATTERN .VS !,ICONIFY-CURSOR ,GX-COPY>>
+                           <VSOP .VS X-UNGRAB-MOUSE 0>
+                           <VSOP .VS X-GRAB-MOUSE 
+                                 <VW-ID .VW> <C-CURSOR .NEW-CURS>
+                                 <VW-INPUTS .VW>>)>)>)>
+           <RECYCLE-EVENTS .EV>)
+          (T
+           <RETURN .EV>)>>
+       <CHANNEL-OP .CHN MOUSE-MOVE? .OLD>>
+       .CHN
+       !,CROSS-CURSOR>>
+     .VAL)>>
+
+<DEFMAC GRAB-MOUSE-AND-DO ('GM-THING 'GM-W GM-PATTERN GM-WIDTH GM-HEIGHT
+                          "OPT" (GM-TOP 0) (GM-LEFT 0) (GM-MASK <>) 
+                          (GM-DISPLAY ,GX-COPY-INVERTED))
+   <FORM BIND (('GM-VW:VSW <FORM CHANNEL-DATA .GM-W>)
+              'GM-CURS:CURSOR GM-VAL GM-OCM ('GM-VS:VS <FORM VW-VS100 '.GM-VW>)
+              (GM-ID <FORM VW-ID '.GM-VW>))
+      <FORM UNWIND
+       <FORM BIND (P ('MOUSE-GRABBED?:<SPECIAL ATOM> T))
+        <FORM COND (<FORM NOT
+                          <FORM SET GM-CURS <FORM MAKE-PATTERN '.GM-VS
+                                                  .GM-PATTERN .GM-WIDTH
+                                                  .GM-HEIGHT .GM-TOP .GM-LEFT
+                                                  .GM-MASK .GM-DISPLAY>>>
+                    <FORM ERROR CANT-MAKE-CURSOR!-ERRORS '.GM-CURS GRAB-MOUSE>)>
+        <FORM
+         COND
+         (<FORM SET P <FORM VSOP '.GM-VS X-QUERY-WINDOW '.GM-ID>>
+          <FORM SET GM-OCM 0 ;<FORM I-SPAR6 '.P>>
+          <FORM VSOP '.GM-VS X-CLIPMODE 1 '.GM-ID>
+          <FORM
+           COND
+           (<FORM VSOP '.GM-VS
+                  X-GRAB-MOUSE '.GM-ID
+                  <FORM C-CURSOR '.GM-CURS>
+                  <FORM VW-INPUTS '.GM-VW>>
+            <FORM SET GM-VAL .GM-THING>
+            <FORM VSOP '.GM-VS X-CLIPMODE '.GM-OCM '.GM-ID>
+            <FORM VSOP '.GM-VS X-UNGRAB-MOUSE 0>
+            <FORM DESTROY-CURSOR '.GM-CURS '.GM-VS>
+            '.GM-VAL)>)>>
+       <FORM COND (<FORM ASSIGNED? GM-CURS>
+                  <FORM VSOP '.GM-VS X-CLIPMODE '.GM-OCM '.GM-ID>
+                  <FORM VSOP '.GM-VS X-UNGRAB-MOUSE 0>
+                  <FORM DESTROY-CURSOR '.GM-CURS '.GM-VS>)>>>>
+
+<DEFINE MOUSE-OPEN-WINDOW MOW 
+       (DESC:<OR FALSE <PRIMTYPE LIST> VSCHAN> OPER NAME:STRING
+        "OPT" (BWIDTH:<OR FIX FALSE> <>) (BPATTERN:<OR ATOM FIX FALSE> <>)
+              (BACKGROUND:<OR ATOM FIX FALSE> <>) (FONT:<OR STRING FALSE> <>)
+              (BUF? T) (DEFAULT-HEIGHT:FIX 24) (DEFAULT-WIDTH:FIX 80)
+              (MIN-HEIGHT:FIX 2) (MIN-WIDTH:FIX 2)
+        "AUX" VW:VSW (SPEC? <>) VS:VS OLD PID NVS:<OR FALSE VS> 
+              RFONT:<OR FALSE FONT>
+              MH:FIX MW:FIX DH:FIX DW:FIX PARENT:VSCHAN P OLD-CURSOR TOP:FIX
+              LEFT:FIX WIDTH:FIX HEIGHT:FIX MY-FONT:FONT MY-WIND MY-WIDTH
+              VAL)
+   <COND (<NOT .BWIDTH> <SET BWIDTH 2>)>
+   <COND (<NOT <TYPE? .DESC CHANNEL>>
+         <COND (<SET NVS <GET-VS100 .DESC>> <SET PARENT <VS-TOPCHAN .NVS>>)
+               (<RETURN .NVS .MOW>)>)
+        (T <SET PARENT .DESC>)>
+   <SET VW <CHANNEL-DATA .PARENT>>
+   <SET VS <VW-VS100 .VW>>
+   <SET PID <VW-ID .VW>>
+   <VW-FLUSH-BUFFER .VW>
+   <SET MY-FONT <GET-FONT ,INITIAL-FONT .VS>>
+   <COND (<NOT .FONT>
+         <COND (<N==? .PARENT .DESC>
+                <SET FONT ,INITIAL-FONT>)
+               (T
+                <SET FONT <FONT-NAME <VW-CFONT .VW>>>)>)>
+   <COND (<NOT <SET RFONT <GET-FONT .FONT .VS>>>
+         <RETURN .RFONT .MOW>)>
+   <SET MH <+ <* .BWIDTH 2> <* .MIN-HEIGHT <SET DH <FONT-HEIGHT .RFONT>>>>>
+   <SET MW <+ <* .BWIDTH 2> <* .MIN-WIDTH <SET DW <FONT-WIDTH .RFONT>>>>>
+   <SET OLD <CHANNEL-OP .PARENT MOUSE-MOVE? T>>
+   <COND (<TYPE? .DESC CHANNEL>
+         <CHANNEL-OP .PARENT RAISE-WINDOW>)>
+   <SET MY-WIND
+       <VSOP .VS
+             X-CREATE-WINDOW
+             2
+             <VW-ID <CHANNEL-DATA <VS-TOPCHAN .VS>:CHANNEL>:VSW>
+             <FONT-HEIGHT .MY-FONT>
+             <SET MY-WIDTH <* <FONT-WIDTH .MY-FONT> <+ 10 <LENGTH .NAME>>>>
+             0
+             0
+             <VS-WHITE .VS>
+             <VS-BLACK .VS>>>
+   <VSOP .VS X-MAP-WINDOW .MY-WIND>
+   <SETG DRAW-CHANGED? T>
+   <SETG DRAW-ODD? -1>
+   <GRAB-MOUSE-AND-DO
+    <COND
+     (<SET P <VSOP .VS X-QUERY-MOUSE .PID>>
+      <SET TOP <I-SPAR3 .P:UVECTOR>>
+      <SET LEFT <I-SPAR2 .P:UVECTOR>>
+      <SET WIDTH .MW>
+      <SET HEIGHT .MH>
+      <REPEAT ((DRAW? T) E (LOC? <>) KIND (NEW-SIZE? T)
+              (TV <STACK <UVECTOR 0 15000>>) 
+              (FH:FIX <CHANNEL-OP <VS-CHANNEL .VS> FILE-HANDLE>)
+              (RD:FIX <LSH 1 .FH>) (MX:FIX <+ .FH 1>)
+              (VV <STACK <IUVECTOR 1>>) CT:<OR FIX FALSE>)
+        <COND (.DRAW? <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>)>
+        <COND (.NEW-SIZE?
+               <UPDATE-SIZE .VS
+                            .MY-WIND
+                            .MY-FONT
+                            .NAME
+                            .BWIDTH
+                            .WIDTH
+                            .HEIGHT
+                            .DW
+                            .DH>)>
+        <CHANNEL-OP .PARENT BUFOUT>
+        <SET NEW-SIZE? <>>
+        <SET DRAW? <>>
+        <COND
+         (<OR <NOT <SET CT <CALL SYSCALL SELECT .MX <1 .VV .RD> 0 0 .TV>>>
+              <0? .CT>>
+          <SET E <>>
+          <SET DRAW? T>
+          <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+          <CHANNEL-OP .PARENT BUFOUT>
+          <CALL SYSCALL SELECT 0 0 0 0 .TV>)
+         (<TYPE? <SET E <CHANNEL-OP .PARENT READ-BYTE-IMMEDIATE T>>
+                 MOUSE-EVENT>
+          <COND (<==? <SET KIND <ME-KIND .E>> ,ME-MOVED>
+                 <SET DRAW? T>
+                 <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+                 <CHANNEL-OP .PARENT BUFOUT>
+                 <COND (.LOC?
+                        <SET NEW-SIZE? T>
+                        <SETG DRAW-CHANGED? T>
+                        <SET HEIGHT <- <ME-Y .E> .TOP>>
+                        <COND (<L? <ABS .HEIGHT> .MH>
+                               <COND (<L? .HEIGHT 0> <SET HEIGHT <- .MH>>)
+                                     (T <SET HEIGHT .MH>)>)>
+                        <SET WIDTH <- <ME-X .E> .LEFT>>
+                        <COND (<L? <ABS .WIDTH> .MW>
+                               <COND (<L? .WIDTH 0> <SET WIDTH <- .MW>>)
+                                     (T <SET WIDTH .MW>)>)>)
+                       (T
+                        <SETG DRAW-CHANGED? T>
+                        <SET TOP <ME-Y .E>>
+                        <SET LEFT <ME-X .E>>)>)
+                (.LOC?
+                 <COND (<==? .KIND ,ME-MIDDLE-RELEASED>
+                        <RECYCLE-EVENTS .E>
+                        <RETURN>)>)
+                (<==? .KIND ,ME-LEFT-PRESSED>
+                 <SET SPEC? 1>
+                 <RECYCLE-EVENTS .E>
+                 <RETURN>)
+                (<==? .KIND ,ME-RIGHT-PRESSED>
+                 <SET SPEC? 2>
+                 <RECYCLE-EVENTS .E>
+                 <RETURN>)
+                (<==? .KIND ,ME-MIDDLE-PRESSED>
+                 <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+                 <CHANNEL-OP .PARENT MOUSE-MOVE? ,MOUSE-CENTER>
+                 <SET LOC? T>
+                 <SET DRAW? T>)>)>
+        <RECYCLE-EVENTS .E>>
+      <VSOP .VS X-DESTROY-WINDOW .MY-WIND>
+      <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+      <CHANNEL-OP .PARENT MOUSE-MOVE? .OLD>
+      <COND (.SPEC?
+            <PROG ((RFONT <GET-FONT .FONT .VS>))
+               <SET WIDTH <* .DEFAULT-WIDTH <FONT-WIDTH .RFONT>>>
+               <COND (<==? .SPEC? 1>
+                      <SET HEIGHT <* .DEFAULT-HEIGHT <FONT-HEIGHT .RFONT>>>)
+                     (T <SET HEIGHT <- <VW-HEIGHT .VW> .TOP <* 2 .BWIDTH>>>)>>)
+           (T
+            <COND (<L? .HEIGHT 0>
+                   <SET TOP <+ .TOP .HEIGHT>>
+                   <SET HEIGHT <- .HEIGHT>>)>
+            <COND (<L? .WIDTH 0>
+                   <SET LEFT <+ .LEFT .WIDTH>>
+                   <SET WIDTH <- .WIDTH>>)>)>
+      <SET VAL
+          <CHANNEL-OPEN VS100
+                        .NAME
+                        .DESC
+                        .HEIGHT
+                        .WIDTH
+                        .LEFT
+                        .TOP
+                        .BWIDTH
+                        .BPATTERN
+                        .BACKGROUND
+                        .FONT
+                        .BUF?
+                        .MIN-HEIGHT
+                        .MIN-WIDTH>>
+      .VAL)>
+    .PARENT
+    !,CROSS-CURSOR>>
+
+<DEFINE UPDATE-SIZE 
+       (VS:VS MY-WIND:FIX MY-FONT:FONT NAME:STRING BWIDTH:FIX WIDTH:FIX
+        HEIGHT:FIX DW:FIX DH:FIX
+        "AUX" (ST <STACK <ISTRING <+ 10 <LENGTH .NAME>>>>)
+              (SS <REST .ST <LENGTH .NAME>>))
+       <SUBSTRUC .NAME 0 <LENGTH .NAME> .ST>
+       <1 .SS !\:>
+       <SET SS <REST .SS>>
+       <SET HEIGHT <ABS .HEIGHT>>
+       <SET WIDTH <ABS .WIDTH>>
+       <SET SS <DUMP-NUMBER .SS <MAX 1 </ <- .HEIGHT <* 2 .BWIDTH>> .DH>>>>
+       <1 .SS !\x>
+       <SET SS <REST .SS>>
+       <DUMP-NUMBER .SS <MAX 1 </ <- .WIDTH <* 2 .BWIDTH>> .DW>>>
+       <VSOP .VS X-CLEAR .MY-WIND>
+       <VSOP .VS
+             X-TEXT
+             ,GX-COPY
+             -1
+             .MY-WIND
+             0
+             0
+             <FONT-ID .MY-FONT>
+             1 0
+             <LENGTH .ST>
+             0 0
+             .ST>>
+
+<DEFINE DUMP-NUMBER (SS:STRING NUM:FIX "AUX" (BASE:FIX 1000)) 
+       <REPEAT ((ANY? <>) DIG)
+               <SET DIG </ .NUM .BASE>>
+               <SET NUM <MOD .NUM .BASE>>
+               <COND (<OR .ANY? <NOT <0? .DIG>>>
+                      <SET ANY? T>
+                      <1 .SS <ASCII <+ .DIG <ASCII !\0>>>>
+                      <SET SS <REST .SS>>)
+                     (T <1 .SS !\ > <SET SS <REST .SS>>)>
+               <COND (<0? <SET BASE </ .BASE 10>>> <RETURN .SS>)>>>
+
+<GDECL (TEMP-VERTS) STRING
+       (DRAW-CHANGED?) <OR ATOM FALSE>
+       (DRAW-ODD?) FIX>
+
+<DEFINE FDRAW (CH:VSCHAN LEFT:FIX TOP:FIX WIDTH:FIX HEIGHT:FIX
+              "AUX" (VW:VSW <CHANNEL-DATA .CH>) (VS:VS <VW-VS100 .VW>)
+              VERTS:STRING)
+   <COND (<NOT <GASSIGNED? TEMP-VERTS>>
+         <SETG TEMP-VERTS <ISTRING 30>>
+         <SETG DRAW-ODD? -1>
+         <SETG DRAW-CHANGED? T>)>
+   <SET VERTS ,TEMP-VERTS>
+   <COND (,DRAW-CHANGED?
+         <COND (<L? .WIDTH 0>
+                <SET LEFT <+ .LEFT .WIDTH>>
+                <SET WIDTH <- .WIDTH>>)>
+         <COND (<L? .HEIGHT 0>
+                <SET TOP <+ .TOP .HEIGHT>>
+                <SET HEIGHT <- .HEIGHT>>)>
+         <PUT-WORD .VERTS 1 .LEFT>
+         <PUT-WORD .VERTS 2 .TOP>
+         <PUT-WORD .VERTS 3 0>
+         <PUT-WORD .VERTS 4 .WIDTH>
+         <PUT-WORD .VERTS 5 0>
+         <PUT-WORD .VERTS 6 ,VERTEX-RELATIVE>
+         <PUT-WORD .VERTS 7 0>
+         <PUT-WORD .VERTS 8 .HEIGHT>
+         <PUT-WORD .VERTS 9 ,VERTEX-RELATIVE>
+         <PUT-WORD .VERTS 10 <- .WIDTH>>
+         <PUT-WORD .VERTS 11 0>
+         <PUT-WORD .VERTS 12 ,VERTEX-RELATIVE>
+         <PUT-WORD .VERTS 13 0>
+         <PUT-WORD .VERTS 14 <- .HEIGHT>>
+         <PUT-WORD .VERTS 15 ,VERTEX-RELATIVE>
+         <SETG DRAW-CHANGED? <>>)>
+       <VSOP .VS X-DRAW ,GX-XOR -1 <VW-ID .VW> 5
+             1 1 1 1 0
+             <LSH *25252525252*
+                  <MOD <LSH <SETG DRAW-ODD? <MOD <+ ,DRAW-ODD? 1> 4>> -1> 2>>
+             16 1
+             .VERTS>>
+
+<DEFINE MOUSE-RESIZE-WINDOW (CH:VSCHAN OPER WHICH:FIX) 
+   <COND (<NOT <CHANNEL-OP .CH ICON?>>
+         <MOUSE-MOVE-WINDOW .CH .OPER .WHICH T>)>>
+
+<DEFINE MOUSE-MOVE-WINDOW (CH:VSCHAN OPER WHICH:FIX
+                          "OPT" (RESIZE? <>)
+                          "AUX" (VW:VSW <CHANNEL-DATA .CH>)
+                                (VS:VS <VW-VS100 .VW>)
+                                (PARENT:VSCHAN <VW-PARENT .VW>) TOP:FIX LEFT:FIX
+                                BOT:FIX RIGHT:FIX
+                                WEVENT:FIX
+                                (HEIGHT:FIX
+                                 <+ <* 2 <VW-BWIDTH .VW>> <VW-HEIGHT .VW> -1>)
+                                (WIDTH
+                                 <+ <* 2 <VW-BWIDTH .VW>> <VW-WIDTH .VW> -1>)
+                                P:<OR FALSE UVECTOR> MX:FIX MY:FIX
+                                PID:FIX OLD (CDIST:FIX <MIN>)
+                                TMP MINW:FIX MINH:FIX FH:FIX FW:FIX
+                                (MOVE-RIGHT? <>) (MOVE-LEFT? <>)
+                                (MOVE-TOP? <>) (MOVE-BOTTOM? <>))
+   <COND (<==? .WHICH ,MOUSE-LEFT> <SET WEVENT ,ME-LEFT-RELEASED>)
+        (<==? .WHICH ,MOUSE-RIGHT> <SET WEVENT ,ME-RIGHT-RELEASED>)
+        (<==? .WHICH ,MOUSE-CENTER> <SET WEVENT ,ME-MIDDLE-RELEASED>)
+        (T <SET WEVENT ,ME-RELEASED-MASK>)>
+   <VW-FLUSH-BUFFER .VW>
+   <COND (<==? .PARENT <VS-TOPCHAN .VS>>
+         <CHANNEL-OP .CH RAISE-WINDOW>)
+        (T
+         <CHANNEL-OP .PARENT RAISE-WINDOW>)>
+   <SET PID <VW-ID <CHANNEL-DATA .PARENT>:VSW>>
+   <SET OLD <CHANNEL-OP .PARENT MOUSE-MOVE? .WHICH>>
+   <COND (<SET P <VSOP .VS X-QUERY-WINDOW <VW-ID .VW>>>
+         <SET LEFT <I-SPAR2 .P>>
+         <SET TOP <I-SPAR3 .P>>)>
+   <SET RIGHT <+ .LEFT .WIDTH>>
+   <SET BOT <+ .TOP .HEIGHT>>
+   <COND (.RESIZE?
+         <COND (<SET P <VSOP .VS X-GET-RESIZE-HINT <VW-ID .VW>>>
+                <SET FH <I-SPAR1 .P>>
+                <SET FW <I-SPAR3 .P>>
+                <SET MINW <MIN <+ 1 <* <VW-BWIDTH .VW> 2>> <I-SPAR2 .P>>>
+                <SET MINH <MIN <+ 1 <* <VW-BWIDTH .VW> 2>> <I-SPAR0 .P>>>)
+               (T
+                <SET FH 1>
+                <SET FW 1>
+                <SET MINW <+ 1 <* 2 <VW-BWIDTH .VW>>>>
+                <SET MINH .MINW>)>)>
+   <GRAB-MOUSE-AND-DO
+    <COND
+     (<SET P <VSOP .VS X-QUERY-MOUSE .PID>>
+      <SET MX <I-SPAR2 .P:UVECTOR>>
+      <SET MY <I-SPAR3 .P:UVECTOR>>
+      <COND (.RESIZE?
+            <BIND ((FT <* <+ .TOP <VW-BWIDTH .VW>> 3>)
+                   (FL <* <+ .LEFT <VW-BWIDTH .VW>> 3>)
+                   (FW <* .WIDTH 3>)
+                   (FH <* .HEIGHT 3>)
+                   (FMX <* .MX 3>)
+                   (FMY <* .MY 3>))
+               <COND (<L? .FMY <+ .FT .HEIGHT>>
+                      <SET MOVE-TOP? T>)
+                     (<G? .FMY <+ .FT <* 2 .HEIGHT>>>
+                      <SET MOVE-BOTTOM? T>)>
+               <COND (<L? .FMX <+ .FL .WIDTH>>
+                      <SET MOVE-LEFT? T>)
+                     (<G? .FMX <+ .FL <* 2 .WIDTH>>>
+                      <SET MOVE-RIGHT? T>)>
+               <COND (<AND <NOT .MOVE-TOP?> <NOT .MOVE-BOTTOM?>
+                           <NOT .MOVE-LEFT?> <NOT .MOVE-RIGHT?>>
+                      <COND (<L? <- .FMY .FT> <- <+ .FT .FH> .FMY>>
+                             <SET MOVE-TOP? T>)
+                            (T
+                             <SET MOVE-BOTTOM? T>)>
+                      <COND (<L? <- .FMX .FL> <- <+ .FL .FW> .FMX>>
+                             <SET MOVE-LEFT? T>)
+                            (T
+                             <SET MOVE-RIGHT? T>)>)>>)>
+      <SETG DRAW-CHANGED? T>
+      <SETG DRAW-ODD? -1>
+      <REPEAT (E DX:FIX DY:FIX (DRAW? T) (FLUSH? <>)
+              (FH:FIX <CHANNEL-OP <VS-CHANNEL .VS> FILE-HANDLE>)
+              (TV <STACK <UVECTOR 0 15000>>) (MXD:FIX <+ .FH 1>) 
+              (VV <STACK <IUVECTOR 1>>) (RD:FIX <LSH 1 .FH>) 
+              CT:<OR FIX FALSE>)
+        <COND (.DRAW?
+               <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+               <SET DRAW? <>>
+               <CHANNEL-OP .PARENT BUFOUT>)>
+        <COND
+         (<OR <NOT <SET CT <CALL SYSCALL SELECT .MXD <1 .VV .RD> 0 0 .TV>>>
+              <0? .CT>>
+          <SET E <>>
+          <SET DRAW? T>
+          <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+          <CHANNEL-OP .PARENT BUFOUT>
+          <CALL SYSCALL SELECT 0 0 0 0 .TV>)
+         (<TYPE? <SET E <GET-EVENT .VS <>>> MOUSE-EVENT>
+          <COND
+           (<OR <NOT <0? <ANDB <ME-KIND .E> .WEVENT>>>
+                <SET FLUSH? <NOT <0? <ANDB <ME-KIND .E> ,ME-PRESSED-MASK>>>>>
+            <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+            <CHANNEL-OP .PARENT BUFOUT>
+            <CHANNEL-OP .PARENT MOUSE-MOVE? .OLD>
+            <CHANNEL-OP .CH BUFOUT>
+            <COND (.FLUSH?)
+                  (.RESIZE?
+                   <SET HEIGHT <- .HEIGHT -1 <* 2 <VW-BWIDTH .VW>>>>
+                   <SET WIDTH <- .WIDTH -1 <* 2 <VW-BWIDTH .VW>>>>
+                   <VW-HEIGHT .VW .HEIGHT>
+                   <VW-WIDTH .VW .WIDTH>
+                   <COND (<VW-SCALE .VW>
+                          <CHANNEL-OP .CH DRAW-LEFT <S-LEFT <VW-SCALE .VW>>>)>
+                   <VW-OUTMODE .VW <ORB <VW-OUTMODE .VW> ,VWM-UNSEEN>>
+                   <VSOP .VS
+                         X-CONFIGURE-WINDOW
+                         <VW-ID .VW>
+                         .HEIGHT
+                         .WIDTH
+                         .LEFT
+                         .TOP>)
+                  (T
+                   <VSOP .VS X-MOVE-WINDOW <VW-ID .VW> .LEFT .TOP>)>
+            <RECYCLE-EVENTS .E>
+            <RETURN <NOT .FLUSH?>>)
+           (<==? <ME-KIND .E> ,ME-MOVED>
+            <FDRAW .PARENT .LEFT .TOP .WIDTH .HEIGHT>
+            <CHANNEL-OP .PARENT BUFOUT>
+            <SETG DRAW-CHANGED? T>
+            <SET DRAW? T>
+            <SET DX <- <ME-X .E> .MX>>
+            <SET DY <- <ME-Y .E> .MY>>
+            <SET MX <ME-X .E>>
+            <SET MY <ME-Y .E>>
+            <COND (.RESIZE?
+                   <COND (.MOVE-LEFT?
+                          <COND (<L? <- .RIGHT .MX> .MINW>
+                                 <SET LEFT <- .RIGHT .MINW>>)
+                                (T
+                                 <SET LEFT .MX>)>)
+                         (.MOVE-RIGHT?
+                          <COND (<L? <- .MX .LEFT> .MINW>
+                                 <SET RIGHT <+ .LEFT .MINW>>)
+                                (T
+                                 <SET RIGHT .MX>)>)>
+                   <COND (.MOVE-TOP?
+                          <COND (<L? <- .BOT .MY> .MINH>
+                                 <SET TOP <- .BOT .MINH>>)
+                                (T
+                                 <SET TOP .MY>)>)
+                         (.MOVE-BOTTOM?
+                          <COND (<L? <- .MY .TOP> .MINH>
+                                 <SET BOT <+ .TOP .MINH>>)
+                                (T
+                                 <SET BOT .MY>)>)>
+                   <SET WIDTH <- .RIGHT .LEFT>>
+                   <SET HEIGHT <- .BOT .TOP>>
+                   <COND (<NOT <0? <MOD <SET TMP <- .WIDTH .MINW>> .FW>>>
+                          <SET WIDTH <+ .MINW
+                                        <* .FW
+                                           </ <FIX <+ .TMP </ .FW 2.0>>>
+                                              .FW>>>>
+                          <COND (.MOVE-LEFT?
+                                 <SET LEFT <- .RIGHT .WIDTH>>)
+                                (.MOVE-RIGHT?
+                                 <SET RIGHT <+ .LEFT .WIDTH>>)>)>
+                   <COND (<NOT <0? <MOD <SET TMP <- .HEIGHT .MINH>> .FH>>>
+                          <SET HEIGHT <+ .MINH
+                                         <* .FH
+                                            </ <FIX <+ .TMP </ .FH 2.0>>>
+                                               .FH>>>>
+                          <COND (.MOVE-TOP?
+                                 <SET TOP <- .BOT .HEIGHT>>)
+                                (.MOVE-BOTTOM?
+                                 <SET BOT <+ .TOP .HEIGHT>>)>)>)
+                  (T <SET LEFT <+ .DX .LEFT>> <SET TOP <+ .DY .TOP>>)>)>)>
+        <RECYCLE-EVENTS .E>>)>
+    .PARENT
+    !,CROSS-CURSOR>>
+
+<DEFINE PAGE-LOC (CHN:VSCHAN OPER
+                 "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (VS:VS <VW-VS100 .VW>) P)
+       <COND (<SET P <VSOP .VS X-QUERY-WINDOW <VW-ID .VW>>>
+              <COND (<==? .OPER PAGE-TOP> <I-SPAR3 .P>) (T <I-SPAR2 .P>)>)>>
+
+<DEFINE VS-PAGE-HEIGHT (CHN:VSCHAN OPER
+                       "OPT" NEW:FIX
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>) OLD
+                             (CFONT <VW-CFONT .VW>))
+       <SET OLD </ <VW-HEIGHT .VW> <FONT-HEIGHT .CFONT>>>
+       <COND (<ASSIGNED? NEW>
+              <SET NEW <* <FONT-HEIGHT .CFONT> .NEW>>
+              <COND (<L=? .NEW 0>)
+                    (T <CHANNEL-OP .CHN RESIZE .NEW <VW-WIDTH .VW>>)>)>
+       .OLD>
+
+<DEFINE VS-PAGE-WIDTH (CHN:VSCHAN OPER
+                      "OPT" NEW:FIX
+                      "AUX" (VW:VSW <CHANNEL-DATA .CHN>) OLD
+                            (CFONT <VW-CFONT .VW>))
+       <SET OLD </ <VW-WIDTH .VW> <FONT-WIDTH .CFONT>>>
+       <COND (<ASSIGNED? NEW>
+              <SET NEW <* <FONT-WIDTH .CFONT> .NEW>>
+              <COND (<L=? .NEW 0>)
+                    (T <CHANNEL-OP .CHN RESIZE <VW-HEIGHT .VW> .NEW>)>)>
+       .OLD>
+
+<DEFINE VS-PAGE-WIDTH-ABS (CHN:VSCHAN OPER
+                          "OPT" NEW:FIX
+                          "AUX" (VW:VSW <CHANNEL-DATA .CHN>) OLD)
+       <SET OLD <VW-WIDTH .VW>>
+       <COND (<ASSIGNED? NEW> <CHANNEL-OP .CHN RESIZE <VW-HEIGHT .VW> .NEW>)>
+       .OLD>
+
+<DEFINE VS-PAGE-HEIGHT-ABS (CHN:VSCHAN OPER
+                           "OPT" NEW:FIX
+                           "AUX" (VW:VSW <CHANNEL-DATA .CHN>) OLD)
+       <SET OLD <VW-HEIGHT .VW>>
+       <COND (<ASSIGNED? NEW> <CHANNEL-OP .CHN RESIZE .NEW <VW-WIDTH .VW>>)>
+       .OLD>
+
+<DEFINE VS-RESIZE (CHN:VSCHAN OPER HEIGHT:<OR FIX FALSE> WIDTH:<OR FIX FALSE>
+                  "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (VS:VS <VW-VS100 .VW>))
+       <VW-FLUSH-BUFFER .VW>
+       <COND (.HEIGHT <VW-HEIGHT .VW .HEIGHT>)
+             (T <SET HEIGHT <VW-HEIGHT .VW>>)>
+       <COND (.WIDTH <VW-WIDTH .VW .WIDTH>) (T <SET WIDTH <VW-WIDTH .VW>>)>
+       <COND (<VW-SCALE .VW>
+              <CHANNEL-OP .CHN DRAW-LEFT <S-LEFT <VW-SCALE .VW>>>)>
+       <VSOP .VS X-CHANGE-WINDOW <VW-ID .VW> .HEIGHT .WIDTH>
+       <VW-OUTMODE .VW <ORB <VW-OUTMODE .VW> ,VWM-UNSEEN>>
+       .CHN>
+
+<DEFINE VS-MOVE-WINDOW (CHN:VSCHAN OPER LEFT:FIX TOP:FIX
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                             (VS:VS <VW-VS100 .VW>))
+       <VW-FLUSH-BUFFER .VW>
+       <VSOP .VS X-MOVE-WINDOW <VW-ID .VW> .LEFT .TOP>>
+
+<DEFINE SET-RESIZE-HINT (CHN:VSCHAN OPER "OPT" (MIN-HEIGHT:FIX -1)
+                        (HINCR:FIX -1) (MIN-WIDTH:FIX -1) (WINCR:FIX -1)
+                        "AUX" (VW:VSW <CHANNEL-DATA .CHN>) (VS:VS <VW-VS100 .VW>)
+                        P)
+   <COND (<SET P <VSOP .VS X-GET-RESIZE-HINT <VW-ID .VW>>>
+         <COND (<L? .MIN-HEIGHT 0> <SET MIN-HEIGHT <I-SPAR0 .P>>)>
+         <COND (<L? .HINCR 0> <SET HINCR <I-SPAR1 .P>>)>
+         <COND (<L? .MIN-WIDTH 0> <SET MIN-WIDTH <I-SPAR2 .P>>)>
+         <COND (<L? .WINCR 0> <SET WINCR <I-SPAR3 .P>>)>)>
+   <VSOP .VS X-SET-RESIZE-HINT <VW-ID .VW> .MIN-HEIGHT .HINCR .MIN-WIDTH .WINCR>>
+
+<DEFINE VS-WINDOW-NAME (CHN:VSCHAN OPER
+                       "OPT" NAME:STRING
+                       "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                             (VS:VS <VW-VS100 .VW>) TS)
+       <COND (<ASSIGNED? NAME>
+              <VSOP .VS X-STORE-NAME <VW-ID .VW> <LENGTH .NAME> .NAME>
+              .NAME)
+             (<SET TS <VSOP .VS X-FETCH-NAME <VW-ID .VW>>>
+              <STRING .TS>)>>
+
+<DEFINE VS-CUT-BUFFER (CHN:VSCHAN OPER
+                      "OPT" STUFF:STRING (ID:FIX 0)
+                      "AUX" (VW:VSW <CHANNEL-DATA .CHN>)
+                            (VS:VS <VW-VS100 .VW>) TS)
+       <COND (<ASSIGNED? STUFF>
+              <VSOP .VS X-STORE-BYTES .ID 0 <LENGTH .STUFF> .STUFF>
+              .STUFF)
+             (<SET TS <VSOP .VS X-FETCH-BYTES .ID 0>>
+              <STRING .TS>)>>
+
+<DEFINE GET-FONT (NAME:STRING VS:VS) 
+       <REPEAT ((L:<LIST [REST FIX FONT]> <VS-FONTS .VS>))
+               <COND (<NOT <EMPTY? .L>>
+                      <COND (<=? .NAME <FONT-NAME <2 .L>>> <RETURN <2 .L>>)>
+                      <SET L <REST .L 2>>)
+                     (T <RETURN <LOAD-FONT .NAME .VS>>)>>>
+
+<DEFINE LOAD-FONT LF (NAME:STRING VS:VS
+                     "AUX" (NS <STANDARD-NAME .NAME>) F P FS:FONT FIRST LAST
+                     ST)
+   <SUBSTRUC .NS 0 <- <LENGTH .NS> 1> <REST .NS>>
+   <COND
+    (<SET F <VSOP .VS X-GET-FONT 0 <- <LENGTH .NS> 1> <REST .NS>>>
+     <SET FS <CHTYPE [.NAME .F 0 0 0 <> 0 <>] FONT>>
+     <COND
+      (<SET P <VSOP .VS X-QUERY-FONT 0 .F>>
+       <FONT-HEIGHT .FS <I-SPAR0 .P>>
+       <FONT-WIDTH .FS <I-SPAR1 .P>>
+       <FONT-BASE .FS <I-SPAR4 .P>>
+       <COND
+       (<NOT <0? <I-SPAR5 .P>>> <FONT-FIXED? .FS T>)
+       (T
+        <SET FIRST <I-SPAR2 .P>>
+        <SET LAST <I-SPAR3 .P>>
+        <COND
+         (<SET ST <VSOP .VS X-CHAR-WIDTHS 0 .F 2 "W1">>
+          <COND (<AND <==? <1 .ST> <3 .ST>>
+                      <==? <2 .ST> <4 .ST>>>
+                 <FONT-WIDTH .FS <I-SPAR2 .P>>
+                 <FONT-FIXED? .FS T>)
+                (T
+                 <COND
+                  (<SET ST <VSOP .VS X-FONT-WIDTHS 0 .F>>
+                   <REPEAT ((C .FIRST)
+                            (UV:<UVECTOR [REST FIX]>
+                             <IUVECTOR <+ 1 <- .LAST .FIRST>>>))
+                      <COND (<EMPTY? .ST>
+                             <FONT-CHARS .FS .UV>
+                             <RETURN>)>
+                      <PUT .UV <+ 1 <- .C .FIRST>>
+                           <+ <ASCII <1 .ST>>
+                              <LSH <ASCII <2 .ST>> 8>>>
+                      <SET C <+ .C 1>>
+                      <SET ST <REST .ST 2>>>)>)>
+          <FONT-FIRST .FS .FIRST>)
+         (T <RETURN .P .LF>)>)>
+       <VS-FONTS .VS (.F .FS !<VS-FONTS .VS>)>
+       .FS)>)>>
+
+<DEFINE CHAR-WIDTH (CHAR:CHARACTER FONT:FONT "AUX" FF:FIX) 
+       <COND (<FONT-FIXED? .FONT> <FONT-WIDTH .FONT>)
+             (<OR <L? <ASCII .CHAR> <SET FF <FONT-FIRST .FONT>>>
+                  <G=? <ASCII .CHAR>
+                       <+ .FF <LENGTH <FONT-CHARS .FONT>:UVECTOR>>>>
+              0)
+             (T
+              <NTH <FONT-CHARS .FONT>:UVECTOR <+ <- <ASCII .CHAR> .FF> 1>>)>>
+
+<DEFINE STRING-WIDTH (STR:STRING FONT:FONT VS:VS) 
+       <VSOP .VS X-STRING-WIDTH 0 <FONT-ID .FONT> <LENGTH .STR> .STR>>
+
+<DEFINE VS-LINE-HEIGHT (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+       <FONT-HEIGHT <VW-CFONT .VW>>>
+
+<DEFINE VS-CHAR-WIDTH (CHN:VSCHAN OPER "AUX" (VW:VSW <CHANNEL-DATA .CHN>)) 
+       <FONT-WIDTH <VW-CFONT .VW>>>
+
+<ENDPACKAGE>