home *** CD-ROM | disk | FTP | other *** search
- PROGRAM WimpDemo
- C tests the Wimp library
- C needs 'wimp' and 'utils' libraries
- C the Wimp library is complete, but not all tested
- C the routines which have not been tried are indicated
- C with an '*' before their name in the writeup.
- C
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- DIMENSION ICBLOC(9)
- CHARACTER TITLE*9
- DATA TITLE /'F77 test.'/
- DATA ICBLOC/0,32,-180,196,-132,?I0800B03D,3*0/
- C
- C INITIALISE WIMP
- CALL WMPI('TWimp',ITHAND)
- C CREATE WINDOW
- C x,y,width,depth,extx,exty,title,flags
- C extx & exty are total size
- IY=500+RND01()*500
- IWHAND=IWMPCW(0,IY,300,500,500,700,TITLE,?IFF00000F)
- C Create Icon
- ICBLOC(1)=IWHAND
- CALL WMPC2H('Icon test',ICBLOC(7))
- CALL WMPCI(ICBLOC,ICONH)
- C Make up menu
- CALL MKMENU
- C set default colour for circle
- KOLOR=10
- C OPEN WINDOW
- IBLOCK(1)=IWHAND
- CALL WMPGWS(IBLOCK)
- CALL WMPOW(IBLOCK)
- C WIMP POLL
- IPMASK=?I31
- ITEST=0
- 10 CALL WMPP(IPMASK,IBLOCK,IREASN)
- C Do drag box requests
- CALL SAVEBX(IBLOCK,IREASN)
- C IREASN set negative if call has been used
- IF(IREASN.LT.0) GO TO 10
- C Do transfer block requests
- IF(ITEST.EQ.26.OR.ITEST.EQ.0) CALL TRBLOC(IREASN,ITHAND)
- C IREASN set negative if call has been used
- IF(IREASN.LT.0) GO TO 10
- C poll with no particular reason
- IF(IREASN.EQ.0) CALL TEST0
- C Redraw window request
- IF(IREASN.EQ.1) CALL REDRAW
- C Open window request
- IF(IREASN.EQ.2) CALL WMPOW(IBLOCK)
- C Close window request
- IF(IREASN.EQ.3) THEN
- C If top window, stop job
- IF(IBLOCK(1).EQ.IWHAND) CALL QUIT
- C otherwise just close window
- CALL WMPCLW(IBLOCK(1))
- C if testing DeleteWindow then do just that!
- IF(IBLOCK(1).EQ.IWDEL) CALL WMPDW(IWDEL)
- ENDIF
- C Mouse click
- IF(IREASN.EQ.6) CALL BUTTON
- C Key pressed
- IF(IREASN.EQ.8) CALL WMPPK(IBLOCK(7))
- C Click over menu
- IF(IREASN.EQ.9) CALL MENU
- C User message
- IF(IREASN.EQ.17.OR.IREASN.EQ.18) THEN
- C requesting close down
- IF(IBLOCK(5).EQ.0) CALL QUIT
- C moving over menu arrow, test Wimp_CreateSubMenuu
- IF(IBLOCK(5).EQ.?I0400C0)
- + CALL WMPCSM(IBLOCK(6),IBLOCK(7)+128,IBLOCK(8))
- ENDIF
- GO TO 10
- END
- C
- BLOCK DATA
- PARAMETER (N3=28)
- CHARACTER*12 TITL3,LIST3
- COMMON /CHTEST/TITL3,LIST3(N3)
- DATA TITL3/'Tests'/,LIST3/'Errors','BaseOfSprite','BlockCopy',
- +'ClaimFreeMem','CommandWindo','CreateSubMen','DeleteIcon ',
- +'DecodeMenu ','DeleteWindow','GetCaretPosn','GetWindowInf',
- +'GetWindowOut','PlotIcon ','PollIdle ','ReadPalette ',
- +'ReadPixTrans','ReadSysInfo ','SetExtent ','SetFontCols ',
- +'SetIconState','SetMode ','SetPalette ','SetPointerSh',
- +'SpriteOp ','SlotSize ','StartTask ','TransferBloc',
- +'WhichIcon '/
- END
- C
- SUBROUTINE BUTTON
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- EQUIVALENCE(IBLOCK(1),MOUSEX),(IBLOCK(2),MOUSEY),
- +(IBLOCK(3),IBUTTN),(IBLOCK(4),IWINDO),(IBLOCK(5),ICON)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- C check button type (1:adjust, 2:menu, 4:select)
- C open menu at mouse position
- IF(IBUTTN.EQ.2.AND.IWINDO.EQ.IWHAND)
- + CALL WMPCM(MBLOC,MOUSEX,MOUSEY)
- C do caret checking
- IF(ITEST.EQ.9.AND.IWINDO.EQ.ITWHAN) CALL CARET
- RETURN
- END
- C
- C
- SUBROUTINE MENU
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- DIMENSION MYBLOC(5)
- C called if mouse button is clicked over menu
- C
- C first close tests window (if open)
- CALL WMPCLW(ITWHAN)
- C check if second level window
- IF(IBLOCK(2).GE.0)THEN
- C check for 'more tests' in top menu
- IF(IBLOCK(1).EQ.3) THEN
- C do the extra test of type IBLOCK(2)
- CALL TESTS(IBLOCK(2))
- ELSE
- C look at 2nd menu choices here 0=red, 1=Green, 2=Blue
- IF(IBLOCK(2).EQ.0)KOLOR=11
- IF(IBLOCK(2).EQ.1)KOLOR=10
- IF(IBLOCK(2).EQ.2)KOLOR=15
- C now force a redraw use whole window because don't know which bit needed
- CALL WMPFR(IWHAND,0,-700,500,0)
- ENDIF
- ELSE
- C do nothing here if not first menu
- IF(IBLOCK(1).EQ.4) THEN
- C stop job if 5th option selected (starts from 0)
- CALL QUIT
- ELSE
- C Set bit to draw a tick on the 1st menu example
- IF(IBLOCK(1).EQ.0) MBLOC(8)=1-MBLOC(8)
- ENDIF
- ENDIF
- CALL WMPGPI(MYBLOC)
- C restore menu if 'Adjust' button pressed
- IF(MYBLOC(3).EQ.1) CALL WMPCM(MBLOC,MYBLOC(1),MYBLOC(2))
- RETURN
- END
- C
- SUBROUTINE MKMENU
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- PARAMETER (N3=28)
- CHARACTER*12 TITL3,LIST3
- COMMON /CHTEST/TITL3,LIST3(N3)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- PARAMETER (NMENU=5,N2=3,N4=2)
- DIMENSION MBLOC2(7+6*N2),MBLOC3(7+6*N3),MBLOC4(7+6*N4)
- CHARACTER*12 TITLM,LIST(NMENU),TITL2,LIST2(N2),TITL4,LIST4(N4)
- CHARACTER*13 TWNAME
- DATA TITLM/'Menu'/,LIST/'Example','Circle','save',
- + 'More Tests','Quit'/
- DATA TITL2/'Colour'/,LIST2/'Red','Green','Blue'/
- DATA TITL4/'SubMenu'/,LIST4/'Item 1','Item 2'/
- C set up 3rd menu the hard way
- C DATA MBLOC3/0,0,0,?I070207,192,44,0,128,-1,?I07009031,3*0/
- C set up menu block
- CALL WMPMNU(MBLOC,TITLM,LIST,NMENU)
- CALL WMPMNU(MBLOC2,TITL2,LIST2,N2)
- C make 2nd menu connected to 2nd item, 'Circle' in 1st list
- MBLOC(7+2+6*1)=LOC(MBLOC2)
- C set up drag box window
- CALL SAVEMN(?I0FFF,IWSAVE)
- C connect to menu
- MBLOC(9+6*2)=IWSAVE
- C make up tests menu
- CALL WMPMNU(MBLOC3,TITL3,LIST3,N3)
- C connect to main menu
- MBLOC(9+6*3)=LOC(MBLOC3(1))
- C make up test sub-menu
- CALL WMPMNU(MBLOC4,TITL4,LIST4,N4)
- C connect to menu 3
- MBLOC3(9+6*5)=LOC(MBLOC4(1))
- C set 'generate message' flag
- MBLOC3(8+6*5)=8
- C load test window template
- CALL WMPOT('f77.TWTemplate')
- IP=0
- TWNAME='DelTest'//?H00
- LT=10
- C
- CALL WMPLT(IBLOCK,ITWT,LT,-1,TWNAME,IP)
- C create window to delete
- CALL WMPCRW(IBLOCK,IWDEL)
- C create test window
- IP=0
- TWNAME='TWimp'//?H00
- LT=10
- C
- CALL WMPLT(IBLOCK,ITWT,LT,-1,TWNAME,IP)
- C create test window
- CALL WMPCRW(IBLOCK,ITWHAN)
- CALL WMPCT
- RETURN
- END
- C
- SUBROUTINE SAVEBX(JBLOC,IREASN)
- C two routines for saving files from menu windows using DragBoxes
- C
- C firstly:
- C
- C SAVEMN(ITYPE,IWINDO) creates the window containing a sprite, filename
- C OK box, to be attached to a menu which includes a 'Save' option.
- C It returns IWINDO, the handle of the created window.
- C It must be given ITYPE, the file type to be saved.
- C at the moment ITYPE can be either ?I0FFF (text) or ?I0AFF (draw)
- C others can be included by incrementing NTYPES and the associated
- C DATA statements below
- C
- C then the work is done by:
- C
- C SAVEBX(JBLOC,IREASN) called in the Wimp_Poll loop
- C JBLOC and IREASN are the WimpPoll block and reason code
- C IREASN is returned negative if SAVEBX has used this poll
- C
- C the user must also supply the following routine:
- C
- C SAVEFL(IERR) user routine to save the file to '<F77$File>' which is a
- C system alias for the name in the icon of the 'save' window. This is to
- C get round the bug in Fortran77 where file names are truncated to 30
- C characters in the OPEN statement.
- C returns IERR=0 if OK;
- C if the save failed, it returns IERR<>0 when the file must not be written
- C or it must be deleted if one has been written.
- C
- DIMENSION JBLOC(*)
- DIMENSION IBLOC(22),IREGS(0:7)
- EQUIVALENCE(IREGS(2),ITYPS)
- PARAMETER (NTYPES=2)
- CHARACTER DUMMY*1,FTYPE*9,VALID*4,FNAME*100,FOK*3
- CHARACTER*11 OLDFNM
- CHARACTER*4 TYPE(NTYPES),LTYP(NTYPES)*3
- LOGICAL MYDRAG
- DIMENSION JTYP(NTYPES)
- DATA VALID/'A~ .'/,FOK/'OK.'/,DUMMY/'.'/
- DATA TYPE/'Text','Draw'/
- DATA JTYP/?I0FFF,?I0AFF/
- DATA LTYP/ 'fff', 'aff'/
- DATA IBLOC/0,-164,264,0,0,0,-1,?I84000012,?I01070207,?I020103,
- +0,-164,264,0,?I3D,?I3000,0,0,?I65766153,?I3A736120,0,0/
- DATA IREGS/18,7*0/
- C
- C stop drag from other parts of this program
- IF(IREASN.NE.7) MYDRAG=.FALSE.
- C
- IF((IREASN.EQ.17.OR.IREASN.EQ.18).AND.JBLOC(5).EQ.2) THEN
- C
- C 'User message of type 2' (Wimp_Poll reason 17 or 18, JBLOC(5) is type)
- C this is the filer replying to request to save file
- C JBLOC contains the reply from the filer
- C get file name into FNAME
- CALL WMPH2C(JBLOC(12),FNAME,L)
- C close menu
- CALL WMPCM(-1,0,0)
- C set up alias for name
- CALL OSCLI('Set F77$File '//FNAME(1:L))
- C write the file
- CALL SAVEFL(IERR)
- C set file type with OS_File 18
- IF(IERR.EQ.0) CALL SWIF77(8,IREGS,IFLAG)
- C reset filename if not confirmed
- IF(JBLOC(10).LE.-1) FNAME=OLDFNM
- C send data-load message to filer
- JBLOC(4)=JBLOC(3)
- JBLOC(5)=3
- JBLOC(1)=64
- CALL WMPSMG(18,JBLOC,JBLOC(6),JBLOC(7))
- C set 'used' flag
- IREASN=-1
- RETURN
- ENDIF
- C
- C is this mouse click over 'save' window
- IF(IREASN.EQ.6.AND.JBLOC(4).EQ.IWSAVE) THEN
- C set 'used' flag
- IREASN=-1
- C click over 'OK' icon, go save file...
- IF(JBLOC(5).EQ.ICOK) GO TO 300
- C
- IF(JBLOC(5).EQ.ICSPRT .AND. IAND(JBLOC(3),?I50).GT.0) THEN
- C drag initiated with mouse
- C set up drag box attached to mouse
- IBLOC(1)=IWSAVE
- C Find coordinates of save window
- CALL WMPGWS(IBLOC)
- IX0=IBLOC(2)-IBLOC(6)
- IY0=IBLOC(5)-IBLOC(7)
- IBLOC(2)=ICSPRT
- C Find coordinates of sprite icon
- CALL WMPGIS(IBLOC)
- C Set up for drag
- IBLOC(1)=IWSAVE
- C Drag type 5
- IBLOC(2)=5
- C coordinates of sprite boundary
- IBLOC(3)=IX0+IBLOC(3)
- IBLOC(4)=IY0+IBLOC(4)
- IBLOC(5)=IX0+IBLOC(5)
- IBLOC(6)=IY0+IBLOC(6)
- C bounds for dragging to
- IBLOC(7)=0
- IBLOC(8)=0
- IBLOC(9)=99999
- IBLOC(10)=99999
- C set MYDRAG to allow its detection
- MYDRAG=.TRUE.
- C initiate drag
- CALL WMPDB(IBLOC)
- ENDIF
- RETURN
- ENDIF
- C
- C is key pressed over save window?
- IF(IREASN.EQ.8.AND.JBLOC(1).EQ.IWSAVE) THEN
- C (Wimp_Poll reason 8, window handle in JBLOC(1), Key value in JBLOC(7))
- C set 'used' flag
- IREASN=-1
- C accept <CR> only
- IF(JBLOC(7).EQ.13) GO TO 300
- C otherwise give back to Wimp
- CALL WMPPK(JBLOC(7))
- RETURN
- ENDIF
- C
- IF(IREASN.EQ.7.AND.MYDRAG) THEN
- C IF(IREASN.EQ.7) THEN
- C drag finished (reason 7 from Wimp_Poll)
- C initiate save dialogue
- C
- C set 'used' flag
- IREASN=-1
- C find where we are
- CALL WMPGPI(IBLOC)
- C check we are over a window
- IF(IBLOC(4).LT.0) RETURN
- C set up datasave message
- C
- C Window & icon handles
- IBLOC(6)=IBLOC(4)
- IBLOC(7)=IBLOC(5)
- C coordinates
- IBLOC(8)=IBLOC(1)
- IBLOC(9)=IBLOC(2)
- C size of file (a guess only!!!)
- IBLOC(10)=9999
- C file type
- IBLOC(11)=ITYPS
- C null terminated file name
- L=INDEX(FNAME,CHAR(0))
- DO 210 I=L-1,1,-1
- IF(FNAME(I:I).EQ.'.') GO TO 220
- 210 CONTINUE
- I=0
- 220 IF(L-I.LT.2 .OR. L-I.GT.11) THEN
- CALL WMPRE(20,'Problem in file name length calculation',
- + 1,'Drag File',IR)
- RETURN
- ENDIF
- OLDFNM=FNAME(I+1:L)
- CALL WMPC2H(FNAME(I+1:L-1),IBLOC(12))
- C block length in bytes & dummy reference #
- IBLOC(1)=64
- IBLOC(4)=0
- C action (1 = save)
- IBLOC(5)=1
- C now send message
- CALL WMPSMG(17,IBLOC,IBLOC(6),IBLOC(7))
- ENDIF
- RETURN
- C
- C file name FNAME entered by hand, save the file
- 300 IF(INDEX(FNAME,'$.').EQ.0) THEN
- CALL WMPRE(20,'Please set up the complete file and path name'
- + ,1,'Drag File',IR)
- ELSE
- C close menu
- CALL WMPCM(-1,0,0)
- C set up alias for name
- L=INDEX(FNAME,CHAR(0))-1
- CALL OSCLI('Set F77$File '//FNAME(1:L))
- C write the file
- CALL SAVEFL(IERR)
- C set file type with OS_File 18
- IF(IERR.EQ.0) CALL SWIF77(8,IREGS,IFLAG)
- ENDIF
- RETURN
- C
- C SAVEMN(ITYPE,IWINDO) sets up a save window with handle IWINDO
- C for files of type ITYPE
- C
- ENTRY SAVEMN(ITYPE,IWINDO)
- C set up file name location for OS_File
- IREGS(1)=LOCC(FNAME)
- C find file type in list
- ITYPS=ITYPE
- DO 10 IT=1,NTYPES
- IF(ITYPE.EQ.JTYP(IT)) GO TO 20
- 10 CONTINUE
- IWINDO=-1
- RETURN
- C construct Wimp sprite name
- 20 FTYPE='file_'//LTYP(IT)
- C make window
- CALL WMPCRW(IBLOC,IWSAVE)
- IWINDO=IWSAVE
- C make file sprite
- ICSPRT=IWMPCI(IWSAVE,100,-92,68,68,?I6102,FTYPE,DUMMY)
- C make file name
- FNAME=TYPE(IT)//'File'//CHAR(0)
- ICNAME=IWMPCI(IWSAVE,8,-156,192,48,?I0700F12D,FNAME,VALID)
- C make 'OK' box
- ICOK=IWMPCI(IWSAVE,208,-156,48,48,?IC701903D,FOK,DUMMY)
- RETURN
- END
- C
- SUBROUTINE SAVEFL(IERR)
- IERR=0
- OPEN(20,FILE='<F77$File>',FORM='FORMATTED',ERR=900)
- WRITE(20,101,ERR=900)
- 101 FORMAT('Here is a little test file'/
- + 'Written to the file:'/)
- GO TO 999
- 900 IERR=1
- 999 CLOSE(20)
- CALL OSCLI('SHOW F77$File { >> <F77$File> }')
- RETURN
- END
- C
- SUBROUTINE QUIT
- CALL WMPCD
- STOP
- END
- C
- SUBROUTINE REDRAW
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- C IBLOCK(1)=IWHAND
- CALL WMPRW(IBLOCK,MORE)
- IF(MORE.EQ.0) RETURN
- 10 IX0=IBLOCK(2)-IBLOCK(6)
- IY0=IBLOCK(5)-IBLOCK(7)
- IF(IBLOCK(1).EQ.IWHAND) CALL DRAWW(IX0,IY0)
- IF(IBLOCK(1).EQ.ITWHAN) CALL DRAWT(IX0,IY0)
- IF(IBLOCK(1).EQ.IWDEL) CALL DRAWD(IX0,IY0)
- CALL WMPGR(IBLOCK,MORE)
- IF(MORE.NE.0) GO TO 10
- IF(ITEST.EQ.13) CALL POLLID
- RETURN
- END
- C
- SUBROUTINE DRAWW(IX0,IY0)
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- CALL WMPSC(0,11,0)
- C print some text at 0,-40 in colour 11
- CALL WMPTXT(IX0,IY0-40,'Try clicking menu')
- CALL WMPTXT(IX0,IY0-80,'over this window')
- CALL WMPSC(0,KOLOR,0)
- C Plot disc at 200,-400, radius 70, in colour KOLOR
- PRINT 101,25,4,IX0+200,IY0-400,25,153,0,70
- 101 FORMAT($,2A1,2A2,2A1,2A2)
- RETURN
- END
- C
- SUBROUTINE TESTS(ITT)
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- DIMENSION KPOINT(9),ICON1(9),IRED(20),IGREEN(20),IBLUE(20)
- PARAMETER (N3=28)
- CHARACTER*12 TITL3,LIST3
- COMMON /CHTEST/TITL3,LIST3(N3)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- DATA MODES /27/, KPFLAG /1/, IHANDL/-1/
- DATA ICON1/0,128,-384,384,-128,?IFB00603D,3*0/
- DATA KPOINT/9*?I55555555/
-
- C do test ITT
- C
- ITEST=ITT
- IF(ITEST.EQ.0) THEN
- C ITEST=0: test error return capability
- CALL WMPOT('$')
- RETURN
- ENDIF
- IF(ITEST.EQ.4) THEN
- C test Wimp_CommandWindow
- CALL WMPCOW(LOCC('Testing Wimp_CommandWindow'//?H00))
- PRINT*,' Just a few words in this text window'
- CALL WMPTC(11)
- PRINT *,' and some more in RED'
- CALL WMPTC(13)
- CALL WMPCOW(0)
- RETURN
- ENDIF
- C create submenu activated by moving over arrow
- IF(ITEST.EQ.5) RETURN
- C delete the icon
- IF(ITEST.EQ.6) THEN
- IBLOCK(1)=IWHAND
- IBLOCK(2)=ICONH
- CALL WMPDI(IBLOCK)
- CALL WMPFR(IWHAND,0,-700,500,0)
- RETURN
- ENDIF
- MX=0
- MY=0
- IH=0
- II=0
- IF(ITEST.EQ.10) THEN
- C get window information (II = # icons)
- IBLOCK(1)=IWHAND
- CALL WMPGWI(IBLOCK)
- MX=IBLOCK(14)-IBLOCK(12)
- MY=IBLOCK(15)-IBLOCK(13)
- II=IBLOCK(23)
- ENDIF
- IF(ITEST.EQ.11) THEN
- C get window outline
- IBLOCK(1)=IWHAND
- CALL WMPGWI(IBLOCK)
- MX=IBLOCK(2)
- MY=IBLOCK(3)
- IH=IBLOCK(4)
- II=IBLOCK(5)
- ENDIF
- C set window extent bigger in y
- IF(ITEST.EQ.17) THEN
- IBLOCK(1)=0
- IBLOCK(2)=-768
- IBLOCK(3)=512
- IBLOCK(4)=0
- CALL WMPSE(ITWHAN,IBLOCK)
- ENDIF
- C toggle icon colour
- IF(ITEST.EQ.19) THEN
- IBLOCK(1)=IWHAND
- IBLOCK(2)=ICONH
- IBLOCK(3)=?IFF000000
- IBLOCK(4)=0
- CALL WMPSIS(IBLOCK)
- CALL WMPFR(IWHAND,0,-700,500,0)
- ENDIF
- C toggle mode!
- IF(ITEST.EQ.20) THEN
- IF(MODES.EQ.27) THEN
- MODES=15
- ELSE
- MODES=27
- ENDIF
- CALL WMPSMD(MODES)
- ENDIF
- C toggle background colour
- IF(ITEST.EQ.21) THEN
- C get current palette
- CALL WMPRP(IRED,IGREEN,IBLUE)
- C change colour 4 (wimp background)
- IF(IBLUE(5).EQ.112) THEN
- IBLUE(5)=0
- IGREEN(5)=80
- ELSE
- IBLUE(5)=112
- IGREEN(5)=112
- ENDIF
- C reset palette
- CALL WMPSP(IRED,IGREEN,IBLUE)
- ENDIF
- C set pointer shape
- IF(ITEST.EQ.22) THEN
- IF(KPFLAG.EQ.1) THEN
- KPFLAG=2
- CALL WMPSPS(2,LOC(KPOINT),12,12,6,6)
- ELSE
- KPFLAG=1
- CALL WMPSPS(1,-1,0,0,0,0)
- ENDIF
- ENDIF
- C find slot sizes
- IF(ITEST.EQ.24) CALL WMPSS(-1,-1,MX,MY,II)
- C start another task
- IF(ITEST.EQ.25) CALL WMPST('RUN aif.TWimp')
- C transfer block
- IF(ITEST.EQ.26) THEN
- C first start another task to drag the block to
- CALL WMPST('RUN aif.TWimp')
- C set up the block icon
- ICON1(1)=ITWHAN
- CALL WMPCI(ICON1,IHANDL)
- ELSE
- IF(IHANDL.GE.0) THEN
- C delete the block icon
- IBLOCK(1)=ITWHAN
- IBLOCK(2)=IHANDL
- IHANDL=-1
- CALL WMPDI(IBLOCK)
- ENDIF
- ENDIF
- C find inverted icons
- IF(ITEST.EQ.27) CALL WMPWI(IWHAND,MX,?I200000,?I200000)
- C
- CALL WMPC2H('Testing '//LIST3(ITEST+1),ITWT)
- IBLOCK(1)=ITWHAN
- IF(ITEST.EQ.8) IBLOCK(1)=IWDEL
- CALL WMPGWS(IBLOCK)
- CALL WMPOW(IBLOCK)
- RETURN
- END
- C
- SUBROUTINE DRAWD(IX0,IY0)
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- CHARACTER*32 STRING
- C messages for delete window test
- WRITE(STRING,101)'Close this window, then'
- CALL WMPTXT(IX0+32,IY0-40,STRING)
- WRITE(STRING,101)'it will be deleted and'
- CALL WMPTXT(IX0+32,IY0-100,STRING)
- WRITE(STRING,101)'next time you''ll get an error'
- CALL WMPTXT(IX0+32,IY0-160,STRING)
- RETURN
- 101 FORMAT(A)
- END
- C
- SUBROUTINE DRAWT(IX0,IY0)
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- CHARACTER*32 STRING
- DIMENSION LIST(3),ICONB(8),KPAL(20),IPAR(3:7),MULT(4)
- DIMENSION IRED(20),IGREEN(20),IBLUE(20)
- DATA MULT/1,2,1,1/
- DATA LIST/3,7,-1/
- DATA ICONB/32,-96,256,-32,?IFB00003D,?I746F6C50,?I6E6F6349,0/
- C 'Plot' , 'Icon' ,0/
- GO TO (10, 20, 30, 40, 50, 60, 70, 80, 90,100,
- + 110,120,130,140,150,160,170,180,190,200,
- + 210,220,230,240,250,260,270),ABS(ITEST)
- C testing BaseOfSprites
- 10 CALL WMPBOS(IROM,IRMA)
- C print results
- J=(IROM-LOC(IBLOCK))/4+1
- WRITE(STRING,102)IBLOCK(J),IBLOCK(J+1)
- CALL WMPTXT(IX0+32,IY0-40,'ROM sprite block length')
- CALL WMPTXT(IX0+32,IY0-98,STRING(1:6)//
- +', # sprites '//STRING(7:12))
- WRITE(STRING,101)'RMA sprites at ',IRMA
- 101 FORMAT(A,Z8)
- CALL WMPTXT(IX0+32,IY0-146,STRING)
- RETURN
- C testing BlockCopy
- 20 CALL WMPTXT(IX0+32,IY0-40,'Copy this text down lower')
- C allow general polling
- IPMASK=0
- RETURN
- 30 CALL WMPTXT(IX0+32,IY0-40,'Sorry, this can not be done')
- CALL WMPTXT(IX0+32,IY0-88,'with Fortran; it needs to')
- CALL WMPTXT(IX0+32,IY0-136,'be in SVC mode')
- RETURN
- 40 CONTINUE
- 50 CONTINUE
- 60 CONTINUE
- RETURN
- C testing DecodeMenu
- 70 CALL WMPDM(MBLOC,LIST,STRING,LEN)
- CALL WMPTXT(IX0+32,IY0-40,'This menu string is:')
- CALL WMPTXT(IX0+32,IY0-100,STRING(1:LEN))
- RETURN
- 80 RETURN
- C Testing GetCaretPosition
- 90 CALL WMPTXT(IX0+32,IY0-32,'Click over this window to get')
- CALL WMPTXT(IX0+32,IY0-96,'the caret and find its values')
- CALL WMPTXT(IX0+32,IY0-288,'x,y =')
- CALL WMPTXT(IX0+32,IY0-352,'h,i =')
- WRITE (STRING,102)MX,MY
- 102 FORMAT(3I6)
- CALL WMPTXT(IX0+144,IY0-288,STRING)
- WRITE (STRING,102)IH,II
- CALL WMPTXT(IX0+144,IY0-352,STRING)
- RETURN
- C Testing GetWindowInfo
- 100 WRITE (STRING,102)MX,MY
- CALL WMPTXT(IX0+32,IY0-32,'Size of main window')
- CALL WMPTXT(IX0+32,IY0-96,'work area is:')
- CALL WMPTXT(IX0+256,IY0-96,STRING)
- WRITE (STRING,102)II
- CALL WMPTXT(IX0,IY0-192,STRING(1:7)//'icons')
- RETURN
- 110 WRITE (STRING,102)MX,MY
- WRITE (STRING(13:24),102)IH,II
- CALL WMPTXT(IX0+32,IY0-32,'Main window is from')
- CALL WMPTXT(IX0+32,IY0-96,STRING(1:12)//' to '//STRING(13:24))
- RETURN
- C testing plot icon
- 120 CALL WMPPLI(ICONB)
- RETURN
- C testing Poll Idle
- 130 CALL WMPTXT(IX0+32,IY0-32,'beep every 1 second')
- CALL WMPTXT(IX0+32,IY0-96,'click mouse to stop')
- RETURN
- C read palette
- 140 CALL WMPRP(IRED,IGREEN,IBLUE)
- DO 142 I=1,10
- WRITE(STRING,144)I-1,IRED(I),IGREEN(I),IBLUE(I),
- +I+9,IRED(I+10),IGREEN(I+10),IBLUE(I+10)
- CALL WMPTXT(IX0+16,IY0-48*I,STRING)
- 142 CONTINUE
- 144 FORMAT(I1,3I4,I5,3I4)
- RETURN
- C read pix trans of textfile sprite
- 150 CALL WMPRPT(0,0,'file_fff',MX,KPAL)
- WRITE(STRING,102)MX,MY
- CALL WMPTXT(IX0+32,IY0-48,'mult factors'//STRING)
- WRITE(STRING,102)IH,II
- CALL WMPTXT(IX0+32,IY0-96,'div factors'//STRING)
- L=1
- DO 156 I=1,4
- DO 154 J=0,-24,-8
- WRITE(STRING(L:L+1),152)IAND(255,ISHFT(KPAL(I),J))
- 152 FORMAT(Z2)
- 154 L=L+2
- 156 CONTINUE
- CALL WMPTXT(IX0+32,IY0-144,'colour translation:')
- CALL WMPTXT(IX0,IY0-192,STRING)
- RETURN
- C read system info
- 160 CALL WMPRSI(0,II)
- WRITE (STRING,102)II
- CALL WMPTXT(IX0+32,IY0-48,'# active tasks'//STRING)
- RETURN
- 170 CALL WMPTXT(IX0+32,IY0-128,'window should be')
- CALL WMPTXT(IX0+32,IY0-192,'extendable in Y')
- RETURN
- 180 CALL FONTCL(IX0,IY0)
- RETURN
- 190 CALL WMPTXT(IX0+32,IY0-40,'Toggle icon colours')
- RETURN
- 200 CALL WMPTXT(IX0+32,IY0-40,'Toggle mode')
- RETURN
- 210 CALL WMPTXT(IX0+32,IY0-40,'Toggle background colour')
- RETURN
- 220 CALL WMPTXT(IX0+32,IY0-40,'Toggle pointer shape')
- RETURN
- C plot a sprite
- 230 IPAR(3)=IX0+256
- IPAR(4)=IY0-256
- IPAR(5)=0
- IPAR(6)=LOC(MULT)
- IPAR(7)=0
- CALL WMPSO(52,'file_fff',IPAR)
- RETURN
- 240 WRITE(STRING,102)MX/1024,MY/1024,II/1024
- CALL WMPTXT(IX0+32,IY0- 40,'current slot:'//STRING( 1: 6)//'K')
- CALL WMPTXT(IX0+32,IY0-120,' next slot:'//STRING( 7:12)//'K')
- CALL WMPTXT(IX0+32,IY0-200,' free pool:'//STRING(13:18)//'K')
- RETURN
- 250 CALL WMPTXT(IX0+32,IY0-40,'Start another TWimp')
- CALL WMPTXT(IX0+32,IY0-96,'Please delete it!')
- RETURN
- 260 IF(ITEST.GT.0) THEN
- CALL WMPTXT(IX0+32,IY0-40,'Please drag the block below')
- CALL WMPTXT(IX0+32,IY0-88,'to the new TWimp job')
- ELSE
- WRITE(STRING,102)II
- CALL WMPTXT(IX0+32,IY0-40,'Drag of block to the new job')
- CALL WMPTXT(IX0+32,IY0-88,'is complete.')
- CALL WMPTXT(IX0+32,IY0-136,'difference ='//STRING(1:6))
- ENDIF
- RETURN
- 270 IF(MX.GE.0) THEN
- CALL WMPTXT(IX0+32,IY0-40,'Icon is inverted')
- ELSE
- CALL WMPTXT(IX0+32,IY0-40,'Icon is not inverted')
- ENDIF
- RETURN
- END
- C
- SUBROUTINE TEST0
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- EXTERNAL SUBFM
- C tests using general poll
- IF(ITEST.EQ.2) THEN
- C test block copy
- CALL WMPBC(ITWHAN,32,-80,480,-40,64,-300)
- ENDIF
- C stop general poll
- IPMASK=?I31
- RETURN
- END
- C
- SUBROUTINE CARET
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- C get pointer screen coordinates
- MX=IBLOCK(1)
- MY=IBLOCK(2)
- C get window coordinates
- IBLOCK(1)=ITWHAN
- CALL WMPGWS(IBLOCK)
- C get mouse coordinates in window
- MX=MX-IBLOCK(2)+IBLOCK(6)
- MY=MY-IBLOCK(5)+IBLOCK(7)
- C move caret to pointer position
- CALL WMPSCP(ITWHAN,-1,MX,MY,64,0)
- C get caret position
- CALL WMPGCP(IBLOCK)
- C print it out
- MX=IBLOCK(3)
- MY=IBLOCK(4)
- IH=IBLOCK(5)
- II=IBLOCK(6)
- CALL WMPFR(ITWHAN,0,-512,512,0)
- RETURN
- END
- C
- SUBROUTINE POLLID
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- C do poll idle loop every 100 centisec
- 10 CALL WMPPOI(?I0E1932,IBLOCK,IREASN,100)
- IF(IREASN.EQ.0) PRINT 101,7
- IF(IREASN.NE.6) GO TO 10
- 101 FORMAT($,A1)
- C stop it coming back again if the window is redrawn
- ITEST=-13
- RETURN
- END
- C
- SUBROUTINE FONTCL(IX0,IY0)
- C test changing colours of anti-aliased fonts
- DIMENSION IREGS(0:7)
- LOGICAL SWIF77
- IREGS(1)=LOCC('Trinity.Medium'//?H00)
- IREGS(2)=640
- IREGS(3)=640
- IREGS(4)=0
- IREGS(5)=0
- C find font
- IF(SWIF77(?I040081,IREGS,IFLAG)) STOP'fonterr'
- IH=IREGS(0)
- IREGS(1)=LOCC('Anti-Alias'//?H00)
- IREGS(2)=16
- IREGS(3)=IX0+32
- IREGS(4)=IY0-128
- C change font colours
- CALL WMPSFC(8,15)
- C paint text
- IF(SWIF77(?I040086,IREGS,IFLAG)) STOP'painterr'
- C restore font colours
- CALL WMPSFC(0,7)
- IREGS(4)=IY0-384
- IF(SWIF77(?I040086,IREGS,IFLAG)) STOP'painterr'
- IREGS(0)=IH
- C lose font
- IF(SWIF77(?I040082,IREGS,IFLAG)) STOP'losefont'
- RETURN
- END
- SUBROUTINE TRBLOC(IREASN,ITHAND)
- COMMON IPMASK,KOLOR,IWHAND,ICONH,IWSAVE,IBLOCK(128),MBLOC(100)
- COMMON /TESTW/ ITWHAN,ITWT(10),ITEST,IWDEL,MX,MY,IH,II
- PARAMETER (N3=28)
- CHARACTER*12 TITL3,LIST3
- COMMON /CHTEST/TITL3,LIST3(N3)
- DIMENSION IFETCH(8),ISEND(8)
- DATA ISEND/1,2,3,4,5,6,7,8/
- C
- C all the logic used to drag a block of data from
- C one task to another
- C
- IF(IREASN.EQ.6 .AND. IBLOCK(4).EQ.ITWHAN .AND.
- +IBLOCK(5).EQ.0 .AND. IAND(IBLOCK(3),?I50).GT.0) THEN
- C drag initiated with mouse
- C set 'used' flag
- IREASN=-1
- C set up drag box attached to mouse
- IBLOCK(1)=ITWHAN
- C Find coordinates of save window
- CALL WMPGWS(IBLOCK)
- IX0=IBLOCK(2)-IBLOCK(6)
- IY0=IBLOCK(5)-IBLOCK(7)
- C Set up for drag
- IBLOCK(1)=IWSAVE
- C Drag type 5
- IBLOCK(2)=5
- C coordinates of sprite boundary
- IBLOCK(3)=IX0+128
- IBLOCK(4)=IY0-384
- IBLOCK(5)=IBLOCK(3)+256
- IBLOCK(6)=IBLOCK(4)+256
- C bounds for dragging to
- IBLOCK(7)=0
- IBLOCK(8)=0
- IBLOCK(9)=99999
- IBLOCK(10)=99999
- C initiate drag
- CALL WMPDB(IBLOCK)
- RETURN
- ENDIF
- IF(IREASN.EQ.7) THEN
- C drag finished (reason 7 from Wimp_Poll)
- C initiate save dialogue
- C
- C set 'used' flag
- IREASN=-1
- C find where we are
- CALL WMPGPI(IBLOCK)
- C check we are over a window
- IF(IBLOCK(4).LT.0) RETURN
- C set up datasave message
- C
- C Window & icon handles
- IBLOCK(6)=IBLOCK(4)
- IBLOCK(7)=IBLOCK(5)
- C coordinates
- IBLOCK(8)=IBLOCK(1)
- IBLOCK(9)=IBLOCK(2)
- C size of block
- IBLOCK(10)=32
- C file type
- IBLOCK(11)=0
- C leaf name
- IBLOCK(12)=0
- C block length in bytes & dummy reference #
- IBLOCK(1)=48
- IBLOCK(4)=0
- C action (1 = save)
- IBLOCK(5)=1
- C now send message
- CALL WMPSMG(17,IBLOCK,IBLOCK(6),IBLOCK(7))
- RETURN
- ENDIF
- C finished if not message received
- IF(IREASN.NE.17.AND.IREASN.NE.18) RETURN
- C data save message received by receiver
- IF(IBLOCK(5).EQ.1) THEN
- C check that it does not have a file name,
- C nor comes from this task
- IF(IBLOCK(12).NE.0.OR.IBLOCK(2).EQ.ITHAND) RETURN
- C clear buffer
- DO 10 I=1,8
- IFETCH(I)=-1
- 10 CONTINUE
- C reply with RAMFetch
- IBLOCK(6)=LOC(IFETCH)
- IBLOCK(7)=32
- IBLOCK(5)=6
- IBLOCK(1)=28
- CALL WMPSMG(17,IBLOCK,IBLOCK(2),I)
- IREASN=-1
- RETURN
- ENDIF
- C RAMfetch message received by originator
- IF(IBLOCK(5).EQ.6) THEN
- C transfer block of info
- CALL WMPTB(ITHAND,LOC(ISEND),IBLOCK(2),IBLOCK(6),IBLOCK(7))
- C send RAM transmit message
- IBLOCK(1)=28
- IBLOCK(5)=7
- CALL WMPSMG(17,IBLOCK,IBLOCK(2),I)
- IREASN=-1
- RETURN
- ENDIF
- C RAMtransmit message received by receiver
- IF(IBLOCK(5).EQ.7) THEN
- II=0
- DO 20 I=1,8
- II=II+IFETCH(I)-ISEND(I)
- 20 CONTINUE
- CALL WMPC2H('Testing '//LIST3(27),ITWT)
- IBLOCK(1)=ITWHAN
- CALL WMPGWS(IBLOCK)
- IBLOCK(3)=IBLOCK(3)-256
- IBLOCK(5)=IBLOCK(5)-256
- CALL WMPOW(IBLOCK)
- ITEST=-26
- IREASN=-1
- ENDIF
- RETURN
- END
-