REM >!RunImage REM (C) Martyn Fox REM Wimp training program REM version 0.01 (date) ON ERROR PROCclose:REPORT:PRINT" at line ";ERL:END SYS "Wimp_Initialise",200,&4B534154,"Test" TO ,task% PROCinit PROCcreateicon REPEAT PROCpoll UNTIL quit% PROCclose END : DEFPROCcreateicon REM creates the application's icon and puts it on the icon bar !b%=-1:b%!4=0:b%!8=0:b%!12=68:b%!16=68:b%!20=&3002 $(b%+24)="!Test":SYS"Wimp_CreateIcon",,b% TO i% ENDPROC : DEFPROCclose REM tells the Wimp to quit the application SYS "Wimp_CloseDown",task%,&4B534154 ENDPROC : DEFPROCpoll REM main program Wimp polling loop SYS "Wimp_Poll",,b% TO r% CASE r% OF WHEN 2:SYS "Wimp_OpenWindow",,b% WHEN 3:SYS "Wimp_CloseWindow",,b% WHEN 6:PROCmouseclick WHEN 8:PROCkeypress WHEN 9:PROCmenuclick WHEN 17,18:PROCreceive ENDCASE ENDPROC : DEFPROCinit REM initialisation before polling loop starts DIM b% 1023,ws% 1023,menspc% 1023 wsend%=ws%+1024 quit%=FALSE PROCload_templates PROCmain_menu ENDPROC : DEFPROCreceive REM handles messages received from the Wimp with reason codes 17 or 18 CASE b%!16 OF WHEN 0:quit%=TRUE ENDCASE ENDPROC : DEFPROCmouseclick REM handles mouse clicks in response to Wimp_Poll reason code 6 REM b%!0=mousex,b%!4=mousey:b%!8=buttons:b%!12=window handle (-2 for icon bar):b%!16=icon handle CASE b%!12 OF WHEN -2:CASE b%!8 OF WHEN 1:quit%=TRUE WHEN 2:PROCshowmenu(mainmenu%,!b%-64,96+2*44):REM replace '2' with number of menu items WHEN 4:!b%=main%:SYS "Wimp_GetWindowState",,b%:SYS "Wimp_OpenWindow",,b% ENDCASE WHEN main%:PROCwindow_click ENDCASE ENDPROC : DEFFNmake_icon(x%,y%) REM creates an icon at given window coordinates and returns icon handle b%!0=main%:REM Window handle b%!4=x%:REM Minimum x coordinate b%!8=y%:REM Minimum y coordinate b%!12=x%+200:REM Maximum x coordinate b%!16=y%+44:REM Maximum y coordinate b%!20=&0700F13D:REM Icon flags b%!24=ind% b%!28=-1 b%!32=50 SYS "Wimp_CreateIcon",,b% TO handle% =handle% : DEFPROCwindow_click REM handles mouse clicks on window REM b%!0=mousex,b%!4=mousey:b%!8=buttons:b%!12=window handle (-2 for icon bar):b%!16=icon handle CASE b%!16 OF WHEN 0:VDU 7 OTHERWISE CASE b%!8 OF WHEN 4:PROCnew_icon(b%!0,b%!4) ENDCASE ENDCASE ENDPROC : DEFPROCget_origin(handle%,RETURN xorig%,RETURN yorig%) REM returns coordinates of window work area origin LOCAL c% c%=b%+800 !c%=handle% SYS "Wimp_GetWindowState",,c% xorig%=c%!4-c%!20:yorig%=c%!16-c%!24 ENDPROC : DEFPROCnew_icon(x%,y%) REM creates an icon at given screen coordinates REM b%!0=mousex,b%!4=mousey:b%!8=buttons:b%!12=window handle (-2 for icon bar):b%!16=icon handle PROCget_origin(main%,xorig%,yorig%) ih%=FNmake_icon(x%-xorig%,y%-yorig%) !b%=main%:b%!4=ih%:b%!8=0:b%!12=0 SYS "Wimp_SetIconState",,b% ENDPROC : DEFPROCkill_icon REM deletes icon which has been clicked on REM b%!0=mousex,b%!4=mousey:b%!8=buttons:b%!12=window handle (-2 for icon bar):b%!16=icon handle !b%=b%!12:b%!4=b%!16 SYS "Wimp_GetIconState",,b% SYS "Wimp_DeleteIcon",,b% SYS "Wimp_ForceRedraw",!b%,b%!8,b%!12,b%!16,b%!20 ENDPROC : DEFPROCload_templates REM opens window template file, loads and creates window SYS "Wimp_OpenTemplate",,".Templates" SYS "Wimp_LoadTemplate",,b%,ws%,wsend%,-1,"Main",0 TO ,,ws% ind%=!(b%+88+32*1+20) SYS "Wimp_CreateWindow",,b% TO main% SYS "Wimp_LoadTemplate",,b%,ws%,wsend%,-1,"progInfo",0 TO ,,ws% SYS "Wimp_CreateWindow",,b% TO info% SYS "Wimp_CloseTemplate" ENDPROC : DEFPROCkeypress REM processes keypresses in response to Wimp_Poll reason code 8 IF b%!24=13 THEN SYS "Wimp_WhichIcon",main%,b%+64,1<<23,0 n%=64 !b%=main%:b%!8=0:b%!12=0 WHILE b%!n%<>-1 b%!4=b%!n% SYS "Wimp_SetIconState",,b% n%+=4 ENDWHILE ELSE SYS "Wimp_ProcessKey",b%!24 ENDIF ENDPROC : DEFPROCmain_menu REM creates main menu data block start%=menspc% $(start%)="Test" start%?12=7:REM title foreground colour start%?13=2:REM title background colour start%?14=7:REM work area foreground colour start%?15=0:REM work area background colour start%!16=96:REM width of menu start%!20=44:REM height of menu items start%!24=0:REM gap between items menspc%+=28 REM data for "Info" item !menspc%=0:REM menu flags menspc%!4=info%:REM submenu pointer menspc%!8=&07000021:REM menu icon flags $(menspc%+12)="Info":REM menu icon data menspc%+=24 REM data for "Quit" item !menspc%=&80:REM menu flags - bit 7 set to indicate last item menspc%!4=-1:REM submenu pointer menspc%!8=&07000021:REM menu icon flags $(menspc%+12)="Quit":REM menu icon data menspc%+=24 mainmenu%=start% ENDPROC : DEFPROCshowmenu(menu%,x%,y%) REM opens menu at given coordinates topmenu%=menu%:topx%=x%:topy%=y% SYS "Wimp_CreateMenu",,menu%,x%,y% ENDPROC : DEFPROCmenuclick REM handles mouse clicks on menu in response to Wimp_Poll reason code 9 LOCAL c%,adj% c%=b%+900 SYS "Wimp_GetPointerInfo",,c% adj%=(c%!8 AND 1) SYS "Wimp_DecodeMenu",,topmenu%,b%,c% CASE $c% OF WHEN "Quit":quit%=TRUE WHEN "Info":VDU 7 ENDCASE IF adj% PROCshowmenu(topmenu%,topx%,topy%) ENDPROC :