home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / discutils / bootup / makeboot / !MakeBoot / Source (.txt) < prev   
Encoding:
RISC OS BBC BASIC V Source  |  1993-12-06  |  32.4 KB  |  1,534 lines

  1.  ><MakeBoot$Dir>.Source
  2.  This application is FreeWare. (c) 1993 Dick Alstein
  3. Appl$="MakeBoot"
  4. Version$="1.14 (6-12-93)"
  5. error
  6. quit%=
  7. )mask%=1+(1<<4)+(1<<5)+(1<<11)+(1<<12)
  8.  "Wimp_Poll",mask%,blk% 
  9.  reason%
  10.  reason% 
  11.  1 : 
  12. redraw(blk%!0)
  13.  2 : 
  14.  "Wimp_OpenWindow",,blk%
  15.  blk%!0 
  16. !      
  17.  winhdl%(0),winhdl%(1)
  18. .        
  19.  "Wimp_GetPointerInfo",,ptrinfo%
  20.         
  21.  ptrinfo%!8=1 
  22. )          
  23.  "Filer_OpenDir "+bootdir$
  24.         
  25.         
  26.  -1) 
  27. )          
  28.  "Wimp_CloseWindow",,blk%
  29.         
  30.       
  31. '        
  32.  "Wimp_CloseWindow",,blk%
  33.         
  34.  6 : 
  35. mouseclick(blk%!0,blk%!4,blk%!8,blk%!12,blk%!16)
  36.  7 : 
  37. moveappl
  38.  8 : 
  39. key(blk%!0,blk%!4,blk%!24)
  40.  9 : 
  41. menuselect(blk%)
  42.  17,18 : 
  43. receive(blk%!4,blk%!8,blk%!16)
  44.  quit%
  45. msg_exit
  46.  "Wimp_CloseDown"
  47.  buf%,w%,i%
  48.  errblk% &100
  49.  "Wimp_Initialise",200,&4B534154,Appl$ 
  50.  osversion%,thistask%
  51. error : 
  52.  blk% &600
  53. indsize%=&600
  54.  indir% indsize%
  55. indirend%=indir%+indsize%
  56.  ptrinfo% 20
  57.  dragblk% 60
  58.  scrapblk% 256
  59.  "OS_ReadVarVal","MakeBoot$Dir",scrapblk%,256,0 
  60.  ,,len%
  61. scrapblk%?len%=13
  62. ApplDir$=$(scrapblk%)
  63. ApplPath$="MakeBootRes:"
  64. msg_init
  65. scrapblk%!0=-1
  66. :!scrapblk%!4=0 : scrapblk%!8=0
  67. ;%scrapblk%!12=82 : scrapblk%!16=68
  68. scrapblk%!20=&7000301A
  69. $(scrapblk%+24)="!makeboot"
  70.  "Wimp_CreateIcon",,scrapblk% 
  71.  baricon%
  72.  winhdl%(1)
  73.  wintitle%(1)
  74. maxapps%=256
  75.  "Wimp_OpenTemplate",,ApplPath$+"Templates"
  76. C"infowin%=
  77. loadtemplate("Info")
  78. D!$(blk%!(92+3*32+20))=Version$
  79. E'winhdl%(0)=
  80. loadtemplate("BootSeq")
  81. icon0xmin%=blk%!(92+0*32+0)
  82. icon0xmax%=blk%!(92+0*32+8)
  83. icon0ymin%=blk%!(92+0*32+4)
  84. icon1xmin%=blk%!(92+1*32+0)
  85. icon1xmax%=blk%!(92+1*32+8)
  86. icon2xmin%=blk%!(92+2*32+0)
  87. icon2xmax%=blk%!(92+2*32+8)
  88. itemheight%=80
  89. wintitle%(0)=blk%!76
  90.  i% (blk%!84)
  91. wintitle%(1)=i%
  92. blk%!76=wintitle%(1)
  93.  "Wimp_CreateWindow",,blk%+4 
  94.  winhdl%(1)
  95. S($(wintitle%(0))=
  96. msg_lookup0("BSEQ")
  97. T)$(wintitle%(1))=
  98. msg_lookup0("DBSEQ")
  99. U#filewin%=
  100. loadtemplate("Files")
  101. V#filename_dir%=blk%!(92+2*32+20)
  102. W$filename_leaf%=blk%!(92+3*32+20)
  103. X(saveseqwin%=
  104. loadtemplate("SaveSeq")
  105. Y"saveseq_dir%=blk%!(92+2*32+20)
  106. Z#saveseq_leaf%=blk%!(92+3*32+20)
  107. [(dialogwin%=
  108. loadtemplate("Dialogue")
  109. dial_msg%=blk%!(92+20)
  110. ]<dial_buttoncol%=(blk%!(92+1*32+16)) 
  111.  ((1<<2)+(&FF<<24))
  112.  dial_text%(3)
  113. _#dial_text%(1)=blk%!(92+1*32+20)
  114. `#dial_text%(2)=blk%!(92+2*32+20)
  115. a#dial_text%(3)=blk%!(92+3*32+20)
  116.  "Wimp_CloseTemplate"
  117. nractions%=6
  118.  action%(nractions%)
  119.  i%=0 
  120.  nractions%
  121.  buf% 16
  122.   action%(i%)=buf%
  123. $(action%(0))="Run"
  124. $(action%(1))="Boot"
  125. $(action%(2))="IconSprites"
  126. l!$(action%(3))="Filer_OpenDir"
  127. $(action%(4))="ToolSprites"
  128. $(action%(5))="Filer_Boot"
  129. $(action%(6))="RMLoad"
  130.  Action$(nractions%+1)
  131.  i%=0 
  132.  nractions%
  133. r)  Action$(i%)=
  134. upcase($(action%(i%)))
  135.  nrapps%(1)
  136. nrapps%(0)=0
  137. nrapps%(1)=0
  138. w8applblksize%=0     : 
  139.  size of a block for item data
  140. x#applblksize%+=256  : 
  141.  pathname
  142. y#applblksize%+=12   : 
  143.  leafname
  144. applblksize%+=4    : 
  145.  type
  146. {4applblksize%+=16   : 
  147.  name of sprite to display
  148. |!applblksize%+=4    : 
  149.  action
  150. },applblksize%+=4    : 
  151.  "disabled" switch
  152. ~%applblksize%+=256  : 
  153.  parameters
  154.  appl%(1,maxapps%) : 
  155.  pointers to item data blocks
  156. heap_init
  157. initmenus
  158. readscreenvars
  159.  display%(1)    : 
  160.  0 -> Name + Action,  1 -> Full info
  161.  winxmin%(1),winymin%(1),winxmax%(1),winymax%(1)
  162. choices_load
  163. selecticon(saveseqwin%,5,makebackup%)
  164.  changed%(1)
  165. changed%(0)=
  166. changed%(1)=
  167. 8shutdown_ok%=
  168.  allow shutdown with changes made?
  169. *bootdir$=
  170. striproot(ApplDir$)+".!Boot"
  171.  seqfname$(1)
  172. seqfname$(0)="!Run"
  173. seqfname$(1)="DeskBoot"
  174. loadall
  175. redraw(handle%)
  176.  w%,more%,top%,linenr%,lastline%
  177.  handle%=winhdl%(0) 
  178.   w%=0
  179.   w%=1
  180. blk%!0=handle%
  181.  "Wimp_RedrawWindow",,blk% 
  182.  more%
  183. #top%=blk%!16-blk%!24+icon0ymin%
  184.  more%
  185. *  linenr%=(top%-blk%!40) 
  186.  itemheight%
  187. ,  lastline%=(top%-blk%!32) 
  188.  itemheight%
  189.  linenr%<=lastline%
  190. 0    
  191.  (linenr%<nrapps%(w%)) 
  192.  (linenr%>=0) 
  193. )      
  194.  print item data for this line
  195.       b%=appl%(w%,linenr%)
  196. #      scrapblk%!0=icon0xmin%+12
  197.        scrapblk%!8=icon0xmax%
  198. 7      scrapblk%!12=icon0ymin%-(itemheight%*linenr%)
  199. 0      scrapblk%!4=(scrapblk%!12)-itemheight%
  200.       
  201.  b%!292 
  202. "        scrapblk%!16=&13400133
  203.       
  204. "        scrapblk%!16=&17000133
  205.       
  206.       scrapblk%!20=b%+256
  207.       scrapblk%!24=b%+272
  208.       scrapblk%!28=12
  209. '      
  210.  "Wimp_PlotIcon",,scrapblk%
  211.        scrapblk%!0=icon1xmin%
  212.        scrapblk%!8=icon1xmax%
  213.       
  214.  b%!292 
  215. "        scrapblk%!16=&13000131
  216.       
  217. "        scrapblk%!16=&1B000131
  218.       
  219. &      scrapblk%!20=action%(b%!288)
  220.       scrapblk%!28=-1
  221.       scrapblk%!32=16
  222. '      
  223.  "Wimp_PlotIcon",,scrapblk%
  224.       
  225.  display%(w%)=1 
  226. "        scrapblk%!0=icon2xmin%
  227. "        scrapblk%!8=icon2xmax%
  228.         
  229.  b%!292 
  230. $          scrapblk%!16=&13000131
  231.         
  232. $          scrapblk%!16=&18000131
  233.         
  234.         scrapblk%!20=b%+296
  235.         scrapblk%!28=-1
  236.         scrapblk%!32=256
  237. )        
  238.  "Wimp_PlotIcon",,scrapblk%
  239.       
  240.         
  241.     linenr%+=1
  242.  "Wimp_GetRectangle",,blk% 
  243.  more%
  244. coordtolinenr(w%,y%)
  245.  yc%,l%
  246. scrapblk%!0=winhdl%(w%)
  247.  "Wimp_GetWindowState",,scrapblk%
  248. /yc%=scrapblk%!16-scrapblk%!24+icon0ymin%-y%
  249.  yc%<0 
  250.   l%=-1
  251.   l%=yc% 
  252.  itemheight%
  253.  l%>nrapps%(w%) 
  254.  l%=nrapps%(w%)
  255. coordtofieldnr(w%,x%)
  256. scrapblk%!0=winhdl%(w%)
  257.  "Wimp_GetWindowState",,scrapblk%
  258.  x%-=scrapblk%!4-scrapblk%!20
  259.  x%<icon1xmin% 
  260.   f%=0
  261.  x%<icon2xmin% 
  262.     f%=1
  263.     f%=2
  264. addappl(w%,name$,type%,action%,args$,off%,nr%)
  265.  b%,i%,spr$
  266.  nrapps%(w%)=maxapps% 
  267. dialogue(0)
  268.  nr%<0 
  269.  nr%=0
  270.  nr%<nrapps%(w%) 
  271. 3    
  272.  inserting in sequence - shift other items
  273. #    
  274.  i%=nrapps%(w%) 
  275.  nr% 
  276. %      appl%(w%,i%+1)=appl%(w%,i%)
  277.     nr%=nrapps%(w%)
  278.    b%=
  279. heap_get(applblksize%)
  280.   appl%(w%,nr%)=b%
  281.   $(b%)=name$
  282.    $(b%+256)=
  283. leafname(name$)
  284.   b%!268=type%
  285.  type% 
  286. !    
  287.  0     : spr$="file_???"
  288. "    
  289.  &1000 : spr$="directory"
  290.  &2000
  291. #      
  292. sprexists($(b%+256)) 
  293.         spr$=$(b%+256)
  294.       
  295.         spr$="application"
  296.       
  297.  &FFFFFFFF
  298.       spr$="file_xxx"
  299.         
  300.        spr$="file_"+
  301. ~(type%)
  302.        
  303. sprexists(spr$) 
  304.         spr$="file_xxx"
  305.       
  306.   $(b%+272)="S"+spr$
  307.  action%=-1 
  308. +    
  309.  attach default action to new item
  310.  type% 
  311.       
  312.  &1000 : b%!288=3
  313.       
  314.  &2000
  315. *        
  316.  (osversion%>=300) 
  317.  (w%=1) 
  318.           b%!288=5
  319.         
  320. -          
  321. fileexists(name$+".!Boot") 
  322.             b%!288=1
  323.           
  324. 2            
  325. fileexists(name$+".!Sprites") 
  326.               b%!288=1
  327.             
  328.               b%!288=0
  329.             
  330.           
  331.         
  332.       
  333.  &FF9  : b%!288=2
  334.       
  335.  &FFA  : b%!288=6
  336.       
  337.   : b%!288=0
  338. &        
  339.     b%!288=action%
  340.   b%!292=off%
  341.   $(b%+296)=args$
  342.   nrapps%(w%)+=1
  343. setextent(w%)
  344. setchanged(w%,
  345. redrawfromline(w%,nr%)
  346. redrawline(w%,linenr%)
  347.  xmin%,ymin%,xmax%,ymax%
  348. xmin%=icon0xmin%+12
  349. xmax%=icon2xmax%
  350. 7*ymax%=icon0ymin%-(itemheight%*linenr%)
  351. ymin%=ymax%-itemheight%
  352.  "Wimp_ForceRedraw",winhdl%(w%),xmin%,ymin%,xmax%,ymax%
  353. redrawfromline(w%,linenr%)
  354.  xmin%,ymin%,xmax%,ymax%
  355. xmin%=icon0xmin%+12
  356. xmax%=icon2xmax%
  357. @*ymax%=icon0ymin%-(itemheight%*linenr%)
  358. ymin%=-10000
  359.  "Wimp_ForceRedraw",winhdl%(w%),xmin%,ymin%,xmax%,ymax%
  360. clearsequence(w%)
  361.  nrapps%(w%)>0
  362. deleteappl(w%,nrapps%(w%)-1)
  363. deleteappl(w%,nr%)
  364. heap_release(appl%(w%,nr%))
  365.  i%=nr% 
  366.  (nrapps%(w%)-1)
  367. P!  appl%(w%,i%)=appl%(w%,i%+1)
  368. nrapps%(w%)-=1
  369. redrawfromline(w%,nr%)
  370. setchanged(w%,
  371. setextent(w%)
  372. dirname(F$)
  373.  p%,q%
  374. F$,".",p%)
  375.  q% > 0 
  376.  p%=q%+1
  377.  q%=0
  378. F$,p%-2)
  379. errbox(err$,boxes%)
  380. errblk%!0=0
  381. $(errblk%+4)=err$+
  382.  "Wimp_ReportError",errblk%,boxes%,Appl$ 
  383.  ,click%
  384. =(click%=1)
  385. error
  386.  "Wimp_CloseDown" : 
  387. errbox(
  388. $+" (line "+
  389. )+")",3) 
  390.  "Wimp_CloseDown"
  391. direxists(f$)
  392.  type%,flags%
  393. type%=0
  394. (f$)>0 
  395.  "XOS_File",17,f$ 
  396.  type%;flags%
  397. =(type%=2)
  398. ((flags% 
  399.  1)=0)
  400. fileexists(f$)
  401.  type%,flags%
  402. type%=0
  403. (f$)>0 
  404.  "XOS_File",17,f$ 
  405.  type%;flags%
  406. =(type%=1)
  407. ((flags% 
  408.  1)=0)
  409. seqfname(i%)
  410. =bootdir$+"."+seqfname$(i%)
  411. key(window%,icon%,key%)
  412.  window% 
  413.  filewin%
  414. !    
  415.  (icon%=3) 
  416.  (key%=13) 
  417. #      bootdir$=$(filename_dir%)
  418. (      seqfname$(1)=$(filename_leaf%)
  419. #      
  420. selecticon(filewin%,4,1)
  421. "      
  422.  "Wimp_CreateMenu",,-1
  423. #      
  424. selecticon(filewin%,4,0)
  425.         
  426. #      
  427.  "Wimp_ProcessKey",key%
  428.         
  429. !    
  430.  "Wimp_ProcessKey",key%
  431. leafname(f$)
  432.  p%,q%
  433.   p%=q%+1
  434.   q%=
  435. f$,".",p%)
  436.  q%=0
  437. f$,p%)
  438.  --- split name of root directory from pathname ---
  439. striproot(f$)
  440.  p%,q%
  441. f$,"$")
  442.  q%>0
  443.   p%=q%
  444.   q%=
  445. f$,"$",p%+1)
  446. f$,p%)
  447. loadall
  448.  i%,loaderror%
  449. loaderror%=0
  450.  "Hourglass_On"
  451. direxists(bootdir$) 
  452.  i%=0 
  453. &    
  454. fileexists(
  455. seqfname(i%)) 
  456.       
  457. loadsequence(i%)
  458.         
  459. *      
  460.  loaderror%=0 
  461.  loaderror%=1+i%
  462.         
  463.   loaderror%=4
  464.  "Hourglass_Off"
  465. setextent(0)
  466. setextent(1)
  467.  loaderror% 
  468.  1 : 
  469. dialogue(1)
  470.  2 : 
  471. dialogue(2)
  472.  3 : 
  473. dialogue(3)
  474.  4 : 
  475. dialogue(4)
  476. loadsequence(w%)
  477.  p%,in$,cmd$,file$,arg$,act%,tagfound%,disabled%
  478. tagfound%=
  479. seqfname(w%))
  480. error : 
  481.   in$=
  482.   p%=
  483. in$,"|")
  484.   disabled%=(p%=1)
  485.  p%>0 
  486.  tagfound% 
  487. '      tagfound%=(
  488. in$,Appl$,p%)<>0)
  489.         
  490.  disabled% 
  491.       in$=
  492. in$,p%+1)
  493.         
  494.   p%=
  495. in$," ")
  496. )  cmd$=
  497. upcase(
  498. trimleft(
  499. in$,p%-1)))
  500.   in$=
  501. trimleft(
  502. in$,p%+1))
  503.   p%=
  504. in$," ")
  505.   file$=
  506. in$,p%-1)
  507.    arg$=
  508. trimleft(
  509. in$,p%+1))
  510. cmd$,1)="*"
  511. 9    cmd$=
  512. cmd$,2) : 
  513.  strip leading "*"s from command
  514. cmd$,1)="%" 
  515. 8    cmd$=
  516. cmd$,2) : 
  517.  strip leading "%" from command
  518.  (cmd$<>"") 
  519.  (file$<>"") 
  520.     act%=0
  521. 5    
  522.  (act%<=nractions%) 
  523.  (cmd$<>Action$(act%))
  524.       act%+=1
  525.         
  526.  (act%<=nractions%) 
  527.       
  528.  act% 
  529.         
  530. 3          
  531. upcase(
  532. leafname(file$))="!BOOT" 
  533.             act%=1
  534. %            file$=
  535. dirname(file$)
  536.           
  537.         
  538. :          
  539. upcase(
  540. leafname(file$)),8)="!SPRITES" 
  541. 6            
  542. leafname(
  543. dirname(file$)),1)="!" 
  544.               act%=1
  545. '              file$=
  546. dirname(file$)
  547.             
  548.           
  549.       
  550. N      
  551. addappl(w%,file$,
  552. objtype(file$),act%,arg$,disabled%,nrapps%(w%)+1)
  553.         
  554. 9      
  555.  (cmd$="DESKTOP") 
  556.  (file$="-File") 
  557.  (w%=0) 
  558. (        seqfname$(1)=
  559. leafname(arg$)
  560.       
  561.         
  562.  tagfound%) 
  563.  (loaderror%=0) 
  564.   loaderror%=3
  565. setchanged(w%,
  566. loadtemplate(name$)
  567.  handle%
  568.  "Wimp_CloseTemplate" : 
  569. error
  570.  "Wimp_LoadTemplate",,blk%+4,indir%,indirend%,-1,name$,0 
  571.  ,,indir%
  572.  "Wimp_CreateWindow",,blk%+4 
  573.  handle%
  574. =handle%
  575. mouseclick(xpos%,ypos%,button%,wndw%,icon%)
  576.  w%,linenr%,field%,data%
  577.  wndw% 
  578.  button% 
  579.       
  580. $        
  581. closewindow(winhdl%(0))
  582. $        
  583. closewindow(winhdl%(1))
  584.       
  585.         
  586. openwindow(0,1)
  587.         
  588. openwindow(1,1)
  589.       
  590. +        
  591. showmenu(blk%,mainmenu%,-1,-1)
  592.         
  593.  winhdl%(0),winhdl%(1)
  594.  wndw%=winhdl%(0) 
  595.       w%=0
  596.         
  597.       w%=1
  598.         
  599. (    linenr%=
  600. coordtolinenr(w%,ypos%)
  601.  +    
  602.  linenr%>=nrapps%(w%) 
  603.  linenr%=-1
  604. !(    field%=
  605. coordtofieldnr(w%,xpos%)
  606. ".    
  607.  linenr%>=0 
  608.  data%=appl%(w%,linenr%)
  609.  button% 
  610.       
  611.  2 : 
  612.  menu button
  613. %/        
  614. showmenu(blk%,seqmenu%,w%,linenr%)
  615.       
  616. ')        
  617.  (linenr%>=0) 
  618.  (field%=1) 
  619. ('          
  620.  adjust button on action
  621.           
  622.             
  623.  data%!288=0 
  624. +&              data%!288=nractions%
  625.             
  626.               data%!288-=1
  627.             
  628. /4          
  629. validaction(data%!288,w%,data%!268)
  630. 0%          
  631. redrawline(w%,linenr%)
  632.           
  633. setchanged(w%,
  634.         
  635. 3)        
  636.  (linenr%>=0) 
  637.  (field%=0) 
  638. 4*          
  639.  adjust button on item name
  640. 5%          data%!292=
  641.  (data%!292)
  642. 6%          
  643. redrawline(w%,linenr%)
  644.           
  645. setchanged(w%,
  646.         
  647.       
  648. :)        
  649.  (linenr%>=0) 
  650.  (field%=1) 
  651. ;'          
  652.  select button on action
  653.           
  654. =(            
  655.  data%!288=nractions% 
  656.               data%!288=0
  657.             
  658.               data%!288+=1
  659.             
  660. B4          
  661. validaction(data%!288,w%,data%!268)
  662. C%          
  663. redrawline(w%,linenr%)
  664.           
  665. setchanged(w%,
  666.         
  667. F%      
  668.  4*16 : 
  669.  drag with select
  670. GA        
  671.  (linenr%>=0) 
  672.  (linenr%<nrapps%(w%)) 
  673.  (field%=0) 
  674. H$          
  675. startdrag(w%,linenr%)
  676.         
  677. J        
  678.  filewin%
  679.  icon% 
  680.       
  681. N%        bootdir$=$(filename_dir%)
  682. O*        seqfname$(1)=$(filename_leaf%)
  683. P$        
  684.  "Wimp_CreateMenu",,-1
  685. Q        
  686.  saveseqwin%
  687.  icon% 
  688.       
  689. U$        
  690.  "Wimp_CreateMenu",,-1
  691. V(        
  692. savesequence(lastmenu_seq%)
  693.       
  694. X%        makebackup%=
  695.  makebackup%
  696. Y        
  697.  dialogwin%
  698. [     
  699.  "Wimp_CreateMenu",,-1
  700.  lastdialogue% 
  701.       
  702.         
  703.  icon%=1 
  704.  quit%=
  705.       
  706.         
  707.  icon%=1 
  708. a)          
  709.  resume shutdown procedure
  710.           shutdown_ok%=
  711. c3          
  712.  "Wimp_GetCaretPosition",,scrapblk%
  713.           scrapblk%!24=&1FC
  714. e>          
  715.  "Wimp_SendMessage",8,scrapblk%,prequitsender%
  716.         
  717. g        
  718.  --- open a sequence window
  719.      pos%=0 -> at current position
  720.      pos%=1 -> at position as read from choices
  721.      pos%=2 -> at current position, full width
  722. openwindow(w%,pos%)
  723. blk%!0=winhdl%(w%)
  724.  "Wimp_GetWindowInfo",,blk%
  725. blk%!28=-1
  726.  pos% 
  727.     blk%!4=winxmin%(w%)
  728.     blk%!8=winymin%(w%)
  729.     blk%!12=winxmax%(w%)
  730.     blk%!16=winymax%(w%)
  731. z(    blk%!12=blk%!4+(blk%!52-blk%!44)
  732.  "Wimp_OpenWindow",,blk%
  733. closewindow(handle%)
  734. scrapblk%!0=handle%
  735.  "Wimp_CloseWindow",,scrapblk%
  736. moveappl
  737.  w%,linenr%,a%,i%
  738.  dragasprite% 
  739.  "DragASprite_Stop"
  740.  "Wimp_GetPointerInfo",,ptrinfo%
  741.     w%=-1
  742.  ptrinfo%!12=winhdl%(0) 
  743.  w%=0
  744.  ptrinfo%!12=winhdl%(1) 
  745.  w%=1
  746.  w%<>-1 
  747. +  linenr%=
  748. coordtolinenr(w%,ptrinfo%!4)
  749.  linenr%<0 
  750.  linenr%=0
  751. *  a%=appl%(dragfromwin%,dragfromline%)
  752.  w%=dragfromwin% 
  753. 6    
  754.  linenr%>=nrapps%(w%) 
  755.  linenr%=nrapps%(w%)-1
  756. !    
  757.  dragfromline%>linenr% 
  758.       
  759.  move down
  760. /      
  761.  i%=(dragfromline%-1) 
  762.  linenr% 
  763. '        appl%(w%,i%+1)=appl%(w%,i%)
  764.       
  765.       appl%(w%,linenr%)=a%
  766. %      
  767. redrawfromline(w%,linenr%)
  768.         
  769. !    
  770.  dragfromline%<linenr% 
  771.       
  772.  move up
  773. *      
  774.  i%=dragfromline% 
  775.  (linenr%-1)
  776. '        appl%(w%,i%)=appl%(w%,i%+1)
  777.       
  778.       appl%(w%,linenr%)=a%
  779. +      
  780. redrawfromline(w%,dragfromline%)
  781.         
  782. $    
  783.  (dragfromline%<>linenr%) 
  784.       
  785. setchanged(w%,
  786.         
  787.  move to other window
  788.      
  789.  nrapps%(w%)<maxapps% 
  790. C      
  791. addappl(w%,$(a%),a%!268,a%!288,$(a%+296),a%!292,linenr%)
  792. 1      
  793. deleteappl(dragfromwin%,dragfromline%)
  794.         
  795. readscreenvars
  796.  xeig%,yeig%,xpixels%,ypixels%
  797.  "OS_ReadModeVariable",-1,4 
  798.  ,,xeig%
  799.  "OS_ReadModeVariable",-1,5 
  800.  ,,yeig%
  801.  "OS_ReadModeVariable",-1,11 
  802.  ,,xpixels%
  803.  "OS_ReadModeVariable",-1,12 
  804.  ,,ypixels%
  805. unitsppixel_x%=1<<xeig%
  806. unitsppixel_y%=1<<yeig%
  807. Iscreensize_x%=(xpixels%+1)*unitsppixel_x% : 
  808.  screen size in OS units
  809. -screensize_y%=(ypixels%+1)*unitsppixel_y%
  810. receive(sender%,ref%,code%)
  811.  w%,ack%,file$,type%,hlp$,linenr%,field%
  812. ack%=0
  813.  sender% <> thistask% 
  814.  code% 
  815.       quit%=
  816.       file$=
  817. str(blk%+44)
  818.       type%=blk%!40
  819.       
  820.  blk%!20 
  821. #        
  822.  winhdl%(0),winhdl%(1)
  823. &          
  824.  (blk%!20=winhdl%(0)) 
  825.             w%=0
  826.           
  827.             w%=1
  828.           
  829. I          
  830. addappl(w%,file$,type%,-1,"",0,
  831. coordtolinenr(w%,blk%!32))
  832.           ack%=4
  833.         
  834. 4          
  835.  (blk%!24=baricon%) 
  836.  (type%=&2000) 
  837. 0            
  838. upcase(
  839. file$,7))="$.!BOOT" 
  840.                bootdir$=file$
  841. #              
  842. clearsequence(0)
  843. #              
  844. clearsequence(1)
  845.               
  846. loadall
  847.               ack%=4
  848.             
  849.           
  850.       
  851.       
  852.  desktop shutdown
  853. <      
  854.  (changed%(0) 
  855.  changed%(1)) 
  856.  shutdown_ok%) 
  857.         ack%=8
  858. "        prequitsender%=sender%
  859.         
  860. dialogue(8)
  861.       
  862.  &502
  863. *      
  864.  request from !Help application
  865.       hlp$=""
  866.       icon%=blk%!36
  867.       
  868.  blk%!32 
  869.         
  870.            
  871.  icon%=baricon% 
  872. -            hlp$=
  873. msg_lookup0("HLP_IBAR")
  874.           
  875. #        
  876.  winhdl%(0),winhdl%(1)
  877. $          
  878.  blk%!32=winhdl%(0) 
  879.             w%=0
  880. -            hlp$=
  881. msg_lookup0("HLP_SEQ0")
  882.           
  883.             w%=1
  884. -            hlp$=
  885. msg_lookup0("HLP_SEQ1")
  886.           
  887. 0          linenr%=
  888. coordtolinenr(w%,blk%!24)
  889. 0          field%=
  890. coordtofieldnr(w%,blk%!20)
  891. B          
  892.  (icon%<0) 
  893.  (linenr%>=0) 
  894.  (linenr%<nrapps%(w%)) 
  895.             
  896.  field% 
  897. ;              
  898.  0 : hlp$+="|M"+
  899. msg_lookup0("HLP_ITEM")
  900. ;              
  901.  1 : hlp$+="|M"+
  902. msg_lookup0("HLP_ACTN")
  903. ;              
  904.  2 : hlp$+="|M"+
  905. msg_lookup0("HLP_ARGS")
  906.             
  907.           
  908.         
  909.  filewin%
  910. +          hlp$=
  911. msg_lookup0("HLP_FILE")
  912.       
  913.       
  914.  hlp$<>"" 
  915.         $(blk%+20)=hlp$
  916.         ack%=&503
  917.       
  918.  &400C0
  919. #      $(filename_dir%)=bootdir$
  920. (      $(filename_leaf%)=seqfname$(1)
  921. :      
  922.  "Wimp_CreateSubMenu",,blk%!20,blk%!24,blk%!28
  923.  &400C1
  924.       
  925. readscreenvars
  926.  ack%>0 
  927.     blk%!0=256
  928.     blk%!12=ref%
  929.     blk%!16=ack%
  930. -    
  931.  "Wimp_SendMessage",17,blk%,sender%
  932. saveall
  933. savesequence(0)
  934. savesequence(1)
  935. savesequence(w%)
  936.  fn$,bfn$,i%,data%
  937. direxists(bootdir$) 
  938. dialogue(7)
  939. error : 
  940.   fn$=
  941. seqfname(w%)
  942.  makebackup% 
  943. fileexists(fn$) 
  944. 8    bfn$=
  945. dirname(fn$)+"."+
  946. leafname(fn$),6)+"_bak"
  947. fileexists(bfn$) 
  948.       
  949.  "Delete "+bfn$
  950. "        
  951. #     
  952.  "Rename "+fn$+" "+bfn$
  953.   F%=
  954.  (fn$)
  955. #F%,"|"
  956. #F%,"| "+
  957. msg_lookup1("PRO1",Version$)
  958. #F%,"| "+
  959. msg_lookup0("PRO2")
  960. #F%,"|";
  961.  nrapps%(w%)>0 
  962. #F%,""
  963.  i%=0 
  964.  nrapps%(w%)-1
  965.       data%=appl%(w%,i%)
  966.       
  967.  data%!292 
  968.         
  969. #F%,"|";
  970.       
  971.       
  972.  data%!268=&2000 
  973.         
  974.  data%!288 
  975.           
  976. 42            
  977. fileexists($(data%)+".!Boot") 
  978. 50              
  979. #F%,"Run "+$(data%)+".!Boot";
  980.             
  981. 7;              
  982. #F%,"IconSprites "+$(data%)+".!Sprites";
  983.             
  984.           
  985. :8            
  986. #F%,$(action%(data%!288))+" "+$(data%);
  987.         
  988.       
  989. =4        
  990. #F%,$(action%(data%!288))+" "+$(data%);
  991.       
  992.       
  993. #F%," "+$(data%+296)
  994.  w%=0 
  995. #F%,""
  996. D,    
  997. #F%,"%Desktop -File "+
  998. seqfname(1);
  999.  "OS_File",18,
  1000. seqfname(w%),&FEB
  1001. setchanged(w%,
  1002. setchanged(w%,newval%)
  1003.  changed%(w%) 
  1004.  newval% 
  1005.   t$=$(wintitle%(w%))
  1006.  changed%(w%) 
  1007. Q%    $(wintitle%(w%))=
  1008. (t$)-2)
  1009. S     $(wintitle%(w%))=t$+" *"
  1010. U!  changed%(w%)=
  1011.  changed%(w%)
  1012.   blk%!0=winhdl%(w%)
  1013.  "Wimp_GetWindowState",,blk%
  1014.  (blk%!32 
  1015.  (1<<16)) 
  1016. YH    
  1017.  "Wimp_ForceRedraw",-1,blk%!4,(blk%!16)+4,blk%!12,(blk%!16)+36
  1018. setextent(w%)
  1019.  lines%
  1020. lines%=nrapps%(w%)+1
  1021.  lines%<2 
  1022.  lines%=2
  1023. scrapblk%!0=0
  1024. c/scrapblk%!4=icon0ymin%-itemheight%*lines%-8
  1025.  display%(w%)=1 
  1026.   scrapblk%!8=icon2xmax%-1
  1027.   scrapblk%!8=icon1xmax%-1
  1028. scrapblk%!12=0
  1029.  "Wimp_SetExtent",winhdl%(w%),scrapblk%
  1030. scrapblk%!0=winhdl%(w%)
  1031.  "Wimp_GetWindowState",,scrapblk%
  1032.  (scrapblk%!32 
  1033.  (1<<16)) 
  1034.  "Wimp_OpenWindow",,scrapblk%
  1035. sprexists(sp$)
  1036.  flags%
  1037.  "XWimp_SpriteOp",&18,,sp$ 
  1038.  ;flags%
  1039. =((flags% 
  1040.  1)=0)
  1041. startdrag(w%,linenr%)
  1042.  b%,spr$,width%
  1043. blk%!0=winhdl%(w%)
  1044.  "Wimp_GetWindowState",,blk%
  1045. dragblk%!4=5
  1046. dragblk%!8=(blk%!4)+4
  1047. {Hdragblk%!12=(blk%!16)+icon0ymin%-((linenr%+1)*itemheight%)-(blk%!24)
  1048.  display%(w%)=0 
  1049. }%  width%=icon1xmax%-icon0xmin%-16
  1050. %  width%=icon2xmax%-icon0xmin%-16
  1051. #dragblk%!16=(dragblk%!8)+width%
  1052. 8dragblk%!20=(dragblk%!12)+itemheight%-unitsppixel_y%
  1053. dragblk%!24=0
  1054. dragblk%!28=0
  1055. dragblk%!32=xpixels%
  1056. dragblk%!36=ypixels%
  1057.  "OS_Byte",161,&1C 
  1058.  ,,b% : 
  1059.  read "dragasprite" bit in CMOS RAM (RO3)
  1060. dragasprite%=(b% 
  1061.  2)<>0
  1062.  dragasprite% 
  1063.  "Wimp_GetPointerInfo",,ptrinfo%
  1064.   dragblk%!8=ptrinfo%!0-100
  1065.    dragblk%!16=ptrinfo%!0+100
  1066. %  spr$=$(appl%(w%,linenr%)+272+1)
  1067.  "DragASprite_Start",&E5,1,spr$,dragblk%+8,dragblk%+24
  1068.  "Wimp_DragBox",1,dragblk%
  1069. dragfromwin%=w%
  1070. dragfromline%=linenr%
  1071. str(s%)
  1072.  i%,n$
  1073.  s%?i% >= 32 : n$+=
  1074. (s%?i%) : i%+=1 : 
  1075. trimleft(s$)
  1076. s$,p%,1)=" "
  1077.   p%+=1
  1078. s$,p%)
  1079. upcase(s$)
  1080.  i%=1 
  1081.   a%=
  1082. s$,i%,1))
  1083.  (a%>=97)
  1084. (a%<=122) 
  1085. s$,i%,1)=
  1086. (a%-32)
  1087. objtype(name$)
  1088.  type%,loadaddr%
  1089.  "OS_File",17,name$ 
  1090.  type%,,loadaddr%
  1091.  type% 
  1092. (    
  1093.  ((loadaddr%>>20)
  1094.  &FFF)=&FFF 
  1095. %      type%=(loadaddr%>>8) 
  1096.  &FFF
  1097.         
  1098.       type%=-1
  1099.         
  1100. $    
  1101. leafname(file$),1)="!" 
  1102.       type%=&2000
  1103.         
  1104.       type%=&1000
  1105.         
  1106. =type%
  1107. validaction(action%,window%,type%)
  1108.  valid%
  1109.  type% 
  1110.  &FF9
  1111.     valid%=(action%=2)
  1112. 7    
  1113.  osversion%>=300 
  1114.  valid%=valid% 
  1115.  (action%=4)
  1116.  &FFA
  1117. (    valid%=(action%=0) 
  1118.  (action%=6)
  1119.  &1000
  1120.     valid%=(action%=3)
  1121.  &2000
  1122.  action% 
  1123.       
  1124.  0,1   : valid%=
  1125. &      
  1126.  3     : valid%=(window%=1)
  1127. :      
  1128.  5     : valid%=(osversion%>=300) 
  1129.  (window%=1)
  1130.       
  1131.   : valid%=
  1132.         
  1133.     valid%=(action%=0)
  1134. =valid%
  1135. seticonstate(window%,icon%,eor%,clr%)
  1136. scrapblk%!0=window%
  1137. scrapblk%!4=icon%
  1138. scrapblk%!8=eor%
  1139. scrapblk%!12=clr%
  1140.  "Wimp_SetIconState",,scrapblk%
  1141. selecticon(window%,icon%,f%)
  1142. scrapblk%!0=window%
  1143. scrapblk%!4=icon%
  1144.   scrapblk%!8=1<<21
  1145.   scrapblk%!8=0
  1146. scrapblk%!12=1<<21
  1147.  "Wimp_SetIconState",,scrapblk%
  1148. menuselect(selection%)
  1149.  adjust%,selinfo%,itemnr%,item%,item$,parentitem%,seq%,data%
  1150.  "MenuUtil_Decode",lastmenu%,selection% 
  1151.  ,adjust%,selinfo%
  1152. itemnr%=selinfo%!0
  1153. item%=selinfo%!8
  1154. item$=
  1155. str(selinfo%!12)
  1156. parentitem%=selinfo%!24
  1157. seq%=lastmenu_seq%
  1158.  lastmenu_line%>=0 
  1159.  data%=appl%(seq%,lastmenu_line%)
  1160.  item% 
  1161.  item_reread%
  1162. clearsequence(0)
  1163. clearsequence(1)
  1164. loadall
  1165.  item_saveall%
  1166. saveall
  1167.  item_savechoices%
  1168. choices_save
  1169.  item_quit%
  1170. %    
  1171.  changed%(0) 
  1172.  changed%(1) 
  1173.       
  1174. dialogue(6)
  1175.         
  1176.       quit%=
  1177.         
  1178.  item_display0%,item_display1%
  1179.      
  1180.  item%=item_display0% 
  1181.       display%(seq%)=0
  1182.         
  1183.       display%(seq%)=1
  1184.         
  1185. setextent(seq%)
  1186. openwindow(seq%,2)
  1187. redrawfromline(seq%,0)
  1188.  item_openparent%
  1189. -    
  1190.  "Filer_OpenDir "+
  1191. dirname($(data%))
  1192.  item_off%
  1193.     data%!292=
  1194.  (data%!292)
  1195. (    
  1196. redrawline(seq%,lastmenu_line%)
  1197. setchanged(seq%,
  1198.  item_delete%
  1199. (    
  1200. deleteappl(seq%,lastmenu_line%)
  1201.     lastmenu_line%=-1
  1202.  item_args%
  1203.     $(data%+296)=item$
  1204. (    
  1205. redrawline(seq%,lastmenu_line%)
  1206. setchanged(seq%,
  1207.  item_toroot%
  1208. %    $(data%)=
  1209. striproot($(data%))
  1210.     $(data%+256)="$"
  1211. (    
  1212. redrawline(seq%,lastmenu_line%)
  1213.  item_saveseq%
  1214. savesequence(seq%)
  1215.  adjust% 
  1216. showmenu(0,lastmenu%,lastmenu_seq%,lastmenu_line%)
  1217.  *** procs for creating menus ***
  1218. showmenu(blkptr%,menu%,seq%,linenr%)
  1219.  item$,b%,dy%
  1220. dy%=22
  1221.  menu% 
  1222.  seqmenu%
  1223. ,:    
  1224.  "MenuUtil_TickOnly",displaymenu%,display%(seq%)
  1225. -*    item$=
  1226. msg_lookup0("IT_ITEM")+" '"
  1227. .-    
  1228.  linenr%>=nrapps%(seq%) 
  1229.  linenr%=-1
  1230.  linenr%<0 
  1231. 0+      
  1232.  "MenuUtil_Fade",itemsubmenu%,1
  1233. 1.      
  1234.  "MenuUtil_Colours",item_item%,2,0
  1235. 2        
  1236. 3+      
  1237.  "MenuUtil_Fade",itemsubmenu%,0
  1238. 4.      
  1239.  "MenuUtil_Colours",item_item%,7,0
  1240. 5       b%=appl%(seq%,linenr%)
  1241.       item$+=$(b%+256)
  1242. 71      
  1243.  "MenuUtil_Text",item_args%,$(b%+292)
  1244. 8I      
  1245.  "MenuUtil_Fade",item_toroot%,(b%!268<>&1000)
  1246. ($(b%+256)="$")
  1247. 9L      
  1248.  "MenuUtil_Fade",item_openparent%,(b%!268=&1000)
  1249. ($(b%+256)="$")
  1250. ::      
  1251.  "MenuUtil_Tick",item_argsmenu%,
  1252. ($(b%+296))>0
  1253. ;-      
  1254.  "MenuUtil_Tick",item_off%,b%!292
  1255.       dy%+=44
  1256. =        
  1257.     item$+="'"
  1258. ?+    
  1259.  "MenuUtil_Text",item_item%,item$
  1260. @     $(saveseq_dir%)=bootdir$
  1261.  seq%=0 
  1262. B!      $(saveseq_leaf%)="!Run"
  1263. C        
  1264. D'      $(saveseq_leaf%)=seqfname$(1)
  1265. E        
  1266.  blkptr%<>0 
  1267.   blkptr%!4=blkptr%!4+dy%
  1268.   lastmenu%=menu%
  1269.   lastmenu_seq%=seq%
  1270.   lastmenu_line%=linenr%
  1271.  "MenuUtil_Show",lastmenu%,blkptr%
  1272. menu_add(text$,submenu%,genmsg%)
  1273.  handle%
  1274.  "MenuUtil_Add",,text$ 
  1275.  handle%
  1276.  submenu%<>-1 
  1277.  "MenuUtil_SubMenu",handle%,submenu%
  1278.  genmsg% 
  1279.  "MenuUtil_Warning",handle%,1
  1280. =handle%
  1281. menu_addwritable(maxlen%,validstr%)
  1282.  handle%
  1283.  "MenuUtil_Add",,"" 
  1284.  handle%
  1285.  "MenuUtil_Writable",,1,maxlen%,validstr%
  1286. =handle%
  1287. initmenus
  1288.  "MenuUtil_Initialise",010,0
  1289.  "MenuUtil_New",,Appl$ 
  1290.  mainmenu%
  1291. `<item_info%=
  1292. menu_add(
  1293. msg_lookup0("IT_INFO"),infowin%,0)
  1294. a8item_reread%=
  1295. menu_add(
  1296. msg_lookup0("IT_RERD"),-1,0)
  1297. b>item_fnames%=
  1298. menu_add(
  1299. msg_lookup0("IT_FNMS"),filewin%,1)
  1300. c9item_saveall%=
  1301. menu_add(
  1302. msg_lookup0("IT_SVAL"),-1,0)
  1303.  "MenuUtil_Dots",0,1
  1304. e=item_savechoices%=
  1305. menu_add(
  1306. msg_lookup0("IT_SVCH"),-1,0)
  1307. f6item_quit%=
  1308. menu_add(
  1309. msg_lookup0("IT_QUIT"),-1,0)
  1310.  "MenuUtil_New",,
  1311. msg_lookup0("IT_ARGS") 
  1312.  argsmenu%
  1313. h&item_args%=
  1314. menu_addwritable(64,0)
  1315.  "MenuUtil_New",,
  1316. msg_lookup0("DISP") 
  1317.  displaymenu%
  1318. j8item_display0%=
  1319. menu_add(
  1320. msg_lookup0("DISP0"),-1,0)
  1321. k8item_display1%=
  1322. menu_add(
  1323. msg_lookup0("DISP1"),-1,0)
  1324.  "MenuUtil_New",,
  1325. msg_lookup0("IT_ITEM") 
  1326.  itemsubmenu%
  1327. m4item_off%=
  1328. menu_add(
  1329. msg_lookup0("IT_OFF"),-1,0)
  1330. nAitem_argsmenu%=
  1331. menu_add(
  1332. msg_lookup0("IT_ARGS"),argsmenu%,0)
  1333. o<item_openparent%=
  1334. menu_add(
  1335. msg_lookup0("IT_OPAR"),-1,0)
  1336. p8item_toroot%=
  1337. menu_add(
  1338. msg_lookup0("IT_ROOT"),-1,0)
  1339.  "MenuUtil_Dots",0,1
  1340. r7item_delete%=
  1341. menu_add(
  1342. msg_lookup0("IT_DEL"),-1,0)
  1343.  "MenuUtil_New",,
  1344. msg_lookup0("IT_SEQ") 
  1345.  seqmenu%
  1346. t@item_display%=
  1347. menu_add(
  1348. msg_lookup0("DISP"),displaymenu%,0)
  1349. u+item_item%=
  1350. menu_add("",itemsubmenu%,0)
  1351. vBitem_saveseq%=
  1352. menu_add(
  1353. msg_lookup0("IT_SVSQ"),saveseqwin%,0)
  1354. lastmenu%=0
  1355.  *** procs for handling messages in the Messages file ***
  1356. msg_init
  1357.  fname$,flags%,size%,buf%
  1358. fname$=ApplPath$+"Messages"
  1359.  "MessageTrans_FileInfo",,fname$ 
  1360.  flags%,,size%
  1361.  flags% 
  1362.   buf%=0
  1363.  buf% size%
  1364.  MsgDesc% 17+
  1365. (fname$)
  1366. $(MsgDesc%+16)=fname$
  1367.  "MessageTrans_OpenFile",MsgDesc%,MsgDesc%+16,buf%
  1368. msg_exit
  1369.  "MessageTrans_CloseFile",MsgDesc%
  1370. MsgDesc%=0
  1371. msg_lookup0(token$)
  1372.  result%
  1373.  "MessageTrans_Lookup",MsgDesc%,token$,0 
  1374.  ,,result%
  1375. str(result%)
  1376. msg_lookup1(token$,param$)
  1377.  result%
  1378.  "MessageTrans_Lookup",MsgDesc%,token$,scrapblk%,&100,param$ 
  1379.  ,,result%
  1380. str(result%)
  1381. dialogue(no%)
  1382.  cancelbutton%,text1$,text2$,text3$,beep%
  1383. beep%=
  1384.  no% 
  1385. '    $dial_msg%=
  1386. msg_lookup0("NRMI")
  1387. !    text2$=
  1388. msg_lookup0("OK")
  1389.     beep%=
  1390. 4    $dial_msg%=
  1391. msg_lookup1("CFBS",
  1392. seqfname(0))
  1393. !    text2$=
  1394. msg_lookup0("OK")
  1395. 4    $dial_msg%=
  1396. msg_lookup1("CFBS",
  1397. seqfname(1))
  1398. !    text2$=
  1399. msg_lookup0("OK")
  1400. '    $dial_msg%=
  1401. msg_lookup0("NTAG")
  1402. !    text2$=
  1403. msg_lookup0("OK")
  1404. 0    $dial_msg%=
  1405. msg_lookup1("CFBD",bootdir$)
  1406. !    text2$=
  1407. msg_lookup0("OK")
  1408. '    $dial_msg%=
  1409. msg_lookup0("QNYW")
  1410. #    text1$=
  1411. msg_lookup0("QUIT")
  1412. #    text3$=
  1413. msg_lookup0("CANC")
  1414. 0    $dial_msg%=
  1415. msg_lookup1("NDIR",bootdir$)
  1416. !    text2$=
  1417. msg_lookup0("OK")
  1418. dialogue_setbutton(1,text1$)
  1419. dialogue_setbutton(2,text2$)
  1420. dialogue_setbutton(3,text3$)
  1421.  beep% 
  1422. scrapblk%!0=dialogwin%
  1423.  "Wimp_GetWindowState",,scrapblk%
  1424.  "Wimp_CreateMenu",,dialogwin%,scrapblk%!4,scrapblk%!16
  1425. lastdialogue%=no%
  1426. dialogue_setbutton(no%,text$)
  1427.  mask%
  1428. mask%=(1<<2)+(&FF<<24)
  1429.  text$="" 
  1430.  make button invisible
  1431. seticonstate(dialogwin%,no%,&11<<24,mask%) 
  1432.   $(dial_text%(no%))=text$
  1433. seticonstate(dialogwin%,no%,dial_buttoncol%,mask%)
  1434. heap_init
  1435. >Heap%=
  1436.  heap starts just after end of allocated memory
  1437.  "OS_ReadMemMapInfo" 
  1438.  PageSize%
  1439.  enlarge wimpslot (1 page) and create private heap in new memory
  1440. SlotSize%=Heap%-&8000
  1441.  "Wimp_SlotSize",SlotSize%+PageSize%,-1 
  1442.  SlotSize%
  1443. HeapEnd%=SlotSize%+&8000
  1444.  HeapEnd%<=Heap% 
  1445.  0,"Can't claim space for heap"
  1446.  "OS_Heap",0,Heap%,,HeapEnd%-Heap%
  1447. heap_get(size%)
  1448.  maxfree%,nrpages%,oldheapend%,ptr%
  1449.  "OS_Heap",1,Heap% 
  1450.  ,,maxfree%
  1451.  size%>maxfree% 
  1452.  largest free block is too small - try to enlarge wimpslot and heap
  1453. C  nrpages%=1+(size% 
  1454.  PageSize%) : 
  1455.  required # pages of memory
  1456.  "Wimp_SlotSize",SlotSize%+nrpages%*PageSize%,-1 
  1457.  SlotSize%
  1458.   oldheapend%=HeapEnd%
  1459.   HeapEnd%=SlotSize%+&8000
  1460.  "OS_Heap",5,Heap%,,HeapEnd%-oldheapend%
  1461.  "OS_Heap",1,Heap% 
  1462.  ,,maxfree% : 
  1463.  do we have enough now?
  1464.  size%>maxfree% 
  1465. complain(
  1466. msg_lookup0("NOHP"))
  1467.   ptr%=-1
  1468.  "OS_Heap",2,Heap%,,size% 
  1469.  ,,ptr%
  1470.     =ptr%
  1471. heap_release(ptr%)
  1472.  maxfree%,nrpages%,flg%
  1473.  "OS_Heap",3,Heap%,ptr%
  1474.  "OS_Heap",1,Heap% 
  1475.  ,,maxfree%
  1476.  maxfree%>PageSize% 
  1477.  more than 1 page free - try to shrink heap (page by page)
  1478. ,  nrpages%=0 : 
  1479.  # pages of memory freed
  1480. 1    
  1481.  "XOS_Heap",5,Heap%,,-PageSize% 
  1482.  ;flg%
  1483.  (flg% 
  1484.  1)=0 
  1485.       nrpages%+=1
  1486.         
  1487.  (flg% 
  1488.  1)<>0
  1489.  nrpages%>0 
  1490. 4    
  1491.  successfully shrunk heap - shrink WimpSlot
  1492. F    
  1493.  "Wimp_SlotSize",SlotSize%-nrpages%*PageSize%,-1 
  1494.  SlotSize%
  1495.      HeapEnd%=SlotSize%+&8000
  1496.  "OS_Heap",5,Heap%,,(HeapEnd%-Heap%)-Heap%!12
  1497. choices_load
  1498.  (ApplDir$+".Choices")
  1499.  F%=0 
  1500. choices_default
  1501. #F%,makebackup%,display%(0),display%(1)
  1502. #F%,winxmin%(0),winymin%(0),winxmax%(0),winymax%(0)
  1503. #F%,winxmin%(1),winymin%(1),winxmax%(1),winymax%(1)
  1504. choices_save
  1505.  (ApplDir$+".Choices")
  1506.  F%<>0 
  1507. #F%,makebackup%,display%(0),display%(1)
  1508.   scrapblk%!0=winhdl%(0)
  1509.  "Wimp_GetWindowState",,scrapblk%
  1510.   winxmin%(0)=scrapblk%!4
  1511.   winymin%(0)=scrapblk%!8
  1512.   winxmax%(0)=scrapblk%!12
  1513.   winymax%(0)=scrapblk%!16
  1514. #F%,winxmin%(0),winymin%(0),winxmax%(0),winymax%(0)
  1515.   scrapblk%!0=winhdl%(1)
  1516.  "Wimp_GetWindowState",,scrapblk%
  1517.   winxmin%(1)=scrapblk%!4
  1518.   winymin%(1)=scrapblk%!8
  1519.   winxmax%(1)=scrapblk%!12
  1520.   winymax%(1)=scrapblk%!16
  1521. #F%,winxmin%(1),winymin%(1),winxmax%(1),winymax%(1)
  1522. choices_default
  1523. display%(0)=0      
  1524. display%(1)=0
  1525. makebackup%=
  1526. winxmin%(0)=2
  1527. winymin%(0)=824
  1528. winxmax%(0)=580
  1529. winymax%(0)=980
  1530. winxmin%(1)=660
  1531. winymin%(1)=824
  1532. winxmax%(1)=1238
  1533. winymax%(1)=980
  1534.