( WINDOW IMPLEMENTATION  21/9/89
                         24/12/89 )

: COND-LOAD
   -FIND
   0= IF ( NOT LOADED )
      FLOAD
   ELSE
      2DROP
      BL WORD
   THEN
   ;

FORTH DEFINITIONS
COND-LOAD OS OSDEFS
VOCABULARY WIN_MAN IMMEDIATE
WIN_MAN DEFINITIONS DECIMAL

: W_HANDLE ;
: W_XPOS 4 + ;
: W_YPOS 8 + ;
: W_OLDXPOS 12 + ;
: W_OLDYPOS 16 + ;
: W_TYPEX 20 + ;
: W_TYPEY 24 + ;
: W_WIDTH 28 + ;
: W_HEIGHT 32 + ;
: W_WAEX_MAXX 36 + ;
: W_WAEX_MINY 40 + ;
: W_DIDSCROLL 44 + ;
: W_PRINTSPACE 48 + ;
: W_TYPESCROLLED 52 + ;
: W_CREATE 56 + ;
: W_ROWPTRS 144 + ;

144 CONSTANT W_DYN_AREA

0 VARIABLE W_BUF 256 ALLOT

: LS! ( ADDR / OFFSET / VALUE ... ADDR )
     SWAP 3 PICK + ! ;
: LSC! ( ADDR / OFFSET / VALUE ... ADDR )
     SWAP 3 PICK + C! ;

: L! ( VALUE / ADDR / OFFSET ... ADDR )
     OVER >R + ! R> ;
: LC! ( VALUE / ADDR / OFFSET ... ADDR )
     OVER >R + C! R> ;

: PARAM_START LATEST PFA 12 + ;

HEX
83 CONSTANT WIN_FLAGS
139 CONSTANT TIT_BAR_FLAGS
DECIMAL

32 CONSTANT PIX_CHAR_HGHT
PIX_CHAR_HGHT NEGATE CONSTANT NEG_PIX_CHAR_HGHT
16 CONSTANT PIX_CHAR_WDTH
PIX_CHAR_WDTH NEGATE CONSTANT NEG_PIX_CHAR_WDTH

: PR_WIN
      CR
      DUP
      W_CREATE
      ." VIS MIN X " DUP @ . CR
      ." VIS MIN Y " DUP 4 + @ . CR
      ." VIS MAX X " DUP 8 + @ . CR
      ." VIS MAX Y " DUP 12 + @ . CR
      ." SCROLL X " DUP 16 + @ . CR
      ." SCROLL Y " DUP 20 + @ . CR
      ." WINDOW BEHIND " DUP 24 + @ . CR
      ." FLAGS/STATUS " DUP 28 + @ . CR
      ." TITLE FOREGROUND " DUP 32 + C@ . CR
      ." TITLE BACKGROUND " DUP 33 + C@ . CR
      ." WA FOREGROUND " DUP 34 + C@ . CR
      ." WA BACKGROUND " DUP 35 + C@ . CR
      ." SCROLL OUTER COLOUR " DUP 36 + C@ . CR
      ." SCROLL INNER COLOUR " DUP 37 + C@ . CR
      ." HIGHLIGHTED TITLE " DUP 38 + C@ . CR
      ." RESVD " DUP 39 + C@ . CR
      ." WA EX MIN X " DUP 40 + @ . CR
      ." WA EX MIN Y " DUP 44 + @ . CR
      ." WA EX MAX X " DUP 48 + @ . CR
      ." WA EX MAX Y " DUP 52 + @ . CR
      ." TITLE BAR ICON FLAGS " DUP 56 + @ . CR
      ." BUTTON TYPE " DUP 60 + @ . CR
      ." SPRITE AREA CTRL BLOCK " DUP 64 + @ . CR
      ." RESVD " DUP 68 + @ . CR
      ." TITLE POINTER " DUP 72 + @ . CR
      ." TITLE VALIDATION " DUP 76 + @ . CR
      ." TITLE LENGTH " DUP 80 + @ . CR
      ." NUMBER ICONS " 84 + @ . CR
      ." HANDLE " DUP W_HANDLE @ . CR
      ." X POS " DUP W_XPOS @ . CR
      ." Y POS " DUP W_YPOS @ . CR
      ." OLD X POS " DUP W_OLDXPOS @ . CR
      ." OLD Y POS " DUP W_OLDYPOS @ . CR
      ." TYPE X " DUP W_TYPEX @ . CR
      ." TYPE Y " DUP W_TYPEY @ . CR
      ." WIDTH " DUP W_WIDTH @ . CR
      ." HEIGHT " W_HEIGHT @ . CR
      ;

: WIN <BUILDS
      PARAM_START W_CREATE
            16 0 LS! ( SCROLL X )
            20 0 LS! ( SCROLL Y )
            24 -1 LS! ( ON TOP )
            28 WIN_FLAGS LS! ( FLAGS / STATUS )
            36 0 LSC! ( SCROLL OUTER COLOUR )
            37 0 LSC! ( SCROLL INNER COLOUR )
            39 0 LSC! ( RESVD )
            40 0 LS! ( WA EX MIN X )
            52 0 LS! ( WA EX MAX Y )
            56 TIT_BAR_FLAGS LS!
            64 0 LS! ( SPRITE AREA CTRL BLK )
            68 0 LS! ( RESVD )
            76 -1 LS! ( TITLE STRING VALIDATION )
            84 0 LS! ( NUM ICONS )

            80 L! ( TITLE STRING LENGTH )
            72 L! ( TITLE STRING PTR )
            60 L! ( BUTTON TYPE )
            38 LC! ( BACKGROUND HIGHLIGHTED )
            35 LC! ( WORK AREA BACKGROUND )
            34 LC! ( WORK AREA FOREGROUND )
            33 LC! ( TITLE BACKGROUND )
            32 LC! ( TITLE FOREGROUND )
            DROP ( ADDRESS )

            DUP ( BOTTOM LEFT Y )
            PARAM_START W_CREATE 4 L! DROP ( VIS MIN Y )
            3 PICK ( CHAR HEIGHT )
            PIX_CHAR_HGHT *
            DUP ( HEIGHT IN PIXELS )
            NEGATE
            DUP  ( WDTH / HGHT / BLX / BLY / PIXHGHT / -PIXHGHT / -PIXHGHT )
            PARAM_START W_WAEX_MINY !
            PARAM_START W_CREATE 44 L! DROP ( WA EX MIN Y )

            ( WDTH / HGHT / BLX / BLY / PIXHGHT )

            + PARAM_START W_CREATE 12 L! DROP ( VIS MAX Y )
            DUP ( BOTTOM LEFT X )
            PARAM_START W_CREATE ! ( VIS MIN X )
            3 PICK ( CHAR WIDTH )
            PIX_CHAR_WDTH *
            DUP ( WIDTH IN PIXELS )
            DUP
            PARAM_START W_WAEX_MAXX !
            PARAM_START W_CREATE 48 L! DROP ( WA EX MAX X )
            + PARAM_START W_CREATE 8 L! DROP ( VIS MAX X )

            ( STACK = X / Y )

            DUP 2 << W_DYN_AREA + ALLOT ( ALLOCATE SPACE FOR DYNAMIC DATA )
            2DUP ( X / Y / X / Y )
            0 DO
               HERE OVER ( X / Y / X / HERE / X )
               I * + ( ROW ADDRESS )
               PARAM_START W_DYN_AREA + ( FIRST ROW PTR )
               I 2 << + ! ( ROW ADDR INTO ROW PTR )
            LOOP
            DROP ( X )
            2DUP
            PARAM_START W_HEIGHT !
            PARAM_START W_WIDTH !
            * HERE SWAP DUP ALLOT ( SPACE FOR WINDOW TEXT )
            ERASE
            0 PARAM_START
            2DUP W_XPOS !
            2DUP W_YPOS !
            2DUP W_OLDXPOS !
            2DUP W_OLDYPOS !
            2DUP W_TYPEX !
                 W_TYPEY !

            DOES>
            ;

-1 VARIABLE WIN_OP_STR
-1 VARIABLE WIN_IP_STR

: SET_WIN_OP WIN_OP_STR ! ;
: SET_WIN_IP WIN_IP_STR ! ;

: WIN_OP WIN_OP_STR @ ;
: WIN_IP WIN_IP_STR @ ;

: WIN_HANDLE WIN_OP W_HANDLE ;
: WIN_XPOS WIN_OP W_XPOS ;
: WIN_YPOS WIN_OP W_YPOS ;
: WIN_OLDXPOS WIN_OP W_OLDXPOS ;
: WIN_OLDYPOS WIN_OP W_OLDYPOS ;
: WIN_TYPEX WIN_OP W_TYPEX ;
: WIN_TYPEY WIN_OP W_TYPEY ;
: WIN_WIDTH WIN_OP W_WIDTH ;
: WIN_HEIGHT WIN_OP W_HEIGHT ;
: WIN_WAEX_MAXX WIN_OP W_WAEX_MAXX ;
: WIN_WAEX_MINY WIN_OP W_WAEX_MINY ;
: WIN_DIDSCROLL WIN_OP W_DIDSCROLL ;
: WIN_PRINTSPACE WIN_OP W_PRINTSPACE ;
: WIN_TYPESCROLLED WIN_OP W_TYPESCROLLED ;
: WIN_ROWPTRS WIN_OP W_ROWPTRS ;

8 CONSTANT MAX_WINDOWS

0 VARIABLE WIN_HANDLE_LIST MAX_WINDOWS 4 << ALLOT
0 VARIABLE NUM_WINDOWS

: ADD_HANDLE ( PARAM AREA / NEW HANDLE ... )
      WIN_HANDLE_LIST NUM_WINDOWS @ 4 << + DUP >R ! ( STORE HANDLE AT ADDR )
      R> 4 + ! ( STORE PARAM AREA AT ADDR + 4 )
      1 NUM_WINDOWS +!
      ;

: FIND_PARAM_AREA ( HANDLE ... PARAM AREA [ -1 ON FAILURE ] )
      -1 SWAP
      NUM_WINDOWS @ 0 DO
         DUP ( HANDLE TO FIND )
         WIN_HANDLE_LIST I 4 << + DUP >R @ ( LIST HANDLE )
         = IF ( HANDLES MATCH )
            2DROP R> 4 + @ ( GET PARAM AREA )
            0 LEAVE ( ZERO IS DUMMY BECAUSE DROP NEEDED AFTER LOOP )
         ELSE
            R> DROP
         THEN
      LOOP
      DROP
      ;

-1 VARIABLE SAVE_WIN_OP

: SET_TEMP_OP ( HANDLE )
      WIN_OP SAVE_WIN_OP !
      FIND_PARAM_AREA ( FAILURES SHOULD NOT OCCUR !!! )
      DUP -1 = IF
         ." BAD HANDLE "
      THEN
      SET_WIN_OP
      ;

: RESTORE_OP
      SAVE_WIN_OP @ SET_WIN_OP
      ;

: WIN_CREATE
      DUP
      W_CREATE
      Wimp CreateWindow
      2DUP ADD_HANDLE
      SWAP W_HANDLE !
      ;

: WIN_OPEN
      DUP W_HANDLE @ W_BUF !
      DUP W_CREATE @ W_BUF 4 + !
      DUP W_CREATE 4 + @ W_BUF 8 + !
      DUP W_CREATE 8 + @ W_BUF 12 + !
          W_CREATE 12 + @ W_BUF 16 + !
      0 W_BUF 20 + !
      0 W_BUF 24 + !
      -1 W_BUF 28 + !
      W_BUF Wimp OpenWindow
      ;

: WIN_CLOSE
      W_HANDLE @ W_BUF !
      W_BUF Wimp CloseWindow
      ;

: WIN_DELETE
      W_HANDLE
      Wimp DeleteWindow
      ;

: WIN_SET_CARET_POS ( HANDLE )
      -1
      WIN_XPOS @ 1 + PIX_CHAR_WDTH * 12 -
      WIN_YPOS @ 1 + PIX_CHAR_HGHT * NEGATE
      32
      0
      Wimp SetCaretPosition
      ;

: WIN_MOVE ( X / Y )
      4 ROT ROT OS Plot
      ;

: WIN_ORIGIN ( X / Y )
      29 OS WriteC
      SWAP
      DUP
      OS WriteC
      8 >>
      OS WriteC
      DUP
      OS WriteC
      8 >>
      OS WriteC
      ;

: WIN_OUTPUT_LINE ( XOFFSET / ROW )
      2 << WIN_ROWPTRS + @ ( XOFFSET / ROW ADDR )
      SWAP
      BEGIN
         2DUP + ( ROW ADDR / XOFFSET / CHAR ADDR )
         C@ DUP IF ( NON ZERO CHAR )
            OS WriteC
            1 + ( ROW ADDR / XOFFSET + 1 )
            DUP
            WIN_WIDTH @ =
         ELSE
            DROP 1
         THEN
      UNTIL
      2DROP
      ;

: WIN_PRINT_TEXT ( BUFFER ADDR ... )
      >R R 28 + @
      R 4 + @
      - PIX_CHAR_WDTH / ( [GX0 - X0] / PIX_WDTH )
      R 16 + @
      R 40 + @
      - PIX_CHAR_HGHT / ( [Y1 - GY1] / PIX_HGHT )
      R 40 + @
      R 32 + @
      - PIX_CHAR_HGHT / 2 + ( NO. OF LINES TO PRINT )
      R 28 + @ ( GX0 )
      R 4 + @ PIX_CHAR_WDTH - ( X0 - PIX_WDTH )
      BEGIN
         PIX_CHAR_WDTH + 2DUP
         < ( IS GX0 < X0 )
      UNTIL
      SWAP DROP PIX_CHAR_WDTH - ( XSTART / YSTART / LINES / ORIGX )
      R 40 + @ ( GY1 )
      R> 16 + @ PIX_CHAR_HGHT + ( Y1 + PIX_HGHT )
      BEGIN
         PIX_CHAR_HGHT - 2DUP
         > ( IS GY1 > Y1 )
      UNTIL
      SWAP DROP PIX_CHAR_HGHT + 4 -
      ( XSTART / YSTART / LINES / ORIGX / ORIGY )
      WIN_ORIGIN
      0 SWAP ( XSTART / YSTART / GRAPHY / LINES )
      BEGIN
         DUP
      WHILE ( LINES != 0 )
         0 3 PICK WIN_MOVE ( XSTART / YSTART / GRAPHY / LINES )
         ROT DUP WIN_HEIGHT @ < IF ( XSTART / GRAPHY / LINES / YSTART )
            DUP 5 PICK SWAP
            ( XSTART / GRAPHY / LINES / YSTART / XSTART / YSTART )
            WIN_OUTPUT_LINE
         THEN
         1 + ROT PIX_CHAR_HGHT -
         ( XSTART / LINES / YSTART + 1 / GRAPHY - PIX_HGHT )
         ROT 1 -
         ( XSTART / YSTART + 1 / GRAPHY - PIX_HGHT / LINES - 1 )
      REPEAT
      2DROP 2DROP
      0 0 WIN_ORIGIN
      ;

: WIN_UPDATE_WINDOW ( REDRAW BUF ADDR )
      DUP
      Wimp UpdateWindow
      IF
         BEGIN
            WIN_PRINTSPACE @ IF
               16 OS WriteC
            ELSE
               DUP
               WIN_PRINT_TEXT
            THEN
            DUP
            Wimp GetRectangle
            0=
         UNTIL
      THEN
      DROP
      ;

: WIN_DRAW_NEW_CHAR
      W_BUF 0 WIN_HANDLE @ LS!
            16 ROT PIX_CHAR_HGHT * NEGATE DUP >R LS!
            8 R> PIX_CHAR_HGHT - LS!
            4 ROT PIX_CHAR_WDTH * DUP >R LS!
            12 R> PIX_CHAR_WDTH + LS!
      WIN_UPDATE_WINDOW
      ;

: WIN_CLEAR_LINE ( LINE NUMBER [ FROM 0 ]... )
      2 << WIN_ROWPTRS + @ ( ADDR OF START OF LINE )
      WIN_WIDTH @ 0 DO
         DUP 0 SWAP C!
         1 +
      LOOP
      DROP
      ;

: WIN_SHIFT_ROW_POINTERS
      WIN_ROWPTRS DUP @ SWAP ( SAVE 1ST LINE POINTER )
      WIN_HEIGHT @ 1 - 0 DO
         DUP I 2 << + ( OLD [WRP0] / WRP0 / WRP0 + I*4 )
         DUP 4 + ( OLD [WRP0] / WRP0 / WRP0 + I*4 / WRP0 + I*4 + 4 )
         @ SWAP ! ( OLD [WRP0] / WRP0 )
      LOOP
      WIN_HEIGHT @ 1 - 2 << + ! ( UPDATE LAST POINTER )
      ;

: WIN_REDRAW_WINDOW ( BUFFER ADDR )
                    ( ASSUMES BUFFER HAS HANDLE IN FIRST WORD )
      DUP
      Wimp RedrawWindow
      IF
         BEGIN
            DUP
            WIN_PRINT_TEXT
            DUP
            Wimp GetRectangle
            0=
         UNTIL
      THEN
      DROP
      ;

: WIN_RFSH_WINDOW
      BEGIN
         0 W_BUF Wimp Poll
         DUP 1 = IF
            W_BUF WIN_REDRAW_WINDOW
         THEN
         0=
      UNTIL
      ;
      

: WIN_SAME_LINE ( TYPEX / XPOS / YPOS )
      W_BUF 0 WIN_HANDLE @ LS!
      SWAP PIX_CHAR_HGHT * NEGATE DUP >R 16 SWAP LS!
      8 R> PIX_CHAR_HGHT - LS!
      SWAP PIX_CHAR_WDTH * 12 SWAP LS!
      SWAP 4 SWAP LS!
      0 WIN_PRINTSPACE !
      WIN_UPDATE_WINDOW
      ;

: WIN_TYPE_PRINT_SCROLLED ( XPOS / YPOS )
      0 ROT ROT
      WIN_SAME_LINE
      ;

: WIN_LINE_SPLIT ( TYPEY / YPOS )
      W_BUF 0 WIN_HANDLE @ LS!
      4 0 LS!
      12 WIN_WIDTH @ PIX_CHAR_WDTH * LS!
      SWAP PIX_CHAR_HGHT * NEGATE PIX_CHAR_HGHT - 8 SWAP LS!
      SWAP PIX_CHAR_HGHT * NEGATE 16 SWAP LS!
      0 WIN_PRINTSPACE !
      WIN_UPDATE_WINDOW
      ;

: WIN_UPDATE_LAST_LINE
      WIN_TYPEX @
      WIN_WIDTH @
      WIN_HEIGHT 1 -
      WIN_SAME_LINE
      ;

: WIN_REDRAW_ALL_WINDOW
      WIN_HANDLE @ ( DUP -1 0 0 0 0 Wimp SetCaretPosition )
      0 WIN_WAEX_MINY @ WIN_WAEX_MAXX @ NEG_PIX_CHAR_HGHT 0
      4 PICK PIX_CHAR_HGHT +
      Wimp BlockCopy
      W_BUF 0 WIN_HANDLE @ LS!
            4 0 LS!
            8 WIN_WAEX_MINY @ DUP >R LS!
            16 R> PIX_CHAR_HGHT + LS!
            12 WIN_WAEX_MAXX @ LS!
      Wimp UpdateWindow
      IF
         BEGIN
            16 OS WriteC ( CLEAR GRAPHICS WINDOW )
            W_BUF Wimp GetRectangle
            0=
         UNTIL
      THEN
      WIN_RFSH_WINDOW
      ;

: WIN_UPDATE_CURSOR_NEW_LINE
      WIN_YPOS @ DUP WIN_OLDYPOS !
      DUP 1 + DUP WIN_YPOS !
      WIN_HEIGHT @ - IF ( IS YPOS != HEIGHT )
         DROP ( PREVIOUS YPOS )
         EXIT
      THEN
      WIN_YPOS !
      WIN_TYPEX @ 0< IF
         ( NOTHING )
      ELSE ( >= 0 )
         WIN_UPDATE_LAST_LINE
      THEN
      0 WIN_CLEAR_LINE
      WIN_SHIFT_ROW_POINTERS
      WIN_REDRAW_ALL_WINDOW
      1 WIN_DIDSCROLL !
      ;

: WIN_UPDATE_CURSOR
      0 WIN_DIDSCROLL !
      WIN_XPOS @ DUP WIN_OLDXPOS !
      1 + DUP WIN_XPOS !
      WIN_WIDTH @ - IF ( IS XPOS != WIDTH )
         EXIT
      THEN
      0 WIN_XPOS !
      WIN_UPDATE_CURSOR_NEW_LINE
      ;

: WIN_LF_CHAR
      WIN_UPDATE_CURSOR_NEW_LINE
      WIN_ROWPTRS WIN_YPOS @ 2 << + @ ( ADDR OF START OF NEW LINE )
      WIN_XPOS @ 0 DO ( FILL NEW LINE WITH SPACES BEFORE CURSOR )
         DUP 32 SWAP C! 1 +
      LOOP
      DROP
      WIN_YPOS @ WIN_OLDYPOS !
      ;

: WIN_CR_CHAR
      0 WIN_XPOS !
      ;

: WIN_CLEAR_WINDOW
      WIN_HEIGHT @ 0 DO
         I WIN_CLEAR_LINE
      LOOP
      W_BUF 0 WIN_HANDLE @ LS!
            4 0 LS!
            8 WIN_WAEX_MINY @ LS!
            12 WIN_WAEX_MAXX @ LS!
            16 0 LS!
      1 WIN_PRINTSPACE !
      WIN_UPDATE_WINDOW
      0 WIN_XPOS !
      0 WIN_YPOS !
      0 WIN_OLDXPOS !
      0 WIN_OLDYPOS !
      ;

: WIN_CTRL_CHAR
      DUP
      7 = IF ( IS IT A BEEP )
         OS WriteC
      ELSE
         12 = IF
            WIN_CLEAR_WINDOW
         THEN
      THEN
      ;

: WIN_DEL_CHAR
      WIN_YPOS @ WIN_XPOS @ 2DUP OR 0= IF ( XPOS AND YPOS = 0 )
         2DROP
         EXIT
      THEN
      ( YPOS / XPOS )
      1 - DUP 0< IF
         DROP WIN_WIDTH @ 1 -
         SWAP 1 - SWAP
      THEN
      2DUP WIN_XPOS ! DUP WIN_YPOS ! WIN_OLDYPOS !
      ( YPOS / XPOS )
      OVER 2 << WIN_ROWPTRS + @ OVER + ( YPOS / XPOS / CHAR ADDR )
      0 SWAP C!
      SWAP 1 WIN_PRINTSPACE !
      WIN_DRAW_NEW_CHAR
      ;

: WIN_PRINT_ALL_WORD
      WIN_TYPESCROLLED @ IF
         WIN_XPOS @ WIN_YPOS @
         WIN_TYPE_PRINT_SCROLLED
      ELSE
         WIN_TYPEY @ WIN_YPOS @ - 0= IF ( IS TYPEY = YPOS )
            WIN_TYPEX @ WIN_XPOS @ WIN_YPOS @
            WIN_SAME_LINE
         ELSE
            WIN_TYPEY @ WIN_YPOS @
            WIN_LINE_SPLIT
         THEN
      THEN
      ;

HEX

: WIN_TYPE
      DUP 0= IF ( IS COUNT = 0 )
         2DROP
         EXIT
      THEN
      0 WIN_TYPESCROLLED !
      WIN_XPOS @ WIN_TYPEX !
      WIN_YPOS @ WIN_TYPEY !
      BEGIN
         SWAP
         ( COUNT / ADDR )
         DUP 1 + SWAP C@ ( COUNT / ADDR+1 / [ADDR] )
         7F AND
         DUP
         7F = IF
            DROP
            WIN_DEL_CHAR
            1 ( USED AS BOOLEAN LATER )
         ELSE
            DUP
            0D = IF
               DROP
               WIN_CR_CHAR
               1
            ELSE
               DUP
               0A = IF
                  DROP
                  WIN_LF_CHAR
                  1
               ELSE
                  DUP
                  20 < IF
                     DROP
                     WIN_CTRL_CHAR
                     0
                  ELSE ( PRINTABLE CHAR )
                     WIN_ROWPTRS
                     WIN_YPOS @ 2 << + @ ( CHAR / ROW ADDRESS )
                     WIN_XPOS @ + C! ( STORE CHAR IN BUFFER )
                     WIN_UPDATE_CURSOR
                     WIN_XPOS @ 0= IF
                        WIN_YPOS @ WIN_OLDYPOS !
                     THEN
                     1
                  THEN
               THEN
            THEN
         THEN
         IF ( TEST BOOLEAN )
            WIN_DIDSCROLL @ IF
               1 WIN_TYPESCROLLED !
            THEN
         THEN
         SWAP ( ADDR / COUNT )
         1 - DUP 0=
      UNTIL
      2DROP
      WIN_PRINT_ALL_WORD
      ;

DECIMAL

: WIN_OPEN_WINDOW ( BUF ADDR )
      Wimp OpenWindow
      ;

: WIN_KEY ( ASSUMES Wimp_POLL HAS BEEN DONE )
          ( POLL BUFF ADDR / POLL VAL )
      DUP
      1 - 0= IF
         DROP
         DUP @ ( HANDLE )
         SET_TEMP_OP
         WIN_REDRAW_WINDOW
         RESTORE_OP
      ELSE
         DUP
         2 - 0= IF
            DROP
            DUP @ ( HANDLE )
            SET_TEMP_OP
            WIN_OPEN_WINDOW
            RESTORE_OP
         ELSE
            2DROP
         THEN
      THEN
      ;

HEX

: WIN_EMIT
      -1 WIN_TYPEX !
      DUP
      7F = IF ( DELETE CHAR )
         DROP
         WIN_DEL_CHAR
      ELSE
         DUP
         0D = IF ( CARRIAGE RETURN )
            DROP
            WIN_CR_CHAR
         ELSE
            DUP
            0A = IF ( LINEFEED )
               DROP
               WIN_LF_CHAR
            ELSE
               DUP
               20 < IF ( CONTROL CHAR )
                  WIN_CTRL_CHAR
                  EXIT
               ELSE ( PRINTABLE CHAR )
                  WIN_ROWPTRS
                  WIN_YPOS @ 2 << + @ ( CHAR / ROW ADDRESS )
                  WIN_XPOS @ + C! ( STORE CHAR IN BUFFER )
                  WIN_UPDATE_CURSOR
                  0 WIN_PRINTSPACE !
                  WIN_DIDSCROLL @ IF
                     WIN_WIDTH @ 1 - WIN_HEIGHT @ 2 -
                  ELSE
                     WIN_OLDXPOS @ WIN_OLDYPOS @
                  THEN
                  WIN_DRAW_NEW_CHAR
                  WIN_XPOS @ 0= IF
                     WIN_YPOS @ WIN_OLDYPOS !
                  THEN
               THEN
            THEN
         THEN
      THEN
      ( WIN_HANDLE @ )
      ( WIN_SET_CARET_POS )
      ;

WIN_MAN
HIDE W_HANDLE
HIDE W_XPOS
HIDE W_YPOS
HIDE W_OLDXPOS
HIDE W_OLDYPOS
HIDE W_TYPEX
HIDE W_TYPEY
HIDE W_WIDTH
HIDE W_HEIGHT
HIDE W_WAEX_MAXX
HIDE W_WAEX_MINY
HIDE W_DIDSCROLL
HIDE W_PRINTSPACE
HIDE W_TYPESCROLLED
HIDE W_CREATE
HIDE W_ROWPTRS
HIDE W_DYN_AREA
HIDE W_BUF
HIDE LS!
HIDE LSC!
HIDE L!
HIDE LC!
HIDE PARAM_START
HIDE WIN_FLAGS
HIDE TIT_BAR_FLAGS
HIDE PIX_CHAR_HGHT
HIDE NEG_PIX_CHAR_HGHT
HIDE PIX_CHAR_WDTH
HIDE NEG_PIX_CHAR_WDTH
HIDE WIN_OP_STR
HIDE WIN_IP_STR
HIDE WIN_HANDLE
HIDE WIN_XPOS
HIDE WIN_YPOS
HIDE WIN_OLDXPOS
HIDE WIN_OLDYPOS
HIDE WIN_TYPEX
HIDE WIN_TYPEY
HIDE WIN_WIDTH
HIDE WIN_HEIGHT
HIDE WIN_WAEX_MAXX
HIDE WIN_WAEX_MINY
HIDE WIN_DIDSCROLL
HIDE WIN_PRINTSPACE
HIDE WIN_TYPESCROLLED
HIDE WIN_ROWPTRS
HIDE WIN_SET_CARET_POS
HIDE WIN_MOVE
HIDE WIN_ORIGIN
HIDE WIN_OUTPUT_LINE
HIDE WIN_PRINT_TEXT
HIDE WIN_DRAW_NEW_CHAR
HIDE WIN_CLEAR_LINE
HIDE WIN_SHIFT_ROW_POINTERS
HIDE WIN_REDRAW_WINDOW
HIDE WIN_RFSH_WINDOW
HIDE WIN_UPDATE_WINDOW
HIDE WIN_SAME_LINE
HIDE WIN_TYPE_PRINT_SCROLLED
HIDE WIN_LINE_SPLIT
HIDE WIN_UPDATE_LAST_LINE
HIDE WIN_REDRAW_ALL_WINDOW
HIDE WIN_UPDATE_CURSOR_NEW_LINE
HIDE WIN_UPDATE_CURSOR
HIDE WIN_LF_CHAR
HIDE WIN_CR_CHAR
HIDE WIN_CLEAR_WINDOW
HIDE WIN_CTRL_CHAR
HIDE WIN_DEL_CHAR
HIDE WIN_PRINT_ALL_WORD
HIDE WIN_OPEN_WINDOW
HIDE RESTORE_OP
HIDE SET_TEMP_OP
HIDE SAVE_WIN_OP
HIDE FIND_PARAM_AREA
HIDE ADD_HANDLE
HIDE NUM_WINDOWS
HIDE WIN_HANDLE_LIST
HIDE MAX_WINDOWS


WIN_MAN ASSIGN POLL-ESCAPE TO-DO WIN_KEY

FORTH DEFINITIONS DECIMAL

WIN_MAN
0 VARIABLE TITLE
HEX 314E4957 TITLE ! DECIMAL
20 10 200 200 5 12 6 1 12 0 TITLE 4 WIN ROB
ROB WIN_CREATE
ROB WIN_OPEN
ROB SET_WIN_OP
: TEST 60 0 DO 68 WIN_MAN WIN_EMIT LOOP ;
