home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / program / d / eventshell / !ShellSys / ShellLib (.txt) < prev    next >
Encoding:
RISC OS BBC BASIC V Source  |  1993-12-07  |  177.1 KB  |  6,383 lines

  1.  >EvntShellSystem:ShellLib
  2. "*|Start FNshell_LibraryVersion
  3. shell_LibraryVersion
  4. =1.27*100
  5.  1.27c (fix indirected data when loading templates)
  6. !*|Stop FNshell_LibraryVersion
  7.  routine to find handle of parent needed..
  8.  or search all submenu handles so that it can be changed..
  9.  or store a list of menu item handles together with the submenu handles..
  10. *|Start PROCshell_Error
  11. shell_Error
  12.  pos%,report$
  13.  ON ERROR OFF
  14.  <> &D00 
  15.  <> &903 
  16.  fatal error..
  17.  "XHourglass_Smash"
  18. shell_OSCheckVersion(3) 
  19. shell_FileExists("Resources:$.Resources.Edit.ThrowBack") 
  20. shell_Exit
  21. =    
  22. ("Set Basic$File <"+
  23. shell_GetAppName+"$BasicFile>")
  24.  "Edit:ThrowBack"
  25. L    
  26. shell_ErrorBox("Unexpected error:- "+
  27. $+" Internal error code "+
  28.         
  29.  Non-fatal error from shell_OK, or out of memory error from heap
  30.  manager routines....strip out name of library file..
  31. :  pos% = 
  32. $,"in " + 
  33. 34 + "EvntShellSystem:ShellLib")
  34.  pos% > 0 
  35.  report$ = 
  36. $,pos% - 1)
  37. shell_ErrorBox(report$)
  38.  "XHourglass_Smash"
  39.  RESTORE ERROR
  40. *|Stop PROCshell_Error
  41. *|Start PROCshell_OK
  42. shell_OK(e$)
  43.  &D00,e$
  44. *|Stop PROCshell_OK
  45. *|Start PROCshell_ErrorBox
  46. shell_ErrorBox(r$)
  47.  r%,err_blk%
  48. err_blk% = _shell_blk%
  49. 4-!err_blk% = 
  50. :$(err_blk% + 4) = r$ + 
  51.  = &D00 
  52.  = &903 
  53.  "XWimp_ReportError",err_blk%,%10001,"Message from " + 
  54. shell_GetAppName 
  55.  "XWimp_ReportError",err_blk%,1,
  56. shell_GetAppName 
  57.  IF r%=2 THEN _closedown%=TRUE
  58. *|Stop PROCshell_ErrorBox
  59. ?)*|Start FNshell_GetLastSecureFileName
  60. shell_GetLastSecureFileName
  61.  temp%
  62. temp%=_U%!80
  63.  temp%=0 
  64. =$temp%
  65. F(*|Stop FNshell_GetLastSecureFileName
  66. *|Start FNshell_GetString
  67. shell_GetString(Address%)
  68.  String$,Len%
  69.  ((Address%?Len%)>31 
  70.  Len%<255)
  71.   String$+=
  72. (Address%?Len%)
  73.   Len%+=1
  74. =String$
  75. *|Stop FNshell_GetString
  76. S#*|Start FNshell_GetEventHandler
  77. shell_GetEventHandler(wh%,ic%,e_type%)
  78.  ptr%,event_list%,found%,list_size%,fn$
  79.  wh%=-1 
  80.  wh%=-2
  81. W-list_size%=
  82. shell_HeapBlockInfo(_U%!12)-8
  83. ptr%=0
  84. found%=
  85. event_list%=_U%!12
  86. fn$=""
  87.  (event_list%!ptr%=wh%) 
  88. ^!    
  89.  event_list%!(ptr%+4) 
  90. `2      
  91.  window handle found, icon handle is -1
  92. aA      
  93.  check that a pointer has been defined to a heap block
  94. b@      
  95.  containing a function name (if it is 0 then no event
  96.       
  97.  defined)...
  98. d7      
  99.  event_list%!(ptr%+(12+(e_type%*4)))>&8000 
  100. e6        fn$=$(event_list%!(ptr%+(12+(e_type%*4))))
  101.         found%=
  102.       
  103.         ptr%+=48
  104.       
  105. j        
  106. k7      
  107.  check icon handle in event block as well...
  108. l&      
  109.  event_list%!(ptr%+4)=ic% 
  110. m5        
  111.  window/icon handle event block found...
  112. nC        
  113.  check that a pointer has been defined to a heap block
  114. oB        
  115.  containing a function name (if it is 0 then no event
  116.         
  117.  defined)...
  118. q9        
  119.  event_list%!(ptr%+(12+(e_type%*4)))>&8000 
  120. r8          fn$=$(event_list%!(ptr%+(12+(e_type%*4))))
  121.           found%=
  122.         
  123.           ptr%+=48
  124.         
  125.       
  126.         ptr%+=48
  127.       
  128. z        
  129.     ptr%+=48
  130.  ((ptr%>=list_size%) 
  131.  found%)
  132. "*|Stop FNshell_GetEventHandler
  133.  *|Start FNshell_GetEventMenu
  134. shell_GetEventMenu(button%,wh%,ic%)
  135.  ptr%,event_list%,found%,list_size%,menu%
  136.  wh%=-1 
  137.  wh%=-2
  138. -list_size%=
  139. shell_HeapBlockInfo(_U%!12)-8
  140. ptr%=0
  141. found%=
  142. event_list%=_U%!12
  143. fn$=""
  144.  PROCshell_Tracef0("GetEventMenu:Started..")
  145.  PROCshell_Tracef0("GetEventMenu:button is "+STR$button%)
  146.  PROCshell_Tracef0("GetEventMenu:window is "+STR$wh%)
  147.  PROCshell_Tracef0("GetEventMenu:icon   is "+STR$ic%)
  148.  (event_list%!ptr%=wh%) 
  149. ?    
  150. shell_Tracef0("GetEventMenu:window handle matched..") 
  151. &    
  152.  event_list%!(ptr%+4) = ic% 
  153. C      
  154.  PROCshell_Tracef0("GetEventMenu:icon handle matched..")
  155. $      menu%=event_list%!(ptr%+8)
  156. $      
  157.  menu%=-2 
  158.  menu%=_U%!252
  159.       found%=
  160.         
  161. G      
  162.  PROCshell_Tracef0("GetEventMenu:icon handle NOT matched..")
  163. -      
  164.  IF event_list%!(ptr%+4) = -1 THEN
  165.       
  166.    IF button%=2 THEN
  167. *      
  168.      menu%=event_list%!(ptr%+8)
  169. .      
  170.      IF menu%=-2 THEN menu%=_U%!252
  171.       
  172.      found%=TRUE
  173.       
  174.    ELSE
  175.       
  176.      ptr%+=48
  177.       
  178.    ENDIF
  179.       
  180.  ELSE
  181.       
  182.  ptr%+=48
  183.       
  184.  ENDIF
  185.         
  186. ptr% += 48
  187.  (ptr%>=list_size% 
  188.  found%)
  189. =menu%
  190. *|Stop FNshell_GetEventMenu
  191. &*|Start FNshell_GetEventListOffset
  192. shell_GetEventListOffset(wh%,ih%,event_list%,rec_size%,add%)
  193.  find offset of data in event list block given the window/icon
  194.  handles. returns -1 if no events found, -2 if heapblock not defined
  195.  if add% is FALSE. when add is TRUE then the list is extended and the
  196.  offset to the new record is returned.
  197.  list_size%,ptr%,found%,offset%,empty%,temp%
  198.  (!event_list%=0 
  199.  add%=
  200.  =-2:
  201.  no heapblock defined
  202.  (!event_list%=0) 
  203.  no heap block defined and add flag is true...
  204. 3  !event_list%=
  205. shell_HeapBlockFetch(rec_size%)
  206. ,  temp%=!event_list%:temp%!0=0:temp%!4=0
  207. 3list_size%=
  208. shell_HeapBlockInfo(!event_list%)-8
  209. (ptr%=0:found%=
  210. :offset%=-1:empty%=-1
  211. temp%=!event_list%
  212.  PROCshell_Tracef0("GetEventListOffset:window handle=&"+STR$~temp%!ptr%)
  213.  when scanning list note offset of first empty record for use when
  214.  adding a new event to the list. Empty records have 0 for both
  215.  window and icon handles
  216.  empty%<0 
  217. 7    
  218.  (temp%!ptr%=0 
  219.  temp%!ptr%+4=0) 
  220.  empty%=ptr%
  221.  (temp%!ptr%=wh%) 
  222. C    
  223.  events attached to no particular icon are registered with
  224.  an icon handle of -1
  225. E    
  226.  PROCshell_Tracef0("GetEventListOffset:window handle found")
  227.  ih%=-1 
  228. 6      
  229.  icon handle is -1, so event has been found
  230. E      
  231.  PROCshell_Tracef0("GetEventListOffset:icon handle is -1")
  232.       offset%=ptr%
  233.       found%=
  234.         
  235. 6      
  236.  check icon handle in event block as well..
  237. *|ifdef PROCshell_TraceInit
  238. D      
  239. shell_Tracef0("GetEventListOffset:icon handle is not -1")
  240. *|endif
  241.        
  242.  temp%!(ptr%+4)=ih% 
  243.           offset%=ptr%
  244.           found%=
  245.       
  246.         ptr%+=rec_size%
  247.       
  248.         
  249. )    
  250.  no match, so check next event..
  251.     ptr%+=rec_size%
  252.  ((ptr%>=list_size%) 
  253.  found%)
  254.  found% 
  255.  PROCshell_Tracef0("GetEventListOffset:Event found")
  256.  PROCshell_Tracef0("GetEventListOffset:End of event list - event not found")
  257.  (offset%=-1 
  258.  add%) 
  259.  empty%<0 
  260. 7    
  261.  no empty records found to use for the new one
  262.     offset%=list_size%
  263. C    !event_list%=
  264. shell_HeapBlockExtend(!event_list%,rec_size%)
  265.     temp%=!event_list%
  266. *    temp%+=offset%:temp%!0=0:temp%!4=0
  267. "    
  268.  re-use old deleted event
  269.     offset%=empty%
  270. =offset%
  271. %*|Stop FNshell_GetEventListOffset
  272.  *|Start PROCshell_AttachPane
  273. shell_AttachPane(wh%,
  274.  pane_handle%,flags%,x_off%,y_off%)
  275.  blk%,offset%,temp%,nr_pane_events%,pane_flags%
  276. shell_Tracef0("AttachPane:Attaching Pane Handler")
  277.  first check that the flags of the pane window are correctly set..
  278. 3pane_flags%=
  279. shell_WindowGetFlags(pane_handle%)
  280.  (pane_flags% 
  281.  1<<5)=0 
  282. shell_Tracef0("AttachPane:'Pane' bit of pane window is not set, fixing..")
  283. shell_WindowToggleFlags(pane_handle%,1<<5)
  284.  (pane_flags% 
  285.  1<<1) 
  286. shell_Tracef0("AttachPane:'Moveable' bit of pane window is set, fixing..")
  287. shell_WindowToggleFlags(pane_handle%,1<<1)
  288. 9offset%=
  289. shell_GetEventListOffset(wh%,-1,_U%+92,24,
  290.  offset%<0 
  291.  no existing pane event block
  292. shell_Tracef0("AttachPane:Creating pane event block")
  293. ;  offset%=
  294. shell_GetEventListOffset(wh%,-1,_U%+92,24,
  295.   blk%=_U%!92+offset%
  296.   blk%!0=wh%:blk%!4=-1
  297. %  blk%!8=
  298. shell_HeapBlockFetch(4)
  299. &  blk%!12=
  300. shell_HeapBlockFetch(4)
  301. &  blk%!16=
  302. shell_HeapBlockFetch(4)
  303. &  blk%!20=
  304. shell_HeapBlockFetch(4)
  305.   temp%=blk%!8:!temp%=-1
  306.   temp%=blk%!12:!temp%=-1
  307.   temp%=blk%!16:!temp%=-1
  308.   temp%=blk%!20:!temp%=-1
  309. blk%=_U%!92+offset%
  310. )temp%=blk%!8:ctr%=0:nr_pane_events%=0
  311.  temp%!ctr%<>-1
  312.   ctr%+=4
  313.   nr_pane_events%+=1
  314. +blk%!8=
  315. shell_HeapBlockExtend(blk%!8,4)
  316. 7temp%=blk%!8:temp%!(nr_pane_events%*4)=pane_handle%
  317. $temp%!((nr_pane_events%+1)*4)=-1
  318. -blk%!12=
  319. shell_HeapBlockExtend(blk%!12,4)
  320. 2temp%=blk%!12:temp%!(nr_pane_events%*4)=flags%
  321. $temp%!((nr_pane_events%+1)*4)=-1
  322. -blk%!16=
  323. shell_HeapBlockExtend(blk%!16,4)
  324.  2temp%=blk%!16:temp%!(nr_pane_events%*4)=x_off%
  325. !$temp%!((nr_pane_events%+1)*4)=-1
  326. "-blk%!20=
  327. shell_HeapBlockExtend(blk%!20,4)
  328. #2temp%=blk%!20:temp%!(nr_pane_events%*4)=y_off%
  329. $$temp%!((nr_pane_events%+1)*4)=-1
  330. *|Stop PROCshell_AttachPane
  331. )$*|Start PROCshell_AttachDataLoad
  332. shell_AttachDataLoad(wh%,ih%,type%,fn$,no_load%)
  333.  blk%,temp%,offset%,cmdline$
  334. shell_Tracef0("AttachDataLoad:Attaching DataLoad Handler")
  335.  wh%=-1 
  336.  wh%=-2
  337.  no_load% 
  338.  type%=type% 
  339.  1<<31
  340. /:offset%=
  341. shell_GetEventListOffset(wh%,ih%,_U%+96,16,
  342.  modify above to set first two words to 0 to denote a new
  343.  empty event block
  344. blk%=_U%!96+offset%
  345.  blk%!0=0 
  346.  blk%!4=0 
  347.  this is first event......
  348. shell_Tracef0("AttachDataLoad:This is the first DataLoad Event...")
  349.   blk%!0=wh%:blk%!4=ih%
  350. 8%  blk%!8=
  351. shell_HeapBlockFetch(8)
  352.   temp%=blk%!8
  353.   temp%!0=type%:temp%!4=-1
  354. ;&  blk%!12=
  355. shell_HeapBlockFetch(8)
  356.   temp%=blk%!12
  357. =-  temp%!0=
  358. shell_HeapBlockFetch(
  359. (fn$)+1)
  360.   temp%!4=-1
  361.   temp%=temp%!0:$temp%=fn$
  362.  adding new filetype/function to an existing event
  363.  extend filetype heapblock...
  364. shell_Tracef0("AttachDataLoad:This is another DataLoad Event...")
  365. D-  blk%!8=
  366. shell_HeapBlockExtend(blk%!8,4)
  367.  and function name heapblock...
  368. F/  blk%!12=
  369. shell_HeapBlockExtend(blk%!12,4)
  370.  find out how many filetypes there are now...
  371.   ctr%=0:temp%=blk%!8
  372.  temp%!ctr%<>-1
  373.     ctr%+=4
  374. L(  temp%!ctr%=type%:temp%!(ctr%+4)=-1
  375.   temp%=blk%!12
  376. N.  temp%!ctr%=
  377. shell_HeapBlockFetch(
  378. fn$+1)
  379. O!  temp%=temp%!ctr%:$temp%=fn$
  380.  Now check if program was started by double clicking on a data file...
  381. R$cmdline$ = 
  382. shell_GetCmdLineArgs
  383.  PROCshell_Tracef0("LL:cmdline="+cmdline$)
  384.  PROCshell_Tracef0("LL:flag bit ="+STR$((_U%!100 AND 1 << 5)))
  385.  PROCshell_Tracef0("LL:wh%      ="+STR$~wh%)
  386.  PROCshell_Tracef0("LL:type%    ="+STR$~type%)
  387.  cmdline$ <> "" 
  388.  wh% < 0 
  389.  (_U%!100 
  390.  1 << 5) 
  391.  It was, check file is correct type, ignoring the top bit...
  392.  type% 
  393.  1 << 31 
  394.  temp% = type% 
  395.  1 << 31 
  396.  temp% = type%
  397. shell_FileType(cmdline$) = temp% 
  398.  It is, so load it...
  399. \2    
  400. shell_MessageSendDataLoad(temp%,cmdline$)
  401. ]G    _U%!100 = _U%!100 
  402.  (1 << 5) : 
  403.  Unset load pending flag bit...
  404. b#*|Stop PROCshell_AttachDataLoad
  405. d$*|Start PROCshell_AttachDataSave
  406. shell_AttachDataSave(wh%,ih%,address%,type%,name_ic%,fn$)
  407.  blk%,temp%,offset%
  408.  check file icon is a sprite icon, complain otherwise..
  409. shell_IconIsSprite(wh%,ih%) 
  410. shell_OK(
  411. shell_MessageNoArgs("SHELLMSG29"))
  412.  change file type icon button type to click/drag..
  413. shell_IconSetButtonType(wh%,ih%,6)
  414.  address%=0 
  415.  address%=100:
  416.  estimated size - wild guess.
  417. *|ifdef TraceInit
  418. shell_Tracef0("AttachDataSave:Attaching DataSave Handler to icon "+
  419. ih%+" in window &"+
  420. ~wh%)
  421. shell_Tracef0("AttachDataSave:Handler function is '"+fn$+"'")
  422. *|endif
  423. p:offset%=
  424. shell_GetEventListOffset(wh%,ih%,_U%+72,24,
  425. blk%=_U%!72+offset%
  426. r7blk%!0=wh%:blk%!4=ih%:blk%!8=address%:blk%!12=type%
  427. blk%!16=name_ic%
  428. t+blk%!20=
  429. shell_HeapBlockFetch(
  430. (fn$)+1)
  431. temp%=blk%!20:$temp%=fn$
  432.  type% 
  433.  &FF9
  434. x:    
  435.  kludge for sprite files as first word should not
  436.  be saved
  437.  address%>&8000 
  438. {2      _U%!136=
  439. shell_HeapBlockInfo(address%)-8
  440. |        
  441.       _U%!136=address%
  442. ~        
  443.  address%>&8000 
  444. 2      _U%!136=
  445. shell_HeapBlockInfo(address%)-4
  446.         
  447.       _U%!136=address%
  448.         
  449. _U%!140=type%
  450.  _U%!144 holds address of file heapblock buffer. If address%<&8000 then
  451.  file is not in a buffer and address% is actually the estimated size..
  452. _U%!144=address%
  453. #*|Stop PROCshell_AttachDataSave
  454.  *|Start PROCshell_AttachMenu
  455. shell_AttachMenu(wh%,ic%,menu%,shift%,ctrl%,alt%)
  456.  offset%
  457.  wh%>0 
  458.  ic%>=0 
  459. shell_IconSetButtonType(wh%,ic%,3)
  460.  offset%=FNshell_SearchStatic(_U%!184,wh%)
  461.  IF offset%=-1 THEN ERROR 99,FNshell_MessageNoArgs("SHELLMSG30")
  462. *|ifdef TraceInit
  463. shell_Tracef0("AttachMenu:Attaching menu handle &"+
  464. ~menu%+" to window handle &"+
  465. ~wh%)
  466. *|endif
  467. shell_EventAdd(wh%,ic%,0,menu%,"")
  468. *|Stop PROCshell_AttachMenu
  469. %*|Start PROCshell_AttachMenuMaker
  470. shell_AttachMenuMaker(wh%,ic%,fn$)
  471. shell_Tracef0("AttachMenuMaker:Attaching menumaker function '"+fn$+"'")
  472. shell_EventAdd(wh%,ic%,1,0,fn$)
  473. $*|Stop PROCshell_AttachMenuMaker
  474. $*|Start PROCshell_AttachMenuDBox
  475. shell_AttachMenuDBox(item%,window$,preopenfn$,postopenfn$)
  476.  Check current submenu handle. We should release any memory
  477.  allocated by previous calls (when I work out how to do it)
  478.  blk%,temp%,addr%
  479. shell_WindowLoaded(window$) 
  480. shell_MessageOneArg("SHELLMSG03",window$)
  481. "blk%=
  482. shell_HeapBlockFetch(12)
  483. ,blk%!0=
  484. shell_HeapBlockFetch(
  485. window$+1)
  486. temp%=blk%!0:$temp%=window$
  487. /blk%!4=
  488. shell_HeapBlockFetch(
  489. preopenfn$+1)
  490. "temp%=blk%!4:$temp%=preopenfn$
  491. 0blk%!8=
  492. shell_HeapBlockFetch(
  493. postopenfn$+1)
  494. #temp%=blk%!8:$temp%=postopenfn$
  495.  Store address of heapblock in submenu pointer word of
  496.  menu item definition. Cunning huh........
  497.  "MenuUtil_SubMenu",item%,blk%
  498.  "MenuUtil_Warning",,
  499. #*|Stop PROCshell_AttachMenuDBox
  500. '*|Start PROCshell_AttachClickSelect
  501. shell_AttachClickSelect(wh%,ic%,fn$)
  502. shell_EventAdd(wh%,ic%,2,0,fn$)
  503. &*|Stop PROCshell_AttachClickSelect
  504. '*|Start PROCshell_AttachClickAdjust
  505. shell_AttachClickAdjust(wh%,ic%,fn$)
  506. shell_EventAdd(wh%,ic%,3,0,fn$)
  507. &*|Stop PROCshell_AttachClickAdjust
  508. &*|Start PROCshell_AttachUserRedraw
  509. shell_AttachUserRedraw(
  510.  wh%,fn$)
  511.  blk%,f%,old_handle%
  512. "blk%=
  513. shell_HeapBlockFetch(40)
  514. ,!blk%=wh%:
  515.  "Wimp_GetWindowState",,blk%
  516. f%=blk%!32
  517. shell_HeapBlockReturn(blk%)
  518. shell_Tracef0("AttachUserRedraw:flag%=&"+
  519.  (f% 
  520.  1<<4) 
  521. shell_Tracef0("AttachUserRedraw:auto redraw set!!")
  522.  store original handle in case the wimp allocates a new handle..
  523.   old_handle% = wh%
  524. shell_WindowToggleFlags(wh%,1 << 4)
  525.  wh% <> old_handle% 
  526. 2    
  527. shell_UpdateWindowHandle(old_handle%,wh%)
  528. shell_EventAdd(wh%,-1,4,0,fn$)
  529. %*|Stop PROCshell_AttachUserRedraw
  530. $*|Start PROCshell_AttachKeypress
  531. shell_AttachKeypress(wh%,ic%,fn$)
  532. shell_EventAdd(wh%,ic%,5,0,fn$)
  533. #*|Stop PROCshell_AttachKeypress
  534.  *|Start PROCshell_AttachDrag
  535. shell_AttachDrag(wh%,ic%,est_size%,fn$)
  536. shell_EventAdd(wh%,ic%,6,0,fn$)
  537. *|Stop PROCshell_AttachDrag
  538. #*|Start PROCshell_AttachHelpTag
  539. shell_AttachHelpTag(wh%,ic%,tag$)
  540. shell_EventAdd(wh%,ic%,8,0,tag$)
  541. "*|Stop PROCshell_AttachHelpTag
  542. *|Start PROCshell_EventAdd
  543. shell_EventAdd(wh%,ic%,e_type%,menu%,fn$)
  544.  ptr%,fn%,event_list%,list_size%,found%
  545.  fn_addr%
  546. ptr%=0:found%=
  547.  wh%=-1 
  548.  wh%=-2
  549. -list_size%=
  550. shell_HeapBlockInfo(_U%!12)-8
  551. event_list%=_U%!12
  552.  PROCshell_Tracef0("XX:checking for wh &"+STR$~wh%+" ih &"+STR$~ic%)
  553.  (event_list%!ptr%=wh%) 
  554. 0    
  555.  PROCshell_Tracef0("XX:ptr%="+STR$ptr%)
  556. U    
  557.  PROCshell_Tracef0("XX:found window handle in list, checking icon handle..")
  558. $    
  559.  event_list%!(ptr%+4)=ic% 
  560.       found%=
  561.         
  562.       ptr%+=48
  563.         
  564.     ptr%+=48
  565.  (ptr%>=list_size% 
  566.  found%)
  567.  found%=
  568.  ptr%=0
  569.  (event_list%!ptr%<>0 )
  570.    ptr%+=48
  571.  ptr%>=list_size% 
  572. 1     _U%!12=
  573. shell_HeapBlockExtend(_U%!12,48)
  574.      event_list%=_U%!12
  575.      event_list%!(ptr%+0)=0
  576.      event_list%!(ptr%+4)=0
  577.      event_list%!(ptr%+8)=0
  578.       event_list%!(ptr%+12)=0
  579.       event_list%!(ptr%+16)=0
  580.       event_list%!(ptr%+20)=0
  581.       event_list%!(ptr%+24)=0
  582.       event_list%!(ptr%+28)=0
  583.       event_list%!(ptr%+32)=0
  584.       event_list%!(ptr%+36)=0
  585.       event_list%!(ptr%+40)=0
  586.       event_list%!(ptr%+44)=0
  587. event_list%!(ptr%+0)=wh%
  588. event_list%!(ptr%+4)=ic%
  589.  menu%<>0 
  590.     event_list%!(ptr%+8)=menu%
  591. ""fn_addr%=ptr%+(12+(e_type%*4))
  592.  event_list%!fn_addr%<>0 
  593. shell_HeapBlockReturn(event_list%!fn_addr%)
  594. &%fn%=
  595. shell_HeapBlockFetch(
  596. fn$+1)
  597. $fn%=fn$
  598. event_list%!fn_addr%=fn%
  599. *|Stop PROCshell_EventAdd
  600. -$*|Start PROCshell_EventDeleteAll
  601. shell_EventDeleteAll(wh%)
  602.  ptr%,menu%,found%,list_size%,event_list%,loop%
  603. ptr%=0:menu%=0:found%=
  604.  wh%=-1 
  605.  wh%=-2
  606. 2-list_size%=
  607. shell_HeapBlockInfo(_U%!12)-8
  608. event_list%=_U%!12
  609.  (event_list%!ptr%=wh%) 
  610.     found%=
  611.     ptr%+=48
  612.  (ptr%>=list_size% 
  613.  found%)
  614.  found% 
  615.   event_list%!(ptr%+0)=0
  616.   event_list%!(ptr%+4)=0
  617.   event_list%!(ptr%+8)=0
  618.  loop%=12 
  619. @'    
  620.  event_list%!(ptr%+loop%)<>0 
  621. A:      
  622. shell_HeapBlockReturn(event_list%!(ptr%+loop%))
  623. B$      event_list%!(ptr%+loop%)=0
  624. C        
  625.  loop%
  626.  remove all DataSave events for the current window...
  627. shell_Tracef0("EventDeleteAll:wh%=&"+
  628. ~wh%)
  629. shell_DeleteEventDataSave(wh%,-1)
  630. shell_DeleteEventBump(wh%,-1)
  631.  should reduce size of event list block if possible.......
  632. M#*|Stop PROCshell_EventDeleteAll
  633. O%*|Start PROCshell_DeleteEventBump
  634. shell_DeleteEventBump(wh%,ih%)
  635.  if I can find which words point to a heap block they could be
  636.  automatically detected and released. A general purpose routine
  637.  shell_DeleteEvent could then be written!
  638.  If ih%=-1 remove all events for window handle wh%
  639.  offset%,blk%,list_size%,event_list%,temp%
  640. event_list%=_U%!104
  641. X=  offset%=
  642. shell_GetEventListOffset(wh%,ih%,_U%+104,16,
  643. shell_Tracef0("DeleteEventBump:offset%="+
  644. offset%)
  645.  offset%>=0 
  646.  ih%=-1 
  647. shell_Tracef0("DeleteEventBump:Deleting Bump Event (all events for window handle &"+
  648. ~wh%+")")
  649. ]        
  650. ^w      
  651. shell_Tracef0("DeleteEventBump:Deleting Bump Event (window handle was &"+
  652. ~wh%+" icon handle was "+
  653. ih%+")")
  654. _        
  655. `*    
  656.  event for window/icon is in list
  657. a2    list_size%=
  658. shell_HeapBlockInfo(_U%!104)-8
  659. b!    
  660.  offset%=list_size%-16 
  661. c+      
  662.  it is the last one in this list
  663.       
  664.  offset%=0 
  665. e(        
  666.  only one event in the list
  667. f$        info_blk%=event_list%!12
  668.         temp%=info_blk%!12
  669. h,        
  670. shell_HeapBlockReturn(temp%!12)
  671. i,        
  672. shell_HeapBlockReturn(temp%!16)
  673. j)        
  674. shell_HeapBlockReturn(temp%)
  675. k+        
  676. shell_HeapBlockReturn(_U%!104)
  677.         _U%!104=0
  678. mO        
  679. shell_Tracef0("DeleteEventDataSave:No Bump events now registered")
  680.       
  681. o-        
  682.  more than one event in the list
  683. p7        _U%!104=
  684. shell_HeapBlockExtend(_U%!104,-16)
  685.       
  686. r        
  687. s(      
  688.  not the last one in the list
  689. t"      blk%=event_list%+offset%
  690. u$      blk%!0=0:blk%!4=0:blk%!8=0
  691.       info_blk%=blk%!12
  692. w.      
  693. shell_HeapBlockReturn(info_blk%!12)
  694. x.      
  695. shell_HeapBlockReturn(info_blk%!16)
  696. y+      
  697. shell_HeapBlockReturn(info_blk%)
  698. z        
  699.  repeat loop until offset%=-1 (event not found)
  700.  or offset%=-2 (event block doesn't exist)
  701.  offset%<0
  702. $*|Stop PROCshell_DeleteEventBump
  703. )*|Start PROCshell_DeleteEventDataSave
  704. shell_DeleteEventDataSave(wh%,ih%)
  705.  if I can find which words point to a heap block they could be
  706.  automatically detected and released. A general purpose routine
  707.  shell_DeleteEvent could then be written!
  708.  If ih%=-1 remove all events for window handle wh%
  709.  offset%,blk%,list_size%
  710.  PROCshell_Tracef0("DeleteEventDataSave:wh%=&"+STR$~wh%)
  711.  PROCshell_Tracef0("DeleteEventDataSave:ih%="+STR$ih%)
  712. <  offset%=
  713. shell_GetEventListOffset(wh%,ih%,_U%+72,24,
  714.  PROCshell_Tracef0("DeleteEventDataSave:offset%="+STR$offset%)
  715.  offset%>=0 
  716.  ih%=-1 
  717. shell_Tracef0("DeleteEventDataSave:Deleting DataSave Event (all events for window handle &"+
  718. ~wh%+")")
  719.         
  720. shell_Tracef0("DeleteEventDataSave:Deleting DataSave Event (window handle was &"+
  721. ~wh%+" icon handle was "+
  722. ih%+")")
  723.         
  724. *    
  725.  event for window/icon is in list
  726. 1    list_size%=
  727. shell_HeapBlockInfo(_U%!72)-8
  728. !    
  729.  offset%=list_size%-24 
  730. +      
  731.  it is the last one in this list
  732.       
  733.  offset%=0 
  734. (        
  735.  only one event in the list
  736. *        
  737. shell_HeapBlockReturn(_U%!72)
  738.         _U%!72=0
  739. *|ifdef TraceInit
  740. Q      
  741. shell_Tracef0("DeleteEventDataSave:No DataSave events now registered")
  742. *|endif
  743.       
  744. -        
  745.  more than one event in the list
  746. 5        _U%!72=
  747. shell_HeapBlockExtend(_U%!72,-24)
  748.       
  749.         
  750. (      
  751.  not the last one in the list
  752. "      blk%=event_list%+offset%
  753. 8      blk%!0=0:blk%!4=0:blk%!8=0:blk%!12=0:blk%!16=0
  754. 3      
  755. shell_HeapBlockReturn(blk%!20):blk%!20=0
  756.         
  757.  repeat loop until offset%=-1 (event not found)
  758.  or offset%=-2 (event block doesn't exist)
  759.  offset%<0
  760. (*|Stop PROCshell_DeleteEventDataSave
  761. !*|Start FNshell_MessageNoArgs
  762. shell_MessageNoArgs(tag$)
  763. shell_MessageLookup(tag$,"","")
  764.  *|Stop FNshell_MessageNoArgs
  765. !*|Start FNshell_MessageOneArg
  766. shell_MessageOneArg(tag$,arg1$)
  767. shell_MessageLookup(tag$,arg1$,"")
  768.  *|Stop FNshell_MessageOneArg
  769. !*|Start FNshell_MessageLookup
  770. shell_MessageLookup(tag$,arg1$,arg2$)
  771.  flags%,L%,m$,ms_text%,ms_desc%
  772. tag$,8)="SHELLMSG" 
  773. '  ms_text%=_U%!284:ms_desc%=_U%!280
  774. %  ms_text%=_U%!64:ms_desc%=_U%!68
  775.  "XMessageTrans_Lookup",ms_desc%,tag$,ms_text%,256,arg1$,arg2$ 
  776.  ,,,L%;flags%
  777.  flags% 
  778.  m$="Message tag '"+tag$+"' not found in message file!"
  779.   ms_text%?L%=13
  780.   m$=$(ms_text%)
  781.  *|Stop FNshell_MessageLookup
  782. *|Start FNshell_WimpInit
  783. shell_WimpInit(Version%,TaskName$)
  784.  Taskid%
  785.  "Wimp_Initialise",Version%,&4B534154,TaskName$ 
  786.  Version%,Taskid%
  787. _U%!148=Taskid%
  788. =Taskid%
  789. *|Stop FNshell_WimpInit
  790. *|Start FNshell_WimpInit_I
  791. shell_WimpInit_I(Version%,TaskName$)
  792.  "Wimp_Initialise",Version%,&4B534154,TaskName$ 
  793.  Version%,Taskid%
  794. _U%!148=Taskid%
  795.  "Interface_Initialise",Taskid%
  796. =Taskid%
  797. *|Stop FNshell_WimpInit_I
  798. %*|Start PROCshell_WimpCloseDown_I
  799. shell_WimpCloseDown_I(Taskid%)
  800. shell_LoseFonts
  801. *|ifdef Using_FontMenu
  802.  _U%!240<>-1 
  803.  "XFontMenu_Release"
  804. *|endif
  805.  "XWimp_CloseDown",Taskid%,&4B534154
  806.  "XInterface_CloseDown",Taskid%
  807.  _U%!100 
  808.  1<<2 
  809.  "XImpulse_CloseDown",_U%!148
  810. $*|Stop PROCshell_WimpCloseDown_I
  811. *|Start PROCWimpCloseDown
  812. WimpCloseDown(Taskid%)
  813. shell_LoseFonts
  814. *|ifdef Using_FontMenu
  815.  _U%!240<>-1 
  816.  "XFontMenu_Release"
  817. *|endif
  818.  "XWimp_CloseDown",Taskid%,&4B534154
  819.  _U%!100 
  820.  1<<2 
  821.  "XImpulse_CloseDown",_U%!148
  822. ("Unset "+_shell_AppName$+"$BasicFile")
  823. *|Stop PROCWimpCloseDown
  824. *|Start PROCshell_LoseFonts
  825. shell_LoseFonts
  826.  loop%,temp%
  827. temp%=_U%!232
  828.  loop%=0 
  829.  temp%?loop%>0
  830.  "Font_LoseFont",loop%
  831.   temp%?loop%-=1
  832.  loop%
  833. *|Stop PROCshell_LoseFonts
  834. *|Start FNshell_FindFont
  835. shell_FindFont(font$,pointsize%)
  836.  f%,fontcounts%
  837. fontcounts%=_U%!232
  838.  "Font_FindFont",,font$,pointsize%*16,p*16,0,0 
  839. fontcounts%?f%+=1
  840.  fontcounts%?f%>=255 
  841. shell_OK(
  842. shell_MessageNoArgs("SHELLMSG18"))
  843. *|Stop FNshell_FindFont
  844. *|Start PROCshell_Init
  845. shell_Init
  846.  elist%,loop%,temp%,cmdline$
  847.  OSVarBuff%,shell_AppDir$,shell_AppName$
  848.  _U% 330,_shell_blk% 260
  849. #_Q%=
  850. shell_HeapBlockFetch(3000)
  851. $elist%=
  852. shell_HeapBlockFetch(48)
  853. elist%!00=0
  854. elist%!04=0
  855. elist%!08=0
  856. elist%!12=0
  857. elist%!16=0
  858. elist%!20=0
  859. elist%!24=0
  860. elist%!28=0
  861. elist%!32=0
  862. elist%!36=0
  863. elist%!40=0
  864. elist%!44=0
  865. )'_U%!0=0          :
  866.  nr of templates
  867. *0_U%!4=0          :
  868.  pointer to window blocks
  869. +-_U%!8=0          :
  870.  pointer to menu block
  871. ,-_U%!12=elist%    :
  872.  pointer to event list
  873. -3_U%!16=1         :
  874.  address of user sprite area
  875. .5_U%!20=0         :
  876.  handle of last dynamic window
  877. //_U%!24=0         :
  878.  address of current menu
  879. 0B_U%!28=0         :
  880.  last window clicked over (select & adjust)
  881. 1B_U%!32=0         :
  882.  last icon clicked over   (select & adjust)
  883. 2,_U%!36=0         :
  884.  last menu x position
  885. 3,_U%!40=0         :
  886.  last menu y position
  887. 4+_U%!44=-1        :
  888.  handle of tracefile
  889. 58_U%!48=0         :
  890.  FALSE=not tracing,TRUE = tracing
  891. 6>_U%!52=0         :
  892.  last window clicked over (menu button)
  893. 7>_U%!56=0         :
  894.  last icon   clicked over (menu button)
  895. 8>_U%!60=0         :
  896.  pointer to 'HotKey' handler event list
  897. 90_U%!64=0         :
  898.  pointer to message block
  899. :0_U%!68=0         :
  900.  pointer to message block
  901. ;7_U%!72=0         :
  902.  pointer to datasave event block
  903. <5_U%!76=
  904. shell_HeapBlockFetch(256):
  905.  message block
  906. =6_U%!80=0         :
  907.  pointer to last full file name
  908. >8_U%!84=-1        :
  909.  store my_ref from save operation
  910. ?"_U%!88=0         :
  911.  ??????????
  912. @;_U%!92=0         :
  913.  pointer to pane handler event block
  914. A7_U%!96=0         :
  915.  pointer to dataload event block
  916. B+_U%!100=0        :
  917.  EvntShell bit flags
  918. CB                 :
  919.  bit 0  - DragASprite operation in progress
  920. D=                 :
  921.  bit 1  - Top bit dataload in progress
  922. E;                 :
  923.  bit 2  - Impulse module initialised
  924. F5                 :
  925.  bit 3  - ResFind in operation
  926. GN                 :
  927.  bit 4  - Trace init message pending (set in TraceInit,
  928. HJ                 :
  929.           cleared when ack received from ShellDBug)
  930. IB                 :
  931.  bit 5  - command line contains arguments..
  932. J;_U%!104=0        :
  933.  pointer to bump handler event block
  934. K _U%!108=-1       :
  935.  ScrpRef%
  936. L _U%!112=-1       :
  937.  FtchRef%
  938. M _U%!116=-1       :
  939.  LoadRef%
  940. N _U%!120=-1       :
  941.  SaveRef%
  942. O _U%!124=-1       :
  943.  DragRef%
  944. _U%!128=0        :
  945.  RAMPtr%
  946. Q _U%!132=0        :
  947.  RAMSize%
  948. R<_U%!136=-1       :
  949.  FileSize% from last datasave message
  950. S<_U%!140=-1       :
  951.  FileType% from last datasave message
  952. T<_U%!144=-1       :
  953.  FileBuff% from last datasave message
  954. _U%!148=0        :
  955.  taskid%
  956. VB_U%!152=0        :
  957.  Buffer list of loaded files, -1 terminator
  958. WE_U%!156=0        :
  959.  HeapBlock with copy of DataSave message block
  960. X3                 :
  961.  for when RAM transfer fails
  962. Y<_U%!160=0        :
  963.  Pointer to ModeChange event function
  964. Z?_U%!164=0        :
  965.  Pointer to PaletteChange event function
  966. [@_U%!168=0        :
  967.  Pointer to TaskInitialise event function
  968. \?_U%!172=0        :
  969.  Pointer to TaskCloseDown event function
  970. ]5_U%!176=0        :
  971.  Pointer to current menu title
  972. ^8_U%!180=0        :
  973.  nr of 'hotkey' events registered
  974. _9_U%!184=0        :
  975.  Pointer to list of static windows
  976. `/_U%!188=0        :
  977.  to shell_AppDir$ buffer
  978. a3_U%!192=0        :
  979.  to shell_AppDataDir$ buffer
  980. b0_U%!196=0        :
  981.  to shell_AppName$ buffer
  982. c@_U%!200=0        :
  983.  window handle from last DataSave message
  984. d>_U%!204=0        :
  985.  icon handle from last DataSave message
  986. e>_U%!208=-1       :
  987.  helphandle% (task handle of StrongHlp)
  988. fD_U%!212=-1       :
  989.  icontry%    (used by StrongHlp find routine)
  990. gH_U%!216=0        :
  991.  pointer to pending$ buffer for StrongHlp command
  992. h;_U%!220=0        :
  993.  pointer to menu warning event block
  994. i;_U%!224=0        :
  995.  pointer to last menu_warn fn called
  996. jI_U%!228=0        :
  997.  handle of warning dialog used for menu items that
  998. k:                 :
  999.  have not had a dialog box attached
  1000. l<_U%!232=
  1001. shell_HeapBlockFetch(256):
  1002.  fontcounts% array..
  1003. m=_U%!236=
  1004. shell_HeapBlockFetch(256):
  1005.  fontbinding% array..
  1006. nN_U%!240=-1       :
  1007.  nr of outline fonts on system, -1 if "FontMenu_Create"
  1008. o+                 :
  1009.  has not been called
  1010. pG_U%!244=0        :
  1011.  ptr to currently selected font name in FontMenu
  1012. q3_U%!248=0        :
  1013.  ptr to last known Font$Path
  1014. r<_U%!252=0        :
  1015.  last known ptr to FontMenu structure
  1016. sM_U%!256=0        :
  1017.  ptr to heapblock holding 'MenusSelectionSoFar' string
  1018. tL_U%!260=1        :
  1019.  SystemFont flag for FontMenu 0 no sysfont, 1 sysfont
  1020. u3_U%!264=0        :
  1021.  FontMenu is opened (1 or 0)
  1022. vJ_U%!268=0        :
  1023.  FontMenu valid selection flag 0 non valid, 1 valid
  1024. w@_U%!272=0        :
  1025.  x coord last mouse click (screen coords)
  1026. x@_U%!276=0        :
  1027.  y coord last mouse click (screen coords)
  1028. y;_U%!280=0        :
  1029.  m_filedesc% for system message file
  1030. z;_U%!284=0        :
  1031.  m_buffer%   for system message file
  1032. {9_U%!288=-1       :
  1033.  window handle for last bump event
  1034. |7_U%!292=-1       :
  1035.  icon handle for last bump event
  1036. }:_U%!296=-1       :
  1037.  last event offset for bump handler
  1038. ~:_U%!300=0        :
  1039.  pointer to PreQuit Handler routine
  1040. 9_U%!304=0        :
  1041.  pointer to OpenWindow event block
  1042. :_U%!308=0        :
  1043.  pointer to CloseWindow event block
  1044. ;_U%!312=0        :
  1045.  pointer to Shutdown Handler routine
  1046. D_U%!316=0        :
  1047.  OS version nr as returned by Wimp_Initialise
  1048. 1_U%!320=0        :
  1049.  Last mouse button pressed
  1050. 8_U%!324=0        :
  1051.  stores command line arg (if any)
  1052. shell_MemFill(_U%!232,256,0)
  1053. shell_MemFill(_U%!236,256,0)
  1054. )OSVarBuff%=
  1055. shell_HeapBlockFetch(256)
  1056. Ashell_AppDir$=
  1057. shell_OSVarGetVal(OSVarBuff%,256,"Obey$Dir",1)
  1058. shell_HeapBlockReturn(OSVarBuff%)
  1059. 1shell_AppName$=
  1060. shell_Leaf(shell_AppDir$),2)
  1061. 5_U%!188=
  1062. shell_HeapBlockFetch((
  1063. shell_AppDir$)+1)
  1064. 6_U%!196=
  1065. shell_HeapBlockFetch((
  1066. shell_AppName$)+1)
  1067. &temp%=_U%!188:$temp%=shell_AppDir$
  1068. 'temp%=_U%!196:$temp%=shell_AppName$
  1069.  Now have a look at the command line used to start the program...
  1070. )cmdline$ = 
  1071. shell_OSReadCommandArg(1)
  1072.  cmdline$ <> "" 
  1073. B  _U%!100 = _U%!100 
  1074.  1 << 5:
  1075.  set 'command line args' flag...
  1076.  Store command line for later reference...
  1077. 2  temp% = 
  1078. shell_HeapBlockFetch(
  1079. cmdline$ + 1)
  1080. +  $(temp%) = cmdline$ : _U%!324 = temp%
  1081. *|Stop PROCshell_Init
  1082. "*|Start FNshell_GetCmdLineArgs
  1083. shell_GetCmdLineArgs
  1084.  cmdline$
  1085.  _U%!324 <> 0 
  1086.   cmdline$ = $(_U%!324)
  1087. = cmdline$
  1088. !*|Stop FNshell_GetCmdLineArgs
  1089. *|Start FNshell_FileType
  1090. shell_FileType(object$)
  1091.  type%
  1092.  "OS_File",5,object$ 
  1093.  ,,type%
  1094. type%=(type% 
  1095.  &FFF00)>>>8
  1096. =type%
  1097. *|Stop FNshell_FileType
  1098. *|Start FNshell_FileExists
  1099. shell_FileExists(object$)
  1100. shell_CatInfoRead(object$)="Not Found":=
  1101. *|Stop FNshell_FileExists
  1102. *|Start FNshell_CatInfoRead
  1103. shell_CatInfoRead(object$)
  1104.  type%,load_addr%,exec_addr%,length%,atts%,string$
  1105.  "OS_File",5,object$ 
  1106.  type%,,load_addr%,exec_addr%,length%,atts%
  1107.  type%=0 
  1108.  = "Not Found"
  1109.  atts%=51  
  1110.  string$+="WR "
  1111.  atts%=187 
  1112.  string$+="LWR"
  1113.  atts%=136 
  1114.  string$+="DL "
  1115. <string$+=" "+
  1116. shell_StringPadLeading(
  1117. ~load_addr%,"0",8)
  1118. <string$+=" "+
  1119. shell_StringPadLeading(
  1120. ~exec_addr%,"0",8)
  1121. 9string$+=" "+
  1122. shell_StringPadLeading(
  1123. ~length%,"0",8)
  1124. =string$
  1125. *|Stop FNshell_CatInfoRead
  1126. *|Start FNshell_GetAppDir
  1127. shell_GetAppDir
  1128.  temp%
  1129. temp%=_U%!188
  1130. =$temp%
  1131. *|Stop FNshell_GetAppDir
  1132. !*|Start FNshell_GetAppDataDir
  1133. shell_GetAppDataDir
  1134.  temp%
  1135. temp%=_U%!192
  1136. =$temp%
  1137.  *|Stop FNshell_GetAppDataDir
  1138. *|Start FNshell_GetAppName
  1139. shell_GetAppName
  1140.  temp%
  1141. temp%=_U%!196
  1142. =$temp%
  1143. *|Stop FNshell_GetAppName
  1144. #*|Start PROCshell_ResourcesInit
  1145. shell_ResourcesInit
  1146.  shell_AppDataDir$,temp%,shell_AppName$,shell_AppDir$
  1147.  OSVarBuff%,YEigFactor%,XEigFactor%
  1148. $shell_AppName$=
  1149. shell_GetAppName
  1150. #shell_AppDir$ =
  1151. shell_GetAppDir
  1152. )OSVarBuff%=
  1153. shell_HeapBlockFetch(256)
  1154. shell_OSVarExists(OSVarBuff%,shell_AppName$+"Res$Path") 
  1155. 3  _U%!100=_U%!100 
  1156.  1<<3:
  1157.  set 'ResFind' flag..
  1158. shell_OSVarExists(OSVarBuff%,shell_AppName$+"Data$Dir") 
  1159. V  shell_AppDataDir$=
  1160. shell_OSVarGetVal(OSVarBuff%,256,shell_AppName$+"Data$Dir",1)
  1161. ;  _U%!192=
  1162. shell_HeapBlockFetch((
  1163. shell_AppDataDir$)+1)
  1164. ,  temp%=_U%!192:$temp%=shell_AppDataDir$
  1165. 7  _U%!192=
  1166. shell_HeapBlockFetch((
  1167. shell_AppDir$)+1)
  1168. (  temp%=_U%!192:$temp%=shell_AppDir$
  1169.  _U%!100 
  1170.  1<<3 
  1171.  ResFind initialised..
  1172. *|define Using_ResFind
  1173. shell_FileExists(shell_AppName$+"Res:Messages") 
  1174. H    
  1175. shell_MessagesInit(shell_AppName$+"Res:Messages",_U%!68,_U%!64)
  1176. shell_FileExists(shell_AppName$+"Res:ShellMsgs") 
  1177. shell_MessagesInit(shell_AppName$+"Res:ShellMsgs",_U%!280,_U%!284)
  1178. D    
  1179. shell_MessagesInit("ShellSysRes:ShellMsgs",_U%!280,_U%!284)
  1180.  "XOS_ReadModeVariable",-1,04 
  1181.  ,,XEigFactor%
  1182.  "XOS_ReadModeVariable",-1,05 
  1183.  ,,YEigFactor%
  1184.  YEigFactor% = 1 
  1185. shell_FileExists(shell_AppName$+"Res:Sprites22") 
  1186. A    
  1187.  Screen mode is hi-res, and hi-res sprite file exists...
  1188. F    _U%!16 = 
  1189. shell_SpriteAreaLoad(shell_AppName$+"Res:Sprites22")
  1190. ;    
  1191. shell_FileExists(shell_AppName$+"Res:Sprites") 
  1192. 5      
  1193.  No hi-res sprite file, load normal one...
  1194. D      _U%!16=
  1195. shell_SpriteAreaLoad(shell_AppName$+"Res:Sprites")
  1196.         
  1197. >      _U%!16=1:
  1198.  use wimp sprite pool if no 'Sprites' file
  1199.         
  1200.  check if templates need loading
  1201. shell_FileExists(shell_AppName$+"Res:Templates") 
  1202. <    
  1203. shell_TemplatesInit(shell_AppName$+"Res:Templates")
  1204.  ResFind NOT initialised..
  1205. shell_FileExists(shell_AppDir$+".Messages") 
  1206. D    
  1207. shell_MessagesInit(shell_AppDir$+".Messages",_U%!68,_U%!64)
  1208. shell_FileExists(shell_AppDir$+".ShellMsgs") 
  1209. G    
  1210. shell_MessagesInit(shell_AppDir$+".ShellMsgs",_U%!280,_U%!284)
  1211. D    
  1212. shell_MessagesInit("ShellSysRes:ShellMsgs",_U%!280,_U%!284)
  1213.  Check if user sprites need loading, but first check if program
  1214.  has been started in a hi-res screen mode...
  1215.  "XOS_ReadModeVariable",-1,04 
  1216.  ,,XEigFactor%
  1217.  "XOS_ReadModeVariable",-1,05 
  1218.  ,,YEigFactor%
  1219.  YEigFactor% = 1 
  1220. shell_FileExists(shell_AppDir$+".Sprites22") 
  1221. A    
  1222.  Screen mode is hi-res, and hi-res sprite file exists...
  1223. B    _U%!16 = 
  1224. shell_SpriteAreaLoad(shell_AppDir$+".Sprites22")
  1225. 7    
  1226. shell_FileExists(shell_AppDir$+".Sprites") 
  1227. @      _U%!16=
  1228. shell_SpriteAreaLoad(shell_AppDir$+".Sprites")
  1229.         
  1230. >      _U%!16=1:
  1231.  use wimp sprite pool if no 'Sprites' file
  1232.         
  1233.  check if templates need loading
  1234. shell_FileExists(shell_AppDir$+".Templates") 
  1235. !8    
  1236. shell_TemplatesInit(shell_AppDir$+".Templates")
  1237.  "MenuUtil_Initialise"
  1238. shell_HeapBlockReturn(_Q%)
  1239. &>_Q%=
  1240. shell_HeapBlockFetch(1024):
  1241.  reduce global wimp block
  1242. shell_HeapBlockReturn(OSVarBuff%)
  1243. *"*|Stop PROCshell_ResourcesInit
  1244. ,"*|Start FNshell_SpriteAreaLoad
  1245. shell_SpriteAreaLoad(filename$)
  1246.  sp%,S%,T%
  1247. /%S%=
  1248.  (filename$):T%=
  1249. #S%+16:
  1250. 0!sp%=
  1251. shell_HeapBlockFetch(T%)
  1252. !sp%=T%:sp%!4=0
  1253. sp%!8=16:sp%!12=16
  1254.  "OS_SpriteOp",&209,sp%
  1255.  "OS_SpriteOp",&20A,sp%,filename$
  1256. *|ifdef TraceInit
  1257. shell_Tracef0("SpriteLoad:Sprite file loaded at &"+
  1258. ~sp%)
  1259. *|endif
  1260. :!*|Stop FNshell_SpriteAreaLoad
  1261. <#*|Start FNshell_UserSpritesBase
  1262. shell_UserSpritesBase
  1263. =_U%!16
  1264. @"*|Stop FNshell_UserSpritesBase
  1265. B *|Start FNshell_SpriteGetPtr
  1266. shell_SpriteGetPtr(spritearea%,name$)
  1267.  buffer%,ptr%
  1268. E%buffer%=
  1269. shell_HeapBlockFetch(21)
  1270. $buffer%=name$
  1271.  "OS_SpriteOp",&118,spritearea%,buffer% 
  1272.  ,,ptr%
  1273. shell_HeapBlockReturn(buffer%)
  1274. I    =ptr%
  1275. *|Stop FNshell_SpriteGetPtr
  1276. M#*|Start PROCshell_TemplatesInit
  1277. shell_TemplatesInit(filename$)
  1278.  TemplatePtr%,IndirectPtr%,IndirectEnd%,X%,ptr%
  1279.  filelen% ,pos%,name_buffer%,name$,nr_templates%
  1280.  file_offset%,data_size%,entry_type%,char%,identifier$,buff%
  1281.  indirected_size%,nr_icons%,total_indirsize%,j%,largest_def%
  1282.  name_buffer% 20
  1283.  (name_buffer% 
  1284.   name_buffer%+=1
  1285. WDpos% = 0:nr_templates% = 0:total_indirsize% = 0:largest_def% = 0
  1286. X+filelen% = 
  1287. shell_FileLength(filename$)
  1288.  Sniff around in the template file and work out the size of the indirected
  1289.  data buffer needed...
  1290. \%buff% = 
  1291. shell_HeapBlockFetch(13)
  1292. ]/X% = 
  1293. (filename$) :
  1294.  Open the template file
  1295. # X% = 16           :
  1296.  Skip header info
  1297.   identifier$  = ""
  1298.  "OS_GBPB",4,X%,buff%,4
  1299. b9  file_offset% = !buff%: 
  1300.  File offset for this entry
  1301. shell_Tracef0("TemplatesInit:file offset%  = "+
  1302. file_offset%)
  1303.  file_offset% > 0 
  1304.     nr_templates% += 1
  1305.     indirected_size% = 0
  1306. g!    
  1307.  "OS_GBPB",4,X%,buff%,4
  1308. h;    data_size%  = !buff% :
  1309.  Size of data for this entry
  1310. iB    
  1311. shell_Tracef0("TemplatesInit:data_size% = "+
  1312. data_size%) 
  1313. j!    
  1314.  "OS_GBPB",4,X%,buff%,4
  1315. k5    entry_type% = !buff% :
  1316.  Entry type (1=window)
  1317. l"    
  1318.  "OS_GBPB",4,X%,buff%,12
  1319.     ctr% = 0
  1320. n        
  1321.       char% = buff%?ctr%
  1322. p.      
  1323.  char% > 31 
  1324.  identifier$ += 
  1325. char%
  1326.       ctr% += 1
  1327.  char% <32
  1328. sE    old_ptr% = 
  1329. # X%           :
  1330.  Save current pointer position..
  1331. tH    
  1332. # X%  = file_offset% + 56 :
  1333.  Move pointer to title flags word..
  1334. uA    
  1335.  "OS_GBPB",4,X%,buff%,4   :
  1336.  Read title bar flag word..
  1337.     flags% = !buff%
  1338. wO    
  1339. # X% = file_offset% + 72  :
  1340.  Move pointer to start of title bar data..
  1341. xG    
  1342.  "OS_GBPB",4,X%,buff%,12  :
  1343.  Read 3 words of title bar data..
  1344. yL    indirected_size%  += 
  1345. shell_IconIndirSize(file_offset%,flags%,buff%)
  1346. zG    
  1347. # X% =  file_offset% + 84 :
  1348.  Move pointer to icon count word..
  1349. {9    
  1350.  "OS_GBPB",4,X%,buff%,4   :
  1351.  Read nr of icons..
  1352.     nr_icons% = !buff%
  1353. }O    
  1354. shell_Tracef0("TemplatesInit:nr icons        = "+
  1355. nr_icons%)          
  1356.  nr_icons% > 0 
  1357. "      
  1358.  j% = 0 
  1359.  nr_icons% - 1
  1360. 6        
  1361. # X% = file_offset% + 88 + (j% * 32) + 16
  1362. >        
  1363.  "OS_GBPB",4,X%,buff%,4 :
  1364.  Read icon flag word..
  1365.         flags% = !buff%
  1366. 6        
  1367. # X% = file_offset% + 88 + (j% * 32) + 20
  1368. F        
  1369.  "OS_GBPB",4,X%,buff%,12  :
  1370.  Read 3 words of icon data..
  1371. P        indirected_size%  += 
  1372. shell_IconIndirSize(file_offset%,flags%,buff%)
  1373.       
  1374.         
  1375. # X% = old_ptr%
  1376. G    
  1377. shell_Tracef0("TemplatesInit:entry_type%     = "+
  1378. entry_type%)
  1379. F    
  1380. shell_Tracef0("TemplatesInit:identifier$     = "+identifier$)
  1381. L    
  1382. shell_Tracef0("TemplatesInit:indirected size = "+
  1383. indirected_size%)
  1384. shell_Tracef0(" ")
  1385. ,    total_indirsize% += indirected_size%
  1386. Y    
  1387.  (88 + (nr_icons% * 32)) > largest_def% 
  1388.  largest_def% = (88 + (nr_icons% * 32))
  1389.  file_offset% = 0
  1390. # X%              :
  1391.  Close the template file
  1392. shell_HeapBlockReturn(buff%)
  1393. shell_Tracef0("TemplatesInit:total indirected= "+
  1394. total_indirsize%)
  1395.  Reserve space for window definitions
  1396. 2TemplateBlk% = 
  1397. shell_HeapBlockFetch(filelen%)
  1398. TemplatePtr% = TemplateBlk%
  1399.  Reserve a block to hold window identifiers (12 bytes) plus address of
  1400.  window block (4 bytes)
  1401. 5_U%!4 = 
  1402. shell_HeapBlockFetch(20 * nr_templates%)
  1403.  Reserve space for indirected icon data (size of largest window definition
  1404.  plus all of the indirected data)..
  1405. JIndirectBlk%  = 
  1406. shell_HeapBlockFetch(largest_def% + total_indirsize%)
  1407.  IndirectPtr%  = IndirectBlk%
  1408. DIndirectEnd%  = IndirectBlk% + (largest_def% + total_indirsize%)
  1409. nr_templates% = 0
  1410.  "Wimp_OpenTemplate",,filename$
  1411.   $name_buffer%="*"
  1412.  "Wimp_LoadTemplate",,TemplatePtr%,IndirectPtr%,IndirectEnd%,_U%!232,name_buffer%,pos% 
  1413.  ,,IndirectPtr%,,,name$,pos%
  1414.  pos%<>0 
  1415. 2    !((_U%!4)+(16*nr_templates%))=TemplatePtr%
  1416. /    $(((_U%!4)+(16*nr_templates%))+4)=name$
  1417. *|ifdef Trace_Init
  1418. A    
  1419. shell_Tracef0("TemplatesInit:  Template Loaded: "+name$)
  1420. *|endif
  1421. /    TemplatePtr%+=(88+(TemplatePtr%!84)*32)
  1422.     nr_templates%+=1
  1423.  pos%=0
  1424.  "Wimp_CloseTemplate"
  1425. _U%!0=nr_templates%
  1426. *|ifdef Trace_Init
  1427. shell_Tracef0("TemplatesInit:Templates resource file loaded at &"+
  1428. ~TemplateBlk%+" ("+
  1429. nr_templates%+" templates)")
  1430. *|endif
  1431. "*|Stop PROCshell_TemplatesInit
  1432.  *|Start FNshell_WindowLoaded
  1433. shell_WindowLoaded(window$)
  1434.  loop%,found%
  1435. (window$)>12 
  1436. shell_MessageOneArg("SHELLMSG02",window$)
  1437. found%=
  1438.  loop%=0 
  1439.  (_U%!0)-1
  1440.  $(((_U%!4)+(16*loop%))+4)=window$ 
  1441.      found%=
  1442. :loop%=(_U%!0)-1
  1443.  loop%
  1444. =found%
  1445. *|Stop FNshell_WindowLoaded
  1446. *|Start FNshell_GetWB
  1447. shell_GetWB(window$)
  1448.  loop%,found%
  1449. (window$)>12 
  1450. shell_MessageOneArg("SHELLMSG02",window$)
  1451. found%=-1
  1452.  loop%=0 
  1453.  (_U%!0)-1
  1454.  $(((_U%!4)+(16*loop%))+4)=window$ 
  1455. $    found%=loop%:loop%=(_U%!0)-1
  1456.  loop%
  1457.  found%>-1 
  1458.   =!((_U%!4)+(16*found%))
  1459. shell_MessageOneArg("SHELLMSG03",window$)
  1460. *|Stop FNshell_GetWB
  1461. !*|Start FNshell_MessageExpand
  1462. shell_MessageExpand(h$)
  1463.  s$, m$, index%
  1464.     s$=""
  1465. h$,"\")>0
  1466.   index%=
  1467. h$,"\")
  1468.   s$+=
  1469. h$,index%-1)
  1470.   m$=
  1471. h$,index%+1,1)
  1472.   h$=
  1473. h$,index%+2)
  1474. #    
  1475.  "A":s$+="Click ADJUST to"
  1476.  "a":s$+="ADJUST"
  1477. '    
  1478.  "D":s$+="Drag with SELECT to"
  1479. '    
  1480.  "d":s$+="Drag with ADJUST to"
  1481. 5    
  1482.  "G":s$+="This option is greyed out because"
  1483. *    
  1484.  "R":s$+="Move the pointer right"
  1485. #    
  1486.  "S":s$+="Click SELECT to"
  1487.  "s":s$+="SELECT"
  1488.  "T":s$+="This is the"
  1489. "    
  1490.  "W":s$+="This window is"
  1491.  "w":s$+="window"
  1492.     s$+="\"+m$
  1493. =s$+h$
  1494.  ----------------------------------------------------------
  1495.  *|Stop FNshell_MessageExpand
  1496. *|Start PROCshell_OpenMenu
  1497. shell_OpenMenu(x%,y%,m%)
  1498. /fn$=
  1499. shell_GetEventHandler(_U%!28,_U%!32,1)
  1500.  fn$<>"" 
  1501. *|ifdef Trace_Init
  1502. shell_Tracef0("OpenMenu:About to call "+"FN"+fn$+"("+
  1503. _U%!28+","+
  1504. _U%!32+")")
  1505. *|endif
  1506. :  void%=
  1507. ("FN"+fn$+"(_U%!28,_U%!32)"):
  1508.  call menumaker
  1509. shell_Tracef0("OpenMenu:no menumaker function registered")
  1510.  m%<>_U%!24 
  1511.  If menu is not being re-opened by an adjust click, discard stored
  1512.  'SelectionSoFar' string used by FontMenu routines..
  1513. shell_HeapBlockExists(_U%!256) 
  1514. 1    
  1515. shell_HeapBlockReturn(_U%!256):_U%!256=0
  1516.  And the name of the currently selected font in this menu..
  1517. shell_HeapBlockExists(_U%!244 ) 
  1518. 1    
  1519. shell_HeapBlockReturn(_U%!244):_U%!244=0
  1520.  m%=_U%!252 
  1521.  "Wimp_CreateMenu",,m%,x% - 64,y%
  1522.   _U%!264=1
  1523.   _Q%!0 = x%:_Q%!4 = y%
  1524.  "MenuUtil_Show",m%,_Q%
  1525.   _U%!264=0
  1526. 3_U%!24=m%:
  1527.  store handle of currently open menu
  1528. %_U%!36=x%:
  1529.  store menu x position
  1530. %_U%!40=y%:
  1531.  store menu y position
  1532.  _U%!52=_U%!28:
  1533.  store window
  1534. _U%!56=_U%!32:
  1535.  store icon
  1536. *|Stop PROCshell_OpenMenu
  1537.   *|Start FNshell_MenuLastXPos
  1538. shell_MenuLastXPos
  1539. =_U%!36
  1540. *|Stop FNshell_MenuLastXPos
  1541. & *|Start FNshell_MenuLastYPos
  1542. shell_MenuLastYPos
  1543. =_U%!40
  1544. *|Stop FNshell_MenuLastYPos
  1545. ,$*|Start PROCshell_MenuAttachDbox
  1546. shell_MenuAttachDbox(menu$)
  1547.  attach a dummy window handle for now, just so that the sub window arrow
  1548.  appears on the menu!
  1549.  "Menu_SetSubHandle",_U%!8,
  1550. shell_MenuString(menu$),1
  1551. shell_Tracef0("MenuAttachDbox:Dialog box ("+menu$+") attached")
  1552. 4#*|Stop PROCshell_MenuAttachDbox
  1553. 6!*|Start FNshell_MessageWindow
  1554. shell_MessageWindow(text$,cancel%,progname$,head$)
  1555.  keys%,err_blk%
  1556. 9'err_blk%=
  1557. shell_HeapBlockFetch(260)
  1558. :(!err_blk%=0:$(err_blk%+4)=text$+
  1559.  head$="" 
  1560.  head$="Message from "+progname$
  1561.  cancel% 
  1562.  "Wimp_ReportError",err_blk%,19,head$ 
  1563.  ,keys%
  1564.  "Wimp_ReportError",err_blk%,17,head$ 
  1565.  ,keys%
  1566. shell_HeapBlockReturn(err_blk%)
  1567. =keys%
  1568. D *|Stop FNshell_MessageWindow
  1569. F"*|Start PROCshell_CreateWindow
  1570. shell_CreateWindow(ident$,
  1571.  handle%)
  1572.  wb_ptr%
  1573. I wb_ptr%=
  1574. shell_GetWB(ident$)
  1575.  set 'sprite area' pointer to usersprites area
  1576. wb_ptr%!64=_U%!16
  1577.  "Wimp_CreateWindow",,wb_ptr% 
  1578.  handle%
  1579. O!*|Stop PROCshell_CreateWindow
  1580. P!*|Start FNshell_CreateWindow2
  1581. shell_CreateWindow2(title,flags%,fgcol%,bgcol%,maxx%,miny%,l%,b%,r%,t%)
  1582. S"Q%=
  1583. shell_HeapBlockFetch(3000)
  1584. T,Q%!0=l%:Q%!4=b%:Q%!8=r%:Q%!12=t%:Q%!16=0
  1585. U)Q%!20=0:Q%!24=-1:Q%!28=flags%:Q%?32=7
  1586. V%Q%?33=2:Q%?34=fgcol%:Q%?35=bgcol%
  1587. Q%?36=3:Q%?37=1
  1588. X'Q%?38=2:Q%?39=0:Q%!40=0:Q%!44=miny%
  1589. Y.Q%!48=maxx%:Q%!52=0:Q%!56=&13D:Q%!60=&3000
  1590. Z6Q%!68=1:Q%!72=title:Q%!76=-1:Q%!80=
  1591. $title:Q%!84=0
  1592.  "Wimp_CreateWindow",,Q% 
  1593.  handle%
  1594. shell_HeapBlockReturn(Q%)
  1595. =handle%
  1596. _ *|Stop FNshell_CreateWindow2
  1597. a%*|Start FNshell_WindowHasTitleBar
  1598. shell_WindowHasTitleBar(wh%)
  1599. shell_WindowGetFlags(wh%) 
  1600.  1<<26)
  1601. e$*|Stop FNshell_WindowHasTitleBar
  1602. g$*|Start FNshell_WindowIsMoveable
  1603. shell_WindowIsMoveable(wh%)
  1604. shell_WindowGetFlags(wh%) 
  1605.  1<<1)
  1606. l#*|Stop FNshell_WindowIsMoveable
  1607. n!*|Start FNshell_WindowIsAPane
  1608. shell_WindowIsAPane(wh%)
  1609. shell_WindowGetFlags(wh%) 
  1610.  1<<5)
  1611. r *|Stop FNshell_WindowIsAPane
  1612. t&*|Start FNshell_WindowIsNotBounded
  1613. shell_WindowIsNotBounded(wh%)
  1614. shell_WindowGetFlags(wh%) 
  1615.  1<<6)
  1616. x%*|Stop FNshell_WindowIsNotBounded
  1617. z&*|Start FNshell_WindowTrapsHotKeys
  1618. shell_WindowTrapsHotKeys(wh%)
  1619. shell_WindowGetFlags(wh%) 
  1620.  1<<12)
  1621. ~%*|Stop FNshell_WindowTrapsHotKeys
  1622.  *|Start FNshell_WindowIsOpen
  1623. shell_WindowIsOpen(wh%)
  1624. shell_WindowGetFlags(wh%) 
  1625.  1<<16)
  1626. *|Stop FNshell_WindowIsOpen
  1627. !*|Start FNshell_WindowIsOnTop
  1628. shell_WindowIsOnTop(wh%)
  1629. shell_WindowGetFlags(wh%) 
  1630.  1<<17)
  1631.  *|Stop FNshell_WindowIsOnTop
  1632. (*|Start FNshell_WindowHasBeenToggled
  1633. shell_WindowHasBeenToggled(wh%)
  1634. shell_WindowGetFlags(wh%) 
  1635.  1<<18)
  1636. '*|Stop FNshell_WindowHasBeenToggled
  1637. '*|Start FNshell_WindowHasInputFocus
  1638. shell_WindowHasInputFocus(wh%)
  1639. shell_WindowGetFlags(wh%) 
  1640.  1<<20)
  1641. &*|Stop FNshell_WindowHasInputFocus
  1642. %*|Start FNshell_WindowHasBackIcon
  1643. shell_WindowHasBackIcon(wh%)
  1644. shell_WindowGetFlags(wh%) 
  1645.  1<<24)
  1646. $*|Stop FNshell_WindowHasBackIcon
  1647. &*|Start FNshell_WindowHasCloseIcon
  1648. shell_WindowHasCloseIcon(wh%)
  1649. shell_WindowGetFlags(wh%) 
  1650.  1<<25)
  1651. %*|Stop FNshell_WindowHasCloseIcon
  1652. '*|Start FNshell_WindowHasToggleIcon
  1653. shell_WindowHasToggleIcon(wh%)
  1654. shell_WindowGetFlags(wh%) 
  1655.  1<<27)
  1656. &*|Stop FNshell_WindowHasToggleIcon
  1657. '*|Start FNshell_WindowHasVScrollBar
  1658. shell_WindowHasVScrollBar(wh%)
  1659. shell_WindowGetFlags(wh%) 
  1660.  1<<28)
  1661. &*|Stop FNshell_WindowHasVScrollBar
  1662. +*|Start FNshell_WindowHasAdjustSizeIcon
  1663. shell_WindowHasAdjustSizeIcon(wh%)
  1664. shell_WindowGetFlags(wh%) 
  1665.  1<<29)
  1666. **|Stop FNshell_WindowHasAdjustSizeIcon
  1667. '*|Start FNshell_WindowHasHScrollBar
  1668. shell_WindowHasHScrollBar(wh%)
  1669. shell_WindowGetFlags(wh%) 
  1670.  1<<30)
  1671. &*|Stop FNshell_WindowHasHScrollBar
  1672. "*|Start FNshell_WindowGetFlags
  1673. shell_WindowGetFlags(wh%)
  1674.  flags%,blk%
  1675. "blk%=
  1676. shell_HeapBlockFetch(36)
  1677. blk%!0=wh%
  1678.  "Wimp_GetWindowState",,blk%
  1679. flags%=blk%!32
  1680. shell_HeapBlockReturn(blk%)
  1681. =flags%
  1682. !*|Stop FNshell_WindowGetFlags
  1683. '*|Start FNshell_WindowGetTitleFlags
  1684. shell_WindowGetTitleFlags(wh%)
  1685.  flags%,blk%
  1686. $blk%=
  1687. shell_HeapBlockFetch(6000)
  1688. blk%!0=wh%
  1689.  "Wimp_GetWindowInfo",,blk%
  1690. flags%=blk%!60
  1691. shell_HeapBlockReturn(blk%)
  1692. =flags%
  1693. &*|Stop FNshell_WindowGetTitleFlags
  1694.  *|Start FNshell_IconGetFlags
  1695. shell_IconGetFlags(wh%,ih%)
  1696.  flags%,blk%
  1697.  claim a block as temporary workspace big enough for data
  1698.  returned by SWI call (icon block + 8 bytes)
  1699. "blk%=
  1700. shell_HeapBlockFetch(50)
  1701. blk%!0=wh%:blk%!4=ih%
  1702.  "Wimp_GetIconState",,blk%
  1703. flags%=blk%!24
  1704. shell_HeapBlockReturn(blk%)
  1705. =flags%
  1706. *|Stop FNshell_IconGetFlags
  1707. $*|Start FNshell_WindowTitleFlags
  1708. shell_WindowTitleFlags(wh%)
  1709.  flags%,blk%
  1710. $blk%=
  1711. shell_HeapBlockFetch(3000)
  1712. blk%!0=wh%
  1713.  "Wimp_GetWindowInfo",,blk%
  1714. flags%=blk%!60
  1715. shell_HeapBlockReturn(blk%)
  1716. =flags%
  1717. #*|Stop FNshell_WindowTitleFlags
  1718. (*|Start FNshell_WindowTitleHasBorder
  1719. shell_WindowTitleHasBorder(wh%)
  1720. shell_WindowTitleFlags(wh%) 
  1721.  1<<2)
  1722. '*|Stop FNshell_WindowTitleHasBorder
  1723. '*|Start FNshell_WindowTitleIsSprite
  1724. shell_WindowTitleIsSprite(wh%)
  1725. shell_WindowTitleFlags(wh%) 
  1726.  1<<1)
  1727. &*|Stop FNshell_WindowTitleIsSprite
  1728. %*|Start FNshell_WindowTitleIsText
  1729. shell_WindowTitleIsText(wh%)
  1730. shell_WindowTitleFlags(wh%) 
  1731.  1<<0)
  1732. $*|Stop FNshell_WindowTitleIsText
  1733. )*|Start FNshell_WindowTitleIsHCentred
  1734. shell_WindowTitleIsHCentred(wh%)
  1735. shell_WindowTitleFlags(wh%) 
  1736.  1<<3)
  1737. (*|Stop FNshell_WindowTitleIsHCentred
  1738. )*|Start FNshell_WindowTitleIsVCentred
  1739. shell_WindowTitleIsVCentred(wh%)
  1740. shell_WindowTitleFlags(wh%) 
  1741.  1<<4)
  1742. (*|Stop FNshell_WindowTitleIsVCentred
  1743. '*|Start FNshell_WindowTitleIsFilled
  1744. shell_WindowTitleIsFilled(wh%)
  1745. shell_WindowTitleFlags(wh%) 
  1746.  1<<5)
  1747. &*|Stop FNshell_WindowTitleIsFilled
  1748. )*|Start FNshell_WindowTitleIsAAliased
  1749. shell_WindowTitleIsAAliased(wh%)
  1750. shell_WindowTitleFlags(wh%) 
  1751.  1<<6)
  1752. (*|Stop FNshell_WindowTitleIsAAliased
  1753. +*|Start FNshell_WindowTitleIsIndirected
  1754. shell_WindowTitleIsIndirected(wh%)
  1755. shell_WindowTitleFlags(wh%) 
  1756.  1<<8)
  1757. **|Stop FNshell_WindowTitleIsIndirected
  1758. "*|Start FNshell_WindowGetTitle
  1759. shell_WindowGetTitle(wh%)
  1760.  title$,blk%
  1761.  Check if window has a title bar..
  1762. "$blk%=
  1763. shell_HeapBlockFetch(3000)
  1764. blk%!0=wh%
  1765.  "Wimp_GetWindowInfo",,blk%
  1766.  (blk%!32 
  1767.  1<<26) 
  1768.  ((blk%!60) 
  1769.  &100)=0 
  1770. '#    
  1771.  Title is not indirected..
  1772.     title$=$(blk%+76)
  1773.  Title is indirected..
  1774.     title$=$(!(blk%+76))
  1775. shell_HeapBlockReturn(blk%)
  1776. =title$
  1777. 1!*|Stop FNshell_WindowGetTitle
  1778. 3+*|Start FNshell_WindowTitleBufferLength
  1779. shell_WindowTitleBufferLength(wh%)
  1780.  result%,blk%
  1781. 6$blk%=
  1782. shell_HeapBlockFetch(3000)
  1783. blk%!0=wh%
  1784.  "Wimp_GetWindowInfo",,blk%
  1785.  ((blk%!60) 
  1786.  &100)=0 
  1787.     result%=12
  1788.     result%=blk%!84
  1789. shell_HeapBlockReturn(blk%)
  1790. =result%
  1791. A**|Stop FNshell_WindowTitleBufferLength
  1792. C&*|Start PROCshell_WindowMoveToIcon
  1793. shell_WindowMoveToIcon(wh%,iwh%,ih%,x_off%,y_off%)
  1794.  i_blk%,w_blk%
  1795. F)i_blk%    = 
  1796. shell_HeapBlockFetch(50)
  1797. G)w_blk%    = 
  1798. shell_HeapBlockFetch(36)
  1799. w_blk%!20 = 0
  1800. shell_OSCheckVersion(3) 
  1801.  iwh% = -1 
  1802.  !w_blk% = -2 
  1803.  !w_blk% = iwh%
  1804.  "Wimp_GetWindowState",,w_blk%
  1805. M$i_blk%!0 = iwh% : i_blk%!4 = ih%
  1806.  "Wimp_GetIconState",,i_blk%
  1807. shell_WindowMoveTo(wh%,i_blk%!8+x_off%-w_blk%!20,i_blk%!20+y_off%)
  1808.  PROCshell_WindowMoveTo(wh%,i_blk%!8+x_off%,i_blk%!20+y_off%)
  1809. shell_HeapBlockReturn(i_blk%)
  1810. shell_HeapBlockReturn(w_blk%)
  1811. U%*|Stop PROCshell_WindowMoveToIcon
  1812. W"*|Start PROCshell_WindowMoveTo
  1813. shell_WindowMoveTo(wh%,x%,y%)
  1814.  win_width%,win_height%,offset%,blk%
  1815. Z$blk%=
  1816. shell_HeapBlockFetch(3000)
  1817. blk%!0=wh%
  1818.  "Wimp_GetWindowInfo",,blk%
  1819. win_width% =blk%!12-blk%!4
  1820. win_height%=blk%!16-blk%!8
  1821. blk%!4=x%
  1822. blk%!8=y%
  1823. blk%!12=x%+win_width%
  1824. blk%!16=y%+win_height%
  1825.  this looks really silly, but is necessary to tell the
  1826.  window manager the new window coords. The shell_OpenWindow
  1827.  call sets up any panes and actually opens the window in
  1828.  the new position
  1829.  "Wimp_OpenWindow",,blk%
  1830.  "Wimp_CloseWindow",,blk%
  1831. i,offset%=
  1832. shell_SearchStatic(_U%!184,wh%)
  1833.  offset%>-1 
  1834. shell_OpenWindowStatic(wh%)
  1835. shell_OpenWindowDynamic(wh%,0,0)
  1836. shell_HeapBlockReturn(blk%)
  1837. r!*|Stop PROCshell_WindowMoveTo
  1838. t&*|Start PROCshell_WindowBringToTop
  1839. shell_WindowBringToTop(wh%)
  1840.  msg%
  1841. w#msg%=
  1842. shell_HeapBlockFetch(256)
  1843. msg%!0=wh%
  1844.  "Wimp_GetWindowState",,msg%
  1845. msg%!28=-1
  1846.  "Wimp_SendMessage",2,msg%,wh%
  1847.  now call wimp poll as this action must happen
  1848.  without waiting for next wimp poll...
  1849.  "Wimp_Poll",0,msg%
  1850. shell_HeapBlockReturn(msg%)
  1851. %*|Stop PROCshell_WindowBringToTop
  1852. "*|Start PROCshell_UpdateWindow
  1853. shell_UpdateWindow(handle%,l%,b%,r%,t%)
  1854.  blk%
  1855. $blk%=
  1856. shell_HeapBlockFetch(blk%)
  1857. <blk%!0=handle%:blk%!4=l%:blk%!8=b%:blk%!12=r%:blk%!16=t%
  1858.  "Wimp_UpdateWindow",,blk% 
  1859.  more%
  1860.  "Wimp_GetWindowState",,blk%
  1861. shell_HeapBlockReturn(blk%)
  1862. !*|Stop PROCshell_UpdateWindow
  1863. '*|Start PROCshell_OpenWindowDynamic
  1864. shell_OpenWindowDynamic(wh%,x_off%,y_off%)
  1865.  void%,ptr_blk%
  1866. &ptr_blk%=
  1867. shell_HeapBlockFetch(20)
  1868. _U%!20=wh%
  1869.  "Wimp_GetPointerInfo",,ptr_blk%
  1870.  "Wimp_CreateMenu",,wh%,ptr_blk%!0+x_off%,ptr_blk%!4+y_off%
  1871. shell_HeapBlockReturn(ptr_blk%)
  1872. &*|Stop PROCshell_OpenWindowDynamic
  1873. !*|Start FNshell_ClaimKeypress
  1874. shell_ClaimKeypress
  1875.  Bodge to ensure that shell_OpenWindowDynamic works properly..
  1876.  _U%!20<>0 
  1877.  "Wimp_CreateMenu",,-1
  1878. '  void%=
  1879. shell_DeleteWindow(_U%!20)
  1880.   _U%!20=0
  1881.  *|Stop FNshell_ClaimKeypress
  1882.  *|Start PROCshell_OpenWindow
  1883. shell_OpenWindow(wh%,full%,front%)
  1884.  offset%,blk%,paneblk%,ctr%,first_pane%,behind%,height%,width%
  1885.  flag%,toggle%,t%,last_pane%,prev_pane%,res%
  1886. :offset%=
  1887. shell_GetEventListOffset(wh%,-1,_U%+304,12,
  1888.  offset%>=0 
  1889.   blk%=_U%!304+offset%
  1890.   temp%=blk%!8
  1891. *|ifdef Trace_Init
  1892. shell_Tracef0("OpenWindow:About to call "+"FN"+$temp%)
  1893. *|endif
  1894.   res%=
  1895. ("FN"+$temp%)
  1896.  res%=0 
  1897. toggle%=
  1898. shell_HeapBlockFetch(100):t%!0=wh%
  1899.  "Wimp_GetWindowState",,t%
  1900.  (t%!32 
  1901.  &80000)=&80000 
  1902.  toggle%=
  1903.  toggle%=
  1904. shell_HeapBlockReturn(t%)
  1905. _Q%!0=wh%
  1906.  full% 
  1907.  "Wimp_GetWindowState",,_Q%
  1908.  toggle% 
  1909.  "Wimp_OpenWindow",,_Q%
  1910. 9offset%=
  1911. shell_GetEventListOffset(wh%,-1,_U%+92,24,
  1912.  offset%>-1 
  1913.   blk%=(_U%!92)+offset%
  1914.  pane handler event found
  1915. ?  ptr8%=blk%!8:ptr12%=blk%!12:ptr16%=blk%!16:ptr20%=blk%!20
  1916.   _Q%!0=wh%
  1917.  front% 
  1918.  behind%=-1 
  1919.  behind%=_Q%!28
  1920.  full% 
  1921. 6    
  1922.  "Wimp_OpenWindow",,_Q%     :
  1923.  vbase fudge..
  1924. %    
  1925.  "Wimp_GetWindowState",,_Q%
  1926. 6    
  1927.  "Wimp_CloseWindow",,_Q%    :
  1928.  vbase fudge..
  1929.  reserve 1k as buffer - hope it's enough.....
  1930. *  paneblk%=
  1931. shell_HeapBlockFetch(1024)
  1932.   ctr%=0
  1933.  ptr8%!ctr%<>-1
  1934. 0    paneblk%!0=ptr8%!ctr%:
  1935.  handle of 'pane'
  1936. 0    
  1937.  first_pane%=0 
  1938.  first_pane%=paneblk%!0
  1939.     last_pane%=paneblk%!0
  1940. *    
  1941.  "Wimp_GetWindowState",,paneblk%
  1942. 0    
  1943.  Check flag word in pane event block...
  1944.     flag%=ptr12%!ctr%
  1945.  flag% 
  1946. (      height%=paneblk%!16-paneblk%!8
  1947. '      width%=paneblk%!12-paneblk%!4
  1948. &      paneblk%!4=_Q%!4+ptr16%!ctr%
  1949. '      paneblk%!12=paneblk%!4+width%
  1950. (      paneblk%!16=_Q%!16+ptr20%!ctr%
  1951. (      paneblk%!8=paneblk%!16-height%
  1952. %      
  1953.  Attached to top edge.....
  1954. (      height%=paneblk%!16-paneblk%!8
  1955.       width%=_Q%!12-_Q%!4
  1956. &      paneblk%!4=_Q%!4+ptr16%!ctr%
  1957.       paneblk%!12=_Q%!12
  1958. (      paneblk%!16=_Q%!16+ptr20%!ctr%
  1959. (      paneblk%!8=paneblk%!16-height%
  1960. $      
  1961.  Attached to left edge...
  1962.       height%=_Q%!16-_Q%!8
  1963. '      width%=paneblk%!12-paneblk%!4
  1964. &      paneblk%!4=_Q%!4+ptr16%!ctr%
  1965. '      paneblk%!12=paneblk%!4+width%
  1966. 1      paneblk%!16=_Q%!16             :
  1967.  min y
  1968. 1      paneblk%!8=_Q%!8+ptr20%!ctr%   :
  1969.  max y
  1970. &      
  1971.  Attached to bottom edge...
  1972. (      height%=paneblk%!16-paneblk%!8
  1973.       width%=_Q%!12-_Q%!4
  1974. &      paneblk%!4=_Q%!4+ptr16%!ctr%
  1975.       paneblk%!12=_Q%!12
  1976. /      paneblk%!16=_Q%!8+height%+ptr20%!ctr%
  1977. (      paneblk%!8=paneblk%!16+height%
  1978. %      
  1979.  Attached to right edge...
  1980.       height%=_Q%!16-_Q%!8
  1981. '      width%=paneblk%!12-paneblk%!4
  1982. .      paneblk%!4=_Q%!12-width%+ptr16%!ctr%
  1983. '      paneblk%!12=paneblk%!4+width%
  1984. %      paneblk%!16=_Q%!16 :
  1985.  min y
  1986. %      paneblk%!8=_Q%!8   :
  1987.  max y
  1988.         
  1989.  ctr%=0 
  1990.       paneblk%!28=behind%
  1991.         
  1992.        paneblk%!28=prev_pane%
  1993.         
  1994. &    
  1995.  "Wimp_OpenWindow",,paneblk%
  1996.     prev_pane%=paneblk%!0
  1997.     ctr%+=4
  1998.  toggle% 
  1999.     _Q%!28=last_pane%
  2000.     !    
  2001.  "Wimp_OpenWindow",,_Q%
  2002. shell_HeapBlockReturn(paneblk%)
  2003.  no pane event...
  2004.   _Q%!0=wh%
  2005.  full% 
  2006.  "Wimp_GetWindowState",,_Q%
  2007.  behind%=-2 
  2008.  _Q%!28=-2
  2009.  front%=-1 
  2010.  _Q%!28=-1
  2011.  "Wimp_OpenWindow",,_Q%
  2012. *|Stop PROCshell_OpenWindow
  2013. !*|Start PROCshell_CloseWindow
  2014. shell_CloseWindow(wh%)
  2015.  offset%,blk%,ptr8%,ptr12%,ptr16%,ptr20%,win_blk%,res%
  2016. :offset%=
  2017. shell_GetEventListOffset(wh%,-1,_U%+308,12,
  2018.  offset%>=0 
  2019.   blk%=_U%!308+offset%
  2020.   temp%=blk%!8
  2021. *|ifdef Trace_Init
  2022. shell_Tracef0("CloseWindow:About to call "+"FN"+$temp%)
  2023. *|endif
  2024.   res%=
  2025. ("FN"+$temp%)
  2026.  res%=0 
  2027. %&win_blk%=
  2028. shell_HeapBlockFetch(60)
  2029.  wh%>0 
  2030. ';  offset%=
  2031. shell_GetEventListOffset(wh%,-1,_U%+92,24,
  2032.  offset%>-1 
  2033.     blk%=(_U%!92)+offset%
  2034. *4    ptr12%=blk%!12:ptr16%=blk%!16:ptr20%=blk%!20
  2035.     ctr%=0:ptr8%=blk%!8
  2036.  ptr8%!ctr%<>-1
  2037.       
  2038.  close pane windows
  2039.       win_blk%!0=ptr8%!ctr%
  2040. /)      
  2041.  "Wimp_CloseWindow",,win_blk%
  2042.       ctr%+=4
  2043. 1        
  2044. 2*    
  2045.  PROCshell_HeapBlockReturn(ptr8%)
  2046. 3+    
  2047.  PROCshell_HeapBlockReturn(ptr12%)
  2048. 4+    
  2049.  PROCshell_HeapBlockReturn(ptr16%)
  2050. 5+    
  2051.  PROCshell_HeapBlockReturn(ptr20%)
  2052.  close parent window
  2053. 84  win_blk%!0=wh%:
  2054.  "Wimp_CloseWindow",,win_blk%
  2055. shell_HeapBlockReturn(win_blk%)
  2056. = *|Stop PROCshell_CloseWindow
  2057. ? *|Start FNshell_DeleteWindow
  2058. shell_DeleteWindow(handle%)
  2059.  win_blk%
  2060. B&win_blk%=
  2061. shell_HeapBlockFetch(20)
  2062.  handle%<>0 
  2063. oktodeletew(handle%) 
  2064. E&    
  2065. shell_EventDeleteAll(handle%)
  2066. F#    
  2067.  handle%=_U%!20 
  2068.  _U%!20=0
  2069. G4    offset%=
  2070. shell_SearchStatic(_U%!184,handle%)
  2071.  offset%>-1 
  2072.       temp%=_U%!184+offset%
  2073. J7      temp%!0=0:
  2074.  wipe window handle in static list
  2075. K        
  2076. L.    
  2077.  and now actually delete the window..
  2078.     win_blk%!0=handle%
  2079. N(    
  2080.  "Wimp_DeleteWindow",,win_blk%
  2081.     handle%=0
  2082. shell_HeapBlockReturn(win_blk%)
  2083. =handle%
  2084. *|Stop FNshell_DeleteWindow
  2085. *|Start FNoktodeletew
  2086. oktodeletew(handle%)
  2087. *|Stop FNoktodeletew
  2088. *|Start FNoktoclosew
  2089. oktoclosew(handle%)
  2090. *|Stop FNoktoclosew
  2091. *|Start PROCcliprect
  2092. cliprect(b,
  2093.  x1%,
  2094.  y1%,
  2095.  x2%,
  2096.  y2%)
  2097.  x0%,y0%
  2098. lwaorigin(b,x0%,y0%):x1%=b!24-x0%:y1%=b!28-y0%:x2%=b!32-x0%
  2099. y2%=b!36-y0%
  2100. *|Stop PROCcliprect
  2101. *|Start FNpoll
  2102. poll(mask%,task%)
  2103.  "Wimp_Poll",mask%,_Q% 
  2104. *|Stop FNpoll
  2105. *|Start FNshell_Poll_I
  2106. shell_Poll_I(mask%,task%)
  2107.  "Wimp_Poll",mask%,_Q% 
  2108.  "Interface_Poll",a%,,task%
  2109. *|Stop FNshell_Poll_I
  2110. v&*|Start PROCshell_DoBackgroundTask
  2111. shell_DoBackgroundTask
  2112. z%*|Stop PROCshell_DoBackgroundTask
  2113. |#*|Start FNshell_IconIsDraggable
  2114. shell_IconIsDraggable(wh%,ih%)
  2115.  flags%
  2116. 'flags%=
  2117. shell_IconGetFlags(wh%,ih%)
  2118. temp%=(flags% 
  2119.  &6000)
  2120.  temp%=&6000 =
  2121. "*|Stop FNshell_IconIsDraggable
  2122.  *|Start FNshell_IconIsSprite
  2123. shell_IconIsSprite(wh%,ih%)
  2124.  flags%,temp%
  2125. 'flags%=
  2126. shell_IconGetFlags(wh%,ih%)
  2127. temp%=(flags% 
  2128.  1<<1)
  2129.  temp%=(1<<1) 
  2130. *|Stop FNshell_IconIsSprite
  2131. !*|Start PROCshell_IconDragBox
  2132. shell_IconDragBox(wh%,ih%)
  2133.  blk%,wex,wey,e_offset%,flags%,f%,DragASprite%,spr_area%,valid%,spr$
  2134.  name_ic%,name$
  2135.  check if an event has been registered for when the drag ends..
  2136. <e_offset%=
  2137. shell_GetEventListOffset(wh%,ih%,_U%+72,24,
  2138.  e_offset%>=0 
  2139.  it has, so go ahead and allow the drag, but first check if a filename
  2140.  is present in the filename icon..
  2141.   blk%=_U%!72+e_offset%
  2142.   name_ic%=blk%!16
  2143. ,  name$=
  2144. shell_IconGetData(wh%,name_ic%)
  2145.  name$="" 
  2146. shell_OK(
  2147. shell_MessageNoArgs("SHELLMSG28"))
  2148. &  blk%=
  2149. shell_HeapBlockFetch(6000)
  2150.   !blk%=wh%
  2151.  "Wimp_GetWindowInfo",,blk%
  2152. ,  wex=blk%!4-blk%!20:wey=blk%!16-blk%!24
  2153.   spr_area%=blk%!68
  2154.   blk%!4=ih%
  2155.  "Wimp_GetIconState",,blk%
  2156. 6  !blk%=wh%:blk%!4=5:flags%=blk%!24:valid%=blk%!32
  2157.   blk%!8=blk%!8+wex
  2158.   blk%!12=blk%!12+wey
  2159.   blk%!16=blk%!16+wex
  2160.   blk%!20=blk%!20+wey
  2161.   blk%!24=0:blk%!28=0
  2162. )  blk%!32=&7FFFFFFF:blk%!36=&7FFFFFFF
  2163.  check dragasprite bit in CMOS RAM..
  2164.  "OS_Byte",161,28 
  2165.  ,,f%
  2166.   DragASprite%=((f% 
  2167.  2)=2)
  2168.  DragASprite% 
  2169.     f%=flags%
  2170.  (f% 
  2171.  &100) 
  2172. 0      spr$=
  2173. shell_IconGetCommand(valid%,"s")
  2174.         
  2175. D    
  2176.  (f% 
  2177.  2)=0 
  2178. shell_OK(
  2179. shell_MessageNoArgs("SHELLMSG19"))
  2180.  spr$<>"" 
  2181. @      
  2182.  "DragASprite_Start",%10000101,spr_area%,spr$,blk%+8
  2183. 8      _U%!100=_U%!100 
  2184.  set 'dragasprite' flag..
  2185.         
  2186. !      
  2187.  "Wimp_DragBox",,blk%
  2188.         
  2189.  "Wimp_DragBox",,blk%
  2190. shell_HeapBlockReturn(blk%)
  2191. shell_Tracef0("IconDragBox:WARNING! no drag handler registered for this icon!")
  2192.  *|Stop PROCshell_IconDragBox
  2193. (*|Start PROCshell_HandleAttachedMenu
  2194. shell_HandleAttachedMenu(_Q%,wh%,ih%)
  2195.  menu%
  2196.  Only executed when SELECT is pressed over an icon that has an
  2197.  attached menu..
  2198.  ih% <> -1 
  2199.  wh% > -1 
  2200. 0  menu% = 
  2201. shell_GetEventMenu(_Q%!8,wh%,ih%)
  2202.  menu% <> 0 
  2203. 2    
  2204. shell_HandleMenuOpen(_Q%,menu%,wh%,ih%,
  2205. '*|Stop PROCshell_HandleAttachedMenu
  2206. *|Start PROCshell_Action
  2207. shell_Action(evnt%)
  2208.  fn$,menu%,menu$,select$,menu_buffer%,mx%,my%,claimed%
  2209.  wh%,ih%,void%,_temp28%,_temp32%,_temp24%,_temp%,fontmenuflag%
  2210.  CheckSelect%,offset%
  2211.  evnt% 
  2212. &*|ifdef PROCshell_DoBackgroundTask
  2213. shell_DoBackgroundTask
  2214. *|endif
  2215. shell_RedrawWindow(_Q%!0)
  2216. shell_OpenWindow(_Q%!0,
  2217. shell_CloseWindow(_Q%!0)
  2218. **|ifdef PROCshell_PointerLeavingWindow
  2219. shell_PointerLeavingWindow(_Q%)
  2220. *|endif
  2221. +*|ifdef PROCshell_PointerEnteringWindow
  2222. shell_PointerEnteringWindow(_Q%)
  2223. *|endif
  2224.  6:_U%!28=_Q%!12:_U%!32=_Q%!16:mx%=_Q%!0:my%=_Q%!4
  2225. 6         _U%!272=_Q%!0:_U%!276=_Q%!4:_U%!320=_Q%!8
  2226. 7         _temp28%=_Q%!12:_temp32%=_Q%!16:ih%=_Q%!16
  2227. *|ifdef TraceInit
  2228. @         
  2229. shell_Tracef0("Action:Mouse_Click event detected")
  2230. ^         
  2231. shell_Tracef0("Action:Window Handle was &"+
  2232. ~_Q%!12+" Icon Handle was "+
  2233. _Q%!16)
  2234. *|endif
  2235. 0         
  2236.  _Q%!12=_U%!288 
  2237.  _Q%!16=_U%!292 
  2238. C           
  2239.  same icon pressed again, use stored event offset..
  2240. B           
  2241. shell_HandleBumpIcons(_U%!296,_Q%!12,_Q%!16,_Q%!8)
  2242.          
  2243. /           _U%!288=-1:_U%!292=-1:_U%!296=-1
  2244.            
  2245.  _Q%!16>=0 
  2246. N             offset%=
  2247. shell_GetEventListOffset(_Q%!12,_Q%!16,_U%+104,16,0)
  2248. S             
  2249.  offset%>=0 
  2250. shell_HandleBumpIcons(offset%,_Q%!12,_Q%!16,_Q%!8)
  2251.            
  2252.          
  2253. )         
  2254.  check first for drag flag!
  2255.          
  2256.  (_Q%!8=64) 
  2257. 9           
  2258.  only check for SELECT and ADJUST buttons
  2259. <           result%=
  2260. shell_IconIsDraggable(_Q%!12,_Q%!16)
  2261.            
  2262.  result% 
  2263. *             mess$="Icon is draggable"
  2264. +             
  2265.  so now draw the drag box
  2266. 2             
  2267. shell_IconDragBox(_Q%!12,_Q%!16)
  2268.            
  2269. .             mess$="Icon is not draggable"
  2270.            
  2271. .           
  2272. shell_Tracef0("Action:"+mess$)
  2273.          
  2274.          
  2275.  _Q%!8 
  2276. ,           
  2277. shell_ActionSelectButton
  2278. *           
  2279. shell_ActionMenuButton
  2280. ,           
  2281. shell_ActionAdjustButton
  2282.          
  2283.  _U%!100 
  2284. $           
  2285.  "DragASprite_Stop"
  2286. "           _U%!100=_U%!100 
  2287.          
  2288. F         _U%!128=0:
  2289.  set RAMPtr% to 0 in case a RAMFetch follows..
  2290. E         
  2291.  have to use last window/icon handles from _U% block as
  2292. ?         
  2293.  _Q% block could be corrupted by other poll calls
  2294. 8         fn$=
  2295. shell_GetEventHandler(_U%!28,_U%!32,6)
  2296.          
  2297.  fn$<>"" 
  2298. N           
  2299. shell_Tracef0("Action:Drag event detected - function is "+fn$)
  2300. 6           void%=
  2301. ("FN"+fn$+"(_temp28%,_temp32%)")
  2302.          
  2303. Q           
  2304. shell_Tracef0("Action:Drag event detected - no handler function")
  2305. (           
  2306.  set up datasave message
  2307. 1           
  2308. shell_SendDataSave(_U%!28,_U%!32)
  2309.          
  2310. :         
  2311. shell_Tracef0("Action:keypress is="+
  2312. _Q%!24)
  2313.          
  2314.  _Q%!24 
  2315. "         
  2316.  &0D,394,398,399,410
  2317. F           claimed%=
  2318. shell_WritableIconHandler(_Q%!0,_Q%!4,_Q%!24)
  2319.          
  2320. 4           claimed%=
  2321. shell_HotKeyProcess(_Q%!24)
  2322.          
  2323.          
  2324.  claimed% 
  2325. "K           
  2326. shell_Tracef0("Action:Keypress not claimed, passing it on")
  2327. #*           
  2328.  "Wimp_ProcessKey",_Q%!24
  2329.          
  2330. %L           
  2331. shell_Tracef0("Action:Keypress claimed by this application")
  2332.          
  2333. shell_ActionMenuSelect(_Q%)
  2334.  17,18:
  2335. shell_Receive(_Q%)
  2336.  19   :
  2337. shell_UserMessageAcknowledge(_Q%)
  2338. *|Stop PROCshell_Action
  2339. /(*|Start PROCshell_ActionSelectButton
  2340. shell_ActionSelectButton
  2341. *|ifdef Trace_Init
  2342. shell_Tracef0("ActionSelectButton:Mouse Button was SELECT")
  2343. *|endif
  2344. shell_HandleAttachedMenu(_Q%,_U%!28,_U%!32)
  2345. 5/fn$=
  2346. shell_GetEventHandler(_U%!28,_U%!32,2)
  2347.  check filename in icon if datasave event exists
  2348.  _U%!32=0 
  2349.  icon was 0.....
  2350. shell_DataSaveCheckName(_U%!28,_U%!32)
  2351.  fn$<>"" 
  2352. shell_IconSlab(4,_U%!28,_U%!32)
  2353. *|ifdef Trace_Init
  2354. shell_Tracef0("ActionSelectButton:About to call "+"FN"+fn$+"("+
  2355. _temp28%+","+
  2356. _temp32%+")")
  2357. *|endif
  2358. @-  void%=
  2359. ("FN"+fn$+"(_temp28%,_temp32%)")
  2360.  if icon was 0 and dbox is dynamic then close dbox/menu
  2361.  _U%!32=0 
  2362.  _U%!28=_U%!20 
  2363. E     
  2364.  "Wimp_CreateMenu",,-1
  2365. I'*|Stop PROCshell_ActionSelectButton
  2366. K&*|Start PROCshell_ActionMenuButton
  2367. shell_ActionMenuButton
  2368.  temp%,menu%,popup%
  2369. popup% = 
  2370. *|ifdef PROCshell_TraceInit
  2371. shell_Tracef0("ActionMenuButton:Mouse Button was MENU")
  2372. *|endif
  2373. temp%=
  2374. (-1) 
  2375.  temp%=
  2376. shiftmenuclick(_Q%!12,_Q%!16)
  2377.  temp% 
  2378. *|ifdef PROCshell_TraceInit
  2379. shell_Tracef0("ActionMenuButton:Checking menu events..")
  2380. shell_Tracef0("ActionMenuButton:button="+
  2381. _Q%!8+" _Q%!12="+
  2382. _Q%!12+" _Q%!16="+
  2383. _Q%!16)
  2384. *|endif
  2385. Y4  menu%=
  2386. shell_GetEventMenu(_Q%!8,_Q%!12,_Q%!16)
  2387.  (menu% <> 0 
  2388.  _Q%!12 > 0 
  2389.  _Q%!16 >= 0) 
  2390.  popup% = 
  2391.  menu% = 0 
  2392. \G    
  2393.  No menu attached to the icon that was clicked over, therefore
  2394. ]<    
  2395.  look for a menu attached to the window work area..
  2396. ^5    menu%  = 
  2397. shell_GetEventMenu(_Q%!8,_Q%!12,-1)
  2398. *|ifdef PROCshell_TraceInit
  2399. shell_Tracef0("ActionMenuButton:Menu handle is:&"+
  2400. ~menu%)
  2401. *|endif
  2402.  menu%<>0 
  2403. shell_HandleMenuOpen(_Q%,menu%,_Q%!12,_Q%!16,popup%)
  2404. g%*|Stop PROCshell_ActionMenuButton
  2405. i$*|Start PROCshell_HandleMenuOpen
  2406. shell_HandleMenuOpen(_Q%,menu%,wh%,ih%,popup%)
  2407.  i_blk%,w_blk%
  2408.  This routine handles the case of 'popup' menus, adjusting the menu
  2409.  and pointer positions before opening to conform to the Style Guide
  2410.  recommendations..
  2411.  popup% = 
  2412.  Menu is a normal menu attached to a window, or to an icon on the
  2413.  iconbar, so MenuUtils will open it in the correct place..
  2414. shell_OpenMenu(_Q%!0,_Q%!4,menu%)
  2415.  Menu is a 'popup', i.e attached to a specific icon in a window that
  2416.  is not the iconbar. Therefore open the menu to right right of the
  2417.  icon as required by the Style Guide..
  2418. w(  i_blk% = 
  2419. shell_HeapBlockFetch(50)
  2420. x(  w_blk% = 
  2421. shell_HeapBlockFetch(36)
  2422.  read coordinates of icon that has menu attached and open menu
  2423.  to the right of it..
  2424. {#  i_blk%!0 = wh%:i_blk%!4 = ih%
  2425.  "Wimp_GetIconState",,i_blk%
  2426.   w_blk%!0 = wh%
  2427.  "Wimp_GetWindowState",,w_blk%
  2428. shell_OpenMenu(w_blk%!4 + i_blk%!16  + 64,_Q%!4,menu%)
  2429.  And move the pointer appropriately..
  2430.  w_blk%!4+i_blk%!16 + 64,_Q%!4
  2431. shell_HeapBlockReturn(i_blk%)
  2432. shell_HeapBlockReturn(w_blk%)
  2433. #*|Stop PROCshell_HandleMenuOpen
  2434. &*|Start PROCshell_ActionMenuSelect
  2435. shell_ActionMenuSelect(_Q%)
  2436.  handler%,menu_buffer%,CheckSelect%,fontmenuflag%,void%,h_blk%
  2437. %h_blk%=
  2438. shell_HeapBlockFetch(256)
  2439. *|ifdef PROCshell_TraceInit
  2440. shell_Tracef0("ActionMenuSelect:Menu_Select event detected")
  2441. *|endif
  2442.  "Wimp_GetPointerInfo",,_shell_blk%
  2443. *|ifdef Using_FontMenu
  2444. +menu_buffer%=
  2445. shell_HeapBlockFetch(256)
  2446.  _U%!24=_U%!252 
  2447.  Current menu is FontMenu..
  2448.   CheckSelect%=0:_U%!264=1
  2449. -  CheckSelect%=
  2450. shell_CheckSelection(_Q%)
  2451.  CheckSelect%>-1 
  2452.  _U%!264=1 
  2453.  _U%!264=0
  2454.  _U%!264>0 
  2455.  "FontMenu_DecodeFontMenu",_Q%+CheckSelect%,menu_buffer% 
  2456.  fontmenuflag%
  2457.  fontmenuflag%=1 
  2458. %    
  2459.  'sensible' selection made..
  2460. *|ifdef PROCshell_TraceInit
  2461. b    
  2462. shell_Tracef0("ActionMenuSelect:FontMenu selection ("+
  2463. shell_GetString(menu_buffer%)+")")
  2464. *|endif
  2465. I    
  2466. shell_FontMenuSelectFont(
  2467. shell_GetString(menu_buffer%),_U%!260)
  2468. $    
  2469.  _shell_FontMenuSelFN$="" 
  2470. 7      
  2471.  "Wimp_DecodeMenu",,_U%!24,_Q%,menu_buffer%
  2472. 5      fn$=
  2473. shell_GetEventHandler(_U%!52,_U%!56,0)
  2474.       _temp%=menu_buffer%
  2475. 9      $_temp%=
  2476. shell_StringStripTrailing($_temp%," ")
  2477. 3      
  2478.  fn$<>"" 
  2479.  void%=
  2480. ("FN"+fn$+"($_temp%)")
  2481.         
  2482. '      
  2483.  _shell_FontMenuSelFN$<>"" 
  2484. W        void%=
  2485. ("FN"+_shell_FontMenuSelFN$+"(FNshell_FontMenuGetLastSelectedFont)")
  2486.       
  2487.         
  2488. shell_HeapBlockReturn(menu_buffer%)
  2489. *|endif
  2490.  _U%!264=0 
  2491.  "MenuUtil_Decode",_U%!24,_Q% 
  2492.  handler%,,h_blk%
  2493.  handler% 
  2494. shell_MenuCallHandler(handler%,h_blk%)
  2495.  _shell_blk%!8=1 
  2496. shell_HeapBlockExists(_U%!224) 
  2497.     _temp%=_U%!224
  2498.  $_temp%<>"" 
  2499. $      
  2500.  Call last menuwarning fn
  2501. 1      void%=
  2502. ("FN"+$_temp%+"(_U%!52,_U%!56)")
  2503.         
  2504. shell_OpenMenu(_U%!36,_U%!40,_U%!24)
  2505.   _shell_FontMenuSelFN$=""
  2506. shell_HeapBlockReturn(h_blk%)
  2507. %*|Stop PROCshell_ActionMenuSelect
  2508. (*|Start PROCshell_ActionAdjustButton
  2509. shell_ActionAdjustButton
  2510.  flags%,fn$,void%,sel_blk%,ctr%
  2511. )sel_blk% = 
  2512. shell_HeapBlockFetch(100)
  2513. shell_Tracef0("Action:Mouse Button was ADJUST")
  2514.  PROCshell_HandleAttachedMenu(_Q%,_U%!28,_U%!32)
  2515.  Check if icon is a radio one, if so select icon to avoid Wimp
  2516.  deselecting it...
  2517.  "Wimp_WhichIcon",_U%!28,sel_blk%,&0000F000,&0000B000
  2518. ctr% = 0
  2519.  sel_blk%!ctr% <> -1
  2520.  sel_blk%!ctr% = _U%!32 
  2521. shell_IconSet(_U%!28,_U%!32,1)
  2522.   ctr% += 4
  2523. /fn$=
  2524. shell_GetEventHandler(_U%!28,_U%!32,3)
  2525.  fn$<>"" 
  2526. shell_IconSlab(1,_U%!28,_U%!32)
  2527. -  void%=
  2528. ("FN"+fn$+"(_temp28%,_temp32%)")
  2529. shell_HeapBlockReturn(sel_blk%)
  2530. '*|Stop PROCshell_ActionAdjustButton
  2531. *|Start FNshiftmenuclick
  2532. shiftmenuclick(wh%,ih%)
  2533. *|Stop FNshiftmenuclick
  2534. *|Start PROCshell_IconSlab
  2535. shell_IconSlab(button%,wh%,ih%)
  2536.  blk%
  2537. "blk%=
  2538. shell_HeapBlockFetch(50)
  2539. *blk%!8=button%:blk%!12=wh%:blk%!16=ih%
  2540.  "Interface_SlabButton",,blk%
  2541. blk%!8=0
  2542.  "Interface_SlabButton",,blk%
  2543. shell_HeapBlockReturn(blk%)
  2544. *|Stop PROCshell_IconSlab
  2545. **|Start PROCshell_PointerLeavingWindow
  2546. shell_PointerLeavingWindow(_Q%)
  2547.  i_blk%,void%
  2548. &i_blk% = 
  2549. shell_HeapBlockFetch(12)
  2550.  "Wimp_WhichIcon",!_Q%,i_blk%,&003F0000,15 << 16
  2551.  !i_blk% <> -1 
  2552.  PROCshell_Tracef0("LL:"+STR$(!i_blk%))
  2553. 8  void% = 
  2554. ("FN" + 
  2555. shell_IconGetData(!_Q%,!i_blk%))
  2556. shell_HeapBlockReturn(i_blk%)
  2557. ':                                  
  2558. *|Stop
  2559. +*|Start PROCshell_PointerEnteringWindow
  2560. shell_PointerEnteringWindow(_Q%)
  2561.  i_blk%,void%,wh%
  2562. wh% = _Q%!0
  2563. &i_blk% = 
  2564. shell_HeapBlockFetch(12)
  2565.  "Wimp_WhichIcon",wh%,i_blk%,&003F0000,14 << 16
  2566.  !i_blk% <> -1 
  2567.  PROCshell_Tracef0("LL:"+STR$(!i_blk%))
  2568.  PROCshell_Tracef0("LL:"+"FN" + FNshell_IconGetData(wh%,!i_blk%))
  2569. 7  void% = 
  2570. ("FN" + 
  2571. shell_IconGetData(wh%,!i_blk%))
  2572. shell_HeapBlockReturn(i_blk%)
  2573. **|Stop PROCshell_PointerEnteringWindow
  2574. "*|Start PROCshell_RedrawWindow
  2575. shell_RedrawWindow(handle%)
  2576.  more%,fn$,x0%,y0%,blk%,i_blk%
  2577. &i_blk% = 
  2578. shell_HeapBlockFetch(12)
  2579.  "Wimp_WhichIcon",handle%,i_blk%,&003F0000,13 << 16
  2580.  !i_blk% <> -1 
  2581.  PROCshell_Tracef0("LL:"+STR$(!i_blk%))
  2582.  PROCshell_Tracef0("LL:"+"FN" + FNshell_IconGetData(handle%,!i_blk%))
  2583. /  fn$ = 
  2584. shell_IconGetData(handle%,!i_blk%)
  2585. shell_HeapBlockReturn(i_blk%)
  2586. #blk%=
  2587. shell_HeapBlockFetch(100)
  2588.  fn$ = "" 
  2589.  Can't find the clever version of an attached event, check the
  2590.  dumb one...
  2591. .  fn$=
  2592. shell_GetEventHandler(handle%,-1,4)
  2593. blk%!0=handle%
  2594.  "Wimp_RedrawWindow",,blk% 
  2595.  more%
  2596.     "*x0%=blk%!4-blk%!20:y0%=blk%!16-blk%!24
  2597.  more%
  2598.     $)  
  2599.  "Interface_Render3dWindow",,blk%
  2600.     %C  
  2601.  fn$<>"" 
  2602.  void%=
  2603. ("FN"+fn$+"("+
  2604. blk%+","+
  2605. x0%+","+
  2606. y0%+")")
  2607.     &*  
  2608.  "Wimp_GetRectangle",,blk% 
  2609.  more%
  2610. shell_HeapBlockReturn(blk%)
  2611.     +!*|Stop PROCshell_RedrawWindow
  2612. *|Start PROCshell_Receive
  2613. shell_Receive(_Q%)
  2614.  temp%,void%
  2615.  _Q%!16 
  2616.  0     :
  2617. shell_Exit:
  2618.  1     :
  2619. shell_DataSave(_Q%)
  2620.  2     :
  2621. shell_DataSaveAck(_Q%)
  2622.  3     :
  2623. shell_DataLoad(_Q%,
  2624.  4     :
  2625. shell_DataLoadAck(_Q%)
  2626.  5     :
  2627. shell_DataLoad(_Q%,
  2628.  6     :
  2629. shell_RAMFetch(_Q%)
  2630.  7     :
  2631. shell_RAMTransmit(_Q%)
  2632.  8     :
  2633. shell_Message_PreQuit(_Q%)
  2634.  9     :
  2635.  _U%!164>0 
  2636. *|ifdef TraceInit
  2637.     <J              
  2638. shell_Tracef0("Receive:PaletteChange message received")
  2639. *|endif
  2640.               temp%=_U%!164
  2641.     ?&              void%=
  2642. ("FN"+$temp%)
  2643.             
  2644.  10    :
  2645. shell_Message_SaveDesktop(_Q%)
  2646.  14    :
  2647. shell_Message_Shutdown(_Q%)
  2648.  &502  :
  2649. shell_InteractiveHelp(_Q%)
  2650.  &400C0:
  2651. shell_MenuWarning(_Q%)
  2652.  &400C1:
  2653. shell_Message_ModeChange(_Q%)
  2654.  &400C2:
  2655.  TaskInitialise
  2656.             
  2657.  _U%!168>0 
  2658. *|ifdef TraceInit
  2659.     IK              
  2660. shell_Tracef0("Receive:TaskInitialise message received")
  2661. *|endif
  2662.               temp%=_U%!168
  2663.     L\              void%=
  2664. ("FN"+$temp%+"("+
  2665. (_Q%!4)+","+
  2666. shell_GetString(_Q%+28)+
  2667. 34+")")
  2668.             
  2669.     NF            
  2670.  _U%!208=-1 
  2671. shell_GetString(_Q%+28)="StrongHelp" 
  2672.               _U%!208=_Q%!4
  2673.     Pj              
  2674. shell_StrongHlpMsg("Help_Install -DieWithTask "+
  2675. shell_GetAppDir+"."+
  2676. shell_GetAppName)
  2677.               temp%=_U%!216
  2678.     R               
  2679.  $temp%<>"" 
  2680.     S+                
  2681. shell_HelpWord($temp%)
  2682.     T3                
  2683. shell_HeapBlockReturn(_U%!216)
  2684.                 _U%!216=0
  2685.               
  2686.             
  2687.  &400C3:
  2688.  TaskCloseDown
  2689.             
  2690.  _U%!172>0 
  2691. *|ifdef TraceInit
  2692.     [>  
  2693. shell_Tracef0("Receive:TaskCloseDown message received")
  2694. *|endif
  2695.               temp%=_U%!172
  2696.     ^&              void%=
  2697. ("FN"+$temp%)
  2698.             
  2699.     `,            
  2700.  _Q%!4=_U%!208 
  2701.  _U%!208=-1
  2702.  &400C7:
  2703.  TaskNameIs
  2704. *|ifdef TraceInit
  2705.     c;  
  2706. shell_Tracef0("Receive:TaskNameIs message received")
  2707. *|endif
  2708.     e;            
  2709. shell_GetString(_Q%+28) = "StrongHelp" 
  2710.     fD              _U%!208=_Q%!20:
  2711.  store task handle of StrongHlp...
  2712.             
  2713.     h$              
  2714. shell_ScanForHelp
  2715.             
  2716. shell_HandleUnknownMessage2(_Q%)
  2717. *|Stop PROCshell_Receive
  2718.     p(*|Start PROCshell_Message_ModeChange
  2719. shell_Message_ModeChange(_Q%)
  2720.  offset%,ctr%,sw_list%,w_blk%
  2721. sw_list%=_U%!184
  2722.  _U%!160>0 
  2723.     uF  
  2724. shell_Tracef0("Message_ModeChange:ModeChange message received")
  2725.   temp%=_U%!160
  2726.   void%=
  2727. ("FN"+$temp%)
  2728.  SYS "FontWindow_ModeChange",_U%!148
  2729.  Now check if any windows containing panes are open, and if so
  2730.  reopen them to avoid problems with panes appearing in the wrong
  2731.  position...
  2732.     ~%w_blk%=
  2733. shell_HeapBlockFetch(100)
  2734.  sw_list%<>0 
  2735. *|ifdef TraceInit
  2736. shell_Tracef0("Message_ModeChange:Checking static window list for pane events")
  2737. *|endif
  2738.  sw_list%!ctr%<>-1
  2739. %    
  2740.  now check pane event list..
  2741. G    offset%=
  2742. shell_GetEventListOffset(sw_list%!ctr%,-1,_U%+92,24,
  2743.  offset%>-1 
  2744. *|ifdef TraceInit
  2745. I      
  2746. shell_Tracef0("Message_ModeChange:Static window handle found")
  2747. *|endif
  2748. 0      
  2749. shell_WindowIsOpen(sw_list%!ctr%) 
  2750. *|ifdef TraceInit
  2751. A        
  2752. shell_Tracef0("Message_ModeChange:Window is open..")
  2753. *|endif
  2754. -        
  2755.  Reopen window if already open..
  2756. !        !w_blk%=sw_list%!ctr%
  2757. )        
  2758.  "Wimp_CloseWindow",,w_blk%
  2759. 1        
  2760. shell_OpenWindow(sw_list%!ctr%,0,-1)
  2761.       
  2762.         
  2763.     ctr%+=4
  2764. shell_HeapBlockReturn(w_blk%)
  2765. '*|Stop PROCshell_Message_ModeChange
  2766. &*|Start PROCshell_Message_Shutdown
  2767. shell_Message_Shutdown(_Q%)
  2768.  _U%!312>0 
  2769. shell_Tracef0("Message_Shutdown:Shutdown message received")
  2770.   temp%=_U%!312
  2771.   void%=
  2772. ("FN"+$temp%)
  2773. %*|Stop PROCshell_Message_Shutdown
  2774. +*|Start PROCshell_HandleUnknownMessage2
  2775. shell_HandleUnknownMessage2(_Q%)
  2776.  message$
  2777.  I want to handle message &43B00 here as I use it for
  2778.  communications between EvntShell applications..
  2779.  _Q%!16 
  2780.  &43B00:
  2781.  incoming EvntShell message...
  2782.     message$=$(_Q%+20)
  2783. :    
  2784. message$,30)="EvntShellLib:ShellDBug started" 
  2785.       
  2786.  _U%!100 
  2787.  1<<4 
  2788. *        
  2789.  trace init message pending..
  2790. (        _U%!100 = (_U%!100 
  2791.  1 << 4)
  2792. c        
  2793. shell_BroadcastMessage(&43B00,"ShellDBug:Init Debug messages from "+
  2794. shell_GetAppName)
  2795.       
  2796.         
  2797. 5    
  2798. message$,25)="EvntShellLib:TraceInitAck" 
  2799. O      
  2800.  unset trace init message pending flag, ShellDBug has acknowledged..
  2801. "      _U%!100=(_U%!100 
  2802.  1<<4)
  2803.         
  2804. 0    
  2805. message$,20)="EvntShellLib:TraceOn" 
  2806.       
  2807. shell_TraceOn
  2808.         
  2809. 1    
  2810. message$,21)="EvntShellLib:TraceOff" 
  2811.       
  2812. shell_TraceOff
  2813.         
  2814. 8    
  2815. message$,28)="EvntShellLib:ListClickSelect" 
  2816.        
  2817. shell_ListClickSelect
  2818.         
  2819. 8    
  2820. message$,28)="EvntShellLib:ListClickAdjust" 
  2821.        
  2822. shell_ListClickAdjust
  2823.         
  2824. 5    
  2825. message$,25)="EvntShellLib:ListHelpTags" 
  2826.       
  2827. shell_ListHelpTags
  2828.         
  2829.  Pass message block on in case the user wants it too..
  2830. shell_HandleUnknownMessage(_Q%)
  2831. **|Stop PROCshell_HandleUnknownMessage2
  2832. **|Start PROCshell_HandleUnknownMessage
  2833. shell_HandleUnknownMessage(_Q%)
  2834. )*|Stop PROCshell_HandleUnknownMessage
  2835. **|Start PROCshell_AttachPreQuitHandler
  2836. shell_AttachPreQuitHandler(fn$)
  2837.  temp%,void%
  2838.  _U%!300>0 
  2839. shell_HeapBlockReturn(_U%!300)
  2840. )_U%!300=
  2841. shell_HeapBlockFetch(
  2842. fn$+1)
  2843. temp%=_U%!300:$temp%=fn$
  2844. )*|Stop PROCshell_AttachPreQuitHandler
  2845. +*|Start PROCshell_AttachShutdownHandler
  2846. shell_AttachShutdownHandler(fn$)
  2847.  temp%,void%
  2848.  _U%!312>0 
  2849. shell_HeapBlockReturn(_U%!312)
  2850. )_U%!312=
  2851. shell_HeapBlockFetch(
  2852. fn$+1)
  2853. temp%=_U%!312:$temp%=fn$
  2854. **|Stop PROCshell_AttachShutdownHandler
  2855. -*|Start PROCshell_AttachModeChangeHandler
  2856. shell_AttachModeChangeHandler(fn$)
  2857.  temp%,void%
  2858.  _U%!160>0 
  2859. shell_HeapBlockReturn(_U%!160)
  2860. )_U%!160=
  2861. shell_HeapBlockFetch(
  2862. fn$+1)
  2863. temp%=_U%!160:$temp%=fn$
  2864. void%=
  2865. ("FN"+fn$)
  2866. ,*|Stop PROCshell_AttachModeChangeHandler
  2867. 0*|Start PROCshell_AttachPaletteChangeHandler
  2868. shell_AttachPaletteChangeHandler(fn$)
  2869.  temp%,void%
  2870.  _U%!164>0 
  2871. shell_HeapBlockReturn(_U%!164)
  2872. )_U%!164=
  2873. shell_HeapBlockFetch(
  2874. fn$+1)
  2875. temp%=_U%!164:$temp%=fn$
  2876. void%=
  2877. ("FN"+fn$)
  2878. /*|Stop PROCshell_AttachPaletteChangeHandler
  2879. 1*|Start PROCshell_AttachTaskInitialiseHandler
  2880. shell_AttachTaskInitialiseHandler(fn$)
  2881.  temp%,void%
  2882.  _U%!168>0 
  2883. shell_HeapBlockReturn(_U%!168)
  2884. )_U%!168=
  2885. shell_HeapBlockFetch(
  2886. fn$+1)
  2887. temp%=_U%!168:$temp%=fn$
  2888. 0*|Stop PROCshell_AttachTaskInitialiseHandler
  2889.     0*|Start PROCshell_AttachTaskCloseDownHandler
  2890. shell_AttachTaskCloseDownHandler(fn$)
  2891.  temp%,void%
  2892.  _U%!172>0 
  2893. shell_HeapBlockReturn(_U%!172)
  2894. )_U%!172=
  2895. shell_HeapBlockFetch(
  2896. fn$+1)
  2897. temp%=_U%!172:$temp%=fn$
  2898. /*|Stop PROCshell_AttachTaskCloseDownHandler
  2899. *|Start PROCshell_RAMFetch
  2900. shell_RAMFetch(_Q%)
  2901.  RAMFetch_buffer%,len_data%,done%
  2902. done%=
  2903.  If the address in the data save event block <&8000 then it is an
  2904.  estimated size and the file is not already present in a RAM buffer.
  2905.  In this case ignore RAMFetch message as the data will be written to a
  2906.  file anyway..
  2907.  _U%!144>&8000 
  2908.  Send file to application
  2909.  send RAMTransmit message...
  2910. *|ifdef TraceInit
  2911. shell_Tracef0("RAMFetch:RAMFetch called..")
  2912. *|endif
  2913.   _Q%!12=_Q%!08
  2914. "+  _Q%!16=7:
  2915.  message action RAMTransmit
  2916.  get buffer length..
  2917.   len_data%=_U%!136
  2918.  _U%!140=&FF9 
  2919. &H    
  2920.  kludge for sprite files because when saving to a physical file
  2921. 'I    
  2922.  with "OS_SpriteOp" the first word is dropped. Hence for the RAM
  2923. (I    
  2924.  save we have to incrememt the address the data is held at by 4!
  2925. )M    
  2926.  The estimated size has already been kludged in shell_AttachDataSave
  2927.     _U%!144+=4
  2928.  (len_data%-_U%!128)<_Q%!24 
  2929. -&    
  2930.   This will be the last block
  2931. .     _Q%!24=len_data%-_U%!128
  2932.     done%=
  2933. *|ifdef TraceInit
  2934. shell_Tracef0("RAMFetch:Sending block")
  2935. *|endif
  2936.  "Wimp_TransferBlock",_U%!148,_U%!144+_U%!128,_Q%!04,_Q%!20,_Q%!24
  2937.  "Wimp_SendMessage",17,_Q%,_Q%!04
  2938. 7   _U%!120=_Q%!8  :
  2939.  SaveRef%
  2940.   _U%!128+=_Q%!24:
  2941.  RAMPtr%
  2942.  done% 
  2943.  _U%!128=0
  2944. *|Stop PROCshell_RAMFetch
  2945. >!*|Start PROCshell_RAMTransmit
  2946. shell_RAMTransmit(_Q%)
  2947.  offset%,blk%,f_name$,temp%
  2948.  Receive file from application via RAM transfer..
  2949.  _Q%!12=_U%!112 
  2950.   _U%!128+=_Q%!24
  2951.  _Q%!24<_U%!132 
  2952. E!    
  2953.  This was the last block
  2954. *|ifdef TraceInit
  2955. shell_Tracef0("RAMTransmit:Last block received")
  2956. *|endif
  2957. ID    offset%=
  2958. shell_GetEventListOffset(_U%!28,_U%!32,_U%+96,16,
  2959.     blk%=_U%!96+offset%
  2960. *|ifdef TraceInit
  2961. shell_Tracef0("RAMTransmit:_U%!28="+
  2962. _U%!28)
  2963. shell_Tracef0("RAMTransmit:_U%!32="+
  2964. _U%!32)
  2965. shell_Tracef0("RAMTransmit:offset%="+
  2966. offset%)
  2967. *|endif
  2968. P3    
  2969.  now call user function after file load...
  2970. QL    
  2971.  use copy of datasave message block to find file type, file name...
  2972.     temp%=_U%!156
  2973. S*    f_name$=
  2974. shell_GetString(temp%+44)
  2975. TK    
  2976. shell_UserFNLoadFile(temp%!40,_U%!152,blk%!8,f_name$,_U%!132,blk%)
  2977. V'    
  2978.  There are more blocks to come
  2979. *|ifdef TraceInit
  2980. shell_Tracef0("RAMTransmit:Block received")
  2981. *|endif
  2982. Z=    
  2983.  check size of incoming block and increase buffer if
  2984.  required...
  2985.  _U%!128>_U%!132 
  2986. *|ifdef TraceInit
  2987. shell_Tracef0("RAMTransmit:Increasing buffer size..")
  2988. *|endif
  2989. `A      _U%!152=
  2990. shell_HeapBlockExtend(_U%!152,_U%!128,_U%!132)
  2991. a        
  2992.     _Q%!12=_Q%!08
  2993.     _Q%!16=6
  2994.     _Q%!20=_U%!152+_U%!128
  2995.     _Q%!24=_U%!132
  2996. f+    
  2997.  "Wimp_SendMessage",18,_Q%,_Q%!04
  2998.     _U%!112=_Q%!08
  2999.  too much data sent...
  3000. shell_HeapBlockReturn(_U%!152)
  3001.   _U%!152=0
  3002. shell_OK(
  3003. shell_MessageNoArgs("SHELLMSG15"))
  3004. q *|Stop PROCshell_RAMTransmit
  3005. *|Start FNshell_LoadFile
  3006. shell_LoadFile(Scrap%)
  3007.  Name$,FileSize%,Flags%,loadloc%
  3008. u"Name$=
  3009. shell_GetString(_Q%+44)
  3010. v&FileSize%=
  3011. shell_FileLength(Name$)
  3012.  FileSize%<0 
  3013. shell_OK(
  3014. shell_MessageNoArgs("SHELLMSG16"))
  3015. x-loadloc%=
  3016. shell_HeapBlockFetch(FileSize%)
  3017.  "XOS_File",16,Name$,loadloc%,0 
  3018.  ;Flags%
  3019. shell_VFlag(Flags%) 
  3020. shell_HeapBlockReturn(loadloc%)
  3021. shell_OK(
  3022. shell_MessageNoArgs("SHELLMSG17"))
  3023. *|ifdef TraceInit
  3024. shell_Tracef0("LoadFile:File "+Name$+" loaded ok at &"+
  3025. ~loadloc%)
  3026. *|endif
  3027.  Stuff for fileinfo box...........
  3028.  PROCDate(FNFileTimeAndDate(Name$))
  3029.  IF Scrap% THEN
  3030.    SYS "XOS_FSControl",27,(_Q%+44),,2
  3031.    PROCModified(TRUE)
  3032.  ELSE
  3033.    PROCName(Name$)
  3034.    PROCType(_Q%!40)
  3035.    PROCModified(FALSE)
  3036.  ENDIF
  3037.  PROCNewFile
  3038. =loadloc%
  3039. *|Stop FNshell_LoadFile
  3040. *|Start FNshell_VFlag
  3041. shell_VFlag(Flags%)
  3042. =((Flags% 
  3043.  %0001)=%0001)
  3044. *|Stop FNshell_VFlag
  3045. *|Start FNshell_CheckType
  3046. shell_CheckType(type%,type_list%,DataOpen%)
  3047.  Exclude directories, applications & unstamped files
  3048.  type_list% is address of heapblock holding a list
  3049.  of allowable filetypes terminated by -1..
  3050.  Ok%,ctr%,found%,temp%,topbit_load%
  3051. #ctr%=0:found%=-1:topbit_load%=
  3052.  _U%!100 
  3053.  1<<1 
  3054.  _U%!100=_U%!100 
  3055.  1<<1
  3056.  type_list%!ctr%<>-1
  3057.   temp%=type_list%!ctr%
  3058.  temp% 
  3059.  1<<31 
  3060.     temp%=temp% 
  3061.  1<<31
  3062.     topbit_load%=
  3063.     topbit_load%=
  3064.  temp%=type% 
  3065.     found%=ctr%
  3066.  topbit_load% 
  3067.        _U%!100=_U%!100 
  3068.  1<<1
  3069. *|ifdef TraceInit
  3070. =      
  3071. shell_Tracef0("CheckType:Top Bit Load detected..")
  3072. *|endif
  3073.         
  3074.   ctr%+=4
  3075.  DataOpen% 
  3076.  (type%>=&1000) 
  3077.  found%=-1
  3078. *|ifdef TraceInit
  3079.  found%>-1 
  3080. shell_Tracef0("CheckType:File type OK "+
  3081. ~type_list%!found%)
  3082. shell_Tracef0("CheckType:File type NOT ok "+
  3083. ~type%)
  3084. *|endif
  3085.  found%<>-1 
  3086. *|Stop FNshell_CheckType
  3087. *|Start PROCshell_Exit
  3088. shell_Exit
  3089.  ms_desc%
  3090. ms_desc%=_U%!68
  3091.  "XMessageTrans_CloseFile",ms_desc%
  3092.  "XOS_Module",7,,ms_desc%
  3093. *|ifdef TraceInit
  3094. shell_Tracef0("Exit:Application closing down")
  3095. *|endif
  3096. shell_TraceExit
  3097.  "XHourglass_Smash"
  3098.  "XWimp_DragBox",,-1
  3099. shell_WimpCloseDown_I(_U%!148)
  3100. *|Stop PROCshell_Exit
  3101. *|Start PROCshell_DataLoad
  3102. shell_DataLoad(_Q%,DataOpen%)
  3103.  reference%,offset%,blk%,_temp%,type_list%,type%,fname$
  3104. type%=_Q%!40
  3105. #fname$=
  3106. shell_GetString(_Q%+44)
  3107. *|ifdef TraceInit
  3108. shell_Tracef0("DataLoad:DataLoad message received")
  3109. *|endif
  3110.  check my_file_type set up in shell_AttachDataLoad
  3111.  only works when dragging a file as when DataOpen% is TRUE
  3112.  the _Q% block is set up differently!!
  3113.  DataOpen% 
  3114.  double click load..
  3115.  check if there are any dataload events set up...
  3116.  _U%!96<>0 
  3117. 8    offset%=0:
  3118.  look at first dataload event only...
  3119. !    offset%=-1:
  3120.  ignore it...
  3121.  drag load, check for specific window/icon event..
  3122. B  offset%=
  3123. shell_GetEventListOffset(_Q%!20,_Q%!24,_U%+96,16,
  3124.  offset%=-1 
  3125. ,    
  3126.  now check for window handle only..
  3127. @    offset%=
  3128. shell_GetEventListOffset(_Q%!20,-1,_U%+96,16,
  3129.  offset%>-1 
  3130.  DataLoadEvent exists
  3131.   blk%=_U%!96+offset%
  3132. shell_CheckType(_Q%!40,blk%!8,DataOpen%) 
  3133.  file type is ok...
  3134. *|ifdef TraceInit
  3135. G    
  3136. shell_Tracef0("DataLoad:File type recognised (&"+
  3137. ~_Q%!40+")")
  3138. *|endif
  3139.     Reference%=_Q%!12
  3140.     _Q%!12=_Q%!8
  3141.     _Q%!16=4
  3142. *    
  3143.  "Wimp_SendMessage",18,_Q%,_Q%!4
  3144.  _U%!100 
  3145.  1<<1 
  3146.       loadloc%=-1
  3147.        _U%!100=_U%!100 
  3148.  1<<1
  3149.         
  3150. 6      loadloc%=
  3151. shell_LoadFile(Reference%=_U%!108)
  3152.         
  3153. G    
  3154. shell_UserFNLoadFile(type%,loadloc%,blk%!8,fname$,_Q%!36,blk%)
  3155. 2    
  3156.  return copy of datasave message block...
  3157.  _U%!156<>0 
  3158. )      
  3159. shell_HeapBlockReturn(_U%!156)
  3160.       _U%!156=0
  3161.         
  3162. *|ifdef TraceInit
  3163. shell_Tracef0("DataLoad:File type NOT recognised (&"+
  3164. ~_Q%!40+")")
  3165. *|endif
  3166. *|Stop PROCshell_DataLoad
  3167. $*|Start PROCshell_UserFNLoadFile
  3168. shell_UserFNLoadFile(type%,loadloc%,type_list%,_filename$,_file_size%,blk%)
  3169.  ctr%,found%,temp%,void%
  3170.  call user function after loading file...
  3171. ctr%=0:found%=-1
  3172.  type_list%!ctr%<>-1
  3173.   temp%=type_list%!ctr%
  3174.  temp% 
  3175.  1<<31 
  3176.  temp%=temp% 
  3177.  1<<31
  3178.  temp%=type% 
  3179.  found%=ctr%
  3180.   ctr%+=4
  3181. temp%=blk%!12
  3182. Zvoid%=
  3183. ("FN"+$(temp%!found%)+"("+
  3184. loadloc%+","+
  3185. type%+",_filename$,"+
  3186. _file_size%+")")
  3187. #*|Stop PROCshell_UserFNLoadFile
  3188. *|Start PROCshell_DataSave
  3189. shell_DataSave(_Q%)
  3190.  temp%,offset%,blk%,loop%
  3191.  Called when another application wants to save data to our one..
  3192. *|ifdef TraceInit
  3193. shell_Tracef0("DataSave:DataSave message received")
  3194. *|endif
  3195.  Receive file from application, but check first it didn't come from 
  3196.  this one!
  3197.  _Q%!04<>_U%!148 
  3198.  check event list for window/icon at this point to see
  3199.  which filetypes are valid...
  3200. *B  offset%=
  3201. shell_GetEventListOffset(_Q%!20,_Q%!24,_U%+96,16,
  3202.  offset%>-1 
  3203.     blk%=_U%!96+offset%
  3204. --    
  3205. shell_CheckType(_Q%!40,blk%!8,
  3206. *|ifdef TraceInit
  3207. /H      
  3208. shell_Tracef0("DataSave:Filetype recognized (&"+
  3209. ~_Q%!40+")")
  3210. *|endif
  3211. 1)      
  3212. shell_TopBitLoadInProgress 
  3213. 2N        
  3214.  'no load' load taking place, just need the full filename so that
  3215. 3O        
  3216.  the user app can do the load - therefore send Message_DataSaveAck
  3217. 4/        
  3218.  with Wimp$Scrap as the filename..
  3219. *|ifdef TraceInit
  3220. 69        
  3221. shell_Tracef0("DataSave:'no load' flag set")
  3222. 7B        
  3223. shell_Tracef0("DataSave:Sending Message_DataSaveAck")
  3224. *|endif
  3225.         _Q%!00=256
  3226. :B        _Q%!12=_Q%!08:_Q%!36=-1:_Q%!16=2:
  3227.  Message_DataSaveAck
  3228. ;6        $(_Q%+44)=
  3229. shell_GetAppDir+".ScrapFile"+
  3230. <.       
  3231.  "Wimp_SendMessage",18,_Q%,_Q%!04
  3232.       
  3233. >M        
  3234.  Normal load from another application therefore offer to perform
  3235. ?9        
  3236.  a RAM file transfer with Message_RAMFetch..
  3237. @M        
  3238.  Make a copy of the message block as I need it when RAM transfer
  3239. A<        
  3240.  is not supported by the sender of this message
  3241. BG        
  3242. shell_HeapBlockReturn(_U%!156):
  3243.  return temp message blk..
  3244. C4        _U%!156=
  3245. shell_HeapBlockFetch((_Q%!0)+8)
  3246.         temp%=_U%!156
  3247. E9        
  3248.  loop%=0 
  3249.  _Q%!0 
  3250.  first word is size...
  3251. F#          temp%!loop%=_Q%!loop%
  3252.         
  3253.  loop%
  3254. H@        
  3255.  store destination window/icon handles for later...
  3256. I'        _U%!28=_Q%!20:_U%!32=_Q%!24
  3257.         _U%!128=0
  3258. K/        _U%!132=_Q%!36:
  3259.  RAMSize%=est_size%
  3260. L5        
  3261.  set up heapblock to hold loaded file...
  3262. M1        _U%!152=
  3263. shell_HeapBlockFetch(_Q%!36)
  3264.         
  3265.  And here we go !
  3266.         _Q%!00=28
  3267.         _Q%!12=_Q%!08
  3268. Q)        _Q%!16=6:
  3269.  Message_RAMFetch..
  3270. R"        _Q%!20=_U%!152+_U%!128
  3271.         _Q%!24=_U%!132
  3272. T/        
  3273.  "Wimp_SendMessage",18,_Q%,_Q%!04
  3274.         _U%!112=_Q%!08
  3275. *|ifdef TraceInit
  3276. W?        
  3277. shell_Tracef0("DataSave:Sending Message_RAMFetch")
  3278. *|endif
  3279.       
  3280. Z        
  3281. *|ifdef TraceInit
  3282. \<      
  3283. shell_Tracef0("DataSave:Filetype NOT recognized")
  3284. *|endif
  3285. ^        
  3286. *|Stop PROCshell_DataSave
  3287.  Set all this stuff beforehand as RAM transfer
  3288.  procedures may be entered more than once !
  3289.  PROCName(FNLeaf(FNGetString(PollPtr%+44)))
  3290.  PROCType(PollPtr%!40)
  3291.  PROCModified(TRUE)
  3292.  PROCDate(FNCurrentTimeAndDate)
  3293. k(*|Start FNshell_TopBitLoadInProgress
  3294. shell_TopBitLoadInProgress
  3295.  _U%!100 
  3296.  1<<1 
  3297. o(*|Stop  FNshell_TopBitLoadInProgress
  3298. p"*|Start PROCshell_SendDataSave
  3299. shell_SendDataSave(wh%,ih%)
  3300.  blk%,msgblk%,tmpblk%,offset%,FileSize%,void%
  3301. s%tmpblk%=
  3302. shell_HeapBlockFetch(30)
  3303.  retrieve current position of pointer (window and icon over which
  3304.  the drag event ended plus pointer position)
  3305.  "Wimp_GetPointerInfo",,tmpblk%
  3306. w:offset%=
  3307. shell_GetEventListOffset(wh%,ih%,_U%+72,24,
  3308.  offset%=-1 
  3309.  offset%=-2 
  3310. yi  void%=
  3311. shell_MessageWindow(
  3312. shell_MessageNoArgs("SHELLMSG13"),0,"",
  3313. shell_MessageNoArgs("warning"))
  3314.   blk%=(_U%!72)+offset%
  3315.  blk%!8>&8000 
  3316. }0    FileSize%=
  3317. shell_HeapBlockInfo(blk%!8)-4
  3318.     FileSize%=blk%!8
  3319.   msgblk%=_U%!76
  3320. 5  msgblk%!0 =256       :
  3321.  length of message block
  3322. 1  msgblk%!12=0         :
  3323.  myref 0=originating
  3324. ,  msgblk%!16=1         :
  3325.  message action
  3326. 7  msgblk%!20=tmpblk%!12:
  3327.  destination window handle
  3328. 5  msgblk%!24=tmpblk%!16:
  3329.  destination icon handle
  3330. +  msgblk%!28=tmpblk%!0 :
  3331.  mouse x coord
  3332. +  msgblk%!32=tmpblk%!4 :
  3333.  mouse y coord
  3334. 4  msgblk%!36=FileSize% :
  3335.  estimated size of file
  3336. '  msgblk%!40=blk%!12   :
  3337.  file type
  3338. @  $(msgblk%+44)=
  3339. shell_Leaf(
  3340. shell_IconGetData(wh%,blk%!16))
  3341.  "Wimp_SendMessage",18,msgblk%,msgblk%!20,msgblk%!24
  3342.   _U%!120=_Q%!8
  3343. $  _U%!136=FileSize% :
  3344.  FileSize%
  3345. $  _U%!140=blk%!12   :
  3346.  FileType%
  3347. $  _U%!144=blk%!8    :
  3348.  FileBuff%
  3349. &  _U%!156=blk%!4    :
  3350.  TaskHandle%
  3351. (  _U%!200=msgblk%!20:
  3352.  window handle
  3353. &  _U%!204=msgblk%!24:
  3354.  icon handle
  3355. shell_HeapBlockReturn(tmpblk%)
  3356. !*|Stop PROCshell_SendDataSave
  3357. !*|Start PROCshell_DataSaveAck
  3358. shell_DataSaveAck(_Q%)
  3359.  _fullname$,a%,b%,blk%,temp%,void%
  3360. *|ifdef TraceInit
  3361. shell_Tracef0("DataSaveAck:DataSaveAck message received")
  3362. *|endif
  3363. a%=0:b%=_Q%?(44+a%)
  3364.  b%<>0
  3365.   _fullname$+=
  3366.   a%+=1
  3367.   b%=_Q%?(44+a%)
  3368. *|ifdef TraceInit
  3369. shell_Tracef0("DataSaveAck:Full save name is: "+_fullname$)
  3370. shell_Tracef0("DataSaveAck:task="+
  3371. _Q%!4)
  3372. shell_Tracef0("DataSaveAck:mytask="+
  3373. _U%!148)
  3374. *|endif
  3375. @offset%=
  3376. shell_GetEventListOffset(_U%!28,_U%!32,_U%+72,24,
  3377.  offset%=-1 
  3378.  offset%=-2 
  3379. shell_MessageNoArgs("SHELLMSG05")
  3380. blk%=(_U%!72)+offset%
  3381. temp%=blk%!20
  3382.  now call the file saving routine......
  3383.  $temp%<>"" 
  3384. )  void%=
  3385. ("FN"+$temp%+"(_fullname$)")
  3386.  no file saving routine specified for this event, so check if data is in a
  3387.  heapblock..
  3388. shell_HeapBlockExists(blk%!8) 
  3389. G    
  3390.  default save routine, just save the whole heapblock to disk..
  3391. X    
  3392.  "OS_File",10,_fullname$,blk%!12,,blk%!8,blk%!8+
  3393. shell_HeapBlockInfo(blk%!8)+1
  3394. :    
  3395.  Whoops! not a heapblock - someone's screwed up..
  3396. /    
  3397. shell_MessageNoArgs("SHELLMSG21")
  3398.  _Q%!36>-1 
  3399.  file is secure
  3400.  _U%!80<>0 
  3401. shell_HeapBlockReturn(_U%!80)
  3402. 1  _U%!80=
  3403. shell_HeapBlockFetch(
  3404. _fullname$+1)
  3405.   temp%=_U%!80
  3406.   $temp%=_fullname$
  3407. B_Q%!16=3:!_Q%=256:_Q%!20=_U%!200:_Q%!24=_U%!204:_Q%!40=_U%!140
  3408. 5_Q%!36=
  3409. shell_FileLength(_fullname$):_Q%!12=_Q%!8
  3410. *|ifdef TraceInit
  3411. shell_Tracef0("DataSaveAck:File length is "+
  3412. _Q%!36+" bytes")
  3413. *|endif
  3414. $(_Q%+44)=_fullname$+
  3415.  send dataload message
  3416.  store my_ref
  3417. _U%!84=_Q%!8
  3418. *|ifdef TraceInit
  3419. shell_Tracef0("DataSaveAck:Sending DataLoad Message")
  3420. *|endif
  3421.  "Wimp_SendMessage",18,_Q%,_Q%!20,_Q%!24
  3422.  now close window that save originated from if it is not a
  3423.  'dynamic' dbox
  3424.  _U%!28<>_U%!20 
  3425. shell_CloseWindow(_U%!28)
  3426.  "Wimp_CreateMenu",,-1:
  3427.  close any open menus
  3428.  *|Stop PROCshell_DataSaveAck
  3429. '*|Start PROCshell_DataSaveCheckName
  3430. shell_DataSaveCheckName(wh%,ih%)
  3431.  offset%,blk%,list_size%
  3432.  Routine to check if a 'datasave' event exists in the window wh%.
  3433.  If it does then the filename is checked for a '.' character. An
  3434.  error is generated if no '.' is found. This routine is called by
  3435.  the library when a mouse click on icon 0 is detected.
  3436. blk%=_U%!72:offset%=0
  3437.  blk%<>0 
  3438. -  list_size%=
  3439. shell_HeapBlockInfo(blk%)-8
  3440.  blk%<>0 therefore a datasave event list exists..
  3441. 2    
  3442.  check window handles of events in list..
  3443.  !(blk%+offset%)=wh% 
  3444. )      
  3445.  check for a valid path name..
  3446. 1      name$=
  3447. shell_IconGetData(!blk%,blk%!16)
  3448. I      
  3449. name$,".")=0 
  3450. shell_OK(
  3451. shell_MessageNoArgs("SHELLMSG01"))
  3452. C      offset%=list_size%:
  3453.  window handle found so abort check..
  3454.         
  3455. (    offset%+=24:
  3456.  check next event..
  3457.  offset%>=list_size%
  3458. &*|Stop PROCshell_DataSaveCheckName
  3459. !*|Start PROCshell_DataLoadAck
  3460. shell_DataLoadAck(_Q%)
  3461. *|ifdef TraceInit
  3462. shell_Tracef0("DataLoadAck:DataLoadAck message received (file received ok)")
  3463. *|endif
  3464.  *|Stop PROCshell_DataLoadAck
  3465. ,*|Start PROCshell_UserMessageAcknowledge
  3466. shell_UserMessageAcknowledge(_Q%)
  3467.  _Q%!16 
  3468. shell_AckDataLoad(_Q%)
  3469. shell_AckRAMFetch(_Q%)
  3470. +*|Stop PROCshell_UserMessageAcknowledge
  3471. !*|Start PROCshell_AckDataLoad
  3472. shell_AckDataLoad(_Q%)
  3473.  _Q%!12<>_U%!84 
  3474.  Reference hasn't been updated,
  3475.  therefore the Wimp returned my call
  3476.  The receiver didn't understand scrap transfer
  3477.  "XOS_File",6,"<Wimp$Scrap>"
  3478.  255,"Data Transfer failed: Receiver died"
  3479.  *|Stop PROCshell_AckDataLoad
  3480. !*|Start PROCshell_AckRAMFetch
  3481. shell_AckRAMFetch(_Q%)
  3482.  Exist%,temp%
  3483. temp%=_U%!156
  3484. *|ifdef TraceInit
  3485. shell_Tracef0("AckRAMFetch:AckRAMFetch called....")
  3486. *|endif
  3487.  _Q%!12<>_U%!112 
  3488.  Reference hasn't been updated,
  3489.  therefore the Wimp returned my call
  3490.  _U%!128=0 
  3491. 2    
  3492.  The receiver didn't support RAM transfer
  3493. *|ifdef TraceInit
  3494. shell_Tracef0("AckRAMFetch:Receiver does not support RAM transfer")
  3495. *|endif
  3496. ";    
  3497.  "XOS_ReadVarVal","Wimp$Scrap",,-1,0,3 
  3498.  ,,Exist%
  3499.  Exist%<>0 
  3500. $)      $(temp%+44)="<Wimp$Scrap>"+
  3501. %8      temp%!00=(49+
  3502. shell_GetString(temp%+44)))
  3503.       temp%!12=temp%!08
  3504.       temp%!16=2
  3505.       temp%!36=-1
  3506. )0      
  3507.  "Wimp_SendMessage",18,temp%,temp%!4
  3508.       _U%!108=temp%!08
  3509. +        
  3510. ,8       
  3511. shell_OK(
  3512. shell_MessageNoArgs("SHELLMSG14"))
  3513. -        
  3514. /;    
  3515.  The receiver has initiated RAM transfer, and this
  3516. 0?    
  3517.  was successful once, but I expected more data to come
  3518. *|ifdef TraceInit
  3519. shell_Tracef0("AckRAMFetch:RAM transfer started, but not enough data sent. Sender died?")
  3520. *|endif
  3521. 4'    
  3522. shell_HeapBlockReturn(_U%!152)
  3523.     _U%!152=0
  3524. shell_OK("SHELLMSG06")
  3525. ; *|Stop PROCshell_AckRAMFetch
  3526. =!*|Start PROCshell_MenuWarning
  3527. shell_MenuWarning(_Q%)
  3528.  fn$,menu_buffer%,x%,y%,void%,_temp%,a%,warn_fn$,item_addr%,blk%
  3529. @!x%=_Q%!24:y%=_Q%!28:_U%!264=0
  3530.  _U%!20<>0 
  3531. *|ifdef PROCshell_TraceInit
  3532. shell_Tracef0("MenuWarning:Removing last dynamic dbox (handle=&"+
  3533. ~_U%!20+")")
  3534. *|endif
  3535. E'  void%=
  3536. shell_DeleteWindow(_U%!20)
  3537. *|ifdef PROCshell_TraceInit
  3538. shell_Tracef0("MenuWarning:Last dynamic dbox removed")
  3539. *|endif
  3540.  Check submenu pointer and create window found there
  3541.  Then call pre and post open FNs
  3542.  If submenu pointer is the warning window, open it to remind the user
  3543.  that no dbox has been attached to this menu entry..
  3544.  _Q%!20 
  3545.  _U%!228:
  3546.  handle of warning dbox..
  3547.  won't need to do this if title/icon messages are substituted
  3548.  when loading the templates
  3549. shell_WindowRetitle(_U%!228,
  3550. shell_MessageNoArgs("warning"))
  3551.  still need to set up the message though...
  3552. shell_IconPutData(_U%!228,1,
  3553. shell_MessageNoArgs("SHELLMSG07"),0)
  3554.  "Wimp_CreateSubMenu",,_U%!228,x%,y%
  3555.  Sub menu is either a dialog box, or a menu!!
  3556. X9  item_addr%=
  3557. shell_MenuGetItemAddress(_U%!24,_Q%+32)
  3558. shell_HeapBlockExists(item_addr%!4) 
  3559.  DBox is attached..
  3560. [-    
  3561. shell_MenuWarnDBox(item_addr%,x%,y%)
  3562.  Submenu attached..
  3563. ^&    blk%=
  3564. shell_HeapBlockFetch(32)
  3565. _3    
  3566.  "MenuUtil_Decode",_U%!24,_Q%+32 
  3567.  ,,blk%
  3568. `9    
  3569. shell_FindMenuWarnEvent(blk%!8,warn_fn$,sel_fn$)
  3570. a$    
  3571. shell_HeapBlockReturn(blk%)
  3572. b=    
  3573. shell_MenuWarnSubMenu(_Q%!20,x%,y%,warn_fn$,sel_fn$)
  3574. g *|Stop PROCshell_MenuWarning
  3575. i"*|Start PROCshell_MenuWarnDBox
  3576. shell_MenuWarnDBox(addr%,x%,y%)
  3577.  temp%,h%,void%
  3578. temp%=addr%!4
  3579. shell_CreateWindow($temp%!0,h%)
  3580. *|ifdef TraceInit
  3581. shell_Tracef0("MenuWarnDBox:Creating new dynamic dbox (handle=&"+
  3582. ~h%+")")
  3583. *|endif
  3584.  $temp%!4<>"" 
  3585. *|ifdef TraceInit
  3586. shell_Tracef0("MenuWarnDBox:Calling preopen FN '"+$temp%!4+"'")
  3587. *|endif
  3588. x(  void%=
  3589. ("FN"+$temp%!4+"("+
  3590. h%+")")
  3591.  $temp%!8<>"" 
  3592. *|ifdef TraceInit
  3593. shell_Tracef0("MenuWarnDBox:Calling postopen FN '"+$temp%!8+"'")
  3594. *|endif
  3595. ~(  void%=
  3596. ("FN"+$temp%!8+"("+
  3597. h%+")")
  3598.  h% is new window handle....
  3599.  "Wimp_CreateSubMenu",,h%,x%,y%
  3600. _U%!20=h%
  3601. !*|Stop PROCshell_MenuWarnDBox
  3602. '*|Start PROCshell_FindMenuWarnEvent
  3603. shell_FindMenuWarnEvent(item_handle%,
  3604.  warn_fn$,
  3605.  sel_fn$)
  3606.  result%,e_list%,temp%,offset%,found%,list_size%,temp2%,ctr%
  3607.  submenu%
  3608. ;submenu%=0:
  3609.  If still 0 on return then no event found..
  3610. =e_list%=_U%!220:offset%=0:found%=
  3611. :warn_fn$="":submenu%=0
  3612. shell_HeapBlockExists(e_list%) 
  3613.     ctr%+=4
  3614.  e_list%!ctr%=-1
  3615.   list_size%=ctr%:ctr%=0
  3616. *|ifdef PROCshell_TraceInit
  3617. shell_Tracef0("FindMenuWarnEvent:list_size%="+
  3618. list_size%)
  3619. *|endif
  3620. "    temp%=!(e_list%+offset%+0)
  3621.  temp%<>-1 
  3622.        
  3623.  temp%=item_handle% 
  3624.         found%=
  3625. 7        temp2%=e_list%!(offset%+4):warn_fn$=$temp2%
  3626. (        submenu%=e_list%!(offset%+8)
  3627. 7        temp2%=e_list%!(offset%+12):sel_fn$=$temp2%
  3628. *|ifdef PROCshell_TraceInit
  3629. shell_Tracef0("FindMenuWarnEvent:submenu found")
  3630. *|endif
  3631.       
  3632.       offset%+=16
  3633.         
  3634.       offset%=list_size%
  3635.         
  3636.  found% 
  3637.  offset%>=list_size%
  3638.   warn_fn$="":sel_fn$=""
  3639. *|ifdef PROCshell_TraceInit
  3640.  submenu%=0 
  3641. shell_Tracef0("FindMenuWarnEvent:warn fn not found..")
  3642. *|endif
  3643. &*|Stop PROCshell_FindMenuWarnEvent
  3644. %*|Start PROCshell_MenuWarnSubMenu
  3645. shell_MenuWarnSubMenu(s_menu%,x%,y%,warn_fn$,sel_fn$)
  3646.  void%,temp%,f_menu%,ctr%
  3647. !_shell_FontMenuSelFN$=sel_fn$
  3648. shell_HeapBlockExists(_U%!224) 
  3649. shell_HeapBlockReturn(_U%!224)
  3650. ._U%!224=
  3651. shell_HeapBlockFetch(
  3652. warn_fn$+1)
  3653. !temp%=_U%!224:$temp%=warn_fn$
  3654.  warn_fn$<>"" 
  3655. .  void%=
  3656. ("FN"+warn_fn$+"(_U%!52,_U%!56)")
  3657. *|ifdef PROCshell_TraceInit
  3658. shell_Tracef0("MenuWarnSubMenu:Calling FN"+warn_fn$)
  3659. *|endif
  3660. *|ifdef Using_FontMenu
  3661.  s_menu%=_U%!252 
  3662.  Submenu is FontMenu menu..
  3663. *|ifdef PROCshell_TraceInit
  3664. shell_Tracef0("MenuWarnSubMenu:FontMenu opening..")
  3665. *|endif
  3666. shell_HeapBlockExists(_U%!256) 
  3667. shell_HeapBlockReturn(_U%!256)
  3668.  Store current menu selection for testing later..
  3669.  First work out how many levels are in the selection..
  3670. 2  ctr%=0:
  3671. :ctr%+=4:
  3672.  !(_Q%+32+ctr%)=-1:ctr%+=4
  3673. 7  _U%!256=
  3674. shell_HeapBlockFetch(ctr%):temp%=_U%!256
  3675.   ctr%=0
  3676. !    temp%!ctr%=!(_Q%+32+ctr%)
  3677.     ctr%+=4
  3678.  !(_Q%+32+ctr%)=-1
  3679.   temp%!ctr%=!(_Q%+32+ctr%)
  3680.   temp%=_U%!256
  3681. *|ifdef PROCshell_TraceInit
  3682. shell_Tracef0("MenuWarnSubMenu:Selecting '"+
  3683. shell_FontMenuGetLastSelectedFont+"' in FontMenu..")
  3684. *|endif
  3685.  "FontMenu_Select",
  3686. shell_FontMenuGetLastSelectedFont,_U%!260 
  3687.  ,f_menu%
  3688. +  _U%!264=1:
  3689.  Set 'FontMenuOpen' flag..
  3690.  f_menu%<>_U%!252 
  3691. $    
  3692.  FontMenu ptr has changed..
  3693. )    
  3694. shell_FontMenuUpdatePtr(f_menu%)
  3695. '    _U%!252=f_menu%:s_menu%=f_menu%
  3696. -  _U%!264=0:
  3697.  Clear 'FontMenuOpen' flag..
  3698. *|endif
  3699.  "Wimp_CreateSubMenu",,s_menu%,x%,y%
  3700. $*|Stop PROCshell_MenuWarnSubMenu
  3701. #*|Start PROCshell_AttachSubMenu
  3702. shell_AttachSubMenu(item%,submenu%,warn_fn$)
  3703.  "MenuUtil_SubMenu",item%,submenu%
  3704.  warn_fn$<>"" 
  3705.  "MenuUtil_Warning",,
  3706. shell_EventListMenuWarn(item%,submenu%,warn_fn$,"")
  3707. "*|Stop PROCshell_AttachSubMenu
  3708. '*|Start PROCshell_EventListMenuWarn
  3709. shell_EventListMenuWarn(item%,submenu_ptr%,warn_fn$,sel_fn$)
  3710.  temp%,temp2%,ctr%,e_list%
  3711.  _U%!220=0 
  3712.  Create event list..
  3713. '  _U%!220=
  3714. shell_HeapBlockFetch(32)
  3715.   temp%=_U%!220
  3716.   temp%!0=item%
  3717. 0  temp%!4=
  3718. shell_HeapBlockFetch(
  3719. warn_fn$+1)
  3720.   $(temp%!4)=warn_fn$
  3721.   temp%!8=submenu_ptr%
  3722. 0  temp%!12=
  3723. shell_HeapBlockFetch(
  3724. sel_fn$+1)
  3725.   $(temp%!12)=sel_fn$
  3726. 5  temp%!16=-1:temp%!20=-1:temp%!24=-1:temp%!28=-1
  3727.  Extend existing event list..
  3728. 0  e_list%=
  3729. shell_HeapBlockExtend(_U%!220,32)
  3730.   _U%!220=e_list%:ctr%=0
  3731.     ctr%+=16
  3732.  e_list%!ctr%=-1
  3733.   temp%=_U%!220
  3734.   temp%!ctr%=item%
  3735. 7  temp%!(ctr%+4)=
  3736. shell_HeapBlockFetch(
  3737. warn_fn$+1)
  3738. .  temp2%=temp%!(ctr%+4):$(temp2%)=warn_fn$
  3739. !  temp%!(ctr%+8)=submenu_ptr%
  3740. 7  temp%!(ctr%+12)=
  3741. shell_HeapBlockFetch(
  3742. sel_fn$+1)
  3743. .  temp2%=temp%!(ctr%+12):$(temp2%)=sel_fn$
  3744.     >  temp%!(ctr%+16)=-1:temp%!(ctr%+20)=-1:temp%!(ctr%+24)=-1
  3745.   temp%!(ctr%+28)=-1
  3746. &*|Stop PROCshell_EventListMenuWarn
  3747. %*|Start PROCshell_InteractiveHelp
  3748. shell_InteractiveHelp(_Q%)
  3749.  tag$,mess$,validation$,pos1%,pos2%,help$,i_blk%
  3750. &i_blk% = 
  3751. shell_HeapBlockFetch(12)
  3752.  "Wimp_WhichIcon",_Q%!32,i_blk%,&003F0000,12 << 16
  3753.  !i_blk% <> -1 
  3754.  PROCshell_Tracef0("LL:"+STR$(!i_blk%))
  3755.  PROCshell_Tracef0("LL:"+"FN" + FNshell_IconGetData(_Q%!32,!i_blk%))
  3756. /  tag$ = 
  3757. shell_IconGetData(_Q%!32,!i_blk%)
  3758. shell_HeapBlockReturn(i_blk%)
  3759.  tag$ = "" 
  3760.  tag$=
  3761. shell_GetEventHandler(_Q%!32,_Q%!36,8)
  3762.  check validation string - this overrides attached help tags!
  3763. 7validation$=
  3764. shell_IconGetValidation(_Q%!32,_Q%!36)
  3765.  validation$<>"" 
  3766. shell_StringUpperCase(
  3767. validation$,1))="I" 
  3768.     pos1%=
  3769. validation$,";")
  3770.  i is first modifier
  3771.  pos1%=0 
  3772.       tag$=
  3773. validation$,2)
  3774. $        
  3775. %&      tag$=
  3776. validation$,2,pos1%-2)
  3777. &        
  3778. (P    pos1%=
  3779. shell_StringUpperCase(validation$),
  3780. shell_StringUpperCase(";i"))
  3781. )W    pos2%=
  3782. shell_StringUpperCase(validation$),
  3783. shell_StringUpperCase(";"),pos1%+1)
  3784.  pos1%>0 
  3785.       
  3786.  pos2%>0 
  3787. ,4        tag$=
  3788. validation$,pos1%+2,pos2%-pos1%-2)
  3789.       
  3790. .&        tag$=
  3791. validation$,pos1%+2)
  3792.       
  3793. 0        
  3794.  tag$<>"" 
  3795.   _Q%!16=&503:_Q%!12=_Q%!8
  3796. 5,  mess$=
  3797. shell_MessageLookup(tag$,"","")
  3798. 6'  mess$=
  3799. shell_MessageExpand(mess$)
  3800.   $(_Q%+20)=mess$
  3801.   !_Q%=(
  3802. mess$+25) 
  3803.  "Wimp_SendMessage",17,_Q%,_Q%!4
  3804. =$*|Stop PROCshell_InteractiveHelp
  3805. *|Start PROCack
  3806. *|Stop PROCack
  3807. D%*|Start PROCshell_Message_PreQuit
  3808. shell_Message_PreQuit(_Q%)
  3809.  temp%,quitsender%,blk%,loop%,flagword%
  3810.  _U%!300>0 
  3811. H%  blk%=
  3812. shell_HeapBlockFetch(256)
  3813.  copy message block to private area..
  3814.  loop%=0 
  3815.  _Q%!0 
  3816.  first word is size...
  3817.     blk%!loop%=_Q%!loop%
  3818.  loop%
  3819. *|ifdef TraceInit
  3820. shell_Tracef0("Message_PreQuit:PreQuit message received")
  3821. *|endif
  3822.   temp%=_U%!300
  3823.   quitsender%=blk%!4
  3824.  !blk%<24 
  3825.  flagword%=0 
  3826.  flagword%=blk%!20
  3827.  acknowledge message - this aborts shutdown..
  3828. T>  blk%!12=blk%!8:
  3829.  "Wimp_SendMessage",19,blk%,quitsender%
  3830. ("FN"+$temp%)<>0 
  3831.  ok to quit..
  3832.  flagword% 
  3833. X!      
  3834.  quit just this task..
  3835.       _closedown%=
  3836. Z        
  3837.       
  3838.  shutdown desktop..
  3839.       !blk%=24:blk%!24=&1FC
  3840. ]2      
  3841.  "Wimp_SendMessage",8,blk%,quitsender%
  3842.       _closedown%=
  3843. _        
  3844. shell_HeapBlockReturn(blk%)
  3845. e$*|Stop PROCshell_Message_PreQuit
  3846. *|Start PROClwaorigin
  3847. lwaorigin(b,
  3848. x%=b!0-b!16:y%=b!12-b!20
  3849. *|Stop PROClwaorigin
  3850. *|Start FNshell_Iconbar
  3851. shell_Iconbar(pos%,sname$,text$,w%,menu%,shift%,ctrl%,alt%)
  3852.  handle%
  3853.  text$="" 
  3854. rQ  !_Q%=pos%:_Q%!4=0:_Q%!8=0:_Q%!12=70:_Q%!16=70:_Q%!20=&301A:$(_Q%+24)=sname$
  3855. tF  !_Q%=pos%:_Q%!4=0:_Q%!8=-16:_Q%!12=w%:_Q%!16=90:_Q%!20=&1700210B
  3856.  _Q%!24 12
  3857.  _Q%!28 
  3858. (sname$)+2
  3859.   $(_Q%!24)=text$
  3860.   $(_Q%!28)="S"+sname$
  3861.   _Q%!32=12
  3862.  "Wimp_CreateIcon",,_Q% 
  3863.  handle%
  3864. shell_AttachMenu(-2,handle%,menu%,shift%,ctrl%,alt%)
  3865. =handle%
  3866. *|Stop FNshell_Iconbar
  3867. $*|Start PROCshell_IconbarSetText
  3868. shell_IconbarSetText(h%,in%,s$)
  3869.  icon_blk%,w_blk%
  3870. 'icon_blk%=
  3871. shell_HeapBlockFetch(40)
  3872. )w_blk%    = 
  3873. shell_HeapBlockFetch(36)
  3874. w_blk%!20 = 0
  3875. shell_OSCheckVersion(3) 
  3876.  h% = -1 
  3877.  !w_blk% = -2 
  3878.  !w_blk% = h%
  3879.  "Wimp_GetWindowState",,w_blk%
  3880. %!icon_blk% = h%:icon_blk%!4 = in%
  3881.  "Wimp_GetIconState",,icon_blk%
  3882. $(icon_blk%!28)=s$
  3883.  "Wimp_ForceRedraw",-1,icon_blk%!8-100-w_blk%!20,icon_blk%!12,icon_blk%!16+100-w_blk%!20,icon_blk%!20
  3884. shell_HeapBlockReturn(icon_blk%)
  3885. shell_HeapBlockReturn(w_blk%)
  3886. #*|Stop PROCshell_IconbarSetText
  3887. '*|Start FNshell_WritableIconHandler
  3888. shell_WritableIconHandler(wh%,ih%,key%)
  3889.  nr_icons%,first_write%,last_write%,ctr%
  3890.  before%,after%,index%,mx%,my%,temp_blk%,caret_blk%
  3891.  caret_blk% should be just large enough for the number of icons
  3892.  actually in the window (limit is 254 icons)...
  3893. *caret_blk%=
  3894. shell_HeapBlockFetch(1024)
  3895.  "Wimp_GetCaretPosition",,caret_blk%
  3896.  caret_blk%!0=-1 
  3897. shell_HeapBlockReturn(caret_blk%)
  3898.  no caret so abort
  3899.  must be icons in the window as the caret is present
  3900.  "Wimp_WhichIcon",wh%,caret_blk%,&0040E000,&0000E000
  3901.  ctr% = 0
  3902.  REPEAT
  3903.    PROCshell_Tracef0("DEBUG::"+STR$(caret_blk%!ctr%))
  3904.    ctr% += 4
  3905.  UNTIL caret_blk%!ctr% = -1
  3906. $first_write%=caret_blk%!0:ctr%=0
  3907.  caret_blk%!ctr%=ih% 
  3908. >    before%=caret_blk%!(ctr%-4):after%=caret_blk%!(ctr%+4)
  3909.   ctr%+=4
  3910.  caret_blk%!ctr%=-1
  3911. #last_write%=caret_blk%!(ctr%-4)
  3912.  key% 
  3913.  &0D  :
  3914.  return
  3915. #      
  3916.  IF ih%=last_write% THEN
  3917. %      
  3918.  fake a keypress on icon 0
  3919. %      
  3920.  SYS "Wimp_ProcessKey",&0D
  3921. (      
  3922. shell_FakeMouseClick(wh%,0,4)
  3923.       
  3924.  ELSE
  3925. `      
  3926.  SYS "Wimp_SetCaretPosition",wh%,after%,-1,-1,-1,LEN(FNshell_IconGetData(wh%,after%))
  3927.       
  3928.  ENDIF
  3929.  &18E,394 :
  3930.  cursor down,TAB
  3931.  ih%=last_write% 
  3932. f      
  3933.  "Wimp_SetCaretPosition",wh%,first_write%,-1,-1,-1,
  3934. shell_IconGetData(wh%,first_write%))
  3935.         
  3936. Z      
  3937.  "Wimp_SetCaretPosition",wh%,after%,-1,-1,-1,
  3938. shell_IconGetData(wh%,after%))
  3939.         
  3940.  &18F,410 :
  3941.  cursor up,SHIFT TAB
  3942.  ih%=first_write% 
  3943. d      
  3944.  "Wimp_SetCaretPosition",wh%,last_write%,-1,-1,-1,
  3945. shell_IconGetData(wh%,last_write%))
  3946.         
  3947. \      
  3948.  "Wimp_SetCaretPosition",wh%,before%,-1,-1,-1,
  3949. shell_IconGetData(wh%,before%))
  3950.         
  3951. shell_HeapBlockReturn(caret_blk%)
  3952. &*|Stop FNshell_WritableIconHandler
  3953. $*|Start PROCshell_FakeMouseClick
  3954. shell_FakeMouseClick(wh%,ih%,button%)
  3955.  "OS_Byte",15,1:
  3956.  flush input buffer
  3957. '_Q%!8=button%:_Q%!12=wh%:_Q%!16=ih%
  3958. shell_Action(6)
  3959. #*|Stop PROCshell_FakeMouseClick
  3960. *|Start FNshell_IconCreate
  3961. shell_IconCreate(wh%,minx%,miny%,w%,h%,fg%,bg%,flg%,data$,addr%,len%,validation$)
  3962.  i%,handle%,valid%,icon_blk%
  3963. 'icon_blk%=
  3964. shell_HeapBlockFetch(40)
  3965. icon_blk%!0=wh%
  3966. 'icon_blk%!4=minx%:icon_blk%!8=miny%
  3967. /icon_blk%!12=minx%+w%:icon_blk%!16=miny%+h%
  3968. )icon_blk%!20=flg% 
  3969.  bg%<<28 
  3970.  fg%<<24
  3971.  icon_blk%!20 
  3972.  &100 
  3973.   i%=
  3974. data$,",")
  3975.   icon_blk%!24=addr%
  3976.  validation$<>"" 
  3977. 4    valid%=
  3978. shell_HeapBlockFetch(
  3979. validation$+1)
  3980.     $valid%=validation$
  3981.     icon_blk%!28=valid%
  3982.     icon_blk%!28=-1
  3983.   icon_blk%!32=len%
  3984.    $(icon_blk%+24)=
  3985. data$,11)
  3986.  "Wimp_CreateIcon",,icon_blk% 
  3987.  handle%
  3988. shell_HeapBlockReturn(icon_blk%)
  3989. =handle%
  3990. *|Stop FNshell_IconCreate
  3991.  *|Start PROCshell_IconDelete
  3992. shell_IconDelete(wh%,ih%)
  3993. shell_DoIconDelete(wh%,ih%,
  3994. *|Stop PROCshell_IconDelete
  3995. !*|Start PROCshell_IconDelete2
  3996. shell_IconDelete2(wh%,ih%)
  3997. shell_DoIconDelete(wh%,ih%,
  3998.  *|Stop PROCshell_IconDelete2
  3999. "*|Start PROCshell_DoIconDelete
  4000. shell_DoIconDelete(wh%,ih%,redraw%)
  4001.  blk%,x0%,y0%,x1%,y1%
  4002. "blk%=
  4003. shell_HeapBlockFetch(40)
  4004. blk%!0=wh%:blk%!4=ih%
  4005.  "Wimp_GetIconState",,blk%
  4006.  "Interface_BoundingBox",,blk%+8
  4007. 2x0%=blk%!8:y0%=blk%!12:x1%=blk%!16:y1%=blk%!20
  4008.  "Wimp_GetIconState",,blk%
  4009. shell_HeapBlockExists(blk%!28) 
  4010. shell_HeapBlockReturn(blk%!28)
  4011. shell_HeapBlockExists(blk%!32) 
  4012. shell_HeapBlockReturn(blk%!32)
  4013.  "Wimp_DeleteIcon",,blk%
  4014.  redraw% 
  4015.  "Wimp_ForceRedraw",wh%,x0%,y0%,x1%,y1%
  4016. shell_HeapBlockReturn(blk%)
  4017. !*|Stop PROCshell_DoIconDelete
  4018. !*|Start PROCshell_IconPutData
  4019. shell_IconPutData(whandle%,ihandle%,data$,redraw)
  4020.  blk%,old_str$
  4021. 4old_str$ = 
  4022. shell_IconGetData(whandle%,ihandle%)
  4023.  data$ <> old_str$ 
  4024. $  blk%=
  4025. shell_HeapBlockFetch(40)
  4026.   blk%!0 = whandle%
  4027.   blk%!4 = ihandle%
  4028.  "Wimp_GetIconState",,blk%
  4029.  (blk%!24 
  4030.  (1<<8)) <> 0 
  4031. D    
  4032. data$ > blk%!36 
  4033. shell_MessageNoArgs("SHELLMSG12")
  4034.     $(blk%!28) = data$
  4035. !    $(blk% + 28) = 
  4036. data$,11)
  4037.  redraw <> 0 
  4038.     blk%!8 = 0:blk%!12 = 0
  4039. !$    
  4040.  "Wimp_SetIconState",,blk%
  4041. shell_HeapBlockReturn(blk%)
  4042. ' *|Stop PROCshell_IconPutData
  4043. )$*|Start PROCshell_IconPutDataNow
  4044. shell_IconPutDataNow(whandle%,ihandle%,data$)
  4045.  blk%
  4046. ,#blk%=
  4047. shell_HeapBlockFetch(50) 
  4048. blk%!0=whandle%
  4049. blk%!4=ihandle%
  4050.  "Wimp_GetIconState",,blk%
  4051.  (blk%!24 
  4052.  (1<<8))<>0 
  4053. data$>blk%!36 
  4054. shell_MessageNoArgs("SHELLMSG12")
  4055.   $(blk%!28)=data$
  4056.   $(blk%+28)=
  4057. data$,11)
  4058. blk%!8=0:blk%!12=0
  4059.  "Wimp_SetIconState",,blk%
  4060.  Call wimp poll immediately in case the user program doesn't..
  4061. shell_EnsurePoll
  4062. shell_HeapBlockReturn(blk%)
  4063. <#*|Stop PROCshell_IconPutDataNow
  4064. >!*|Start FNshell_IconNewSprite
  4065. shell_IconNewSprite(whandle%,ihandle%,newname$,redraw)
  4066.  icon_blk%
  4067. A'icon_blk%=
  4068. shell_HeapBlockFetch(40)
  4069. B-icon_blk%!0=whandle%:icon_blk%!4=ihandle%
  4070.  "Wimp_GetIconState",,icon_blk%
  4071.  "Wimp_DeleteIcon",,icon_blk%
  4072. ENicon_blk%!4=icon_blk%!8:icon_blk%!8=icon_blk%!12:icon_blk%!12=icon_blk%!16
  4073. FPicon_blk%!16=icon_blk%!20:icon_blk%!20=icon_blk%!24:$(icon_blk%+24)=newname$
  4074.  "Wimp_CreateIcon",,icon_blk% 
  4075.  ihandle%
  4076.  redraw 
  4077.  "Wimp_ForceRedraw",icon_blk%!0,icon_blk%!4,icon_blk%!8,icon_blk%!12,icon_blk%!16
  4078. shell_HeapBlockReturn(icon_blk%)
  4079. =ihandle%
  4080. L *|Stop FNshell_IconNewSprite
  4081. *|Start FNshell_IconGetData
  4082. shell_IconGetData(whandle%,ihandle%)
  4083.  result$,icon_blk%
  4084. Q'icon_blk%=
  4085. shell_HeapBlockFetch(40)
  4086. icon_blk%!0=whandle%
  4087. icon_blk%!4=ihandle%
  4088.  "Wimp_GetIconState",,icon_blk%
  4089.  (icon_blk%!24 
  4090.  (1<<8))<>0 
  4091.  result$=$(icon_blk%!28) 
  4092.  result$=$(icon_blk%+28)
  4093. shell_HeapBlockReturn(icon_blk%)
  4094. =result$
  4095. *|Stop FNshell_IconGetData
  4096. *|Start FNshell_IconMove2
  4097. shell_IconMove2(wh%,ih%,d_x%,d_y%)
  4098.  m_blk%
  4099. ^$m_blk%=
  4100. shell_HeapBlockFetch(40)
  4101. !m_blk%=wh%:m_blk%!4=ih%
  4102.  "Wimp_GetIconState",,m_blk%
  4103. a"m_blk%!8+=d_x%:m_blk%!16+=d_x%
  4104. b#m_blk%!12+=d_y%:m_blk%!20+=d_y%
  4105. cGih%=
  4106. shell_IconMove(wh%,ih%,m_blk%!8,m_blk%!12,m_blk%!16,m_blk%!20)
  4107. shell_HeapBlockReturn(m_blk%)
  4108. *|Stop FNshell_IconMove2
  4109. *|Start FNshell_IconResize
  4110. shell_IconResize(wh%,ih%,x0%,y0%,x1%,y1%)
  4111. shell_IconMove(wh%,ih%,x0%,y0%,x1%,y1%)
  4112. *|Stop FNshell_IconResize
  4113. *|Start FNshell_IconMove
  4114. shell_IconMove(wh%,ih%,x0%,y0%,x1%,y1%)
  4115.  i_blk%,i_flags%,i_data%,bdr%,blk%
  4116.  oldflags%,odt0%,odt1%,odt2%
  4117. q$i_blk%=
  4118. shell_HeapBlockFetch(40)
  4119. r"blk%=
  4120. shell_HeapBlockFetch(40)
  4121. s;!i_blk%=wh%:i_blk%!4=ih%:
  4122.  "Wimp_GetIconState",,i_blk%
  4123. !blk%=wh%:blk%!4=ih%
  4124.  "Wimp_GetIconState",,blk%
  4125.  "Interface_BoundingBox",,blk%+8
  4126. w&iflags%=i_blk%!24:idata%=i_blk%+28
  4127. xBoldflags%=iflags%:odt0%=idata%!0:odt1%=idata%!4:odt2%=idata%!8
  4128. bdr%=i_blk%!8-blk%!8
  4129.  "Wimp_DeleteIcon",,i_blk%
  4130.  "Wimp_ForceRedraw",!i_blk%,i_blk%!8-bdr%,i_blk%!12-bdr%,i_blk%!16+bdr%,i_blk%!20+bdr%
  4131. |Pih%=
  4132. shell_CreateIcon2(wh%,x0%,y0%,x1%,y1%,oldflags%,odt0%,odt1%,odt2%,bdr%)
  4133. shell_HeapBlockReturn(i_blk%)
  4134. shell_HeapBlockReturn(blk%)
  4135. *|Stop FNshell_IconMove
  4136. *|Start FNshell_CreateIcon2
  4137. shell_CreateIcon2(handle%,x0%,y0%,x1%,y1%,flags%,dt0%,dt1%,dt2%,bdr%)
  4138.  ic%,q%,text$,sprite$,minx%,miny%
  4139. shell_HeapBlockFetch(60)
  4140. !q%=handle%
  4141. 1q%!20=flags%:q%!24=dt0%:q%!28=dt1%:q%!32=dt2%
  4142. text$="":sprite$=""
  4143.  flags% 
  4144.  flags% 
  4145.  &100 text$=$(q%!24) 
  4146.  text$=$(q%+24)
  4147.  flags% 
  4148.  flags% 
  4149.  &100 
  4150. .  sprite$=
  4151. shell_IconGetCommand(q%!28,"S")
  4152.   sprite$=$(q%+24)
  4153. shell_GetMinXY(flags%,text$,sprite$)
  4154.  x1%-x0%<minx% 
  4155.  x1%=x0%+minx%
  4156.  y1%-y0%<miny% 
  4157.  y1%=y0%+miny%
  4158. )q%!4=x0%:q%!8=y0%:q%!12=x1%:q%!16=y1%
  4159.  "Wimp_CreateIcon",,q% 
  4160.  "Wimp_ForceRedraw",!q%,q%!4-bdr%,q%!8-bdr%,q%!12+bdr%,q%!16+bdr%
  4161.  "Wimp_GetCaretPosition",,q%
  4162.  !q%=handle%:
  4163. q%!4=ic%:
  4164.  "Wimp_SetCaretPosition",handle%,ic%,0,0,-1,0
  4165. shell_HeapBlockReturn(q%)
  4166. *|Stop FNshell_CreateIcon2
  4167. *|Start PROCshell_GetMinXY
  4168. shell_GetMinXY(flags%,text$,sprite$)
  4169.  x0%,y0%,x1%,y1%,mx%,my%
  4170. minx%=0:miny%=0
  4171.  flags%
  4172.  text$<>"" 
  4173.  flags%
  4174. 5       
  4175.  "Font_ReadInfo",flags%>>24 
  4176.  ,,y0%,,y1%
  4177. D       
  4178.  "Font_StringBBox",,
  4179. (flags%>>24)+text$ 
  4180.  ,x0%,,x1%
  4181. ,       
  4182.  "Font_ConverttoOS",,x0% 
  4183.  ,x0%
  4184. ,       
  4185.  "Font_ConverttoOS",,x1% 
  4186.  ,x1%
  4187. &       minx%=x1%-x0%:miny%=y1%-y0%
  4188.  minx%=6*dx%+16*
  4189. text$:miny%=32
  4190.  flags%
  4191. &04 miny%+=2*dy%
  4192.  flags%
  4193.  sprite$<>"" 
  4194.  "XOS_SpriteOp",&128,
  4195. shell_UserSpritesBase,sprite$ 
  4196.  ,,,mx%,my%,,spm% ; P%
  4197. 1)=0 
  4198. A      
  4199.  "XOS_ReadModeVariable",spm%,4 
  4200.  ,,spx%:mx%=mx%<<spx%
  4201. A      
  4202.  "XOS_ReadModeVariable",spm%,5 
  4203.  ,,spy%:my%=my%<<spy%
  4204. +      
  4205.  flags%
  4206. &800 mx%=mx%/2:my%=my%/2
  4207. B      
  4208.  (flags%
  4209. &21B)=&13 mx%=minx%+mx% :
  4210.  sprite+text (V~H~R)
  4211.       
  4212.  mx%>minx% minx%=mx%
  4213.       
  4214.  my%>miny% miny%=my%
  4215. *|Stop PROCshell_GetMinXY
  4216. "*|Start FNshell_IconGetCommand
  4217. shell_IconGetCommand(v%,c$)
  4218.  I%,result$
  4219.  v%<=0 
  4220.   result$=""
  4221. I  I%=
  4222. shell_StringUpperCase($v%),";"+
  4223. shell_StringUpperCase(c$))
  4224.  I%=0 
  4225.     result$=""
  4226. /    result$=
  4227. $(v%+I%),
  4228. $(v%+I%)+";",";")-1)
  4229. =result$
  4230. !*|Stop FNshell_IconGetCommand
  4231.  *|Start PROCshell_IconRedraw
  4232. shell_IconRedraw(wh%,ih%)
  4233.  blk%
  4234. "blk%=
  4235. shell_HeapBlockFetch(40)
  4236. !blk%=wh%:blk%!4=ih%
  4237.  "Wimp_GetIconState",,blk%
  4238.  "Interface_BoundingBox",,blk%+8
  4239.  "Wimp_ForceRedraw",wh%,blk%!8,blk%!12,blk%!16,blk%!20
  4240. shell_Action(
  4241. shell_Poll_I(0,_U%!148))
  4242. shell_HeapBlockReturn(blk%)
  4243. *|Stop PROCshell_IconRedraw
  4244. %*|Start FNshell_IconGetValidation
  4245. shell_IconGetValidation(wh%,ih%)
  4246.  blk%,validation$,flags%
  4247.  ih%=-1 
  4248. validation$=""
  4249. #blk%=
  4250. shell_HeapBlockFetch(100)
  4251. blk%!0=wh%:blk%!4=ih%
  4252.  "Wimp_GetIconState",,blk%
  4253.  check flags first to see if it has a
  4254.  validation string!
  4255. flags%=blk%!24
  4256.  flags% 
  4257.  &100 
  4258.  blk%!32>0 
  4259.  validation$=$(blk%!32)
  4260. shell_HeapBlockReturn(blk%)
  4261. =validation$
  4262. $*|Stop FNshell_IconGetValidation
  4263. '*|Start PROCshell_IconPutValidation
  4264. shell_IconPutValidation(wh%,ih%,valid$)
  4265.  blk%,flags%
  4266. #blk%=
  4267. shell_HeapBlockFetch(100)
  4268. blk%!0=wh%:blk%!4=ih%
  4269.  "Wimp_GetIconState",,blk%
  4270. flags%=blk%!24
  4271.  flags% 
  4272.  &100 
  4273.   $(blk%!32)=valid$
  4274. shell_HeapBlockReturn(blk%)
  4275. &*|Stop PROCshell_IconPutValidation
  4276. "*|Start FNshell_IsIconSelected
  4277. shell_IsIconSelected(WindowHandle%,IconHandle%)
  4278.  temp%
  4279. shell_IconGetState(WindowHandle%,IconHandle%)
  4280. flags%=_Q%!24
  4281. temp%=(flags% 
  4282.  &200000)
  4283.  temp%=0 
  4284. !*|Stop FNshell_IsIconSelected
  4285.  *|Start PROCshell_IconSelect
  4286. shell_IconSelect(WindowHandle%,IconHandle%)
  4287. shell_IconSetState(WindowHandle%,IconHandle%,&200000,&200000)
  4288. *|Stop PROCshell_IconSelect
  4289. "*|Start PROCshell_IconDeselect
  4290. shell_IconDeselect(WindowHandle%,IconHandle%)
  4291. shell_IconSetState(WindowHandle%,IconHandle%,0,&200000)
  4292. !*|Stop PROCshell_IconDeselect
  4293. "*|Start PROCshell_IconGetState
  4294. shell_IconGetState(WindowHandle%,IconHandle%)
  4295. !_Q%=WindowHandle%
  4296. _Q%!4=IconHandle%
  4297.  "Wimp_GetIconState",,_Q%
  4298. !*|Stop PROCshell_IconGetState
  4299. %*|Start PROCshell_IconSetSelected
  4300. shell_IconSetSelected(wh%,ih%,state%)
  4301.  state%=0 
  4302. shell_IconDeselect(wh%,ih%)
  4303. shell_IconSelect(wh%,ih%)
  4304. &$*|Stop PROCshell_IconSetSelected
  4305. *|Start PROCshell_IconSet
  4306. shell_IconSet(wh%,ih%,state%)
  4307.  state%=0 
  4308. shell_IconDeselect(wh%,ih%)
  4309. shell_IconSelect(wh%,ih%)
  4310. *|Stop PROCshell_IconSet
  4311. 2"*|Start PROCshell_IconSetState
  4312. shell_IconSetState(WindowHandle%,IconHandle%,EorWord%,ClearWord%)
  4313.  icon_blk%
  4314. 5'icon_blk%=
  4315. shell_HeapBlockFetch(16)
  4316. !icon_blk%=WindowHandle%
  4317. icon_blk%!04=IconHandle%
  4318. icon_blk%!08=EorWord%
  4319. icon_blk%!12=ClearWord%
  4320.  "Wimp_SetIconState",,icon_blk%
  4321. shell_HeapBlockReturn(icon_blk%)
  4322. >!*|Stop PROCshell_IconSetState
  4323. ?&*|Start PROCshell_IconUnselectable
  4324. shell_IconUnselectable(handle%,icon%)
  4325. shell_IconSetState(handle%,icon%,&400000,&40000)
  4326. D%*|Stop PROCshell_IconUnselectable
  4327. E%*|Start PROCshell_IconSetBGColour
  4328. shell_IconSetBGColour(wh%,ih%,col%)
  4329.  col%<0 
  4330.  col%>15 
  4331. shell_MessageOneArg("SHELLMSG24","PROCshell_IconSetBGColour")
  4332. shell_IconSetState(wh%,ih%,col%<<28,&F0000000)
  4333. K$*|Stop PROCshell_IconSetBGColour
  4334. L%*|Start PROCshell_IconSetFGColour
  4335. shell_IconSetFGColour(wh%,ih%,col%)
  4336.  col%<0 
  4337.  col%>15 
  4338. shell_MessageOneArg("SHELLMSG24","PROCshell_IconSetFGColour")
  4339. shell_IconSetState(wh%,ih%,col%<<24,&0F000000)
  4340. R$*|Stop PROCshell_IconSetFGColour
  4341. T&*|Start PROCshell_CaretSetPosition
  4342. shell_CaretSetPosition(whandle%,ihandle%,xoff%,yoff%,height%,index%)
  4343.  "Wimp_SetCaretPosition",whandle%,ihandle%,xoff%,yoff%,height%,index%
  4344. Y%*|Stop PROCshell_CaretSetPosition
  4345. ['*|Start PROCshell_IconSetButtonType
  4346. shell_IconSetButtonType(wh%,ih%,button_type%)
  4347.  button_type%=12 
  4348.  button_type%=13 
  4349. shell_MessageOneArg("SHELLMSG23","PROCshell_IconSetButtonType")
  4350.  button_type%<0 
  4351.  button_type%>15 
  4352. shell_MessageOneArg("SHELLMSG22","PROCshell_IconSetButtonType")
  4353. shell_IconSetState(wh%,ih%,button_type%<<12,&F000)
  4354. b&*|Stop PROCshell_IconSetButtonType
  4355. c *|Start PROCshell_IconSetESG
  4356. shell_IconSetESG(wh%,ih%,esg%)
  4357.  esg%<0 
  4358.  esg%>31 
  4359. shell_MessageOneArg("SHELLMSG25","PROCshell_IconSetESG")
  4360. shell_IconSetState(wh%,ih%,esg%<<16,&1F0000)
  4361. *|Stop PROCshell_IconSetESG
  4362. k!*|Start PROCshell_IconSetText
  4363. shell_IconSetText(wh%,ih%,action%)
  4364.  action%<>0 
  4365.  action%=1<<0
  4366. shell_IconSetState(wh%,ih%,action%,1<<0)
  4367. q *|Stop PROCshell_IconSetText
  4368. s#*|Start PROCshell_IconSetSprite
  4369. shell_IconSetSprite(wh%,ih%,action%)
  4370.  action%<>0 
  4371.  action%=1<<1
  4372. shell_IconSetState(wh%,ih%,action%,1<<1)
  4373. y"*|Stop PROCshell_IconSetSprite
  4374. z#*|Start PROCshell_IconSetBorder
  4375. shell_IconSetBorder(wh%,ih%,action%)
  4376.  action%<>0 
  4377.  action%=1<<2
  4378. shell_IconSetState(wh%,ih%,action%,1<<2)
  4379. "*|Stop PROCshell_IconSetBorder
  4380. %*|Start PROCshell_IconSetHCentred
  4381. shell_IconSetHCentred(wh%,ih%,action%)
  4382. shell_IconSetState(wh%,ih%,0,1<<9):
  4383.  unset right justified bit...
  4384.  action%<>0 
  4385.  action%=1<<3
  4386. shell_IconSetState(wh%,ih%,action%,1<<3)
  4387. $*|Stop PROCshell_IconSetHCentred
  4388. %*|Start PROCshell_IconSetVCentred
  4389. shell_IconSetVCentred(wh%,ih%,action%)
  4390.  action%<>0 
  4391.  action%=1<<4
  4392. shell_IconSetState(wh%,ih%,action%,1<<4)
  4393. $*|Stop PROCshell_IconSetVCentred
  4394. #*|Start PROCshell_IconSetFilled
  4395. shell_IconSetFilled(wh%,ih%,action%)
  4396.  action%<>0 
  4397.  action%=1<<5
  4398. shell_IconSetState(wh%,ih%,action%,1<<5)
  4399. "*|Stop PROCshell_IconSetFilled
  4400. &*|Start PROCshell_IconSetRightJust
  4401. shell_IconSetRightJust(wh%,ih%,action%)
  4402. shell_IconSetHCentred(wh%,ih%,0)
  4403.  action%<>0 
  4404.  action%=1<<9
  4405. shell_IconSetState(wh%,ih%,action%,1<<9)
  4406. %*|Stop PROCshell_IconSetRightJust
  4407. %*|Start PROCshell_IconSetLeftJust
  4408. shell_IconSetLeftJust(wh%,ih%)
  4409. shell_IconSetHCentred(wh%,ih%,0)
  4410. shell_IconSetRightJust(wh%,ih%,0)
  4411. $*|Stop PROCshell_IconSetLeftJust
  4412. )*|Start PROCshell_IconSetUnselectable
  4413. shell_IconSetUnselectable(wh%,ih%,state%)
  4414.  caret_blk%
  4415.  state%<>0 
  4416.  state%=1<<22
  4417. shell_IconSetState(wh%,ih%,state%,1<<22)
  4418.  state%<>0 
  4419.  check if icon has the caret, lose it if it has..
  4420. *  caret_blk%=
  4421. shell_HeapBlockFetch(24)
  4422.  "Wimp_GetCaretPosition",,caret_blk%
  4423.  !caret_blk%=wh% 
  4424.  caret_blk%!4=ih% 
  4425. %    
  4426.  "Wimp_SetCaretPosition",-1
  4427. shell_HeapBlockReturn(caret_blk%)
  4428. (*|Stop PROCshell_IconSetUnselectable
  4429. #*|Start PROCshell_CaretSetRight
  4430. shell_CaretSetRight(wh%,ih%)
  4431.  "Wimp_SetCaretPosition",wh%,ih%,-1,-1,-1,
  4432. shell_IconGetData(wh%,ih%))
  4433. "*|Stop PROCshell_CaretSetRight
  4434. *|Start PROCprint_text
  4435. print_text(X,Y,text$)
  4436. in(X,Y-32,X+16*
  4437. (text$),Y) 
  4438.  text$
  4439. *|Stop PROCprint_text
  4440. *|Start FNin
  4441. in(A%,B%,C%,D%)
  4442.  C%<gbx 
  4443.  A%>gtx 
  4444.  B%>gty 
  4445.  D%<gby 
  4446. *|Stop FNin
  4447. *|Start PROCnewvals
  4448. newvals
  4449. gbx=_Q%!28:gby=_Q%!32
  4450. gtx=_Q%!36:gty=_Q%!40
  4451. wbx=_Q%!4:wby=_Q%!8
  4452. wtx=_Q%!12:wty=_Q%!16
  4453. xsc=_Q%!20:ysc=_Q%!24
  4454. !hp=wtx-wbx:vp=wty-wby:ebx=xsc
  4455. !etx=xsc+hp:ety=ysc:eby=ysc-vp
  4456. *|Stop PROCnewvals
  4457. max(a%,b%)
  4458.  a%<b% 
  4459. *|Start FNshell_Leaf
  4460. shell_Leaf(path$)
  4461. path$,".")
  4462. !  path$=
  4463. path$,
  4464. path$,".")+1)
  4465. =path$
  4466. *|Stop FNshell_Leaf
  4467. *|Start FNshell_Branch
  4468. shell_Branch(fname$)
  4469.  pos%,br$,temp%
  4470. fname$,".")=0 
  4471.   br$=""
  4472.   temp%=0
  4473.     pos%=temp%+1
  4474.     temp%=
  4475. fname$,".",pos%)
  4476.  temp%=0
  4477.   br$=
  4478. fname$,pos%-2)
  4479. *|Stop FNshell_Branch
  4480. *|Start FNgname
  4481. gname(ptr)
  4482.     f$=""
  4483.  ?ptr<>0 
  4484.  ?ptr<>13
  4485.   f$=f$+
  4486. ?ptr:ptr+=1
  4487. *|Stop FNgname
  4488. "*|Start PROCshell_WindowResize
  4489. shell_WindowResize(whandle%,bx%,by%,tx%,ty%,open%)
  4490. +!_Q%=bx%:_Q%!4=by%:_Q%!8=tx%:_Q%!12=ty%
  4491.  "Wimp_SetExtent",whandle%,_Q%
  4492.  open% 
  4493.   _Q%!0=whandle%
  4494.  "Wimp_GetWindowInfo",,_Q%
  4495.  "Wimp_OpenWindow",,_Q%
  4496. !*|Stop PROCshell_WindowResize
  4497. #*|Start PROCshell_WindowRetitle
  4498. shell_WindowRetitle(
  4499.  whandle%,title$)
  4500.  temp%,win_blk%,handle%,t_buffer_len%
  4501. ,win_blk%   = 
  4502. shell_HeapBlockFetch(6000)
  4503. win_blk%!0 = whandle%
  4504.  "Wimp_GetWindowInfo",,win_blk%
  4505.  ((win_blk%!60) 
  4506.  &100) = 0 
  4507.  window title is not indirected..
  4508.   temp% = win_blk% + 76
  4509.   $temp% = 
  4510. title$,11)
  4511.  "Wimp_DeleteWindow",,win_blk%
  4512.  "Wimp_CreateWindow",,win_blk% + 4 
  4513.  handle%
  4514.  handle% <> whandle% 
  4515. "9    
  4516.  Window handle has changed, update event data...
  4517. #3    
  4518. shell_UpdateWindowHandle(whandle%,handle%)
  4519.     whandle% = handle%
  4520.  Window title is indirected, find buffer size..
  4521. (!  t_buffer_len% = win_blk%!84
  4522.  Truncate title if it won't fit the buffer...
  4523. *6  $(!(win_blk% + 76)) = 
  4524. title$,t_buffer_len% - 1)
  4525.  ((win_blk%!32) 
  4526.  (1 << 16)) <> 0 
  4527. ,9    
  4528.  Window is open, so redraw the title bar area...
  4529. -T    
  4530.  "Wimp_ForceRedraw",-1,win_blk%!4,win_blk%!16,win_blk%!12,win_blk%!16 + 44
  4531. shell_HeapBlockReturn(win_blk%)
  4532. 3"*|Stop PROCshell_WindowRetitle
  4533. 5)*|Start FNshell_WindowTitleIndirected
  4534. shell_WindowTitleIndirected(flag%)
  4535.  (flag% 
  4536.  (1<<8))=(1<<8) 
  4537. :(*|Stop FNshell_WindowTitleIndirected
  4538. ;**|Start PROCshell_ScreenToWindowCoords
  4539. shell_ScreenToWindowCoords(WHandle%,
  4540.  Temp%,WXMin%,WYMin%,XScroll%,YScroll%,Scratch%
  4541. >'Scratch%=
  4542. shell_HeapBlockFetch(600)
  4543. Temp%=Scratch%
  4544. !Temp%=WHandle%
  4545.  "Wimp_GetWindowInfo",,Temp%
  4546. WXMin%=Scratch%!4
  4547. WYMax%=Scratch%!16
  4548. XScroll%=Scratch%!20
  4549. YScroll%=Scratch%!24
  4550. X%=X%+(XScroll%-WXMin%)
  4551. Y%=Y%+(YScroll%-WYMax%)
  4552. shell_HeapBlockReturn(Scratch%)
  4553. K)*|Stop PROCshell_ScreenToWindowCoords
  4554. L#*|Start FNshell_WimpSlotReadEnd
  4555. shell_WimpSlotReadEnd
  4556.  mem%
  4557.  "Wimp_SlotSize",-1,-1 
  4558.  mem%
  4559. P    =mem%
  4560. R"*|Stop FNshell_WimpSlotReadEnd
  4561. S'*|Start FNshell_WimpSlotClaimMemory
  4562. shell_WimpSlotClaimMemory(mem%,size%)
  4563.  ssize%
  4564.  "Wimp_SlotSize",mem%+size%,-1 
  4565.  ssize%
  4566.  ssize%<mem%+size% 
  4567. = ssize%
  4568. Z&*|Stop FNshell_WimpSlotClaimMemory
  4569. [+*|Start PROCshell_WimpSlotReleaseMemory
  4570. shell_WimpSlotReleaseMemory
  4571.  "Wimp_SlotSize",mem%,-1
  4572. `**|Stop PROCshell_WimpSlotReleaseMemory
  4573. a *|Start PROCshell_MouseLimit
  4574. shell_MouseLimit(b,whandle%)
  4575. c,b!0=whandle%:
  4576.  "Wimp_GetWindowState",,b
  4577. mouse_rectangle(b!4,b!8,b!12-b!4,b!16-b!8)
  4578. *|Stop PROCshell_MouseLimit
  4579. h%*|Start FNshell_NameOfFirstSprite
  4580. shell_NameOfFirstSprite(File$)
  4581.  X%,N%,S$
  4582. (File$)
  4583. #X%=4
  4584. #X%*&100
  4585. #X%*&10000
  4586. #X%*&1000000
  4587. #X%=N%
  4588. r    S$=""
  4589.  N%=0 
  4590. y$*|Stop FNshell_NameOfFirstSprite
  4591. {$*|Start PROCInitialiseSpriteArea
  4592. InitialiseSpriteArea(S%,Length%)
  4593. !S%=Length%
  4594. S%!8=16
  4595.  "OS_SpriteOp",9+256,S%
  4596. #*|Stop PROCInitialiseSpriteArea
  4597.  *|Start PROCshell_ListEvents
  4598. shell_ListEvents(wh%,ic%)
  4599.  menu%,menu$
  4600.  wh%=-1 
  4601.  wh%=-2
  4602. shell_Tracef0("MenuSelection="+
  4603. shell_GetEventHandler(wh%,ic%,0))
  4604. shell_Tracef0("MenuMaker    ="+
  4605. shell_GetEventHandler(wh%,ic%,1))
  4606. shell_Tracef0("ClickSelect  ="+
  4607. shell_GetEventHandler(wh%,ic%,2))
  4608. shell_Tracef0("ClickAdjust  ="+
  4609. shell_GetEventHandler(wh%,ic%,3))
  4610. shell_Tracef0("Redraw       ="+
  4611. shell_GetEventHandler(wh%,ic%,4))
  4612. shell_Tracef0("Keypress     ="+
  4613. shell_GetEventHandler(wh%,ic%,5))
  4614. shell_Tracef0("Drag         ="+
  4615. shell_GetEventHandler(wh%,ic%,6))
  4616. shell_Tracef0("Menu Warning ="+
  4617. shell_GetEventHandler(wh%,ic%,7))
  4618. shell_Tracef0("HelpTag      ="+
  4619. shell_GetEventHandler(wh%,ic%,8))
  4620. (menu%=
  4621. shell_GetEventMenu(2,wh%,ic%)
  4622.  menu%=0 
  4623.   menu$="None"
  4624.   menu$=
  4625. menu%
  4626. shell_Tracef0("Menu handle =&"+menu$)
  4627. *|Stop PROCshell_ListEvents
  4628.  ----------- Heap Manager Routines ------------------------------------
  4629.  Function to load heap manager machine code
  4630. %*|Start PROCshell_HeapManagerInit
  4631. shell_HeapManagerInit(path$,space%)
  4632.  heap_code% 900
  4633. ("LOAD "+path$+"heapcode "+
  4634. ~heap_code%)
  4635.  heap_code%+0,space%
  4636. $*|Stop PROCshell_HeapManagerInit
  4637. #*|Start FNshell_HeapBlockExists
  4638. shell_HeapBlockExists(addr%)
  4639.  void%
  4640.  addr%<&8000 
  4641.  99,"No heapblock defined at this address"
  4642. %void%=
  4643. shell_HeapBlockInfo(addr%)
  4644. "*|Stop FNshell_HeapBlockExists
  4645. #*|Start FNshell_HeapBlockExtend
  4646. 7*|!Function to extend already allocated heap block.
  4647. $*|!a% = current address of block
  4648. J*|!b% = amount to increase or decrease block size by (-ve to decrease)
  4649. 4*|!returns address of block (block may be moved)
  4650. shell_HeapBlockExtend(a%,b%)
  4651.  heap_code%+12,a%,b%
  4652. "*|Stop FNshell_HeapBlockExtend
  4653. "*|Start FNshell_HeapBlockFetch
  4654. /*|!Function to allocate a block on the heap
  4655. ,*|!a% = size of block to fetch from heap
  4656. )*|!returns address of allocated block
  4657. shell_HeapBlockFetch(a%)
  4658.  addr%
  4659.  heap_code%+4,addr%,a%
  4660. =addr%
  4661. !*|Stop FNshell_HeapBlockFetch
  4662. %*|Start PROCshell_HeapBlockReturn
  4663. 3*|!Procedure to return a heap block to the heap
  4664. **|!a% = address of block to deallocate
  4665. shell_HeapBlockReturn(
  4666. shell_HeapBlockExists(a%) 
  4667.  heap_code%+8,a%
  4668. $*|Stop PROCshell_HeapBlockReturn
  4669. !*|Start FNshell_HeapBlockInfo
  4670. 8*|!Function to return current length of a heap block
  4671. *|!a% = addr of heap block
  4672. shell_HeapBlockInfo(a%)
  4673.  "OS_Heap",6,!(heap_code%+28),a% 
  4674.  ,,,r3
  4675.  *|Stop FNshell_HeapBlockInfo
  4676. *|Start FNshell_OSVarExists
  4677. shell_OSVarExists(buffer%,varname$)
  4678.  nr_bytes
  4679.  "XOS_ReadVarVal",varname$,buffer%,-1,0,0 
  4680.  ,,nr_bytes
  4681.  nr_bytes<0 
  4682. *|Stop FNshell_OSVarExists
  4683. *|Start FNshell_OSVarGetVal
  4684. shell_OSVarGetVal(buffer%,size%,varname$,expand)
  4685.  value$,nr_bytes,nameptr%
  4686.  "XOS_ReadVarVal",varname$,buffer%,size%,0,-3*(expand=
  4687.  ,,nr_bytes,nameptr%,type%
  4688.  loop%=0 
  4689.  nr_bytes-1
  4690. $  value$=value$+
  4691. (buffer%?loop%)
  4692.  loop%
  4693. =value$
  4694. *|Stop FNshell_OSVarGetVal
  4695. $*|Start FNshell_OSReadCommandArg
  4696. shell_OSReadCommandArg(opt)
  4697.  pointer%,command$,offset%
  4698. command$="":offset%=0
  4699.  "OS_GetEnv" 
  4700.  pointer%
  4701.  pointer%?offset%<>0
  4702. #  command$+=
  4703. (pointer%?offset%)
  4704.   offset%+=1
  4705.  opt 
  4706. ,    command$=
  4707. command$,
  4708. command$,
  4709. 34)+1)
  4710. ,    command$=
  4711. command$,
  4712. command$,
  4713. 34)+2)
  4714. =command$
  4715. #*|Stop FNshell_OSReadCommandArg
  4716. '*|Start FNshell_StringStripTrailing
  4717. shell_StringStripTrailing(string$,char$)
  4718. string$,1) = char$
  4719. (  string$ = 
  4720. string$,
  4721. (string$) - 1)
  4722. = string$
  4723.     &*|Stop FNshell_StringStripTrailing
  4724. &*|Start FNshell_StringStripLeading
  4725. shell_StringStripLeading(string$,char$)
  4726. string$,1) = char$
  4727.   string$ = 
  4728. string$,2)
  4729. = string$
  4730. %*|Stop FNshell_StringStripLeading
  4731. "*|Start FNshell_StringStripAll
  4732. shell_StringStripAll(string$,char$)
  4733.  done,pos
  4734. done=
  4735.   pos=
  4736. string$,char$)
  4737.  pos 
  4738.     done=
  4739. /    string$=
  4740. string$,pos-1)+
  4741. string$,pos+1)
  4742.     done=
  4743.  done
  4744. =string$
  4745. !!*|Stop FNshell_StringStripAll
  4746. #%*|Start FNshell_StringPadTrailing
  4747. shell_StringPadTrailing(string$,char$,length%)
  4748. (string$) < length%
  4749. &6  string$ = string$ + 
  4750. length% - 
  4751. (string$),char$)
  4752. = string$
  4753. *$*|Stop FNshell_StringPadTrailing
  4754. ,$*|Start FNshell_StringPadLeading
  4755. shell_StringPadLeading(string$,char$,length%)
  4756. (string$) < length%
  4757. /6  string$ = 
  4758. length% - 
  4759. (string$),char$) + string$
  4760. = string$
  4761. 3#*|Stop FNshell_StringPadLeading
  4762. 5#*|Start FNshell_StringUpperCase
  4763. shell_StringUpperCase(string$)
  4764.  loop%
  4765. (string$) > 0 
  4766.  loop% = 1 
  4767. (string$)
  4768. ::   
  4769. string$,loop%,1)>="a" 
  4770. string$,loop%,1)<="z" 
  4771. ;:     
  4772. string$,loop%,1) = 
  4773. string$,loop%,1)) 
  4774.  &DF)
  4775.  loop%
  4776. = string$
  4777. A"*|Stop FNshell_StringUpperCase
  4778. C"*|Start FNshell_StringExchange
  4779. shell_StringExchange(string$,target$,sub$)
  4780.  index%
  4781. string$,target$) 
  4782.   index%=
  4783. string$,target$)
  4784. H?  string$=
  4785. string$,index%-1)+sub$+
  4786. string$,index%+
  4787. target$)
  4788. =string$
  4789. L!*|Stop FNshell_StringExchange
  4790. M)*|Start FNshell_StringArrayGetLongest
  4791. shell_StringArrayGetLongest(array$(),nr%)
  4792.  loop%,longest%
  4793. longest% = 0
  4794.  loop% = 0 
  4795. (array$(loop%)) > longest% 
  4796. S#    longest% = 
  4797. (array$(loop%))
  4798.  loop%
  4799. = longest%
  4800. X(*|Stop FNshell_StringArrayGetLongest
  4801. *|Start FNmem_to_string
  4802. mem_to_string(block%,offset%,term%)
  4803.  string$
  4804.  block%?offset%<>term%
  4805. ]   string$+=
  4806. (block%?offset%)
  4807.   offset%+=1
  4808. =string$
  4809. *|Stop FNmem_to_string
  4810. *|Start FNshell_FileLength
  4811. shell_FileLength(object$)
  4812.  type%,load_addr%,exec_addr%,length%,atts%,string$
  4813.  "OS_File",5,object$ 
  4814.  type%,,load_addr%,exec_addr%,length%,atts%
  4815. =length%
  4816. *|Stop FNshell_FileLength
  4817. *|Start PROCshell_TraceOn
  4818. shell_TraceOn
  4819. _U%!48=
  4820. shell_BroadcastMessage(&43B00,"ShellDBug:TraceOn")
  4821. *|Stop PROCshell_TraceOn
  4822. *|Start PROCshell_TraceOff
  4823. shell_TraceOff
  4824. _U%!48=
  4825. shell_BroadcastMessage(&43B00,"ShellDBug:TraceOff")
  4826. *|Stop PROCshell_TraceOff
  4827. *|Start PROCshell_TraceInit
  4828. *|Define TraceInit
  4829. shell_TraceInit(file$)
  4830.  f%,blk%,shell_AppName$,shell_AppDir$
  4831.  file$<>"" 
  4832.   f%=
  4833. (file$)
  4834.   _U%!44=f%
  4835. #blk%=
  4836. shell_HeapBlockFetch(256)
  4837. ;shell_AppDir$=
  4838. shell_OSVarGetVal(blk%,256,"Obey$Dir",1)
  4839. 1shell_AppName$=
  4840. shell_Leaf(shell_AppDir$),2)
  4841. shell_BroadcastMessage(&43B00,"ShellDBug:Init Debug messages from "+shell_AppName$)
  4842. shell_HeapBlockReturn(blk%)
  4843.  set bit 4 of shell flag word. If ShellDBug start up is detected then
  4844.  send init message again (ShellDBug was started after this task). Clear
  4845.  bit when ShellDBug sends its ack message.
  4846.  _U%!100 
  4847.  1<<4 
  4848.   _U%!100=(_U%!100 
  4849.  1<<4)
  4850. *|Stop PROCshell_TraceInit
  4851. *|Start FNshell_TraceIsOn
  4852. shell_TraceIsOn
  4853. =_U%!48
  4854. *|Stop FNshell_TraceIsOn
  4855. *|Start PROCshell_Tracef0
  4856. shell_Tracef0(a$)
  4857. shell_TraceIsOn) 
  4858.  _U%!44<>-1 
  4859.   f%=_U%!44
  4860. #f%,a$
  4861.  check if task id has been set up...
  4862.  _U%!148>0 
  4863. shell_BroadcastMessage(&43B00,"ShellDBug:Trace "+a$)
  4864.  PROCshell_EnsurePoll
  4865. *|Stop PROCshell_Tracef0
  4866. *|Start PROCshell_Tracef2
  4867. shell_Tracef2(addr%)
  4868. ("MEDIT "+
  4869. ~addr%)
  4870. *|Stop PROCshell_Tracef2
  4871. *|Start PROCshell_TraceExit
  4872. shell_TraceExit
  4873.  _U%!44<>-1 
  4874. #(_U%!44):_U%!44=-1
  4875.  _U%!44=-1:_U%!48=FALSE
  4876. *|Stop PROCshell_TraceExit
  4877. "*|Start PROCshell_AttachHotKey
  4878. shell_AttachHotKey(key$,shift%,ctrl%,alt%,window$,wh%,fn1$,fn2$)
  4879.  e_list%,offset%,temp%,temp2%,key%,f_key%
  4880. f_key%=
  4881.  _U%!60=0 
  4882. &  _U%!60=
  4883. shell_HeapBlockFetch(24)
  4884.   offset%=0:_U%!180=1
  4885.   offset%=_U%!180*24
  4886. .  _U%!60=
  4887. shell_HeapBlockExtend(_U%!60,24)
  4888.   _U%!180=(_U%!180)+1
  4889. e_list%=_U%!60
  4890.  key$ 
  4891.  "F1" :key%=385
  4892.  "F2" :key%=386
  4893.  "F3" :key%=387
  4894.  "F4" :key%=388
  4895.  "F5" :key%=389
  4896.  "F6" :key%=390
  4897.  "F7" :key%=391
  4898.  "F8" :key%=392
  4899.  "F9" :key%=393
  4900.  "F10":key%=458
  4901.  "F11":key%=459
  4902.   key%=(
  4903. key$)-64:f_key%=
  4904.  f_key% 
  4905.  shift% 
  4906.  key%+=16
  4907.  ctrl%  
  4908.  key%+=32
  4909. temp%=e_list%+offset%
  4910. temp%!0=key%
  4911. temp%?4=shift%:
  4912.  shift flag
  4913. temp%?5=ctrl% :
  4914.  ctrl  flag
  4915. temp%?6=alt%  :
  4916.  alt   flag
  4917. -temp%!8=
  4918. shell_HeapBlockFetch(
  4919. window$+1)
  4920. "temp2%=temp%!8:$temp2%=window$
  4921.  wh%>0 
  4922.  check window handle is in static list...
  4923. .  offset%=
  4924. shell_SearchStatic(_U%!184,wh%)
  4925.  offset%=-1 
  4926. shell_MessageNoArgs("SHELLMSG09")
  4927. ?temp%!12=wh%:
  4928.  >0 denotes a window handle to open as static
  4929. +temp%!16=
  4930. shell_HeapBlockFetch(
  4931. fn1$+1)
  4932.  temp2%=temp%!16:$temp2%=fn1$
  4933. +temp%!20=
  4934. shell_HeapBlockFetch(
  4935. fn2$+1)
  4936.  temp2%=temp%!20:$temp2%=fn2$
  4937. !*|Stop PROCshell_AttachHotKey
  4938. !*|Start FNshell_HotKeyProcess
  4939. shell_HotKeyProcess(key%)
  4940.  e_list%,list_size%,found%,ptr%,h%,win$,fn1$,fn2$
  4941.  ctrl%,shift%,alt%,x_off%,y_off%,flag%,key_flags%,offset%
  4942.  result%,win_blk%
  4943. e_list%=_U%!60
  4944. list_size%=_U%!180*24
  4945. found%=
  4946. :ptr%=0
  4947.  e_list%!ptr%=key% 
  4948.     found%=
  4949.     ptr%+=24
  4950.  found% 
  4951.  ptr%>=list_size%
  4952.  found% 
  4953.   temp%=e_list%+ptr%
  4954.   win$=$(temp%!8)
  4955. *|ifdef TraceInit
  4956. shell_Tracef0("HotKeyProcess:Template name is '"+win$+"'")
  4957. *|endif
  4958.  (win$<>"" 
  4959.  temp%!12=0) 
  4960. 5    
  4961.  only create a window if it is a dynamic one
  4962. 2    
  4963.  static windows have already been created
  4964. $    
  4965. shell_CreateWindow(win$,h%)
  4966. *|ifdef TraceInit
  4967. Y    
  4968. shell_Tracef0("HotKeyProcess:Creating new dynamic window (handle is &"+
  4969. ~h%+")")
  4970. *|endif
  4971. *    win_blk%=
  4972. shell_HeapBlockFetch(36)
  4973.     win_blk%!0=h%
  4974. *    
  4975.  "Wimp_GetWindowState",,win_blk%
  4976. )    x_off%=(win_blk%!4-win_blk%!12)/2
  4977. )    y_off%=(win_blk%!16-win_blk%!8)/2
  4978. (    
  4979. shell_HeapBlockReturn(win_blk%)
  4980.   fn1$=$(temp%!16)
  4981.  fn1$<>"" 
  4982. *|ifdef TraceInit
  4983. F    
  4984. shell_Tracef0("HotKeyProcess:Calling Pre-Open FN '"+fn1$+"'")
  4985. *|endif
  4986.  temp%!12>0 
  4987. .      void%=
  4988. ("FN"+fn1$+"("+
  4989. temp%!12+")")
  4990.         
  4991. (      void%=
  4992. ("FN"+fn1$+"("+
  4993. h%+")")
  4994.         
  4995. *|ifdef TraceInit
  4996. shell_Tracef0("HotKeyProcess:No Pre-Open FN registered")
  4997. *|endif
  4998. 5    offset%=
  4999. shell_SearchStatic(_U%!184,temp%!12)
  5000.  offset%>-1 
  5001.  +      
  5002. shell_OpenWindowStatic(temp%!12)
  5003. !        
  5004.       
  5005.  temp%!12>0 
  5006. #@        
  5007.  request to open a static window, but window handle
  5008. $C        
  5009.  has not been registered with shell_CreateWindowStatic
  5010. %3        
  5011. shell_MessageNoArgs("SHELLMSG09")
  5012.       
  5013. '.        
  5014.  must be a dynamic window then...
  5015. (6        
  5016. shell_OpenWindowDynamic(h%,x_off%,y_off%)
  5017.       
  5018. *        
  5019.   fn2$=$(temp%!20)
  5020.  fn2$<>"" 
  5021. *|ifdef TraceInit
  5022. .G    
  5023. shell_Tracef0("HotKeyProcess:Calling Post-Open FN '"+fn2$+"'")
  5024. *|endif
  5025.  temp%!12>0 
  5026. 1.      void%=
  5027. ("FN"+fn1$+"("+
  5028. temp%!12+")")
  5029. 2        
  5030. 3(      void%=
  5031. ("FN"+fn2$+"("+
  5032. h%+")")
  5033. 4        
  5034. *|ifdef TraceInit
  5035. 7B    
  5036. shell_Tracef0("HotKeyProcess:No Post-Open FN registered")
  5037. *|endif
  5038.   result%=
  5039. <'  win$="":fn1$="":fn2$="":result%=
  5040. =result%
  5041. @ *|Stop FNshell_HotKeyProcess
  5042. B+*|Start PROCshell_WindowCentreOnPointer
  5043. shell_WindowCentreOnPointer(h%)
  5044.  w_blk%,p_blk%,x_off%,y_off%
  5045. E(p_blk%   = 
  5046. shell_HeapBlockFetch(20)
  5047.  "Wimp_GetPointerInfo",,p_blk%
  5048. G(win_blk% = 
  5049. shell_HeapBlockFetch(36)
  5050. win_blk%!0 = h%
  5051.  "Wimp_GetWindowState",,win_blk%
  5052. J,x_off% = (win_blk%!04 - win_blk%!12) / 2
  5053. K,y_off% = (win_blk%!16 - win_blk%!08) / 2
  5054. shell_WindowMoveTo(h%,p_blk%!0 + x_off%,p_blk%!4 - y_off%)
  5055. shell_HeapBlockReturn(win_blk%)
  5056. shell_HeapBlockReturn(p_blk%)
  5057. Q**|Stop PROCshell_WindowCentreOnPointer
  5058. S**|Start PROCshell_WindowCentreOnScreen
  5059. shell_WindowCentreOnScreen(h%)
  5060.  w_blk%,scrn_xmax%,scrn_ymax%,width%,height%,XEigFactor%,YEigFactor%
  5061.  "XOS_ReadModeVariable",-1,04 
  5062.  ,,XEigFactor%
  5063.  "XOS_ReadModeVariable",-1,05 
  5064.  ,,YEigFactor%
  5065.  "XOS_ReadModeVariable",-1,11 
  5066.  ,,scrn_xmax%
  5067.  "XOS_ReadModeVariable",-1,12 
  5068.  ,,scrn_ymax%
  5069. ZNscrn_xmax% = scrn_xmax% << XEigFactor%:
  5070.  Convert pixels to screen coords..
  5071. [Nscrn_ymax% = scrn_ymax% << YEigFactor%:
  5072.  Convert pixels to screen coords..
  5073. \*win_blk%   = 
  5074. shell_HeapBlockFetch(36)
  5075. win_blk%!0 = h%
  5076.  "Wimp_GetWindowState",,win_blk%
  5077. _)width%  = (win_blk%!12 - win_blk%!04)
  5078. `)height% = (win_blk%!16 - win_blk%!08)
  5079. shell_WindowMoveTo(h%,(scrn_xmax% / 2) - (width% / 2),(scrn_ymax% - height%) / 2)
  5080. shell_HeapBlockReturn(win_blk%)
  5081. e)*|Stop PROCshell_WindowCentreOnScreen
  5082. g-*|Start PROCshell_OpenWindowStaticNewView
  5083. shell_OpenWindowStaticNewView(wh%)
  5084. shell_OpenWindow(wh%,
  5085. l,*|Stop PROCshell_OpenWindowStaticNewView
  5086. n&*|Start PROCshell_OpenWindowStatic
  5087. shell_OpenWindowStatic(handle%)
  5088. shell_SearchStatic(_U%!184,handle%) > -1 
  5089. shell_OpenWindow(handle%,0,-1)
  5090.  ERROR 99,FNshell_MessageNoArgs("SHELLMSG09")
  5091. w%*|Stop PROCshell_OpenWindowStatic
  5092. y *|Start FNshell_SearchStatic
  5093. shell_SearchStatic(w_list%,handle%)
  5094.  search static window list by window handle
  5095.  found%,ctr%
  5096. found% = -1:ctr% = 0
  5097.  PROCshell_Tracef0("DEBUG::old handle = &"+STR$~handle%)
  5098.  w_list%<>0 
  5099.  w_list%!ctr% <> -1
  5100. Q    
  5101.  PROCshell_Tracef0("DEBUG::searching.. handle is &"+STR$~(w_list%!ctr%))
  5102. "    
  5103.  w_list%!ctr% = handle% 
  5104.       found% = ctr%
  5105. 0      
  5106.  PROCshell_Tracef0("DEBUG::found...")
  5107.       = found%
  5108.         
  5109.     ctr% += 4
  5110. =found%
  5111. *|Stop FNshell_SearchStatic
  5112. (*|Start PROCshell_CreateWindowStatic
  5113. shell_CreateWindowStatic(ident$,
  5114.  handle%)
  5115.  wb_ptr%,w_list%,temp%,offset%
  5116.  wb_ptr%=
  5117. shell_GetWB(ident$)
  5118.  set 'sprite area' pointer to usersprites area
  5119. wb_ptr%!64=_U%!16
  5120.  "Wimp_CreateWindow",,wb_ptr% 
  5121.  handle%
  5122. w_list%=_U%!184
  5123.  w_list%=0 
  5124.  empty list
  5125. *|ifdef TraceInit
  5126. shell_Tracef0("CreateWindowStatic:Empty List")
  5127. *|endif
  5128. &  _U%!184=
  5129. shell_HeapBlockFetch(8)
  5130.   w_list%=_U%!184
  5131. $  w_list%!0=handle%:w_list%!4=-1
  5132.  search list for window handle
  5133. *|ifdef TraceInit
  5134. shell_Tracef0("CreateWindowStatic:Searching for window handle")
  5135. *|endif
  5136. 2  offset%=
  5137. shell_SearchStatic(_U%!184,handle%)
  5138.  offset%=-1 
  5139. *    
  5140.  add window handle to static list
  5141. *|ifdef TraceInit
  5142. shell_Tracef0("CreateWindowStatic:Not found - adding window handle to list")
  5143. *|endif
  5144. .    offset%=
  5145. shell_SearchStatic(_U%!184,0)
  5146.  offset%=-1 
  5147. *|ifdef TraceInit
  5148. shell_Tracef0("CreateWindowStatic:Extending window handle list")
  5149. *|endif
  5150.       ctr%=0
  5151.       
  5152.  w_list%!ctr%<>-1
  5153.         ctr%+=4
  5154.       
  5155. 3      _U%!184=
  5156. shell_HeapBlockExtend(_U%!184,4)
  5157.       w_list%=_U%!184
  5158.         
  5159. *|ifdef TraceInit
  5160. shell_Tracef0("CreateWindowStatic:Found unused space in list")
  5161. *|endif
  5162.       ctr%=offset%
  5163.         
  5164.     temp%=w_list%+ctr%
  5165. "    temp%!0=handle%:temp%!4=-1
  5166. '*|Stop PROCshell_CreateWindowStatic
  5167. $*|Start PROCshell_InitHelpSystem
  5168. shell_InitHelpSystem(path$,die%)
  5169.  tail$,pos%,OSVarBuff%,respath$,help_found%,abort%
  5170. <_U%!212=0:
  5171.  _U%!216<>0 
  5172. shell_HeapBlockReturn(_U%!216)
  5173. /_U%!216=0:
  5174.  clear pending command buffer...
  5175. shell_ScanForHelp:
  5176.  check if StrongHlp is running...
  5177.  die% 
  5178.  tail$=" -DieWithTask" 
  5179.  tail$=""
  5180. *|ifdef Using_ResFind
  5181.  _U%!100 
  5182.  1<<3 
  5183.  ResFind initialised, check ResPath..
  5184.   path$=""
  5185. +  OSVarBuff%=
  5186. shell_HeapBlockFetch(256)
  5187. Q  respath$=
  5188. shell_OSVarGetVal(OSVarBuff%,256,
  5189. shell_GetAppName+"Res$Path",-1)
  5190. shell_HeapBlockReturn(OSVarBuff%)
  5191.     pos%=
  5192. respath$,",")
  5193.  pos%>0 
  5194. D      
  5195. shell_FileExists(
  5196. respath$,pos%-1)+
  5197. shell_GetAppName) 
  5198. 5        path$=
  5199. respath$,pos%-1)+
  5200. shell_GetAppName
  5201.         help_found%=
  5202.       
  5203. &        respath$=
  5204. respath$,pos%+1)
  5205.       
  5206.         
  5207. ;      
  5208. shell_FileExists(respath$+
  5209. shell_GetAppName) 
  5210. ,        path$=respath$+
  5211. shell_GetAppName
  5212.         help_found%=
  5213.       
  5214.         abort%=
  5215. K        
  5216. shell_OK(
  5217. shell_MessageOneArg("SHELLMSG26",
  5218. shell_GetAppName))
  5219.       
  5220.         
  5221.  path$<>"" 
  5222.  help_found% 
  5223.  abort%
  5224. *|endif
  5225.  abort%=0 
  5226. shell_StrongHlpMsg("Help_Install "+path$+tail$)
  5227. #*|Stop PROCshell_InitHelpSystem
  5228. *|Start PROCshell_HelpWord
  5229. shell_HelpWord(word$)
  5230.  read%,temp%,buff%
  5231. $buff%=
  5232. shell_HeapBlockFetch(512)
  5233.  _U%!208 = -1 
  5234.   StrongHelp is not loaded. Try to run it..
  5235. shell_OSVarExists(buff%,"StrongHelp$Dir") 
  5236. 8    
  5237.  Variable exists, so attempt to run StrongHlp..
  5238. /    
  5239.  "XWimp_StartTask","<StrongHelp$Dir>"
  5240. 6    
  5241.  _U%!216<>0 
  5242. shell_HeapBlockReturn(_U%!216)
  5243. /    _U%!216=
  5244. shell_HeapBlockFetch(
  5245. word$+1)
  5246.     temp%=_U%!216
  5247.     $temp%=word$
  5248. A    
  5249.  It doesn't, so complain, but first release buffer as an
  5250. *    
  5251.  error is about to be generated..
  5252. %    
  5253. shell_HeapBlockReturn(buff%)
  5254. 5    
  5255. shell_OK(
  5256. shell_MessageNoArgs("SHELLMSG11"))
  5257. shell_StrongHlpMsg("Help_Word "+word$)
  5258. shell_HeapBlockReturn(buff%)
  5259. *|Stop PROCshell_HelpWord
  5260. "*|Start PROCshell_StrongHlpMsg
  5261. shell_StrongHlpMsg(msg$)
  5262. shell_BroadcastMessage(&43B00,msg$)
  5263.     !*|Stop PROCshell_StrongHlpMsg
  5264. !*|Start PROCshell_ScanForHelp
  5265. shell_ScanForHelp
  5266.  wrk%,owner_taskhandle%
  5267. 8wrk%=
  5268. shell_HeapBlockFetch(256):
  5269.  block for messages
  5270.   Finds out if StrongHelp is already running.
  5271.   Does this by scanning the tasks installed on the iconbar..
  5272.   This again is done by getting the task's handle, and sending a
  5273.   sending a TaskNameRq to the taskhandler. When this returns
  5274.   (as a TaskNameIs message) we compare the string with "StrongHelp".
  5275.   If not equal, this routine is called again to check next icon..
  5276.   This Wimp_SendMessage does *not* send a message to the owner of
  5277.   the icon. It merely returns the taskhandle of the owner.
  5278.   wrk%!12 = 0
  5279.  "Wimp_SendMessage",19,wrk%,-2,_U%!212 
  5280.  ,,owner_taskhandle%
  5281. "  _U%!212=_U%!212+1:
  5282.  icontry%
  5283.  owner_taskhandle% <> -1 
  5284.  (_U%!212) > 64
  5285.  owner_taskhandle% <> -1 
  5286.  Send request for name of this task.
  5287.   wrk%!0  = 24
  5288.   wrk%!12 = 0
  5289.   wrk%!16 = &400C6
  5290. "!  wrk%!20 = owner_taskhandle%
  5291.  "Wimp_SendMessage",17,wrk%,0
  5292. shell_HeapBlockReturn(wrk%)
  5293. ( *|Stop PROCshell_ScanForHelp
  5294. *&*|Start PROCshell_BroadcastMessage
  5295. shell_BroadcastMessage(reason_code%,msg$)
  5296.  m_blk%,m_len%
  5297. m_len% = (
  5298. msg$ + 30) 
  5299. .*m_blk% = 
  5300. shell_HeapBlockFetch(m_len%)
  5301. m_blk%!12 = 0
  5302. m_blk%!16 = reason_code%
  5303. 1 $(m_blk% + 20) = msg$ + 
  5304. m_blk%!0 = m_len%
  5305.  use XSWI in case error occurs between trace init call and wimp init
  5306.  call - can't broadcast unless we have launched the wimp task..
  5307.  "XWimp_SendMessage",17,m_blk%,0:
  5308.  broadcast message
  5309. shell_HeapBlockReturn(m_blk%)
  5310. 9%*|Stop PROCshell_BroadcastMessage
  5311. ;**|Start PROCshell_WindowToggleBackIcon
  5312. shell_WindowToggleBackIcon(
  5313.  wh%)
  5314. shell_WindowToggleFlags(wh%,1<<24)
  5315. @)*|Stop PROCshell_WindowToggleBackIcon
  5316. A+*|Start PROCshell_WindowToggleCloseIcon
  5317. shell_WindowToggleCloseIcon(
  5318.  wh%)
  5319. shell_WindowToggleFlags(wh%,1<<25)
  5320. F**|Stop PROCshell_WindowToggleCloseIcon
  5321. G**|Start PROCshell_WindowToggleTitleBar
  5322. shell_WindowToggleTitleBar(
  5323.  wh%)
  5324. shell_WindowToggleFlags(wh%,1<<26)
  5325. L)*|Stop PROCshell_WindowToggleTitleBar
  5326. M,*|Start PROCshell_WindowToggleToggleIcon
  5327. shell_WindowToggleToggleIcon(
  5328.  wh%)
  5329. shell_WindowToggleFlags(wh%,1<<27)
  5330. R+*|Stop PROCshell_WindowToggleToggleIcon
  5331. S,*|Start PROCshell_WindowToggleHScrollBar
  5332. shell_WindowToggleHScrollBar(
  5333.  wh%)
  5334. shell_WindowToggleFlags(wh%,1<<30)
  5335. X+*|Stop PROCshell_WindowToggleHScrollBar
  5336. Y0*|Start PROCshell_WindowToggleAdjustSizeIcon
  5337. shell_WindowToggleAdjustSizeIcon(
  5338.  wh%)
  5339. shell_WindowToggleFlags(wh%,1<<29)
  5340. ^/*|Stop PROCshell_WindowToggleAdjustSizeIcon
  5341. _,*|Start PROCshell_WindowToggleVScrollBar
  5342. shell_WindowToggleVScrollBar(
  5343.  wh%)
  5344. shell_WindowToggleFlags(wh%,1<<28)
  5345. d+*|Stop PROCshell_WindowToggleVScrollBar
  5346. f'*|Start PROCshell_WindowToggleFlags
  5347. shell_WindowToggleFlags(
  5348.  wh%,mask%)
  5349.  blk%,flags%,open%,handle%
  5350. *|ifdef TraceInit
  5351. shell_Tracef0("WindowToggleFlags:wh%=&"+
  5352. ~wh%)
  5353. *|endif
  5354. l"open%=
  5355. shell_WindowIsOpen(wh%)
  5356. m$blk%=
  5357. shell_HeapBlockFetch(6000)
  5358. blk%!0=wh%
  5359.  "Wimp_GetWindowInfo",,blk%
  5360. flags%=blk%!32
  5361. flags%=(flags% 
  5362.  mask%)
  5363. blk%!32=flags%
  5364.  "Wimp_DeleteWindow",,blk%
  5365.  "Wimp_CreateWindow",,blk%+4 
  5366.  handle%
  5367. !blk%=handle%
  5368.  open% 
  5369.  If window was open, open it again..
  5370.  "Wimp_OpenWindow",,blk%
  5371. shell_HeapBlockReturn(blk%)
  5372.  handle%<>wh% 
  5373. shell_UpdateWindowHandle(wh%,handle%)
  5374.   wh%=handle%
  5375. &*|Stop PROCshell_WindowToggleFlags
  5376. %*|Start PROCshell_ListClickSelect
  5377. shell_ListClickSelect
  5378.  e_list%,ptr%,list_size%,temp%,temp2%
  5379. e_list%=_U%!12
  5380. ,list_size%=
  5381. shell_HeapBlockInfo(e_list%)
  5382. *|ifdef TraceInit
  5383. shell_Tracef0(" ")
  5384. shell_Tracef0("List of ClickSelect events:")
  5385. *|endif
  5386. ptr%=0
  5387. 1  temp%=e_list%!(ptr%+20):temp2%=e_list%+ptr%
  5388. shell_HeapBlockExists(temp%) 
  5389.  $temp%<>"" 
  5390. *|ifdef TraceInit
  5391. shell_Tracef0("&"+
  5392. shell_StringPadTrailing(
  5393. ~temp2%!0," ",8)+" &"+
  5394. shell_StringPadTrailing(
  5395. ~temp2%!4," ",8)+"   "+$temp%)
  5396. *|endif
  5397.         
  5398.   ptr%+=48
  5399.  (ptr%>=list_size%)
  5400. *|ifdef TraceInit
  5401. shell_Tracef0(" ")
  5402. *|endif
  5403. $*|Stop PROCshell_ListClickSelect
  5404. %*|Start PROCshell_ListClickAdjust
  5405. shell_ListClickAdjust
  5406.  e_list%,ptr%,list_size%,temp%,temp2%
  5407. e_list%=_U%!12
  5408. ,list_size%=
  5409. shell_HeapBlockInfo(e_list%)
  5410. *|ifdef TraceInit
  5411. shell_Tracef0(" ")
  5412. shell_Tracef0("List of ClickAdjust events:")
  5413. *|endif
  5414. ptr%=0
  5415. 1  temp%=e_list%!(ptr%+24):temp2%=e_list%+ptr%
  5416. shell_HeapBlockExists(temp%) 
  5417.  $temp%<>"" 
  5418. *|ifdef TraceInit
  5419. shell_Tracef0("&"+
  5420. shell_StringPadTrailing(
  5421. ~temp2%!0," ",8)+" &"+
  5422. shell_StringPadTrailing(
  5423. ~temp2%!4," ",8)+"   "+$temp%)
  5424. *|endif
  5425.         
  5426.   ptr%+=48
  5427.  (ptr%>=list_size%)
  5428. *|ifdef TraceInit
  5429. shell_Tracef0(" ")
  5430. *|endif
  5431. $*|Stop PROCshell_ListClickAdjust
  5432. "*|Start PROCshell_ListHelpTags
  5433. shell_ListHelpTags
  5434.  e_list%,ptr%,list_size%,temp%,temp2%
  5435. e_list%=_U%!12
  5436. ,list_size%=
  5437. shell_HeapBlockInfo(e_list%)
  5438. *|ifdef TraceInit
  5439. shell_Tracef0(" ")
  5440. shell_Tracef0("List of attached help tags:")
  5441. *|endif
  5442. ptr%=0
  5443. 1  temp%=e_list%!(ptr%+44):temp2%=e_list%+ptr%
  5444. shell_HeapBlockExists(temp%) 
  5445.  $temp%<>"" 
  5446. *|ifdef TraceInit
  5447. shell_Tracef0("&"+
  5448. shell_StringPadTrailing(
  5449. ~temp2%!0," ",8)+" &"+
  5450. shell_StringPadTrailing(
  5451. ~temp2%!4," ",8)+"   "+$temp%)
  5452. *|endif
  5453.         
  5454.   ptr%+=48
  5455.  (ptr%>=list_size%)
  5456. *|ifdef TraceInit
  5457. shell_Tracef0(" ")
  5458. *|endif
  5459. !*|Stop PROCshell_ListHelpTags
  5460. *|Start PROCshell_MemFill
  5461. shell_MemFill(start%,nr_bytes%,value%)
  5462.  I%,nr_words%,remainder%
  5463. nr_words%=nr_bytes% 
  5464. remainder%=nr_bytes% 
  5465.  nr_words%>0 
  5466.  I%=1 
  5467.  (nr_words%*4) 
  5468.     start%!(I%-1)=value%
  5469.  remainder%>0 
  5470. !  start%=start%+(nr_words%*4)
  5471.  I%=0 
  5472.  remainder%-1
  5473.     start%?I%=value%
  5474. *|Stop PROCshell_MemFill
  5475. $*|Start PROCshell_AttachFontMenu
  5476. *|Define Using_FontMenu
  5477. shell_AttachFontMenu(wh%,ih%,sel_fn$,maker_fn$)
  5478.  menu%
  5479. shell_FontMenuInit
  5480.  "FontMenu_Select",""+
  5481. 0,_U%!260 
  5482.  ,menu%
  5483.  Store menu ptr in shell memory..
  5484. _U%!252=menu%
  5485. shell_EventAdd(wh%,ih%,0,-2,sel_fn$)
  5486. *|ifdef PROCshell_TraceInit
  5487. shell_Tracef0("AttachFontMenu:Attaching font menu")
  5488. *|endif
  5489.  maker_fn$<>"" 
  5490. shell_AttachMenuMaker(wh%,ih%,maker_fn$)
  5491. #*|Stop PROCshell_AttachFontMenu
  5492. '*|Start PROCshell_AttachFontSubMenu
  5493. *|Define Using_FontMenu
  5494. shell_AttachFontSubMenu(item%,warn_fn$,sel_fn$)
  5495.  itemstart%,menu%,temp%,ctr%
  5496. shell_FontMenuInit
  5497.  "FontMenu_Select",""+
  5498. 0,_U%!260 
  5499.  ,menu%
  5500.  "MenuUtil_SubMenu",item%,menu%
  5501.  "MenuUtil_Warning",,
  5502.  Store menu ptr in shell memory..
  5503. _U%!252=menu%
  5504. shell_EventListMenuWarn(item%,menu%,warn_fn$,sel_fn$)
  5505. *|ifdef PROCshell_TraceInit
  5506. shell_Tracef0("AttachFontSubMenu:Attaching font menu &"+
  5507. ~menu%)
  5508. *|endif
  5509.     &*|Stop PROCshell_AttachFontSubMenu
  5510. "*|Start PROCshell_FontMenuInit
  5511. shell_FontMenuInit
  5512.  ("RMEnsure FontMenu 1.16 RMLoad <EvntShellSystem$Path>FontMenu")
  5513.  ("RMEnsure FontMenu 1.16 Error Couldn't load FontMenu module")
  5514.  _U%!240=-1 
  5515.  The above flag ensures that the library knows that "FontMenu_Create"
  5516.  has been called. It should only be called once in a program as it
  5517.  registers the program as a FontMenu module user..
  5518.  "FontMenu_Create" 
  5519.  _U%!240
  5520. shell_FontMenuSelectFont("",
  5521. !*|Stop PROCshell_FontMenuInit
  5522. (*|Start PROCshell_FontMenuSelectFont
  5523. shell_FontMenuSelectFont(fontname$,systemfont%)
  5524.  temp%,f_menu%
  5525. shell_HeapBlockExists(_U%!244) 
  5526. shell_HeapBlockReturn(_U%!244)
  5527. /_U%!244=
  5528. shell_HeapBlockFetch(
  5529. fontname$+1)
  5530. "temp%=_U%!244:$temp%=fontname$
  5531.  systemfont%<>0 
  5532.  systemfont%=1
  5533. _U%!260=systemfont%
  5534.  "FontMenu_Select",fontname$,_U%!260 
  5535.  ,f_menu%
  5536.  f_menu%<>_U%!252 
  5537.  FontMenu ptr has changed..
  5538. shell_FontMenuUpdatePtr(f_menu%)
  5539.   _U%!252=f_menu%
  5540. *|ifdef TraceInit
  5541. shell_Tracef0("FontMenuSelectFont:Font is '"+fontname$+"'")
  5542. *|endif
  5543. ,'*|Stop PROCshell_FontMenuSelectFont
  5544. -/*|Start FNshell_FontMenuGetLastSelectedFont
  5545. shell_FontMenuGetLastSelectedFont
  5546.  temp%
  5547. shell_HeapBlockExists(_U%!244) 
  5548.   =""
  5549. temp%=_U%!244:=$temp%
  5550. 3.*|Stop FNshell_FontMenuGetLastSelectedFont
  5551. 5'*|Start PROCshell_FontMenuUpdatePtr
  5552. shell_FontMenuUpdatePtr(ptr%)
  5553.  e_list%,ctr%
  5554. *|ifdef TraceInit
  5555. shell_Tracef0("FontMenuUpdatePtr:Started..")
  5556. *|endif
  5557. shell_HeapBlockExists(_U%!220) 
  5558. *|ifdef TraceInit
  5559. shell_Tracef0("FontMenuUpdatePtr:HeapBlock found..")
  5560. *|endif
  5561.   e_list%=_U%!220:ctr%=0
  5562. *|ifdef TraceInit
  5563. shell_Tracef0("FontMenuUpdatePtr:Substituting ptr..")
  5564. *|endif
  5565.     e_list%!(ctr%+8)=ptr%
  5566.     ctr%+=12
  5567.  e_list%!ctr%=-1
  5568. J&*|Stop PROCshell_FontMenuUpdatePtr
  5569. L&*|Start PROCshell_MenuUpdateHandle
  5570. shell_MenuUpdateHandle(old_h%,new_h%)
  5571.  list_size%,ptr%,event_list%,menu%
  5572. O-list_size%=
  5573. shell_HeapBlockInfo(_U%!12)-8
  5574. ptr%=0
  5575. found%=
  5576. event_list%=_U%!12
  5577. T"  menu%=event_list%!(ptr% + 8)
  5578.  menu% = old_h% 
  5579.  event_list%!(ptr% + 8) = new_h%
  5580.   ptr%+=48
  5581.  (ptr% >= list_size%)
  5582.  _U%!24 = old_h% 
  5583.  _U%!24 = new_h%
  5584. Z%*|Stop PROCshell_MenuUpdateHandle
  5585. *|Start PROCshell_FindFont
  5586. shell_FindFont(
  5587.  font$,x_pt%,y_pt%,
  5588.  font_handle%)
  5589. shell_FontIsAvailable(font$,x_pt%,y_pt%) 
  5590.   font$="Trinity.Medium"
  5591.  "Font_FindFont",,font$,x_pt%*16,y_pt%*16,0,0 
  5592.  font_handle%
  5593. *|Stop PROCshell_FindFont
  5594. f#*|Start FNshell_FontIsAvailable
  5595. shell_FontIsAvailable(font$,x_pt%,y_pt%)
  5596.  "Font_FindFont",0,font$,x_pt%*16,y_pt%*16,0,0 
  5597.  font_handle%
  5598.  "Font_LoseFont",font_handle%
  5599. n"*|Stop FNshell_FontIsAvailable
  5600. p"*|Start FNshell_CheckSelection
  5601. shell_CheckSelection(sel%)
  5602.  temp%,ctr%
  5603. temp%=_U%!256
  5604.  temp%=0 
  5605.  _U%!24=_U%!252 
  5606.  sel%!ctr%<>temp%!ctr% 
  5607.   ctr%+=4
  5608.  temp%!ctr%=-1
  5609. z    =ctr%
  5610. |!*|Stop FNshell_CheckSelection
  5611. ~&*|Start FNshell_MenuGetItemAddress
  5612. shell_MenuGetItemAddress(menu%,selection%)
  5613.  ctr%,item_addr%
  5614.  "MenuUtil_Info",menu% 
  5615.  menu%
  5616. 0  item_addr%=menu%+28+((selection%!ctr%)*24)
  5617. /  menu%=item_addr%!4:
  5618.  address of submenu..
  5619.   ctr%+=4
  5620.  selection%!ctr%=-1
  5621. =item_addr%
  5622. %*|Stop FNshell_MenuGetItemAddress
  5623. $*|Start FNshell_GetLastMouseXPos
  5624. shell_GetLastMouseXPos
  5625. =_U%!272
  5626. #*|Stop FNshell_GetLastMouseXPos
  5627. $*|Start FNshell_GetLastMouseYPos
  5628. shell_GetLastMouseYPos
  5629. =_U%!276
  5630. #*|Stop FNshell_GetLastMouseYPos
  5631. (*|Start PROCshell_UpdateWindowHandle
  5632. shell_UpdateWindowHandle(old_handle%,new_handle%)
  5633. *|ifdef TraceInit
  5634. shell_Tracef0("UpdateWindowHandle:Updating stored window handles")
  5635. shell_Tracef0("UpdateWindowHandle:old handle=&"+
  5636. ~old_handle%)
  5637. shell_Tracef0("UpdateWindowHandle:new handle=&"+
  5638. ~new_handle%)
  5639. *|endif
  5640.  new_handle%<>old_handle% 
  5641.  _U%!28=old_handle% 
  5642.  _U%!28=new_handle%
  5643. shell_FixEventBlock(old_handle%,new_handle%,_U%!12,48):
  5644.  main event block
  5645. shell_FixEventBlock(old_handle%,new_handle%,_U%!96,16):
  5646.  dataload events
  5647. shell_FixEventBlock(old_handle%,new_handle%,_U%!72,24):
  5648.  datasave events
  5649. shell_FixEventBlock(old_handle%,new_handle%,_U%!92,24):
  5650.  pane events
  5651. shell_FixEventBlock(old_handle%,new_handle%,_U%!104,16):
  5652.  bump events
  5653. shell_UpdateStaticWindows(old_handle%,new_handle%)
  5654. '*|Stop PROCshell_UpdateWindowHandle
  5655. )*|Start PROCshell_UpdateStaticWindows
  5656. shell_UpdateStaticWindows(old_handle%,new_handle%)
  5657.  offset%,w_list%
  5658. *|ifdef TraceInit
  5659. shell_Tracef0("UpdateStaticWindows:Correcting static window list..")
  5660. *|endif
  5661. w_list%=_U%!184
  5662. 4offset%=
  5663. shell_SearchStatic(_U%!184,old_handle%)
  5664. w_list%!offset%=new_handle%
  5665. (*|Stop PROCshell_UpdateStaticWindows
  5666. #*|Start PROCshell_FixEventBlock
  5667. shell_FixEventBlock(old_handle%,new_handle%,event_list%,offset%)
  5668.  ptr%,list_size%
  5669. shell_HeapBlockExists(event_list%) 
  5670. 4  list_size%=
  5671. shell_HeapBlockInfo(event_list%)-8
  5672. *    
  5673.  (event_list%!ptr%=old_handle%) 
  5674. &      event_list%!ptr%=new_handle%
  5675.         
  5676.     ptr%+=offset%
  5677.  (ptr%>=list_size%)
  5678. "*|Stop PROCshell_FixEventBlock
  5679. #*|Start PROCshell_IconSelectAll
  5680. shell_IconSelectAll(wh%)
  5681.  blk%,I%
  5682. $blk%=
  5683. shell_HeapBlockFetch(2000)
  5684. I%=blk%+&40:!blk%=wh%
  5685. blk%!8=1<<21:blk%!12=1<<21
  5686.  "Wimp_WhichIcon",!blk%,I%,5<<21,0<<21
  5687.  !I%>-1
  5688.   blk%!4=!I%
  5689.  "Wimp_SetIconState",,blk%
  5690.   I%+=4
  5691. shell_HeapBlockReturn(blk%)
  5692. "*|Stop PROCshell_IconSelectAll
  5693. %*|Start PROCshell_IconDeselectAll
  5694. shell_IconDeselectAll(wh%)
  5695.  blk%,I%
  5696. $blk%=
  5697. shell_HeapBlockFetch(2000)
  5698. 0I%=blk%+&40:!blk%=wh%:blk%!8=0:blk%!12=1<<21
  5699.  "Wimp_WhichIcon",!blk%,I%,5<<21,1<<21
  5700.  !I%>-1
  5701.   blk%!4=!I%
  5702.  "Wimp_SetIconState",,blk%
  5703.   I%+=4
  5704. shell_HeapBlockReturn(blk%)
  5705. $*|Stop PROCshell_IconDeselectAll
  5706. )*|Start PROCshell_Message_SaveDesktop
  5707. shell_Message_SaveDesktop(Q%)
  5708.  boot$
  5709. %boot$="Run "+
  5710. shell_GetAppDir+
  5711.  "OS_GBPB",2,Q%!20,boot$,
  5712. boot$
  5713. (*|Stop PROCshell_Message_SaveDesktop
  5714. "*|Start PROCshell_MessagesInit
  5715. shell_MessagesInit(filename$,
  5716.  m_filedesc%,
  5717.  m_buffer%)
  5718.  size%,flags%
  5719.  3,"Cannot open message file '"+filename$+"'"
  5720.  "MessageTrans_FileInfo",,filename$ 
  5721.  flags%,,size%
  5722.  flags% 
  5723.  m_buffer%=0 
  5724.  m_buffer%=
  5725. shell_HeapBlockFetch(size%)
  5726.  "OS_Module",6,,,17+
  5727. (filename$) 
  5728.  ,,m_filedesc%
  5729. $(m_filedesc%+16)=filename$
  5730.  "MessageTrans_OpenFile",m_filedesc%,m_filedesc%+16
  5731. *|ifdef TraceInit
  5732. shell_Tracef0("MessagesInit:Message resource file '"+filename$+"' loaded")
  5733. *|endif
  5734. !*|Stop PROCshell_MessagesInit
  5735. !*|Start FNshell_PrinterOnLine
  5736. shell_PrinterOnLine
  5737.  inbuf%,online%
  5738. inbuf%=
  5739. 2,1,0,1,0,1,0
  5740. online%=
  5741. (-4)<inbuf%)
  5742. *FX21,3
  5743. =online%
  5744.  *|Stop FNshell_PrinterOnLine
  5745. '*|Start PROCshell_AttachBumpHandler
  5746. shell_AttachBumpHandler(wh%,ih%,incr%,decr%,l_limit%,u_limit%,step%,wrap%,disp_fn$,decode_fn$)
  5747.  e_blk%,offset%,temp%,temp2%,bump_info_blk%
  5748.  format of bump handler event block..
  5749.  +0  window handle
  5750.  +4  bump icon handle
  5751.  +8  step size (-ve for decr icon)
  5752.  +12 pointer to second info block
  5753.  format of second block..
  5754.  +0  display icon handle
  5755.  +4  lower limit
  5756.  +8  upper limit
  5757.  +12 pointer to display function
  5758.  +16 pointer to display decode function
  5759.  +20 flags (1 byte)
  5760.      bit 0 wrap upper
  5761.      bit 1 wrap lower
  5762.  deal with incr% icon event first..
  5763. $=offset%=
  5764. shell_GetEventListOffset(wh%,incr%,_U%+104,16,
  5765. %4e_blk%=_U%!104+offset%:
  5766.  pointer to event list..
  5767. '0  e_blk%!0=wh%:e_blk%!4=incr%:e_blk%!8=step%
  5768. ()  e_blk%!12=
  5769. shell_HeapBlockFetch(24)
  5770.   bump_info_blk%=e_blk%!12
  5771.   bump_info_blk%!0=ih%
  5772.   bump_info_blk%!4=l_limit%
  5773.   bump_info_blk%!8=u_limit%
  5774. disp_fn$>0 
  5775. .>    bump_info_blk%!12=
  5776. shell_HeapBlockFetch((
  5777. disp_fn$)+1)
  5778. /1    temp2%=bump_info_blk%!12:$temp2%=disp_fn$
  5779.     bump_info_blk%!12=0
  5780. decode_fn$>0 
  5781. 4@    bump_info_blk%!16=
  5782. shell_HeapBlockFetch((
  5783. decode_fn$)+1)
  5784. 53    temp2%=bump_info_blk%!16:$temp2%=decode_fn$
  5785.     bump_info_blk%!16=0
  5786.  wrap%=-1 
  5787.  bump_info_blk%!20=1 
  5788.  bump_info_blk%!20=0
  5789. ;?  offset%=
  5790. shell_GetEventListOffset(wh%,decr%,_U%+104,16,
  5791. <6  e_blk%=_U%!104+offset%:
  5792.  pointer to event list..
  5793. >5  e_blk%!0=wh%:e_blk%!4=decr%:e_blk%!8=step%*(-1)
  5794.   e_blk%!12=bump_info_blk%
  5795. C&*|Stop PROCshell_AttachBumpHandler
  5796. E%*|Start PROCshell_HandleBumpIcons
  5797. shell_HandleBumpIcons(offset%,wh%,ih%,_button%)
  5798.  display_ih%,info_blk%,e_blk%,curr_val%,_temp$,fn2%
  5799.  new_val%,fn%
  5800.  _button% <> 2 
  5801.   e_blk%=_U%!104+offset%
  5802. K-  _U%!288=wh%:_U%!292=ih%:_U%!296=offset%
  5803.  e_blk%!8 holds step value
  5804.   info_blk%=e_blk%!12
  5805.  info_blk%!0  holds display icon handle
  5806.  info_blk%!4  holds lower limit
  5807.  info_blk%!8  holds upper limit
  5808.  info_blk%!20 holds wrap flag
  5809.   fn2%=info_blk%!16
  5810.  fn2%<>0 
  5811. T2    _temp$=
  5812. shell_IconGetData(wh%,info_blk%!0)
  5813. U*    curr_val%=
  5814. ("FN"+$fn2%+"(_temp$)")
  5815. W8    curr_val%=
  5816. shell_IconGetData(wh%,info_blk%!0))
  5817.  _button%=1 
  5818. Z/    
  5819.  button is ADJUST, invert step value..
  5820. [-    _new_val%=curr_val%+((e_blk%!8)*(-1))
  5821. ]$    _new_val%=curr_val%+e_blk%!8
  5822.  info_blk%!20=0 
  5823.  no wrap..
  5824. a7    
  5825.  _new_val%>info_blk%!8 
  5826.  _new_val%=info_blk%!8
  5827. b7    
  5828.  _new_val%<info_blk%!4 
  5829.  _new_val%=info_blk%!4
  5830.  wrap..
  5831. e7    
  5832.  _new_val%>info_blk%!8 
  5833.  _new_val%=info_blk%!4
  5834. f7    
  5835.  _new_val%<info_blk%!4 
  5836.  _new_val%=info_blk%!8
  5837.   fn%=info_blk%!12
  5838.  fn%<>0 
  5839. j5    _new_val$=
  5840. ("FN"+$fn%+"(_new_val%,_button%)")
  5841.     _new_val$=
  5842. _new_val%
  5843.  _new_val%<>curr_val% 
  5844. o8    
  5845. shell_IconPutData(wh%,info_blk%!0,_new_val$,-1)
  5846. t$*|Stop PROCshell_HandleBumpIcons
  5847. v'*|Start FNshell_WindowSetSpriteArea
  5848. shell_WindowSetSpriteArea(h%,SpriteArea%)
  5849.  blk%,new_handle%,icon%,ib%
  5850. y'blk%  = 
  5851. shell_HeapBlockFetch(6000)
  5852. !blk% = h%
  5853.  "Wimp_GetWindowInfo",,blk%
  5854. blk%!68 = SpriteArea%
  5855. shell_IconSetSpriteArea(blk%!60,blk% + 76,SpriteArea%)
  5856.  (blk%!88) > 0 
  5857.  icon% = 0 
  5858.  (blk%!88) - 1
  5859. $    ib% = blk% + 92 + icon% * 32
  5860. =    
  5861. shell_IconSetSpriteArea(ib%!16,ib% + 20,SpriteArea%)
  5862.  icon%
  5863.  "Wimp_DeleteWindow",,blk%
  5864.  "Wimp_CreateWindow",,blk% + 4 
  5865.  new_handle%
  5866.  new_handle% <> h% 
  5867. shell_UpdateWindowHandle(h%,new_handle%)
  5868.   h% = new_handle%
  5869. shell_HeapBlockReturn(blk%)
  5870. &*|Stop FNshell_WindowSetSpriteArea
  5871. '*|Start PROCshell_IconSetSpriteArea
  5872. shell_IconSetSpriteArea(flags%,data%,area%)
  5873.  ((flags% 
  5874.  3) = 2) 
  5875.  ((flags% 
  5876.  &100) <> 0) 
  5877.   data%!4 = area%
  5878. &*|Stop PROCshell_IconSetSpriteArea
  5879. (*|Start FNshell_StrongHlpIsAvailable
  5880. shell_StrongHlpIsAvailable
  5881.  r%,buff%
  5882. $buff%=
  5883. shell_HeapBlockFetch(256)
  5884. shell_OSVarExists(buff%,"StrongHelp$Dir")
  5885. shell_HeapBlockReturn(buff%)
  5886. '*|Stop FNshell_StrongHlpIsAvailable
  5887. *|Start FNshell_MenuNew
  5888. shell_MenuNew(title$)
  5889.  handle%
  5890.  "MenuUtil_New",,title$ 
  5891.  handle%
  5892. =handle%
  5893. *|Stop FNshell_MenuNew
  5894. *|Start FNshell_MenuAdd
  5895. shell_MenuAdd(handle%,item$,sel_fn$)
  5896.  ret_handle%
  5897.  sel_fn$<>"" 
  5898.  "MenuUtil_Add",handle%,item$,sel_fn$ 
  5899.  ret_handle%
  5900.  "MenuUtil_Add",handle%,item$ 
  5901.  ret_handle%
  5902.  IF handle% <> ret_handle% THEN
  5903.  *|ifdef TraceInit
  5904.    PROCshell_Tracef0("MenuAdd:Menu handle has changed, updating event lists..")
  5905.  *|endif
  5906.    PROCshell_MenuUpdateHandle(handle%,ret_handle%)
  5907.  ENDIF
  5908. =ret_handle%
  5909. *|Stop FNshell_MenuAdd
  5910. *|Start PROCshell_MenuTick
  5911. shell_MenuTick(item_handle%,state%)
  5912.  "MenuUtil_Tick",item_handle%,state%
  5913. *|Stop PROCshell_MenuTick
  5914. #*|Start PROCshell_MenuTickOnly1
  5915. shell_MenuTickOnly1(menu_handle%,pos%)
  5916.  "MenuUtil_TickOnly",menu_handle%,pos%
  5917. "*|Stop PROCshell_MenuTickOnly1
  5918. #*|Start PROCshell_MenuTickOnly2
  5919. shell_MenuTickOnly2(item_handle%)
  5920.  "MenuUtil_TickOnly",item_handle%
  5921. "*|Stop PROCshell_MenuTickOnly2
  5922. *|Start PROCshell_MenuShade
  5923. shell_MenuShade(handle%,state%)
  5924.  "MenuUtil_Fade",handle%,state%
  5925. *|Stop PROCshell_MenuShade
  5926.  *|Start PROCshell_MenuDotted
  5927. shell_MenuDotted(item_handle%,state%)
  5928.  "MenuUtil_Dots",item_handle%,state%
  5929. *|Stop PROCshell_MenuDotted
  5930. !*|Start PROCshell_MenuColours
  5931. shell_MenuColours(item_handle%,fg%,bg%)
  5932.  "MenuUtil_Colours",item_handle%,fg%,bg%
  5933.  *|Stop PROCshell_MenuColours
  5934. "*|Start PROCshell_MenuWritable
  5935. shell_MenuWritable(item_handle%,state%,size%,valid$)
  5936.  "MenuUtil_Writable",item_handle%,state%,size%,valid$
  5937. !*|Stop PROCshell_MenuWritable
  5938. !*|Start PROCshell_MenuPutData
  5939. shell_MenuPutData(item_handle%,data$)
  5940.  "MenuUtil_Text",item_handle%,data$
  5941.  *|Stop PROCshell_MenuPutData
  5942. %*|Start PROCshell_MenuCallHandler
  5943. shell_MenuCallHandler(h%,_h_blk%)
  5944. ("FN"+$h%+"(_h_blk%)")
  5945. $*|Stop PROCshell_MenuCallHandler
  5946. &*|Start PROCshell_AttachOpenWindow
  5947. shell_AttachOpenWindow(wh%,fn$)
  5948.  blk%,temp%,offset%
  5949. *|ifdef TraceInit
  5950. shell_Tracef0("AttachOpenWindow:Attaching OpenWindow Handler")
  5951. *|endif
  5952.  wh%<0 
  5953. shell_MessageOneArg("SHELLMSG27","AttachOpenWindow")
  5954. :offset%=
  5955. shell_GetEventListOffset(wh%,-1,_U%+304,12,
  5956. blk%=_U%!304+offset%
  5957. blk%!0=wh%:blk%!4=-1
  5958. *blk%!8=
  5959. shell_HeapBlockFetch(
  5960. (fn$)+1)
  5961. temp%=blk%!8:$temp%=fn$
  5962.     %*|Stop PROCshell_AttachOpenWindow
  5963. .*|Start PROCshell_AttachCloseWindowHandler
  5964. shell_AttachCloseWindowHandler(wh%,fn$)
  5965.  blk%,temp%,offset%
  5966. *|ifdef TraceInit
  5967. shell_Tracef0("AttachCloseWindowHandler:Attaching CloseWindow Handler")
  5968. *|endif
  5969.  wh%<0 
  5970. shell_MessageOneArg("SHELLMSG27","AttachCloseWindow")
  5971. :offset%=
  5972. shell_GetEventListOffset(wh%,-1,_U%+308,12,
  5973. blk%=_U%!308+offset%
  5974. blk%!0=wh%:blk%!4=-1
  5975. *blk%!8=
  5976. shell_HeapBlockFetch(
  5977. (fn$)+1)
  5978. temp%=blk%!8:$temp%=fn$
  5979. -*|Stop PROCshell_AttachCloseWindowHandler
  5980. "*|Start PROCshell_SpriteRename
  5981. shell_SpriteRename(spritearea%,old$,new$)
  5982.  "OS_SpriteOp",&200+26,spritearea%,
  5983. shell_SpriteGetPtr(spritearea%,old$),new$
  5984.  !*|Stop PROCshell_SpriteRename
  5985. "$*|Start PROCshell_SpriteAreaSave
  5986. shell_SpriteAreaSave(spritearea%,filename$)
  5987.  "OS_SpriteOp",&200+12,spritearea%,filename$
  5988. '#*|Stop PROCshell_SpriteAreaSave
  5989. ) *|Start PROCshell_EnsurePoll
  5990. shell_EnsurePoll
  5991.  action%
  5992. -(  action% = 
  5993. shell_Poll_I(0,_U%!148)
  5994. shell_Action(action%)
  5995.  action% = 0
  5996. *|Stop PROCshell_EnsurePoll
  5997. 4"*|Start FNshell_WimpGetVersion
  5998. shell_WimpGetVersion
  5999. =_U%!316
  6000. 7!*|Stop FNshell_WimpGetVersion
  6001. 9"*|Start FNshell_OSCheckVersion
  6002. shell_OSCheckVersion(version%)
  6003. shell_OSModuleCheckVersion("UtilityModule",version%)
  6004. <!*|Stop FNshell_OSCheckVersion
  6005. >(*|Start FNshell_OSModuleCheckVersion
  6006. shell_OSModuleCheckVersion(module$,version%)
  6007.  blk%,len%
  6008. A#blk%=
  6009. shell_HeapBlockFetch(256)
  6010. ("Set AppName$RISCOS Y")
  6011. ("RMEnsure "+module$+" "+
  6012. version%+" Set AppName$RISCOS N")
  6013.  "XOS_ReadVarVal","AppName$RISCOS",blk%,256,0,0 
  6014.  ,,len%
  6015. blk%?len%=13
  6016. ("Unset AppName$RISCOS")
  6017. shell_HeapBlockReturn(blk%)
  6018.  $blk%="N" 
  6019. J'*|Stop FNshell_OSModuleCheckVersion
  6020. L)*|Start PROCshell_MessageSendDataLoad
  6021. shell_MessageSendDataLoad(type%,name$)
  6022.  m_blk%
  6023. O%m_blk%=
  6024. shell_HeapBlockFetch(256)
  6025. m_blk%!00=256
  6026. m_blk%!04=0
  6027. R"m_blk%!16=5:
  6028.  dataopen message
  6029. m_blk%!20=0
  6030. m_blk%!28=0
  6031. m_blk%!32=0
  6032. m_blk%!36=0
  6033. m_blk%!40=type%
  6034. $(m_blk%+44)=name$+
  6035.  "Wimp_SendMessage",17,m_blk%,0
  6036. shell_HeapBlockReturn(m_blk%)
  6037. ](*|Stop PROCshell_MessageSendDataLoad
  6038. _$*|Start FNshell_MenuMakeFromFile
  6039. shell_MenuMakeFromFile(title$,menuselectFN$,file$)
  6040.  handle%,X%,string$,void%
  6041. shell_FileExists(file$) 
  6042. c$  handle%=
  6043. shell_MenuNew(title$)
  6044.   X%=
  6045. (file$)
  6046.     string$=
  6047. g;    void%=
  6048. shell_MenuAdd(handle%,string$,menuselectFN$)
  6049. =handle%
  6050. m#*|Stop FNshell_MenuMakeFromFile
  6051. o *|Start FNshell_BinarySearch
  6052. shell_BinarySearch(_search_term$,get_termFN$,comp_FN$,lo%,hi%)
  6053.  _pos%,m%,_wp$,off%,p%,hipos%,lopos%,lp2%,found%,missing%
  6054. hi% += 1
  6055. missing% = 
  6056. found%   = 
  6057. m%       = hi%
  6058. off%     = 0
  6059. _pos%     = m% 
  6060. lopos%   = lo% - 1
  6061. hipos%   = hi%
  6062. {(  _wp$=
  6063. ("FN"+get_termFN$+"(_pos%)")
  6064.   lastpos% = _pos%
  6065.  _search_term$ = _wp$ 
  6066.     found% = 
  6067. 3    
  6068. ("FN"+comp_FN$+"(_search_term$,_wp$)") 
  6069.       
  6070.  search lower half..
  6071.       hipos% = _pos%
  6072. !      m%     = _pos% - lopos%
  6073.        _pos%  = m% 
  6074.  2 + off%
  6075.         
  6076.       
  6077.  search upper half..
  6078.       lopos% = _pos%
  6079.       off%   = _pos%
  6080. !      m%     = hipos% - _pos%
  6081.       _pos%  = m% 
  6082.  2 +off%
  6083.         
  6084.  lp2% = lastpos% 
  6085.  missing% = 
  6086.   lp2% = lastpos%
  6087.  found% 
  6088.  missing%
  6089.  found% 
  6090.  =-1 
  6091.  = lastpos%
  6092. *|Stop FNshell_BinarySearch
  6093. #*|Start FNshell_IconLastClicked
  6094. shell_IconLastClicked
  6095. =_U%!32
  6096. "*|Stop FNshell_IconLastClicked
  6097. "*|Start FNshell_MenuGetNrItems
  6098. shell_MenuGetNrItems(menu_handle%)
  6099.  menu%,result%,items%
  6100.  "MenuUtil_Info",menu_handle% 
  6101.  menu%
  6102. menu% += 28
  6103.   result% = (menu%?0 
  6104.  &80)
  6105.   items% += 1
  6106.   menu%  += 24
  6107.  result%
  6108. =items%
  6109. !*|Stop FNshell_MenuGetNrItems
  6110. #*|Start FNshell_MenuGetNrDotted
  6111. shell_MenuGetNrDotted(menu_handle%)
  6112.  menu%,result%,nr%
  6113.  "MenuUtil_Info",menu_handle% 
  6114.  menu%
  6115. menu% += 28 
  6116.   result% = (menu%?0 
  6117.  &80)
  6118.  (menu%?0 
  6119.  nr% += 1
  6120.   menu% += 24
  6121.  result% = -1
  6122.     =nr% 
  6123. #*|Stop FNshell_MenuGetNrDotted 
  6124. &*|Start FNshell_MenuGetItemHandler
  6125. shell_MenuGetItemHandler(menu_handle%,item_nr%)
  6126.  m_sel_blk%,ptr%,handler$
  6127. ,m_sel_blk%    = 
  6128. shell_HeapBlockFetch(8)
  6129. m_sel_blk%!00 = item_nr%  
  6130. m_sel_blk%!04 = -1 
  6131.  "MenuUtil_Decode",menu_handle%,m_sel_blk% 
  6132.  ptr% 
  6133.  ptr% = 0 
  6134.   handler$ = ""
  6135.   handler$ = $(ptr%)
  6136. shell_HeapBlockReturn(m_sel_blk%) 
  6137. = handler$
  6138. %*|Stop FNshell_MenuGetItemHandler
  6139. #*|Start FNshell_MenuGetItemText
  6140. shell_MenuGetItemText(menu_handle%,item_nr%)
  6141.  m_sel_blk%,ptr%,text$
  6142. )m_sel_blk% = 
  6143. shell_HeapBlockFetch(8)
  6144. m_sel_blk%!00 = item_nr%
  6145. m_sel_blk%!04 = -1
  6146.  "MenuUtil_Decode",menu_handle%,m_sel_blk% 
  6147.  ,,ptr%
  6148. text$ = $(ptr%!12)
  6149. shell_HeapBlockReturn(m_sel_blk%)
  6150. = text$
  6151. "*|Stop FNshell_MenuGetItemText
  6152. %*|Start FNshell_MenuGetItemHandle
  6153. shell_MenuGetItemHandle(menu_handle%,item_nr%)
  6154.  m_sel_blk%,ptr%,handle%
  6155. )m_sel_blk% = 
  6156. shell_HeapBlockFetch(8)
  6157. m_sel_blk%!00 = item_nr%
  6158. m_sel_blk%!04 = -1
  6159.  "MenuUtil_Decode",menu_handle%,m_sel_blk% 
  6160.  ,,ptr%
  6161. handle% = ptr%!08
  6162. shell_HeapBlockReturn(m_sel_blk%)
  6163. = handle%
  6164. $*|Stop FNshell_MenuGetItemHandle
  6165. %*|Start FNshell_MenuGetItemHeight
  6166. shell_MenuGetItemHeight(menu_handle%)
  6167.  menu%
  6168.  "MenuUtil_Info",menu_handle% 
  6169.  menu%
  6170. = menu%!20
  6171. $*|Stop FNshell_MenuGetItemHeight
  6172. '*|Start FNshell_MenuCalculateHeight
  6173. shell_MenuCalculateHeight(menu_handle%)
  6174.  height%
  6175. Xheight% = 
  6176. shell_MenuGetNrItems(menu_handle%)*
  6177. shell_MenuGetItemHeight(menu_handle%)
  6178. ;= height% + (
  6179. shell_MenuGetNrDotted(menu_handle%) * 24)
  6180. &*|Stop FNshell_MenuCalculateHeight
  6181. #*|Start PROCshell_MenuSortItems
  6182. shell_MenuSortItems(menu%,compFN$,asc%,start%,end%)
  6183.  nr_items%
  6184. 0nr_items% = 
  6185. shell_MenuGetNrItems(menu%) - 1
  6186. _shell_MS_handle% = menu%
  6187.  end% > nr_items% 
  6188.  end% = nr_items%
  6189.  "Hourglass_On"
  6190. shell_QuickSort(compFN$,"_shell_MS_swap",asc%,0,end%)
  6191.  "Hourglass_Off"
  6192. "*|Stop PROCshell_MenuSortItems
  6193. *|Start PROCshell_QuickSort
  6194. shell_QuickSort(comp_FN$,swap_FN$,_asc%,_start%,_end%)
  6195.  _lo%,_h%,_F%,_temp%,void%
  6196. '_lo% = _start%:_hi% = _end%:_F% = 
  6197. )_temp% = _lo% -1 + 
  6198. (_hi% + 1 - _lo%)
  6199. ,void% = 
  6200. ("FN"+swap_FN$+"(_lo%,_temp%)")
  6201.  _asc% = 0 
  6202. *    
  6203. ("FN"+comp_FN$+"(_lo%,_hi%)") 
  6204. 0      void% = 
  6205. ("FN"+swap_FN$+"(_lo%,_hi%)")
  6206.       _F% = 
  6207.             
  6208. *    
  6209. ("FN"+comp_FN$+"(_hi%,_lo%)") 
  6210. 0      void% = 
  6211. ("FN"+swap_FN$+"(_hi%,_lo%)")
  6212.       _F% = 
  6213.         
  6214.  _F% 
  6215.  _hi% = _hi% - 1 
  6216.  _lo% = _lo% + 1
  6217.  _lo% = _hi%
  6218.  _start% < _lo% - 1 
  6219. shell_QuickSort(comp_FN$,swap_FN$,_asc%,_start%,_lo% - 1)
  6220.  _hi% + 1 < _end%   
  6221. shell_QuickSort(comp_FN$,swap_FN$,_asc%,_hi% + 1,_end%)
  6222. *|Stop PROCshell_QuickSort
  6223. *|Start FNshell_MS_swap
  6224. _shell_MS_swap(e1%,e2%)
  6225.  term1$,term2$,h1%,h2%
  6226. :term1$ = 
  6227. shell_MenuGetItemText(_shell_MS_handle%,e1%)
  6228. :term2$ = 
  6229. shell_MenuGetItemText(_shell_MS_handle%,e2%)
  6230. <h1%    = 
  6231. shell_MenuGetItemHandle(_shell_MS_handle%,e1%)
  6232. <h2%    = 
  6233. shell_MenuGetItemHandle(_shell_MS_handle%,e2%)
  6234. shell_MenuPutData(h1%,term2$)
  6235. shell_MenuPutData(h2%,term1$)
  6236. *|Stop FNshell_MS_swap
  6237. *|Start FN_shell_MS_comp
  6238. _shell_MS_comp(e1%,e2%)
  6239.  term1$,term2$
  6240. (:term1$ = 
  6241. shell_MenuGetItemText(_shell_MS_handle%,e1%)
  6242. ):term2$ = 
  6243. shell_MenuGetItemText(_shell_MS_handle%,e2%)
  6244. term1$ < 
  6245. term2$ 
  6246. *|Stop FN_shell_MS_comp
  6247. .-*|Start PROCshell_WindowSetTitleRightJust
  6248. shell_WindowSetTitleRightJust(
  6249.  wh%)
  6250.  w_blk%,t_flags%,handle%,reopen%
  6251. 1&reopen% = 
  6252. shell_WindowIsOpen(wh%)
  6253. 2(w_blk% = 
  6254. shell_HeapBlockFetch(6000)
  6255. !w_blk% = wh%
  6256.  "Wimp_GetWindowInfo",,w_blk%
  6257. t_flags% = w_blk%!60
  6258.  (t_flags% 
  6259.  (1 << 3)) 
  6260. *|ifdef TraceInit
  6261. shell_Tracef0("WindowSetTitleRightJust:title flags = &"+
  6262. ~t_flags%)
  6263. shell_Tracef0("WindowSetTitleRightJust:Horizontally centred bit set..")
  6264. shell_Tracef0("WindowSetTitleRightJust:Unsetting horizontally centred bit..")
  6265. *|endif
  6266. <$  t_flags% = t_flags% 
  6267.  (1 << 3)
  6268. *|ifdef TraceInit
  6269. shell_Tracef0("WindowSetTitleRightJust:title flags = &"+
  6270. ~t_flags%)
  6271. *|endif
  6272. *|ifdef TraceInit
  6273. shell_Tracef0("WindowSetTitleRightJust:Horizontally centred bit NOT set..")
  6274. *|endif
  6275. *|ifdef TraceInit
  6276. shell_Tracef0("WindowSetTitleRightJust:Setting right justified bit..")
  6277. *|endif
  6278. H"t_flags% = t_flags% 
  6279.  (1 << 9)
  6280. w_blk%!60 = t_flags%
  6281.  "Wimp_DeleteWindow",,w_blk%
  6282.  "Wimp_CreateWindow",,w_blk% + 4 
  6283.  handle%
  6284.  wh% <> handle% 
  6285. *|ifdef TraceInit
  6286. shell_Tracef0("WindowSetTitleRightJust:Updating window handle...")
  6287. *|endif
  6288. shell_UpdateWindowHandle(wh%,handle%)
  6289.   wh% = handle%
  6290.  reopen% 
  6291. shell_OpenWindow(handle%,0,0)
  6292. shell_HeapBlockReturn(w_blk%)
  6293. W,*|Stop PROCshell_WindowSetTitleRightJust
  6294. Y.*|Start PROCshell_WindowSetTitleCentreJust
  6295. shell_WindowSetTitleCentreJust(
  6296.  wh%)
  6297.  w_blk%,t_flags%,handle%,reopen%
  6298. \&reopen% = 
  6299. shell_WindowIsOpen(wh%)
  6300. ](w_blk% = 
  6301. shell_HeapBlockFetch(6000)
  6302. !w_blk% = wh%
  6303.  "Wimp_GetWindowInfo",,w_blk%
  6304. t_flags% = w_blk%!60
  6305. shell_Tracef0("WindowSetTitleCentreJust:title flags = &"+
  6306. ~t_flags%)
  6307. shell_Tracef0("WindowSetTitleCentreJust:t_flags% AND (1 << 3) = "+
  6308. ~(t_flags% 
  6309.  (1 << 3)))
  6310.  (t_flags% 
  6311.  (1 << 3)) = 0 
  6312. *|ifdef TraceInit
  6313. shell_Tracef0("WindowSetTitleCentreJust:Horizontally centred bit not set..")
  6314. shell_Tracef0("WindowSetTitleCentreJust:Setting horizontally centred bit..")
  6315. *|endif
  6316. h$  t_flags% = t_flags% 
  6317.  (1 << 3)
  6318. *|ifdef TraceInit
  6319. shell_Tracef0("WindowSetTitleCentreJust:title flags = &"+
  6320. ~t_flags%)
  6321. *|endif
  6322.   w_blk%!60 = t_flags%
  6323.  "Wimp_DeleteWindow",,w_blk%
  6324.  "Wimp_CreateWindow",,w_blk% + 4 
  6325.  handle%
  6326.  wh% <> handle% 
  6327.   *|ifdef TraceInit
  6328. qL    
  6329. shell_Tracef0("WindowSetTitleCentreJust:Updating window handle...")
  6330.   *|endif
  6331. s.    
  6332. shell_UpdateWindowHandle(wh%,handle%)
  6333.     wh% = handle%
  6334.  reopen% 
  6335. shell_OpenWindow(handle%,0,0)
  6336. shell_HeapBlockReturn(w_blk%)
  6337. |-*|Stop PROCshell_WindowSetTitleCentreJust
  6338. ~**|Start PROCshell_IconGetSelectedIcons
  6339. shell_IconGetSelectedIcons(wh%,esg%,
  6340.  i_blk%)
  6341.  imask%
  6342. 'imask%   = (esg% << 16) + (1 << 21)
  6343.  "Wimp_WhichIcon",wh%,i_blk%,imask%,(esg% << 16) + (1 << 21)
  6344. )*|Stop PROCshell_IconGetSelectedIcons
  6345. &*|Start FNshell_GetLastMouseButton
  6346. shell_GetLastMouseButton
  6347. = _U%!320
  6348. %*|Stop FNshell_GetLastMouseButton
  6349. (*|Start FNshell_GetLastWindowClicked
  6350. shell_GetLastWindowClicked
  6351. = _U%!28
  6352. '*|Stop FNshell_GetLastWindowClicked
  6353. &*|Start FNshell_GetLastIconClicked
  6354. shell_GetLastIconClicked
  6355. = _U%!32
  6356. %*|Stop FNshell_GetLastIconClicked
  6357. !*|Start FNshell_IconIndirSize
  6358. shell_IconIndirSize(file_offset%,flags%,data%)
  6359.  size%,valid_offset%,valid_buff%,ctr%,char%
  6360.  (flags% 
  6361.  &800100) = &100 
  6362.   size% = data%!8
  6363.  (flags% 
  6364.  (data%!4 <> -1) 
  6365.     valid_offset% = data%!4
  6366. 0    valid_buff% = 
  6367. shell_HeapBlockFetch(256)
  6368. ,    
  6369. # X% = file_offset% + valid_offset%
  6370. )    
  6371.  "OS_GBPB",4,X%,valid_buff%,512
  6372.     ctr% = 0
  6373.         
  6374. "      char% = valid_buff%?ctr%
  6375.       ctr% += 1
  6376.  char% < 32
  6377.     size% = size% + ctr%
  6378. +    
  6379. shell_HeapBlockReturn(valid_buff%)
  6380.   size% = 0
  6381. = size%
  6382.  *|Stop FNshell_IconIndirSize
  6383.