home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / basic / eventshell / !EvntShell / ShellLib (.txt) < prev    next >
Encoding:
RISC OS BBC BASIC V Source  |  1996-04-18  |  405.5 KB  |  11,497 lines

  1.  >EvntShell:ShellLibRT
  2. "*|Start FNshell_LibraryVersion
  3. shell_LibraryVersion
  4. = 2.15 * 100
  5.  18/04/96
  6.  2.15 Modular EvntShell (build 002)
  7.     !*|Stop FNshell_LibraryVersion
  8.  routine to find handle of parent needed..
  9.  or search all submenu handles so that it can be changed..
  10.  or store a list of menu item handles together with the submenu handles..
  11.  Fixed bug in PROCshell_PointerLeavingWindow
  12.  Enhanced PROCshell_CaretPutFirstIcon
  13.  --------------------------------------------------------------------------
  14.  Define Constants
  15.  --------------------------------------------------------------------------
  16. %*|Start PROCshell_DefineConstants
  17. shell_DefineConstants
  18.  Mouse Buttons
  19. _MSE_SELECTBUT  = 4
  20. _MSE_MENUBUT    = 2
  21. _MSE_ADJUSTBUT  = 1
  22.  Events
  23. _EVENT_NULL        = 0
  24. _EVENT_REDRAWWIN   = 1
  25. _EVENT_OPENWIN     = 2
  26. _EVENT_CLOSEWIN    = 3
  27. _EVENT_PTRLEAVING  = 4
  28. _EVENT_PTRENTERING = 5
  29. _EVNT_MSECLICK     = 6
  30. _EVNT_DRAGEND      = 7
  31.  Popup Types
  32. _POPUP_TYPE_TEXT        = 0
  33. _POPUP_TYPE_WIMPCOLOUR  = 1
  34. _POPUP_TYPE_DATEPICK    = 2
  35. 06_POPUP_TYPE_CALCULATOR  = 3 :
  36.  not implemented yet
  37. 1 _POPUP_TYPE_FONTPICK    = 4 
  38. 26_POPUP_TYPE_LINEFONT    = 5 :
  39.  not implemented yet
  40. 3 _POPUP_TYPE_FONTMENU    = 6 
  41. 46_POPUP_TYPE_TIMEPICK    = 7 :
  42.  not implemented yet
  43. _POPUP_TYPE_COLOUR24    = 8
  44.  Iconbar window handles
  45. _IBAR_RIGHT% = -1
  46. _IBAR_LEFT%  = -2
  47. _BUTTON_TYPE_NEVER = 0
  48. _BUTTON_TYPE_CLICK = 3
  49. _BUTTON_TYPE_MENU  = 9
  50. @$*|Stop PROCshell_DefineConstants
  51. D)*|Start FNshell_GetLastSecureFileName
  52. shell_GetLastSecureFileName
  53.  temp%
  54. temp% = _U%!80
  55.  temp% = 0 
  56. = $temp%
  57. K(*|Stop FNshell_GetLastSecureFileName
  58. O *|Start FNshell_GetEventMenu
  59. shell_GetEventMenu(button%,wh%,ic%)
  60.  ptr%,event_list%,found%,list_size%,menu%
  61.  wh%=-1 
  62.  wh%=-2
  63. S-list_size%=
  64. shell_HeapBlockInfo(_U%!12)-8
  65. ptr%=0
  66. found%=
  67. event_list%=_U%!12
  68. fn$=""
  69.  PROCshell_Tracef0("GetEventMenu:Started..")
  70.  PROCshell_Tracef0("GetEventMenu:button is "+STR$ button%)
  71.  PROCshell_Tracef0("GetEventMenu:window is "+STR$ wh%)
  72.  PROCshell_Tracef0("GetEventMenu:icon   is "+STR$ ic%)
  73.  (event_list%!ptr%=wh%) 
  74. ^C    
  75.  PROCshell_Tracef0("GetEventMenu:window handle matched..")
  76. _&    
  77.  event_list%!(ptr%+4) = ic% 
  78. `C      
  79.  PROCshell_Tracef0("GetEventMenu:icon handle matched..")
  80. a$      menu%=event_list%!(ptr%+8)
  81. b$      
  82.  menu%=-2 
  83.  menu%=_U%!252
  84.       found%=
  85. d        
  86. eG      
  87.  PROCshell_Tracef0("GetEventMenu:icon handle NOT matched..")
  88. f-      
  89.  IF event_list%!(ptr%+4) = -1 THEN
  90.       
  91.    IF button%=2 THEN
  92. h*      
  93.      menu%=event_list%!(ptr%+8)
  94. i.      
  95.      IF menu%=-2 THEN menu%=_U%!252
  96.       
  97.      found%=TRUE
  98.       
  99.    ELSE
  100.       
  101.      ptr%+=48
  102.       
  103.    ENDIF
  104.       
  105.  ELSE
  106.       
  107.  ptr%+=48
  108.       
  109.  ENDIF
  110. q        
  111. ptr% += 48
  112.  (ptr%>=list_size% 
  113.  found%)
  114. =menu%
  115. *|Stop FNshell_GetEventMenu
  116. {$*|Start PROCshell_AttachMenuDBox
  117. shell_AttachMenuDBox(item%,window$,preopenfn$,postopenfn$)
  118.  Check current submenu handle. We should release any memory
  119.  allocated by previous calls (when I work out how to do it)
  120.  blk%,temp%,addr%
  121. shell_WindowLoaded(window$) 
  122. shell_MessageOneArg("SHELLMSG03",window$)
  123. "blk%=
  124. shell_HeapBlockFetch(12)
  125. -blk%!0=
  126. shell_HeapBlockFetch(
  127.  window$+1)
  128. temp%=blk%!0:$temp%=window$
  129. 0blk%!4=
  130. shell_HeapBlockFetch(
  131.  preopenfn$+1)
  132. "temp%=blk%!4:$temp%=preopenfn$
  133. 1blk%!8=
  134. shell_HeapBlockFetch(
  135.  postopenfn$+1)
  136. #temp%=blk%!8:$temp%=postopenfn$
  137.  Store address of heapblock in submenu pointer word of
  138.  menu item definition. Cunning huh........
  139.  "MenuUtil_SubMenu",item%,blk%
  140.  "MenuUtil_Warning",,
  141. #*|Stop PROCshell_AttachMenuDBox
  142. !*|Start FNshell_MessageNoArgs
  143. shell_MessageNoArgs(tag$)
  144. shell_MessageLookup(tag$,"","")
  145.  *|Stop FNshell_MessageNoArgs
  146. !*|Start FNshell_MessageOneArg
  147. shell_MessageOneArg(tag$,arg1$)
  148. shell_MessageLookup(tag$,arg1$,"")
  149.  *|Stop FNshell_MessageOneArg
  150. "*|Start FNshell_MessageTwoArgs
  151. shell_MessageTwoArgs( tag$, arg1$, arg2$ )
  152. shell_MessageLookup( tag$, arg1$, arg2$ )
  153. !*|Stop FNshell_MessageTwoArgs
  154. !*|Start FNshell_MessageLookup
  155. shell_MessageLookup(tag$,arg1$,arg2$)
  156.  flags%,L%,m$,ms_text%,ms_desc%
  157. tag$,8)="SHELLMSG" 
  158. '  ms_text%=_U%!284:ms_desc%=_U%!280
  159. %  ms_text%=_U%!64:ms_desc%=_U%!68
  160.  "XMessageTrans_Lookup",ms_desc%,tag$,ms_text%,256,arg1$,arg2$ 
  161.  ,,,L%;flags%
  162.  flags% 
  163.  m$="Message tag '"+tag$+"' not found in message file!"
  164.   ms_text%?L%=13
  165.   m$=$(ms_text%)
  166.  *|Stop FNshell_MessageLookup
  167. *|Start FNshell_WimpInit
  168. shell_WimpInit( Version%, TaskName$ )
  169.  message_list%, Taskid%
  170.  Initialise list of reason codes application is interested in
  171.  (all of them for the moment)..
  172.  message_list% 4
  173. !message_list% = 0
  174. shell_OSCheckVersion( 3.1 ) 
  175.   Version% = 310
  176.  "Wimp_Initialise", Version%, &4B534154, TaskName$, message_list% 
  177.  Version%, Taskid%
  178.   Version% = 200
  179.  "Wimp_Initialise", Version%, &4B534154, TaskName$ 
  180.  Version%, Taskid%
  181.  _U%!100 
  182.  1 << 6 
  183.  "WimpExt_Initialise", 14, Taskid%
  184. _U%!148 = Taskid%
  185. = Taskid%
  186. *|Stop FNshell_WimpInit
  187. *|Start FNshell_WimpInit_I
  188. shell_WimpInit_I( Version%, TaskName$ )
  189.  Taskid%
  190. 4Taskid% = 
  191. shell_WimpInit( Version%, TaskName$ )
  192.  "Interface_Initialise", Taskid%
  193. = Taskid%
  194. *|Stop FNshell_WimpInit_I
  195. %*|Start PROCshell_WimpCloseDown_I
  196. shell_WimpCloseDown_I(Taskid%)
  197. shell_ExReg_FontLib_Loaded 
  198. shell_Fonts_LoseFonts
  199. *|ifdef Using_FontMenu
  200. shell_ExReg_FontMenu_Loaded 
  201. shell_FontMenu_Deregister
  202. *|endif
  203.  _U%!100 
  204.  1 << 6 
  205.  "WimpExt_Initialise",14,Taskid%
  206.  "XWimp_CloseDown",Taskid%,&4B534154
  207.  "XInterface_CloseDown",Taskid%
  208.  _U%!100 
  209.  1 << 2 
  210.  "XImpulse_CloseDown",_U%!148
  211. $*|Stop PROCshell_WimpCloseDown_I
  212. *|Start PROCWimpCloseDown
  213. WimpCloseDown(Taskid%)
  214. shell_ExReg_FontMenu_Loaded 
  215. shell_LoseFonts
  216. *|ifdef Using_FontMenu
  217. shell_ExReg_FontMenu_Loaded 
  218. shell_FontMenu_Deregister
  219. *|endif
  220.  _U%!100 
  221.  1 << 6 
  222.  "WimpExt_Initialise",14,Taskid%
  223.  "XWimp_CloseDown",Taskid%,&4B534154
  224.  _U%!100 
  225.  1<<2 
  226.  "XImpulse_CloseDown",_U%!148
  227. ("Unset "+_shell_AppName$+"$BasicFile")
  228. *|Stop PROCWimpCloseDown
  229. *|Start FNshell_FindFont
  230. shell_FindFont(font$,pointsize%)
  231.  f%,fontcounts%
  232. fontcounts%=_U%!232
  233.  "Font_FindFont",,font$,pointsize%*16,p*16,0,0 
  234. fontcounts%?f%+=1
  235.  fontcounts%?f%>=255 
  236. shell_OK(
  237. shell_MessageNoArgs("SHELLMSG18"))
  238. *|Stop FNshell_FindFont
  239. *|Start PROCshell_Init
  240. shell_Init
  241.  elist%,loop%,temp%,cmdline$
  242.  shell_AppDir$,shell_AppName$,start_interval%
  243. shell_InitModules
  244. shell_DefineConstants
  245. 2#_SHELL_SENDDATALOAD_MY_REF% = 0
  246. 3$_SHELL_SENDDATALOAD_FILE$   = ""
  247.  _U% 360,_shell_blk% 260
  248. 6#_Q%=
  249. shell_HeapBlockFetch(3000)
  250. 7$elist%=
  251. shell_HeapBlockFetch(48)
  252. elist%!00=0
  253. elist%!04=0
  254. elist%!08=0
  255. elist%!12=0
  256. elist%!16=0
  257. elist%!20=0
  258. elist%!24=0
  259. elist%!28=0
  260. elist%!32=0
  261. elist%!36=0
  262. elist%!40=0
  263. elist%!44=0
  264. D'_U%!0=0          :
  265.  nr of templates
  266. E0_U%!4=0          :
  267.  pointer to window blocks
  268. F-_U%!8=0          :
  269.  pointer to menu block
  270. G-_U%!12=elist%    :
  271.  pointer to event list
  272. H3_U%!16=1         :
  273.  address of user sprite area
  274. I5_U%!20=0         :
  275.  handle of last dynamic window
  276. J+_U%!44=-1        :
  277.  handle of tracefile
  278. K6_U%!48=0         :
  279.  ArtWorks Renderer redraw block
  280. L@                 :
  281.    +00 Address of VduVars heapblock (256)
  282. M?                 :
  283.    +04 Address of Matrix  heapblock (24)
  284. N?                 :
  285.    +08 Address of Info    heapblock (36)
  286. OB                 :
  287.    +12 Address of WorkBlk heapblock (&1000)
  288. PR                 :
  289.    +16 Address of CallbackRoutine returned by fileinit call
  290. Q>_U%!52=0         :
  291.  last window clicked over (menu button)
  292. R>_U%!56=0         :
  293.  last icon   clicked over (menu button)
  294. S>_U%!60=0         :
  295.  pointer to 'HotKey' handler event list
  296. T0_U%!64=0         :
  297.  pointer to message block
  298. U0_U%!68=0         :
  299.  pointer to message block
  300. V7_U%!72=0         :
  301.  pointer to datasave event block
  302. W5_U%!76=
  303. shell_HeapBlockFetch(256):
  304.  message block
  305. X6_U%!80=0         :
  306.  pointer to last full file name
  307. Y8_U%!84=-1        :
  308.  store my_ref from save operation
  309. Z"_U%!88=0         :
  310.  ??????????
  311. [;_U%!92=0         :
  312.  pointer to pane handler event block
  313. \7_U%!96=0         :
  314.  pointer to dataload event block
  315. ]+_U%!100=0        :
  316.  EvntShell bit flags
  317. ^C                 :
  318.  bit  0  - DragASprite operation in progress
  319. _>                 :
  320.  bit  1  - Top bit dataload in progress
  321. `<                 :
  322.  bit  2  - Impulse module initialised
  323. a6                 :
  324.  bit  3  - ResFind in operation
  325. bO                 :
  326.  bit  4  - Trace init message pending (set in TraceInit,
  327. cK                 :
  328.            cleared when ack received from ShellDBug)
  329. dC                 :
  330.  bit  5  - command line contains arguments..
  331. e:                 :
  332.  bit  6  - WimpEXT module is loaded
  333. fK                 :
  334.  bit  7  - StrongHlp system initialised for this app
  335. g9                 :
  336.  bit  8  - AWRender code assembled
  337. h@                 :
  338.  bit  9  - Tracing flag (0 = off, 1 = on)
  339. i?                 :
  340.  bit 10  - RISC OS 3 or better available
  341. j9                 :
  342.  bit 11  - Slider drag in progress
  343. k9                 :
  344.  bit 12  - Interactive help on/off
  345. l _U%!108=-1       :
  346.  ScrpRef%
  347. m _U%!112=-1       :
  348.  FtchRef%
  349. n _U%!116=-1       :
  350.  LoadRef%
  351. o _U%!120=-1       :
  352.  SaveRef%
  353. p _U%!124=-1       :
  354.  DragRef%
  355. _U%!128=0        :
  356.  RAMPtr%
  357. r _U%!132=0        :
  358.  RAMSize%
  359. s<_U%!136=-1       :
  360.  FileSize% from last datasave message
  361. t<_U%!140=-1       :
  362.  FileType% from last datasave message
  363. u<_U%!144=-1       :
  364.  FileBuff% from last datasave message
  365. _U%!148=0        :
  366.  taskid%
  367. wB_U%!152=0        :
  368.  Buffer list of loaded files, -1 terminator
  369. xE_U%!156=0        :
  370.  HeapBlock with copy of DataSave message block
  371. y3                 :
  372.  for when RAM transfer fails
  373. z5_U%!176=0        :
  374.  Pointer to current menu title
  375. {8_U%!180=0        :
  376.  nr of 'hotkey' events registered
  377. |9_U%!184=0        :
  378.  Pointer to list of static windows
  379. }/_U%!188=0        :
  380.  to shell_AppDir$ buffer
  381. ~3_U%!192=0        :
  382.  to shell_AppDataDir$ buffer
  383. 0_U%!196=0        :
  384.  to shell_AppName$ buffer
  385. @_U%!200=0        :
  386.  window handle from last DataSave message
  387. >_U%!204=0        :
  388.  icon handle from last DataSave message
  389. >_U%!208=-1       :
  390.  helphandle% (task handle of StrongHlp)
  391. D_U%!212=-1       :
  392.  icontry%    (used by StrongHlp find routine)
  393. H_U%!216=0        :
  394.  pointer to pending$ buffer for StrongHlp command
  395. ;_U%!220=0        :
  396.  pointer to menu warning event block
  397. ;_U%!224=0        :
  398.  pointer to last menu_warn fn called
  399. I_U%!228=0        :
  400.  handle of warning dialog used for menu items that
  401. :                 :
  402.  have not had a dialog box attached
  403. <_U%!232=
  404. shell_HeapBlockFetch(256):
  405.  fontcounts% array..
  406. =_U%!236=
  407. shell_HeapBlockFetch(256):
  408.  fontbinding% array..
  409. N_U%!240=-1       :
  410.  nr of outline fonts on system, -1 if "FontMenu_Create"
  411. +                 :
  412.  has not been called
  413. G_U%!244=0        :
  414.  ptr to currently selected font name in FontMenu
  415. <_U%!252=0        :
  416.  last known ptr to FontMenu structure
  417. M_U%!256=0        :
  418.  ptr to heapblock holding 'MenusSelectionSoFar' string
  419. L_U%!260=1        :
  420.  SystemFont flag for FontMenu 0 no sysfont, 1 sysfont
  421. 3_U%!264=0        :
  422.  FontMenu is opened (1 or 0)
  423. J_U%!268=0        :
  424.  FontMenu valid selection flag 0 non valid, 1 valid
  425. @_U%!272=0        :
  426.  x coord last mouse click (screen coords)
  427. @_U%!276=0        :
  428.  y coord last mouse click (screen coords)
  429. ;_U%!280=0        :
  430.  m_filedesc% for system message file
  431. ;_U%!284=0        :
  432.  m_buffer%   for system message file
  433. 9_U%!304=0        :
  434.  pointer to OpenWindow event block
  435. :_U%!308=0        :
  436.  pointer to CloseWindow event block
  437. D_U%!316=0        :
  438.  OS version nr as returned by Wimp_Initialise
  439. 8_U%!324=0        :
  440.  stores command line arg (if any)
  441. 3_U%!336=0        :
  442.  Nr of copies still to print
  443. 1_U%!340=0        :
  444.  Popup handler event block
  445. )_U%!344=0        :
  446.  Txt control block
  447. shell_MemFill(_U%!232,256,0)
  448. shell_MemFill(_U%!236,256,0)
  449. 5shell_AppDir$=
  450. shell_OSVarGetVal( "Obey$Dir", 1 )
  451. 1shell_AppName$=
  452. shell_Leaf(shell_AppDir$),2)
  453. 6_U%!188=
  454. shell_HeapBlockFetch((
  455.  shell_AppDir$)+1)
  456. 7_U%!196=
  457. shell_HeapBlockFetch((
  458.  shell_AppName$)+1)
  459. &temp%=_U%!188:$temp%=shell_AppDir$
  460. 'temp%=_U%!196:$temp%=shell_AppName$
  461.  Check if WimpEXT module is loaded..
  462. =temp% = 
  463. shell_OSModuleCheckVersion("WimpExtension",1.98)
  464.  temp% = 
  465.  _U%!100 = _U%!100 
  466.  1 << 6 :
  467.  Set WExt flag bit..
  468. temp% = 
  469. RO3_Present
  470.  temp% = 
  471.  _U%!100 = _U%!100 
  472.  1 << 10:
  473.  Set RO3  flag bit..
  474. shell_InteractiveHelpOn
  475. start_interval% = 100
  476. shell_PollSetInterval( start_interval% )
  477. shell_PollSetPrevInterval( start_interval% )
  478.  "OS_ReadMonotonicTime" 
  479.  _POLL_EARLIEST_TIME%
  480. +_POLL_EARLIEST_TIME% += start_interval%
  481.  Now have a look at the command line used to start the program...
  482. )cmdline$ = 
  483. shell_OSReadCommandArg(1)
  484.  cmdline$ <> "" 
  485. B  _U%!100 = _U%!100 
  486.  1 << 5:
  487.  set 'command line args' flag...
  488.  Store command line for later reference...
  489. 5  temp% = 
  490. shell_HeapBlockFetch( 
  491.  cmdline$ + 1 )
  492. +  $(temp%) = cmdline$ : _U%!324 = temp%
  493. *|Stop PROCshell_Init
  494. !*|Start PROCshell_InitModules
  495. shell_InitModules
  496.  void%
  497.  void% = 
  498. _shell_Bumpers_Init
  499. "void% = 
  500. _shell_CaretMove_Init
  501. !void% = 
  502. _shell_DataLoad_Init
  503. !void% = 
  504. _shell_DataSave_Init
  505. void% = 
  506. _shell_Debug_Init
  507. void% = 
  508. _shell_Errors_Init
  509. void% = 
  510. _shell_Evnts_Init
  511. void% = 
  512. _shell_ExReg_Init
  513. void% = 
  514. _shell_Files_Init
  515.  void% = 
  516. _shell_Iconbar_Init
  517. void% = 
  518. _shell_Icons_Init
  519.  void% = 
  520. _shell_IntHelp_Init
  521. void% = 
  522. _shell_Memory_Init
  523. void% = 
  524. _shell_Menus_Init
  525. !void% = 
  526. _shell_MenuList_Init
  527. !void% = 
  528. _shell_Messages_Init
  529. void% = 
  530. _shell_OS_Init
  531.  void% = 
  532. _shell_Pointer_Init
  533. void% = 
  534. _shell_Poll_Init
  535. void% = 
  536. _shell_PopUps_Init
  537. "void% = 
  538. _shell_ProgEvnts_Init
  539.  void% = 
  540. _shell_Sliders_Init
  541.  void% = 
  542. _shell_Sprites_Init
  543.  void% = 
  544. _shell_Strings_Init
  545. #void% = 
  546. _shell_StaticList_Init
  547. #void% = 
  548. _shell_WindowList_Init
  549.  void% = 
  550. _shell_Windows_Init
  551.  *|Stop PROCshell_InitModules
  552. "*|Start FNshell_GetCmdLineArgs
  553. shell_GetCmdLineArgs
  554.  cmdline$
  555.  _U%!324 <> 0 
  556.   cmdline$ = $(_U%!324)
  557.  PROCshell_Tracef0("GetCmdLineArgs:cmdline was "+cmdline$)
  558. = cmdline$
  559. !*|Stop FNshell_GetCmdLineArgs
  560.  --------------------------------------------------------------------------
  561.  --------------------------------------------------------------------------
  562. *|Start FNshell_GetAppDir
  563. shell_GetAppDir
  564.  temp%
  565. temp%=_U%!188
  566. =$temp%
  567. *|Stop FNshell_GetAppDir
  568. !*|Start FNshell_GetAppDataDir
  569. shell_GetAppDataDir
  570.  temp%
  571. temp%=_U%!192
  572. =$temp%
  573.  *|Stop FNshell_GetAppDataDir
  574. *|Start FNshell_GetAppName
  575. shell_GetAppName
  576.  temp%
  577. temp%=_U%!196
  578. =$temp%
  579. *|Stop FNshell_GetAppName
  580. #*|Start PROCshell_ResourcesInit
  581. shell_ResourcesInit
  582.  shell_AppDataDir$,temp%,shell_AppName$,shell_AppDir$,use_3d%
  583.  YEigFactor%,XEigFactor%
  584. $shell_AppName$=
  585. shell_GetAppName
  586. #shell_AppDir$ =
  587. shell_GetAppDir
  588. shell_OSVarExists( shell_AppName$+"Res$Path" ) 
  589. 3  _U%!100=_U%!100 
  590.  1<<3:
  591.  set 'ResFind' flag..
  592. shell_OSVarExists( shell_AppName$ + "Data$Dir" ) 
  593. L  shell_AppDataDir$=
  594. shell_OSVarGetVal( shell_AppName$ + "Data$Dir", 1 )
  595.  <  _U%!192=
  596. shell_HeapBlockFetch((
  597.  shell_AppDataDir$)+1)
  598. !,  temp%=_U%!192:$temp%=shell_AppDataDir$
  599. #8  _U%!192=
  600. shell_HeapBlockFetch((
  601.  shell_AppDir$)+1)
  602. $(  temp%=_U%!192:$temp%=shell_AppDir$
  603.  _U%!100 
  604.  1<<3 
  605.  ResFind initialised..
  606. *|define Using_ResFind
  607. shell_FileExists(shell_AppName$+"Res:Messages") 
  608. +H    
  609. shell_MessagesInit(shell_AppName$+"Res:Messages",_U%!68,_U%!64)
  610. shell_FileExists(shell_AppName$+"Res:ShellMsgs") 
  611. .J   
  612. shell_MessagesInit(shell_AppName$+"Res:ShellMsgs",_U%!280,_U%!284)
  613. 0E    
  614. shell_MessagesInit("EvntShellRes:ShellMsgs",_U%!280,_U%!284)
  615.  "XOS_ReadModeVariable",-1,04 
  616.  ,,XEigFactor%
  617.  "XOS_ReadModeVariable",-1,05 
  618.  ,,YEigFactor%
  619.  YEigFactor% = 1 
  620. shell_FileExists(shell_AppName$+"Res:Sprites22") 
  621. 5A    
  622.  Screen mode is hi-res, and hi-res sprite file exists...
  623. 6F    _U%!16 = 
  624. shell_SpriteAreaLoad(shell_AppName$+"Res:Sprites22")
  625. 8;    
  626. shell_FileExists(shell_AppName$+"Res:Sprites") 
  627. 95      
  628.  No hi-res sprite file, load normal one...
  629. :D      _U%!16=
  630. shell_SpriteAreaLoad(shell_AppName$+"Res:Sprites")
  631. ;        
  632. <>      _U%!16=1:
  633.  use wimp sprite pool if no 'Sprites' file
  634. =        
  635.  check if templates need loading
  636. @   use_3d% = 
  637. shell_3DEnabled
  638.  use_3d% 
  639. shell_FileExists(shell_AppName$+"Res:Templates3") 
  640. BD    
  641. shell_TemplatesInit(shell_AppName$+"Res:Templates3", void%)
  642. D=    
  643. shell_FileExists(shell_AppName$+"Res:Templates") 
  644. EF      
  645. shell_TemplatesInit(shell_AppName$+"Res:Templates", void% )
  646. F        
  647.  ResFind NOT initialised..
  648. shell_FileExists(shell_AppDir$+".Messages") 
  649. KD    
  650. shell_MessagesInit(shell_AppDir$+".Messages",_U%!68,_U%!64)
  651. shell_FileExists(shell_AppDir$+".ShellMsgs") 
  652. NG    
  653. shell_MessagesInit(shell_AppDir$+".ShellMsgs",_U%!280,_U%!284)
  654. PE    
  655. shell_MessagesInit("EvntShellRes:ShellMsgs",_U%!280,_U%!284)
  656.  Check if user sprites need loading, but first check if program
  657.  has been started in a hi-res screen mode...
  658.  "XOS_ReadModeVariable",-1,04 
  659.  ,,XEigFactor%
  660.  "XOS_ReadModeVariable",-1,05 
  661.  ,,YEigFactor%
  662.  YEigFactor% = 1 
  663. shell_FileExists(shell_AppDir$+".Sprites22") 
  664. WA    
  665.  Screen mode is hi-res, and hi-res sprite file exists...
  666. XB    _U%!16 = 
  667. shell_SpriteAreaLoad(shell_AppDir$+".Sprites22")
  668. Z7    
  669. shell_FileExists(shell_AppDir$+".Sprites") 
  670. [@      _U%!16=
  671. shell_SpriteAreaLoad(shell_AppDir$+".Sprites")
  672. \        
  673. ]>      _U%!16=1:
  674.  use wimp sprite pool if no 'Sprites' file
  675. ^        
  676.  check if templates need loading
  677. a   use_3d% = 
  678. shell_3DEnabled
  679.  use_3d% 
  680. shell_FileExists(shell_AppDir$+".Templates3") 
  681. cA    
  682. shell_TemplatesInit(shell_AppDir$+".Templates3", void% )
  683. e9    
  684. shell_FileExists(shell_AppDir$+".Templates") 
  685. fB      
  686. shell_TemplatesInit(shell_AppDir$+".Templates", void% )
  687. g        
  688.  "MenuUtil_Initialise"
  689. shell_HeapBlockReturn( _Q% )
  690. nD_Q% = 
  691. shell_HeapBlockFetch( 1024 ) : 
  692.  reduce global wimp block
  693. shell_FileExists( shell_AppDir$ + ".EvntData" ) 
  694. shell_EvntLoad_AllEvnts( shell_AppDir$ + ".EvntData" )
  695.  ERROR 99,"Unable to find EvntData file for this application!"
  696.  ShareWare Banner stuff..
  697. shell_ExReg_ShareBan_Loaded 
  698. shell_ShareBan_ShowBanner
  699. }"*|Stop PROCshell_ResourcesInit
  700. !*|Start FNshell_MessageExpand
  701. shell_MessageExpand(h$)
  702.  s$, m$, index%
  703.     s$=""
  704. h$,"\")>0
  705.   index%=
  706. h$,"\")
  707.   s$+=
  708. h$,index%-1)
  709.   m$=
  710. h$,index%+1,1)
  711.   h$=
  712. h$,index%+2)
  713. #    
  714.  "A":s$+="Click ADJUST to"
  715.  "a":s$+="ADJUST"
  716. '    
  717.  "D":s$+="Drag with SELECT to"
  718. '    
  719.  "d":s$+="Drag with ADJUST to"
  720. 5    
  721.  "G":s$+="This option is greyed out because"
  722. *    
  723.  "R":s$+="Move the pointer right"
  724. #    
  725.  "S":s$+="Click SELECT to"
  726.  "s":s$+="SELECT"
  727.  "T":s$+="This is the"
  728. "    
  729.  "W":s$+="This window is"
  730.  "w":s$+="window"
  731.     s$+="\"+m$
  732. =s$+h$
  733.  ----------------------------------------------------------
  734.  *|Stop FNshell_MessageExpand
  735. !*|Start FNshell_MessageWindow
  736. shell_MessageWindow(text$,cancel%,progname$,head$)
  737.  keys%,err_blk%
  738. 'err_blk%=
  739. shell_HeapBlockFetch(260)
  740. (!err_blk%=0:$(err_blk%+4)=text$+
  741.  head$="" 
  742.  head$="Message from "+progname$
  743.  cancel% 
  744.  "Wimp_ReportError",err_blk%,19,head$ 
  745.  ,keys%
  746.  "Wimp_ReportError",err_blk%,17,head$ 
  747.  ,keys%
  748. shell_HeapBlockReturn(err_blk%)
  749. =keys%
  750.  *|Stop FNshell_MessageWindow
  751. !*|Start FNshell_CreateWindow2
  752. shell_CreateWindow2(title,flags%,fgcol%,bgcol%,maxx%,miny%,l%,b%,r%,t%)
  753. shell_HeapBlockFetch(3000)
  754. ,Q%!0=l%:Q%!4=b%:Q%!8=r%:Q%!12=t%:Q%!16=0
  755. )Q%!20=0:Q%!24=-1:Q%!28=flags%:Q%?32=7
  756. %Q%?33=2:Q%?34=fgcol%:Q%?35=bgcol%
  757. Q%?36=3:Q%?37=1
  758. 'Q%?38=2:Q%?39=0:Q%!40=0:Q%!44=miny%
  759. .Q%!48=maxx%:Q%!52=0:Q%!56=&13D:Q%!60=&3000
  760. 6Q%!68=1:Q%!72=title:Q%!76=-1:Q%!80=
  761. $title:Q%!84=0
  762.  "Wimp_CreateWindow",,Q% 
  763.  handle%
  764. shell_HeapBlockReturn(Q%)
  765. =handle%
  766.  *|Stop FNshell_CreateWindow2
  767. !*|Start FNshell_ClaimKeypress
  768. shell_ClaimKeypress
  769.  Bodge to ensure that shell_OpenWindowDynamic works properly..
  770.  _U%!20<>0 
  771.  "Wimp_CreateMenu",,-1
  772. '  void%=
  773. shell_DeleteWindow(_U%!20)
  774.   _U%!20=0
  775.  *|Stop FNshell_ClaimKeypress
  776.  *|Start PROCshell_CloseWindow
  777.  DEF PROCshell_CloseWindow(wh%)
  778.  LOCAL offset%,blk%,ptr8%,ptr12%,ptr16%,ptr20%,win_blk%,res%
  779.  offset%=FNshell_GetEventListOffset(wh%,-1,_U%+308,12,FALSE)
  780.  IF offset%>=0 THEN
  781.    blk%=_U%!308+offset%
  782.    temp%=blk%!8
  783.  *|ifdef TraceInit
  784.    REM PROCshell_Tracef0("CloseWindow:About to call "+"FN"+$temp%)
  785.  *|endif
  786.    res%=EVAL("FN"+$temp%)
  787.    IF res%=0 THEN ENDPROC
  788.  ENDIF
  789.  win_blk%=FNshell_HeapBlockFetch(60)
  790.  IF wh%>0 THEN
  791.    offset%=FNshell_GetEventListOffset(wh%,-1,_U%+92,24,FALSE)
  792.    IF offset%>-1 THEN
  793.      blk%=(_U%!92)+offset%
  794.      ptr12%=blk%!12:ptr16%=blk%!16:ptr20%=blk%!20
  795.      ctr%=0:ptr8%=blk%!8
  796.      WHILE ptr8%!ctr%<>-1
  797.        REM close pane windows
  798.        win_blk%!0=ptr8%!ctr%
  799.        SYS "Wimp_CloseWindow",,win_blk%
  800.        ctr%+=4
  801.      ENDWHILE
  802.      REM PROCshell_HeapBlockReturn(ptr8%)
  803.      REM PROCshell_HeapBlockReturn(ptr12%)
  804.      REM PROCshell_HeapBlockReturn(ptr16%)
  805.      REM PROCshell_HeapBlockReturn(ptr20%)
  806.    ENDIF
  807.    REM close parent window
  808.    win_blk%!0=wh%:SYS "Wimp_CloseWindow",,win_blk%
  809.  ENDIF
  810.  PROCshell_HeapBlockReturn(win_blk%)
  811.  ENDPROC
  812.  *|Stop PROCshell_CloseWindow
  813. *|Start FNoktodeletew
  814. oktodeletew(handle%)
  815. *|Stop FNoktodeletew
  816. *|Start FNoktoclosew
  817. oktoclosew(handle%)
  818. *|Stop FNoktoclosew
  819. *|Start PROCcliprect
  820. cliprect(b,
  821.  x1%,
  822.  y1%,
  823.  x2%,
  824.  y2%)
  825.  x0%,y0%
  826. lwaorigin(b,x0%,y0%):x1%=b!24-x0%:y1%=b!28-y0%:x2%=b!32-x0%
  827. y2%=b!36-y0%
  828. *|Stop PROCcliprect
  829. &*|Start PROCshell_DoBackgroundTask
  830. shell_DoBackgroundTask
  831. %*|Stop PROCshell_DoBackgroundTask
  832. (*|Start PROCshell_HandleAttachedMenu
  833. shell_HandleAttachedMenu(_Q%,wh%,ih%)
  834.  menu%
  835.  Only executed when SELECT is pressed over an icon that has an
  836.  attached menu..
  837.  ih% <> -1 
  838.  wh% > -1 
  839. #0  menu% = 
  840. shell_GetEventMenu(_Q%!8,wh%,ih%)
  841.  menu% <> 0 
  842. %2    
  843. shell_HandleMenuOpen(_Q%,menu%,wh%,ih%,
  844. *'*|Stop PROCshell_HandleAttachedMenu
  845. *|Start PROCshell_Action
  846. shell_Action(evnt%)
  847.  fn$,menu%,menu$,select$,menu_buffer%,mx%,my%,claimed%
  848.  wh%,ih%,void%,_temp28%,_temp32%,_temp24%,_temp%,fontmenuflag%
  849.  CheckSelect%,offset%,newtime%
  850.  evnt% 
  851.  _EVENT_NULL:
  852.  _closedown% = 
  853. 5.      
  854.  "OS_ReadMonotonicTime" 
  855.  newtime%
  856. 64        
  857.  (newtime% - _POLL_EARLIEST_TIME%) > 0
  858. 73        _POLL_EARLIEST_TIME% += _POLL_INTERVAL%
  859.       
  860. 9(      
  861. shell_ExReg_OLELib_Loaded 
  862. :         
  863. shell_DoOLEHandling
  864.       
  865. <!      
  866. shell_DoBackgroundTask
  867. =)      
  868. shell_SliderDragInProgress 
  869.         
  870. shell_Slider
  871.       
  872. @'        
  873. shell_EvntHandle_IconWatch
  874.       
  875. B1      
  876. shell_Evnts_WritableDragInProgress 
  877. C*        
  878. shell_Evnts_MonitorDragPtrPos
  879.       
  880. E        
  881.  _EVENT_REDRAWWIN:
  882. G$    
  883. shell_RedrawWindow( _Q%!0 )
  884.  _EVENT_OPENWIN:
  885. J(    
  886. shell_OpenWindow( _Q%!0, 
  887. , 0 )
  888.  _EVENT_CLOSEWIN:
  889. M.    
  890. shell_EvntHandle_WindowClose( _Q%!0 )
  891.  _EVENT_PTRLEAVING
  892. P6    
  893. shell_EvntHandle_PointerLeavingWindow( !_Q% )
  894.  _EVENT_PTRENTERING
  895. S7    
  896. shell_EvntHandle_PointerEnteringWindow( !_Q% )
  897.  _EVNT_MSECLICK
  898.          mx% =_Q%!0
  899.          my% =_Q%!4
  900. X(         _U%!272=_Q%!0:_U%!276=_Q%!4
  901. Y/         _EVNTS_LAST_MOUSEBUTTON%   = _Q%!8
  902. Z0         _EVNTS_LAST_WINDOWCLICKED% = _Q%!12
  903. [0         _EVNTS_LAST_ICONCLICKED%   = _Q%!16
  904. \E         
  905.  PROCshell_Tracef0("Action:Mouse_Click event detected")
  906. ]j         
  907.  PROCshell_Tracef0("Action:Window Handle was &"+STR$~_Q%!12+" Icon Handle was "+STR$ _Q%!16)
  908.          
  909.  _Q%!8 
  910. _j           
  911. shell_EvntHandle_ClickSelect( 
  912. Evnts_GetLastWindowClicked, 
  913. Evnts_GetLastIconClicked )
  914. `j           
  915. shell_EvntHandle_ClickMenu(   
  916. Evnts_GetLastWindowClicked, 
  917. Evnts_GetLastIconClicked )
  918. aj           
  919. shell_EvntHandle_ClickAdjust( 
  920. Evnts_GetLastWindowClicked, 
  921. Evnts_GetLastIconClicked )
  922.          
  923. dH         _U%!128 = 0:
  924.  set RAMPtr% to 0 in case a RAMFetch follows..
  925. eE         
  926.  have to use last window/icon handles from _U% block as
  927. f?         
  928.  _Q% block could be corrupted by other poll calls
  929. g0         
  930. shell_SliderDragInProgress = 
  931. h;           
  932.  it was not a slider drag that just ended..
  933. i,           
  934. shell_EvntHandle_UserDragEnd
  935. j0           
  936. shell_EvntHandle_DataSaveEndDrag
  937.          
  938. l5           
  939.  unset 'slider drag in progress' flag
  940. m#           
  941. shell_SliderDragEnd
  942.          
  943. pC         
  944.  PROCshell_Tracef0("Action:keypress is="+STR$ _Q%!24)
  945.          
  946.  _Q%!24 
  947. r*         
  948.  &0D,394,398,399,410,430,431
  949. sF           claimed%=
  950. shell_WritableIconHandler(_Q%!0,_Q%!4,_Q%!24)
  951.          
  952. u4           claimed%=
  953. shell_HotKeyProcess(_Q%!24)
  954.          
  955.          
  956.  claimed% 
  957. xP           
  958.  PROCshell_Tracef0("Action:Keypress not claimed, passing it on")
  959. y*           
  960.  "Wimp_ProcessKey",_Q%!24
  961.          
  962. {Q           
  963.  PROCshell_Tracef0("Action:Keypress claimed by this application")
  964.          
  965. ~0         
  966. shell_EvntHandle_MenuSelect( _Q% )
  967.  17,18:
  968. shell_Receive( _Q% )
  969.  19   :
  970. shell_UserMessageAcknowledge(_Q%)
  971. *|Stop PROCshell_Action
  972. $*|Start PROCshell_HandleMenuOpen
  973. shell_HandleMenuOpen( _Q%, menu%, wh%, ih%, popup% )
  974.  i_blk%,w_blk%
  975.  This routine handles the case of 'popup' menus, adjusting the menu
  976.  and pointer positions before opening to conform to the Style Guide
  977.  recommendations..
  978.  popup% = 
  979.  Menu is a normal menu attached to a window, or to an icon on the
  980.  iconbar, so MenuUtils will open it in the correct place..
  981. shell_OpenMenu(_Q%!0,_Q%!4,menu%)
  982.  Menu is a 'popup', i.e attached to a specific icon in a window that
  983.  is not the iconbar. Therefore open the menu to right right of the
  984.  icon as required by the Style Guide..
  985. *  i_blk% = 
  986. shell_HeapBlockFetch( 50 )
  987. *  w_blk% = 
  988. shell_HeapBlockFetch( 36 )
  989.  read coordinates of icon that has menu attached and open menu
  990.  to the right of it..
  991. #  i_blk%!0 = wh%:i_blk%!4 = ih%
  992.  "Wimp_GetIconState",,i_blk%
  993.   w_blk%!0 = wh%
  994.  "Wimp_GetWindowState",,w_blk%
  995. shell_OpenMenu( w_blk%!4 + i_blk%!16 + 64, _Q%!4, menu% )
  996.  And move the pointer appropriately..
  997.  w_blk%!4 + i_blk%!16 + 64, _Q%!4
  998. shell_HeapBlockReturn( i_blk% )
  999. shell_HeapBlockReturn( w_blk% )
  1000. #*|Stop PROCshell_HandleMenuOpen
  1001. (*|Start PROCshell_ActionAdjustButton
  1002. shell_ActionAdjustButton
  1003.  flags%,fn$,void%,sel_blk%,ctr%
  1004. hsel_blk% = 
  1005. shell_HeapBlockFetch(12 + (
  1006. shell_WindowCountIcons( 
  1007. Evnts_GetLastWindowClicked ) * 32))
  1008. *|ifdef TraceInit
  1009.  PROCshell_Tracef0("Action:Mouse Button was ADJUST")
  1010. *|endif
  1011.  PROCshell_HandleAttachedMenu( _Q%, FNEvnts_GetLastWindowClicked, FNEvnts_GetLastIconClicked )
  1012.  Check if icon is a radio one and window is not the iconbar, if so select
  1013.  icon to avoid Wimp deselecting it...
  1014. Evnts_GetLastWindowClicked > 0 
  1015.  "Wimp_WhichIcon", 
  1016. Evnts_GetLastWindowClicked, sel_blk%,&0000F000,&0000B000
  1017.   ctr% = 0
  1018.  sel_blk%!ctr% <> -1
  1019.  sel_blk%!ctr% = 
  1020. Evnts_GetLastIconClicked 
  1021. shell_IconSet( 
  1022. Evnts_GetLastWindowClicked, 
  1023. Evnts_GetLastIconClicked, 1 )
  1024.     ctr% += 4
  1025. Evnts_GetLastIconClicked = 0 
  1026. shell_HandleAttachedDataSave(_Q%, 
  1027. Evnts_GetLastWindowClicked, 
  1028. Evnts_GetLastIconClicked )
  1029. shell_EvntHandle_ClickAdjust( 
  1030. Evnts_GetLastWindowClicked, 
  1031. Evnts_GetLastIconClicked )
  1032. shell_HeapBlockReturn(sel_blk%)
  1033. '*|Stop PROCshell_ActionAdjustButton
  1034. *|Start FNshiftmenuclick
  1035. shiftmenuclick(wh%,ih%)
  1036. *|Stop FNshiftmenuclick
  1037. "*|Start PROCshell_RedrawWindow
  1038. shell_RedrawWindow( handle% )
  1039.  more%,fn$,x0%,y0%,blk%
  1040. 'blk% = 
  1041. shell_HeapBlockFetch( 100 )
  1042. shell_FatalError
  1043. blk%!0 = handle%
  1044.  "Wimp_RedrawWindow", , blk% 
  1045.  more%
  1046. x0% = blk%!04 - blk%!20
  1047. y0% = blk%!16 - blk%!24
  1048.  more%
  1049.  "Interface_Render3dWindow",,blk%
  1050. shell_EvntHandle_Redraw( handle%, blk%, x0%, y0% )
  1051.  "Wimp_GetRectangle",,blk% 
  1052.  more%
  1053. shell_HeapBlockReturn( blk% )
  1054. !*|Stop PROCshell_RedrawWindow
  1055. *|Start PROCshell_Receive
  1056. shell_Receive( _Q% )
  1057.  temp%, void%, colour_none_selected%
  1058.  _Q%!16 
  1059.  _MESSAGE_QUIT:
  1060. shell_Exit
  1061.         
  1062.  _MESSAGE_DATASAVE:
  1063. shell_DataSave(_Q%)
  1064.  _MESSAGE_DATASAVEACK:
  1065. shell_DataSaveAck(_Q%)
  1066.  _MESSAGE_DATALOAD:
  1067. ,    
  1068. shell_EvntHandle_DataLoad( _Q%, 
  1069.  _MESSAGE_DATALOADACK:
  1070. shell_DataLoadAck(_Q%)
  1071. ,    
  1072. shell_EvntHandle_DataLoad( _Q%, 
  1073.  _MESSAGE_RAMFETCH:
  1074. shell_RAMFetch(_Q%)
  1075.  _MESSAGE_RAMTRANSMIT:
  1076. shell_RAMTransmit(_Q%)
  1077.  _MESSAGE_PREQUIT:
  1078.     '    
  1079. shell_ProgEvnts_PreQuit( _Q% )
  1080.  _MESSAGE_PALETTECHANGE:
  1081. '    
  1082. shell_ProgEvnts_PaletteChanged
  1083.  _MESSAGE_SAVEDESKTOP:
  1084. .    
  1085. shell_ProgEvnts_SaveDesktop( _Q%!20 )
  1086.  _MESSAGE_SHUTDOWN:
  1087. !    
  1088. shell_ProgEvnts_Shutdown
  1089.  _MESSAGE_HELP:
  1090. #    
  1091. shell_InteractiveHelp(_Q%)
  1092.  _MESSAGE_MENUWARNING:
  1093. shell_MenuWarning(_Q%)
  1094.  _MESSAGE_MODECHANGE:
  1095. $    
  1096. shell_ProgEvnts_ModeChanged
  1097.  _MESSAGE_COLOURPICKERCOLOURCHOICE:
  1098. .    colour_none_selected% = ( _Q%!24 
  1099. E    
  1100. shell_ColourPickerSelection( _Q%!28, colour_none_selected% )
  1101.  _MESSAGE_DESKFONT_CHANGED:
  1102. "2    
  1103. shell_ProgEvnts_DeskFontChanged( _Q%!20 )
  1104. #%    
  1105. shell_ExReg_Fonts_Loaded 
  1106. $5      
  1107. shell_Fonts_DeskTopFont_Selected( _Q%!20 )
  1108. %        
  1109.  _MESSAGE_TASKINIT:
  1110. (N    
  1111. shell_ProgEvnts_TaskInitialise( _Q%!4, 
  1112. shell_GetString( _Q% + 28 ) )
  1113. )B    
  1114.  _U%!208 = -1 
  1115. shell_GetString(_Q% + 28)="StrongHelp" 
  1116.       _U%!208 = _Q%!4
  1117. +h      
  1118. shell_StrongHlpMsg("Help_Install -DieWithTask " + 
  1119. shell_GetAppDir + "." + 
  1120. shell_GetAppName)
  1121.       temp% = _U%!216
  1122.       
  1123.  $temp% <> "" 
  1124. .#        
  1125. shell_HelpWord($temp%)
  1126. /+        
  1127. shell_HeapBlockReturn(_U%!216)
  1128.         _U%!216 = 0
  1129.       
  1130. 2        
  1131.  _MESSAGE_TASKCLOSEDOWN:
  1132. 4/    
  1133. shell_ProgEvnts_TaskCloseDown( _Q%!4 )
  1134. 5(    
  1135.  _Q%!4 = _U%!208 
  1136.  _U%!208 = -1
  1137.  _MESSAGE_TASKNAMEIS:
  1138. 8B    
  1139.  PROCshell_Tracef0("Receive:TaskNameIs message received")
  1140. 95    
  1141. shell_GetString(_Q% + 28) = "StrongHelp" 
  1142. :>      _U%!208 = _Q%!20:
  1143.  store task handle of StrongHlp...
  1144. ;        
  1145.       
  1146. shell_ScanForHelp
  1147. =        
  1148.  &80140
  1149.  Message_PrintFile
  1150. shell_HandlePrintFile(_Q%)
  1151.  &80143
  1152.  Message_PrintError
  1153. shell_HandlePrintError(_Q%)
  1154.  &80145
  1155.  Message_PrintTypeOdd
  1156. shell_HandlePrintTypeOdd(_Q%)
  1157.  &80147
  1158.  Message_SetPrinter
  1159. shell_HandleSetPrinter(_Q%)
  1160. shell_HandleUnknownMessage2(_Q%)
  1161. *|Stop PROCshell_Receive
  1162.  *|Start PROCshell_Message_ModeChange
  1163.  DEF PROCshell_Message_ModeChange(_Q%)
  1164.  LOCAL offset%,ctr%,sw_list%,w_blk%
  1165.  sw_list%=_U%!184
  1166.  IF _U%!160>0 THEN
  1167.    REM PROCshell_Tracef0("Message_ModeChange:ModeChange message received")
  1168.    temp%=_U%!160
  1169.    void%=EVAL("FN"+$temp%)
  1170.  ENDIF
  1171.  REM SYS "FontWindow_ModeChange",_U%!148
  1172.  REM Now check if any windows containing panes are open, and if so
  1173.  REM reopen them to avoid problems with panes appearing in the wrong
  1174.  REM position...
  1175.  w_blk%=FNshell_HeapBlockFetch(100)
  1176.  IF sw_list%<>0 THEN
  1177.  *|ifdef TraceInit
  1178.    REM PROCshell_Tracef0("Message_ModeChange:Checking static window list for pane events")
  1179.  *|endif
  1180.    WHILE sw_list%!ctr%<>-1
  1181.      REM now check pane event list..
  1182.      offset%=FNshell_GetEventListOffset(sw_list%!ctr%,-1,_U%+92,24,FALSE)
  1183.      IF offset%>-1 THEN
  1184.  *|ifdef TraceInit
  1185.        REM PROCshell_Tracef0("Message_ModeChange:Static window handle found")
  1186.  *|endif
  1187.        IF FNshell_WindowIsOpen(sw_list%!ctr%) THEN
  1188.  *|ifdef TraceInit
  1189.          REM PROCshell_Tracef0("Message_ModeChange:Window is open..")
  1190.  *|endif
  1191.          REM Reopen window if already open..
  1192.          !w_blk%=sw_list%!ctr%
  1193.          SYS "Wimp_CloseWindow",,w_blk%
  1194.          PROCshell_OpenWindow(sw_list%!ctr%,0,-1)
  1195.        ENDIF
  1196.      ENDIF
  1197.      ctr%+=4
  1198.    ENDWHILE
  1199.  ENDIF
  1200.  PROCshell_HeapBlockReturn(w_blk%)
  1201.  ENDPROC
  1202.  *|Stop PROCshell_Message_ModeChange
  1203. +*|Start PROCshell_HandleUnknownMessage2
  1204. shell_HandleUnknownMessage2(_Q%)
  1205.  message$
  1206.  I want to handle message &43B00 here as I use it for
  1207.  communications between EvntShell applications..
  1208.  _Q%!16 
  1209.  &43B00:
  1210.  incoming EvntShell message...
  1211.     message$=$(_Q%+20)
  1212. :    
  1213. message$,30)="EvntShellLib:ShellDBug started" 
  1214.       
  1215.  _U%!100 
  1216.  1<<4 
  1217. *        
  1218.  trace init message pending..
  1219. (        _U%!100 = (_U%!100 
  1220.  1 << 4)
  1221. c        
  1222. shell_BroadcastMessage(&43B00,"ShellDBug:Init Debug messages from "+
  1223. shell_GetAppName)
  1224.       
  1225.         
  1226. 5    
  1227. message$,25)="EvntShellLib:TraceInitAck" 
  1228. O      
  1229.  unset trace init message pending flag, ShellDBug has acknowledged..
  1230. "      _U%!100=(_U%!100 
  1231.  1<<4)
  1232.         
  1233. 0    
  1234. message$,20)="EvntShellLib:TraceOn" 
  1235.       
  1236. shell_TraceOn
  1237.         
  1238. 1    
  1239. message$,21)="EvntShellLib:TraceOff" 
  1240.       
  1241. shell_TraceOff
  1242.         
  1243. 8    
  1244. message$,28)="EvntShellLib:ListClickSelect" 
  1245.        
  1246. shell_ListClickSelect
  1247.         
  1248. 6    
  1249. message$,26)="EvntShellLib:ListClickMenu" 
  1250.       
  1251. shell_ListClickMenu
  1252.         
  1253. 8    
  1254. message$,28)="EvntShellLib:ListClickAdjust" 
  1255.        
  1256. shell_ListClickAdjust
  1257.         
  1258. 5    
  1259. message$,25)="EvntShellLib:ListHelpTags" 
  1260.       
  1261. shell_ListHelpTags
  1262.         
  1263. 4    
  1264. message$,24)="EvntShellLib:ListBumpers" 
  1265.       
  1266. shell_ListBumpers
  1267.         
  1268. 6    
  1269. message$,26)="EvntShellLib:ListPointerIn" 
  1270.       
  1271. shell_ListPointerIn
  1272.         
  1273. 7    
  1274. message$,27)="EvntShellLib:ListPointerOut" 
  1275.       
  1276. shell_ListPointerOut
  1277.         
  1278. 5    
  1279. message$,25)="EvntShellLib:ListDataLoad" 
  1280.       
  1281. shell_ListDataLoad
  1282.         
  1283. 5    
  1284. message$,25)="EvntShellLib:ListDataSave" 
  1285.       
  1286. shell_ListDataSave
  1287.         
  1288.  Pass message block on in case the user wants it too..
  1289. shell_HandleUnknownMessage(_Q%)
  1290. **|Stop PROCshell_HandleUnknownMessage2
  1291. **|Start PROCshell_HandleUnknownMessage
  1292. shell_HandleUnknownMessage(_Q%)
  1293. )*|Stop PROCshell_HandleUnknownMessage
  1294. *|Start PROCshell_RAMFetch
  1295. shell_RAMFetch(_Q%)
  1296.  RAMFetch_buffer%,len_data%,done%
  1297. done%=
  1298.  If the address in the data save event block <&8000 then it is an
  1299.  estimated size and the file is not already present in a RAM buffer.
  1300.  In this case ignore RAMFetch message as the data will be written to a
  1301.  file anyway..
  1302.  _U%!144>&8000 
  1303.  Send file to application
  1304.  send RAMTransmit message...
  1305. *|ifdef TraceInit
  1306.  PROCshell_Tracef0("RAMFetch:RAMFetch called..")
  1307. *|endif
  1308.   _Q%!12=_Q%!08
  1309. +  _Q%!16=7:
  1310.  message action RAMTransmit
  1311.  get buffer length..
  1312.   len_data%=_U%!136
  1313.  _U%!140=&FF9 
  1314. H    
  1315.  kludge for sprite files because when saving to a physical file
  1316. I    
  1317.  with "OS_SpriteOp" the first word is dropped. Hence for the RAM
  1318. I    
  1319.  save we have to incrememt the address the data is held at by 4!
  1320. M    
  1321.  The estimated size has already been kludged in shell_AttachDataSave
  1322.     _U%!144+=4
  1323.  (len_data%-_U%!128)<_Q%!24 
  1324. &    
  1325.   This will be the last block
  1326.      _Q%!24=len_data%-_U%!128
  1327.     done%=
  1328. *|ifdef TraceInit
  1329.  PROCshell_Tracef0("RAMFetch:Sending block")
  1330. *|endif
  1331.  "Wimp_TransferBlock",_U%!148,_U%!144+_U%!128,_Q%!04,_Q%!20,_Q%!24
  1332.  "Wimp_SendMessage",17,_Q%,_Q%!04
  1333.    _U%!120=_Q%!8  :
  1334.  SaveRef%
  1335.   _U%!128+=_Q%!24:
  1336.  RAMPtr%
  1337.  done% 
  1338.  _U%!128=0
  1339. *|Stop PROCshell_RAMFetch
  1340. !*|Start PROCshell_RAMTransmit
  1341. shell_RAMTransmit(_Q%)
  1342.  offset%,blk%,f_name$,temp%
  1343.  Receive file from application via RAM transfer..
  1344.  _Q%!12=_U%!112 
  1345.   _U%!128+=_Q%!24
  1346.  _Q%!24<_U%!132 
  1347. !    
  1348.  This was the last block
  1349. *|ifdef TraceInit
  1350.  PROCshell_Tracef0("RAMTransmit:Last block received")
  1351. *|endif
  1352. t    offset%=
  1353. shell_GetEventListOffset( 
  1354. Evnts_GetLastWindowClicked, 
  1355. Evnts_GetLastIconClicked, _U% + 96, 16, 
  1356.     blk%=_U%!96+offset%
  1357. *|ifdef TraceInit
  1358.  PROCshell_Tracef0("RAMTransmit:_U%!28="+STR$ _U%!28)
  1359.  PROCshell_Tracef0("RAMTransmit:_U%!32="+STR$ _U%!32)
  1360.  PROCshell_Tracef0("RAMTransmit:offset%="+STR$ offset%)
  1361. *|endif
  1362. 3    
  1363.  now call user function after file load...
  1364. L    
  1365.  use copy of datasave message block to find file type, file name...
  1366.     temp%=_U%!156
  1367.     *    f_name$=
  1368. shell_GetString(temp%+44)
  1369. K    
  1370. shell_UserFNLoadFile(temp%!40,_U%!152,blk%!8,f_name$,_U%!132,blk%)
  1371. '    
  1372.  There are more blocks to come
  1373. *|ifdef TraceInit
  1374.  PROCshell_Tracef0("RAMTransmit:Block received")
  1375. *|endif
  1376. =    
  1377.  check size of incoming block and increase buffer if
  1378.  required...
  1379.  _U%!128>_U%!132 
  1380. *|ifdef TraceInit
  1381.  PROCshell_Tracef0("RAMTransmit:Increasing buffer size..")
  1382. *|endif
  1383. A      _U%!152=
  1384. shell_HeapBlockExtend(_U%!152,_U%!128,_U%!132)
  1385.         
  1386.     _Q%!12=_Q%!08
  1387.     _Q%!16=6
  1388.     _Q%!20=_U%!152+_U%!128
  1389.     _Q%!24=_U%!132
  1390. +    
  1391.  "Wimp_SendMessage",18,_Q%,_Q%!04
  1392.     _U%!112=_Q%!08
  1393.  too much data sent...
  1394. shell_HeapBlockReturn(_U%!152)
  1395.   _U%!152=0
  1396. shell_OK(
  1397. shell_MessageNoArgs("SHELLMSG15"))
  1398. ' *|Stop PROCshell_RAMTransmit
  1399. *|Start FNshell_LoadFile
  1400. shell_LoadFile(Scrap%)
  1401.  Name$,FileSize%,Flags%,loadloc%
  1402. +"Name$=
  1403. shell_GetString(_Q%+44)
  1404. ,&FileSize%=
  1405. shell_FileLength(Name$)
  1406.  FileSize%<0 
  1407. shell_OK(
  1408. shell_MessageNoArgs("SHELLMSG16"))
  1409. .-loadloc%=
  1410. shell_HeapBlockFetch(FileSize%)
  1411.  "XOS_File",16,Name$,loadloc%,0 
  1412.  ;Flags%
  1413. shell_VFlag(Flags%) 
  1414. shell_HeapBlockReturn(loadloc%)
  1415.  PROCshell_OK(FNshell_MessageNoArgs("SHELLMSG17"))
  1416. *|ifdef TraceInit
  1417.  PROCshell_Tracef0("LoadFile:File "+Name$+" loaded ok at &"+STR$~loadloc%)
  1418. *|endif
  1419.  Stuff for fileinfo box...........
  1420.  PROCDate(FNFileTimeAndDate(Name$))
  1421.  IF Scrap% THEN
  1422.    SYS "XOS_FSControl",27,(_Q%+44),,2
  1423.    PROCModified(TRUE)
  1424.  ELSE
  1425.    PROCName(Name$)
  1426.    PROCType(_Q%!40)
  1427.    PROCModified(FALSE)
  1428.  ENDIF
  1429.  PROCNewFile
  1430. =loadloc%
  1431. *|Stop FNshell_LoadFile
  1432. *|Start FNshell_VFlag
  1433. shell_VFlag(Flags%)
  1434. =((Flags% 
  1435.  %0001)=%0001)
  1436. *|Stop FNshell_VFlag
  1437. *|Start PROCshell_Exit
  1438. shell_Exit
  1439.  ms_desc%
  1440. ms_desc%=_U%!68
  1441.  "XMessageTrans_CloseFile",ms_desc%
  1442.  "XOS_Module",7,,ms_desc%
  1443. *|ifdef TraceInit
  1444.  PROCshell_Tracef0("Exit:Application closing down")
  1445. *|endif
  1446. shell_TraceExit
  1447.  "XHourglass_Smash"
  1448.  "XWimp_DragBox",,-1
  1449. shell_WimpCloseDown_I(_U%!148)
  1450. *|Stop PROCshell_Exit
  1451. *|Start PROCshell_DataSave
  1452. shell_DataSave(_Q%)
  1453.  temp%,offset%,blk%,loop%
  1454.  Called when another application wants to save data to our one..
  1455. *|ifdef TraceInit
  1456.  PROCshell_Tracef0("DataSave:DataSave message received")
  1457. *|endif
  1458.  Receive file from application, but check first it didn't come from
  1459.  this one!
  1460.  _Q%!04<>_U%!148 
  1461.  check event list for window/icon at this point to see
  1462.  which filetypes are valid...
  1463. nB  offset%=
  1464. shell_GetEventListOffset(_Q%!20,_Q%!24,_U%+96,16,
  1465.  offset%>-1 
  1466.     blk%=_U%!96+offset%
  1467. q-    
  1468. shell_CheckType(_Q%!40,blk%!8,
  1469. *|ifdef TraceInit
  1470. sP      
  1471.  PROCshell_Tracef0("DataSave:Filetype recognized (&"+STR$~_Q%!40+")")
  1472. *|endif
  1473. u)      
  1474. shell_TopBitLoadInProgress 
  1475. vN        
  1476.  'no load' load taking place, just need the full filename so that
  1477. wO        
  1478.  the user app can do the load - therefore send Message_DataSaveAck
  1479. x/        
  1480.  with Wimp$Scrap as the filename..
  1481. *|ifdef TraceInit
  1482. z>        
  1483.  PROCshell_Tracef0("DataSave:'no load' flag set")
  1484. {G        
  1485.  PROCshell_Tracef0("DataSave:Sending Message_DataSaveAck")
  1486. *|endif
  1487.         _Q%!00=256
  1488. ~B        _Q%!12=_Q%!08:_Q%!36=-1:_Q%!16=2:
  1489.  Message_DataSaveAck
  1490. 6        $(_Q%+44)=
  1491. shell_GetAppDir+".ScrapFile"+
  1492. .       
  1493.  "Wimp_SendMessage",18,_Q%,_Q%!04
  1494.       
  1495. M        
  1496.  Normal load from another application therefore offer to perform
  1497. 9        
  1498.  a RAM file transfer with Message_RAMFetch..
  1499. M        
  1500.  Make a copy of the message block as I need it when RAM transfer
  1501. <        
  1502.  is not supported by the sender of this message
  1503. G        
  1504. shell_HeapBlockReturn(_U%!156):
  1505.  return temp message blk..
  1506. 4        _U%!156=
  1507. shell_HeapBlockFetch((_Q%!0)+8)
  1508.         temp%=_U%!156
  1509. 9        
  1510.  loop%=0 
  1511.  _Q%!0 
  1512.  first word is size...
  1513. #          temp%!loop%=_Q%!loop%
  1514.         
  1515.  loop%
  1516. @        
  1517.  store destination window/icon handles for later...
  1518. /        _EVNTS_LAST_WINDOWCLICKED% = _Q%!20
  1519. /        _EVNTS_LAST_ICONCLICKED%   = _Q%!24
  1520.         _U%!128=0
  1521. /        _U%!132=_Q%!36:
  1522.  RAMSize%=est_size%
  1523. 5        
  1524.  set up heapblock to hold loaded file...
  1525. 1        _U%!152=
  1526. shell_HeapBlockFetch(_Q%!36)
  1527.         
  1528.  And here we go !
  1529.         _Q%!00=28
  1530.         _Q%!12=_Q%!08
  1531. )        _Q%!16=6:
  1532.  Message_RAMFetch..
  1533. "        _Q%!20=_U%!152+_U%!128
  1534.         _Q%!24=_U%!132
  1535. /        
  1536.  "Wimp_SendMessage",18,_Q%,_Q%!04
  1537.         _U%!112=_Q%!08
  1538. *|ifdef TraceInit
  1539. D        
  1540.  PROCshell_Tracef0("DataSave:Sending Message_RAMFetch")
  1541. *|endif
  1542.       
  1543.         
  1544. *|ifdef TraceInit
  1545. A      
  1546.  PROCshell_Tracef0("DataSave:Filetype NOT recognized")
  1547. *|endif
  1548.         
  1549. *|Stop PROCshell_DataSave
  1550.  Set all this stuff beforehand as RAM transfer
  1551.  procedures may be entered more than once !
  1552.  PROCName(FNLeaf(FNGetString(PollPtr%+44)))
  1553.  PROCType(PollPtr%!40)
  1554.  PROCModified(TRUE)
  1555.  PROCDate(FNCurrentTimeAndDate)
  1556. (*|Start FNshell_TopBitLoadInProgress
  1557. shell_TopBitLoadInProgress
  1558.  result%
  1559.  _U%!100 
  1560.  1<<1 
  1561.   result% = 
  1562.   result% = 
  1563. = result%
  1564. (*|Stop  FNshell_TopBitLoadInProgress
  1565.  *|Start PROCshell_SendDataSave
  1566.  PROCshell_SendDataSave(wh%,ih%)
  1567.  LOCAL blk%,msgblk%,tmpblk%,offset%,FileSize%,void%
  1568.  tmpblk% = FNshell_HeapBlockFetch(30)
  1569.  REM retrieve current position of pointer (window and icon over which
  1570.  REM the drag event ended plus pointer position)
  1571.  SYS "Wimp_GetPointerInfo",,tmpblk%
  1572.  offset%=FNshell_GetEventListOffset(wh%,ih%,_U%+72,24,FALSE)
  1573.  IF offset%=-1 OR offset%=-2 THEN
  1574.    void%=FNshell_MessageWindow(FNshell_MessageNoArgs("SHELLMSG13"),0,"",FNshell_MessageNoArgs("warning"))
  1575.  ELSE
  1576.    blk%=(_U%!72)+offset%
  1577.    IF blk%!8>&8000 THEN
  1578.      FileSize%=FNshell_HeapBlockInfo(blk%!8)-4
  1579.    ELSE
  1580.      FileSize%=blk%!8
  1581.    ENDIF
  1582.    msgblk%=_U%!76
  1583.    msgblk%!0 =256       :REM length of message block
  1584.    msgblk%!12=0         :REM myref 0=originating
  1585.    msgblk%!16=1         :REM message action
  1586.    msgblk%!20=tmpblk%!12:REM destination window handle
  1587.    msgblk%!24=tmpblk%!16:REM destination icon handle
  1588.    msgblk%!28=tmpblk%!0 :REM mouse x coord
  1589.    msgblk%!32=tmpblk%!4 :REM mouse y coord
  1590.    msgblk%!36=FileSize% :REM estimated size of file
  1591.    msgblk%!40=blk%!12   :REM file type
  1592.    $(msgblk%+44)=FNshell_Leaf(FNshell_IconGetData(wh%,blk%!16))
  1593.    SYS "Wimp_SendMessage",18,msgblk%,msgblk%!20,msgblk%!24
  1594.    _U%!120=_Q%!8
  1595.    _U%!136=FileSize% :REM FileSize%
  1596.    _U%!140=blk%!12   :REM FileType%
  1597.    _U%!144=blk%!8    :REM FileBuff%
  1598.    _U%!156=blk%!4    :REM TaskHandle%
  1599.    _U%!200=msgblk%!20:REM window handle
  1600.    _U%!204=msgblk%!24:REM icon handle
  1601.  ENDIF
  1602.  PROCshell_HeapBlockReturn(tmpblk%)
  1603.  ENDPROC
  1604.  *|Stop PROCshell_SendDataSave
  1605. '*|Start PROCshell_DataSaveCheckName
  1606. shell_DataSaveCheckName(wh%,ih%)
  1607.  offset%,blk%,list_size%
  1608.  Routine to check if a 'datasave' event exists in the window wh%.
  1609.  If it does then the filename is checked for a '.' character. An
  1610.  error is generated if no '.' is found. This routine is called by
  1611.  the library when a mouse click on icon 0 is detected.
  1612. blk%=_U%!72:offset%=0
  1613.  blk%<>0 
  1614. -  list_size%=
  1615. shell_HeapBlockInfo(blk%)-8
  1616.  blk%<>0 therefore a datasave event list exists..
  1617. 2    
  1618.  check window handles of events in list..
  1619.  !(blk%+offset%)=wh% 
  1620. )      
  1621.  check for a valid path name..
  1622. -      blk% += offset% : 
  1623.  thanks Nigel...
  1624. 1      name$=
  1625. shell_IconGetData(!blk%,blk%!16)
  1626. I      
  1627. name$,".")=0 
  1628. shell_OK(
  1629. shell_MessageNoArgs("SHELLMSG01"))
  1630. C      offset%=list_size%:
  1631.  window handle found so abort check..
  1632.         
  1633. (    offset%+=24:
  1634.  check next event..
  1635.  offset%>=list_size%
  1636. &*|Stop PROCshell_DataSaveCheckName
  1637. !*|Start PROCshell_DataLoadAck
  1638. shell_DataLoadAck(_Q%)
  1639. *|ifdef TraceInit
  1640.  PROCshell_Tracef0("DataLoadAck:DataLoadAck message received (file received ok)")
  1641. *|endif
  1642.  *|Stop PROCshell_DataLoadAck
  1643. ,*|Start PROCshell_UserMessageAcknowledge
  1644. shell_UserMessageAcknowledge(_Q%)
  1645.  _Q%!16 
  1646. shell_AckDataLoad(_Q%)
  1647. shell_AckRAMFetch(_Q%)
  1648.  _Q%!8 = _SHELL_SENDDATALOAD_MY_REF% 
  1649. RO3_Present 
  1650. 6    
  1651. ( "Filer_Run "  + _SHELL_SENDDATALOAD_FILE$ )
  1652. /    
  1653. ( "Run " + _SHELL_SENDDATALOAD_FILE$ )
  1654. +*|Stop PROCshell_UserMessageAcknowledge
  1655. !!*|Start PROCshell_AckRAMFetch
  1656. shell_AckRAMFetch(_Q%)
  1657.  Exist%,temp%
  1658. temp%=_U%!156
  1659. *|ifdef TraceInit
  1660.  PROCshell_Tracef0("AckRAMFetch:AckRAMFetch called....")
  1661. *|endif
  1662.  _Q%!12<>_U%!112 
  1663.  Reference hasn't been updated,
  1664.  therefore the Wimp returned my call
  1665.  _U%!128=0 
  1666. ,2    
  1667.  The receiver didn't support RAM transfer
  1668. *|ifdef TraceInit
  1669.  PROCshell_Tracef0("AckRAMFetch:Receiver does not support RAM transfer")
  1670. *|endif
  1671. 0;    
  1672.  "XOS_ReadVarVal","Wimp$Scrap",,-1,0,3 
  1673.  ,,Exist%
  1674.  Exist%<>0 
  1675. 2)      $(temp%+44)="<Wimp$Scrap>"+
  1676. 38      temp%!00=(49+
  1677. shell_GetString(temp%+44)))
  1678.       temp%!12=temp%!08
  1679.       temp%!16=2
  1680.       temp%!36=-1
  1681. 70      
  1682.  "Wimp_SendMessage",18,temp%,temp%!4
  1683.       _U%!108=temp%!08
  1684. 9        
  1685. :8       
  1686. shell_OK(
  1687. shell_MessageNoArgs("SHELLMSG14"))
  1688. ;        
  1689. =;    
  1690.  The receiver has initiated RAM transfer, and this
  1691. >?    
  1692.  was successful once, but I expected more data to come
  1693. *|ifdef TraceInit
  1694.  PROCshell_Tracef0("AckRAMFetch:RAM transfer started, but not enough data sent. Sender died?")
  1695. *|endif
  1696. B'    
  1697. shell_HeapBlockReturn(_U%!152)
  1698.     _U%!152=0
  1699. shell_OK("SHELLMSG06")
  1700. I *|Stop PROCshell_AckRAMFetch
  1701. M'*|Start PROCshell_FindMenuWarnEvent
  1702. shell_FindMenuWarnEvent( item_handle%, 
  1703.  warn_fn$, 
  1704.  sel_fn$ )
  1705.  result%,e_list%,temp%,offset%,found%,list_size%,temp2%,ctr%
  1706.  submenu%
  1707. S;submenu%=0:
  1708.  If still 0 on return then no event found..
  1709. T=e_list%=_U%!220:offset%=0:found%=
  1710. :warn_fn$="":submenu%=0
  1711. shell_HeapBlockExists(e_list%) 
  1712.     ctr%+=4
  1713.  e_list%!ctr%=-1
  1714.   list_size%=ctr%:ctr%=0
  1715. *|ifdef PROCshell_TraceInit
  1716.  PROCshell_Tracef0("FindMenuWarnEvent:list_size%="+STR$ list_size%)
  1717. *|endif
  1718. ^"    temp%=!(e_list%+offset%+0)
  1719.  temp%<>-1 
  1720. `       
  1721.  temp%=item_handle% 
  1722.         found%=
  1723. b7        temp2%=e_list%!(offset%+4):warn_fn$=$temp2%
  1724. c(        submenu%=e_list%!(offset%+8)
  1725. d7        temp2%=e_list%!(offset%+12):sel_fn$=$temp2%
  1726. *|ifdef PROCshell_TraceInit
  1727.  PROCshell_Tracef0("FindMenuWarnEvent:submenu found")
  1728. *|endif
  1729.       
  1730.       offset%+=16
  1731. j        
  1732.       offset%=list_size%
  1733. l        
  1734.  found% 
  1735.  offset%>=list_size%
  1736.   warn_fn$="":sel_fn$=""
  1737. *|ifdef PROCshell_TraceInit
  1738.  submenu%=0 
  1739.  PROCshell_Tracef0("FindMenuWarnEvent:warn fn not found..")
  1740. *|endif
  1741. y&*|Stop PROCshell_FindMenuWarnEvent
  1742. }'*|Start PROCshell_EventListMenuWarn
  1743. shell_EventListMenuWarn(item%,submenu_ptr%,warn_fn$,sel_fn$)
  1744.  temp%,temp2%,ctr%,e_list%
  1745.  _U%!220=0 
  1746.  Create event list..
  1747. '  _U%!220=
  1748. shell_HeapBlockFetch(32)
  1749.   temp%=_U%!220
  1750.   temp%!0=item%
  1751. 1  temp%!4=
  1752. shell_HeapBlockFetch(
  1753.  warn_fn$+1)
  1754.   $(temp%!4)=warn_fn$
  1755.   temp%!8=submenu_ptr%
  1756. 1  temp%!12=
  1757. shell_HeapBlockFetch(
  1758.  sel_fn$+1)
  1759.   $(temp%!12)=sel_fn$
  1760. 5  temp%!16=-1:temp%!20=-1:temp%!24=-1:temp%!28=-1
  1761.  Extend existing event list..
  1762. 0  e_list%=
  1763. shell_HeapBlockExtend(_U%!220,32)
  1764.   _U%!220=e_list%:ctr%=0
  1765.     ctr%+=16
  1766.  e_list%!ctr%=-1
  1767.   temp%=_U%!220
  1768.   temp%!ctr%=item%
  1769. 8  temp%!(ctr%+4)=
  1770. shell_HeapBlockFetch(
  1771.  warn_fn$+1)
  1772. .  temp2%=temp%!(ctr%+4):$(temp2%)=warn_fn$
  1773. !  temp%!(ctr%+8)=submenu_ptr%
  1774. 8  temp%!(ctr%+12)=
  1775. shell_HeapBlockFetch(
  1776.  sel_fn$+1)
  1777. .  temp2%=temp%!(ctr%+12):$(temp2%)=sel_fn$
  1778. >  temp%!(ctr%+16)=-1:temp%!(ctr%+20)=-1:temp%!(ctr%+24)=-1
  1779.   temp%!(ctr%+28)=-1
  1780. &*|Stop PROCshell_EventListMenuWarn
  1781. *|Start PROCack
  1782. *|Stop PROCack
  1783. *|Start PROClwaorigin
  1784. lwaorigin(b,
  1785. x%=b!0-b!16:y%=b!12-b!20
  1786. *|Stop PROClwaorigin
  1787. '*|Start FNshell_WritableIconHandler
  1788. shell_WritableIconHandler(wh%,ih%,key%)
  1789.  nr_icons%,first_write%,last_write%,ctr%
  1790.  prev_icon%,next_icon%,caret_blk%, caret_present%
  1791. caret_present% = 
  1792. .nr_icons% = 
  1793. shell_WindowCountIcons( wh% )
  1794. ?caret_blk% = 
  1795. shell_HeapBlockFetch( ( nr_icons% + 1 ) * 4 )
  1796.  "Wimp_GetCaretPosition",,caret_blk%
  1797.  !caret_blk% = -1 
  1798. shell_HeapBlockReturn( caret_blk% )
  1799.   caret_present% = 
  1800.  caret_present% 
  1801.  must be icons in the window as the caret is present
  1802.  "Wimp_WhichIcon",wh%,caret_blk%,&0040E000,&0000E000
  1803. )  first_write% = !caret_blk%:ctr%  =0
  1804. !    
  1805.  caret_blk%!ctr% = ih% 
  1806. ,      prev_icon% = caret_blk%!(ctr% - 4)
  1807. -      next_icon%  = caret_blk%!(ctr% + 4)
  1808.         
  1809.     ctr% += 4
  1810.  caret_blk%!ctr% = -1
  1811. '  last_write% = caret_blk%!(ctr%-4)
  1812.  key% 
  1813.  &0D  :
  1814.  return
  1815. *        
  1816. shell_FakeMouseClick(wh%,0,4)
  1817. %    
  1818.  &18E,394 :
  1819.  cursor down,TAB
  1820.       
  1821.  ih% = last_write% 
  1822. h        
  1823.  "Wimp_SetCaretPosition",wh%,first_write%,-1,-1,-1,
  1824. shell_IconGetData(wh%,first_write%))
  1825. 9        
  1826. shell_IconEnsureVisible( wh%, first_write% )
  1827.       
  1828. d        
  1829.  "Wimp_SetCaretPosition",wh%,next_icon%,-1,-1,-1,
  1830. shell_IconGetData(wh%,next_icon%))
  1831. 7        
  1832. shell_IconEnsureVisible( wh%, next_icon% )
  1833.       
  1834. )    
  1835.  &18F,410 :
  1836.  cursor up,SHIFT TAB
  1837.        
  1838.  ih% = first_write% 
  1839. f        
  1840.  "Wimp_SetCaretPosition",wh%,last_write%,-1,-1,-1,
  1841. shell_IconGetData(wh%,last_write%))
  1842. 8        
  1843. shell_IconEnsureVisible( wh%, last_write% )
  1844.       
  1845. d        
  1846.  "Wimp_SetCaretPosition",wh%,prev_icon%,-1,-1,-1,
  1847. shell_IconGetData(wh%,prev_icon%))
  1848. 7        
  1849. shell_IconEnsureVisible( wh%, prev_icon% )
  1850.       
  1851. =    
  1852.  431 :
  1853.  CTRL Cursor Up (move to first writable icon)
  1854. f      
  1855.  "Wimp_SetCaretPosition",wh%,first_write%,-1,-1,-1,
  1856. shell_IconGetData(wh%,first_write%))
  1857. 7      
  1858. shell_IconEnsureVisible( wh%, first_write% )
  1859. >    
  1860.  430 :
  1861.  CTRL Cursor Down (move to last writable icon)
  1862. d      
  1863.  "Wimp_SetCaretPosition",wh%,last_write%,-1,-1,-1,
  1864. shell_IconGetData(wh%,last_write%))
  1865. 6      
  1866. shell_IconEnsureVisible( wh%, last_write% )
  1867. shell_HeapBlockReturn( caret_blk% )
  1868. &*|Stop FNshell_WritableIconHandler
  1869. $*|Start PROCshell_FakeMouseClick
  1870. shell_FakeMouseClick(wh%,ih%,button%)
  1871.  "OS_Byte",15,1:
  1872.  flush input buffer
  1873. '_Q%!8=button%:_Q%!12=wh%:_Q%!16=ih%
  1874. shell_Action(6)
  1875. #*|Stop PROCshell_FakeMouseClick
  1876. *|Start PROCshell_GetMinXY
  1877. shell_GetMinXY(flags%,text$,sprite$)
  1878.  x0%,y0%,x1%,y1%,mx%,my%
  1879. minx%=0:miny%=0
  1880.  flags%
  1881.  text$<>"" 
  1882.  flags%
  1883. 5       
  1884.  "Font_ReadInfo",flags%>>24 
  1885.  ,,y0%,,y1%
  1886. D       
  1887.  "Font_StringBBox",,
  1888. (flags%>>24)+text$ 
  1889.  ,x0%,,x1%
  1890. ,       
  1891.  "Font_ConverttoOS",,x0% 
  1892.  ,x0%
  1893. ,       
  1894.  "Font_ConverttoOS",,x1% 
  1895.  ,x1%
  1896. &       minx%=x1%-x0%:miny%=y1%-y0%
  1897.  minx%=6*dx%+16*
  1898.  text$:miny%=32
  1899.  flags%
  1900. &04 miny%+=2*dy%
  1901.  flags%
  1902.  sprite$<>"" 
  1903.  "XOS_SpriteOp",&128,
  1904. shell_UserSpritesBase,sprite$ 
  1905.  ,,,mx%,my%,,spm% ; P%
  1906. 1)=0 
  1907. A      
  1908.  "XOS_ReadModeVariable",spm%,4 
  1909.  ,,spx%:mx%=mx%<<spx%
  1910. A      
  1911.  "XOS_ReadModeVariable",spm%,5 
  1912.  ,,spy%:my%=my%<<spy%
  1913. +      
  1914.  flags%
  1915. &800 mx%=mx%/2:my%=my%/2
  1916. B      
  1917.  (flags%
  1918. &21B)=&13 mx%=minx%+mx% :
  1919.  sprite+text (V~H~R)
  1920.       
  1921.  mx%>minx% minx%=mx%
  1922.       
  1923.  my%>miny% miny%=my%
  1924. *|Stop PROCshell_GetMinXY
  1925. "*|Start PROCshell_IconGetState
  1926. shell_IconGetState(WindowHandle%,IconHandle%)
  1927. !_Q%=WindowHandle%
  1928. _Q%!4=IconHandle%
  1929.  "Wimp_GetIconState",,_Q%
  1930. "!*|Stop PROCshell_IconGetState
  1931. *|Start PROCprint_text
  1932. print_text(X,Y,text$)
  1933. in(X,Y-32,X+16*
  1934. (text$),Y) 
  1935.  text$
  1936. *|Stop PROCprint_text
  1937. *|Start FNin
  1938. in(A%,B%,C%,D%)
  1939.  C%<gbx 
  1940.  A%>gtx 
  1941.  B%>gty 
  1942.  D%<gby 
  1943. *|Stop FNin
  1944. *|Start PROCnewvals
  1945. newvals
  1946. gbx=_Q%!28:gby=_Q%!32
  1947. gtx=_Q%!36:gty=_Q%!40
  1948. wbx=_Q%!4:wby=_Q%!8
  1949. wtx=_Q%!12:wty=_Q%!16
  1950. xsc=_Q%!20:ysc=_Q%!24
  1951. ?!hp=wtx-wbx:vp=wty-wby:ebx=xsc
  1952. @!etx=xsc+hp:ety=ysc:eby=ysc-vp
  1953. *|Stop PROCnewvals
  1954. max(a%,b%)
  1955.  a%<b% 
  1956. *|Start FNshell_Leaf
  1957. shell_Leaf(path$)
  1958. path$,".")
  1959. K!  path$=
  1960. path$,
  1961. path$,".")+1)
  1962. =path$
  1963. *|Stop FNshell_Leaf
  1964. *|Start FNshell_Branch
  1965. shell_Branch(fname$)
  1966.  pos%,br$,temp%
  1967. fname$,".")=0 
  1968.   br$=""
  1969.   temp%=0
  1970.     pos%=temp%+1
  1971.     temp%=
  1972. fname$,".",pos%)
  1973.  temp%=0
  1974.   br$=
  1975. fname$,pos%-2)
  1976. *|Stop FNshell_Branch
  1977. *|Start FNgname
  1978. gname(ptr)
  1979. b    f$=""
  1980.  ?ptr<>0 
  1981.  ?ptr<>13
  1982.   f$=f$+
  1983. ?ptr:ptr+=1
  1984. *|Stop FNgname
  1985. l**|Start PROCshell_ScreenToWindowCoords
  1986. shell_ScreenToWindowCoords(WHandle%,
  1987.  Temp%,WXMin%,WYMin%,XScroll%,YScroll%,Scratch%
  1988. oRScratch%=
  1989. shell_HeapBlockFetch(100 + (
  1990. shell_WindowCountIcons(WHandle%) * 32))
  1991. Temp%=Scratch%
  1992. !Temp%=WHandle%
  1993.  "Wimp_GetWindowInfo",,Temp%
  1994. WXMin%=Scratch%!4
  1995. WYMax%=Scratch%!16
  1996. XScroll%=Scratch%!20
  1997. YScroll%=Scratch%!24
  1998. X%=X%+(XScroll%-WXMin%)
  1999. Y%=Y%+(YScroll%-WYMax%)
  2000. shell_HeapBlockReturn(Scratch%)
  2001. |)*|Stop PROCshell_ScreenToWindowCoords
  2002. }#*|Start FNshell_WimpSlotReadEnd
  2003. shell_WimpSlotReadEnd
  2004.  mem%
  2005.  "Wimp_SlotSize",-1,-1 
  2006.  mem%
  2007.     =mem%
  2008. "*|Stop FNshell_WimpSlotReadEnd
  2009. '*|Start FNshell_WimpSlotClaimMemory
  2010. shell_WimpSlotClaimMemory(mem%,size%)
  2011.  ssize%
  2012.  "Wimp_SlotSize",mem%+size%,-1 
  2013.  ssize%
  2014.  ssize%<mem%+size% 
  2015. = ssize%
  2016. &*|Stop FNshell_WimpSlotClaimMemory
  2017. +*|Start PROCshell_WimpSlotReleaseMemory
  2018. shell_WimpSlotReleaseMemory
  2019.  "Wimp_SlotSize",mem%,-1
  2020. **|Stop PROCshell_WimpSlotReleaseMemory
  2021.  *|Start PROCshell_MouseLimit
  2022. shell_MouseLimit( whandle% )
  2023. #b = 
  2024. shell_HeapBlockFetch( 36 )
  2025. b!0 = whandle%
  2026.  "Wimp_GetWindowState", , b
  2027. shell_MouseSetRectangle( b!4, b!8, b!12 - b!4, b!16 - b!8 )
  2028. shell_HeapBlockReturn( b )
  2029. *|Stop PROCshell_MouseLimit
  2030. '*|Start PROCshell_MouseRemoveLimits
  2031. shell_MouseRemoveLimits
  2032. ( "Pointer" )
  2033. &*|Stop PROCshell_MouseRemoveLimits
  2034. '*|Start PROCshell_MouseSetRectangle
  2035. shell_MouseSetRectangle( x%, y%, w%, h% )
  2036.  x%,y%,w%,h%
  2037. mouseminx%   = x%
  2038. mouseminy%   = y%
  2039. mousewidth%  = w%
  2040. mouseheight% = h%
  2041. &*|Stop PROCshell_MouseSetRectangle
  2042. $*|Start PROCInitialiseSpriteArea
  2043. InitialiseSpriteArea(S%,Length%)
  2044. !S%=Length%
  2045. S%!8=16
  2046.  "OS_SpriteOp",9+256,S%
  2047. #*|Stop PROCInitialiseSpriteArea
  2048.  *|Start PROCshell_ListEvents
  2049. shell_ListEvents(wh%,ic%)
  2050.  menu%,menu$
  2051.  wh%=-1 
  2052.  wh%=-2
  2053.  PROCshell_Tracef0("MenuSelection="+FNshell_GetEventHandler(wh%,ic%,0))
  2054.  PROCshell_Tracef0("MenuMaker    ="+FNshell_GetEventHandler(wh%,ic%,1))
  2055.  PROCshell_Tracef0("ClickSelect  ="+FNshell_GetEventHandler(wh%,ic%,2))
  2056.  PROCshell_Tracef0("ClickAdjust  ="+FNshell_GetEventHandler(wh%,ic%,3))
  2057.  PROCshell_Tracef0("Redraw       ="+FNshell_GetEventHandler(wh%,ic%,4))
  2058.  PROCshell_Tracef0("Keypress     ="+FNshell_GetEventHandler(wh%,ic%,5))
  2059.  PROCshell_Tracef0("Drag         ="+FNshell_GetEventHandler(wh%,ic%,6))
  2060.  PROCshell_Tracef0("Menu Warning ="+FNshell_GetEventHandler(wh%,ic%,7))
  2061.  PROCshell_Tracef0("HelpTag      ="+FNshell_GetEventHandler(wh%,ic%,8))
  2062. (menu%=
  2063. shell_GetEventMenu(2,wh%,ic%)
  2064.  menu%=0 
  2065.   menu$="None"
  2066.   menu$=
  2067.  menu%
  2068.  PROCshell_Tracef0("Menu handle =&"+menu$)
  2069. *|Stop PROCshell_ListEvents
  2070. "*|Start PROCshell_AttachHotKey
  2071. shell_AttachHotKey(key$,shift%,ctrl%,alt%,window$,wh%,fn1$,fn2$)
  2072.  e_list%,offset%,temp%,temp2%,key%,f_key%
  2073. f_key%=
  2074.  _U%!60=0 
  2075. &  _U%!60=
  2076. shell_HeapBlockFetch(24)
  2077.   offset%=0:_U%!180=1
  2078.   offset%=_U%!180*24
  2079. .  _U%!60=
  2080. shell_HeapBlockExtend(_U%!60,24)
  2081.   _U%!180=(_U%!180)+1
  2082. e_list%=_U%!60
  2083.  key$ 
  2084.  "F1" :key%=385
  2085.  "F2" :key%=386
  2086.  "F3" :key%=387
  2087.  "F4" :key%=388
  2088.  "F5" :key%=389
  2089.  "F6" :key%=390
  2090.  "F7" :key%=391
  2091.  "F8" :key%=392
  2092.  "F9" :key%=393
  2093.  "F10":key%=458
  2094.  "F11":key%=459
  2095.   key%=(
  2096.  key$)-64:f_key%=
  2097.  f_key% 
  2098.  shift% 
  2099.  key%+=16
  2100.  ctrl%  
  2101.  key%+=32
  2102. temp%=e_list%+offset%
  2103. temp%!0=key%
  2104. temp%?4=shift%:
  2105.  shift flag
  2106. temp%?5=ctrl% :
  2107.  ctrl  flag
  2108. temp%?6=alt%  :
  2109.  alt   flag
  2110. .temp%!8=
  2111. shell_HeapBlockFetch(
  2112.  window$+1)
  2113. "temp2%=temp%!8:$temp2%=window$
  2114.  wh%>0 
  2115.  check window handle is in static list...
  2116. shell_IsWindowStatic( wh% ) = 
  2117. shell_MessageNoArgs("SHELLMSG09")
  2118. ?temp%!12=wh%:
  2119.  >0 denotes a window handle to open as static
  2120. ,temp%!16=
  2121. shell_HeapBlockFetch(
  2122.  fn1$+1)
  2123.  temp2%=temp%!16:$temp2%=fn1$
  2124. ,temp%!20=
  2125. shell_HeapBlockFetch(
  2126.  fn2$+1)
  2127.  temp2%=temp%!20:$temp2%=fn2$
  2128. !*|Stop PROCshell_AttachHotKey
  2129. !*|Start FNshell_HotKeyProcess
  2130. shell_HotKeyProcess(key%)
  2131.  e_list%,list_size%,found%,ptr%,h%,win$,fn1$,fn2$
  2132.  ctrl%,shift%,alt%,x_off%,y_off%,flag%,key_flags%,offset%
  2133.  result%,win_blk%
  2134. e_list%=_U%!60
  2135. list_size%=_U%!180*24
  2136. found%=
  2137. :ptr%=0
  2138.  e_list%!ptr%=key% 
  2139.     found%=
  2140.     ptr%+=24
  2141.  found% 
  2142.  ptr%>=list_size%
  2143.  found% 
  2144.   temp%=e_list%+ptr%
  2145.   win$=$(temp%!8)
  2146. *|ifdef TraceInit
  2147.  PROCshell_Tracef0("HotKeyProcess:Template name is '"+win$+"'")
  2148. *|endif
  2149.  (win$<>"" 
  2150.  temp%!12=0) 
  2151. *5    
  2152.  only create a window if it is a dynamic one
  2153. +2    
  2154.  static windows have already been created
  2155. ,$    
  2156. shell_CreateWindow(win$,h%)
  2157. *|ifdef TraceInit
  2158. .a    
  2159.  PROCshell_Tracef0("HotKeyProcess:Creating new dynamic window (handle is &"+STR$~h%+")")
  2160. *|endif
  2161. 0*    win_blk%=
  2162. shell_HeapBlockFetch(36)
  2163.     win_blk%!0=h%
  2164. 2*    
  2165.  "Wimp_GetWindowState",,win_blk%
  2166. 3)    x_off%=(win_blk%!4-win_blk%!12)/2
  2167. 4)    y_off%=(win_blk%!16-win_blk%!8)/2
  2168. 5(    
  2169. shell_HeapBlockReturn(win_blk%)
  2170.   fn1$=$(temp%!16)
  2171.  fn1$<>"" 
  2172. 9K    
  2173.  PROCshell_Tracef0("HotKeyProcess:Calling Pre-Open FN '"+fn1$+"'")
  2174.  temp%!12>0 
  2175. ;/      void%=
  2176. ("FN"+fn1$+"("+
  2177.  temp%!12+")")
  2178. <        
  2179. =)      void%=
  2180. ("FN"+fn1$+"("+
  2181.  h%+")")
  2182. >        
  2183. @F    
  2184.  PROCshell_Tracef0("HotKeyProcess:No Pre-Open FN registered")
  2185. B-    
  2186. shell_IsWindowStatic( temp%!12 ) 
  2187. C+      
  2188. shell_OpenWindowStatic(temp%!12)
  2189. D        
  2190.       
  2191.  temp%!12>0 
  2192. F@        
  2193.  request to open a static window, but window handle
  2194. GC        
  2195.  has not been registered with shell_CreateWindowStatic
  2196. H3        
  2197. shell_MessageNoArgs("SHELLMSG09")
  2198.       
  2199. J.        
  2200.  must be a dynamic window then...
  2201. K7        
  2202. shell_OpenWindowDynamic2(h%,x_off%,y_off%)
  2203.       
  2204. M        
  2205.   fn2$=$(temp%!20)
  2206.  fn2$<>"" 
  2207. *|ifdef TraceInit
  2208. QL    
  2209.  PROCshell_Tracef0("HotKeyProcess:Calling Post-Open FN '"+fn2$+"'")
  2210. *|endif
  2211.  temp%!12>0 
  2212. T/      void%=
  2213. ("FN"+fn2$+"("+
  2214.  temp%!12+")")
  2215. U        
  2216. V)      void%=
  2217. ("FN"+fn2$+"("+
  2218.  h%+")")
  2219. W        
  2220. *|ifdef TraceInit
  2221. ZG    
  2222.  PROCshell_Tracef0("HotKeyProcess:No Post-Open FN registered")
  2223. *|endif
  2224.   result%=
  2225. _'  win$="":fn1$="":fn2$="":result%=
  2226. =result%
  2227. c *|Stop FNshell_HotKeyProcess
  2228. i-*|Start PROCshell_OpenWindowStaticNewView
  2229. shell_OpenWindowStaticNewView(wh%)
  2230. shell_OpenWindow(wh%,
  2231. n,*|Stop PROCshell_OpenWindowStaticNewView
  2232. p&*|Start PROCshell_OpenWindowStatic
  2233. shell_OpenWindowStatic(handle%)
  2234. shell_IsWindowStatic( handle% ) = 
  2235. shell_OpenWindow(handle%,0,-1)
  2236.  ERROR 99,FNshell_MessageNoArgs("SHELLMSG09")
  2237. y%*|Stop PROCshell_OpenWindowStatic
  2238. }$*|Start PROCshell_InitHelpSystem
  2239. shell_InitHelpSystem(path$,die%)
  2240.  tail$,pos%, respath$,help_found%,abort%
  2241. @_U%!212 = 0:
  2242.  _U%!216 <> 0 
  2243. shell_HeapBlockReturn(_U%!216)
  2244. 1_U%!216 = 0:
  2245.  clear pending command buffer...
  2246. shell_ScanForHelp:
  2247.  check if StrongHlp is running...
  2248.  die% 
  2249.  tail$ = " -DieWithTask" 
  2250.  tail$=""
  2251.  _U%!100 
  2252.  1 << 3 
  2253.  ResFind initialised, check ResPath..
  2254.   path$      = ""
  2255. G  respath$   = 
  2256. shell_OSVarGetVal( 
  2257. shell_GetAppName+"Res$Path",-1)
  2258.     pos% = 
  2259. respath$,",")
  2260.  pos% > 0 
  2261. H      
  2262. shell_FileExists(
  2263. respath$,pos% - 1) + 
  2264. shell_GetAppName) 
  2265. ;        path$ = 
  2266. respath$,pos% - 1) + 
  2267. shell_GetAppName
  2268. ?        
  2269. shell_StrongHlpChkFiles(path$) 
  2270.  help_found% = 
  2271.       
  2272. *        respath$ = 
  2273. respath$,pos% + 1)
  2274.       
  2275.         
  2276. =      
  2277. shell_FileExists(respath$ + 
  2278. shell_GetAppName) 
  2279. 0        path$ = respath$ + 
  2280. shell_GetAppName
  2281. ?        
  2282. shell_StrongHlpChkFiles(path$) 
  2283.  help_found% = 
  2284.       
  2285.         abort% = 
  2286. K        
  2287. shell_OK(
  2288. shell_MessageOneArg("SHELLMSG26",
  2289. shell_GetAppName))
  2290.       
  2291.         
  2292.  path$ <> "" 
  2293.  help_found% 
  2294.  abort%
  2295.  ResFind not being used..
  2296. shell_FileExists(path$) 
  2297. /    
  2298.  Directory exists, check if files do..
  2299. 8    
  2300. shell_StrongHlpChkFiles(path$) 
  2301.  abort% = 
  2302. 6     
  2303. shell_MessageOneArg("SHELLMSG33",path$)
  2304.  abort% = 0 
  2305. shell_StrongHlpMsg("Help_Install " + path$ + tail$)
  2306.    _U%!100 = _U%!100 
  2307.  1 << 7
  2308. #*|Stop PROCshell_InitHelpSystem
  2309. *|Start PROCshell_HelpWord
  2310. shell_HelpWord(word$)
  2311.  read%,temp%
  2312.  _U%!208 = -1 
  2313.   StrongHelp is not loaded. Try to run it..
  2314. shell_OSVarExists( "StrongHelp$Dir" ) 
  2315. 8    
  2316.  Variable exists, so attempt to run StrongHlp..
  2317. /    
  2318.  "XWimp_StartTask","<StrongHelp$Dir>"
  2319. 6    
  2320.  _U%!216<>0 
  2321. shell_HeapBlockReturn(_U%!216)
  2322. 0    _U%!216=
  2323. shell_HeapBlockFetch(
  2324.  word$+1)
  2325.     temp%=_U%!216
  2326.     $temp%=word$
  2327. A    
  2328.  It doesn't, so complain, but first release buffer as an
  2329. *    
  2330.  error is about to be generated..
  2331. 5    
  2332. shell_OK(
  2333. shell_MessageNoArgs("SHELLMSG11"))
  2334. shell_StrongHlpMsg("Help_Word "+word$)
  2335. *|Stop PROCshell_HelpWord
  2336. "*|Start PROCshell_StrongHlpMsg
  2337. shell_StrongHlpMsg(msg$)
  2338. shell_BroadcastMessage(&43B00,msg$)
  2339. !*|Stop PROCshell_StrongHlpMsg
  2340. !*|Start PROCshell_ScanForHelp
  2341. shell_ScanForHelp
  2342.  wrk%,owner_taskhandle%
  2343. 8wrk%=
  2344. shell_HeapBlockFetch(256):
  2345.  block for messages
  2346.   Finds out if StrongHelp is already running.
  2347.   Does this by scanning the tasks installed on the iconbar..
  2348.   This again is done by getting the task's handle, and sending a
  2349.   sending a TaskNameRq to the taskhandler. When this returns
  2350.   (as a TaskNameIs message) we compare the string with "StrongHelp".
  2351.   If not equal, this routine is called again to check next icon..
  2352.   This Wimp_SendMessage does *not* send a message to the owner of
  2353.   the icon. It merely returns the taskhandle of the owner.
  2354.   wrk%!12 = 0
  2355.  "Wimp_SendMessage",19,wrk%,-2,_U%!212 
  2356.  ,,owner_taskhandle%
  2357. "  _U%!212=_U%!212+1:
  2358.  icontry%
  2359.  owner_taskhandle% <> -1 
  2360.  (_U%!212) > 64
  2361.  owner_taskhandle% <> -1 
  2362.  Send request for name of this task.
  2363.   wrk%!0  = 24
  2364.   wrk%!12 = 0
  2365.   wrk%!16 = &400C6
  2366. !  wrk%!20 = owner_taskhandle%
  2367.  "Wimp_SendMessage",17,wrk%,0
  2368. shell_HeapBlockReturn(wrk%)
  2369.  *|Stop PROCshell_ScanForHelp
  2370. *|Start PROCshell_MemFill
  2371. shell_MemFill(start%,nr_bytes%,value%)
  2372.  I%,nr_words%,remainder%
  2373. nr_words%=nr_bytes% 
  2374. remainder%=nr_bytes% 
  2375.  nr_words%>0 
  2376.  I%=1 
  2377.  (nr_words%*4) 
  2378.     start%!(I%-1)=value%
  2379.  remainder%>0 
  2380. !  start%=start%+(nr_words%*4)
  2381.  I%=0 
  2382.  remainder%-1
  2383.     start%?I%=value%
  2384. *|Stop PROCshell_MemFill
  2385. &*|Start PROCshell_MenuUpdateHandle
  2386. shell_MenuUpdateHandle(old_h%,new_h%)
  2387.  list_size%,ptr%,event_list%,menu%
  2388. -list_size%=
  2389. shell_HeapBlockInfo(_U%!12)-8
  2390. ptr%=0
  2391. found%=
  2392. event_list%=_U%!12
  2393. "  menu%=event_list%!(ptr% + 8)
  2394.  menu% = old_h% 
  2395.  event_list%!(ptr% + 8) = new_h%
  2396.   ptr%+=48
  2397.  (ptr% >= list_size%)
  2398. shell_MenuLastHandle = old_h% 
  2399.  _m_Menu_HandleLastOpened% = new_h%
  2400. %*|Stop PROCshell_MenuUpdateHandle
  2401.     !"*|Start FNshell_CheckSelection
  2402. shell_CheckSelection(sel%)
  2403.  temp%,ctr%
  2404. temp%=_U%!256
  2405.  temp%=0 
  2406. shell_MenuLastHandle = _U%!252 
  2407.     (#  
  2408.  sel%!ctr%<>temp%!ctr% 
  2409.   ctr%+=4
  2410.  temp%!ctr%=-1
  2411.     +    =ctr%
  2412.     -!*|Stop FNshell_CheckSelection
  2413.     /&*|Start FNshell_MenuGetItemAddress
  2414. shell_MenuGetItemAddress(menu%,selection%)
  2415.  ctr%,item_addr%
  2416.  "MenuUtil_Info",menu% 
  2417.  menu%
  2418.     40  item_addr%=menu%+28+((selection%!ctr%)*24)
  2419.     5/  menu%=item_addr%!4:
  2420.  address of submenu..
  2421.   ctr%+=4
  2422.  selection%!ctr%=-1
  2423. =item_addr%
  2424.     :%*|Stop FNshell_MenuGetItemAddress
  2425.     <$*|Start FNshell_GetLastMouseXPos
  2426. shell_GetLastMouseXPos
  2427. Evnts_GetLastMouseXPos
  2428.     @#*|Stop FNshell_GetLastMouseXPos
  2429.     B$*|Start FNshell_GetLastMouseYPos
  2430. shell_GetLastMouseYPos
  2431. Evnts_GetLastMouseYPos
  2432.     F#*|Stop FNshell_GetLastMouseYPos
  2433.     H(*|Start PROCshell_UpdateWindowHandle
  2434. shell_UpdateWindowHandle(old_handle%,new_handle%)
  2435. *|ifdef TraceInit
  2436.  PROCshell_Tracef0("UpdateWindowHandle:Updating stored window handles")
  2437.  PROCshell_Tracef0("UpdateWindowHandle:old handle=&"+STR$~old_handle%)
  2438.  PROCshell_Tracef0("UpdateWindowHandle:new handle=&"+STR$~new_handle%)
  2439. *|endif
  2440.  new_handle% <> old_handle% 
  2441.     P\  
  2442. Evnts_GetLastWindowClicked = old_handle% 
  2443.  _EVNTS_LAST_WINDOWCLICKED% = new_handle%
  2444.     Q1  
  2445.  !_Q%   = old_handle% 
  2446.  !_Q% = new_handle%
  2447.     RX  
  2448.  PROCshell_FixEventBlock(old_handle%,new_handle%,_U%!72,24)  :REM DataSave events
  2449.     ST  
  2450.  PROCshell_FixEventBlock(old_handle%,new_handle%,_U%!92,24)  :REM Pane events
  2451.     TA  
  2452. shell_UpdateStaticWindowHandle( old_handle%, new_handle% )
  2453.     U?  
  2454. shell_UpdateWindowHandleList( old_handle%, new_handle% )
  2455.     Y'*|Stop PROCshell_UpdateWindowHandle
  2456.     ]"*|Start PROCshell_MessagesInit
  2457. shell_MessagesInit(filename$,
  2458.  m_filedesc%,
  2459.  m_buffer%)
  2460.  size%,flags%
  2461.  3,"Cannot open message file '"+filename$+"'"
  2462.  "MessageTrans_FileInfo",,filename$ 
  2463.  flags%,,size%
  2464.  flags% 
  2465.  m_buffer%=0 
  2466.  m_buffer%=
  2467. shell_HeapBlockFetch(size%)
  2468.  "OS_Module",6,,,17+
  2469. (filename$) 
  2470.  ,,m_filedesc%
  2471. $(m_filedesc%+16)=filename$
  2472.  "MessageTrans_OpenFile",m_filedesc%,m_filedesc%+16
  2473. *|ifdef TraceInit
  2474.  PROCshell_Tracef0("MessagesInit:Message resource file '"+filename$+"' loaded")
  2475. *|endif
  2476.     l!*|Stop PROCshell_MessagesInit
  2477.     r'*|Start FNshell_WindowSetSpriteArea
  2478. shell_WindowSetSpriteArea(h%,SpriteArea%)
  2479.  blk%,new_handle%,icon%,ib%
  2480.     uKblk%  = 
  2481. shell_HeapBlockFetch(100 + (
  2482. shell_WindowCountIcons(h%) * 32))
  2483. !blk% = h%
  2484.  "Wimp_GetWindowInfo",,blk%
  2485. blk%!68 = SpriteArea%
  2486. shell_IconSetSpriteArea(blk%!60,blk% + 76,SpriteArea%)
  2487.  (blk%!88) > 0 
  2488.     {!  
  2489.  icon% = 0 
  2490.  (blk%!88) - 1
  2491.     |$    ib% = blk% + 92 + icon% * 32
  2492.     }=    
  2493. shell_IconSetSpriteArea(ib%!16,ib% + 20,SpriteArea%)
  2494.  icon%
  2495.  "Wimp_DeleteWindow",,blk%
  2496.  "Wimp_CreateWindow",,blk% + 4 
  2497.  new_handle%
  2498.  new_handle% <> h% 
  2499. shell_UpdateWindowHandle(h%,new_handle%)
  2500.   h% = new_handle%
  2501. shell_HeapBlockReturn(blk%)
  2502. &*|Stop FNshell_WindowSetSpriteArea
  2503. (*|Start FNshell_StrongHlpIsAvailable
  2504. shell_StrongHlpIsAvailable
  2505.  r%,buff%
  2506. r% = 
  2507.  _U%!100 
  2508.  1 << 7 
  2509.  StrongHlp initialisation succeeded..
  2510. 4  r%    = 
  2511. shell_OSVarExists( "StrongHelp$Dir" )
  2512. '*|Stop FNshell_StrongHlpIsAvailable
  2513. &*|Start PROCshell_AttachOpenWindow
  2514. shell_AttachOpenWindow(wh%,fn$)
  2515.  blk%,temp%,offset%
  2516. *|ifdef TraceInit
  2517.  PROCshell_Tracef0("AttachOpenWindow:Attaching OpenWindow Handler")
  2518. *|endif
  2519.  wh%<0 
  2520. shell_MessageOneArg("SHELLMSG27","AttachOpenWindow")
  2521. :offset%=
  2522. shell_GetEventListOffset(wh%,-1,_U%+304,12,
  2523. blk%=_U%!304+offset%
  2524. blk%!0=wh%:blk%!4=-1
  2525. *blk%!8=
  2526. shell_HeapBlockFetch(
  2527. (fn$)+1)
  2528. temp%=blk%!8:$temp%=fn$
  2529. %*|Stop PROCshell_AttachOpenWindow
  2530.  *|Start PROCshell_EnsurePoll
  2531. shell_EnsurePoll
  2532.  action%
  2533. (  action% = 
  2534. shell_Poll_I(0,_U%!148)
  2535. shell_Action(action%)
  2536.  action% = 0
  2537. *|Stop PROCshell_EnsurePoll
  2538. "*|Start FNshell_WimpGetVersion
  2539. shell_WimpGetVersion
  2540. =_U%!316
  2541. !*|Stop FNshell_WimpGetVersion
  2542. )*|Start PROCshell_MessageSendDataLoad
  2543. shell_MessageSendDataLoad( type%, name$ )
  2544.  m_blk%
  2545. ,m_blk%    = 
  2546. shell_HeapBlockFetch( 256 )
  2547. (m_blk%!00 = 256   :
  2548.  Size of message
  2549. *m_blk%!04 = 0     :
  2550.  Not used on entry
  2551. Dm_blk%!12 = 0     :
  2552.  your_ref (0 = original message not a reply)
  2553. 5m_blk%!16 = 5     :
  2554.  DataOpen message action code
  2555. Im_blk%!20 = 0     :
  2556.  Normally Filer window handle containing the file
  2557. =m_blk%!28 = 0     :
  2558.  Normally x offset of icon clicked on
  2559. =m_blk%!32 = 0     :
  2560.  Normally y offset of icon clicked on
  2561. "m_blk%!36 = 0     :
  2562.  Must be 0
  2563. "m_blk%!40 = type% :
  2564.  File type
  2565. #$(m_blk% + 44) = name$ + 
  2566. ( 0 )
  2567.  "Wimp_SendMessage",18,m_blk%,0
  2568.  Store my_ref in case message gets bounced which means the file has not been
  2569.  loaded...
  2570. *_SHELL_SENDDATALOAD_MY_REF% = m_blk%!8
  2571. '_SHELL_SENDDATALOAD_FILE$   = name$
  2572. shell_HeapBlockReturn( m_blk% )
  2573. (*|Stop PROCshell_MessageSendDataLoad
  2574.  *|Start FNshell_BinarySearch
  2575. shell_BinarySearch( _search_term$, get_termFN$, comp_FN$, lo%, hi% )
  2576.  _pos%,m%,_wp$,off%,p%,hipos%,lopos%,lp2%,found%,missing%, result%
  2577. hi% += 1
  2578. missing% = 
  2579. found%   = 
  2580. m%       = hi%
  2581. off%     = 0
  2582. _pos%     = m% 
  2583. lopos%   = lo% - 1
  2584.  lopos% < 0 
  2585.   lopos% = 0
  2586. hipos%   = hi%
  2587.  PROCshell_Tracef0( "BinarySearch:_search_term$ = " + _search_term$ )
  2588.  PROCshell_Tracef0( "BinarySearch:hi% = "+STR$ hi% )
  2589.  PROCshell_Tracef0( "BinarySearch:lo% = "+STR$ lo% )
  2590.  PROCshell_Tracef0( "BinarySearch:m%  = "+STR$ m% )
  2591.  ERROR 99,STR$(pos%)
  2592. 2  _wp$ = 
  2593. ( "FN" + get_termFN$ + "( _pos% )" )
  2594.  PROCshell_Tracef0( "BinarySearch:_pos% = " + STR$ _pos% )
  2595.  PROCshell_Tracef0( "BinarySearch:_wp$  = " + _wp$ )
  2596.   lastpos% = _pos%
  2597.  _search_term$ = _wp$ 
  2598. P    
  2599.  PROCshell_Tracef0( "BinarySearch:_search_term$ = _wp$, item found.." )
  2600.     found% = 
  2601. C    
  2602.  PROCshell_Tracef0( "BinarySearch:_search_term$ <> _wp$" )
  2603. N    
  2604.  PROCshell_Tracef0( "BinarySearch:_search_term$ = " + _search_term$ )
  2605. =    
  2606.  PROCshell_Tracef0( "BinarySearch:_wp$  = " + _wp$ )
  2607. Y    
  2608.  PROCshell_Tracef0( "BinarySearch:"+"FN" + comp_FN$ + "( _search_term$,_wp$ )" )
  2609. ?    
  2610. ( "FN" + comp_FN$ + "( _search_term$,_wp$ )" ) = 
  2611.       
  2612.  search lower half..
  2613. F      
  2614.  PROCshell_Tracef0( "BinarySearch:searching lower half.." )
  2615.       hipos% = _pos%
  2616. !      m%     = _pos% - lopos%
  2617.        _pos%  = m% 
  2618.  2 + off%
  2619.             
  2620.       
  2621.  search upper half..
  2622. F      
  2623.  PROCshell_Tracef0( "BinarySearch:searching upper half.." )
  2624.       lopos% = _pos%
  2625.       off%   = _pos%
  2626. !      m%     = hipos% - _pos%
  2627.       _pos%  = m% 
  2628.  2 +off%
  2629.         
  2630.  lp2% = lastpos% 
  2631.  missing% = 
  2632.   lp2% = lastpos%
  2633.  found% 
  2634.  missing%
  2635.  found% 
  2636.   result% =-1
  2637.   result% = lastpos%
  2638. = result%
  2639. *|Stop FNshell_BinarySearch
  2640.  #*|Start FNshell_IconLastClicked
  2641. shell_IconLastClicked
  2642. Evnts_GetLastIconClicked
  2643. $"*|Stop FNshell_IconLastClicked
  2644. *|Start PROCshell_QuickSort
  2645. shell_QuickSort(comp_FN$,swap_FN$,_asc%,_start%,_end%)
  2646.  _lo%,_h%,_F%,_temp%,void%
  2647. +'_lo% = _start%:_hi% = _end%:_F% = 
  2648. ,)_temp% = _lo% -1 + 
  2649. (_hi% + 1 - _lo%)
  2650. -,void% = 
  2651. ("FN"+swap_FN$+"(_lo%,_temp%)")
  2652.  _asc% = 0 
  2653. 0*    
  2654. ("FN"+comp_FN$+"(_lo%,_hi%)") 
  2655. 10      void% = 
  2656. ("FN"+swap_FN$+"(_lo%,_hi%)")
  2657.       _F% = 
  2658. 3        
  2659. 5*    
  2660. ("FN"+comp_FN$+"(_hi%,_lo%)") 
  2661. 60      void% = 
  2662. ("FN"+swap_FN$+"(_hi%,_lo%)")
  2663.       _F% = 
  2664. 8        
  2665.  _F% 
  2666.  _hi% = _hi% - 1 
  2667.  _lo% = _lo% + 1
  2668.  _lo% = _hi%
  2669.  _start% < _lo% - 1 
  2670. shell_QuickSort(comp_FN$,swap_FN$,_asc%,_start%,_lo% - 1)
  2671.  _hi% + 1 < _end%   
  2672. shell_QuickSort(comp_FN$,swap_FN$,_asc%,_hi% + 1,_end%)
  2673. *|Stop PROCshell_QuickSort
  2674. *|Start FN_shell_MS_swap
  2675. _shell_MS_swap( e1%, e2% )
  2676.  term1$, term2$, h1%, h2%
  2677. E=term1$ = 
  2678. shell_MenuGetItemText( _shell_MS_handle%, e1% )
  2679. F=term2$ = 
  2680. shell_MenuGetItemText( _shell_MS_handle%, e2% )
  2681. _shell_blk%!0 = e1%
  2682. _shell_blk%!4 = -1
  2683. IGh1%    = 
  2684. shell_MenuGetItemHandle( _shell_MS_handle%, _shell_blk% )
  2685. _shell_blk%!0 = e2%
  2686. KGh2%    = 
  2687. shell_MenuGetItemHandle( _shell_MS_handle%, _shell_blk% )
  2688. shell_MenuPutData( h1%, term2$ )
  2689. shell_MenuPutData( h2%, term1$ )
  2690. *|Stop FN_shell_MS_swap
  2691. *|Start FN_shell_MS_comp
  2692. _shell_MS_comp( e1%, e2% )
  2693.  item_text1$, item_text2$, return_code%
  2694. UBitem_text1$ = 
  2695. shell_MenuGetItemText( _shell_MS_handle%, e1% )
  2696. VBitem_text2$ = 
  2697. shell_MenuGetItemText( _shell_MS_handle%, e2% )
  2698.  item_text1$ < item_text2$ 
  2699.   return_code% = 
  2700.   return_code% = 
  2701. = return_code%
  2702. *|Stop FN_shell_MS_comp
  2703. `-*|Start PROCshell_WindowSetTitleRightJust
  2704. shell_WindowSetTitleRightJust(
  2705.  wh%)
  2706.  w_blk%,t_flags%,handle%,reopen%
  2707. c&reopen% = 
  2708. shell_WindowIsOpen(wh%)
  2709. dMw_blk% = 
  2710. shell_HeapBlockFetch(100 + (
  2711. shell_WindowCountIcons(wh%) * 32))
  2712. !w_blk% = wh%
  2713.  "Wimp_GetWindowInfo",,w_blk%
  2714. t_flags% = w_blk%!60
  2715.  (t_flags% 
  2716.  (1 << 3)) 
  2717. *|ifdef TraceInit
  2718.  PROCshell_Tracef0("WindowSetTitleRightJust:title flags = &"+STR$~t_flags%)
  2719.  PROCshell_Tracef0("WindowSetTitleRightJust:Horizontally centred bit set..")
  2720.  PROCshell_Tracef0("WindowSetTitleRightJust:Unsetting horizontally centred bit..")
  2721. *|endif
  2722. n$  t_flags% = t_flags% 
  2723.  (1 << 3)
  2724. *|ifdef TraceInit
  2725.  PROCshell_Tracef0("WindowSetTitleRightJust:title flags = &"+STR$~t_flags%)
  2726. *|endif
  2727. *|ifdef TraceInit
  2728.  PROCshell_Tracef0("WindowSetTitleRightJust:Horizontally centred bit NOT set..")
  2729. *|endif
  2730. *|ifdef TraceInit
  2731.  PROCshell_Tracef0("WindowSetTitleRightJust:Setting right justified bit..")
  2732. *|endif
  2733. z"t_flags% = t_flags% 
  2734.  (1 << 9)
  2735. w_blk%!60 = t_flags%
  2736.  "Wimp_DeleteWindow",,w_blk%
  2737.  "Wimp_CreateWindow",,w_blk% + 4 
  2738.  handle%
  2739.  wh% <> handle% 
  2740. *|ifdef TraceInit
  2741.  PROCshell_Tracef0("WindowSetTitleRightJust:Updating window handle...")
  2742. *|endif
  2743. shell_UpdateWindowHandle(wh%,handle%)
  2744.   wh% = handle%
  2745.  reopen% 
  2746. shell_OpenWindow(handle%,0,0)
  2747. shell_HeapBlockReturn(w_blk%)
  2748. ,*|Stop PROCshell_WindowSetTitleRightJust
  2749. .*|Start PROCshell_WindowSetTitleCentreJust
  2750. shell_WindowSetTitleCentreJust(
  2751.  wh%)
  2752.  w_blk%,t_flags%,handle%,reopen%
  2753. &reopen% = 
  2754. shell_WindowIsOpen(wh%)
  2755. Mw_blk% = 
  2756. shell_HeapBlockFetch(100 + (
  2757. shell_WindowCountIcons(wh%) * 32))
  2758. !w_blk% = wh%
  2759.  "Wimp_GetWindowInfo",,w_blk%
  2760. t_flags% = w_blk%!60
  2761.  PROCshell_Tracef0("WindowSetTitleCentreJust:title flags = &"+STR$~t_flags%)
  2762.  PROCshell_Tracef0("WindowSetTitleCentreJust:t_flags% AND (1 << 3) = "+STR$~(t_flags% AND (1 << 3)))
  2763.  (t_flags% 
  2764.  (1 << 3)) = 0 
  2765. *|ifdef TraceInit
  2766.  PROCshell_Tracef0("WindowSetTitleCentreJust:Horizontally centred bit not set..")
  2767.  PROCshell_Tracef0("WindowSetTitleCentreJust:Setting horizontally centred bit..")
  2768. *|endif
  2769. $  t_flags% = t_flags% 
  2770.  (1 << 3)
  2771. *|ifdef TraceInit
  2772.  PROCshell_Tracef0("WindowSetTitleCentreJust:title flags = &"+STR$~t_flags%)
  2773. *|endif
  2774.   w_blk%!60 = t_flags%
  2775.  "Wimp_DeleteWindow",,w_blk%
  2776.  "Wimp_CreateWindow",,w_blk% + 4 
  2777.  handle%
  2778.  wh% <> handle% 
  2779.   *|ifdef TraceInit
  2780. Q    
  2781.  PROCshell_Tracef0("WindowSetTitleCentreJust:Updating window handle...")
  2782.   *|endif
  2783. .    
  2784. shell_UpdateWindowHandle(wh%,handle%)
  2785.     wh% = handle%
  2786.  reopen% 
  2787. shell_OpenWindow(handle%,0,0)
  2788. shell_HeapBlockReturn(w_blk%)
  2789. -*|Stop PROCshell_WindowSetTitleCentreJust
  2790. &*|Start FNshell_GetLastMouseButton
  2791. shell_GetLastMouseButton
  2792. Evnts_GetLastMouseButton
  2793. %*|Stop FNshell_GetLastMouseButton
  2794. (*|Start FNshell_GetLastWindowClicked
  2795. shell_GetLastWindowClicked
  2796. Evnts_GetLastWindowClicked
  2797. '*|Stop FNshell_GetLastWindowClicked
  2798. &*|Start FNshell_GetLastIconClicked
  2799. shell_GetLastIconClicked
  2800. Evnts_GetLastIconClicked
  2801. %*|Stop FNshell_GetLastIconClicked
  2802. %*|Start FNshell_StrongHlpChkFiles
  2803. shell_StrongHlpChkFiles(path$)
  2804.  abort%, result%
  2805. shell_FileExists(path$ + ".HelpData") 
  2806.  HelpData file is missing..
  2807.   abort% = -1
  2808. shell_MessageOneArg("SHELLMSG32","HelpData")
  2809. shell_FileExists(path$ + ".Index") 
  2810.  Index file is missing..
  2811.   abort% = -1
  2812. shell_MessageOneArg("SHELLMSG32","Index")
  2813.  abort% = 
  2814.   result% = 
  2815.   result% = 
  2816. = result%
  2817. $*|Stop FNshell_StrongHlpChkFiles
  2818. &*|Start PROCshell_TemplateFileInfo
  2819.  Returns the size of the buffer needed by "Wimp_LoadTemplate" and
  2820.  the number of templates in the file
  2821.    Returns  0 if routine executed without errors
  2822.            -1 if filename did not exist
  2823.            -2 if file exists but is not a template file
  2824.    If the returned result is < 0 then buffer size and number of templates
  2825.    will be meaningless!
  2826. shell_TemplateFileInfo(filename$,
  2827.  buff_size%,
  2828.  nr_templates%,
  2829.  result%)
  2830.  RO3%
  2831. RO3% = 
  2832. RO3_Present
  2833.  RO3% 
  2834. shell_TemplateFileInfo3(filename$,buff_size%,nr_templates%,result%)
  2835. shell_TemplateFileInfo2(filename$,buff_size%,nr_templates%,result%)
  2836. %*|Stop PROCshell_TemplateFileInfo
  2837. '*|Start PROCshell_TemplateFileInfo2
  2838. shell_TemplateFileInfo2(filename$,
  2839.  buff_size%,
  2840.  nr_templates%,
  2841.  result%)
  2842.  pos%,total_indirsize%,largest_def%
  2843.  buff%,X%,data_size%,entry_type%
  2844.  ctr%,char%,old_ptr%,nr_icons%,j%,flags%
  2845. Ppos% = 0:nr_templates% = 0:total_indirsize% = 0:largest_def% = 0:result% = 0
  2846.  First check that the filename exists and it is a template file..
  2847. shell_FileExists(filename$) 
  2848.    result% = -1
  2849. shell_FileType(filename$) <> &FEC 
  2850.  result% = -2
  2851.  result% = 0 
  2852. *  buff%    = 
  2853. shell_HeapBlockFetch(13)
  2854. 8  X%       = 
  2855. (filename$)  :
  2856.  Open the template file
  2857. # X%  = 16                 :
  2858.  Skip header info
  2859. !    
  2860.  "OS_GBPB",4,X%,buff%,4
  2861. ;    file_offset% = !buff%: 
  2862.  File offset for this entry
  2863.  file_offset% > 0 
  2864.       nr_templates%   += 1
  2865.       indirected_size% = 0
  2866. #      
  2867.  "OS_GBPB",4,X%,buff%,4
  2868. E      data_size%  = !buff%         :
  2869.  Size of data for this entry
  2870. 8      
  2871.  "OS_GBPB",4,X%,buff%,4   :
  2872.  Read entry type
  2873.     A      entry_type% = !buff%         :
  2874.  Entry type (1 = window)
  2875. F      
  2876.  "OS_GBPB",4,X%,buff%,12  :
  2877.  Read window identifier string
  2878. G      old_ptr% = 
  2879. # X%           :
  2880.  Save current pointer position..
  2881. J      
  2882. # X%  = file_offset% + 56 :
  2883.  Move pointer to title flags word..
  2884. C      
  2885.  "OS_GBPB",4,X%,buff%,4   :
  2886.  Read title bar flag word..
  2887.       flags% = !buff%
  2888. Q      
  2889. # X% = file_offset% + 72  :
  2890.  Move pointer to start of title bar data..
  2891. I      
  2892.  "OS_GBPB",4,X%,buff%,12  :
  2893.  Read 3 words of title bar data..
  2894. Q      indirected_size%  += 
  2895. shell_IconIndirSize(file_offset%,flags%,buff%,X%)
  2896. I      
  2897. # X% =  file_offset% + 84 :
  2898.  Move pointer to icon count word..
  2899. ;      
  2900.  "OS_GBPB",4,X%,buff%,4   :
  2901.  Read nr of icons..
  2902.       nr_icons% = !buff%
  2903.       
  2904.  nr_icons% > 0 
  2905. $        
  2906.  j% = 0 
  2907.  nr_icons% - 1
  2908. 8          
  2909. # X% = file_offset% + 88 + (j% * 32) + 16
  2910. @          
  2911.  "OS_GBPB",4,X%,buff%,4 :
  2912.  Read icon flag word..
  2913.           flags% = !buff%
  2914. 8          
  2915. # X% = file_offset% + 88 + (j% * 32) + 20
  2916. H          
  2917.  "OS_GBPB",4,X%,buff%,12  :
  2918.  Read 3 words of icon data..
  2919. U          indirected_size%  += 
  2920. shell_IconIndirSize(file_offset%,flags%,buff%,X%)
  2921.         
  2922.       
  2923.       
  2924. # X% = old_ptr%
  2925.  .      total_indirsize% += indirected_size%
  2926. !'      
  2927.  data_size% > largest_def% 
  2928. "%        largest_def% = data_size%
  2929.       
  2930. $        
  2931.  file_offset% = 0
  2932. # X%                        :
  2933.  Close the template file
  2934. shell_HeapBlockReturn(buff%) :
  2935.  Release workspace buffer
  2936. (3  buff_size% =  largest_def% + total_indirsize%
  2937. ,&*|Stop PROCshell_TemplateFileInfo2
  2938. .'*|Start PROCshell_TemplateFileInfo3
  2939. shell_TemplateFileInfo3(filename$,
  2940.  buff_size%,
  2941.  nr_templates%,
  2942.  result%)
  2943.  pos%,total_indirsize%,largest_def%,file_offset%
  2944.  buff%
  2945.  ctr%,char%,old_ptr%,nr_icons%,j%,flags%
  2946.  Returns the size of the buffer needed by "Wimp_LoadTemplate"
  2947.  and the number of templates in the file
  2948. 5Dpos% = 0:nr_templates% = 0:total_indirsize% = 0:largest_def% = 0
  2949. 6%buff% = 
  2950. shell_HeapBlockFetch(13)
  2951.  "Wimp_OpenTemplate",,filename$
  2952.   $buff% = "*"
  2953.  the following only works on RISC OS 3...
  2954.  "Wimp_LoadTemplate",,-1,,,,buff%,pos% 
  2955.  ,buff_size%,indirsize%,,,,pos%
  2956.  pos% <> 0 
  2957. =?    
  2958.  buff_size% > largest_def% 
  2959.  largest_def% = buff_size%
  2960. >&    total_indirsize% += indirsize%
  2961.     nr_templates% += 1
  2962.  pos% = 0
  2963.  "Wimp_CloseTemplate"
  2964. C0buff_size% = largest_def% + total_indirsize%
  2965. shell_HeapBlockReturn(buff%)
  2966. G&*|Stop PROCshell_TemplateFileInfo3
  2967. *|Start FNRO3_Present
  2968. RO3_Present
  2969.  blk%,len%,result$, return_code%
  2970.  Returns TRUE if RISC OS 3 is present, otherwise FALSE
  2971. MAblk% = 
  2972. shell_HeapBlockFetch(256)     :
  2973.  Claim some workspace
  2974. ("Set RO3$Check Y")    :
  2975.  Set a system variable to "Y"
  2976.  The next line sets the system variable to "N" if RISC OS 3 or better is
  2977.  not present.
  2978. ("RMEnsure UtilityModule 3.00 Set RO3$Check N")
  2979.  Now we check the value of the system variable by reading it into a buffer
  2980.  "OS_ReadVarVal","RO3$Check",blk%,256,0,0 
  2981.  ,,len%
  2982.  Add string terminator so that BASIC can read it
  2983. blk%?len% = 13
  2984.  Unset the system variable to tidy things up
  2985. ("Unset RO3$Check")
  2986. result$ = $blk%
  2987. shell_HeapBlockReturn(blk%)
  2988.  result$ = "N" 
  2989.   return_code% = 
  2990.   return_code% = 
  2991. = return_code%
  2992. *|Stop FNRO3_Present
  2993. *|Start FN_shell_icondrag
  2994. _shell_icondrag(wh%,ih%)
  2995. shell_IconDragBox(wh%,ih%)
  2996. *|Stop FN_shell_icondrag
  2997. o**|Start PROCshell_MessageSendPrintSave
  2998. shell_MessageSendPrintSave(FileType%,copies%)
  2999.  copies% > 1 
  3000.  _U%!336 = copies% - 1 
  3001.  _U%!336 = 0
  3002. shell_DoSendPrintSave(FileType%)
  3003. u)*|Stop PROCshell_MessageSendPrintSave
  3004. w%*|Start PROCshell_DoSendPrintSave
  3005. shell_DoSendPrintSave(FileType%)
  3006.  msgblk%
  3007. z+msgblk%    = 
  3008. shell_HeapBlockFetch(256)
  3009. {5msgblk%!0  = 256       :
  3010.  length of message block
  3011. |1msgblk%!12 = 0         :
  3012.  myref 0=originating
  3013. }8msgblk%!16 = &80142    :
  3014.  message action (PrintSave)
  3015. ~7msgblk%!20 = 0         :
  3016.  destination window handle
  3017. 5msgblk%!24 = 0         :
  3018.  destination icon handle
  3019. +msgblk%!28 = 0         :
  3020.  mouse x coord
  3021. +msgblk%!32 = 0         :
  3022.  mouse y coord
  3023. 4msgblk%!36 = 256       :
  3024.  estimated size of file
  3025. 'msgblk%!40 = FileType% :
  3026.  file type
  3027. '$(msgblk% + 44) = "PrintOut" + 
  3028. *|ifdef TraceInit
  3029.  PROCshell_Tracef0("MessageSendPrintSave:Sending PrintSave message..")
  3030. *|endif
  3031.  "Wimp_SendMessage",18,msgblk%,msgblk%!20,msgblk%!24
  3032. shell_HeapBlockReturn(msgblk%)
  3033. $*|Stop PROCshell_DoSendPrintSave
  3034. %*|Start PROCshell_HandlePrintFile
  3035. shell_HandlePrintFile(_Q%)
  3036. *|ifdef TraceInit
  3037.  PROCshell_Tracef0("HandlePrintFile:Message_PrintFile received")
  3038. *|endif
  3039. $*|Stop PROCshell_HandlePrintFile
  3040. &*|Start PROCshell_HandlePrintError
  3041. shell_HandlePrintError(_Q%)
  3042. *|ifdef TraceInit
  3043.  PROCshell_Tracef0("HandlePrintError:Message_PrintError received")
  3044. *|endif
  3045. %*|Stop PROCshell_HandlePrintError
  3046. (*|Start PROCshell_HandlePrintTypeOdd
  3047. shell_HandlePrintTypeOdd(_Q%)
  3048. *|ifdef TraceInit
  3049.  PROCshell_Tracef0("HandlePrintTypeOdd:Message_PrintTypeOdd received")
  3050. *|endif
  3051. '*|Stop PROCshell_HandlePrintTypeOdd
  3052. &*|Start PROCshell_HandleSetPrinter
  3053. shell_HandleSetPrinter(_Q%)
  3054. *|ifdef TraceInit
  3055.  PROCshell_Tracef0("HandleSetPrinter:Message_SetPrinter received")
  3056. *|endif
  3057. %*|Stop PROCshell_HandleSetPrinter
  3058. *|Start FNshell_3DEnabled
  3059. shell_3DEnabled
  3060.  val%,_3d%
  3061.  _U%!100 
  3062.  (1 << 10) 
  3063.  RISC OS 3 detected..
  3064.  "OS_Byte",161,140 
  3065.  ,,val%
  3066.  (val% 
  3067.  _3d% = 
  3068.  _3d% = 
  3069.  No RISC OS 3..
  3070.   _3d% = 
  3071. = _3d%
  3072. *|Stop FNshell_3DEnabled
  3073. ,*|Start PROCshell_HandleAttachedDataSave
  3074. shell_HandleAttachedDataSave(_Q%,wh%,ih%)
  3075.  e_offset%,blk%,name_ic%,_name$,temp%,void%
  3076.  check filename in icon if datasave event exists
  3077.  icon was 0.....
  3078. shell_DataSaveCheckName(wh%,ih%)
  3079.  check if an event has been registered for when the drag ends..
  3080. ?e_offset% = 
  3081. shell_GetEventListOffset(wh%,-1,_U% + 72,24,
  3082.  e_offset% >= 0 
  3083.   blk% = _U%!72 + e_offset%
  3084.   name_ic% = blk%!16
  3085. 1  _name$   = 
  3086. shell_IconGetData(wh%,name_ic%)
  3087.   temp%    = blk%!20
  3088.  $temp% <> "" 
  3089.  void% = 
  3090. ("FN" + $temp%+"(_name$)")
  3091. +*|Stop PROCshell_HandleAttachedDataSave
  3092. *|Start FNshell_InstallLib
  3093. shell_InstallLib( lib$ )
  3094.  void%, mess$
  3095. mess$ = "The library routine 'FNshell_InstallLib' is no longer supported. Please load the library with the LIBRARY command and call the initialise routine with 'void% = FN_shell_<libname>_init'"
  3096. Cvoid% = 
  3097. shell_MessageWindow( mess$, 
  3098. shell_GetAppName, "" )
  3099. _closedown% = 
  3100.  LOCAL file_handle%
  3101.  LOCAL ERROR
  3102.  file_handle% = OPENIN( lib$ )
  3103.  IF file_handle% = 0 THEN CLOSE# file_handle% : ERROR 1, "Unable to install " + lib$
  3104.  CLOSE# file_handle%
  3105.  LIBRARY lib$
  3106.  lib$ = RIGHT$( lib$, 10 )
  3107.  WHILE INSTR( lib$, "." )
  3108.    lib$ = MID$( lib$, INSTR( lib$, "." ) + 1 )
  3109.  ENDWHILE
  3110.  ON ERROR MODE12:PRINT"FN_shell_" + lib$ + "_Init not found":END
  3111.  = EVAL( "FN_shell_" + lib$ + "_Init" )
  3112. *|Stop FNshell_InstallLib
  3113.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3114.  Module Iconbar
  3115.  -----------------------------------------------------------------------
  3116.  Iconbar Handling Routines (version 1.01 21-Nov-95)
  3117.  This library contains routines that handle the iconbar icon
  3118.  -----------------------------------------------------------------------
  3119.  Structure of Data used in this module
  3120.  Public Methods Supported:
  3121.    FN_shell_Iconbar_Init                 Initialises module
  3122.    FNshell_Iconbar
  3123.    PROCshell_IconbarSetText
  3124.  Private Methods Supported:
  3125.    None
  3126. !*|Start FN_shell_Iconbar_Init
  3127. _shell_Iconbar_Init
  3128.  *|Stop FN_shell_Iconbar_Init
  3129. *|Start FNshell_Iconbar
  3130. shell_Iconbar( pos%, sname$, text$, width%, menu%, shift%, ctrl%, alt% )
  3131.  handle%, block%, ibar_text_buffer%, ibar_sprite_name%
  3132.  If the iconbar icon is to have text under it then it must be
  3133.  available in the wimp sprite pool!
  3134. (block% = 
  3135. shell_HeapBlockFetch( 36 )
  3136.  ibar_text_buffer% 20
  3137.  ibar_sprite_name% 20
  3138. %!block%   = pos% :
  3139.  window handle
  3140. 3block%!4  = 0    :
  3141.  min x coord of bounding box
  3142. 3block%!12 = 96   :
  3143.  max x coord of bounding box
  3144.  text$ <> "" 
  3145.  IF FNshell_SpriteExistsInWimpPool( sname$ ) THEN
  3146. "9    block%!12 = width% :
  3147.  max x coord of bounding box
  3148. #9    block%!8  = -16    :
  3149.  min y coord of bounding box
  3150. $9    block%!16 = 92     :
  3151.  max y coord of bounding box
  3152.     block%!32 = 
  3153. ( text$ )
  3154.  ELSE
  3155.    ERROR 99,"Sprite '" + sname$ + "'not found in !Sprites/!Sprites22 file"
  3156.  ENDIF
  3157.  IF FNshell_SpriteExistsInUserArea( sname$ ) THEN
  3158. +4  block%!8  = 0   :
  3159.  min y coord of bounding box
  3160. ,4  block%!16 = 70  :
  3161.  max y coord of bounding box
  3162.   block%!32 = 12
  3163.  ELSE
  3164.    ERROR 99,"Sprite '" + sname$ + "'not found in Sprites/Sprites22 file"
  3165.  ENDIF
  3166. block%!20 = &1700310B
  3167. 4!block%!24 = ibar_text_buffer%
  3168. 5!block%!28 = ibar_sprite_name%
  3169. $ibar_text_buffer% = text$
  3170. $ibar_sprite_name% = sname$
  3171.  "Wimp_CreateIcon", , block% 
  3172.  handle%
  3173. shell_AttachMenu( -2, handle%, menu%, shift%, ctrl%, alt% )
  3174. shell_HeapBlockReturn( block% )
  3175. shell_IconNewSprite( pos%, handle%, sname$ )
  3176. *|Stop FNshell_Iconbar
  3177. A$*|Start PROCshell_IconbarSetText
  3178. shell_IconbarSetText( window_handle%, icon_handle%, new_text$ )
  3179.  icon_blk%
  3180. D+icon_blk% = 
  3181. shell_HeapBlockFetch( 40 )
  3182. E !icon_blk%  = window_handle%
  3183. icon_blk%!4 = icon_handle%
  3184.  "Wimp_GetIconState",,icon_blk%
  3185. H!$( icon_blk%!28 ) = new_text$
  3186. shell_IconRedraw( window_handle%, icon_handle% )
  3187. shell_HeapBlockReturn( icon_blk% )
  3188. M#*|Stop PROCshell_IconbarSetText
  3189.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3190.  Module Files
  3191.  -----------------------------------------------------------------------
  3192.  Files Handling Routines
  3193.  -----------------------------------------------------------------------
  3194.  Structure of Data used in this module
  3195.  Public Methods Supported:
  3196.    FN_shell_Files_Init                 Initialises module
  3197.    FNshell_FileLength
  3198.    FNshell_FileType
  3199.    FNshell_FileExists
  3200.    FNshell_CatInfoRead
  3201.    FNshell_FileGetDateStamp
  3202.  Private Methods Supported:
  3203.       None
  3204. *|Start FN_shell_Files_Init
  3205. _shell_Files_Init
  3206. *|Stop FN_shell_Files_Init
  3207. *|Start FNshell_FileLength
  3208. shell_FileLength(object$)
  3209.  type%,load_addr%,exec_addr%,length%,atts%,string$
  3210.  "OS_File",5,object$ 
  3211.  type%,,load_addr%,exec_addr%,length%,atts%
  3212. =length%
  3213. *|Stop FNshell_FileLength
  3214. *|Start FNshell_FileType
  3215. shell_FileType( object$ )
  3216.  type%
  3217.  "OS_File", 5, object$ 
  3218.  , , type%
  3219. |$type% = ( type% 
  3220.  &FFF00 ) >>> 8
  3221. = type%
  3222. *|Stop FNshell_FileType
  3223. *|Start FNshell_FileExists
  3224. shell_FileExists( object$ )
  3225.  type%, USE_FILEPATH, result%
  3226. USE_FILEPATH = 5
  3227.  "OS_File", USE_FILEPATH, object$ 
  3228.  type%
  3229.  type% = 0 
  3230.   result% = 
  3231.   result% = 
  3232. = result%
  3233. *|Stop FNshell_FileExists
  3234. *|Start FNshell_CatInfoRead
  3235. shell_CatInfoRead( object$ )
  3236.  type%, load_addr%, exec_addr%, length%, atts%, string$
  3237.  "OS_File", 5, object$ 
  3238.  type%, , load_addr%, exec_addr%, length%, atts%
  3239.  type% = 0   
  3240.  = "Not Found"
  3241.  atts% = 51  
  3242.  string$ += "WR "
  3243.  atts% = 187 
  3244.  string$ += "LWR"
  3245.  atts% = 136 
  3246.  string$ += "DL "
  3247. Dstring$ += " " + 
  3248. shell_StringPadLeading( 
  3249. ~load_addr%, "0", 8 )
  3250. Dstring$ += " " + 
  3251. shell_StringPadLeading( 
  3252. ~exec_addr%, "0", 8 )
  3253. Astring$ += " " + 
  3254. shell_StringPadLeading( 
  3255. ~length%, "0", 8 )
  3256. = string$
  3257. *|Stop FNshell_CatInfoRead
  3258. $*|Start FNshell_FileGetDateStamp
  3259. shell_FileGetDateStamp( object$ )
  3260.  type%, datestamp%, USE_FILEPATH
  3261. USE_FILEPATH = 5
  3262.  "OS_File", USE_FILEPATH, object$ 
  3263.  type%, , , datestamp%
  3264.  type% = 0 
  3265. = datestamp%
  3266. #*|Stop FNshell_FileGetDateStamp
  3267.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3268.  Module Evnts
  3269.  -----------------------------------------------------------------------
  3270.  Evnts Handling Routines (version 1.47 18-Apr-96)
  3271.  -----------------------------------------------------------------------
  3272.  Structure of Data used in this module
  3273.  Public Methods Supported:
  3274.    FN_shell_Evnts_Init           Initialises module
  3275.    FNEvnts_GetLastMouseButton
  3276.    FNEvnts_GetLastIconClicked
  3277.    FNEvnts_GetLastWindowClicked
  3278.    FNEvnts_GetLastMouseXPos
  3279.    FNEvnts_GetLastMouseYPos
  3280.    FNshell_Evnts_DragIconStartIcon
  3281.    FNshell_Evnts_DragIconStartWindow
  3282.    FNshell_Evnts_WritableDragInProgress
  3283.    PROCshell_AttachClickSelect
  3284.    PROCshell_AttachClickAdjust
  3285.    PROCshell_AttachMenu
  3286.    PROCshell_AttachMenuMaker
  3287.    PROCshell_AttachColourPopupMenu
  3288.    PROCshell_AttachPopupMenu
  3289.    PROCshell_AttachHelpTag
  3290.    PROCshell_AttachMenuHelpTag
  3291.    PROCshell_AttachUserRedraw
  3292.    PROCshell_EvntAdd_PointerIn
  3293.    PROCshell_EvntAdd_PointerOut
  3294.    PROCshell_EvntAdd_WindowOpen
  3295.    PROCshell_AttachCloseWindowHandler
  3296.    PROCshell_AttachPane
  3297.    PROCshell_HidePane
  3298.    PROCshell_ShowPane
  3299.    PROCshell_AttachIconWatch
  3300.    PROCshell_AttachUserDrag
  3301.    PROCshell_ListClickSelect
  3302.    PROCshell_ListClickAdjust
  3303.    PROCshell_ListClickMenu
  3304.    PROCshell_ListHelpTags
  3305.    PROCshell_ListRedraw
  3306.    PROCshell_ListPointerIn
  3307.    PROCshell_ListPointerOut
  3308.    PROCshell_ListWindowOpen
  3309.    PROCshell_ListWindowClose
  3310.    PROCshell_ListPopUps
  3311.    PROCshell_ListPanes
  3312.    PROCshell_ListIconWatch
  3313.    PROCshell_EvntSave_AllEvnts
  3314.    PROCshell_EvntLoad_AllEvnts
  3315.    PROCshell_OpenWindow
  3316.    PROCshell_EvntSelectButtonPressed
  3317.    PROCshell_EvntAdjustButtonPressed
  3318.    PROCshell_EvntMenuButtonPressed
  3319.  Private Methods Supported:
  3320.    PROCshell_PaneSetVisibility
  3321.    PROCEvnts_GetBlockAndSize
  3322.    PROCEvnts_DebugListHeader
  3323.    PROCEvnts_UpdateData
  3324.    PROCEvnts_DeleteEvnt
  3325.    PROCEvnts_DeleteData
  3326.    PROCshell_EvntAdd_PopUpMenu
  3327.    PROCshell_EvntHandle_ClickSelect
  3328.    PROCshell_EvntHandle_ClickAdjust
  3329.    PROCshell_EvntHandle_ClickMenu
  3330.    PROCshell_EvntHandle_HelpTags
  3331.    PROCshell_EvntHandle_Redraw
  3332.    PROCshell_EvntHandle_PointerIn
  3333.    PROCshell_EvntHandle_PointerOut
  3334.    PROCEvnts_CallMenuHandler
  3335.    PROCshell_EvntHandle_WindowClose
  3336.    PROCshell_EvntHandle_PopUpMenu
  3337.    PROCshell_EvntHandle_IconWatch
  3338.    PROCshell_EvntHandle_MenuSelect
  3339.    PROCshell_EvntHandle_PopupSelect
  3340.    PROCshell_EvntHandle_UserDragStartDrag
  3341.    PROCshell_EvntHandle_UserDragEnd
  3342.    FNshell_EvntHandle_AttachedHelp
  3343.    FNshell_EvntHandle_MenuHelp
  3344.    FNEvnts_GetEvntListOffset
  3345.    FNEvnts_GetHeaderSize
  3346. *|Start FN_shell_Evnts_Init
  3347. _shell_Evnts_Init
  3348. _m_Evnts_HeaderSize%  = 8
  3349. !_m_Evnts_LastEvntOffset% = -1
  3350.  _c_Evnts_WorkBuffer%  256
  3351.  _c_Evnts_PaneBlk%     3000
  3352.  _EVNTS_CLICKSELECT_ANCHOR%  4
  3353.  _EVNTS_CLICKADJUST_ANCHOR%  4
  3354.  _EVNTS_CLICKMENU_ANCHOR%    4
  3355.  _EVNTS_HELPTAG_ANCHOR%      4
  3356.  _EVNTS_POPUPS_ANCHOR%       4
  3357.  _EVNTS_PANES_ANCHOR%        4
  3358.  _EVNTS_SLIDERS_ANCHOR%      4
  3359.  _EVNTS_POINTERIN_ANCHOR%    4
  3360.  _EVNTS_POINTEROUT_ANCHOR%   4
  3361.  _EVNTS_DATASAVE_ANCHOR%     4
  3362.  _EVNTS_REDRAW_ANCHOR%       4
  3363.  _EVNTS_DRAG_ANCHOR%         4
  3364.  _EVNTS_BUMP_ANCHOR%         4
  3365.  _EVNTS_WINDOWOPEN_ANCHOR%   4
  3366.  _EVNTS_WINDOWCLOSE_ANCHOR%  4
  3367.  _EVNTS_ICONWATCH_ANCHOR%    4
  3368.  _EVNTS_MENUHELPTAG_ANCHOR%  4
  3369. )$!_EVNTS_CLICKSELECT_ANCHOR%  = 0
  3370. *$!_EVNTS_CLICKADJUST_ANCHOR%  = 0
  3371. +$!_EVNTS_CLICKMENU_ANCHOR%    = 0
  3372. ,$!_EVNTS_HELPTAG_ANCHOR%      = 0
  3373. -$!_EVNTS_POPUPS_ANCHOR%       = 0
  3374. .$!_EVNTS_SLIDERS_ANCHOR%      = 0
  3375. /$!_EVNTS_PANES_ANCHOR%        = 0
  3376. 0$!_EVNTS_POINTERIN_ANCHOR%    = 0
  3377. 1$!_EVNTS_POINTEROUT_ANCHOR%   = 0
  3378. 2$!_EVNTS_DATASAVE_ANCHOR%     = 0
  3379. 3$!_EVNTS_REDRAW_ANCHOR%       = 0
  3380. 4$!_EVNTS_DRAG_ANCHOR%         = 0
  3381. 5$!_EVNTS_BUMP_ANCHOR%         = 0
  3382. 6$!_EVNTS_WINDOWOPEN_ANCHOR%   = 0
  3383. 7$!_EVNTS_WINDOWCLOSE_ANCHOR%  = 0
  3384. 8$!_EVNTS_ICONWATCH_ANCHOR%    = 0
  3385. 9$!_EVNTS_MENUHELPTAG_ANCHOR%  = 0
  3386.  _EVNTS_CLICKSELECT_DATA% 4
  3387.  _EVNTS_CLICKADJUST_DATA% 4
  3388.  _EVNTS_CLICKMENU_DATA%   4
  3389.  _EVNTS_HELPTAG_DATA%     4
  3390.  _EVNTS_POPUPS_DATA%      4
  3391.  _EVNTS_PANES_DATA%       4
  3392.  _EVNTS_SLIDERS_DATA%     4
  3393.  _EVNTS_POINTERIN_DATA%   4
  3394.  _EVNTS_POINTEROUT_DATA%  4
  3395.  _EVNTS_DATASAVE_DATA%    4
  3396.  _EVNTS_REDRAW_DATA%      4
  3397.  _EVNTS_DRAG_DATA%        4
  3398.  _EVNTS_BUMP_DATA%        4
  3399.  _EVNTS_WINDOWOPEN_DATA%  4
  3400.  _EVNTS_WINDOWCLOSE_DATA% 4
  3401.  _EVNTS_ICONWATCH_DATA%   4
  3402.  _EVNTS_MENUHELPTAG_DATA% 4
  3403. M!!_EVNTS_CLICKSELECT_DATA% = 0
  3404. N!!_EVNTS_CLICKADJUST_DATA% = 0
  3405. O!!_EVNTS_CLICKMENU_DATA%   = 0
  3406. P!!_EVNTS_HELPTAG_DATA%     = 0
  3407. Q!!_EVNTS_POPUPS_DATA%      = 0
  3408. R!!_EVNTS_PANES_DATA%       = 0
  3409. S!!_EVNTS_POINTERIN_DATA%   = 0
  3410. T!!_EVNTS_POINTEROUT_DATA%  = 0
  3411. U!!_EVNTS_DATASAVE_DATA%    = 0
  3412. V!!_EVNTS_REDRAW_DATA%      = 0
  3413. W!!_EVNTS_DRAG_DATA%        = 0
  3414. X!!_EVNTS_BUMP_DATA%        = 0
  3415. Y!!_EVNTS_WINDOWOPEN_DATA%  = 0
  3416. Z!!_EVNTS_WINDOWCLOSE_DATA% = 0
  3417. [!!_EVNTS_SLIDERS_DATA%     = 0
  3418. \!!_EVNTS_ICONWATCH_DATA%   = 0
  3419. ]!!_EVNTS_MENUHELPTAG_DATA% = 0
  3420. _%_EVNTS_CLICKSELECT_REC_SIZE% = 20
  3421. `%_EVNTS_CLICKADJUST_REC_SIZE% = 20
  3422. a%_EVNTS_CLICKMENU_REC_SIZE%   = 24
  3423. b%_EVNTS_HELPTAG_REC_SIZE%     = 20
  3424. c%_EVNTS_POPUPS_REC_SIZE%      = 36
  3425. d%_EVNTS_PANES_REC_SIZE%       = 32
  3426. e%_EVNTS_POINTERIN_REC_SIZE%   = 20
  3427. f%_EVNTS_POINTEROUT_REC_SIZE%  = 20
  3428. g%_EVNTS_DATASAVE_REC_SIZE%    = 20
  3429. h%_EVNTS_REDRAW_REC_SIZE%      = 20
  3430. i%_EVNTS_DRAG_REC_SIZE%        = 28
  3431. j%_EVNTS_BUMP_REC_SIZE%        = 44
  3432. k%_EVNTS_SLIDERS_REC_SIZE%     = 40
  3433. l%_EVNTS_WINDOWOPEN_REC_SIZE%  = 20
  3434. m%_EVNTS_WINDOWCLOSE_REC_SIZE% = 20
  3435. n%_EVNTS_ICONWATCH_REC_SIZE%   = 24
  3436. o%_EVNTS_MENUHELPTAG_REC_SIZE% = 20
  3437. qV_EVNTS_CLICKSELECT_DATAOFFSET% = 0 : 
  3438.  Offset to location to store next event data
  3439. r&_EVNTS_CLICKADJUST_DATAOFFSET% = 0
  3440. s&_EVNTS_CLICKMENU_DATAOFFSET%   = 0
  3441. t&_EVNTS_HELPTAG_DATAOFFSET%     = 0
  3442. u&_EVNTS_POPUPS_DATAOFFSET%      = 0
  3443. v&_EVNTS_PANES_DATAOFFSET%       = 0
  3444. w&_EVNTS_POINTERIN_DATAOFFSET%   = 0
  3445. x&_EVNTS_POINTEROUT_DATAOFFSET%  = 0
  3446. y&_EVNTS_DATASAVE_DATAOFFSET%    = 0
  3447. z&_EVNTS_REDRAW_DATAOFFSET%      = 0
  3448. {&_EVNTS_DRAG_DATAOFFSET%        = 0
  3449. |&_EVNTS_BUMP_DATAOFFSET%        = 0
  3450. }&_EVNTS_SLIDERS_DATAOFFSET%     = 0
  3451. ~&_EVNTS_WINDOWOPEN_DATAOFFSET%  = 0
  3452. &_EVNTS_WINDOWCLOSE_DATAOFFSET% = 0
  3453. &_EVNTS_ICONWATCH_DATAOFFSET%   = 0
  3454. &_EVNTS_MENUHELPTAG_DATAOFFSET% = 0
  3455. "_EVNTS_LAST_MOUSEBUTTON%   = 0
  3456. "_EVNTS_LAST_MOUSEXPOS%     = 0
  3457. "_EVNTS_LAST_MOUSEYPOS%     = 0
  3458. #_EVNTS_LAST_ICONCLICKED%   = -1
  3459. #_EVNTS_LAST_WINDOWCLICKED% = -1
  3460. #_EVNTS_LAST_MENUMAKER_FN$  = ""
  3461. #_m_evnts_DestTaskHandle%   = -1
  3462. #_m_evnts_DestWindowHandle% = -1
  3463. #_m_evnts_DestIconHandle%   = -1
  3464. #_m_evnts_MouseXCoord%      = -1
  3465. #_m_evnts_MouseYCoord%      = -1
  3466. '_m_evnts_DragIconStartWindow%  = -1
  3467. '_m_evnts_DragIconStartIcon%    = -1
  3468. &_m_evnts_DragIconWritableDrag% = 
  3469. !_m_evnts_DragIconWinXMin% = 0
  3470. !_m_evnts_DragIconWinYMin% = 0
  3471. !_m_evnts_DragIconWinXMax% = 0
  3472. !_m_evnts_DragIconWinYMax% = 0
  3473. ]_m_evnts_DragIconMouseX% = 0          :
  3474.  Keeps track of mouse movements during icon drags
  3475. ]_m_evnts_DragIconMouseY% = 0          :
  3476.  Keeps track of mouse movements during icon drags
  3477. )_m_evnts_DragIconLastScrollUp%    = 0
  3478. )_m_evnts_DragIconLastScrollDown%  = 0
  3479. )_m_evnts_DragIconLastScrollLeft%  = 0
  3480. )_m_evnts_DragIconLastScrollRight% = 0
  3481. )_m_evnts_DragIconLastDX%          = 0
  3482. )_m_evnts_DragIconLastDY%          = 0
  3483. J_m_evnts_DragIconMargin%          = 32 :
  3484.  Autoscroll margin (OS units)
  3485.  storage for 'current icon contents' used by IconWatch..
  3486. %_c_evnts_MaxIconWatchEvnts% = 100
  3487.  _c_evnts_CurrentContents$( _c_evnts_MaxIconWatchEvnts% - 1 )
  3488. $_c_evnts_CurrentContents$() = ""
  3489. *|Stop FN_shell_Evnts_Init
  3490.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3491.  Private Routines
  3492.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3493.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3494.  Find offset of data in event list block given the window identifier and
  3495.  icon handles. returns -1 if no events found, -2 if heapblock not
  3496.  defined if add% is FALSE. When add is TRUE then the list is extended
  3497.  and the offset to the new record is returned.
  3498.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3499. %*|Start FNEvnts_GetEvntListOffset
  3500. Evnts_GetEvntListOffset( window_name$, icon_handle%, evnt_list%, rec_size%, add% )
  3501.  list_size%, ptr%, found%, offset%, evnt_addr%, e_ptr%
  3502.  loop%
  3503.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:rec_size% = " +STR$ rec_size% )
  3504.  window_name$ = "IconBar" 
  3505.   icon_handle% = -1
  3506.   window_name$ = "iconbar"
  3507.  ( !evnt_list% = 0 
  3508.  add% = 
  3509.  = -2:
  3510.  no heapblock defined
  3511.  window_name$ = "" 
  3512.  = -1
  3513.  ( !evnt_list% = 0 ) 
  3514.  no heap block defined and add flag is true...
  3515. M  !evnt_list% = 
  3516. shell_HeapBlockFetch( rec_size% + _m_Evnts_HeaderSize% )
  3517. :  evnt_addr%                             = !evnt_list%
  3518. U  evnt_addr%!0                           = rec_size%  :
  3519.  Size of this event block
  3520. T  evnt_addr%!4                           = 1          :
  3521.  Nr of events registered
  3522. X  $( evnt_addr% + _m_Evnts_HeaderSize% )   = ""        :
  3523.  Initialise the window name
  3524.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:Initialising event block for first event.." )
  3525.  loop% = 12 
  3526.  ( rec_size% - 4 ) 
  3527. 8    evnt_addr%!( loop% + _m_Evnts_HeaderSize% ) = -1
  3528.  loop%
  3529. 5  _m_Evnts_LastEvntOffset% = _m_Evnts_HeaderSize%
  3530. $  offset% = _m_Evnts_HeaderSize%
  3531.  offset% <> _m_Evnts_HeaderSize% 
  3532.   evnt_addr% = !evnt_list%
  3533.   list_size% = !evnt_addr%
  3534.  PROCshell_Tracef0("Evnts_GetEvntListOffset:list size is "+STR$ list_size%)
  3535.  PROCshell_Tracef0("Evnts_GetEvntListOffset:window_name$ = "+window_name$ )
  3536. $  ptr%    = _m_Evnts_HeaderSize%
  3537.   found%  = 
  3538.   offset% = -1
  3539.   empty%  = -1
  3540.   e_ptr%  = !evnt_list%
  3541. 1    
  3542.  ( $( e_ptr% + ptr% ) = window_name$ ) 
  3543. :      
  3544.  PROCshell_Tracef0("DEBUG:window name found..")
  3545. 6      
  3546.  check icon handle in event block as well..
  3547. P      
  3548.  PROCshell_Tracef0("DEBUG:icon handle is "+STR$(e_ptr%!( ptr% + 12)))
  3549. 0      
  3550.  e_ptr%!( ptr% + 12) = icon_handle% 
  3551.           offset% = ptr%
  3552.           found%  = 
  3553.       
  3554.         ptr% += rec_size%
  3555.       
  3556.         
  3557. +      
  3558.  no match, so check next event..
  3559.       ptr% += rec_size%
  3560.         
  3561.  ( ( ptr% >= ( list_size% + _m_Evnts_HeaderSize% ) ) 
  3562.  found% )
  3563.  ( offset% = -1 
  3564.  add% ) 
  3565. 3    offset% = list_size% + _m_Evnts_HeaderSize%
  3566. F    !evnt_list% = 
  3567. shell_HeapBlockExtend( !evnt_list%, rec_size% )
  3568.      e_addr%    = !evnt_list%
  3569.     e_addr%!0 += rec_size%
  3570.     e_addr%!4 += 1
  3571.     e_addr%   += offset%
  3572.     $( e_addr% ) = ""
  3573. S    
  3574.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:Initialising event block.." )
  3575. ,    
  3576.  loop% = 12 
  3577.  ( rec_size% - 4 ) 
  3578.       e_addr%!loop% = -1
  3579.  loop%
  3580.  offset% < 0 
  3581. I    
  3582.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:evnt NOT found.." )
  3583. ]    
  3584.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:evnt found at offset " + STR$ offset% )
  3585. (  _m_Evnts_LastEvntOffset% = offset%
  3586. = offset%
  3587. $*|Stop FNEvnts_GetEvntListOffset
  3588.  *|Start PROCEvnts_UpdateData
  3589. Evnts_UpdateData( data_offset_addr%, data_blk_anchor%, 
  3590.  data_offset%, data$ )
  3591.  curr_evnt_data$
  3592.  IF !data_offset_addr% < -1 OR !data_offset_addr% > 3000 THEN ERROR 99,"Bad data offset! (value is "+STR$(!data_offset_addr%) + ")"
  3593.  !data_offset_addr% = -1 
  3594.  No data for this event currently stored..
  3595. !'  !data_offset_addr% = data_offset%
  3596. "U  !data_blk_anchor% = 
  3597. shell_HeapBlockExtend( !data_blk_anchor%, 
  3598. ( data$ ) + 1 )
  3599. #3  $( !data_blk_anchor% + data_offset% ) = data$
  3600. $$  data_offset% += 
  3601. ( data$ ) + 1
  3602.  Check currently stored data..
  3603. 'C  curr_evnt_data$ = $( !data_blk_anchor% + !data_offset_addr% )
  3604.  curr_evnt_data$ <> data$ 
  3605. )/    
  3606. ( data$ ) <= 
  3607.  ( curr_evnt_data$ ) 
  3608. *-      
  3609.  Store new data$ in old position..
  3610. +=      $( !data_blk_anchor% + !data_offset_addr% ) = data$
  3611. ,        
  3612. -;      
  3613.  New user_FN name won't fit, extend data block..
  3614. .Y      !data_blk_anchor% = 
  3615. shell_HeapBlockExtend( !data_blk_anchor%, 
  3616. ( data$ ) + 1 )
  3617. /7      $( !data_blk_anchor% + data_offset% ) = data$
  3618. 0+      !data_offset_addr% = data_offset%
  3619. 1(      data_offset% += 
  3620. ( data$ ) + 1
  3621. 2        
  3622. *|Stop PROCEvnts_UpdateData
  3623. <%*|Start PROCEvnts_DebugListHeader
  3624. Evnts_DebugListHeader( event$, header$ )
  3625.  PROCshell_Tracef0( " ")
  3626.  PROCshell_Tracef0( "List of " + event$ +" events:" )
  3627.  PROCshell_Tracef0( " ")
  3628.  PROCshell_Tracef0( header$ )
  3629.  PROCshell_Tracef0( "-----------------------------------------------------------" )
  3630. E$*|Stop PROCEvnts_DebugListHeader
  3631.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3632.  Public Routines (ClickSelect Events)
  3633.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3634. O'*|Start PROCshell_AttachClickSelect
  3635. shell_AttachClickSelect( window_handle%, icon_handle%, user_FN$ )
  3636.  offset%, evnt_blk%, data_offset_addr%, window_name$
  3637. R?window_name$ = 
  3638. shell_GetWindowIdentifier( window_handle% )
  3639.  window_name$ = "iconbar" 
  3640.   icon_handle% = -1
  3641. offset% = 
  3642. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_CLICKSELECT_ANCHOR%, _EVNTS_CLICKSELECT_REC_SIZE%, 
  3643.  PROCshell_Tracef0( "AttachClickSelect:offset% = "+STR$ offset%)
  3644. Z,evnt_blk%  = !_EVNTS_CLICKSELECT_ANCHOR%
  3645. evnt_blk% += offset%
  3646. $evnt_blk%   = window_name$
  3647. evnt_blk%!12 = icon_handle%
  3648.  !_EVNTS_CLICKSELECT_DATA% = 0 
  3649. `L  !_EVNTS_CLICKSELECT_DATA% = 
  3650. shell_HeapBlockFetch( 
  3651. ( user_FN$ ) + 1 )
  3652. c&data_offset_addr% = evnt_blk% + 16
  3653.  PROCshell_Tracef0( "AttachClickSelect:!data_offset_addr% = " + STR$(!data_offset_addr%))
  3654. Evnts_UpdateData( data_offset_addr%, _EVNTS_CLICKSELECT_DATA%, _EVNTS_CLICKSELECT_DATAOFFSET%, user_FN$ )
  3655. shell_IconGetButtonType( window_handle%, icon_handle% ) = _BUTTON_TYPE_NEVER 
  3656. shell_IconSetButtonType( window_handle%, icon_handle%, _BUTTON_TYPE_CLICK )
  3657. m&*|Stop PROCshell_AttachClickSelect
  3658. q,*|Start PROCshell_EvntHandle_ClickSelect
  3659. shell_EvntHandle_ClickSelect( _window_handle%, _icon_handle% )
  3660.  window_name$, offset%, user_FN$, evnt_list%, data_list%, result%, mess$
  3661. u@window_name$ = 
  3662. shell_GetWindowIdentifier( _window_handle% )
  3663.  window_name$ = "iconbar" 
  3664.   _icon_handle% = -1
  3665. offset% = 
  3666. Evnts_GetEvntListOffset( window_name$, _icon_handle%, _EVNTS_CLICKSELECT_ANCHOR%, _EVNTS_CLICKSELECT_REC_SIZE%, 
  3667.  window name/icon handle not found - try again with icon_handle% = -1
  3668.  offset% < 0 
  3669.  offset% = 
  3670. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_CLICKSELECT_ANCHOR%, _EVNTS_CLICKSELECT_REC_SIZE%, 
  3671.  offset% >= 0 
  3672. 8  evnt_list% = !_EVNTS_CLICKSELECT_ANCHOR% + offset%
  3673. %  user_FN_offset% = evnt_list%!16
  3674. ,  data_list% = !_EVNTS_CLICKSELECT_DATA%
  3675. 2  user_FN$ = $( data_list% + user_FN_offset% )
  3676.  PROCshell_Tracef0( "EvntHandle_ClickSelect:About to call " + "FN" + user_FN$ + "(_window_handle%,_icon_handle%)")
  3677. I  void% = 
  3678. ( "FN" + user_FN$ + "( _window_handle%, _icon_handle% )" )
  3679.  If icon handle was 0 and window was dynamic then close the window automatically as it is a
  3680.  dynamic dialog box..
  3681.  _icon_handle% = 0 
  3682.  _window_handle% = _U%!20 
  3683. -    
  3684. shell_CloseWindow( _window_handle% )
  3685.  Now look at drag events..
  3686.  _window_handle% > 0 
  3687.  window_name$ <> "" 
  3688. `  result% = 
  3689. shell_IconIsDraggable( 
  3690. Evnts_GetLastWindowClicked, 
  3691. Evnts_GetLastIconClicked )
  3692.  result% 
  3693. 1    
  3694.  What we have here is a draggable icon..
  3695. #    mess$ = "Icon is draggable"
  3696. e    
  3697. shell_EvntHandle_UserDragStartDrag( 
  3698. Evnts_GetLastWindowClicked, 
  3699. Evnts_GetLastIconClicked )
  3700. e    
  3701. shell_EvntHandle_DataSaveStartDrag( 
  3702. Evnts_GetLastWindowClicked, 
  3703. Evnts_GetLastIconClicked )
  3704. U    
  3705. shell_HandleSlider( 
  3706. Evnts_GetLastWindowClicked, 
  3707. Evnts_GetLastIconClicked )
  3708. '    mess$ = "Icon is not draggable"
  3709.  PROCshell_Tracef0( "Action:" + mess$ )
  3710. shell_EvntHandle_PopupMenu( _window_handle%, _icon_handle% )
  3711. shell_EvntHandle_Bumpers(   _window_handle%, _icon_handle% )
  3712. shell_HandleSlider( 
  3713. Evnts_GetLastWindowClicked, 
  3714. Evnts_GetLastIconClicked )
  3715. +*|Stop PROCshell_EvntHandle_ClickSelect
  3716. %*|Start PROCshell_ListClickSelect
  3717. shell_ListClickSelect
  3718.  list_size%, event_list%, rec_size%, ptr%, nr_events%, e_ptr%
  3719.  icon_handle%, user_FN$, event_data_blk%, loop%
  3720. -event_list% = !_EVNTS_CLICKSELECT_ANCHOR%
  3721. .rec_size%   = _EVNTS_CLICKSELECT_REC_SIZE%
  3722. nr_events%  = event_list%!4
  3723. Evnts_DebugListHeader ( "ClickSelect", "Window         Icon   FN" )
  3724.  event_list% = 0  
  3725.  PROCshell_Tracef0("No ClickSelect Events found")
  3726. !  ptr% = _m_Evnts_HeaderSize%
  3727.  loop% = 1 
  3728.  nr_events%
  3729. .    window_name$ = $( event_list% + ptr% )
  3730. /    icon_handle% = event_list%!( ptr% + 12)
  3731. 3    event_data_blk% = !_EVNTS_CLICKSELECT_DATA%
  3732.  event_data_blk% > 0 
  3733. D      user_FN$ = $( event_data_blk% + event_list%!( ptr% + 16 ))
  3734.         
  3735.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$,".",12 )  + " "+FNshell_StringPadLeading(STR$ icon_handle%," ",6)+"   "+user_FN$)
  3736. ,    ptr% += _EVNTS_CLICKSELECT_REC_SIZE%
  3737.  loop%
  3738.  PROCshell_Tracef0(" ")
  3739. $*|Stop PROCshell_ListClickSelect
  3740.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3741.  Public Routines (ClickAdjust Events)
  3742.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3743. '*|Start PROCshell_AttachClickAdjust
  3744. shell_AttachClickAdjust( window_handle%, icon_handle%, user_FN$ )
  3745.  offset%, evnt_blk%, window_name$
  3746. ?window_name$ = 
  3747. shell_GetWindowIdentifier( window_handle% )
  3748.  window_name$ = "iconbar" 
  3749.   icon_handle% = -1
  3750. offset% = 
  3751. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_CLICKADJUST_ANCHOR%, _EVNTS_CLICKADJUST_REC_SIZE%, 
  3752. +evnt_blk% = !_EVNTS_CLICKADJUST_ANCHOR%
  3753. evnt_blk% += offset%
  3754. $evnt_blk%   = window_name$
  3755. evnt_blk%!12 = icon_handle%
  3756.  !_EVNTS_CLICKADJUST_DATA% = 0 
  3757. L  !_EVNTS_CLICKADJUST_DATA% = 
  3758. shell_HeapBlockFetch( 
  3759. ( user_FN$ ) + 1 )
  3760. &data_offset_addr% = evnt_blk% + 16
  3761. Evnts_UpdateData( data_offset_addr%, _EVNTS_CLICKADJUST_DATA%, _EVNTS_CLICKADJUST_DATAOFFSET%, user_FN$ )
  3762. shell_IconGetButtonType( window_handle%, icon_handle% ) = _BUTTON_TYPE_NEVER 
  3763. shell_IconSetButtonType( window_handle%, icon_handle%, _BUTTON_TYPE_CLICK )
  3764. &*|Stop PROCshell_AttachClickAdjust
  3765. ,*|Start PROCshell_EvntHandle_ClickAdjust
  3766. shell_EvntHandle_ClickAdjust( _window_handle%, _icon_handle% )
  3767.  window_name$, offset%, user_FN$, evnt_list%, data_list%
  3768. @window_name$ = 
  3769. shell_GetWindowIdentifier( _window_handle% )
  3770.  window_name$ = "iconbar" 
  3771.   _icon_handle% = -1
  3772. offset% = 
  3773. Evnts_GetEvntListOffset( window_name$, _icon_handle%, _EVNTS_CLICKADJUST_ANCHOR%, _EVNTS_CLICKADJUST_REC_SIZE%, 
  3774.  window name/icon handle not found - try with icon_handle% = -1
  3775.  offset% < 0 
  3776.  offset% = 
  3777. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_CLICKADJUST_ANCHOR%, _EVNTS_CLICKADJUST_REC_SIZE%, 
  3778.  offset% >= 0 
  3779. 8  evnt_list% = !_EVNTS_CLICKADJUST_ANCHOR% + offset%
  3780. %  user_FN_offset% = evnt_list%!16
  3781. ,  data_list% = !_EVNTS_CLICKADJUST_DATA%
  3782. 2  user_FN$ = $( data_list% + user_FN_offset% )
  3783. D  void% = 
  3784. ("FN" + user_FN$ + "(_window_handle%,_icon_handle%)")
  3785.  _window_handle% > 0 
  3786. shell_EvntHandle_Bumpers( _window_handle%, _icon_handle% )
  3787. +*|Stop PROCshell_EvntHandle_ClickAdjust
  3788. %*|Start PROCshell_ListClickAdjust
  3789. shell_ListClickAdjust
  3790.  list_size%, event_list%, rec_size%, ptr%, nr_events%, e_ptr%
  3791.  icon_handle%, user_FN$, event_data_blk%, loop%
  3792. -event_list% = !_EVNTS_CLICKADJUST_ANCHOR%
  3793. .rec_size%   = _EVNTS_CLICKADJUST_REC_SIZE%
  3794. nr_events%  = event_list%!4
  3795. Evnts_DebugListHeader ( "ClickAdjust", "Window         Icon   FN" )
  3796.  event_list% = 0  
  3797.  PROCshell_Tracef0("No ClickAdjust Events found")
  3798. !  ptr% = _m_Evnts_HeaderSize%
  3799.  loop% = 1 
  3800.  nr_events%
  3801. .    window_name$ = $( event_list% + ptr% )
  3802. /    icon_handle% = event_list%!( ptr% + 12)
  3803.  3    event_data_blk% = !_EVNTS_CLICKADJUST_DATA%
  3804.  event_data_blk% > 0 
  3805. "D      user_FN$ = $( event_data_blk% + event_list%!( ptr% + 16 ))
  3806. #        
  3807.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$,".",12 )  + " "+FNshell_StringPadLeading(STR$ icon_handle%," ",6)+"   "+user_FN$)
  3808. %,    ptr% += _EVNTS_CLICKADJUST_REC_SIZE%
  3809.  loop%
  3810.  PROCshell_Tracef0(" ")
  3811. +$*|Stop PROCshell_ListClickAdjust
  3812.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3813.  Public Routines (ClickMenu)
  3814.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3815. 6 *|Start PROCshell_AttachMenu
  3816. shell_AttachMenu( window_handle%, icon_handle%, menu_handle%, shift%, ctrl%, alt% )
  3817.  offset%, evnt_blk%, window_name$, update_makerFN%
  3818. shell_IsWindowStatic( window_handle% ) = 
  3819. shell_OK( 
  3820. shell_MessageNoArgs( "SHELLMSG30" ) )
  3821. =?window_name$ = 
  3822. shell_GetWindowIdentifier( window_handle% )
  3823. >@menu_name$   = 
  3824. shell_MenuList_GetIdentifier( menu_handle% )
  3825.  window_name$ = "iconbar" 
  3826.   icon_handle% = -1
  3827.  window_handle% > 0 
  3828.  icon_handle% >= 0 
  3829. shell_IconSetButtonType( window_handle%, icon_handle%, _BUTTON_TYPE_CLICK )
  3830. shell_EvntAdd_PopUpMenu( window_name$, icon_handle%, -1, menu_handle%, "", "", _POPUP_TYPE_TEXT )
  3831.  PROCshell_Tracef0( "AttachMenu:Attaching menu handle &" + STR$~menu_handle% + " to window' " + window_name$ + "'" )
  3832.   offset% = 
  3833. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_CLICKMENU_ANCHOR%, _EVNTS_CLICKMENU_REC_SIZE%, 
  3834.  offset% >= 0 
  3835.     update_makerFN% = 
  3836.     update_makerFN% = 
  3837.   offset% = 
  3838. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_CLICKMENU_ANCHOR%, _EVNTS_CLICKMENU_REC_SIZE%, 
  3839. R+  evnt_blk% = !_EVNTS_CLICKMENU_ANCHOR%
  3840.   evnt_blk% += offset%
  3841. T!  $evnt_blk%   = window_name$
  3842. U!  evnt_blk%!12 = icon_handle%
  3843.  !_EVNTS_CLICKMENU_DATA% = 0 
  3844. X<    !_EVNTS_CLICKMENU_DATA% = 
  3845. shell_HeapBlockFetch( 1 )
  3846. [(  data_offset_addr% = evnt_blk% + 16
  3847. Evnts_UpdateData( data_offset_addr%, _EVNTS_CLICKMENU_DATA%, _EVNTS_CLICKMENU_DATAOFFSET%, menu_name$ )
  3848.  update_makerFN% = 
  3849. _*    data_offset_addr% = evnt_blk% + 20
  3850. `h    
  3851. Evnts_UpdateData( data_offset_addr%, _EVNTS_CLICKMENU_DATA%, _EVNTS_CLICKMENU_DATAOFFSET%, "" )
  3852. *|Stop PROCshell_AttachMenu
  3853. k%*|Start PROCshell_AttachPopupMenu
  3854. shell_AttachPopupMenu( wh%, menuic%, dispic%, menu%, notify_fn$, preopen_FN$ )
  3855.  wh% > 0 
  3856.  menuic% >= 0 
  3857. shell_IconSetButtonType( wh%, menuic%, _BUTTON_TYPE_CLICK )
  3858. shell_EvntAdd_PopUpMenu( 
  3859. shell_GetWindowIdentifier( wh% ), menuic%, dispic%, menu%, notify_fn$, preopen_FN$, _POPUP_TYPE_TEXT )
  3860. q$*|Stop PROCshell_AttachPopupMenu
  3861. u**|Start PROCshell_EvntHandle_ClickMenu
  3862. shell_EvntHandle_ClickMenu( _window_handle%, _icon_handle% )
  3863.  window_name$, offset%, evnt_list%, maker_FN_offset%, maker_FN$, menu_data_blk%, void%
  3864.  menu_name_offset%
  3865. z@window_name$ = 
  3866. shell_GetWindowIdentifier( _window_handle% )
  3867.  window_name$ = "iconbar" 
  3868.   _icon_handle% = -1
  3869. ~offset% = 
  3870. Evnts_GetEvntListOffset( window_name$, _icon_handle%, _EVNTS_CLICKMENU_ANCHOR%, _EVNTS_CLICKMENU_REC_SIZE%, 
  3871.  window name/icon handle not found - try with icon_handle% = -1
  3872.  offset% < 0 
  3873.  offset% = 
  3874. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_CLICKMENU_ANCHOR%, _EVNTS_CLICKMENU_REC_SIZE%, 
  3875.  file_handle% = OPENOUT"RAM::RamDisc0.$.dump"
  3876.  PROCEvnts_SaveEvnt( file_handle%, _EVNTS_CLICKMENU_ANCHOR%,   _EVNTS_CLICKMENU_DATA%,   _EVNTS_CLICKMENU_DATAOFFSET% )
  3877.  CLOSE # file_handle%
  3878.  offset% >= 0 
  3879. 8  evnt_list%   = !_EVNTS_CLICKMENU_ANCHOR% + offset%
  3880. (  menu_name_offset%  = evnt_list%!16
  3881. (  maker_FN_offset%   = evnt_list%!20
  3882. .  menu_data_blk% = !_EVNTS_CLICKMENU_DATA%
  3883. \  menu_handle% = 
  3884. shell_MenuList_GetSysHandle( $( menu_data_blk% + menu_name_offset% ) )
  3885. 8  maker_FN$ = $( menu_data_blk% + maker_FN_offset% )
  3886. +  _EVNTS_LAST_MENUMAKER_FN$ = maker_FN$
  3887.  PROCshell_Tracef0( "EvntHandle_ClickMenu:maker_FN$    = " + maker_FN$ )
  3888.  PROCshell_Tracef0( "EvntHandle_ClickMenu:menu_name$   = " + $( menu_data_blk% + maker_FN_offset% ) )
  3889.  PROCshell_Tracef0( "EvntHandle_ClickMenu:menu_handle% = " + STR$ menu_handle% )
  3890.  maker_FN$ <> "" 
  3891. a     void% = 
  3892. ( "FN" + maker_FN$ + "( " + 
  3893.  _window_handle% + ", " + 
  3894.  _icon_handle% + " )" )
  3895. shell_OpenMenu( _Q%!0, _Q%!4, menu_handle% )
  3896.  _window_handle% > 0 
  3897. shell_EvntHandle_PopupMenu( _window_handle%, _icon_handle% )
  3898. )*|Stop PROCshell_EvntHandle_ClickMenu
  3899. #*|Start PROCshell_ListClickMenu
  3900. shell_ListClickMenu
  3901.  list_size%, event_list%, rec_size%, ptr%, nr_events%, e_ptr%, menu_handle%
  3902.  icon_handle%, loop%, maker_FN$
  3903. +event_list% = !_EVNTS_CLICKMENU_ANCHOR%
  3904. ,rec_size%   = _EVNTS_CLICKMENU_REC_SIZE%
  3905. nr_events%  = event_list%!4
  3906. Evnts_DebugListHeader ( "ClickMenu  ", "Window         Icon   Menu handle  Maker FN" )
  3907.  event_list% = 0  
  3908.  PROCshell_Tracef0("No ClickMenu Events found")
  3909. !  ptr% = _m_Evnts_HeaderSize%
  3910.  loop% = 1 
  3911.  nr_events%
  3912. .    window_name$ = $( event_list% + ptr% )
  3913. 0    icon_handle% = event_list%!( ptr% + 12 )
  3914. 0    menu_handle% = event_list%!( ptr% + 16 )
  3915. 1    event_data_blk% = !_EVNTS_CLICKMENU_DATA%
  3916.  event_data_blk% > 0 
  3917. E      maker_FN$ = $( event_data_blk% + event_list%!( ptr% + 20 ))
  3918.         
  3919.       maker_FN$ = "None"
  3920.         
  3921.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$,".",12 )  + " "+FNshell_StringPadLeading(STR$ icon_handle%," ",6)+"   &" + STR$~menu_handle% + "    " + maker_FN$ )
  3922. *    ptr% += _EVNTS_CLICKMENU_REC_SIZE%
  3923.  loop%
  3924.  PROCshell_Tracef0(" ")
  3925. "*|Stop PROCshell_ListClickMenu
  3926.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3927.  Public Routines (MenuMaker)
  3928.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3929. %*|Start PROCshell_AttachMenuMaker
  3930. shell_AttachMenuMaker( window_handle%, icon_handle%, menu_handle%, maker_FN$ )
  3931.  offset%, evnt_blk%, window_name$, data_offset_addr%
  3932. shell_AttachMenu( window_handle%, icon_handle%, menu_handle%, 0, 0, 0 )
  3933. ?window_name$ = 
  3934. shell_GetWindowIdentifier( window_handle% )
  3935.  window_name$ = "iconbar" 
  3936.   icon_handle% = -1
  3937.  PROCshell_Tracef0( "AttachMenuMaker:Attaching menumaker 'FN" + maker_FN$ + "' to menu handle &" + STR$~menu% )
  3938. }offset% = 
  3939. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_CLICKMENU_ANCHOR%, _EVNTS_CLICKMENU_REC_SIZE%, 
  3940.  offset% = -1 
  3941.  99,"MenuMaker offset not found.."
  3942. )evnt_blk% = !_EVNTS_CLICKMENU_ANCHOR%
  3943. evnt_blk% += offset%
  3944.  !_EVNTS_CLICKMENU_DATA% = 0 
  3945. K  !_EVNTS_CLICKMENU_DATA% = 
  3946. shell_HeapBlockFetch( 
  3947. ( maker_FN$ ) + 1 )
  3948. &data_offset_addr% = evnt_blk% + 20
  3949. Evnts_UpdateData( data_offset_addr%, _EVNTS_CLICKMENU_DATA%, _EVNTS_CLICKMENU_DATAOFFSET%, maker_FN$ )
  3950. $*|Stop PROCshell_AttachMenuMaker
  3951.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3952.  Public Routines (HelpTags)
  3953.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3954. #*|Start PROCshell_AttachHelpTag
  3955. shell_AttachHelpTag( window_handle%, icon_handle%, helptag$ )
  3956.  offset%, evnt_blk%, window_name$
  3957. ?window_name$ = 
  3958. shell_GetWindowIdentifier( window_handle% )
  3959.  window_name$ = "iconbar" 
  3960.   icon_handle% = -1
  3961. yoffset% = 
  3962. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_HELPTAG_ANCHOR%, _EVNTS_HELPTAG_REC_SIZE%, 
  3963. 'evnt_blk% = !_EVNTS_HELPTAG_ANCHOR%
  3964. evnt_blk% += offset%
  3965. $evnt_blk%   = window_name$
  3966. evnt_blk%!12 = icon_handle%
  3967.  !_EVNTS_HELPTAG_DATA% = 0 
  3968. H  !_EVNTS_HELPTAG_DATA% = 
  3969. shell_HeapBlockFetch( 
  3970. ( helptag$ ) + 1 )
  3971. &data_offset_addr% = evnt_blk% + 16
  3972. Evnts_UpdateData( data_offset_addr%, _EVNTS_HELPTAG_DATA%, _EVNTS_HELPTAG_DATAOFFSET%, helptag$ )
  3973. "*|Stop PROCshell_AttachHelpTag
  3974. )*|Start PROCshell_EvntHandle_HelpTags
  3975. shell_EvntHandle_HelpTags( _window_handle%, _icon_handle%, 
  3976.  helptag$ )
  3977.  window_name$, offset%, evnt_list%, helptags_data_blk%, tag_data_offset%, result_buffer%
  3978.  flags%, last_menu_handle%, ptr%, selected_item%, evnt_blk% 
  3979. @window_name$ = 
  3980. shell_GetWindowIdentifier( _window_handle% )
  3981.  window_name$ = "iconbar" 
  3982.   _icon_handle% = -1
  3983. "zoffset% = 
  3984. Evnts_GetEvntListOffset( window_name$, _icon_handle%, _EVNTS_HELPTAG_ANCHOR%, _EVNTS_HELPTAG_REC_SIZE%, 
  3985.  offset% >= 0 
  3986. %:  helptag$ = 
  3987. shell_EvntHandle_AttachedHelp( offset% )
  3988.  no attached help tags found for this window - possibly it is a menu, so check this using XSWI call
  3989.  in case RISC OS 2 is in use..
  3990. *2  result_buffer% = 
  3991. shell_HeapBlockFetch( 96 )
  3992.  "XWimp_GetMenuState", 1, result_buffer%, _window_handle%, _icon_handle% 
  3993.  ;flags%
  3994.  flags% <> 1 
  3995. .]    
  3996.  no error, valid result returned, check if window is a menu (i.e. not a dynamic dbox
  3997. /9    
  3998.  or a window already known to the application)..
  3999. 0<    
  4000.  _window_handle% <> 
  4001. shell_GetDynamicWindowHandle 
  4002. 1;      
  4003. shell_WindowHandleKnown( _window_handle% ) 
  4004. 2C        helptag$ = 
  4005. shell_EvntHandle_MenuHelp( result_buffer% )
  4006.       
  4007. 4        
  4008. shell_HeapBlockReturn( result_buffer% )
  4009. ;(*|Stop PROCshell_EvntHandle_HelpTags
  4010. ?"*|Start PROCshell_ListHelpTags
  4011. shell_ListHelpTags
  4012.  list_size%, event_list%, rec_size%, ptr%, nr_events%, e_ptr%, user_FN$
  4013.  icon_handle%, event_data_blk%, loop%
  4014. C)event_list% = !_EVNTS_HELPTAG_ANCHOR%
  4015. D*rec_size%   = _EVNTS_HELPTAG_REC_SIZE%
  4016. nr_events%  = event_list%!4
  4017. Evnts_DebugListHeader ( "HelpTag ", "Window         Icon   Help tag" )
  4018.  event_list% = 0  
  4019.  PROCshell_Tracef0("No HelpTag Events found")
  4020. J!  ptr% = _m_Evnts_HeaderSize%
  4021.  loop% = 1 
  4022.  nr_events%
  4023. L.    window_name$ = $( event_list% + ptr% )
  4024. M0    icon_handle% = event_list%!( ptr% + 12 )
  4025. N/    event_data_blk% = !_EVNTS_HELPTAG_DATA%
  4026.  event_data_blk% > 0 
  4027. PD      user_FN$ = $( event_data_blk% + event_list%!( ptr% + 16 ))
  4028. Q        
  4029.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$,".",12 )  + " "+FNshell_StringPadLeading(STR$ icon_handle%," ",6)+"   " + user_FN$ )
  4030. S(    ptr% += _EVNTS_HELPTAG_REC_SIZE%
  4031.  loop%
  4032.  PROCshell_Tracef0(" ")
  4033. Y!*|Stop PROCshell_ListHelpTags
  4034.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4035.  Public Routines (MenuHelpTags)
  4036.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4037. e'*|Start PROCshell_AttachMenuHelpTag
  4038. shell_AttachMenuHelpTag( menu_name$, menu_item_handle%, tag$ )
  4039.  offset%, evnt_blk%, data_offset_addr%
  4040. offset% = 
  4041. Evnts_GetEvntListOffset( "menu", menu_item_handle%, _EVNTS_MENUHELPTAG_ANCHOR%, _EVNTS_MENUHELPTAG_REC_SIZE%, 
  4042.  IF menu_item_handle% = MenuItem_Info% THEN ERROR 99,STR$offset%
  4043.  IF menu_item_handle% = MenuItem_Quit% THEN ERROR 99,STR$offset%
  4044. o+evnt_blk% = !_EVNTS_MENUHELPTAG_ANCHOR%
  4045. evnt_blk% += offset%
  4046. $evnt_blk%   = "menu"
  4047. r$evnt_blk%!12 = menu_item_handle%
  4048.  !_EVNTS_MENUHELPTAG_DATA% = 0 
  4049. uH  !_EVNTS_MENUHELPTAG_DATA% = 
  4050. shell_HeapBlockFetch( 
  4051. ( tag$ ) + 1 )
  4052. x&data_offset_addr% = evnt_blk% + 16
  4053. Evnts_UpdateData( data_offset_addr%, _EVNTS_MENUHELPTAG_DATA%, _EVNTS_MENUHELPTAG_DATAOFFSET%, tag$ )
  4054. }&*|Stop PROCshell_AttachMenuHelpTag
  4055.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4056.  Public Routines (Pane Evnts)
  4057.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4058.  *|Start PROCshell_AttachPane
  4059. shell_AttachPane( window_handle%, 
  4060.  pane_handle%, flags%, x_off%, y_off% )
  4061.  offset%, evnt_blk%, pane_nr%, window_name$, pane_name$, pane_flags%
  4062. ?window_name$ = 
  4063. shell_GetWindowIdentifier( window_handle% )
  4064. =pane_name$   = 
  4065. shell_GetWindowIdentifier( pane_handle% )
  4066. pane_nr% = 0
  4067.  PROCshell_Tracef0("AttachPane:Attaching Pane Handler")
  4068.  first check that the flags of the pane window are correctly set..
  4069. 7pane_flags% = 
  4070. shell_WindowGetFlags( pane_handle% )
  4071.  ( pane_flags% 
  4072.  1 << 5 ) = 0 
  4073.  PROCshell_Tracef0( "AttachPane:'Pane' bit of pane window is not set, fixing.." )
  4074. shell_WindowToggleFlags( pane_handle%, 1 << 5 )
  4075.  ( pane_flags% 
  4076.  1 << 1 ) 
  4077.  PROCshell_Tracef0("AttachPane:'Moveable' bit of pane window is set, fixing..")
  4078. shell_WindowToggleFlags( pane_handle%, 1 << 1 )
  4079. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  4080.  ) > -1
  4081.   pane_nr% += 1
  4082. qoffset% = 
  4083. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  4084.  PROCshell_Tracef0("EvntAdd_AttachPane:pane_nr% = " + STR$ pane_nr% )
  4085. %evnt_blk% = !_EVNTS_PANES_ANCHOR%
  4086. evnt_blk% += offset%
  4087. $evnt_blk%   = window_name$
  4088. evnt_blk%!12 = pane_nr%
  4089. evnt_blk%!20 = flags%
  4090. evnt_blk%!24 = x_off%
  4091. evnt_blk%!28 = y_off%
  4092.  !_EVNTS_PANES_DATA% = 0 
  4093. H  !_EVNTS_PANES_DATA% = 
  4094. shell_HeapBlockFetch( 
  4095. ( pane_name$ ) + 1 )
  4096. &data_offset_addr% = evnt_blk% + 16
  4097. Evnts_UpdateData( data_offset_addr%, _EVNTS_PANES_DATA%, _EVNTS_PANES_DATAOFFSET%, pane_name$ )
  4098. *|Stop PROCshell_AttachPane
  4099. '*|Start PROCshell_PaneSetVisibility
  4100. shell_PaneSetVisibility( main_window%, pane_window%, hidden% )
  4101.  window_name$, pane_name$, pane_nr%, offset%
  4102. =window_name$ = 
  4103. shell_GetWindowIdentifier( main_window% )
  4104. =pane_name$   = 
  4105. shell_GetWindowIdentifier( pane_window% )
  4106. pane_nr% = 0
  4107. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  4108.  ) = -1
  4109.   pane_nr% += 1
  4110. qoffset% = 
  4111. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  4112.  offset% >= 0 
  4113. '  evnt_blk% = !_EVNTS_PANES_ANCHOR%
  4114.   evnt_blk% += offset%
  4115.  hidden% = 
  4116. 0    evnt_blk%!20 = evnt_blk%!20 
  4117.  ( 1 << 8 )
  4118. 2    evnt_blk%!20 = evnt_blk%!20 
  4119.  ( 1 << 8 )
  4120. &*|Stop PROCshell_PaneSetVisibility
  4121. *|Start PROCshell_HidePane
  4122. shell_HidePane( main_window%, pane_window% )
  4123. shell_PaneSetVisibility( main_window%, pane_window%, 
  4124. shell_CloseWindow( pane_window% )
  4125. *|Stop PROCshell_HidePane
  4126. *|Start PROCshell_ShowPane
  4127. shell_ShowPane( main_window%, pane_window% )
  4128. shell_PaneSetVisibility( main_window%, pane_window%, 
  4129. shell_OpenWindow( main_window% , 0, 
  4130. *|Stop PROCshell_ShowPane
  4131. *|Start PROCshell_ListPanes
  4132. shell_ListPanes
  4133.  list_size%, event_list%, rec_size%, ptr%, nr_events%, pane_name$
  4134.  event_data_blk%, loop%, x_off$, y_off$
  4135. 'event_list% = !_EVNTS_PANES_ANCHOR%
  4136. (rec_size%   = _EVNTS_PANES_REC_SIZE%
  4137. nr_events%  = event_list%!4
  4138. Evnts_DebugListHeader ( "Pane ", "Window         Pane name   X Pos   Y Pos" )
  4139.  event_list% = 0  
  4140.  PROCshell_Tracef0("No Pane Events found")
  4141. !  ptr% = _m_Evnts_HeaderSize%
  4142.  loop% = 1 
  4143.  nr_events%
  4144. .    window_name$ = $( event_list% + ptr% )
  4145. -    event_data_blk% = !_EVNTS_PANES_DATA%
  4146.  event_data_blk% > 0 
  4147. F      pane_name$ = $( event_data_blk% + event_list%!( ptr% + 16 ))
  4148.         
  4149. R    x_off$ = 
  4150. shell_StringPadTrailing( 
  4151. ( event_list%!( ptr% + 24 )), " ", 8 )
  4152. R    y_off$ = 
  4153. shell_StringPadTrailing( 
  4154. ( event_list%!( ptr% + 28 )), " ", 6 )
  4155.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$, ".", 12 )  + "   " + FNshell_StringPadTrailing( pane_name$, " ", 12 ) + x_off$ + y_off$ )
  4156. &    ptr% += _EVNTS_PANES_REC_SIZE%
  4157.  loop%
  4158.  PROCshell_Tracef0(" ")
  4159. *|Stop PROCshell_ListPanes
  4160.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4161.  Public Routines (WindowOpen Evnts)
  4162.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4163. (*|Start PROCshell_EvntAdd_WindowOpen
  4164. shell_EvntAdd_WindowOpen( window_name$, user_FN$ )
  4165.  offset%, evnt_blk%
  4166. Koffset% = 
  4167. Evnts_GetEvntListOffset( window_name$, -1, "WINDOWOPEN", 
  4168. *evnt_blk% = !_EVNTS_WINDOWOPEN_ANCHOR%
  4169. evnt_blk% += offset%
  4170. $evnt_blk%   = window_name$
  4171. evnt_blk%!12 = -1
  4172.  !_EVNTS_WINDOWOPEN_DATA% = 0 
  4173. K  !_EVNTS_WINDOWOPEN_DATA% = 
  4174. shell_HeapBlockFetch( 
  4175. ( user_FN$ ) + 1 )
  4176. &data_offset_addr% = evnt_blk% + 16
  4177. Evnts_UpdateData( data_offset_addr%, _EVNTS_WINDOWOPEN_DATA%, _EVNTS_WINDOWOPEN_DATAOFFSET%, user_FN$ )
  4178. '*|Stop PROCshell_EvntAdd_WindowOpen
  4179. " *|Start PROCshell_OpenWindow
  4180. shell_OpenWindow( _window_handle%, full%, front% )
  4181.  offset%,first_pane%,behind%,height%,width%
  4182.  toggle%,last_pane%,prev_pane%
  4183.  window_name$, evnt_list%, user_FN_offset%, data_list%
  4184.  user_FN$, void%, pane_nr%, pane_evnt_found%, pane_flags%, pane_x_off%
  4185.  pane_y_off%, window_handle_list%, pane_window_handle%, pane_hidden%
  4186.  old_behind%
  4187. +@window_name$ = 
  4188. shell_GetWindowIdentifier( _window_handle% )
  4189. behind% = _Q%!28
  4190.  Check first for 'WindowOpen' events..
  4191. .uoffset% = 
  4192. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_WINDOWOPEN_ANCHOR%, _EVNTS_WINDOWOPEN_REC_SIZE%, 
  4193.  offset% >= 0 
  4194. 17  evnt_list% = !_EVNTS_WINDOWOPEN_ANCHOR% + offset%
  4195. 2%  user_FN_offset% = evnt_list%!16
  4196. 3+  data_list% = !_EVNTS_WINDOWOPEN_DATA%
  4197. 42  user_FN$ = $( data_list% + user_FN_offset% )
  4198. 5;  void% = 
  4199. ("FN" + user_FN$ + "(" + window_name$ + ")")
  4200. toggle% = 
  4201. 9._WINDOWS_GETSTATE_BLK%!0 = _window_handle%
  4202.  "Wimp_GetWindowState",,_WINDOWS_GETSTATE_BLK%
  4203.  ( _WINDOWS_GETSTATE_BLK%!32 
  4204.  &80000 ) = &80000 
  4205.  toggle% = 
  4206.  toggle% = 
  4207.  "Wimp_GetPointerInfo",,_WINDOWS_GETPINFO_BLK%
  4208. _Q%!0 = _window_handle%
  4209.  full% 
  4210.  "Wimp_GetWindowState",,_Q%
  4211.  toggle% 
  4212.  "Wimp_OpenWindow",,_Q%
  4213. pane_evnt_found% = 
  4214. Gqoffset% = 
  4215. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  4216.  offset% >= 0 
  4217.  pane_evnt_found% = 
  4218.  pane_evnt_found% = 
  4219.  pane handler event found
  4220.   _Q%!0=_window_handle%
  4221.  front% > 0 
  4222.     behind% = front%
  4223. Q2    
  4224.  front% 
  4225.  behind% = -1 
  4226.  behind% = _Q%!28
  4227.  full% 
  4228. U6    
  4229.  "Wimp_OpenWindow",,_Q%     :
  4230.  vbase fudge..
  4231. V%    
  4232.  "Wimp_GetWindowState",,_Q%
  4233. W6    
  4234.  "Wimp_CloseWindow",,_Q%    :
  4235.  vbase fudge..
  4236.   pane_nr% = 0
  4237. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  4238.  ) > -1
  4239. ]*    offset% = _m_Evnts_LastEvntOffset%
  4240. ^4    evnt_list% = !_EVNTS_PANES_ANCHOR% + offset%
  4241. _)    pane_name_offset% = evnt_list%!16
  4242. `(    data_list% = !_EVNTS_PANES_DATA%
  4243. a8    pane_name$ = $( data_list% + pane_name_offset% )
  4244. b#    pane_flags% = evnt_list%!20
  4245.     pane_hidden% = 
  4246. e%      pane_x_off% = evnt_list%!24
  4247. f%      pane_y_off% = evnt_list%!28
  4248. g&      
  4249.  pane_flags% 
  4250.  ( 1 << 8 ) 
  4251.         pane_hidden% = 
  4252. i4        pane_flags% = pane_flags% 
  4253.  ( 1 << 8 )
  4254.       
  4255. kH      window_handle_list% = 
  4256. shell_GetWindowHandleList( pane_name$ )
  4257. l4      pane_window_handle% = !window_handle_list%
  4258. m3      _c_Evnts_PaneBlk%!0 = pane_window_handle%
  4259. n?      
  4260.  first_pane% = 0 
  4261.  first_pane% = _c_Evnts_PaneBlk%!0
  4262. o*      last_pane% = _c_Evnts_PaneBlk%!0
  4263. p5      
  4264.  "Wimp_GetWindowState",,_c_Evnts_PaneBlk%
  4265. r`      
  4266.  _WINDOWS_GETPINFO_BLK%!16 = -9 
  4267.  toggle% 
  4268.  _WINDOWS_GETPINFO_BLK%!16 > -5 
  4269.  front% 
  4270. s4        
  4271.  Check flag word in pane event block...
  4272.         
  4273.  pane_flags% 
  4274.           
  4275. vD            height% = _c_Evnts_PaneBlk%!16 - _c_Evnts_PaneBlk%!8
  4276. wD            width%  = _c_Evnts_PaneBlk%!12 - _c_Evnts_PaneBlk%!4
  4277. x:            _c_Evnts_PaneBlk%!04 = _Q%!4 + pane_x_off%
  4278. yC            _c_Evnts_PaneBlk%!12 = _c_Evnts_PaneBlk%!4 + width%
  4279. z;            _c_Evnts_PaneBlk%!16 = _Q%!16 + pane_y_off%
  4280. {E            _c_Evnts_PaneBlk%!08 = _c_Evnts_PaneBlk%!16 - height%
  4281.           
  4282. }+            
  4283.  Attached to top edge.....
  4284. ~D            height% = _c_Evnts_PaneBlk%!16 - _c_Evnts_PaneBlk%!8
  4285. (            width%  = _Q%!12 - _Q%!4
  4286. :            _c_Evnts_PaneBlk%!04 = _Q%!4 + pane_x_off%
  4287. ,            _c_Evnts_PaneBlk%!12 =_Q%!12
  4288. ;            _c_Evnts_PaneBlk%!16 = _Q%!16 + pane_y_off%
  4289. E            _c_Evnts_PaneBlk%!08 = _c_Evnts_PaneBlk%!16 - height%
  4290.           
  4291. *            
  4292.  Attached to left edge...
  4293. (            height% = _Q%!16 - _Q%!8
  4294. D            width%  = _c_Evnts_PaneBlk%!12 - _c_Evnts_PaneBlk%!4
  4295. :            _c_Evnts_PaneBlk%!04 = _Q%!4 + pane_x_off%
  4296. C            _c_Evnts_PaneBlk%!12 = _c_Evnts_PaneBlk%!4 + width%
  4297. D            _c_Evnts_PaneBlk%!16 = _Q%!16               :
  4298.  min y
  4299. D            _c_Evnts_PaneBlk%!08 = _Q%!08 + pane_y_off% :
  4300.  max y
  4301.           
  4302. ,            
  4303.  Attached to bottom edge...
  4304. D            height% = _c_Evnts_PaneBlk%!16 - _c_Evnts_PaneBlk%!8
  4305. (            width%  = _Q%!12 - _Q%!4
  4306. ;            _c_Evnts_PaneBlk%!04 = _Q%!04 + pane_x_off%
  4307. -            _c_Evnts_PaneBlk%!12 = _Q%!12
  4308. D            _c_Evnts_PaneBlk%!16 = _Q%!8 + height% + pane_y_off%
  4309. E            _c_Evnts_PaneBlk%!08 = _c_Evnts_PaneBlk%!16 + height%
  4310.           
  4311. +            
  4312.  Attached to right edge...
  4313. (            height% = _Q%!16 - _Q%!8
  4314. D            width%  = _c_Evnts_PaneBlk%!12 - _c_Evnts_PaneBlk%!4
  4315. D            _c_Evnts_PaneBlk%!04 = _Q%!12 - width% + pane_x_off%
  4316. C            _c_Evnts_PaneBlk%!12 = _c_Evnts_PaneBlk%!4 + width%
  4317. 6            _c_Evnts_PaneBlk%!16 = _Q%!16 :
  4318.  min y
  4319. 6            _c_Evnts_PaneBlk%!08 = _Q%!08 :
  4320.  max y
  4321.         
  4322. .        old_behind% = _c_Evnts_PaneBlk%!28
  4323.         
  4324.  pane_nr% = 0 
  4325. ,          _c_Evnts_PaneBlk%!28 = behind%
  4326.         
  4327. /          _c_Evnts_PaneBlk%!28 = prev_pane%
  4328.         
  4329.          
  4330.  pane_hidden% = 
  4331. 5          
  4332.  "Wimp_OpenWindow",,_c_Evnts_PaneBlk%
  4333.         
  4334. 7          _c_Evnts_PaneBlk%!0 = old_behind%        
  4335.         
  4336.       
  4337. (    prev_pane% = _c_Evnts_PaneBlk%!0
  4338.     pane_nr% += 1
  4339.  toggle% 
  4340.      _Q%!28 = last_pane%
  4341. !    
  4342.  "Wimp_OpenWindow",,_Q%
  4343.  no pane event...
  4344.   _Q%!0 = _window_handle%
  4345.  full% 
  4346.  "Wimp_GetWindowState",,_Q%
  4347.  behind% = -2 
  4348.  _Q%!28 = -2
  4349.  front%  = -1 
  4350.  _Q%!28 = -1
  4351.  "Wimp_OpenWindow",,_Q%
  4352. *|Stop PROCshell_OpenWindow
  4353.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4354.  Public Routines (WindowClose Evnts)
  4355.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4356. .*|Start PROCshell_AttachCloseWindowHandler
  4357. shell_AttachCloseWindowHandler( window_handle%, user_FN$ )
  4358.  offset%, evnt_blk%, window_name$
  4359. ?window_name$ = 
  4360. shell_GetWindowIdentifier( window_handle% )
  4361. woffset% = 
  4362. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_WINDOWCLOSE_ANCHOR%, _EVNTS_WINDOWCLOSE_REC_SIZE%, 
  4363. +evnt_blk% = !_EVNTS_WINDOWCLOSE_ANCHOR%
  4364. evnt_blk% += offset%
  4365. $evnt_blk%   = window_name$
  4366. evnt_blk%!12 = -1
  4367.  !_EVNTS_WINDOWCLOSE_DATA% = 0 
  4368. L  !_EVNTS_WINDOWCLOSE_DATA% = 
  4369. shell_HeapBlockFetch( 
  4370. ( user_FN$ ) + 1 )
  4371. &data_offset_addr% = evnt_blk% + 16
  4372. Evnts_UpdateData( data_offset_addr%, _EVNTS_WINDOWCLOSE_DATA%, _EVNTS_WINDOWCLOSE_DATAOFFSET%, user_FN$ )
  4373. -*|Stop PROCshell_AttachCloseWindowHandler
  4374. ,*|Start PROCshell_EvntHandle_WindowClose
  4375. shell_EvntHandle_WindowClose( _window_handle% )
  4376.  window_name$, offset%, user_FN$, evnt_list%, data_list%, oktoclose%
  4377. @window_name$ = 
  4378. shell_GetWindowIdentifier( _window_handle% )
  4379. woffset% = 
  4380. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_WINDOWCLOSE_ANCHOR%, _EVNTS_WINDOWCLOSE_REC_SIZE%, 
  4381. oktoclose% = 
  4382.  offset% >= 0 
  4383. 8  evnt_list% = !_EVNTS_WINDOWCLOSE_ANCHOR% + offset%
  4384. %  user_FN_offset% = evnt_list%!16
  4385. ,  data_list% = !_EVNTS_WINDOWCLOSE_DATA%
  4386. 2  user_FN$ = $( data_list% + user_FN_offset% )
  4387.  user_FN$ <> "" 
  4388.  PROCshell_Tracef0( "EvntHandle_WindowClose:About to call " + "FN" + user_FN$ + "(" + STR$blk% + "," + STR$ x0% + "," + STR$ y0% + ")" )
  4389. L    oktoclose% = 
  4390. ("FN" + user_FN$ + "(" + 
  4391. ( _window_handle% ) + " )" )
  4392.  oktoclose% 
  4393. shell_CloseWindow( _window_handle% )
  4394. +*|Stop PROCshell_EvntHandle_WindowClose
  4395.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4396.  Public Routines (PointerIn Evnts)
  4397.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4398.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4399.  Public Routines (PointerOut Evnts)
  4400.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4401.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4402.  Public Routines (Drag Evnts)
  4403.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4404.  *|Start PROCshell_AttachDrag
  4405. shell_AttachDrag( window_handle%, icon_handle%, user_FN$ )
  4406.  offset%, evnt_blk%, data_offset_addr%, window_name$
  4407. ?window_name$ = 
  4408. shell_GetWindowIdentifier( window_handle% )
  4409. Ooffset% = 
  4410. Evnts_GetEvntListOffset( window_name$, icon_handle%, "DRAG", 
  4411. $evnt_blk% = !_EVNTS_DRAG_ANCHOR%
  4412. evnt_blk% += offset%
  4413. $evnt_blk%   = window_name$
  4414. evnt_blk%!12 = icon_handle%
  4415.  !_EVNTS_DRAG_DATA% = 0 
  4416. $E  !_EVNTS_DRAG_DATA% = 
  4417. shell_HeapBlockFetch( 
  4418. ( user_FN$ ) + 1 )
  4419. '&data_offset_addr% = evnt_blk% + 16
  4420. Evnts_UpdateData( data_offset_addr%, _EVNTS_DRAG_DATA%, _EVNTS_DRAG_DATAOFFSET%, user_FN$ )
  4421. *|Stop PROCshell_AttachDrag
  4422.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4423.  Public Routines (Redraw Evnts)
  4424.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4425. 7&*|Start PROCshell_AttachUserRedraw
  4426. shell_AttachUserRedraw( 
  4427.  window_handle%, user_FN$ )
  4428.  offset%, evnt_blk%, data_offset_addr%, blk%, f%
  4429. ;&blk% = 
  4430. shell_HeapBlockFetch( 36 )
  4431. !blk% = window_handle%
  4432.  "Wimp_GetWindowState",,blk%
  4433. f% = blk%!32
  4434. shell_HeapBlockReturn( blk% )
  4435. shell_Tracef0( "AttachUserRedraw:flag% = &" + 
  4436. ~f% )
  4437.  ( f% 
  4438.  1 << 4 ) 
  4439. shell_Tracef0( "AttachUserRedraw:auto redraw set!!" )
  4440. shell_WindowToggleFlags( window_handle%, 1 << 4 )
  4441. F?window_name$ = 
  4442. shell_GetWindowIdentifier( window_handle% )
  4443. shell_Tracef0( "AttachUserRedraw:window name is : " + window_name$ )
  4444. Hmoffset% = 
  4445. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_REDRAW_ANCHOR%, _EVNTS_REDRAW_REC_SIZE%, 
  4446. I&evnt_blk% = !_EVNTS_REDRAW_ANCHOR%
  4447. evnt_blk% += offset%
  4448. $evnt_blk%   = window_name$
  4449. evnt_blk%!12 = -1
  4450.  !_EVNTS_REDRAW_DATA% = 0 
  4451. OG  !_EVNTS_REDRAW_DATA% = 
  4452. shell_HeapBlockFetch( 
  4453. ( user_FN$ ) + 1 )
  4454. R&data_offset_addr% = evnt_blk% + 16
  4455. Evnts_UpdateData( data_offset_addr%, _EVNTS_REDRAW_DATA%, _EVNTS_REDRAW_DATAOFFSET%, user_FN$ )
  4456. W%*|Stop PROCshell_AttachUserRedraw
  4457. ['*|Start PROCshell_EvntHandle_Redraw
  4458. shell_EvntHandle_Redraw( _window_handle%, blk%, x0%, y0% )
  4459.  window_name$, offset%, user_FN$, evnt_list%, data_list%, void%
  4460. ^@window_name$ = 
  4461. shell_GetWindowIdentifier( _window_handle% )
  4462. _moffset% = 
  4463. Evnts_GetEvntListOffset( window_name$, -1, _EVNTS_REDRAW_ANCHOR%, _EVNTS_REDRAW_REC_SIZE%, 
  4464.  offset% >= 0 
  4465. b3  evnt_list% = !_EVNTS_REDRAW_ANCHOR% + offset%
  4466. c%  user_FN_offset% = evnt_list%!16
  4467. d'  data_list% = !_EVNTS_REDRAW_DATA%
  4468. e2  user_FN$ = $( data_list% + user_FN_offset% )
  4469.  user_FN$ <> "" 
  4470.  PROCshell_Tracef0( "EvntHandle_Redraw:About to call " + "FN" + user_FN$ + "(" + STR$blk% + "," + STR$ x0% + "," + STR$ y0% + ")" )
  4471. iS    void% = 
  4472. ("FN" + user_FN$ + "(" + 
  4473.  blk% + "," + 
  4474.  x0% + "," + 
  4475.  y0% + ")")
  4476. o&*|Stop PROCshell_EvntHandle_Redraw
  4477. s *|Start PROCshell_ListRedraw
  4478. shell_ListRedraw
  4479.  list_size%, event_list%, rec_size%, ptr%, nr_events%, user_FN$, window_name$
  4480.  event_data_blk%, loop%
  4481. w(event_list% = !_EVNTS_REDRAW_ANCHOR%
  4482. x)rec_size%   = _EVNTS_REDRAW_REC_SIZE%
  4483. nr_events%  = event_list%!4
  4484. Evnts_DebugListHeader ( "Redraw ", "Window       User FN" )
  4485.  event_list% = 0  
  4486.  PROCshell_Tracef0("No Redraw Events found")
  4487. !  ptr% = _m_Evnts_HeaderSize%
  4488.  loop% = 1 
  4489.  nr_events%
  4490. .    window_name$ = $( event_list% + ptr% )
  4491. .    event_data_blk% = !_EVNTS_REDRAW_DATA%
  4492.  event_data_blk% > 0 
  4493. D      user_FN$ = $( event_data_blk% + event_list%!( ptr% + 16 ))
  4494.         
  4495. a    
  4496.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$,".",12 )  + " " + user_FN$ )
  4497. '    ptr% += _EVNTS_REDRAW_REC_SIZE%
  4498.  loop%
  4499.  PROCshell_Tracef0(" ")
  4500. *|Stop PROCshell_ListRedraw
  4501.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4502.  Public Routines (IconWatch Evnts)
  4503.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4504. %*|Start PROCshell_AttachIconWatch
  4505. shell_AttachIconWatch( window_handle%, icon_handle%, user_FN$ )
  4506.  offset%, evnt_blk%, data_offset_addr%, window_name$, current_value$
  4507. ?window_name$ = 
  4508. shell_GetWindowIdentifier( window_handle% )
  4509. }offset% = 
  4510. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_ICONWATCH_ANCHOR%, _EVNTS_ICONWATCH_REC_SIZE%, 
  4511. )evnt_blk% = !_EVNTS_ICONWATCH_ANCHOR%
  4512. evnt_blk% += offset%
  4513. $evnt_blk%   = window_name$
  4514. evnt_blk%!12 = icon_handle%
  4515.  !_EVNTS_ICONWATCH_DATA% = 0 
  4516. J  !_EVNTS_ICONWATCH_DATA% = 
  4517. shell_HeapBlockFetch( 
  4518. ( user_FN$ ) + 1 )
  4519. &data_offset_addr% = evnt_blk% + 16
  4520. Evnts_UpdateData( data_offset_addr%, _EVNTS_ICONWATCH_DATA%, _EVNTS_ICONWATCH_DATAOFFSET%, user_FN$ )
  4521. Gcurrent_value$ = 
  4522. shell_IconGetData( window_handle%, icon_handle% )
  4523.  data_offset_addr% = evnt_blk% + 20
  4524.  PROCEvnts_UpdateData( data_offset_addr%, _EVNTS_ICONWATCH_DATA%, _EVNTS_ICONWATCH_DATAOFFSET%, current_value$ )
  4525. Oevent_nr% = ( offset% - 
  4526. Evnts_GetHeaderSize ) 
  4527.  _EVNTS_ICONWATCH_REC_SIZE%
  4528.  event_nr% > _c_evnts_MaxIconWatchEvnts% 
  4529.  99,"Sorry, too many IconWatch events attached (max " + 
  4530. ( _c_evnts_MaxIconWatchEvnts% ) + ")"
  4531. =  _c_evnts_CurrentContents$( event_nr% ) = current_value$
  4532. $*|Stop PROCshell_AttachIconWatch
  4533. **|Start PROCshell_EvntHandle_IconWatch
  4534. shell_EvntHandle_IconWatch
  4535.  evnt_list%, rec_size%, nr_evnts%, ptr%, loop%, icon_handle%, window_name$, old_value_offset%
  4536.  window_handle_list%, window_handle%, current_value$, old_value$, user_FN$, user_FN_offset%
  4537.  data_list%, data_offset_addr%
  4538. *evnt_list% = !_EVNTS_ICONWATCH_ANCHOR%
  4539. ,rec_size%   = _EVNTS_ICONWATCH_REC_SIZE%
  4540. nr_evnts%  = evnt_list%!4
  4541.  evnt_list% > 0  
  4542. !  ptr% = _m_Evnts_HeaderSize%
  4543.  loop% = 1 
  4544.  nr_evnts%
  4545. -    window_name$ = $( evnt_list% + ptr% )
  4546. S    
  4547.  ERROR 88,"Iconwatch events exist..("+STR$(nr_evnts%)+") : "+ window_name$
  4548. /    icon_handle% = evnt_list%!( ptr% + 12 )
  4549. 2    user_FN_offset% = evnt_list%!( ptr% + 16 )
  4550. ,    data_list% = !_EVNTS_ICONWATCH_DATA%
  4551. 8    user_FN$ = $( data_list% + user_FN_offset% )    
  4552. 9    
  4553.  old_value_offset% = !( evnt_list% + ptr% + 20 )
  4554. 4    
  4555.  data_offset_addr% = evnt_list% + ptr% + 20
  4556. '    
  4557.  IF old_value_offset% < 0 THEN
  4558.    old_value$ = ""
  4559.  ELSE
  4560. <    
  4561.    old_value$ = $( data_list% + old_value_offset% )
  4562.  ENDIF
  4563. n    old_value$ = _c_evnts_CurrentContents$( ( ptr% - 
  4564. Evnts_GetHeaderSize ) 
  4565.  _EVNTS_ICONWATCH_REC_SIZE% )
  4566. H    window_handle_list% = 
  4567. shell_GetWindowHandleList( window_name$ )
  4568. %    
  4569.  window_handle_list% <> -1 
  4570.       ctr% = 0
  4571.       
  4572. 5        window_handle% = window_handle_list%!ctr%
  4573. :        
  4574. shell_WindowIsOpen( window_handle% ) = 
  4575. Q          current_value$ = 
  4576. shell_IconGetData( window_handle%, icon_handle% )
  4577. @          
  4578.  IF current_value$ = "" THEN current_value$ = "0"
  4579. ?          
  4580.  user_FN$ <> "" 
  4581.  current_value$ <> old_value$ 
  4582. ^            
  4583.  PROCshell_Tracef0( "EvntHandle_IconWatch:About to call " + "FN" + user_FN$ )
  4584. c            
  4585.  ERROR 99,"FN" + user_FN$ + "( " + CHR$( 34 ) + current_value$ + CHR$( 34 ) + " )"
  4586. _            void% = 
  4587. ( "FN" + user_FN$ + "( " + 
  4588. ( 34 ) + current_value$ + 
  4589. ( 34 ) + " )" )
  4590.             
  4591.  PROCEvnts_UpdateData( data_offset_addr%, _EVNTS_ICONWATCH_DATA%, _EVNTS_ICONWATCH_DATAOFFSET%, current_value$ )
  4592. z            _c_evnts_CurrentContents$( ( ptr% - 
  4593. Evnts_GetHeaderSize ) 
  4594.  _EVNTS_ICONWATCH_REC_SIZE% ) = current_value$
  4595.           
  4596.         
  4597.         ctr% += 4
  4598. )      
  4599.  window_handle_list%!ctr% = -1
  4600.         
  4601. *    ptr% += _EVNTS_ICONWATCH_REC_SIZE%
  4602.  loop%
  4603. )*|Stop PROCshell_EvntHandle_IconWatch
  4604. #*|Start PROCshell_ListIconWatch
  4605. shell_ListIconWatch
  4606.  list_size%, event_list%, rec_size%, ptr%, nr_events%, user_FN$, window_name$
  4607.  event_data_blk%, loop%
  4608. +event_list% = !_EVNTS_ICONWATCH_ANCHOR%
  4609. ,rec_size%   = _EVNTS_ICONWATCH_REC_SIZE%
  4610. nr_events%  = event_list%!4
  4611. Evnts_DebugListHeader ( "IconWatch ", "Window       User FN" )
  4612.  event_list% = 0  
  4613.  PROCshell_Tracef0("No IconWatch Events found")
  4614. !  ptr% = _m_Evnts_HeaderSize%
  4615.  loop% = 1 
  4616.  nr_events%
  4617. .    window_name$ = $( event_list% + ptr% )
  4618. 1    event_data_blk% = !_EVNTS_ICONWATCH_DATA%
  4619.  event_data_blk% > 0 
  4620. D      user_FN$ = $( event_data_blk% + event_list%!( ptr% + 16 ))
  4621.         
  4622. a    
  4623.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$,".",12 )  + " " + user_FN$ )
  4624. *    ptr% += _EVNTS_ICONWATCH_REC_SIZE%
  4625.  loop%
  4626.  PROCshell_Tracef0(" ")
  4627. "*|Stop PROCshell_ListIconWatch
  4628.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4629.  Public Routines (UserDrag Evnts)
  4630.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4631. $*|Start PROCshell_AttachUserDrag
  4632. shell_AttachUserDrag( window_handle%, icon_handle%, user_FN$ )
  4633.  offset%, evnt_blk%, data_offset_addr%, window_name$, current_value$
  4634. ?window_name$ = 
  4635. shell_GetWindowIdentifier( window_handle% )
  4636. soffset% = 
  4637. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_DRAG_ANCHOR%, _EVNTS_DRAG_REC_SIZE%, 
  4638.  $evnt_blk% = !_EVNTS_DRAG_ANCHOR%
  4639. evnt_blk% += offset%
  4640. $evnt_blk%   = window_name$
  4641. evnt_blk%!12 = icon_handle%
  4642.  !_EVNTS_DRAG_DATA% = 0 
  4643. &E  !_EVNTS_DRAG_DATA% = 
  4644. shell_HeapBlockFetch( 
  4645. ( user_FN$ ) + 1 )
  4646. )&data_offset_addr% = evnt_blk% + 16
  4647. Evnts_UpdateData( data_offset_addr%, _EVNTS_DRAG_DATA%, _EVNTS_DRAG_DATAOFFSET%, user_FN$ )
  4648. .#*|Stop PROCshell_AttachUserDrag
  4649. 22*|Start PROCshell_EvntHandle_UserDragStartDrag
  4650. shell_EvntHandle_UserDragStartDrag( window_handle%, icon_handle% )
  4651.  user_FN_offset%, data_list%, window_name$, offset%
  4652. 7?window_name$ = 
  4653. shell_GetWindowIdentifier( window_handle% )
  4654. 8soffset% = 
  4655. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_DRAG_ANCHOR%, _EVNTS_DRAG_REC_SIZE%, 
  4656.  offset% >= 0 
  4657.  An evnt has been registered for when the drag ends..
  4658. shell_IconDragBox2( window_handle%, icon_handle% )
  4659. >4  _m_evnts_DragIconStartWindow% = window_handle%
  4660. ?2  _m_evnts_DragIconStartIcon%   = icon_handle%
  4661.  No evnt registered, but if icon is writable then allow the drag anyway provided the 'AllowWritableIconDrags'
  4662.  flag is set. At the end of this drag the contents of the dragged icon will be inserted into the icon the
  4663.  drag ended on (if it is writable..)
  4664. shell_IconWritableDragStatus = 
  4665. FA    
  4666. shell_IconIsWritable( window_handle%, icon_handle% ) 
  4667. G=      
  4668. shell_IconDragBox2( window_handle%, icon_handle% )
  4669. H9      _m_evnts_DragIconStartWindow%  = window_handle%
  4670. I7      _m_evnts_DragIconStartIcon%    = icon_handle%
  4671. J,      _m_evnts_DragIconWritableDrag% = 
  4672. KX      
  4673.  Store start window coords for use when checking whether autoscrolling should
  4674.       
  4675.  take place..
  4676.       
  4677. shell_WindowGetPosition( window_handle%, _m_evnts_DragIconWinXMin%, _m_evnts_DragIconWinYMin%, _m_evnts_DragIconWinXMax%, _m_evnts_DragIconWinYMax% )
  4678. NY      
  4679. shell_PointerGetPosition( _m_evnts_DragIconMouseX%, _m_evnts_DragIconMouseY% )
  4680. O        
  4681. U1*|Stop PROCshell_EvntHandle_UserDragStartDrag
  4682. Y,*|Start PROCshell_EvntHandle_UserDragEnd
  4683. shell_EvntHandle_UserDragEnd
  4684.  pointer_blk%, window_name$, offset%, evnt_list%, user_FN_offset%, data_list%
  4685.  void%, user_FN$, source_icon_text$, target_icon_text$, different_windows%, different_icons%
  4686. _Nwindow_name$ = 
  4687. shell_GetWindowIdentifier( _m_evnts_DragIconStartWindow% )
  4688. offset% = 
  4689. Evnts_GetEvntListOffset( window_name$, _m_evnts_DragIconStartIcon%, _EVNTS_DRAG_ANCHOR%, _EVNTS_DRAG_REC_SIZE%, 
  4690.  retrieve current position of pointer (window and icon over which
  4691.  the drag event ended plus pointer position)
  4692. d.pointer_blk% = 
  4693. shell_HeapBlockFetch( 30 )
  4694.  "Wimp_GetPointerInfo", , pointer_blk%
  4695. f0_m_evnts_MouseXCoord%      = pointer_blk%!00
  4696. g0_m_evnts_MouseYCoord%      = pointer_blk%!04
  4697. h0_m_evnts_DestWindowHandle% = pointer_blk%!12
  4698. i0_m_evnts_DestIconHandle%   = pointer_blk%!16
  4699. shell_HeapBlockReturn( pointer_blk% )
  4700.  offset% >= 0 
  4701. m1  evnt_list% = !_EVNTS_DRAG_ANCHOR% + offset%
  4702. n%  user_FN_offset% = evnt_list%!16
  4703. o%  data_list% = !_EVNTS_DRAG_DATA%
  4704. p2  user_FN$ = $( data_list% + user_FN_offset% )
  4705.   void% = 
  4706. ( "FN" + user_FN$ + "(" + 
  4707.  _m_evnts_DestTaskHandle% + "," + 
  4708.  _m_evnts_DestWindowHandle% + "," + 
  4709.  _m_evnts_DestIconHandle% + "," + 
  4710.  _m_evnts_MouseXCoord% + "," + 
  4711.  _m_evnts_MouseYCoord% + ")" )
  4712.  _m_evnts_DragIconWritableDrag% = 
  4713. u*    _m_evnts_DragIconWritableDrag% = 
  4714. shell_IconIsWritable( _m_evnts_DestWindowHandle%, _m_evnts_DestIconHandle% ) 
  4715. shell_WindowHandleKnown( _m_evnts_DestWindowHandle% ) 
  4716. wn      source_icon_text$ = 
  4717. shell_IconGetData( _m_evnts_DragIconStartWindow%, _m_evnts_DragIconStartIcon% )
  4718. xh      target_icon_text$ = 
  4719. shell_IconGetData( _m_evnts_DestWindowHandle%, _m_evnts_DestIconHandle% )
  4720.       
  4721. ( -1 ) 
  4722. z&        
  4723.  SHIFT key is held down..
  4724. {c        
  4725. shell_IconPutData( _m_evnts_DragIconStartWindow%, _m_evnts_DragIconStartIcon%, "", 
  4726.       
  4727.       
  4728. ( -2 ) 
  4729. ~m        
  4730.  CTRL key is held down, check that drag has not ended on the start icon and then append the text
  4731. =        
  4732.  from the first icon to that of the second one..
  4733. O        
  4734.  ( _m_evnts_DestWindowHandle% <> _m_evnts_DragIconStartWindow% ) 
  4735. $          different_windows% = 
  4736.         
  4737. $          different_windows% = 
  4738.         
  4739. &        
  4740.  different_windows% = 
  4741. L          
  4742.  (_m_evnts_DestIconHandle% <> _m_evnts_DragIconStartIcon% ) 
  4743. $            different_icons% = 
  4744.           
  4745. $            different_icons% = 
  4746.           
  4747. `          
  4748.  ( different_windows% = 
  4749.  ( different_windows% = 
  4750.  different_icons% = 
  4751.             
  4752. shell_IconPutData( _m_evnts_DestWindowHandle%, _m_evnts_DestIconHandle%, target_icon_text$ + source_icon_text$, 
  4753.           
  4754.         
  4755.       
  4756. l        
  4757. shell_IconPutData( _m_evnts_DestWindowHandle%, _m_evnts_DestIconHandle%, source_icon_text$, 
  4758.       
  4759.         
  4760. +*|Stop PROCshell_EvntHandle_UserDragEnd
  4761.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4762.  Public Routines (PopUp Evnts)
  4763.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4764.  format of popup handler event block..
  4765.  Each Event...
  4766.   +00 window name
  4767.   +12 icon handle of menu icon
  4768.   +16 offset to FN name to call on selection made event
  4769.   +20 icon handle of value display icon (-1 if none)
  4770.   +24 popup type word
  4771.   +28 menu handle to attach
  4772.   +32 offset to FN name to call before opening popup
  4773. '*|Start PROCshell_EvntAdd_PopUpMenu
  4774. shell_EvntAdd_PopUpMenu( window_name$, menu_icon%, display_icon%, menu_handle%, notify_FN$, preopen_FN$, flag% )
  4775.  offset%, evnt_blk%, menu_name$
  4776. uoffset% = 
  4777. Evnts_GetEvntListOffset( window_name$, menu_icon%, _EVNTS_POPUPS_ANCHOR%, _EVNTS_POPUPS_REC_SIZE%, 
  4778. 'evnt_blk%  = !_EVNTS_POPUPS_ANCHOR%
  4779. evnt_blk% += offset%
  4780. $evnt_blk%   = window_name$
  4781. evnt_blk%!12 = menu_icon%
  4782.  evnt_blk%!20 = display_icon%
  4783. evnt_blk%!24 = flag%
  4784.  !_EVNTS_POPUPS_DATA% = 0 
  4785. I  !_EVNTS_POPUPS_DATA% = 
  4786. shell_HeapBlockFetch( 
  4787. ( menu_name$ ) + 1 )
  4788.  notify_FN$ <> "" 
  4789. (  data_offset_addr% = evnt_blk% + 16
  4790. Evnts_UpdateData( data_offset_addr%, _EVNTS_POPUPS_DATA%, _EVNTS_POPUPS_DATAOFFSET%, notify_FN$ )
  4791.   evnt_blk%!16 = -1
  4792. >menu_name$ = 
  4793. shell_MenuList_GetIdentifier( menu_handle% )
  4794.  menu_name$ <> "" 
  4795. (  data_offset_addr% = evnt_blk% + 28
  4796. Evnts_UpdateData( data_offset_addr%, _EVNTS_POPUPS_DATA%, _EVNTS_POPUPS_DATAOFFSET%, menu_name$ )
  4797.  preopen_FN$ <> "" 
  4798.  !_EVNTS_POPUPS_DATA% = 0 
  4799. L    !_EVNTS_POPUPS_DATA% = 
  4800. shell_HeapBlockFetch( 
  4801. ( preopen_FN$ ) + 1 )
  4802. (  data_offset_addr% = evnt_blk% + 32
  4803. Evnts_UpdateData( data_offset_addr%, _EVNTS_POPUPS_DATA%, _EVNTS_POPUPS_DATAOFFSET%, preopen_FN$ )
  4804.   evnt_blk%!32 = -1
  4805. &*|Stop PROCshell_EvntAdd_PopUpMenu
  4806. **|Start PROCshell_EvntHandle_PopupMenu
  4807. shell_EvntHandle_PopupMenu( _window_handle%, _icon_handle% )
  4808.  window_name$, offset%, data_list%, data_offset%, evnt_list%, popup_type%, menu_handle%
  4809.  menu_y_pos%, notify_FN$, preopen_FN$, void%, menu_name$
  4810. @window_name$ = 
  4811. shell_GetWindowIdentifier( _window_handle% )
  4812.  PROCshell_Tracef0("EvntHandle_PopUpMenu::window_name$ = "+window_name$)
  4813. xoffset% = 
  4814. Evnts_GetEvntListOffset( window_name$, _icon_handle%, _EVNTS_POPUPS_ANCHOR%, _EVNTS_POPUPS_REC_SIZE%, 
  4815.  PROCshell_Tracef0("EvntHandle_PopUpMenu::offset% = "+STR$ offset%)
  4816.  offset% >= 0 
  4817. 6  evnt_list%    = !_EVNTS_POPUPS_ANCHOR% + offset%
  4818. #  data_offset%  = evnt_list%!16
  4819. *  data_list%    = !_EVNTS_POPUPS_DATA%
  4820. #  menu_icon%    = evnt_list%!12
  4821. #  display_icon% = evnt_list%!20
  4822. #  popup_type%   = evnt_list%!24
  4823.  PROCshell_Tracef0("EvntHandle_PopUpMenu::popup_type% = "+STR$ popup_type%)
  4824.  popup_type% = _POPUP_TYPE_TEXT 
  4825. %    data_offset%  = evnt_list%!28
  4826.  data_offset% >= 0 
  4827. 5      menu_name$ = $( data_list% + data_offset% )
  4828.         
  4829. A    menu_handle% = 
  4830. shell_MenuList_GetSysHandle( menu_name$ )
  4831.     menu_name$   = ""
  4832.     menu_handle% = 0
  4833.  data_offset% >= 0 
  4834. 3    notify_FN$ = $( data_list% + data_offset% )
  4835. N    
  4836.  PROCshell_Tracef0("EvntHandle_PopUpMenu::notify_FN$ = "+notify_FN$ )
  4837. K    
  4838.  PROCshell_Tracef0("EvntHandle_PopUpMenu::No notify_FN$ found.." )
  4839. #  data_offset%  = evnt_list%!32
  4840.  data_offset% >= 0 
  4841. 4    preopen_FN$ = $( data_list% + data_offset% )
  4842. S    
  4843.  PROCshell_Tracef0( "EvntHandle_PopUpMenu::preopen_FN$ = " + preopen_FN$ )
  4844. .    
  4845.  popup_type% = _POPUP_TYPE_FONTMENU 
  4846. U      void% = 
  4847. ( "FN" + preopen_FN$ + "(" + 
  4848. shell_FontMenu_GetHandle )+ ")" )
  4849.             
  4850. I      void% = 
  4851. ( "FN" + preopen_FN$ + "(" + 
  4852. ( menu_handle% ) + ")" )
  4853.         
  4854. M    
  4855.  PROCshell_Tracef0( "EvntHandle_PopUpMenu::No preopen_FN$ found.." )
  4856.  popup_type% 
  4857.  _POPUP_TYPE_TEXT
  4858. W      
  4859. shell_HandleMenuOpen( _Q%, menu_handle%, _window_handle%, _icon_handle%, 
  4860.      
  4861.  _POPUP_TYPE_WIMPCOLOUR
  4862. (      
  4863.  _m_WimpColMen_Handle% = -1 
  4864. K        
  4865.  "MenuUtil_ColourMenu",,"",notify_FN$ 
  4866.  _m_WimpColMen_Handle%
  4867.       
  4868. `      
  4869. shell_HandleMenuOpen( _Q%, _m_WimpColMen_Handle%, _window_handle%, _icon_handle%, 
  4870.  _POPUP_TYPE_COLOUR24
  4871. h      
  4872. shell_ColourPickerOpen( _window_handle%, display_icon%, menu_icon%, notify_FN$, preopen_FN$ )
  4873.  _POPUP_TYPE_FONTMENU
  4874. L      
  4875. shell_FontMenu_ShowMenu( _Q%, _window_handle%, _icon_handle%, 
  4876.  _POPUP_TYPE_FONTPICK
  4877. f      
  4878. shell_FontPickerOpen( _window_handle%, display_icon%, menu_icon%, notify_FN$, preopen_FN$ )
  4879.  _POPUP_TYPE_DATEPICK
  4880. Y      
  4881. shell_DatePickerOpen( _window_handle%, display_icon%, menu_icon%, notify_FN$ )
  4882.          
  4883. !-      
  4884.  99,"Unknown popup type detected!"
  4885.  PROCshell_Tracef0("EvntHandle_PopUpMenu::No popup event found..")
  4886. *)*|Stop PROCshell_EvntHandle_PopupMenu
  4887. .3*|Start PROCshell_EvntHandle_PopupMenuSelection
  4888. shell_EvntHandle_PopupMenuSelection( window_handle%, icon_handle%, selection_blk% )
  4889.  _item_text$, window_name$, offset%, evnt_list%, data_offset%, data_list%
  4890.  menu_icon%, display_icon%, popup_type%, menu_handle%, result%, notify_fn$
  4891.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::window_handle% = &"+STR$~window_handle% )
  4892. 3?window_name$ = 
  4893. shell_GetWindowIdentifier( window_handle% )
  4894.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::window_name$ = "+window_name$ )
  4895. 5woffset% = 
  4896. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_POPUPS_ANCHOR%, _EVNTS_POPUPS_REC_SIZE%, 
  4897.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::offset% = "+STR$ offset%)
  4898.  offset% >= 0 
  4899. 86  evnt_list%    = !_EVNTS_POPUPS_ANCHOR% + offset%
  4900. 9#  data_offset%  = evnt_list%!16
  4901. :*  data_list%    = !_EVNTS_POPUPS_DATA%
  4902. ;#  menu_icon%    = evnt_list%!12
  4903. <#  display_icon% = evnt_list%!20
  4904. =#  popup_type%   = evnt_list%!24
  4905. >#  menu_handle%  = evnt_list%!28
  4906.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::popup_type% = "+STR$ popup_type%)
  4907.  popup_type% = _POPUP_TYPE_FONTMENU 
  4908.     _item_text$ = ""
  4909. DM    _item_text$ = 
  4910. shell_MenuGetItemText( menu_handle%, !selection_blk% )
  4911.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::"+STR$(!selection_blk%))
  4912.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::_item_text$ = "+_item_text$ )
  4913.   result% = 0
  4914.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::data_offset% = "+STR$ data_offset%)
  4915.  data_offset% <> -1 
  4916. MP    
  4917.  notify_fn exists, so call it, passing menu item text. A non-zero value
  4918. NL    
  4919.  returned means that the display icon should be updated as usual...
  4920. OQ    
  4921.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::notify_FN$ found.." )
  4922. P3    notify_fn$ = $( data_list% + data_offset% )
  4923. Qd    
  4924.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::notify_fn$ '" + notify_fn$ + "' found" )
  4925. Rk    result% = 
  4926. ( "FN" + notify_fn$ + "(" + 
  4927.  window_handle% + "," + 
  4928.  display_icon% + ",_item_text$)" )
  4929. TT    
  4930.  PROCshell_Tracef0("EvntHandle_PopupMenuSelection::No notify_fn$ found.." )
  4931.  result% <> 0 
  4932.  data_offset% = -1 
  4933. YS    
  4934.  no notify FN, or notify_fn has returned a non-zero value so just put menu
  4935. ZO    
  4936.  text into display icon, or set background colour of display icon if a
  4937. [R    
  4938.  colour menu is involved. If display icon handle is -1 then do nothing as
  4939. \0    
  4940.  otherwise an error may be generated...
  4941.  display_icon% >= 0 
  4942.       
  4943.  popup_type% 
  4944.         
  4945.  _POPUP_TYPE_TEXT
  4946. cQ          
  4947. shell_IconPutData( window_handle%, display_icon%, _item_text$, 
  4948. e$        
  4949.  _POPUP_TYPE_WIMPCOLOUR
  4950. fU          
  4951. shell_IconSetBGColour( window_handle%, display_icon%, selection_blk% )
  4952.         
  4953. ii          
  4954.  99,"Unknown Popup type in EvntHandle_PopupMenuSelection (type was " + 
  4955.  popup_type% + ")"
  4956.       
  4957. m        
  4958. u2*|Stop PROCshell_EvntHandle_PopupMenuSelection
  4959. y *|Start PROCshell_ListPopUps
  4960. shell_ListPopUps
  4961.  list_size%, event_list%, rec_size%, ptr%, nr_events%, e_ptr%
  4962.  icon_handle%, user_FN$, event_data_blk%, loop%
  4963. }(event_list% = !_EVNTS_POPUPS_ANCHOR%
  4964. ~)rec_size%   = _EVNTS_POPUPS_REC_SIZE%
  4965. nr_events%  = event_list%!4
  4966. Evnts_DebugListHeader ( "PopUps", "Window         Icon   FN" )
  4967.  event_list% = 0  
  4968.  PROCshell_Tracef0("No PopUp Events found")
  4969. !  ptr% = _m_Evnts_HeaderSize%
  4970.  loop% = 1 
  4971.  nr_events%
  4972. .    window_name$ = $( event_list% + ptr% )
  4973. /    icon_handle% = event_list%!( ptr% + 12)
  4974. .    event_data_blk% = !_EVNTS_POPUPS_DATA%
  4975.  event_data_blk% > 0 
  4976. D      user_FN$ = $( event_data_blk% + event_list%!( ptr% + 16 ))
  4977.         
  4978.  PROCshell_Tracef0( FNshell_StringPadTrailing( window_name$,".",12 )  + " "+FNshell_StringPadLeading(STR$ icon_handle%," ",6)+"   "+user_FN$)
  4979. '    ptr% += _EVNTS_POPUPS_REC_SIZE%
  4980.  loop%
  4981.  PROCshell_Tracef0(" ")
  4982. *|Stop PROCshell_ListPopUps
  4983.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4984.  Public Routines (General)
  4985.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4986. -*|Start PROCshell_EvntSelectButtonPressed
  4987. shell_EvntSelectButtonPressed( window_handle%, icon_handle%, pointer_y_pos% )
  4988.  PROCshell_Tracef0("EvntSelectButtonPressed:Mouse Button was SELECT")
  4989. shell_EvntHandle_ClickSelect( window_handle%, icon_handle% )
  4990. ,*|Stop PROCshell_EvntSelectButtonPressed
  4991. -*|Start PROCshell_EvntAdjustButtonPressed
  4992. shell_EvntAdjustButtonPressed( window_handle%, icon_handle% )
  4993.  PROCshell_Tracef0("EvntAdjustButtonPressed:Mouse Button was ADJUST")
  4994. shell_EvntHandle_ClickAdjust( window_handle%, icon_handle% )
  4995. ,*|Stop PROCshell_EvntAdjustButtonPressed
  4996. +*|Start PROCshell_EvntMenuButtonPressed
  4997. shell_EvntMenuButtonPressed( window_handle%, icon_handle%, pointer_y_pos% )
  4998.  PROCshell_Tracef0("EvntMenuButtonPressed:Mouse Button was MENU")
  4999. shell_EvntHandle_ClickMenu( window_handle%, icon_handle% )
  5000.  PROCshell_EvntHandle_PopupMenu( window_handle%, icon_handle%, pointer_y_pos% )
  5001. **|Stop PROCshell_EvntMenuButtonPressed
  5002. '*|Start PROCshell_EvntSave_AllEvnts
  5003. shell_EvntSave_AllEvnts( file_name$ )
  5004.  file_handle%
  5005. "file_handle% = 
  5006. ( file_name$ )
  5007. Evnts_SaveEvnt( file_handle%, _EVNTS_CLICKSELECT_ANCHOR%, _EVNTS_CLICKSELECT_DATA%, _EVNTS_CLICKSELECT_DATAOFFSET% )
  5008. Evnts_SaveEvnt( file_handle%, _EVNTS_CLICKADJUST_ANCHOR%, _EVNTS_CLICKADJUST_DATA%, _EVNTS_CLICKADJUST_DATAOFFSET% )
  5009. Evnts_SaveEvnt( file_handle%, _EVNTS_CLICKMENU_ANCHOR%,   _EVNTS_CLICKMENU_DATA%,   _EVNTS_CLICKMENU_DATAOFFSET% )
  5010. Evnts_SaveEvnt( file_handle%, _EVNTS_HELPTAG_ANCHOR%,     _EVNTS_HELPTAG_DATA%,     _EVNTS_HELPTAG_DATAOFFSET% )
  5011. shell_PointerSaveEvnts( file_handle% )
  5012. Evnts_SaveEvnt( file_handle%, _EVNTS_REDRAW_ANCHOR%,      _EVNTS_REDRAW_DATA%,      _EVNTS_REDRAW_DATAOFFSET% )
  5013. Evnts_SaveEvnt( file_handle%, _EVNTS_WINDOWCLOSE_ANCHOR%, _EVNTS_WINDOWCLOSE_DATA%, _EVNTS_WINDOWCLOSE_DATAOFFSET% )
  5014. Evnts_SaveEvnt( file_handle%, _EVNTS_PANES_ANCHOR%,       _EVNTS_PANES_DATA%,       _EVNTS_PANES_DATAOFFSET% )
  5015. Evnts_SaveEvnt( file_handle%, _EVNTS_POPUPS_ANCHOR%,      _EVNTS_POPUPS_DATA%,      _EVNTS_POPUPS_DATAOFFSET% )
  5016. Evnts_SaveEvnt( file_handle%, _EVNTS_SLIDERS_ANCHOR%,     _EVNTS_SLIDERS_DATA%,     _EVNTS_SLIDERS_DATAOFFSET% )
  5017. Evnts_SaveEvnt( file_handle%, _EVNTS_BUMP_ANCHOR%,        _EVNTS_BUMP_DATA%,        _EVNTS_BUMP_DATAOFFSET% )
  5018. Evnts_SaveEvnt( file_handle%, _EVNTS_DRAG_ANCHOR%,        _EVNTS_DRAG_DATA%,        _EVNTS_DRAG_DATAOFFSET% )
  5019. Evnts_SaveEvnt( file_handle%, _m_DSave_Anchor%,           _m_DSave_DataBlk%,        _m_DSave_DataOffset% )
  5020. Evnts_SaveEvnt( file_handle%, _EVNTS_ICONWATCH_ANCHOR%,   _EVNTS_ICONWATCH_DATA%,   _EVNTS_ICONWATCH_DATAOFFSET% )
  5021. Evnts_SaveEvnt( file_handle%, _m_DLoad_Anchor%,           _m_DLoad_DataBlk%,        _EVNTS_DATALOAD_DATAOFFSET% )
  5022. # file_handle%
  5023. &*|Stop PROCshell_EvntSave_AllEvnts
  5024. *|Start PROCEvnts_SaveEvnt
  5025. Evnts_SaveEvnt( file_handle%, event_anchor_blk%, data_anchor_blk%, data_offset% )
  5026.  evnt_blk%, evnt_blk_size%, data_blk%
  5027. #evnt_blk%  = !event_anchor_blk%
  5028. "data_blk%  = !data_anchor_blk%
  5029. (!_c_Evnts_WorkBuffer% = data_offset%
  5030.  evnt_blk% = 0 
  5031. # file_handle%,0
  5032. !  evnt_blk_size% = !evnt_blk%
  5033. # file_handle%,1
  5034.  "OS_GBPB",2,file_handle%,evnt_blk%,evnt_blk_size% + _m_Evnts_HeaderSize%
  5035.  "OS_GBPB",2,file_handle%,_c_Evnts_WorkBuffer%,4
  5036.  "OS_GBPB",2,file_handle%,data_blk%, data_offset%
  5037. *|Stop PROCEvnts_SaveEvnt
  5038. '*|Start PROCshell_EvntLoad_AllEvnts
  5039. shell_EvntLoad_AllEvnts( file_name$ )
  5040.  file_handle%, evnt_blk%, file_type%, converted_file_type%
  5041. "file_handle% = 
  5042. ( file_name$ )
  5043. Evnts_LoadEvnt( file_handle%, _EVNTS_CLICKSELECT_ANCHOR%,  _EVNTS_CLICKSELECT_DATA%, _EVNTS_CLICKSELECT_DATAOFFSET% )
  5044. Evnts_LoadEvnt( file_handle%, _EVNTS_CLICKADJUST_ANCHOR%,  _EVNTS_CLICKADJUST_DATA%, _EVNTS_CLICKADJUST_DATAOFFSET% )
  5045. Evnts_LoadEvnt( file_handle%, _EVNTS_CLICKMENU_ANCHOR%,    _EVNTS_CLICKMENU_DATA%,   _EVNTS_CLICKMENU_DATAOFFSET% )
  5046. Evnts_LoadEvnt( file_handle%, _EVNTS_HELPTAG_ANCHOR%,      _EVNTS_HELPTAG_DATA%,     _EVNTS_HELPTAG_DATAOFFSET% )
  5047. shell_PointerLoadEvnts( file_handle% )
  5048. Evnts_LoadEvnt( file_handle%, _EVNTS_REDRAW_ANCHOR%,       _EVNTS_REDRAW_DATA%,      _EVNTS_REDRAW_DATAOFFSET% )
  5049. Evnts_LoadEvnt( file_handle%, _EVNTS_WINDOWCLOSE_ANCHOR%,   _EVNTS_WINDOWCLOSE_DATA%,_EVNTS_WINDOWCLOSE_DATAOFFSET% )
  5050. Evnts_LoadEvnt( file_handle%, _EVNTS_PANES_ANCHOR%,        _EVNTS_PANES_DATA%,       _EVNTS_PANES_DATAOFFSET% )
  5051. Evnts_LoadEvnt( file_handle%, _EVNTS_POPUPS_ANCHOR%,       _EVNTS_POPUPS_DATA%,      _EVNTS_POPUPS_DATAOFFSET% )
  5052. Evnts_LoadEvnt( file_handle%, _EVNTS_SLIDERS_ANCHOR%,      _EVNTS_SLIDERS_DATA%,     _EVNTS_SLIDERS_DATAOFFSET% )
  5053. Evnts_LoadEvnt( file_handle%, _EVNTS_BUMP_ANCHOR%,         _EVNTS_BUMP_DATA%,        _EVNTS_BUMP_DATAOFFSET% )
  5054. Evnts_LoadEvnt( file_handle%, _EVNTS_DRAG_ANCHOR%,         _EVNTS_DRAG_DATA%,        _EVNTS_DRAG_DATAOFFSET% )
  5055. Evnts_LoadEvnt( file_handle%, _m_DSave_Anchor%,            _m_DSave_DataBlk%,        _m_DSave_DataOffset% )
  5056. Evnts_LoadEvnt( file_handle%, _EVNTS_ICONWATCH_ANCHOR%,    _EVNTS_ICONWATCH_DATA%,   _EVNTS_ICONWATCH_DATAOFFSET% )
  5057. Evnts_LoadEvnt( file_handle%, _m_DLoad_Anchor%,            _m_DLoad_DataBlk%,        _m_DLoad_DataOffset% )
  5058. # file_handle%
  5059.     soffset% = 
  5060. Evnts_GetEvntListOffset( "iconbar", _c_DLoad_ICONBAR_ICON%, _m_DLoad_Anchor%, _c_DLoad_RecSize%, 
  5061.  offset% > -1 
  5062. 0  _m_DLoad_FileName$ = 
  5063. shell_GetCmdLineArgs
  5064.  _m_DLoad_FileName$ <> "" 
  5065. %    evnt_blk% = !_m_DLoad_Anchor%
  5066.     evnt_blk% += offset%
  5067. !    file_type% = evnt_blk%!16
  5068. 9    converted_file_type% = file_type% 
  5069.  ( 1 << 31 )
  5070. H    
  5071. shell_FileType( _m_DLoad_FileName$ ) = converted_file_type% 
  5072. o      
  5073. DataLoad_CallUserFN( -1, converted_file_type%, 
  5074. shell_FileLength( _m_DLoad_FileName$ ), evnt_blk% ) 
  5075.         
  5076. &*|Stop PROCshell_EvntLoad_AllEvnts
  5077. *|Start PROCEvnts_LoadEvnt
  5078. Evnts_LoadEvnt( file_handle%, event_anchor_blk%, data_anchor_blk%, 
  5079.  data_offset% )
  5080.  byte%, evnt_blk_size%, evnt_blk%, evnt_blk_size%, data_size%, data_blk%
  5081.  !event_anchor_blk% <> 0 
  5082. shell_HeapBlockReturn( !event_anchor_blk% )
  5083.  !data_anchor_blk% <> 0 
  5084. shell_HeapBlockReturn( !data_anchor_blk% )
  5085. byte% = 
  5086. # file_handle%
  5087.  byte% = 1 
  5088. %?  evnt_blk% = 
  5089. shell_HeapBlockFetch( _m_Evnts_HeaderSize% )
  5090.  "OS_GBPB",4,file_handle%,evnt_blk%,_m_Evnts_HeaderSize%
  5091. '!  evnt_blk_size% = !evnt_blk%
  5092. (E  evnt_blk% = 
  5093. shell_HeapBlockExtend( evnt_blk%, evnt_blk_size% )
  5094.  "OS_GBPB",4,file_handle%,evnt_blk% + _m_Evnts_HeaderSize%, evnt_blk_size%
  5095. *$  !event_anchor_blk% = evnt_blk%
  5096.  "OS_GBPB",4,file_handle%, _c_Evnts_WorkBuffer%, 4
  5097. ,(  data_size% = !_c_Evnts_WorkBuffer%
  5098.  data_size% > 0 
  5099. .7    data_blk% = 
  5100. shell_HeapBlockFetch( data_size% )
  5101. /:    
  5102.  "OS_GBPB",4,file_handle%, data_blk%, data_size%
  5103. 0%    !data_anchor_blk% = data_blk%
  5104. 1!    data_offset% = data_size%
  5105.   !event_anchor_blk% = 0
  5106. *|Stop PROCEvnts_LoadEvnt
  5107.  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5108.  Following routine called on MenuSelect event  (Evnt Code 9)
  5109.  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5110. D1      *|Start PROCshell_EvntHandle_MenuSelect
  5111. shell_EvntHandle_MenuSelect( select_block% )
  5112.  handler%, flags%
  5113.  First find out which mouse button was used for the menu select..
  5114. shell_PointerGetMouseButton ( _EVNTS_LAST_MOUSEBUTTON% )
  5115. shell_GetLastIconClicked >= 0 
  5116. shell_EvntHandle_PopupSelect( select_block% )
  5117.  Find and call MenuUtils item handler routine, no
  5118.  error caused if one doesn't exist..
  5119.  "XMenuUtil_Decode", _m_Menu_HandleLastOpened%, select_block% 
  5120.  handler%, , _c_Evnts_WorkBuffer%;flags%
  5121.  flags% <> 1 
  5122.  handler% 
  5123. Evnts_CallMenuHandler( handler%, _c_Evnts_WorkBuffer% )
  5124. shell_GetLastMouseButton = _MSE_ADJUSTBUT 
  5125.  _EVNTS_LAST_MENUMAKER_FN$ <> "" 
  5126. Y"    
  5127.  Call last menuwarning fn
  5128. ZL    void% = 
  5129. ( "FN" + _EVNTS_LAST_MENUMAKER_FN$ + "( _U%!52, _U%!56 )" )
  5130. shell_MenuOpenLast
  5131. b**|Stop PROCshell_EvntHandle_MenuSelect
  5132. f,*|Start PROCshell_EvntHandle_PopupSelect
  5133. shell_EvntHandle_PopupSelect( select_block% )
  5134.  window_name$, offset%, evnt_list%, item_text$, menu_handle%, flag_word%
  5135.  data_blk%, notify_offset%, result%, notify_fn$
  5136.  display_icon%, fontmenuflag%, menu_buffer%, menu_name_offset%
  5137. mLwindow_name$ = 
  5138. shell_GetWindowIdentifier( 
  5139. shell_GetLastWindowClicked )
  5140. offset% = 
  5141. Evnts_GetEvntListOffset( window_name$, 
  5142. shell_GetLastIconClicked, _EVNTS_POPUPS_ANCHOR%, _EVNTS_POPUPS_REC_SIZE%, 
  5143.  offset% >= 0 
  5144.  window_name$ <> "iconbar" 
  5145. p8  evnt_list%      = !_EVNTS_POPUPS_ANCHOR% + offset%
  5146. q%  flag_word%      = evnt_list%!24
  5147. r,  data_blk%       = !_EVNTS_POPUPS_DATA%
  5148. s%  notify_offset%  = evnt_list%!16
  5149. t%  display_icon%   = evnt_list%!20
  5150.  select_block%!4 <> -1 
  5151.  flag_word% <> _POPUP_TYPE_FONTMENU 
  5152. w5    
  5153.  99, "Unable to handle popup with submenus!"
  5154.  flag_word% = _POPUP_TYPE_TEXT 
  5155. {*    menu_name_offset%  = evnt_list%!28
  5156. |"    
  5157.  menu_name_offset% >= 0 
  5158. }9      menu_name$ = $( data_blk% + menu_name_offset% )
  5159. ~        
  5160. A    menu_handle% = 
  5161. shell_MenuList_GetSysHandle( menu_name$ )
  5162.  flag_word% = _POPUP_TYPE_FONTMENU 
  5163. <    item_text$ = 
  5164. shell_FontMenu_Decode( select_block% )
  5165. K    item_text$ = 
  5166. shell_MenuGetItemText( menu_handle%, !select_block% )
  5167.   result% = 0
  5168.  notify_offset% > -1 
  5169. P    
  5170.  notify_fn exists, so call it, passing menu item text. A non-zero value
  5171. L    
  5172.  returned means that the display icon should be updated as usual...
  5173. 4    notify_fn$ = $( data_blk% + notify_offset% )
  5174.  item_text$ <> "" 
  5175.       result% = 
  5176. ( "FN" + notify_fn$+ "(" + 
  5177. shell_GetLastWindowClicked ) + "," + 
  5178.  display_icon% + "," + 
  5179. ( 34) + item_text$ + 
  5180. ( 34 ) + ")" )
  5181.         
  5182.  result% <> 0 
  5183.  notify_offset% = -1 
  5184. S    
  5185.  no notify FN, or notify_fn has returned a non-zero value so just put menu
  5186. O    
  5187.  text into display icon, or set background colour of display icon if a
  5188. R    
  5189.  colour menu is involved. If display icon handle is -1 then do nothing as
  5190. 0    
  5191.  otherwise an error may be generated...
  5192.  display_icon% >= 0 
  5193.       
  5194.  flag_word% 
  5195.         
  5196.  _POPUP_TYPE_TEXT
  5197. ]          
  5198. shell_IconPutData( 
  5199. shell_GetLastWindowClicked, display_icon%, item_text$, 
  5200. $        
  5201.  _POPUP_TYPE_WIMPCOLOUR
  5202. b          
  5203. shell_IconSetBGColour( 
  5204. shell_GetLastWindowClicked, display_icon%, !select_block% )
  5205. "        
  5206.  _POPUP_TYPE_FONTMENU
  5207. "          
  5208.  item_text$ <> "" 
  5209. _            
  5210. shell_IconPutData( 
  5211. shell_GetLastWindowClicked, display_icon%, item_text$, 
  5212.           
  5213.         
  5214. i        
  5215.  99,"Unknown Popup type in PROCshell_EvntHandle_PopupSelect (type was " + 
  5216.  flag_word% + ")"
  5217.       
  5218.         
  5219. +*|Stop PROCshell_EvntHandle_PopupSelect
  5220. %*|Start PROCEvnts_CallMenuHandler
  5221. Evnts_CallMenuHandler( h%, h_blk% )
  5222. ( "FN" + $h% + "(" + 
  5223.  h_blk% + ")" )
  5224. $*|Stop PROCEvnts_CallMenuHandler
  5225. !*|Start FNEvnts_GetHeaderSize
  5226. Evnts_GetHeaderSize
  5227. = _m_Evnts_HeaderSize%
  5228.  *|Stop FNEvnts_GetHeaderSize
  5229. &*|Start FNEvnts_GetLastMouseButton
  5230. Evnts_GetLastMouseButton
  5231. = _EVNTS_LAST_MOUSEBUTTON%
  5232. %*|Stop FNEvnts_GetLastMouseButton
  5233. &*|Start FNEvnts_GetLastIconClicked
  5234. Evnts_GetLastIconClicked
  5235. = _EVNTS_LAST_ICONCLICKED%
  5236. %*|Stop FNEvnts_GetLastIconClicked
  5237. (*|Start FNEvnts_GetLastWindowClicked
  5238. Evnts_GetLastWindowClicked
  5239.  = _EVNTS_LAST_WINDOWCLICKED%
  5240. '*|Stop FNEvnts_GetLastWindowClicked
  5241. $*|Start FNEvnts_GetLastMouseXPos
  5242. Evnts_GetLastMouseXPos
  5243. = _EVNTS_LAST_MOUSEXPOS%
  5244. #*|Stop FNEvnts_GetLastMouseXPos
  5245. $*|Start FNEvnts_GetLastMouseYPos
  5246. Evnts_GetLastMouseYPos
  5247. = _EVNTS_LAST_MOUSEYPOS%
  5248. #*|Stop FNEvnts_GetLastMouseYPos
  5249.  *|Start PROCEvnts_DeleteData
  5250. Evnts_DeleteData( window_name$, icon_handle%, anchor_blk%, data_blk%, rec_size%, data_offset%, 
  5251.  end_of_data% )
  5252.  Remove specified data from the data block..
  5253.  curr_evnt_data$, data_offset_addr%, evnt_name_uppercase$, evnt_blk%, offset%
  5254.  data_ptr%, from_addr%, to_addr%, buffer_len%, ptr%, loop%, nr_evnts%
  5255.  window_name$ = "IconBar" 
  5256.   icon_handle% = -1
  5257. _offset% = 
  5258. Evnts_GetEvntListOffset( window_name$, icon_handle%, anchor_blk%, rec_size%, 
  5259. evnt_blk% = !anchor_blk%
  5260. nr_evnts% = evnt_blk%!4
  5261. evnt_blk% += offset%
  5262. 0data_offset_addr% = evnt_blk% + data_offset%
  5263. "data_ptr% = !data_offset_addr%
  5264. !data_offset_addr% = -1
  5265.  data_ptr% = -1 
  5266.  No data for this event currently stored, so do nothing..
  5267.  Check currently stored data..
  5268. 3  curr_evnt_data$ = $( !data_blk% + data_ptr% )
  5269.  Move the rest of the data up, overwriting the data to be removed..
  5270. H  from_addr% = ( !data_blk% + data_ptr% ) + 
  5271. ( curr_evnt_data$ ) + 1
  5272. )  to_addr%   = !data_blk% + data_ptr%
  5273. *  buffer_len%  = from_addr% - to_addr%
  5274.  "Wimp_TransferBlock", _U%!148, from_addr%, _U%!148, to_addr%, buffer_len%
  5275. !  end_of_data% -= buffer_len%
  5276. F  !data_blk% = 
  5277. shell_HeapBlockExtend( !data_blk%, - buffer_len% )
  5278.  Now correct any references to data that is positioned after the deleted data..
  5279.   evnt_blk% = !anchor_blk%
  5280. 0  ptr% = _m_Evnts_HeaderSize% + data_offset%
  5281.  loop% = 1 
  5282.  nr_evnts%
  5283. &    
  5284.  evnt_blk%!ptr% > data_ptr% 
  5285. '      evnt_blk%!ptr% -= buffer_len%
  5286.         
  5287.     ptr% += rec_size%
  5288.  loop%
  5289. *|Stop PROCEvnts_DeleteData
  5290.  *|Start PROCEvnts_DeleteEvnt
  5291. Evnts_DeleteEvnt( window_name$, icon_handle%, anchor_blk%, data_blk%, rec_size% )
  5292.  offset%, evnt_blk%, nr_evnts%, from_addr%, to_addr%, nr_evnts%
  5293. "_offset% = 
  5294. Evnts_GetEvntListOffset( window_name$, icon_handle%, anchor_blk%, rec_size%, 
  5295. evnt_blk% = !anchor_blk%
  5296. nr_evnts% = evnt_blk%!4
  5297.  Check what happens if this is the last event (should be OK....)
  5298.  nr_evnts% > 0 
  5299. */  evnt_blk%!0 -= rec_size% :
  5300.  adjust header
  5301. +/  evnt_blk%!4 -= 1         :
  5302.  adjust header
  5303.   evnt_blk% += offset%
  5304. .)  from_addr%  = evnt_blk% + rec_size%
  5305.   to_addr%    = evnt_blk%
  5306.   buffer_len% = rec_size%
  5307.  nr_evnts% > 1 
  5308. 3T    
  5309.  "Wimp_TransferBlock", _U%!148, from_addr%, _U%!148, to_addr%, buffer_len%
  5310. 6J  !anchor_blk% = 
  5311. shell_HeapBlockExtend( !anchor_blk%, - buffer_len% )
  5312. *|Stop PROCEvnts_DeleteEvnt
  5313. @'*|Start FNshell_EvntHandle_MenuHelp
  5314. shell_EvntHandle_MenuHelp( selection_block% )
  5315.  helptag$, last_menu_handle%, ptr%, item_handle%, offset%
  5316.  tag_data_offset%, helptags_data_blk%
  5317.  ok, it's a menu..
  5318. G.last_menu_handle%  = 
  5319. shell_MenuLastHandle
  5320. ptr% = 0
  5321.  selection_block%!ptr% <> -1
  5322. K,  selected_item% = selection_block%!ptr%
  5323.   ptr% += 4
  5324. ORitem_handle% = 
  5325. shell_MenuGetItemHandle( last_menu_handle%, selection_block% )
  5326.  item_handle% <> 0 
  5327.  Valid menu item handle found..
  5328. S}  offset% = 
  5329. Evnts_GetEvntListOffset( "menu", item_handle%, _EVNTS_MENUHELPTAG_ANCHOR%, _EVNTS_MENUHELPTAG_REC_SIZE%, 
  5330.  offset% >= 0 
  5331. U<    evnt_list%   = !_EVNTS_MENUHELPTAG_ANCHOR% + offset%
  5332. V)    tag_data_offset%  = evnt_list%!16
  5333. W6    helptags_data_blk% = !_EVNTS_MENUHELPTAG_DATA%
  5334. X=    helptag$ = $( helptags_data_blk% + tag_data_offset% )
  5335.  Menu item handle not found (non MenuUtils menu etc..)
  5336.   helptag$ = ""
  5337. = helptag$
  5338. a&*|Stop FNshell_EvntHandle_MenuHelp
  5339. e+*|Start FNshell_EvntHandle_AttachedHelp
  5340. shell_EvntHandle_AttachedHelp( offset% )
  5341.  evnt_list%, tag_data_offset%, helptags_data_blk%, helptag$
  5342. j4evnt_list%   = !_EVNTS_HELPTAG_ANCHOR% + offset%
  5343. k%tag_data_offset%  = evnt_list%!16
  5344. l.helptags_data_blk% = !_EVNTS_HELPTAG_DATA%
  5345. m9helptag$ = $( helptags_data_blk% + tag_data_offset% )
  5346. = helptag$
  5347. q**|Stop FNshell_EvntHandle_AttachedHelp
  5348. u0*|Start FNshell_Evnts_WritableDragInProgress
  5349. shell_Evnts_WritableDragInProgress
  5350. w$= _m_evnts_DragIconWritableDrag%
  5351. y/*|Stop FNshell_Evnts_WritableDragInProgress
  5352. }-*|Start FNshell_Evnts_DragIconStartWindow
  5353. shell_Evnts_DragIconStartWindow
  5354. #= _m_evnts_DragIconStartWindow%
  5355. ,*|Stop FNshell_Evnts_DragIconStartWindow
  5356. +*|Start FNshell_Evnts_DragIconStartIcon
  5357. shell_Evnts_DragIconStartIcon
  5358. != _m_evnts_DragIconStartIcon%
  5359. **|Stop FNshell_Evnts_DragIconStartIcon
  5360. -*|Start PROCshell_Evnts_MonitorDragPtrPos
  5361. shell_Evnts_MonitorDragPtrPos
  5362.  ptr_blk%, window_handle%, mouse_y%, mouse_x%
  5363.  up%, down%, left%, right%, dx%, dy%, top_pane_depth%
  5364.  bottom_pane_depth%
  5365. shell_PointerGetPosition( mouse_x%, mouse_y% )
  5366. shell_PointerGetWindow( window_handle% )
  5367. shell_PointerGetMovementVector( _m_evnts_DragIconMouseX%, _m_evnts_DragIconMouseY%, mouse_x%, mouse_y%, up%, down%, left%, right%, dx%, dy% )
  5368.  dx% <> 0 
  5369.  dy% <> 0 
  5370.   mouse has moved, reset stored mouse position..
  5371. )  _m_evnts_DragIconMouseX% = mouse_x%
  5372. )  _m_evnts_DragIconMouseY% = mouse_y%
  5373.  mouse is stationary, check whether it is inside the scroll zone..
  5374. shell_PointerGetLastMovementVector( up%, down%, left%, right%, dx%, dy% )
  5375.  dx% <> 0 
  5376.  dy% <> 0 
  5377. O    
  5378.  mouse_x% > ( _m_evnts_DragIconWinXMax% - _m_evnts_DragIconMargin% ) 
  5379.       
  5380. shell_WindowScrollBy( 
  5381. shell_Evnts_DragIconStartWindow, mouse_x% - ( _m_evnts_DragIconWinXMax% - _m_evnts_DragIconMargin% ), 0 )
  5382.         
  5383. O    
  5384.  mouse_x% < ( _m_evnts_DragIconWinXMin% + _m_evnts_DragIconMargin% ) 
  5385.       
  5386. shell_WindowScrollBy( 
  5387. shell_Evnts_DragIconStartWindow, mouse_x% - ( _m_evnts_DragIconWinXMin% + _m_evnts_DragIconMargin% ) , 0 )
  5388.         
  5389. a    bottom_pane_depth% = 
  5390. shell_Window_GetBottomPaneDepth( 
  5391. shell_Evnts_DragIconStartWindow )
  5392. d    
  5393.  mouse_y% < ( _m_evnts_DragIconWinYMin% + _m_evnts_DragIconMargin% + bottom_pane_depth% ) 
  5394.       
  5395. shell_WindowScrollBy( 
  5396. shell_Evnts_DragIconStartWindow, 0 , mouse_y% - ( _m_evnts_DragIconWinYMin% + _m_evnts_DragIconMargin% + 
  5397. shell_Window_GetBottomPaneDepth( 
  5398. shell_Evnts_DragIconStartWindow ) ) )
  5399.         
  5400. [    top_pane_depth% = 
  5401. shell_Window_GetTopPaneDepth( 
  5402. shell_Evnts_DragIconStartWindow )
  5403. a    
  5404.  mouse_y% > ( _m_evnts_DragIconWinYMax% - _m_evnts_DragIconMargin% - top_pane_depth% ) 
  5405.       
  5406. shell_WindowScrollBy( 
  5407. shell_Evnts_DragIconStartWindow, 0 , mouse_y% - ( _m_evnts_DragIconWinYMax% - _m_evnts_DragIconMargin% - 
  5408. shell_Window_GetTopPaneDepth( 
  5409. shell_Evnts_DragIconStartWindow ) ) )
  5410.         
  5411. ,*|Stop PROCshell_Evnts_MonitorDragPtrPos
  5412. &*|Start FNEvnts_GetEvntListOffset3
  5413. Evnts_GetEvntListOffset3( window_name$, icon_handle%, file_type%, evnt_list%, rec_size%, add% )
  5414.  list_size%, ptr%, found%, offset%, evnt_addr%, e_ptr%
  5415.  loop%, converted_file_type%
  5416.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:rec_size% = " +STR$ rec_size% )
  5417.  window_name$ = "IconBar" 
  5418.   icon_handle% = -1
  5419.   window_name$ = "iconbar"
  5420.  ( !evnt_list% = 0 
  5421.  add% = 
  5422.  = -2:
  5423.  no heapblock defined
  5424.  window_name$ = "" 
  5425.  = -1
  5426.  ( !evnt_list% = 0 ) 
  5427.  no heap block defined and add flag is true...
  5428. M  !evnt_list% = 
  5429. shell_HeapBlockFetch( rec_size% + _m_Evnts_HeaderSize% )
  5430. :  evnt_addr%                             = !evnt_list%
  5431. U  evnt_addr%!0                           = rec_size%  :
  5432.  Size of this event block
  5433. T  evnt_addr%!4                           = 1          :
  5434.  Nr of events registered
  5435. X  $( evnt_addr% + _m_Evnts_HeaderSize% )   = ""        :
  5436.  Initialise the window name
  5437.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:Initialising event block for first event.." )
  5438.  loop% = 12 
  5439.  ( rec_size% - 4 ) 
  5440. 8    evnt_addr%!( loop% + _m_Evnts_HeaderSize% ) = -1
  5441.  loop%
  5442. 5  _m_Evnts_LastEvntOffset% = _m_Evnts_HeaderSize%
  5443. $  offset% = _m_Evnts_HeaderSize%
  5444.  offset% <> _m_Evnts_HeaderSize% 
  5445.   evnt_addr% = !evnt_list%
  5446.   list_size% = !evnt_addr%
  5447.  PROCshell_Tracef0("Evnts_GetEvntListOffset:list size is "+STR$ list_size%)
  5448.  PROCshell_Tracef0("Evnts_GetEvntListOffset:window_name$ = "+window_name$ )
  5449. $  ptr%    = _m_Evnts_HeaderSize%
  5450.   found%  = 
  5451.   offset% = -1
  5452.   empty%  = -1
  5453.   e_ptr%  = !evnt_list%
  5454. 1    
  5455.  ( $( e_ptr% + ptr% ) = window_name$ ) 
  5456. :      
  5457.  PROCshell_Tracef0("DEBUG:window name found..")
  5458. 6      
  5459.  check icon handle in event block as well..
  5460. P      
  5461.  PROCshell_Tracef0("DEBUG:icon handle is "+STR$(e_ptr%!( ptr% + 12)))
  5462. F      converted_file_type% = (e_ptr%!( ptr% + 16)) 
  5463.  ( 1 << 31 )
  5464. O      
  5465.  ERROR 55,STR$~(converted_file_type%)+":"+STR$~(e_ptr%!( ptr% + 16))
  5466. T      
  5467.  e_ptr%!( ptr% + 12) = icon_handle% 
  5468.  converted_file_type% = file_type% 
  5469.           offset% = ptr%
  5470.           found%  = 
  5471.       
  5472.         ptr% += rec_size%
  5473.       
  5474.         
  5475. +      
  5476.  no match, so check next event..
  5477.       ptr% += rec_size%
  5478.         
  5479.  ( ( ptr% >= ( list_size% + _m_Evnts_HeaderSize% ) ) 
  5480.  found% )
  5481.  ( offset% = -1 
  5482.  add% ) 
  5483. 3    offset% = list_size% + _m_Evnts_HeaderSize%
  5484. F    !evnt_list% = 
  5485. shell_HeapBlockExtend( !evnt_list%, rec_size% )
  5486.      e_addr%    = !evnt_list%
  5487.     e_addr%!0 += rec_size%
  5488.     e_addr%!4 += 1
  5489.     e_addr%   += offset%
  5490.     $( e_addr% ) = ""
  5491. S    
  5492.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:Initialising event block.." )
  5493. ,    
  5494.  loop% = 12 
  5495.  ( rec_size% - 4 ) 
  5496.       e_addr%!loop% = -1
  5497.  loop%
  5498.  offset% < 0 
  5499. I    
  5500.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:evnt NOT found.." )
  5501. ]    
  5502.  PROCshell_Tracef0( "Evnts_GetEvntListOffset:evnt found at offset " + STR$ offset% )
  5503. (  _m_Evnts_LastEvntOffset% = offset%
  5504. = offset%
  5505. %*|Stop FNEvnts_GetEvntListOffset3
  5506. +*|Start PROCshell_AttachColourPopupMenu
  5507. shell_AttachColourPopupMenu( wh%, menuic%, dispic%, menu_handle%, notify_fn$, preopen_FN$ )
  5508.  wh% > 0 
  5509.  menuic% >= 0 
  5510. shell_IconSetButtonType( wh%, menuic%, _BUTTON_TYPE_CLICK )
  5511. (_m_WimpColMen_Handle% = menu_handle%
  5512. shell_EvntAdd_PopUpMenu( 
  5513. shell_GetWindowIdentifier( wh% ), menuic%, dispic%, menu_handle%, notify_fn$, preopen_FN$, _POPUP_TYPE_WIMPCOLOUR )
  5514. **|Stop PROCshell_AttachColourPopupMenu
  5515.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  5516.  Module Windows
  5517.  -----------------------------------------------------------------------
  5518.  Window Handling Routines (version 1.08 17-Dec-95)
  5519.  This library contains routines that allow creation and manipulation
  5520.  of wimp windows
  5521.  -----------------------------------------------------------------------
  5522.  Structure of Data used in this module
  5523.  Public Methods Supported:
  5524.    FN_shell_Windows_Init                 Initialises module
  5525.    FNshell_WindowHasTitleBar
  5526.    FNshell_WindowIsMoveable
  5527.    FNshell_WindowIsAPane
  5528.    FNshell_WindowIsNotBounded
  5529.    FNshell_WindowTrapsHotKeys
  5530.    FNshell_WindowIsOpen
  5531.    FNshell_WindowIsOnTop
  5532.    FNshell_WindowHasBeenToggled
  5533.    FNshell_WindowHasInputFocus
  5534.    FNshell_WindowHasBackIcon
  5535.    FNshell_WindowHasCloseIcon
  5536.    FNshell_WindowHasToggleIcon
  5537.    FNshell_WindowHasVScrollBar
  5538.    FNshell_WindowHasAdjustSizeIcon
  5539.    FNshell_WindowHasHScrollBar
  5540.    FNshell_WindowGetFlags
  5541.    FNshell_WindowGetTitleFlags
  5542.    FNshell_WindowTitleFlags
  5543.    FNshell_WindowTitleHasBorder
  5544.    FNshell_WindowTitleIsSprite
  5545.    FNshell_WindowTitleIsText
  5546.    FNshell_WindowTitleIsHCentred
  5547.    FNshell_WindowTitleIsVCentred
  5548.    FNshell_WindowTitleIsFilled
  5549.    FNshell_WindowTitleIsAAliased
  5550.    FNshell_WindowTitleIsIndirected
  5551.    FNshell_WindowGetTitle
  5552.    FNshell_WindowTitleBufferLength
  5553.    FNshell_GetDynamicWindowHandle
  5554.    FNshell_DeleteWindow
  5555.    FNshell_WindowCountIcons
  5556.    PROCshell_WindowMoveToIcon
  5557.    PROCshell_WindowMoveTo
  5558.    PROCshell_WindowBringToTop
  5559.    PROCshell_CloseWindow
  5560.    PROCshell_WindowToggleFlags
  5561.    PROCshell_UpdateWindow
  5562.    PROCshell_OpenWindowDynamic2
  5563.    PROCshell_OpenWindowDynamic
  5564.    PROCshell_WindowGetPosition
  5565.    PROCshell_WindowGetSize
  5566.    PROCshell_WindowGetCentre
  5567.    PROCshell_WindowResize
  5568.    PROCshell_WindowRetitle
  5569.    PROCshell_WindowScrollBy
  5570.    PROCshell_WindowScrollTo
  5571.    PROCshell_WindowMoveToPopUpPos
  5572.    PROCshell_WindowSetForegroundColour
  5573.    PROCshell_WindowSetBackgroundColour
  5574.    PROCshell_WindowSendToBack
  5575.    PROCshell_WindowCentreOnScreen
  5576.    PROCshell_WindowCentreOnPointer
  5577.    FNshell_Window_GetTopPaneDepth
  5578.    FNshell_Window_GetBottomPaneDepth
  5579.  Private Methods Supported:
  5580.    FNWindows_ClaimInfoBlock
  5581.    FNshell_Window_GetPaneDepth
  5582.    PROCWindows_ReturnInfoBlock
  5583.    PROCshell_WindowMoveInStack
  5584. p!*|Start FN_shell_Windows_Init
  5585. _shell_Windows_Init
  5586.  Module Constants
  5587.  Module Storage
  5588.  _WINDOWS_GETSTATE_BLK%  36   :
  5589.  For calls to "Wimp_GetWindowState"
  5590.  _WINDOWS_GETWINFO_BLK%  88   :
  5591.  For calls to "Wimp_GetWindowInfo" (use only if RISC OS 3 is detected, otherwise it's too small!)
  5592.  _WINDOWS_GETPINFO_BLK%  20   :
  5593.  For calls to "Wimp_GetPointerInfo"
  5594.  _WINDOWS_SETEXTENT_BLK% 20   :
  5595.  For calls to "Wimp_SetExtent"
  5596.  Module Variables
  5597. {&WINDOWS_LAST_DYNAMIC_WHANDLE% = -1
  5598. m_win_info_blk% = -1
  5599.  *|Stop FN_shell_Windows_Init
  5600. %*|Start FNshell_WindowHasTitleBar
  5601. shell_WindowHasTitleBar(wh%)
  5602. shell_WindowGetFlags(wh%) 
  5603.  1<<26)
  5604. $*|Stop FNshell_WindowHasTitleBar
  5605. $*|Start FNshell_WindowIsMoveable
  5606. shell_WindowIsMoveable(wh%)
  5607. shell_WindowGetFlags(wh%) 
  5608.  1<<1)
  5609. #*|Stop FNshell_WindowIsMoveable
  5610. !*|Start FNshell_WindowIsAPane
  5611. shell_WindowIsAPane(wh%)
  5612. shell_WindowGetFlags(wh%) 
  5613.  1<<5)
  5614.  *|Stop FNshell_WindowIsAPane
  5615. &*|Start FNshell_WindowIsNotBounded
  5616. shell_WindowIsNotBounded(wh%)
  5617. shell_WindowGetFlags(wh%) 
  5618.  1<<6)
  5619. %*|Stop FNshell_WindowIsNotBounded
  5620. &*|Start FNshell_WindowTrapsHotKeys
  5621. shell_WindowTrapsHotKeys(wh%)
  5622. shell_WindowGetFlags(wh%) 
  5623.  1<<12)
  5624. %*|Stop FNshell_WindowTrapsHotKeys
  5625.  *|Start FNshell_WindowIsOpen
  5626. shell_WindowIsOpen( window_handle% )
  5627.  result%
  5628. result% = 
  5629.  window_handle% > 0 
  5630.  result% = ( 
  5631. shell_WindowGetFlags( window_handle% ) 
  5632.  1 << 16 )
  5633.  result% > 0 
  5634.  result% = 
  5635.  window_handle% = -1 
  5636.  window_handle% = -2 
  5637.  result% = 
  5638. = result%
  5639. *|Stop FNshell_WindowIsOpen
  5640. !*|Start FNshell_WindowIsOnTop
  5641. shell_WindowIsOnTop(wh%)
  5642. shell_WindowGetFlags(wh%) 
  5643.  1<<17)
  5644.  *|Stop FNshell_WindowIsOnTop
  5645. (*|Start FNshell_WindowHasBeenToggled
  5646. shell_WindowHasBeenToggled(wh%)
  5647. shell_WindowGetFlags(wh%) 
  5648.  1<<18)
  5649. '*|Stop FNshell_WindowHasBeenToggled
  5650. '*|Start FNshell_WindowHasInputFocus
  5651. shell_WindowHasInputFocus(wh%)
  5652. shell_WindowGetFlags(wh%) 
  5653.  1<<20)
  5654. &*|Stop FNshell_WindowHasInputFocus
  5655. %*|Start FNshell_WindowHasBackIcon
  5656. shell_WindowHasBackIcon(wh%)
  5657. shell_WindowGetFlags(wh%) 
  5658.  1<<24)
  5659. $*|Stop FNshell_WindowHasBackIcon
  5660. &*|Start FNshell_WindowHasCloseIcon
  5661. shell_WindowHasCloseIcon(wh%)
  5662. shell_WindowGetFlags(wh%) 
  5663.  1<<25)
  5664. %*|Stop FNshell_WindowHasCloseIcon
  5665. '*|Start FNshell_WindowHasToggleIcon
  5666. shell_WindowHasToggleIcon(wh%)
  5667. shell_WindowGetFlags(wh%) 
  5668.  1<<27)
  5669. &*|Stop FNshell_WindowHasToggleIcon
  5670. '*|Start FNshell_WindowHasVScrollBar
  5671. shell_WindowHasVScrollBar(wh%)
  5672. shell_WindowGetFlags(wh%) 
  5673.  1<<28)
  5674. &*|Stop FNshell_WindowHasVScrollBar
  5675. +*|Start FNshell_WindowHasAdjustSizeIcon
  5676. shell_WindowHasAdjustSizeIcon(wh%)
  5677. shell_WindowGetFlags(wh%) 
  5678.  1<<29)
  5679. **|Stop FNshell_WindowHasAdjustSizeIcon
  5680. '*|Start FNshell_WindowHasHScrollBar
  5681. shell_WindowHasHScrollBar(wh%)
  5682. shell_WindowGetFlags(wh%) 
  5683.  1<<30)
  5684. &*|Stop FNshell_WindowHasHScrollBar
  5685. "*|Start FNshell_WindowGetFlags
  5686. shell_WindowGetFlags( window_handle% )
  5687.  flags%
  5688. -_WINDOWS_GETSTATE_BLK%!0 = window_handle%
  5689.  "Wimp_GetWindowState",,_WINDOWS_GETSTATE_BLK%
  5690. &flags% = _WINDOWS_GETSTATE_BLK%!32
  5691. = flags%
  5692. !*|Stop FNshell_WindowGetFlags
  5693. '*|Start FNshell_WindowGetTitleFlags
  5694. shell_WindowGetTitleFlags(wh%)
  5695.  flags%,blk%
  5696. )blk% = 
  5697. Windows_ClaimInfoBlock( wh% )
  5698. blk%!0 = wh%
  5699.  "Wimp_GetWindowInfo", , blk%
  5700. flags% = blk%!60
  5701. Windows_ReturnInfoBlock( blk% )
  5702. = flags%
  5703. &*|Stop FNshell_WindowGetTitleFlags
  5704. $*|Start FNshell_WindowTitleFlags
  5705. shell_WindowTitleFlags( wh% )
  5706.  flags%,blk%
  5707. )blk% = 
  5708. Windows_ClaimInfoBlock( wh% )
  5709. blk%!0 = wh%
  5710.  "Wimp_GetWindowInfo", , blk%
  5711. flags% = blk%!60
  5712. Windows_ReturnInfoBlock( blk% )
  5713. =flags%
  5714. ##*|Stop FNshell_WindowTitleFlags
  5715. '(*|Start FNshell_WindowTitleHasBorder
  5716. shell_WindowTitleHasBorder(wh%)
  5717. shell_WindowTitleFlags(wh%) 
  5718.  1<<2)
  5719. +'*|Stop FNshell_WindowTitleHasBorder
  5720. /'*|Start FNshell_WindowTitleIsSprite
  5721. shell_WindowTitleIsSprite(wh%)
  5722. shell_WindowTitleFlags(wh%) 
  5723.  1<<1)
  5724. 3&*|Stop FNshell_WindowTitleIsSprite
  5725. 7%*|Start FNshell_WindowTitleIsText
  5726. shell_WindowTitleIsText(wh%)
  5727. shell_WindowTitleFlags(wh%) 
  5728.  1<<0)
  5729. ;$*|Stop FNshell_WindowTitleIsText
  5730. ?)*|Start FNshell_WindowTitleIsHCentred
  5731. shell_WindowTitleIsHCentred(wh%)
  5732. shell_WindowTitleFlags(wh%) 
  5733.  1<<3)
  5734. C(*|Stop FNshell_WindowTitleIsHCentred
  5735. G)*|Start FNshell_WindowTitleIsVCentred
  5736. shell_WindowTitleIsVCentred(wh%)
  5737. shell_WindowTitleFlags(wh%) 
  5738.  1<<4)
  5739. K(*|Stop FNshell_WindowTitleIsVCentred
  5740. O'*|Start FNshell_WindowTitleIsFilled
  5741. shell_WindowTitleIsFilled(wh%)
  5742. shell_WindowTitleFlags(wh%) 
  5743.  1<<5)
  5744. S&*|Stop FNshell_WindowTitleIsFilled
  5745. W)*|Start FNshell_WindowTitleIsAAliased
  5746. shell_WindowTitleIsAAliased(wh%)
  5747. shell_WindowTitleFlags(wh%) 
  5748.  1<<6)
  5749. [(*|Stop FNshell_WindowTitleIsAAliased
  5750. _+*|Start FNshell_WindowTitleIsIndirected
  5751. shell_WindowTitleIsIndirected(wh%)
  5752. shell_WindowTitleFlags(wh%) 
  5753.  1<<8)
  5754. c**|Stop FNshell_WindowTitleIsIndirected
  5755. g"*|Start FNshell_WindowGetTitle
  5756. shell_WindowGetTitle(wh%)
  5757.  title$,blk%
  5758.  Check if window has a title bar..
  5759. k)blk% = 
  5760. Windows_ClaimInfoBlock( wh% )
  5761. blk%!0 = wh%
  5762.  "Wimp_GetWindowInfo", , blk%
  5763.  ( blk%!32 
  5764.  1<<26 ) 
  5765.  ( ( blk%!60 ) 
  5766.  &100 ) = 0 
  5767. p#    
  5768.  Title is not indirected..
  5769.     title$ = $( blk% + 76 )
  5770.  Title is indirected..
  5771. t$    title$ = $( !( blk% + 76 ) )
  5772. Windows_ReturnInfoBlock( blk% )
  5773. = title$
  5774. z!*|Stop FNshell_WindowGetTitle
  5775. ~+*|Start FNshell_WindowTitleBufferLength
  5776. shell_WindowTitleBufferLength( wh% )
  5777.  result%,blk%
  5778. )blk% = 
  5779. Windows_ClaimInfoBlock( wh% )
  5780. blk%!0=wh%
  5781.  "Wimp_GetWindowInfo",,blk%
  5782.  ( ( blk%!60 ) 
  5783.  &100 ) = 0 
  5784.     result% = 12
  5785.     result% = blk%!84
  5786. Windows_ReturnInfoBlock( blk% )
  5787. = result%
  5788. **|Stop FNshell_WindowTitleBufferLength
  5789. &*|Start PROCshell_WindowMoveToIcon
  5790. shell_WindowMoveToIcon(wh%,iwh%,ih%,x_off%,y_off%)
  5791.  i_blk%,w_blk%
  5792. )i_blk%    = 
  5793. shell_HeapBlockFetch(50)
  5794. )w_blk%    = 
  5795. shell_HeapBlockFetch(36)
  5796. w_blk%!20 = 0
  5797. shell_OSCheckVersion(3) 
  5798.  iwh% = -1 
  5799.  !w_blk% = -2 
  5800.  !w_blk% = iwh%
  5801.  "Wimp_GetWindowState",,w_blk%
  5802. $i_blk%!0 = iwh% : i_blk%!4 = ih%
  5803.  "Wimp_GetIconState",,i_blk%
  5804. shell_WindowMoveTo(wh%,i_blk%!8+x_off%-w_blk%!20,i_blk%!20+y_off%)
  5805.  PROCshell_WindowMoveTo(wh%,i_blk%!8+x_off%,i_blk%!20+y_off%)
  5806. shell_HeapBlockReturn(i_blk%)
  5807. shell_HeapBlockReturn(w_blk%)
  5808. %*|Stop PROCshell_WindowMoveToIcon
  5809. "*|Start PROCshell_WindowMoveTo
  5810. shell_WindowMoveTo(wh%,x%,y%)
  5811.  win_width%,win_height%,offset%,blk%
  5812. )blk% = 
  5813. Windows_ClaimInfoBlock( wh% )
  5814. blk%!0 = wh%
  5815.  "Wimp_GetWindowInfo", , blk%
  5816. "win_width%  = blk%!12 - blk%!4
  5817. "win_height% = blk%!16 - blk%!8
  5818. blk%!4=x%
  5819. blk%!8=y%
  5820. blk%!12=x%+win_width%
  5821. blk%!16=y%+win_height%
  5822.  this looks really silly, but is necessary to tell the
  5823.  window manager the new window coords. The shell_OpenWindow
  5824.  call sets up any panes and actually opens the window in
  5825.  the new position
  5826.  "Wimp_OpenWindow",,blk%
  5827.  "Wimp_CloseWindow",,blk%
  5828. shell_IsWindowStatic( wh% ) 
  5829. shell_OpenWindowStatic(wh%)
  5830. shell_OpenWindowDynamic2(wh%,0,0)
  5831. Windows_ReturnInfoBlock( blk% )
  5832. !*|Stop PROCshell_WindowMoveTo
  5833. &*|Start PROCshell_WindowBringToTop
  5834. shell_WindowBringToTop( window_handle% )
  5835. shell_WindowMoveInStack( window_handle%, -1 )
  5836. %*|Stop PROCshell_WindowBringToTop
  5837. &*|Start PROCshell_WindowSendToBack
  5838. shell_WindowSendToBack( window_handle% )
  5839. shell_WindowMoveInStack( window_handle%, -2 )
  5840. %*|Stop PROCshell_WindowSendToBack
  5841. #*|Start PROCshell_WindowIconise
  5842. shell_WindowIconise( window_handle% )
  5843. shell_WindowMoveInStack( window_handle%, -3 )
  5844. "*|Stop PROCshell_WindowIconise
  5845. !*|Start PROCshell_CloseWindow
  5846. shell_CloseWindow( window_handle% )
  5847.  offset%, win_blk%,res%, pane_nr%, pane_name_offset%, window_name$
  5848.  evnt_list%, pane_name$, window_handle_list%, pane_window_handle%
  5849. ?window_name$ = 
  5850. shell_GetWindowIdentifier( window_handle% )
  5851.  window_handle% > 0 
  5852.   pane_nr% = 0
  5853. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  5854.  ) > -1
  5855. *    offset% = _m_Evnts_LastEvntOffset%
  5856. 4    evnt_list% = !_EVNTS_PANES_ANCHOR% + offset%
  5857. )    pane_name_offset% = evnt_list%!16
  5858. (    data_list% = !_EVNTS_PANES_DATA%
  5859. 8    pane_name$ = $( data_list% + pane_name_offset% )
  5860. F    window_handle_list% = 
  5861. shell_GetWindowHandleList( pane_name$ )
  5862. 2    pane_window_handle% = !window_handle_list%
  5863. 1    _c_Evnts_PaneBlk%!0 = pane_window_handle%
  5864. 2    
  5865.  "Wimp_CloseWindow", , _c_Evnts_PaneBlk%
  5866.     pane_nr% += 1
  5867.  close parent window
  5868. *  _c_Evnts_PaneBlk%!0 = window_handle%
  5869.  "Wimp_CloseWindow", , _c_Evnts_PaneBlk%
  5870.  *|Stop PROCshell_CloseWindow
  5871. **|Start FNshell_GetDynamicWindowHandle
  5872. shell_GetDynamicWindowHandle
  5873. = _U%!20
  5874. )*|Stop FNshell_GetDynamicWindowHandle
  5875.      *|Start FNshell_DeleteWindow
  5876. shell_DeleteWindow( handle% )
  5877.  win_blk%
  5878. *win_blk% = 
  5879. shell_HeapBlockFetch( 20 )
  5880.  handle% > 0 
  5881. oktodeletew( handle% ) 
  5882. 4    
  5883. shell_RemoveHandleFromWindowList( handle% )
  5884.  handle% =_U%!20 
  5885.       _U%!20 = 0
  5886.         
  5887. 7       
  5888. shell_RemoveStaticWindowFromList( handle% )
  5889.         
  5890. .    
  5891.  and now actually delete the window..
  5892.     win_blk%!0 = handle%
  5893. +    
  5894.  "XWimp_DeleteWindow", , win_blk%
  5895.     handle% = 0
  5896. shell_HeapBlockReturn( win_blk% )
  5897. = handle%
  5898. *|Stop FNshell_DeleteWindow
  5899. "$*|Start FNshell_WindowCountIcons
  5900. shell_WindowCountIcons(wh%)
  5901.  w_buff%,RO3%,nr_icons%
  5902.  (_U%!100 
  5903.  1 << 10) 
  5904.  RO3% = 
  5905.  RO3% = 
  5906.  RO3% 
  5907.  PROCshell_Tracef0("WindowCountIcons:RISC OS 3 detected..")
  5908.  wh% = -1 
  5909.  wh% = -2 :
  5910.  iconbar
  5911. **  w_buff%  = 
  5912. shell_HeapBlockFetch(88)
  5913. +R  !_WINDOWS_GETWINFO_BLK% = wh%  :
  5914.  Store window handle in first word of block
  5915.  "Wimp_GetWindowInfo",,_WINDOWS_GETWINFO_BLK% + 1
  5916. -+  nr_icons% = _WINDOWS_GETWINFO_BLK%!88
  5917.  PROCshell_Tracef0("WindowCountIcons:nr_icons% = "+STR$nr_icons%)
  5918.  PROCshell_Tracef0("WindowCountIcons:RISC OS 3 NOT found..")
  5919. 1-  w_buff%   = 
  5920. shell_HeapBlockFetch(6000)
  5921.  wh% > 0 
  5922. 3N    !w_buff%  = wh%          :
  5923.  Store window handle in first word of block
  5924. 4(    
  5925.  "Wimp_GetWindowInfo",,w_buff%
  5926.     nr_icons% = w_buff%!88
  5927.  PROCshell_Tracef0("WindowCountIcons:nr_icons% = "+STR$nr_icons%)
  5928. shell_HeapBlockReturn(w_buff%)
  5929. = nr_icons%
  5930. =#*|Stop FNshell_WindowCountIcons
  5931. A**|Start PROCshell_WindowToggleBackIcon
  5932. shell_WindowToggleBackIcon(
  5933.  wh%)
  5934. shell_WindowToggleFlags(wh%,1<<24)
  5935. F)*|Stop PROCshell_WindowToggleBackIcon
  5936. J+*|Start PROCshell_WindowToggleCloseIcon
  5937. shell_WindowToggleCloseIcon(
  5938.  wh%)
  5939. shell_WindowToggleFlags(wh%,1<<25)
  5940. O**|Stop PROCshell_WindowToggleCloseIcon
  5941. S**|Start PROCshell_WindowToggleTitleBar
  5942. shell_WindowToggleTitleBar(
  5943.  wh%)
  5944. shell_WindowToggleFlags(wh%,1<<26)
  5945. X)*|Stop PROCshell_WindowToggleTitleBar
  5946. \,*|Start PROCshell_WindowToggleToggleIcon
  5947. shell_WindowToggleToggleIcon(
  5948.  wh%)
  5949. shell_WindowToggleFlags(wh%,1<<27)
  5950. a+*|Stop PROCshell_WindowToggleToggleIcon
  5951. e,*|Start PROCshell_WindowToggleHScrollBar
  5952. shell_WindowToggleHScrollBar(
  5953.  wh%)
  5954. shell_WindowToggleFlags(wh%,1<<30)
  5955. j+*|Stop PROCshell_WindowToggleHScrollBar
  5956. n0*|Start PROCshell_WindowToggleAdjustSizeIcon
  5957. shell_WindowToggleAdjustSizeIcon(
  5958.  wh%)
  5959. shell_WindowToggleFlags(wh%,1<<29)
  5960. s/*|Stop PROCshell_WindowToggleAdjustSizeIcon
  5961. w,*|Start PROCshell_WindowToggleVScrollBar
  5962. shell_WindowToggleVScrollBar(
  5963.  wh%)
  5964. shell_WindowToggleFlags(wh%,1<<28)
  5965. |+*|Stop PROCshell_WindowToggleVScrollBar
  5966. '*|Start PROCshell_WindowToggleFlags
  5967. shell_WindowToggleFlags( 
  5968.  wh%, mask% )
  5969.  blk%,flags%,open%,handle%
  5970. *|ifdef TraceInit
  5971.  PROCshell_Tracef0( "WindowToggleFlags:wh% = &" + STR$~wh% )
  5972. *|endif
  5973. $open%=
  5974. shell_WindowIsOpen( wh% )
  5975. )blk% = 
  5976. Windows_ClaimInfoBlock( wh% )
  5977. blk%!0=wh%
  5978.  "Wimp_GetWindowInfo",,blk%
  5979. flags%=blk%!32
  5980. flags%=(flags% 
  5981.  mask%)
  5982. blk%!32=flags%
  5983.  "Wimp_DeleteWindow",,blk%
  5984.  "Wimp_CreateWindow",,blk%+4 
  5985.  handle%
  5986. !blk%=handle%
  5987.  open% 
  5988.  If window was open, open it again..
  5989.  "Wimp_OpenWindow",,blk%
  5990. Windows_ReturnInfoBlock( blk% )
  5991.  handle% <> wh% 
  5992. shell_UpdateWindowHandle(wh%,handle%)
  5993. shell_UpdateWindowHandleList( wh%, handle% )
  5994.   wh%=handle%
  5995. &*|Stop PROCshell_WindowToggleFlags
  5996. "*|Start PROCshell_UpdateWindow
  5997. shell_UpdateWindow(handle%,l%,b%,r%,t%)
  5998.  blk%
  5999. $blk%=
  6000. shell_HeapBlockFetch(blk%)
  6001. <blk%!0=handle%:blk%!4=l%:blk%!8=b%:blk%!12=r%:blk%!16=t%
  6002.  "Wimp_UpdateWindow",,blk% 
  6003.  more%
  6004.  "Wimp_GetWindowState",,blk%
  6005. shell_HeapBlockReturn(blk%)
  6006. !*|Stop PROCshell_UpdateWindow
  6007. (*|Start PROCshell_OpenWindowDynamic2
  6008. shell_OpenWindowDynamic2(wh%,x_off%,y_off%)
  6009.  void%,ptr_blk%
  6010. &ptr_blk%=
  6011. shell_HeapBlockFetch(20)
  6012. _U%!20=wh%
  6013.  "Wimp_GetPointerInfo",,ptr_blk%
  6014.  "Wimp_CreateMenu",,wh%,ptr_blk%!0+x_off%,ptr_blk%!4+y_off%
  6015. shell_HeapBlockReturn(ptr_blk%)
  6016. '*|Stop PROCshell_OpenWindowDynamic2
  6017. '*|Start PROCshell_WindowGetPosition
  6018. shell_WindowGetPosition( window_handle%, 
  6019.  xmin%, 
  6020.  ymin%, 
  6021.  xmax%, 
  6022.  ymax% )
  6023. ,!_WINDOWS_GETSTATE_BLK% = window_handle%
  6024.  "Wimp_GetWindowState",,_WINDOWS_GETSTATE_BLK%
  6025. %xmin% = _WINDOWS_GETSTATE_BLK%!04
  6026. %ymin% = _WINDOWS_GETSTATE_BLK%!08
  6027. %xmax% = _WINDOWS_GETSTATE_BLK%!12
  6028. %ymax% = _WINDOWS_GETSTATE_BLK%!16
  6029. &*|Stop PROCshell_WindowGetPosition
  6030. #*|Start PROCshell_WindowGetSize
  6031. shell_WindowGetSize( window_handle%, 
  6032.  x_size%, 
  6033.  y_size% )
  6034.  xmin%, ymin%, xmax%, ymax%
  6035. shell_WindowGetPosition( window_handle%, xmin%, ymin%, xmax%, ymax% )
  6036. x_size% = xmax% - xmin%
  6037. y_size% = ymax% - ymin%
  6038. "*|Stop PROCshell_WindowGetSize
  6039. %*|Start PROCshell_WindowGetCentre
  6040. shell_WindowGetCentre( window_handle%, 
  6041.  x_coord%, 
  6042.  y_coord% )
  6043.  xmin%, ymin%, xmax%, ymax%
  6044. shell_WindowGetPosition( window_handle%, xmin%, ymin%, xmax%, ymax% )
  6045. 0x_coord% = xmin% + ( ( xmax% - xmin% ) / 2 )
  6046. 0y_coord% = ymin% + ( ( ymax% - ymin% ) / 2 )
  6047. $*|Stop PROCshell_WindowGetCentre
  6048. '*|Start PROCshell_OpenWindowDynamic
  6049. shell_OpenWindowDynamic( template$, preopen_fn$, postopen_fn$ )
  6050.  h%,x_off%,y_off%, last_dynamic_win_handle%
  6051. <last_dynamic_win_handle% = 
  6052. shell_GetDynamicWindowHandle
  6053.  last_dynamic_win_handle% <> 0 
  6054.  Delete last dynamic window opened..
  6055.  "Wimp_CreateMenu",,-1
  6056. =  void% = 
  6057. shell_DeleteWindow( last_dynamic_win_handle% )
  6058. shell_CreateWindow( template$, h% )
  6059.  PROCshell_Tracef0("OpenWindowDynamic:Creating new dynamic window (handle is &"+STR$~h%+")")
  6060. !_WINDOWS_GETSTATE_BLK%!0 = h%
  6061.  "Wimp_GetWindowState", , _WINDOWS_GETSTATE_BLK%
  6062. Jx_off% = ( _WINDOWS_GETSTATE_BLK%!04 - _WINDOWS_GETSTATE_BLK%!12 ) / 2
  6063. Jy_off% = ( _WINDOWS_GETSTATE_BLK%!16 - _WINDOWS_GETSTATE_BLK%!08 ) / 2
  6064. _U%!20 = h%
  6065.  preopen_fn$ <> "" 
  6066.  PROCshell_Tracef0("OpenWindowDynamic:Calling Pre-Open FN '"+preopen_fn$+"'")
  6067. 6  void% = 
  6068. ("FN" + preopen_fn$ + "(" + 
  6069.  h% + ")")
  6070.  PROCshell_Tracef0("OpenWindowDynamic:No Pre-Open FN")
  6071. shell_OpenWindowDynamic2( h%, x_off%, y_off% )
  6072.  postopen_fn$ <> "" 
  6073.  PROCshell_Tracef0("OpenWindowDynamic:Calling Post-Open FN '"+postopen_fn$+"'")
  6074. 7  void% = 
  6075. ("FN" + postopen_fn$ + "(" + 
  6076.  h% + ")")
  6077.  PROCshell_Tracef0("OpenWindowDynamic:No Post-Open FN")
  6078. &*|Stop PROCshell_OpenWindowDynamic
  6079. "*|Start PROCshell_CreateWindow
  6080. shell_CreateWindow( win_identifier$, 
  6081.  window_handle% )
  6082.  wb_ptr%
  6083. -wb_ptr% = 
  6084. shell_GetWB( win_identifier$ )
  6085.  set 'sprite area' pointer to usersprites area
  6086. wb_ptr%!64 = _U%!16
  6087.  "Wimp_CreateWindow",,wb_ptr% 
  6088.  window_handle%
  6089. shell_WindowListAddHandle( win_identifier$, window_handle% )
  6090. !*|Stop PROCshell_CreateWindow
  6091. $*|Start FNWindows_ClaimInfoBlock
  6092. Windows_ClaimInfoBlock( window_handle% )
  6093. shell_HeapBlockFetch( 100 + ( 
  6094. shell_WindowCountIcons( window_handle% ) * 32 ) )
  6095. #*|Stop FNWindows_ClaimInfoBlock
  6096. "'*|Start PROCWindows_ReturnInfoBlock
  6097. Windows_ReturnInfoBlock( block% )
  6098. shell_HeapBlockReturn( block% )
  6099. '&*|Stop PROCWindows_ReturnInfoBlock
  6100. +"*|Start PROCshell_WindowResize
  6101. shell_WindowResize( whandle%, bx%, by%, tx%, ty%, open% )
  6102.  window_getinfo_blk%
  6103. /=window_getinfo_blk% = 
  6104. Windows_ClaimInfoBlock( whandle% )
  6105. 1$_WINDOWS_SETEXTENT_BLK%!00 = bx%
  6106. 2$_WINDOWS_SETEXTENT_BLK%!04 = by%
  6107. 3$_WINDOWS_SETEXTENT_BLK%!08 = tx%
  6108. 4$_WINDOWS_SETEXTENT_BLK%!12 = ty%
  6109.  "Wimp_SetExtent", whandle%, _WINDOWS_SETEXTENT_BLK%
  6110.  open% 
  6111. 7&  window_getinfo_blk%!0 = whandle%
  6112.  "Wimp_GetWindowInfo", , window_getinfo_blk%
  6113.  "Wimp_OpenWindow", , window_getinfo_blk%
  6114. Windows_ReturnInfoBlock( window_getinfo_blk% )
  6115. @!*|Stop PROCshell_WindowResize
  6116. C#*|Start PROCshell_WindowRetitle
  6117. shell_WindowRetitle( 
  6118.  whandle%, title$ )
  6119.  temp%, win_blk%, handle%, t_buffer_len%
  6120. F4win_blk%   = 
  6121. Windows_ClaimInfoBlock( whandle% )
  6122. win_blk%!0 = whandle%
  6123.  "Wimp_GetWindowInfo", , win_blk%
  6124.  ( ( win_blk%!60 ) 
  6125.  &100 ) = 0 
  6126.  window title is not indirected..
  6127.   temp% = win_blk% + 76
  6128.   $temp% = 
  6129.  title$, 11 )
  6130.  "Wimp_DeleteWindow", , win_blk%
  6131.  "Wimp_CreateWindow", , win_blk% + 4 
  6132.  handle%
  6133.  handle% <> whandle% 
  6134. P9    
  6135.  Window handle has changed, update event data...
  6136. Q6    
  6137. shell_UpdateWindowHandle( whandle%, handle% )
  6138.     whandle% = handle%
  6139.  Window title is indirected, find buffer size..
  6140. V!  t_buffer_len% = win_blk%!84
  6141.  Truncate title if it won't fit the buffer...
  6142. X=  $( !( win_blk% + 76 ) ) = 
  6143.  title$, t_buffer_len% - 1 )
  6144.  ( ( win_blk%!32 ) 
  6145.  ( 1 << 16 ) ) <> 0 
  6146. Z9    
  6147.  Window is open, so redraw the title bar area...
  6148. [T    
  6149.  "Wimp_ForceRedraw",-1,win_blk%!4,win_blk%!16,win_blk%!12,win_blk%!16 + 44
  6150. Windows_ReturnInfoBlock( win_blk% )
  6151. a"*|Stop PROCshell_WindowRetitle
  6152. d)*|Start FNshell_WindowTitleIndirected
  6153. shell_WindowTitleIndirected(flag%)
  6154.  ( flag% 
  6155.  ( 1 << 8 ) ) = ( 1<<8 ) 
  6156. i(*|Stop FNshell_WindowTitleIndirected
  6157. m**|Start PROCshell_WindowMoveToPopUpPos
  6158. shell_WindowMoveToPopUpPos( window_handle%, icon_handle%, popup_window_handle% )
  6159.  icon_block%, window_block%, menu_icon_maxx%, menu_icon_maxy%, window_minx%, window_maxy%
  6160.  popupwin_height%
  6161. q/icon_block%   = 
  6162. shell_HeapBlockFetch( 40 )
  6163. r"icon_block%!0 = window_handle%
  6164. s icon_block%!4 = icon_handle%
  6165.  "Wimp_GetIconState",, icon_block%
  6166. u$menu_icon_maxx% = icon_block%!16
  6167. v$menu_icon_maxy% = icon_block%!20
  6168. w1window_block%   = 
  6169. shell_HeapBlockFetch( 40 )
  6170. x$window_block%!0 = window_handle%
  6171.  "Wimp_GetWindowState",, window_block%
  6172. z"window_minx% = window_block%!4
  6173. {#window_maxy% = window_block%!16
  6174. |*window_block%!0 = popup_window_handle%
  6175.  "Wimp_GetWindowState",, window_block%
  6176. ~9popupwin_height% = window_block%!16 - window_block%!8
  6177. shell_WindowMoveTo( popup_window_handle%, window_minx% + menu_icon_maxx%, window_maxy% + menu_icon_maxy% - ( popupwin_height% / 2 ) )
  6178. shell_HeapBlockReturn( icon_block% )
  6179. shell_HeapBlockReturn( window_block% )
  6180. )*|Stop PROCshell_WindowMoveToPopUpPos
  6181. $*|Start PROCshell_WindowScrollTo
  6182. shell_WindowScrollTo( window_handle%, x_offset%, y_offset% )
  6183.  window_blk%
  6184. -window_blk% = 
  6185. shell_HeapBlockFetch( 36 )
  6186. !!window_blk% = window_handle%
  6187.  "Wimp_GetWindowState", , window_blk%
  6188. window_blk%!20 = x_offset%
  6189. window_blk%!24 = y_offset%
  6190. shell_WindowIsOpen( window_handle% ) 
  6191.  "Wimp_OpenWindow", , window_blk%
  6192.  Windows that are closed need the following to make
  6193.  the wimp aware of the new scroll offsets (the window
  6194.  does not actually open and close as wimp_poll is not
  6195.  called)
  6196.  "Wimp_OpenWindow" , , window_blk%
  6197.  "Wimp_CloseWindow", , window_blk%
  6198. shell_HeapBlockReturn( window_blk% )
  6199. #*|Stop PROCshell_WindowScrollTo
  6200. $*|Start PROCshell_WindowScrollBy
  6201. shell_WindowScrollBy( window_handle%, x_offset%, y_offset% )
  6202.  window_blk%
  6203. .window_blk%  = 
  6204. shell_HeapBlockFetch( 36 )
  6205. !!window_blk% = window_handle%
  6206.  "Wimp_GetWindowState", , window_blk%
  6207. window_blk%!20 += x_offset%
  6208. window_blk%!24 += y_offset%
  6209. shell_WindowIsOpen( window_handle% ) 
  6210.  "Wimp_OpenWindow", , window_blk%
  6211.  Windows that are closed need the following to make
  6212.  the wimp aware of the new scroll offsets (the window
  6213.  does not actually open and close as wimp_poll is not
  6214.  called)
  6215.  "Wimp_OpenWindow" , , window_blk%
  6216.  "Wimp_CloseWindow", , window_blk%
  6217. shell_HeapBlockReturn( window_blk% )
  6218. #*|Stop PROCshell_WindowScrollBy
  6219. /*|Start PROCshell_WindowSetBackgroundColour
  6220. shell_WindowSetBackgroundColour( 
  6221.  h%, colour% )
  6222.  w_blk%, handle%, window_was_open%, behind%, nr_icons%
  6223. -nr_icons% = 
  6224. shell_WindowCountIcons( h% )
  6225. 0window_was_open% = 
  6226. shell_WindowIsOpen( h% )
  6227. <w_blk% = 
  6228. shell_HeapBlockFetch( 100 + ( nr_icons% * 32))
  6229. w_blk%!0 = h%
  6230.  "Wimp_GetWindowInfo",,w_blk%
  6231. w_blk%?39 = colour%
  6232. %_shell_open_behind%   = w_blk%!28
  6233. behind%   = w_blk%!28
  6234.  "Wimp_DeleteWindow",,w_blk%
  6235.  "Wimp_CreateWindow",,w_blk% + 4 
  6236.  handle%
  6237. w_blk%!0 = handle%
  6238.  "Wimp_GetWindowInfo",,w_blk%
  6239.  h% <> handle% 
  6240. *|ifdef TraceInit
  6241.  PROCshell_Tracef0("WindowSetBackgroundColour:Updating window handle...")
  6242. *|endif
  6243. shell_UpdateWindowHandle(h%, handle%)
  6244.   h% = handle%
  6245.  window_was_open% 
  6246. shell_OpenWindow( handle%, 0, behind% )
  6247. shell_HeapBlockReturn( w_blk% )
  6248. .*|Stop PROCshell_WindowSetBackgroundColour
  6249. /*|Start PROCshell_WindowSetForegroundColour
  6250. shell_WindowSetForegroundColour(
  6251.  h%, colour%)
  6252.  w_blk%,handle%,reopen%,behind%
  6253. &reopen% = 
  6254. shell_WindowIsOpen(wh%)
  6255. Lw_blk% = 
  6256. shell_HeapBlockFetch(100 + (
  6257. shell_WindowCountIcons(h%) * 32))
  6258. w_blk%!0 = h%
  6259.  "Wimp_GetWindowInfo",,w_blk%
  6260. w_blk%?38 = colour%
  6261. %_shell_open_behind%   = w_blk%!28
  6262. behind%   = w_blk%!28
  6263.  "Wimp_DeleteWindow",,w_blk%
  6264.  "Wimp_CreateWindow",,w_blk% + 4 
  6265.  handle%
  6266.  h% <> handle% 
  6267. *|ifdef TraceInit
  6268.  PROCshell_Tracef0("WindowSetForegroundColour:Updating window handle...")
  6269. *|endif
  6270. shell_UpdateWindowHandle(h%, handle%)
  6271.   h% = handle%
  6272.  reopen% 
  6273. shell_OpenWindow(handle%, 0, behind%)
  6274. shell_HeapBlockReturn(w_blk%)
  6275. .*|Stop PROCshell_WindowSetForegroundColour
  6276. '*|Start PROCshell_WindowMoveInStack
  6277. shell_WindowMoveInStack( window_handle%, action% )
  6278.  message_blk%, task%
  6279.  valid actions are : -1 bring to top
  6280.                      -2 send to back
  6281.  action% < -2 
  6282.  action% > -1 
  6283.  99,"Invalid action"
  6284. 1message_blk%   = 
  6285. shell_HeapBlockFetch( 256 )
  6286. #message_blk%!0 = window_handle%
  6287.  "Wimp_GetWindowState", , message_blk%
  6288. message_blk%!28 = action%
  6289.  "Wimp_SendMessage", 2, message_blk%, window_handle% 
  6290.  ,,task%
  6291.  now call wimp poll as this action must happen
  6292.  without waiting for next wimp poll...
  6293.  "Wimp_Poll", 0, message_blk%
  6294. shell_HeapBlockReturn( message_blk% )
  6295.  task% = _U%!148 
  6296.  window belongs to our task..
  6297.   _Q%!28 = action%
  6298. shell_OpenWindow( window_handle%, 0, action% )
  6299. &*|Stop PROCshell_WindowMoveInStack
  6300. #**|Start FNshell_Window_GetTopPaneDepth
  6301. shell_Window_GetTopPaneDepth( window_handle% )
  6302. shell_Window_GetPaneDepth( window_handle%, 2 )
  6303. ')*|Stop FNshell_Window_GetTopPaneDepth
  6304. +-*|Start FNshell_Window_GetBottomPaneDepth
  6305. shell_Window_GetBottomPaneDepth( window_handle% )
  6306. shell_Window_GetPaneDepth( window_handle%, 4 )
  6307. /,*|Stop FNshell_Window_GetBottomPaneDepth
  6308. 3'*|Start FNshell_Window_GetPaneDepth
  6309. shell_Window_GetPaneDepth( window_handle%, pane_pos% )
  6310.  window_name$, offset%, pane_nr%, pane_evnt_found%, pane_depth%, pane_name$
  6311.  window_handle_list%, pane_name_offset%, evnt_list%, data_list%, pane_window_handle%
  6312.  pane_flags%
  6313. pane_nr% = 0
  6314. pane_depth% = 0
  6315. pane_evnt_found% = 
  6316. =?window_name$ = 
  6317. shell_GetWindowIdentifier( window_handle% )
  6318. >qoffset% = 
  6319. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  6320.  offset% >= 0 
  6321.  pane_evnt_found% = 
  6322.  pane_evnt_found% = 
  6323. Evnts_GetEvntListOffset( window_name$, pane_nr%, _EVNTS_PANES_ANCHOR%, _EVNTS_PANES_REC_SIZE%, 
  6324.  ) > -1
  6325. C*    offset% = _m_Evnts_LastEvntOffset%
  6326. D4    evnt_list% = !_EVNTS_PANES_ANCHOR% + offset%
  6327. E)    pane_flags%       = evnt_list%!20
  6328. F#    
  6329.  pane_flags% = pane_pos% 
  6330. G+      pane_name_offset% = evnt_list%!16
  6331. H+      pane_flags%       = evnt_list%!20
  6332. I*      data_list% = !_EVNTS_PANES_DATA%
  6333. J:      pane_name$ = $( data_list% + pane_name_offset% )
  6334. KH      window_handle_list% = 
  6335. shell_GetWindowHandleList( pane_name$ )
  6336. L4      pane_window_handle% = !window_handle_list%
  6337. M3      _c_Evnts_PaneBlk%!0 = pane_window_handle%
  6338. N7      
  6339.  "Wimp_GetWindowState", , _c_Evnts_PaneBlk%
  6340.       
  6341.  pane_depth% = 0 
  6342. PD        pane_depth% = _c_Evnts_PaneBlk%!16 - _c_Evnts_PaneBlk%!8
  6343.       
  6344. R        
  6345.     pane_nr% += 1
  6346. = pane_depth%
  6347. Y&*|Stop FNshell_Window_GetPaneDepth
  6348. ]+*|Start PROCshell_WindowCentreOnPointer
  6349. shell_WindowCentreOnPointer(h%)
  6350.  w_blk%,p_blk%,x_off%,y_off%
  6351. `(p_blk%   = 
  6352. shell_HeapBlockFetch(20)
  6353.  "Wimp_GetPointerInfo",,p_blk%
  6354. b(win_blk% = 
  6355. shell_HeapBlockFetch(36)
  6356. win_blk%!0 = h%
  6357.  "Wimp_GetWindowState",,win_blk%
  6358. e,x_off% = (win_blk%!04 - win_blk%!12) / 2
  6359. f,y_off% = (win_blk%!16 - win_blk%!08) / 2
  6360. shell_WindowMoveTo(h%,p_blk%!0 + x_off%,p_blk%!4 - y_off%)
  6361. shell_HeapBlockReturn(win_blk%)
  6362. shell_HeapBlockReturn(p_blk%)
  6363. l**|Stop PROCshell_WindowCentreOnPointer
  6364. p**|Start PROCshell_WindowCentreOnScreen
  6365. shell_WindowCentreOnScreen(h%)
  6366.  w_blk%,scrn_xmax%,scrn_ymax%,width%,height%,XEigFactor%,YEigFactor%
  6367.  "XOS_ReadModeVariable",-1,04 
  6368.  ,,XEigFactor%
  6369.  "XOS_ReadModeVariable",-1,05 
  6370.  ,,YEigFactor%
  6371.  "XOS_ReadModeVariable",-1,11 
  6372.  ,,scrn_xmax%
  6373.  "XOS_ReadModeVariable",-1,12 
  6374.  ,,scrn_ymax%
  6375. wNscrn_xmax% = scrn_xmax% << XEigFactor%:
  6376.  Convert pixels to screen coords..
  6377. xNscrn_ymax% = scrn_ymax% << YEigFactor%:
  6378.  Convert pixels to screen coords..
  6379. y*win_blk%   = 
  6380. shell_HeapBlockFetch(36)
  6381. win_blk%!0 = h%
  6382.  "Wimp_GetWindowState",,win_blk%
  6383. |)width%  = (win_blk%!12 - win_blk%!04)
  6384. })height% = (win_blk%!16 - win_blk%!08)
  6385. shell_WindowMoveTo(h%,(scrn_xmax% / 2) - (width% / 2),(scrn_ymax% - height%) / 2)
  6386. shell_HeapBlockReturn(win_blk%)
  6387. )*|Stop PROCshell_WindowCentreOnScreen
  6388.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  6389.  Module Icons
  6390.  -----------------------------------------------------------------------
  6391.  Icon Handling Routines (version 1.13 14-Mar-96)
  6392.  This library contains all the icon handling routines
  6393.  -----------------------------------------------------------------------
  6394.  Public Methods Supported:
  6395.    FNshell_Icons_Init         Initialises module
  6396.    PROCshell_IconSetFGColour  Set Foreground colour of an icon (wimp colour)
  6397.    PROCshell_IconSetBGColour  Set Background colour of an icon (wimp colour)
  6398.    PROCshell_IconUnselectable Make an icon unselectable
  6399.    PROCshell_IconSetState     Set Icon state
  6400.    PROCshell_IconSet
  6401.    PROCshell_IconSetSelected
  6402.    PROCshell_IconSelect
  6403.    PROCshell_IconDeselect
  6404.    FNshell_IsIconSelected
  6405.    PROCshell_IconPutValidation
  6406.    FNshell_IconGetValidation
  6407.    PROCshell_IconRedraw
  6408.    FNshell_IconGetCommand
  6409.    FNshell_IconGetFlags
  6410.    FNshell_IconIsDraggable
  6411.    FNshell_IconIsSprite
  6412.    FNshell_IconHasCaret
  6413.    FNshell_IconCreate
  6414.    PROCshell_IconDelete
  6415.    PROCshell_IconDelete2
  6416.    PROCshell_DoIconDelete
  6417.    FNshell_IconRadioSelection
  6418.    PROCshell_IconPutData
  6419.    PROCshell_IconPutDataNow
  6420.    FNshell_IconNewSprite
  6421.    FNshell_IconGetData
  6422.    FNshell_IconMove2
  6423.    FNshell_IconResize
  6424.    FNshell_IconMove
  6425.    FNshell_CreateIcon2
  6426.    PROCshell_IconSlab
  6427.    PROCshell_IconSetButtonType
  6428.    PROCshell_IconSetESG
  6429.    PROCshell_IconSetText
  6430.    PROCshell_IconSetSprite
  6431.    PROCshell_IconSetBorder
  6432.    PROCshell_IconSetHCentred
  6433.    PROCshell_IconSetVCentred
  6434.    PROCshell_IconSetUsesOutlineFont
  6435.    PROCshell_IconSetFilled
  6436.    PROCshell_IconSetRightJust
  6437.    PROCshell_IconSetLeftJust
  6438.    PROCshell_IconSetUnselectable
  6439.    PROCshell_IconSelectAll
  6440.    PROCshell_IconDeselectAll
  6441.    PROCshell_IconSetSpriteArea
  6442.    PROCshell_IconGetSelectedIcons
  6443.    PROCshell_IconGetBoundingBox
  6444.    PROCshell_IconDragBox
  6445.    PROCshell_IconEnsureVisible
  6446.    PROCshell_Icon_SetFont
  6447.    FNshell_IconIndirSize
  6448.    FNshell_IconGetBGColour
  6449.    FNshell_IconGetFGColour
  6450.    FNshell_IconIsWritable
  6451.    FNshell_IconGetButtonType
  6452.    PROCshell_IconSetAllWritables
  6453.    PROCshell_IconClearAllWritables
  6454.    PROCshell_IconDisallowWritableDrags
  6455.    PROCshell_IconAllowWritableDrags
  6456.    FNshell_IconWritableDragStatus
  6457.  Private Methods Supported:
  6458.    PROCIcons_GetState
  6459. *|Start FN_shell_Icons_Init
  6460. _shell_Icons_Init
  6461.  Define Constants
  6462. _c_Icons_IconDragType% = 5
  6463. _c_Icons_DragBBoxXMin% = 0
  6464. _c_Icons_DragBBoxYMin% = 0
  6465. &_c_Icons_DragBBoxXMax% = &7FFFFFFF
  6466. &_c_Icons_DragBBoxYMax% = &7FFFFFFF
  6467. &_c_Icons_DragFlags%    = %10000101
  6468. 1_c_Icons_IconOverFlowMess$    = "SHELLMSG12" 
  6469. 0_c_Icons_NotASpriteIconMess$  = "SHELLMSG19"
  6470. 0_c_Icons_WimpColourRangeMess$ = "SHELLMSG24"
  6471. _c_Icons_MinWimpColour% = 0
  6472.  _c_Icons_MaxWimpColour% = 15
  6473.  Define Workspace
  6474.  _c_Icon_SetIconStateBlk%     16
  6475.  _c_Icon_GetIconStateBlk%     40
  6476.  _c_Icon_GetCaretPositionBlk% 24
  6477.  Define variables
  6478. %_m_Icons_AllowWritableDrags%  = 
  6479. *|Stop FN_shell_Icons_Init
  6480. %*|Start PROCshell_IconSetFGColour
  6481. shell_IconSetFGColour( window_handle%, icon_handle%, colour% )
  6482.  colour% < _c_Icons_MinWimpColour% 
  6483.  colour% > _c_Icons_MaxWimpColour% 
  6484. shell_MessageOneArg( _c_Icons_WimpColourRangeMess$, "PROCshell_IconSetFGColour" )
  6485. shell_IconSetState( window_handle%, icon_handle%, colour% << 24, &0F000000 )
  6486. $*|Stop PROCshell_IconSetFGColour
  6487. %*|Start PROCshell_IconSetBGColour
  6488. shell_IconSetBGColour( window_handle%, icon_handle%, colour% )
  6489.  colour% < _c_Icons_MinWimpColour% 
  6490.  colour% > _c_Icons_MaxWimpColour% 
  6491. shell_MessageOneArg( _c_Icons_WimpColourRangeMess$, "PROCshell_IconSetBGColour" )
  6492. shell_IconSetState( window_handle%, icon_handle%, colour% << 28, &F0000000 )
  6493. $*|Stop PROCshell_IconSetBGColour
  6494. &*|Start PROCshell_IconUnselectable
  6495. shell_IconUnselectable( window_handle%, icon_handle% )
  6496. shell_IconSetUnselectable( window_handle%, icon_handle%, 1 )
  6497. %*|Stop PROCshell_IconUnselectable
  6498. "*|Start PROCshell_IconSetState
  6499. shell_IconSetState( window_handle%, icon_handle%, EorWord%, ClearWord% )
  6500.  IF window_handle% > 0 AND icon_handle% >= 0 THEN
  6501. 2  _c_Icon_SetIconStateBlk%!00 = window_handle%
  6502. 0  _c_Icon_SetIconStateBlk%!04 = icon_handle%
  6503. ,  _c_Icon_SetIconStateBlk%!08 = EorWord%
  6504.  .  _c_Icon_SetIconStateBlk%!12 = ClearWord%
  6505.  "XWimp_SetIconState", , _c_Icon_SetIconStateBlk%
  6506.  ENDIF
  6507. &!*|Stop PROCshell_IconSetState
  6508. *|Start PROCshell_IconSet
  6509. shell_IconSet( window_handle%, icon_handle%, state% )
  6510.  state% = 0 
  6511. shell_IconDeselect( window_handle%, icon_handle% )
  6512. shell_IconSelect( window_handle%, icon_handle% )
  6513. *|Stop PROCshell_IconSet
  6514. 6%*|Start PROCshell_IconSetSelected
  6515. shell_IconSetSelected(wh%,ih%,state%)
  6516.  state%=0 
  6517. shell_IconDeselect(wh%,ih%)
  6518. shell_IconSelect(wh%,ih%)
  6519. ?$*|Stop PROCshell_IconSetSelected
  6520. *|Start PROCIcons_GetState
  6521. Icons_GetState( window_handle%,icon_handle%)
  6522. E/_c_Icon_GetIconStateBlk%!0 = window_handle%
  6523. F-_c_Icon_GetIconStateBlk%!4 = icon_handle%
  6524.  "Wimp_GetIconState", , _c_Icon_GetIconStateBlk%
  6525. *|Stop PROCIcons_GetState
  6526. N *|Start PROCshell_IconSelect
  6527. shell_IconSelect(WindowHandle%,IconHandle%)
  6528. shell_IconSetState(WindowHandle%,IconHandle%,&200000,&200000)
  6529. *|Stop PROCshell_IconSelect
  6530. U"*|Start PROCshell_IconDeselect
  6531. shell_IconDeselect(WindowHandle%,IconHandle%)
  6532. shell_IconSetState(WindowHandle%,IconHandle%,0,&200000)
  6533. Z!*|Stop PROCshell_IconDeselect
  6534. ^"*|Start FNshell_IsIconSelected
  6535. shell_IsIconSelected( WindowHandle%, IconHandle% )
  6536.  temp%
  6537. Icons_GetState( WindowHandle%, IconHandle% )
  6538. b(flags% = _c_Icon_GetIconStateBlk%!24
  6539. c!temp%  = ( flags% 
  6540.  &200000 )
  6541.  temp% = 0 
  6542.   return_code% = 
  6543.   return_code% = 
  6544. = return_code%
  6545. k!*|Stop FNshell_IsIconSelected
  6546. o'*|Start PROCshell_IconPutValidation
  6547. shell_IconPutValidation( window_handle%, icon_handle%, valid$ )
  6548.  flags%
  6549. r0_c_Icon_GetIconStateBlk%!00 = window_handle%
  6550. s._c_Icon_GetIconStateBlk%!04 = icon_handle%
  6551.  "Wimp_GetIconState", , _c_Icon_GetIconStateBlk%
  6552. u(flags% = _c_Icon_GetIconStateBlk%!24
  6553.  flags% 
  6554.  &100 
  6555. w/  $( _c_Icon_GetIconStateBlk%!32 ) = valid$
  6556. {&*|Stop PROCshell_IconPutValidation
  6557. %*|Start FNshell_IconGetValidation
  6558. shell_IconGetValidation( window_handle%, icon_handle% )
  6559.  validation$,flags%
  6560.  icon_handle% = -1 
  6561.  = ""
  6562. validation$ = ""
  6563. 0_c_Icon_GetIconStateBlk%!00 = window_handle%
  6564. ._c_Icon_GetIconStateBlk%!04 = icon_handle%
  6565.  "Wimp_GetIconState", , _c_Icon_GetIconStateBlk%
  6566.  check flags first to see if it has a
  6567.  validation string!
  6568. (flags% = _c_Icon_GetIconStateBlk%!24
  6569.  flags% 
  6570.  &100 
  6571.  _c_Icon_GetIconStateBlk%!32 > 0 
  6572.  validation$ = $( _c_Icon_GetIconStateBlk%!32 )
  6573. = validation$
  6574. $*|Stop FNshell_IconGetValidation
  6575.  *|Start PROCshell_IconRedraw
  6576. shell_IconRedraw( window_handle%, icon_handle% )
  6577. shell_IconSetState( window_handle%, icon_handle%, 0, 0 )
  6578. *|Stop PROCshell_IconRedraw
  6579. "*|Start FNshell_IconGetCommand
  6580. shell_IconGetCommand(v%,c$)
  6581.  I%,result$
  6582.  v%<=0 
  6583.   result$=""
  6584. I  I%=
  6585. shell_StringUpperCase($v%),";"+
  6586. shell_StringUpperCase(c$))
  6587.  I%=0 
  6588.     result$=""
  6589. /    result$=
  6590. $(v%+I%),
  6591. $(v%+I%)+";",";")-1)
  6592. =result$
  6593. !*|Stop FNshell_IconGetCommand
  6594.  *|Start FNshell_IconGetFlags
  6595. shell_IconGetFlags( window_handle%, icon_handle% )
  6596.  flags%
  6597. /_c_Icon_GetIconStateBlk%!0 = window_handle%
  6598. -_c_Icon_GetIconStateBlk%!4 = icon_handle%
  6599.  "Wimp_GetIconState", , _c_Icon_GetIconStateBlk%
  6600. (flags% = _c_Icon_GetIconStateBlk%!24
  6601. = flags%
  6602. *|Stop FNshell_IconGetFlags
  6603. #*|Start FNshell_IconIsDraggable
  6604. shell_IconIsDraggable( window_handle%, icon_handle% )
  6605.  flags%, result%, mask%, return_code%
  6606. $mask% = ( 1 << 13 ) + ( 1<< 14 )
  6607. @flags% = 
  6608. shell_IconGetFlags( window_handle%, icon_handle% )
  6609.  result% = ( flags% 
  6610.  mask% )
  6611.  result% = mask% 
  6612.   return_code% = 
  6613.   return_code%= 
  6614. = return_code%
  6615. "*|Stop FNshell_IconIsDraggable
  6616. "*|Start FNshell_IconIsWritable
  6617. shell_IconIsWritable( window_handle%, icon_handle% )
  6618.  flags%, result%, mask%
  6619. mask% = 1 << 15
  6620. @flags% = 
  6621. shell_IconGetFlags( window_handle%, icon_handle% )
  6622.  result% = ( flags% 
  6623.  mask% )
  6624.  result% = mask% 
  6625.   result% = 
  6626.   result% = 
  6627. = result%
  6628. !*|Stop FNshell_IconIsWritable
  6629.  *|Start FNshell_IconIsSprite
  6630. shell_IconIsSprite(wh%,ih%)
  6631.  flags%,temp%, return_code%
  6632. 'flags%=
  6633. shell_IconGetFlags(wh%,ih%)
  6634. temp%=(flags% 
  6635.  1<<1)
  6636.  temp%=(1<<1) 
  6637.   return_code% = 
  6638.   return_code% = 
  6639. = return_code%
  6640. *|Stop FNshell_IconIsSprite
  6641.  *|Start FNshell_IconHasCaret
  6642. shell_IconHasCaret( window_handle%, icon_handle% )
  6643.  ihandle%, whandle%, result%
  6644.  "Wimp_GetCaretPosition", , _c_Icon_GetCaretPositionBlk%
  6645. /whandle%  = _c_Icon_GetCaretPositionBlk%!00
  6646. /ihandle%  = _c_Icon_GetCaretPositionBlk%!04
  6647.  ( ihandle% = icon_handle% 
  6648.  whandle% = window_handle% ) 
  6649.   result% = 
  6650.   result% = 
  6651. = result%
  6652. *|Stop FNshell_IconHasCaret
  6653. *|Start FNshell_IconCreate
  6654. shell_IconCreate(wh%,minx%,miny%,w%,h%,fg%,bg%,flg%,data$,addr%,len%,validation$)
  6655.  i%,handle%,valid%,icon_blk%
  6656. 'icon_blk%=
  6657. shell_HeapBlockFetch(40)
  6658. icon_blk%!0=wh%
  6659. 'icon_blk%!4=minx%:icon_blk%!8=miny%
  6660. /icon_blk%!12=minx%+w%:icon_blk%!16=miny%+h%
  6661. )icon_blk%!20=flg% 
  6662.  bg%<<28 
  6663.  fg%<<24
  6664.  icon_blk%!20 
  6665.  &100 
  6666.   i%=
  6667. data$,",")
  6668.   icon_blk%!24=addr%
  6669.  validation$<>"" 
  6670. 5    valid%=
  6671. shell_HeapBlockFetch(
  6672.  validation$+1)
  6673.     $valid%=validation$
  6674.     icon_blk%!28=valid%
  6675.     icon_blk%!28=-1
  6676.   icon_blk%!32=len%
  6677.    $(icon_blk%+24)=
  6678. data$,11)
  6679.  "Wimp_CreateIcon",,icon_blk% 
  6680.  handle%
  6681. shell_HeapBlockReturn(icon_blk%)
  6682. =handle%
  6683. *|Stop FNshell_IconCreate
  6684.  *|Start PROCshell_IconDelete
  6685. shell_IconDelete(wh%,ih%)
  6686. shell_DoIconDelete(wh%,ih%,
  6687. *|Stop PROCshell_IconDelete
  6688. '!*|Start PROCshell_IconDelete2
  6689. shell_IconDelete2(wh%,ih%)
  6690. shell_DoIconDelete(wh%,ih%,
  6691. , *|Stop PROCshell_IconDelete2
  6692. 0"*|Start PROCshell_DoIconDelete
  6693. shell_DoIconDelete(wh%,ih%,redraw%)
  6694.  x0%,y0%,x1%,y1%
  6695. 3$_c_Icon_GetIconStateBlk%!0 = wh%
  6696. 4$_c_Icon_GetIconStateBlk%!4 = ih%
  6697.  "Wimp_GetIconState",,_c_Icon_GetIconStateBlk%
  6698.  "Interface_BoundingBox",,_c_Icon_GetIconStateBlk%+8
  6699. 7"x0%=_c_Icon_GetIconStateBlk%!8
  6700. 8#y0%=_c_Icon_GetIconStateBlk%!12
  6701. 9#x1%=_c_Icon_GetIconStateBlk%!16
  6702. :#y1%=_c_Icon_GetIconStateBlk%!20
  6703.  "Wimp_GetIconState",,_c_Icon_GetIconStateBlk%
  6704. shell_HeapBlockExists(_c_Icon_GetIconStateBlk%!28) 
  6705. shell_HeapBlockReturn(_c_Icon_GetIconStateBlk%!28)
  6706. shell_HeapBlockExists(_c_Icon_GetIconStateBlk%!32) 
  6707. shell_HeapBlockReturn(_c_Icon_GetIconStateBlk%!32)
  6708.  "Wimp_DeleteIcon",,_c_Icon_GetIconStateBlk%
  6709.  redraw% 
  6710.  "Wimp_ForceRedraw",wh%,x0%,y0%,x1%,y1%
  6711. D!*|Stop PROCshell_DoIconDelete
  6712. H&*|Start FNshell_IconRadioSelection
  6713. shell_IconRadioSelection( window_handle%, esg% )
  6714.  icon_mask%, selection_blk%, selected_icon%, bit_mask%
  6715. L/selection_blk% = 
  6716. shell_HeapBlockFetch( 8 )
  6717. M-icon_mask% = ( esg% << 16 ) + ( 1 << 21 )
  6718. N-bit_mask%  = ( 31   << 16 ) + ( 1 << 21 )
  6719.  "Wimp_WhichIcon", window_handle%, selection_blk%, bit_mask%, icon_mask%
  6720. P$selected_icon% = !selection_blk%
  6721. shell_HeapBlockReturn( selection_blk% )
  6722. = selected_icon%
  6723. U%*|Stop FNshell_IconRadioSelection
  6724. |Start 
  6725. shell_IconPutData
  6726. shell_IconPutData( whandle%, ihandle%, data$, redraw )
  6727.  old_str$
  6728.  _U%!100 
  6729.  1 << 6 
  6730.  "WimpExt_SetIconString", , , whandle%, ihandle%, data$ + 
  6731. ( 13 )
  6732. _9  old_str$ = 
  6733. shell_IconGetData( whandle%, ihandle% )
  6734.  data$ <> old_str$ 
  6735. a-    _c_Icon_GetIconStateBlk%!0 = whandle%
  6736. b-    _c_Icon_GetIconStateBlk%!4 = ihandle%
  6737. c:    
  6738.  "Wimp_GetIconState", , _c_Icon_GetIconStateBlk%
  6739. d=    
  6740.  ( _c_Icon_GetIconStateBlk%!24 
  6741.  ( 1 << 8 ) ) <> 0 
  6742. e3      
  6743.  data$ > _c_Icon_GetIconStateBlk%!36 
  6744. fD        
  6745.  99, 
  6746. shell_MessageNoArgs( _c_Icons_IconOverFlowMess$ )
  6747.       
  6748. h2      $( _c_Icon_GetIconStateBlk%!28 ) = data$
  6749. i        
  6750. j<      $( _c_Icon_GetIconStateBlk% + 28 ) = 
  6751.  data$, 11 )
  6752. k        
  6753. l5    
  6754. shell_IconHasCaret( whandle%, ihandle% ) 
  6755. mN      
  6756. shell_CaretSetPosition(whandle%, ihandle%, -1, -1, -1, 
  6757. ( data$ ) )
  6758. n        
  6759.  redraw <> 0 
  6760. p)      _c_Icon_GetIconStateBlk%!08 = 0
  6761. q)      _c_Icon_GetIconStateBlk%!12 = 0
  6762. r<      
  6763.  "Wimp_SetIconState", , _c_Icon_GetIconStateBlk%
  6764. s        
  6765. x *|Stop PROCshell_IconPutData
  6766. |$*|Start PROCshell_IconPutDataNow
  6767. shell_IconPutDataNow(whandle%,ihandle%,data$)
  6768. ~)_c_Icon_GetIconStateBlk%!0 = whandle%
  6769. )_c_Icon_GetIconStateBlk%!4 = ihandle%
  6770.  "Wimp_GetIconState",,_c_Icon_GetIconStateBlk%
  6771.  (_c_Icon_GetIconStateBlk%!24 
  6772.  (1<<8))<>0 
  6773. ( data$ ) > _c_Icon_GetIconStateBlk%!36 
  6774. shell_MessageNoArgs( _c_Icons_IconOverFlowMess$ )
  6775. .  $( _c_Icon_GetIconStateBlk%!28 ) = data$
  6776. 8  $( _c_Icon_GetIconStateBlk% + 28 ) = 
  6777.  data$, 11 )
  6778. #_c_Icon_GetIconStateBlk%!8  = 0
  6779. #_c_Icon_GetIconStateBlk%!12 = 0
  6780.  "Wimp_SetIconState",,_c_Icon_GetIconStateBlk%
  6781.  Call wimp poll immediately in case the user program doesn't..
  6782. shell_EnsurePoll
  6783. #*|Stop PROCshell_IconPutDataNow
  6784. !*|Start FNshell_IconNewSprite
  6785. shell_IconNewSprite( window_handle%, icon_handle%, sprite_name$ )
  6786.  new_ihandle%, icon_is_sprite%, icon_is_text%, icon_is_indirected%
  6787.  We use two strategies here depending on whether the icon is an
  6788.  indirected/text/sprite  icon (an iconbar icon for example) or something
  6789.  else. The reason is that if we are dealing with an iconbar icon
  6790.  we don't want to delete it and then recreate it as this causes
  6791.  a redraw of the whole iconbar..
  6792.  Read the icon info..
  6793. /_c_Icon_GetIconStateBlk%!0 = window_handle%
  6794. -_c_Icon_GetIconStateBlk%!4 = icon_handle%
  6795.  "Wimp_GetIconState" , , _c_Icon_GetIconStateBlk%
  6796.  ( _c_Icon_GetIconStateBlk%!24 
  6797.  ( 1 << 1 ) ) 
  6798.   icon_is_sprite% = 
  6799.   icon_is_sprite% = 
  6800.  ( _c_Icon_GetIconStateBlk%!24 
  6801.  1 ) 
  6802.   icon_is_text% = 
  6803.   icon_is_text% = 
  6804.  ( _c_Icon_GetIconStateBlk%!24 
  6805.  ( 1 << 8 ) ) 
  6806.   icon_is_indirected% = 
  6807.   icon_is_indirected% = 
  6808.  ( icon_is_sprite% 
  6809.  icon_is_text% 
  6810.  icon_is_indirected% ) 
  6811.  Icon is indirected/text/sprite icon, so check flags to see if it
  6812.  has text under the icon and adjust sprite name appropriately..
  6813.  _c_Icon_GetIconStateBlk%!24 
  6814. =    $( _c_Icon_GetIconStateBlk%!32 ) = "S" + sprite_name$
  6815. 7    $( _c_Icon_GetIconStateBlk%!28 ) = sprite_name$
  6816. 7    _c_Icon_GetIconStateBlk%!36 = 
  6817. ( sprite_name$ )
  6818. !  new_ihandle% = icon_handle%
  6819.  Recreate icon with new sprite name..
  6820.  "Wimp_DeleteIcon" , , _c_Icon_GetIconStateBlk%
  6821. >  _c_Icon_GetIconStateBlk%!4  = _c_Icon_GetIconStateBlk%!8
  6822. ?  _c_Icon_GetIconStateBlk%!8  = _c_Icon_GetIconStateBlk%!12
  6823. ?  _c_Icon_GetIconStateBlk%!12 = _c_Icon_GetIconStateBlk%!16
  6824. ?  _c_Icon_GetIconStateBlk%!16 = _c_Icon_GetIconStateBlk%!20
  6825. ?  _c_Icon_GetIconStateBlk%!20 = _c_Icon_GetIconStateBlk%!24
  6826. 7  $( _c_Icon_GetIconStateBlk% + 24 ) = sprite_name$
  6827.  "Wimp_CreateIcon" , , _c_Icon_GetIconStateBlk% 
  6828.  new_ihandle%
  6829. shell_IconRedraw( window_handle%, new_ihandle% )
  6830. = new_ihandle%
  6831.  *|Stop FNshell_IconNewSprite
  6832. *|Start FNshell_IconGetData
  6833. shell_IconGetData( window_handle%, icon_handle% )
  6834.  result$
  6835.  icon_handle% < 0 
  6836.  window_handle% < -2 
  6837.  = ""
  6838.  _U%!100 
  6839.  1 << 6 
  6840.  "WimpExt_GetIcon", , , window_handle%, icon_handle% 
  6841.  , , , result$
  6842. 1  _c_Icon_GetIconStateBlk%!0 = window_handle%
  6843. /  _c_Icon_GetIconStateBlk%!4 = icon_handle%
  6844.  "Wimp_GetIconState", , _c_Icon_GetIconStateBlk%
  6845.  ( _c_Icon_GetIconStateBlk%!24 
  6846.  ( 1 <<8 ) ) <> 0 
  6847. 2    result$ = $( _c_Icon_GetIconStateBlk%!28 )
  6848. 4    result$ = $( _c_Icon_GetIconStateBlk% + 28 )
  6849. = result$
  6850. *|Stop FNshell_IconGetData
  6851. *|Start FNshell_IconMove2
  6852. shell_IconMove2( window_handle%, icon_handle%, d_x%, d_y% )
  6853. /_c_Icon_GetIconStateBlk%!0 = window_handle%
  6854. -_c_Icon_GetIconStateBlk%!4 = icon_handle%
  6855.  "Wimp_GetIconState", , _c_Icon_GetIconStateBlk%
  6856. '_c_Icon_GetIconStateBlk%!08 += d_x%
  6857. '_c_Icon_GetIconStateBlk%!16 += d_x%
  6858. '_c_Icon_GetIconStateBlk%!12 += d_y%
  6859. '_c_Icon_GetIconStateBlk%!20 += d_y%
  6860. icon_handle% = 
  6861. shell_IconMove( window_handle%, icon_handle%, _c_Icon_GetIconStateBlk%!8, _c_Icon_GetIconStateBlk%!12,_c_Icon_GetIconStateBlk%!16, _c_Icon_GetIconStateBlk%!20 )
  6862. = icon_handle%
  6863. *|Stop FNshell_IconMove2
  6864. *|Start FNshell_IconResize
  6865. shell_IconResize(wh%,ih%,x0%,y0%,x1%,y1%)
  6866. shell_IconMove(wh%,ih%,x0%,y0%,x1%,y1%)
  6867. *|Stop FNshell_IconResize
  6868. *|Start FNshell_IconMove
  6869. shell_IconMove(wh%,ih%,x0%,y0%,x1%,y1%)
  6870.  i_blk%,i_flags%,i_data%,bdr%,blk%
  6871.  oldflags%,odt0%,odt1%,odt2%
  6872. $i_blk%=
  6873. shell_HeapBlockFetch(40)
  6874. "blk%=
  6875. shell_HeapBlockFetch(40)
  6876. ;!i_blk%=wh%:i_blk%!4=ih%:
  6877.  "Wimp_GetIconState",,i_blk%
  6878. !blk%=wh%:blk%!4=ih%
  6879.  "Wimp_GetIconState",,blk%
  6880.  "Interface_BoundingBox",,blk%+8
  6881. &iflags%=i_blk%!24:idata%=i_blk%+28
  6882. Boldflags%=iflags%:odt0%=idata%!0:odt1%=idata%!4:odt2%=idata%!8
  6883. bdr%=i_blk%!8-blk%!8
  6884.  "Wimp_DeleteIcon",,i_blk%
  6885.  "Wimp_ForceRedraw",!i_blk%,i_blk%!8-bdr%,i_blk%!12-bdr%,i_blk%!16+bdr%,i_blk%!20+bdr%
  6886. Pih%=
  6887. shell_CreateIcon2(wh%,x0%,y0%,x1%,y1%,oldflags%,odt0%,odt1%,odt2%,bdr%)
  6888. shell_HeapBlockReturn(i_blk%)
  6889. shell_HeapBlockReturn(blk%)
  6890. *|Stop FNshell_IconMove
  6891. *|Start FNshell_CreateIcon2
  6892. shell_CreateIcon2(handle%,x0%,y0%,x1%,y1%,flags%,dt0%,dt1%,dt2%,bdr%)
  6893.  ic%,q%,text$,sprite$,minx%,miny%
  6894. shell_HeapBlockFetch(60)
  6895. !q%=handle%
  6896. 1q%!20=flags%:q%!24=dt0%:q%!28=dt1%:q%!32=dt2%
  6897. text$="":sprite$=""
  6898.  flags% 
  6899.  flags% 
  6900.  &100 text$=$(q%!24) 
  6901.  text$=$(q%+24)
  6902.  flags% 
  6903.  flags% 
  6904.  &100 
  6905. %.  sprite$=
  6906. shell_IconGetCommand(q%!28,"S")
  6907.   sprite$=$(q%+24)
  6908. shell_GetMinXY(flags%,text$,sprite$)
  6909.  x1%-x0%<minx% 
  6910.  x1%=x0%+minx%
  6911.  y1%-y0%<miny% 
  6912.  y1%=y0%+miny%
  6913. -)q%!4=x0%:q%!8=y0%:q%!12=x1%:q%!16=y1%
  6914.  "Wimp_CreateIcon",,q% 
  6915.  "Wimp_ForceRedraw",!q%,q%!4-bdr%,q%!8-bdr%,q%!12+bdr%,q%!16+bdr%
  6916.  "Wimp_GetCaretPosition",,q%
  6917.  !q%=handle%:
  6918.  q%!4=ic%:
  6919.  "Wimp_SetCaretPosition",handle%,ic%,0,0,-1,0
  6920. shell_HeapBlockReturn(q%)
  6921. *|Stop FNshell_CreateIcon2
  6922. *|Start PROCshell_IconSlab
  6923. shell_IconSlab(button%,wh%,ih%)
  6924.  blk%
  6925. <"blk%=
  6926. shell_HeapBlockFetch(50)
  6927. =*blk%!8=button%:blk%!12=wh%:blk%!16=ih%
  6928.  "Interface_SlabButton",,blk%
  6929. blk%!8=0
  6930.  "Interface_SlabButton",,blk%
  6931. shell_HeapBlockReturn(blk%)
  6932. *|Stop PROCshell_IconSlab
  6933. H'*|Start PROCshell_IconSetButtonType
  6934. shell_IconSetButtonType(wh%,ih%,button_type%)
  6935.  button_type% = 12 
  6936.  button_type% = 13 
  6937. shell_MessageOneArg("SHELLMSG23","PROCshell_IconSetButtonType")
  6938.  button_type% < 0 
  6939.  button_type% > 15 
  6940. shell_MessageOneArg("SHELLMSG22","PROCshell_IconSetButtonType")
  6941. shell_IconSetState(wh%, ih%, button_type% << 12, &F000 )
  6942. W&*|Stop PROCshell_IconSetButtonType
  6943. [ *|Start PROCshell_IconSetESG
  6944. shell_IconSetESG(wh%,ih%,esg%)
  6945.  esg%<0 
  6946.  esg%>31 
  6947. shell_MessageOneArg("SHELLMSG25","PROCshell_IconSetESG")
  6948. shell_IconSetState(wh%,ih%,esg%<<16,&1F0000)
  6949. *|Stop PROCshell_IconSetESG
  6950. e!*|Start PROCshell_IconSetText
  6951. shell_IconSetText(wh%, ih%, action%)
  6952.  action% <> 0 
  6953.  action% = 1 << 0
  6954. shell_IconSetState(wh%, ih%, action%, 1 << 0)
  6955. k *|Stop PROCshell_IconSetText
  6956. o#*|Start PROCshell_IconSetSprite
  6957. shell_IconSetSprite(window_handle%, icon_handle%, action%)
  6958.  action% <> 0 
  6959.  action% = 1 << 1
  6960. shell_IconSetState(window_handle%, icon_handle%, action%, 1 << 1)
  6961. u"*|Stop PROCshell_IconSetSprite
  6962. y#*|Start PROCshell_IconSetBorder
  6963. shell_IconSetBorder(window_handle%, icon_handle%, action%)
  6964.  action% <> 0 
  6965.  action% = 1 << 2
  6966. shell_IconSetState(window_handle%, icon_handle%, action%, 1 << 2)
  6967. "*|Stop PROCshell_IconSetBorder
  6968. %*|Start PROCshell_IconSetHCentred
  6969. shell_IconSetHCentred(wh%,ih%,action%)
  6970. shell_IconSetState(wh%,ih%,0,1<<9):
  6971.  unset right justified bit...
  6972.  action%<>0 
  6973.  action%=1<<3
  6974. shell_IconSetState(wh%,ih%,action%,1<<3)
  6975. $*|Stop PROCshell_IconSetHCentred
  6976. %*|Start PROCshell_IconSetVCentred
  6977. shell_IconSetVCentred(wh%,ih%,action%)
  6978.  action%<>0 
  6979.  action%=1<<4
  6980. shell_IconSetState(wh%,ih%,action%,1<<4)
  6981. $*|Stop PROCshell_IconSetVCentred
  6982. #*|Start PROCshell_IconSetFilled
  6983. shell_IconSetFilled(wh%,ih%,action%)
  6984.  action%<>0 
  6985.  action%=1<<5
  6986. shell_IconSetState(wh%,ih%,action%,1<<5)
  6987. "*|Stop PROCshell_IconSetFilled
  6988. ,*|Start PROCshell_IconSetUsesOutlineFont
  6989. shell_IconSetUsesOutlineFont( wh%, ih%, action% )
  6990.  action% <> 0 
  6991.  action% = 1<<6
  6992. shell_IconSetState( wh%, ih%, action%, 1<<6 )
  6993. +*|Stop PROCshell_IconSetUsesOutlineFont
  6994. &*|Start PROCshell_IconSetRightJust
  6995. shell_IconSetRightJust(wh%,ih%,action%)
  6996. shell_IconSetHCentred(wh%,ih%,0)
  6997.  action%<>0 
  6998.  action%=1<<9
  6999. shell_IconSetState(wh%,ih%,action%,1<<9)
  7000. %*|Stop PROCshell_IconSetRightJust
  7001. %*|Start PROCshell_IconSetLeftJust
  7002. shell_IconSetLeftJust(wh%,ih%)
  7003. shell_IconSetHCentred(wh%,ih%,0)
  7004. shell_IconSetRightJust(wh%,ih%,0)
  7005. $*|Stop PROCshell_IconSetLeftJust
  7006. )*|Start PROCshell_IconSetUnselectable
  7007. shell_IconSetUnselectable( wh%, ih%, state% )
  7008.  state% <> 0 
  7009.  state% = 1 << 22
  7010. shell_IconSetState( wh%, ih%, state%, 1 << 22 )
  7011.  state% <> 0 
  7012.  check if icon has the caret, lose it if it has..
  7013. shell_IconHasCaret( wh%, ih% ) 
  7014. %    
  7015.  "Wimp_SetCaretPosition",-1
  7016. (*|Stop PROCshell_IconSetUnselectable
  7017. #*|Start PROCshell_IconSelectAll
  7018. shell_IconSelectAll(wh%)
  7019.  blk%,I%
  7020. $blk%=
  7021. shell_HeapBlockFetch(2000)
  7022. I%=blk%+&40:!blk%=wh%
  7023. blk%!8=1<<21:blk%!12=1<<21
  7024.  "Wimp_WhichIcon",!blk%,I%,5<<21,0<<21
  7025.  !I%>-1
  7026.   blk%!4=!I%
  7027.  "Wimp_SetIconState",,blk%
  7028.   I%+=4
  7029. shell_HeapBlockReturn(blk%)
  7030. "*|Stop PROCshell_IconSelectAll
  7031. %*|Start PROCshell_IconDeselectAll
  7032. shell_IconDeselectAll(wh%)
  7033.  blk%,I%
  7034. $blk%=
  7035. shell_HeapBlockFetch(2000)
  7036. 0I%=blk%+&40:!blk%=wh%:blk%!8=0:blk%!12=1<<21
  7037.  "Wimp_WhichIcon",!blk%,I%,5<<21,1<<21
  7038.  !I%>-1
  7039.   blk%!4=!I%
  7040.  "Wimp_SetIconState",,blk%
  7041.   I%+=4
  7042. shell_HeapBlockReturn(blk%)
  7043. $*|Stop PROCshell_IconDeselectAll
  7044. '*|Start PROCshell_IconSetSpriteArea
  7045. shell_IconSetSpriteArea(flags%,data%,area%)
  7046.  ((flags% 
  7047.  3) = 2) 
  7048.  ((flags% 
  7049.  &100) <> 0) 
  7050.   data%!4 = area%
  7051. &*|Stop PROCshell_IconSetSpriteArea
  7052. **|Start PROCshell_IconGetSelectedIcons
  7053. shell_IconGetSelectedIcons( wh%, esg%, 
  7054.  i_blk% )
  7055.  imask%
  7056. 'imask%   = (esg% << 16) + (1 << 21)
  7057.  "Wimp_WhichIcon",wh%,i_blk%,imask%,(esg% << 16) + (1 << 21)
  7058. )*|Stop PROCshell_IconGetSelectedIcons
  7059. !*|Start FNshell_IconIndirSize
  7060. shell_IconIndirSize(file_offset%,flags%,data%,X%)
  7061.  size%,valid_offset%,ctr%,char%
  7062.  (flags% 
  7063.  &800100) = &100 
  7064.   size% = data%!8
  7065.  (flags% 
  7066.  (data%!4 <> -1) 
  7067.     valid_offset% = data%!4
  7068. ,    
  7069. # X% = file_offset% + valid_offset%
  7070.     ctr% = 0
  7071.         
  7072.       char% = 
  7073.       ctr% += 1
  7074.  char% < 32
  7075.     size% += + ctr%
  7076.   size% = 0
  7077. = size%
  7078.  *|Stop FNshell_IconIndirSize
  7079. #(*|Start PROCshell_IconGetBoundingBox
  7080. shell_IconGetBoundingBox( window_handle%, icon_handle%, 
  7081.  xmin%, 
  7082.  ymin%, 
  7083.  xmax%, 
  7084.  ymax% )
  7085. Icons_GetState( window_handle%, icon_handle% )
  7086. &'xmin% = _c_Icon_GetIconStateBlk%!08
  7087. ''ymin% = _c_Icon_GetIconStateBlk%!12
  7088. ('xmax% = _c_Icon_GetIconStateBlk%!16
  7089. )'ymax% = _c_Icon_GetIconStateBlk%!20
  7090. ,'*|Stop PROCshell_IconGetBoundingBox
  7091. 0!*|Start PROCshell_IconDragBox
  7092. shell_IconDragBox( window_handle%, icon_handle% )
  7093.  window_name$, offset%, evnt_list%, user_FN_offset%, data_list%, user_FN$, void%
  7094.  name_icon%, icon_blk%, wex, wey, spr_area%, flags%, valid%, DragASprite%, f%, spr$
  7095. 5bicon_blk%  = 
  7096. shell_HeapBlockFetch( 100 + ( 
  7097. shell_WindowCountIcons( window_handle% ) * 32 ) )
  7098. !icon_blk% = window_handle%
  7099.  "Wimp_GetWindowInfo", , icon_blk%
  7100. 8%wex = icon_blk%!04 - icon_blk%!20
  7101. 9%wey = icon_blk%!16 - icon_blk%!24
  7102. spr_area%   = icon_blk%!68
  7103. icon_blk%!4 = icon_handle%
  7104.  "Wimp_GetIconState", , icon_blk%
  7105. = icon_blk%!0 = window_handle%
  7106. >(icon_blk%!4 = _c_Icons_IconDragType%
  7107. flags%      = icon_blk%!24
  7108. valid%      = icon_blk%!32
  7109. A%icon_blk%!08 = icon_blk%!08 + wex
  7110. B%icon_blk%!12 = icon_blk%!12 + wey
  7111. C%icon_blk%!16 = icon_blk%!16 + wex
  7112. D%icon_blk%!20 = icon_blk%!20 + wey
  7113. E)icon_blk%!24 = _c_Icons_DragBBoxXMin%
  7114. F)icon_blk%!28 = _c_Icons_DragBBoxYMin%
  7115. G)icon_blk%!32 = _c_Icons_DragBBoxXMax%
  7116. H)icon_blk%!36 = _c_Icons_DragBBoxYMax%
  7117.  check dragasprite bit in CMOS RAM..
  7118.  "OS_Byte", 161, 28 
  7119.  , , f%
  7120. L$DragASprite% = ( ( f% 
  7121.  2) = 2 )
  7122. M&m_DSave_DragASpriteInProgress% = 
  7123.  DragASprite% 
  7124. shell_DataSaveDragInProgress 
  7125.   f% = flags%
  7126.  ( f% 
  7127.  &100 ) 
  7128. R3    spr$ = 
  7129. shell_IconGetCommand( valid%, "s" )
  7130.  ( f% 
  7131.  2) = 0 
  7132. shell_OK( 
  7133. shell_MessageNoArgs( _c_Icons_NotASpriteIconMess$ ) )
  7134.  spr$ <> "" 
  7135. VS    
  7136.  "DragASprite_Start", _c_Icons_DragFlags%, spr_area%, spr$, icon_blk% + 8
  7137. W*    m_DSave_DragASpriteInProgress% = 
  7138. Y&    
  7139.  "Wimp_DragBox", , icon_blk%
  7140. shell_HeapBlockReturn( icon_blk% )
  7141. shell_HandleSlider( window_handle%, icon_handle% )
  7142. c *|Stop PROCshell_IconDragBox
  7143. g"*|Start PROCshell_IconDragBox2
  7144. shell_IconDragBox2( window_handle%, icon_handle% )
  7145.  icon_blk%, wex, wey, flags%, valid%
  7146. lbicon_blk%  = 
  7147. shell_HeapBlockFetch( 100 + ( 
  7148. shell_WindowCountIcons( window_handle% ) * 32 ) )
  7149. !icon_blk% = window_handle%
  7150.  "Wimp_GetWindowInfo", , icon_blk%
  7151. o%wex = icon_blk%!04 - icon_blk%!20
  7152. p%wey = icon_blk%!16 - icon_blk%!24
  7153. icon_blk%!4 = icon_handle%
  7154.  "Wimp_GetIconState", , icon_blk%
  7155. t icon_blk%!0 = window_handle%
  7156. u(icon_blk%!4 = _c_Icons_IconDragType%
  7157. flags%      = icon_blk%!24
  7158. valid%      = icon_blk%!32
  7159. x%icon_blk%!08 = icon_blk%!08 + wex
  7160. y%icon_blk%!12 = icon_blk%!12 + wey
  7161. z%icon_blk%!16 = icon_blk%!16 + wex
  7162. {%icon_blk%!20 = icon_blk%!20 + wey
  7163. |)icon_blk%!24 = _c_Icons_DragBBoxXMin%
  7164. })icon_blk%!28 = _c_Icons_DragBBoxYMin%
  7165. ~)icon_blk%!32 = _c_Icons_DragBBoxXMax%
  7166. )icon_blk%!36 = _c_Icons_DragBBoxYMax%
  7167.  "Wimp_DragBox", , icon_blk%
  7168. shell_HeapBlockReturn( icon_blk% )
  7169. !*|Stop PROCshell_IconDragBox2
  7170. #*|Start FNshell_IconGetBGColour
  7171. shell_IconGetBGColour(wh%,ih%)
  7172.  col%,icon_blk%
  7173. 'icon_blk%=
  7174. shell_HeapBlockFetch(40)
  7175. icon_blk%!0=wh%
  7176. icon_blk%!4=ih%
  7177.  "Wimp_GetIconState",,icon_blk%
  7178. 'col% = (icon_blk%!24 >> 28) 
  7179.  %1111
  7180. shell_HeapBlockReturn(icon_blk%)
  7181. = col%
  7182. "*|Stop FNshell_IconGetBGColour
  7183. #*|Start FNshell_IconGetFGColour
  7184. shell_IconGetFGColour( wh%, ih% )
  7185.  col%,icon_blk%
  7186. +icon_blk% = 
  7187. shell_HeapBlockFetch( 40 )
  7188. icon_blk%!0 = wh%
  7189. icon_blk%!4 = ih%
  7190.  "Wimp_GetIconState",,icon_blk%
  7191. )col% = ( icon_blk%!24 >> 24 ) 
  7192.  %1111
  7193. shell_HeapBlockReturn( icon_blk% )
  7194. = col%
  7195. "*|Stop FNshell_IconGetFGColour
  7196. %*|Start FNshell_IconGetButtonType
  7197. shell_IconGetButtonType( window_handle%, icon_handle% )
  7198.  button_type%, icon_blk%
  7199. +icon_blk% = 
  7200. shell_HeapBlockFetch( 40 )
  7201.  icon_blk%!0 = window_handle%
  7202. icon_blk%!4 = icon_handle%
  7203.  "Wimp_GetIconState",,icon_blk%
  7204. 1button_type% = ( icon_blk%!24 >> 12 ) 
  7205.  %1111
  7206. shell_HeapBlockReturn( icon_blk% )
  7207. = button_type%
  7208. $*|Stop FNshell_IconGetButtonType
  7209. '*|Start PROCshell_IconEnsureVisible
  7210. shell_IconEnsureVisible( window_handle%, icon_handle% )
  7211.  Check for panes attached to the window edges as this effectively
  7212.  reduces the window visible area..
  7213.  FNshell_WindowGetVisibleArea()
  7214.  FNshell_WindowGetScrollOffsets()
  7215.  window_state_blk%, icon_state_blk%, visible_area_xmin%
  7216.  visible_area_ymin%, visible_area_xmax%, visible_area_ymax%
  7217.  icon_xmin%, icon_ymin%, icon_xmax%, icon_ymax%
  7218.  scroll_offset_x%, scroll_offset_y%
  7219.  window_height%, window_width%
  7220.  visible_work_area_xmin%, visible_work_area_ymin%
  7221.  visible_work_area_xmax%, visible_work_area_ymax%
  7222.  top_pane_depth%
  7223.  icon_handle% >= 0 
  7224. 5  window_state_blk% = 
  7225. shell_HeapBlockFetch( 36 )
  7226. 5  icon_state_blk%   = 
  7227. shell_HeapBlockFetch( 40 )
  7228. )  !window_state_blk% = window_handle%
  7229.  "Wimp_GetWindowState", , window_state_blk%
  7230. 0  visible_area_xmin%  = window_state_blk%!04
  7231. 0  visible_area_ymin%  = window_state_blk%!08
  7232. 0  visible_area_xmax%  = window_state_blk%!12
  7233. 0  visible_area_ymax%  = window_state_blk%!16
  7234. -  scroll_offset_x% = window_state_blk%!20
  7235. -  scroll_offset_y% = window_state_blk%!24
  7236. >  window_width%  = visible_area_xmax% - visible_area_xmin%
  7237. >  window_height% = visible_area_ymax% - visible_area_ymin%
  7238. (  icon_state_blk%!0 = window_handle%
  7239. &  icon_state_blk%!4 = icon_handle%
  7240.  "Wimp_GetIconState", , icon_state_blk%
  7241. %  icon_xmin% = icon_state_blk%!08
  7242. %  icon_ymin% = icon_state_blk%!12
  7243. %  icon_xmax% = icon_state_blk%!16
  7244. %  icon_ymax% = icon_state_blk%!20
  7245. 0  visible_work_area_xmin% = scroll_offset_x%
  7246. 0  visible_work_area_ymax% = scroll_offset_y%
  7247. @  visible_work_area_xmax% = scroll_offset_x% + window_width%
  7248. A  visible_work_area_ymin% = scroll_offset_y% - window_height%
  7249. Q  bottom_pane_depth% = 
  7250. shell_Window_GetBottomPaneDepth( window_handle% ) + 8
  7251. N  top_pane_depth%    = 
  7252. shell_Window_GetTopPaneDepth( window_handle% ) + 8
  7253.  icon_ymin% < ( visible_work_area_ymin% + bottom_pane_depth% ) 
  7254. m    
  7255. shell_WindowScrollBy( window_handle%, 0, icon_ymin% - visible_work_area_ymin% - bottom_pane_depth% )
  7256.  icon_ymax% > ( visible_work_area_ymax% - top_pane_depth% - bottom_pane_depth% ) 
  7257. shell_WindowScrollBy( window_handle%, 0, icon_ymax% - visible_work_area_ymax% + top_pane_depth% + bottom_pane_depth% + 12 )
  7258.  icon_xmax% > visible_work_area_xmax% 
  7259. X    
  7260. shell_WindowScrollBy( window_handle%, icon_xmax% - visible_work_area_xmax%, 0 )
  7261.  icon_xmin% < visible_work_area_xmin% 
  7262. X    
  7263. shell_WindowScrollBy( window_handle%, icon_xmin% - visible_work_area_xmin%, 0 )
  7264. shell_HeapBlockReturn( window_state_blk% )
  7265. shell_HeapBlockReturn( icon_state_blk% )
  7266. &*|Stop PROCshell_IconEnsureVisible
  7267. "*|Start PROCshell_Icon_SetFont
  7268. shell_Icon_SetFont( window_handle%, icon_handle%, font_handle% )
  7269. shell_IconSetUsesOutlineFont( window_handle%, icon_handle%, 
  7270. shell_IconSetState( window_handle%, icon_handle%, font_handle% << 24, &FF000000 )
  7271. !*|Stop PROCshell_Icon_SetFont
  7272. +*|Start PROCshell_IconClearAllWritables
  7273. shell_IconClearAllWritables( window_handle% )
  7274. shell_IconSetAllWritables( window_handle%, "" )
  7275. **|Stop PROCshell_IconClearAllWritables
  7276. )*|Start PROCshell_IconSetAllWritables
  7277. shell_IconSetAllWritables( window_handle%, icon_data$ )
  7278.  icon_blk%, ptr%, nr_icons%
  7279.  Don't forget the list has a -1 terminator, hence the extra icon
  7280.  added..
  7281.  !9nr_icons% = 
  7282. shell_WindowCountIcons( window_handle% )
  7283.  ">icon_blk% = 
  7284. shell_HeapBlockFetch( ( nr_icons% + 1 ) * 4 )
  7285.  Get the icon handles of all writables..
  7286.  "Wimp_WhichIcon", window_handle%, icon_blk%, &0040E000, &0000E000
  7287. ptr% = 0
  7288.  icon_blk%!ptr% <> -1
  7289.  )A  
  7290. shell_IconPutData( window_handle%, icon_blk%!ptr%, "", 
  7291.   ptr% += 4
  7292. shell_HeapBlockReturn( icon_blk% )
  7293.  1(*|Stop PROCshell_IconSetAllWritables
  7294.  5/*|Start PROCshell_IconDisallowWritableDrags
  7295. shell_IconDisallowWritableDrags
  7296.  7$_m_Icons_AllowWritableDrags% = 
  7297.  :.*|Stop PROCshell_IconDisallowWritableDrags
  7298.  >,*|Start PROCshell_IconAllowWritableDrags
  7299. shell_IconAllowWritableDrags
  7300.  @$_m_Icons_AllowWritableDrags% = 
  7301.  C+*|Stop PROCshell_IconAllowWritableDrags
  7302.  G**|Start FNshell_IconWritableDragStatus
  7303. shell_IconWritableDragStatus
  7304.  I"= _m_Icons_AllowWritableDrags%
  7305.  K)*|Stop FNshell_IconWritableDragStatus
  7306.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7307.  Module ProgEvnts
  7308.  -----------------------------------------------------------------------
  7309.  Program Event Handling Routines (version 1.03 27-Sep-95)
  7310.  This module handles 'program events' i.e. events that are concerned with
  7311.  the program as a whole rather than individual windows/icons.
  7312.  -----------------------------------------------------------------------
  7313.  Evnts Covered:
  7314.    DeskTop Font Change
  7315.    Palette Change
  7316.    ModeChange
  7317.    Save Desktop
  7318.    Task Initialise
  7319.    Task Closedown
  7320.    Shutdown             (emergency stop for A4 portable, out of battery power!)
  7321.    PreQuit
  7322.  -----------------------------------------------------------------------
  7323.  Public Methods Supported:
  7324.    PROCshell_AttachDeskFontChangeHandler
  7325.    PROCshell_AttachPaletteChangeHander
  7326.    PROCshell_AttachModeChangeHandler
  7327.    PROCshell_AttachSaveDesktopHandler
  7328.    PROCshell_AttachTaskInitialiseHandler
  7329.    PROCshell_AttachTaskCloseDownHandler
  7330.    PROCshell_AttachShutdownHandler
  7331.    PROCshell_AttachPreQuitHandler
  7332.  EvntShell Internal Routines:
  7333.    FN_shell_ProgEvnts_Init
  7334.    PROCshell_ProgEvnts_DeskFontChanged
  7335.    PROCshell_ProgEvnts_ModeChanged
  7336.    PROCshell_ProgEvnts_PaletteChanged
  7337.    PROCshell_ProgEvnts_SaveDesktop
  7338.    PROCshell_ProgEvnts_TaskInitialise
  7339.    PROCshell_ProgEvnts_TaskCloseDown
  7340.    PROCshell_ProgEvnts_Shutdown
  7341.    PROCshell_ProgEvnts_PreQuit
  7342.       
  7343.  Private Methods Supported:
  7344.       None
  7345. #*|Start FN_shell_ProgEvnts_Init
  7346. _shell_ProgEvnts_Init
  7347.  module variables
  7348. ._m_ProgEvnts_DeskFontHandle%          = -1
  7349. ._m_ProgEvnts_DeskFontChangeHandlerFN$ = ""
  7350. ._m_ProgEvnts_PaletteChangeHandlerFN$  = ""
  7351. ._m_ProgEvnts_ModeChangeHandlerFN$     = ""
  7352. ._m_ProgEvnts_SaveDesktopHandlerFN$    = ""
  7353. ._m_ProgEvnts_TaskInitialiseHandlerFN$ = ""
  7354. ._m_ProgEvnts_TaskCloseDownHandlerFN$  = ""
  7355. ._m_ProgEvnts_ShutdownHandlerFN$       = ""
  7356. ._m_ProgEvnts_PreQuitHandlerFN$        = ""
  7357. "*|Stop FN_shell_ProgEvnts_Init
  7358.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7359.  DeskTop Font Change
  7360.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7361. 1*|Start PROCshell_AttachDeskFontChangeHandler
  7362. shell_AttachDeskFontChangeHandler( fn_name$ )
  7363.  Store the name of the FN to call when a change of desk font is detected
  7364.  (Risc OS 3.5 only..)
  7365. shell_OSModuleCheckVersion( "UtilityModule", 3.5 ) 
  7366.  fn_name$ <> "" 
  7367. 8    _m_ProgEvnts_DeskFontChangeHandlerFN$ = fn_name$
  7368. 0*|Stop PROCshell_AttachDeskFontChangeHandler
  7369. /*|Start PROCshell_ProgEvnts_DeskFontChanged
  7370. shell_ProgEvnts_DeskFontChanged( new_font_handle% )
  7371.  The font used for the desktop has been changed (Risc OS 3.5 only..), so
  7372.  call stored FN if a handler has been attached..
  7373.  void%
  7374. 3_m_ProgEvnts_DeskFontHandle% = new_font_handle%
  7375.  _m_ProgEvnts_DeskFontChangeHandlerFN$ <> "" 
  7376. l  void% = 
  7377. ( "FN" + _m_ProgEvnts_DeskFontChangeHandlerFN$ + "(" + 
  7378.  _m_ProgEvnts_DeskFontHandle% + ")" )
  7379. .*|Stop PROCshell_ProgEvnts_DeskFontChanged
  7380.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7381.  Palette Change
  7382.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7383. 0*|Start PROCshell_AttachPaletteChangeHandler
  7384. shell_AttachPaletteChangeHandler( fn_name$ )
  7385.  Store the name of the FN to call when a change of palette is detected..
  7386.  void%
  7387.  fn_name$ <> "" 
  7388. 5  _m_ProgEvnts_PaletteChangeHandlerFN$ = fn_name$
  7389. "  void% = 
  7390. ( "FN" + fn_name$ )
  7391. /*|Stop PROCshell_AttachPaletteChangeHandler
  7392. .*|Start PROCshell_ProgEvnts_PaletteChanged
  7393. shell_ProgEvnts_PaletteChanged
  7394.  Palette has been changed, so call stored FN if a handler has been attached..
  7395.  void%
  7396.  _m_ProgEvnts_PaletteChangeHandlerFN$ <> "" 
  7397. >  void% = 
  7398. ( "FN" + _m_ProgEvnts_PaletteChangeHandlerFN$ )
  7399. -*|Stop PROCshell_ProgEvnts_PaletteChanged
  7400.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7401.  Mode Change
  7402.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7403. -*|Start PROCshell_AttachModeChangeHandler
  7404. shell_AttachModeChangeHandler( fn_name$ )
  7405.  Store the name of the FN to call when a change of Mode is detected..
  7406.  void%
  7407.  fn_name$ <> "" 
  7408. 2  _m_ProgEvnts_ModeChangeHandlerFN$ = fn_name$
  7409. "  void% = 
  7410. ( "FN" + fn_name$ )
  7411. ,*|Stop PROCshell_AttachModeChangeHandler
  7412. !    +*|Start PROCshell_ProgEvnts_ModeChanged
  7413. shell_ProgEvnts_ModeChanged
  7414.  Mode has been changed, so call stored FN if a handler has been attached..
  7415.  void%
  7416.  _m_ProgEvnts_ModeChangeHandlerFN$ <> "" 
  7417. ;  void% = 
  7418. ( "FN" + _m_ProgEvnts_ModeChangeHandlerFN$ )
  7419. **|Stop PROCshell_ProgEvnts_ModeChanged
  7420.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7421.  Desktop Save
  7422.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7423. !".*|Start PROCshell_AttachSaveDesktopHandler
  7424. shell_AttachSaveDesktopHandler( fn_name$ )
  7425.  Store the name of the FN to call when a save desktop message is
  7426.  received..
  7427.  fn_name$ <> "" 
  7428. !)3  _m_ProgEvnts_SaveDesktopHandlerFN$ = fn_name$
  7429. !.-*|Stop PROCshell_AttachSaveDesktopHandler
  7430. !2+*|Start PROCshell_ProgEvnts_SaveDesktop
  7431. shell_ProgEvnts_SaveDesktop( file_handle% )
  7432.  savedesktop_command$
  7433.  _m_ProgEvnts_SaveDesktopHandlerFN$ <> "" 
  7434. !9J  
  7435.  If user FN has been registered then call it so the application has
  7436. !:M  
  7437.  a chance to save a command line in the boot file. This would normally
  7438. !;K  
  7439.  run the application with the name of any loaded files (and possibly
  7440. !<2  
  7441.  window positions etc) on the command line.
  7442. !=U  savedesktop_command$ = 
  7443. ( "FN" + _m_ProgEvnts_SaveDesktopHandlerFN$ ) + 
  7444. ( 10 )
  7445. !?K  
  7446.  If no FN was registered then add a default line to the desktop boot
  7447. !@0  
  7448.  file just to run the current application
  7449. !A#  
  7450.  savedesktop_command$ = "" 
  7451. !CB    savedesktop_command$ = "Run " + 
  7452. shell_GetAppDir + 
  7453. ( 10 )
  7454. !GT  
  7455.  "OS_GBPB", 2, file_handle%, savedesktop_command$, 
  7456. ( savedesktop_command$ )
  7457. !M**|Stop PROCshell_ProgEvnts_SaveDesktop
  7458.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7459.  Task Initialise
  7460.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7461. !Y1*|Start PROCshell_AttachTaskInitialiseHandler
  7462. shell_AttachTaskInitialiseHandler( fn_name$ )
  7463.  Store the name of the FN to call when a task initialise message is
  7464.  received..
  7465.  fn_name$ <> "" 
  7466. !`6  _m_ProgEvnts_TaskInitialiseHandlerFN$ = fn_name$
  7467. !e0*|Stop PROCshell_AttachTaskInitialiseHandler
  7468. !i.*|Start PROCshell_ProgEvnts_TaskInitialise
  7469. shell_ProgEvnts_TaskInitialise( task_handle%, task_name$ )
  7470.  Mode has been changed, so call stored FN if a handler has been attached..
  7471.  void%
  7472.  _m_ProgEvnts_TaskInitialiseHandlerFN$ <> "" 
  7473.   void% = 
  7474. ( "FN" + _m_ProgEvnts_TaskInitialiseHandlerFN$ + "(" + 
  7475.  task_handle% + "," + 
  7476. ( 34 ) + task_name$ + 
  7477. ( 34) + ")" )
  7478. !v-*|Stop PROCshell_ProgEvnts_TaskInitialise
  7479.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7480.  Task CloseDown
  7481.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7482. 0*|Start PROCshell_AttachTaskCloseDownHandler
  7483. shell_AttachTaskCloseDownHandler( fn_name$ )
  7484.  Store the name of the FN to call when a task closedown message is
  7485.  received..
  7486.  fn_name$ <> "" 
  7487. 5  _m_ProgEvnts_TaskCloseDownHandlerFN$ = fn_name$
  7488. /*|Stop PROCshell_AttachTaskCloseDownHandler
  7489. -*|Start PROCshell_ProgEvnts_TaskCloseDown
  7490. shell_ProgEvnts_TaskCloseDown( task_handle% )
  7491.  Mode has been changed, so call stored FN if a handler has been attached..
  7492.  void%
  7493.  _m_ProgEvnts_TaskCloseDownHandlerFN$ <> "" 
  7494. [  void% = 
  7495. ( "FN" + _m_ProgEvnts_TaskCloseDownHandlerFN$ + "(" + 
  7496.  task_handle% + ")" )
  7497. ,*|Stop PROCshell_ProgEvnts_TaskCloseDown
  7498.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7499.  ShutDown (machine stop due to lack of battery power)
  7500.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7501. +*|Start PROCshell_AttachShutdownHandler
  7502. shell_AttachShutdownHandler( fn_name$ )
  7503.  Store the name of the FN to call when a task closedown message is
  7504.  received..
  7505.  fn_name$ <> "" 
  7506. 0  _m_ProgEvnts_ShutdownHandlerFN$ = fn_name$
  7507. **|Stop PROCshell_AttachShutdownHandler
  7508. (*|Start PROCshell_ProgEvnts_Shutdown
  7509. shell_ProgEvnts_Shutdown
  7510.  void%
  7511.  _m_ProgEvnts_ShutdownHandlerFN$ <> "" 
  7512. 9  void% = 
  7513. ( "FN" + _m_ProgEvnts_ShutdownHandlerFN$ )
  7514. '*|Stop PROCshell_ProgEvnts_Shutdown
  7515.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7516.  PreQuit
  7517.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7518. **|Start PROCshell_AttachPreQuitHandler
  7519. shell_AttachPreQuitHandler( fn_name$ )
  7520.  Store the name of the FN to call when a PreQuit message is
  7521.  received..
  7522.  fn_name$ <> "" 
  7523. /  _m_ProgEvnts_PreQuitHandlerFN$ = fn_name$
  7524. )*|Stop PROCshell_AttachPreQuitHandler
  7525. '*|Start PROCshell_ProgEvnts_PreQuit
  7526. shell_ProgEvnts_PreQuit( msg_blk% )
  7527.  void%, blk%, msg_size%, quitsender%, loop%
  7528.  flagword%
  7529.  _m_ProgEvnts_PreQuitHandlerFN$ <> "" 
  7530. *  blk%  = 
  7531. shell_HeapBlockFetch( 256 )
  7532.  copy message block to private area..
  7533.   msg_size% = msg_blk%!0
  7534.  loop% = 0 
  7535.  msg_size% 
  7536.     blk%!loop% = _Q%!loop%
  7537.  loop%
  7538.   quitsender% = blk%!4
  7539.  msg_size% < 24 
  7540.  flagword% = 0 
  7541.  flagword% = blk%!20
  7542.  acknowledge message - this aborts shutdown..
  7543.   blk%!12 = blk%!8
  7544.  "Wimp_SendMessage", 19, blk%, quitsender%
  7545. ( "FN" + _m_ProgEvnts_PreQuitHandlerFN$ ) <> 0 
  7546.  ok to quit..
  7547.  flagword% 
  7548. !      
  7549.  quit just this task..
  7550.       _closedown% = 
  7551.         
  7552.       
  7553.  shutdown desktop..
  7554.       !blk% = 24
  7555.       blk%!24 = &1FC
  7556. 5      
  7557.  "Wimp_SendMessage", 8, blk%, quitsender%
  7558.       _closedown% = 
  7559.         
  7560. shell_HeapBlockReturn( blk% )
  7561. &*|Stop PROCshell_ProgEvnts_PreQuit
  7562.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7563.  Module Debug
  7564.  -----------------------------------------------------------------------
  7565.  Debug Handling Routines
  7566.  -----------------------------------------------------------------------
  7567.  Public Methods Supported:
  7568.    FN_shell_Debug_Init                 Initialises module
  7569.    PROCshell_TraceOn
  7570.    PROCshell_TraceOff
  7571.    PROCshell_TraceInit
  7572.    PROCshell_TraceIsOn
  7573.    REM PROCshell_Tracef0
  7574.    PROCshell_Tracef2
  7575.    PROCshell_TraceExit
  7576.  Private Methods Supported:
  7577.       None
  7578. *|Start FN_shell_Debug_Init
  7579. _shell_Debug_Init
  7580. *|Stop FN_shell_Debug_Init
  7581. *|Start PROCshell_TraceOn
  7582. shell_TraceOn
  7583. _U%!100 = _U%!100 
  7584.  1 << 9
  7585. shell_BroadcastMessage(&43B00,"ShellDBug:TraceOn")
  7586. *|Stop PROCshell_TraceOn
  7587. *|Start PROCshell_TraceOff
  7588. shell_TraceOff
  7589.  (_U%!100 
  7590.  (1 << 9)) 
  7591.  _U%!100 = _U%!100 
  7592.  (1 << 9)
  7593. shell_BroadcastMessage(&43B00,"ShellDBug:TraceOff")
  7594. *|Stop PROCshell_TraceOff
  7595. *|Start PROCshell_TraceInit
  7596. *|Define TraceInit
  7597. shell_TraceInit(file$)
  7598.  f%, shell_AppName$,shell_AppDir$
  7599.  file$<>"" 
  7600.   f%=
  7601. (file$)
  7602.   _U%!44=f%
  7603. "E8shell_AppDir$  = 
  7604. shell_OSVarGetVal( "Obey$Dir", 1 )
  7605. "F8shell_AppName$ = 
  7606. shell_Leaf( shell_AppDir$ ), 2 )
  7607. shell_BroadcastMessage(&43B00,"ShellDBug:Init Debug messages from "+shell_AppName$)
  7608.  set bit 4 of shell flag word. If ShellDBug start up is detected then
  7609.  send init message again (ShellDBug was started after this task). Clear
  7610.  bit when ShellDBug sends its ack message.
  7611.  _U%!100 
  7612.  1<<4 
  7613. "N#  _U%!100 = (_U%!100 
  7614.  1 << 4 )
  7615. *|Stop PROCshell_TraceInit
  7616. *|Start FNshell_TraceIsOn
  7617. shell_TraceIsOn
  7618.  result%
  7619.  _U%!100 
  7620.  (1 << 9) 
  7621.   result% = 
  7622.   result% = 
  7623. = result%
  7624. *|Stop FNshell_TraceIsOn
  7625. *|Start PROCshell_Tracef0
  7626. shell_Tracef0(a$)
  7627. shell_TraceIsOn = 
  7628.  _U%!44<>-1 
  7629.   f%=_U%!44
  7630. #f%,a$
  7631.  check if task id has been set up...
  7632.  _U%!148>0 
  7633. "n;  
  7634. shell_BroadcastMessage(&43B00,"ShellDBug:Trace "+a$)
  7635.  PROCshell_EnsurePoll
  7636. *|Stop PROCshell_Tracef0
  7637. *|Start PROCshell_Tracef2
  7638. shell_Tracef2(addr%)
  7639. ("MEDIT "+
  7640. ~addr%)
  7641. *|Stop PROCshell_Tracef2
  7642. *|Start PROCshell_TraceExit
  7643. shell_TraceExit
  7644.  _U%!44<>-1 
  7645. #(_U%!44):_U%!44=-1
  7646.  _U%!44=-1:_U%!48=FALSE
  7647. *|Stop PROCshell_TraceExit
  7648.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7649.  Module OS
  7650.  -----------------------------------------------------------------------
  7651.  OS Handling Routines
  7652.  -----------------------------------------------------------------------
  7653.  Structure of Data used in this module
  7654.  Public Methods Supported:
  7655.    FN_shell_OS_Init                 Initialises module
  7656.    FNshell_OSVarExists
  7657.    FNshell_OSVarGetVal
  7658.    FNshell_OSCheckVersion
  7659.    FNshell_OSModuleCheckVersion
  7660.    FNshell_RO3_Available
  7661.  Private Methods Supported:
  7662.       None
  7663.       
  7664. *|Start FN_shell_OS_Init
  7665. _shell_OS_Init
  7666.  _m_OS_VAR_BUFFER_SIZE% = 256
  7667.  _m_OS_VAR_BUFFER% _m_OS_VAR_BUFFER_SIZE%
  7668. O_m_OS_RiscOS_3_Found% = 
  7669. shell_OSModuleCheckVersion( "UtilityModule", 3.1 )
  7670. *|Stop FN_shell_OS_Init
  7671. !*|Start FNshell_RO3_Available
  7672. shell_RO3_Available
  7673. = _m_OS_RiscOS_3_Found%
  7674.  *|Stop FNshell_RO3_Available
  7675. "*|Start FNshell_OSCheckVersion
  7676. shell_OSCheckVersion( version )
  7677. shell_OSModuleCheckVersion( "UtilityModule", version )
  7678. !*|Stop FNshell_OSCheckVersion
  7679. (*|Start FNshell_OSModuleCheckVersion
  7680. shell_OSModuleCheckVersion( module$, version )
  7681.  len%,result$, result%
  7682. ( "Set Module$Check Y" )
  7683. ( "RMEnsure " + module$ + " " + 
  7684.  version + " Set Module$Check N" )
  7685.  "OS_ReadVarVal","Module$Check",_m_OS_VAR_BUFFER%,256,0,0 
  7686.  ,,len%
  7687. _m_OS_VAR_BUFFER%?len% = 13
  7688. ( "Unset Module$Check" )
  7689.  result$ = $_m_OS_VAR_BUFFER%
  7690.  result$ = "N" 
  7691.   result% = 
  7692.   result% = 
  7693. = result%
  7694. '*|Stop FNshell_OSModuleCheckVersion
  7695. *|Start FNshell_OSVarExists
  7696. shell_OSVarExists( varname$ )
  7697.  nr_bytes
  7698.  "XOS_ReadVarVal", varname$, _m_OS_VAR_BUFFER%, -1, 0, 0 
  7699.  , , nr_bytes
  7700.  nr_bytes < 0 
  7701.   result% = 
  7702.   result% = 
  7703. = result%
  7704. *|Stop FNshell_OSVarExists
  7705. *|Start FNshell_OSVarGetVal
  7706. shell_OSVarGetVal( varname$, expand )
  7707.  value$,nr_bytes,nameptr%, loop%
  7708.  "XOS_ReadVarVal", varname$, _m_OS_VAR_BUFFER%, _m_OS_VAR_BUFFER_SIZE%, 0, -3 * ( expand = -1 ) 
  7709.  , , nr_bytes, nameptr%
  7710.  loop% = 0 
  7711.  nr_bytes - 1
  7712. 4  value$ = value$ + 
  7713. ( _m_OS_VAR_BUFFER%?loop% )
  7714.  loop%
  7715. = value$
  7716. *|Stop FNshell_OSVarGetVal
  7717. $*|Start FNshell_OSReadCommandArg
  7718. shell_OSReadCommandArg(opt)
  7719.  pointer%,command$,offset%
  7720. command$="":offset%=0
  7721.  "OS_GetEnv" 
  7722.  pointer%
  7723.  pointer%?offset%<>0
  7724. #  command$+=
  7725. (pointer%?offset%)
  7726.   offset%+=1
  7727.  opt 
  7728. ,    command$=
  7729. command$,
  7730. command$,
  7731. 34)+1)
  7732. ,    command$=
  7733. command$,
  7734. command$,
  7735. 34)+2)
  7736. =command$
  7737. #*|Stop FNshell_OSReadCommandArg
  7738.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7739.  Module Menus
  7740.  -----------------------------------------------------------------------
  7741.  Menu Handling Routines (version 1.15 25-Feb-96)
  7742.  This module contains routines that handle the interface to the MenuUtils
  7743.  module.
  7744.  -----------------------------------------------------------------------
  7745.  Structure of Data used in this module
  7746.  Public Methods Supported:
  7747.    FN_shell_Menus_Init                 Initialises module
  7748.    PROCshell_OpenMenu
  7749.    PROCshell_MenuAttachDBox
  7750.    PROCshell_MenuWarning
  7751.    PROCshell_MenuWarnDBox
  7752.    PROCshell_MenuWarnSubMenu
  7753.    PROCshell_AttachSubMenu
  7754.    PROCshell_AttachColourSubMenu
  7755.    FNshell_MenuLastXPos
  7756.    FNshell_MenuLastYPos
  7757.    FNshell_MenuLastHandle
  7758.    FNshell_MenuSubLastHandle
  7759.    FNshell_MenuNew
  7760.    FNshell_MenuAdd
  7761.    FNshell_MenuMakeFromFile
  7762.    FNshell_MenuGetNrItems
  7763.    FNshell_MenuGetNrDotted
  7764.    FNshell_MenuGetItemHandler
  7765.    FNshell_MenuGetItemText
  7766.    FNshell_MenuGetItemHandle
  7767.    FNshell_MenuGetItemHeight
  7768.    FNshell_MenuCalculateHeight
  7769.    PROCshell_MenuTick
  7770.    PROCshell_MenuTickItem
  7771.    PROCshell_MenuUnTickItem
  7772.    PROCshell_MenuTickOnly1
  7773.    PROCshell_MenuTickOnly2
  7774.    PROCshell_MenuTickAllItems
  7775.    PROCshell_MenuUntickAllItems
  7776.    PROCshell_MenuShade
  7777.    PROCshell_MenuShadeAllItems
  7778.    PROCshell_MenuUnshadeAllItems
  7779.    PROCshell_MenuDotted
  7780.    PROCshell_MenuColours
  7781.    PROCshell_MenuWritable
  7782.    PROCshell_MenuPutData
  7783.    PROCshell_MenuSortItems
  7784.    PROCshell_MenuDelete
  7785.    PROCshell_MenuOpenLast
  7786.    PROCshell_MenuCloseAll
  7787.  Private Methods Supported:
  7788.       None
  7789. *|Start FN_shell_Menus_Init
  7790. _shell_Menus_Init
  7791.  module constants
  7792. _c_Menu_MinMenuItems% = 10
  7793.  module variables
  7794. #J#_m_Menu_HandleLastOpened%  = -1
  7795. #K#_m_Menu_SubLastOpened%     = -1
  7796. #L!m_Menu_LastXPos%          = 0
  7797. #M!m_Menu_LastYPos%          = 0
  7798. _m_WimpColMen_Handle% = -1
  7799. *|Stop FN_shell_Menus_Init
  7800. *|Start PROCshell_OpenMenu
  7801. shell_OpenMenu( x%, y%, menu_handle% )
  7802. shell_ExReg_FontMenu_Loaded 
  7803. #Z2  
  7804.  menu_handle% = 
  7805. shell_FontMenu_GetHandle 
  7806. #[9    
  7807.  "Wimp_CreateMenu", , menu_handle%, x% - 64, y%
  7808.     _Q%!0 = x%
  7809.     _Q%!4 = y%
  7810. #_.    
  7811.  "XMenuUtil_Show", menu_handle%, _Q%
  7812.   _Q%!0 = x%
  7813.   _Q%!4 = y%
  7814. #d,  
  7815.  "XMenuUtil_Show", menu_handle%, _Q%
  7816. #gR_m_Menu_HandleLastOpened% = menu_handle%:
  7817.  store handle of currently open menu
  7818. #h1m_Menu_LastXPos% = x%:
  7819.  store menu x position
  7820. #i1m_Menu_LastYPos% = y%:
  7821.  store menu y position
  7822. #j"_U%!52 = _U%!28:
  7823.  store window
  7824. #k _U%!56 = _U%!32:
  7825.  store icon
  7826. *|Stop PROCshell_OpenMenu
  7827. #r *|Start FNshell_MenuLastXPos
  7828. shell_MenuLastXPos
  7829. =m_Menu_LastXPos%
  7830. *|Stop FNshell_MenuLastXPos
  7831. #x *|Start FNshell_MenuLastYPos
  7832. shell_MenuLastYPos
  7833. =m_Menu_LastYPos%
  7834. *|Stop FNshell_MenuLastYPos
  7835. "*|Start FNshell_MenuLastHandle
  7836. shell_MenuLastHandle
  7837. =_m_Menu_HandleLastOpened%
  7838. !*|Stop FNshell_MenuLastHandle
  7839. %*|Start FNshell_MenuSubLastHandle
  7840. shell_MenuSubLastHandle
  7841. =_m_Menu_SubLastOpened%
  7842. $*|Stop FNshell_MenuSubLastHandle
  7843. $*|Start PROCshell_MenuAttachDbox
  7844. shell_MenuAttachDbox(menu$)
  7845.  attach a dummy window handle for now, just so that the sub window arrow
  7846.  appears on the menu!
  7847.  "Menu_SetSubHandle",_U%!8,
  7848. shell_MenuString(menu$),1
  7849.  PROCshell_Tracef0("MenuAttachDbox:Dialog box ("+menu$+") attached")
  7850. #*|Stop PROCshell_MenuAttachDbox
  7851. !*|Start PROCshell_MenuWarning
  7852. shell_MenuWarning( _Q% )
  7853.  menu_buffer%, x%, y%, void%, _temp%, a%, warn_fn$, item_addr%, blk%
  7854.  sel_fn$
  7855. !x%=_Q%!24:y%=_Q%!28:_U%!264=0
  7856.  _U%!20 <> 0 
  7857. *|ifdef PROCshell_TraceInit
  7858.  PROCshell_Tracef0("MenuWarning:Removing last dynamic dbox (handle=&"+STR$~_U%!20+")")
  7859. *|endif
  7860.  ERROR 99,STR$~_U%!20
  7861. +  void% = 
  7862. shell_DeleteWindow( _U%!20 )
  7863. *|ifdef PROCshell_TraceInit
  7864.  PROCshell_Tracef0("MenuWarning:Last dynamic dbox removed")
  7865. *|endif
  7866.  Check submenu pointer and create window found there
  7867.  Then call pre and post open FNs
  7868.  If submenu pointer is the warning window, open it to remind the user
  7869.  that no dbox has been attached to this menu entry..
  7870.  _Q%!20 
  7871.  _U%!228:
  7872.  handle of warning dbox..
  7873.  won't need to do this if title/icon messages are substituted
  7874.  when loading the templates
  7875. shell_WindowRetitle( _U%!228, 
  7876. shell_MessageNoArgs( "warning" ) )
  7877.  still need to set up the message though...
  7878. shell_IconPutData( _U%!228, 1, 
  7879. shell_MessageNoArgs( "SHELLMSG07" ), 0 )
  7880.  "Wimp_CreateSubMenu", , _U%!228, x%, y%
  7881.  Sub menu is either a dialog box, or a menu!!
  7882. L  item_addr%=
  7883. shell_MenuGetItemAddress(_m_Menu_HandleLastOpened%,_Q%+32)
  7884. shell_HeapBlockExists(item_addr%!4) 
  7885.  DBox is attached..
  7886. 1    
  7887. shell_MenuWarnDBox( item_addr%, x%, y% )
  7888.  Submenu attached..
  7889. (    blk%=
  7890. shell_HeapBlockFetch( 32 )
  7891. J    
  7892.  "MenuUtil_Decode", _m_Menu_HandleLastOpened%, _Q% + 32 
  7893.  ,,blk%
  7894. =    
  7895. shell_FindMenuWarnEvent( blk%!8, warn_fn$, sel_fn$ )
  7896. &    
  7897. shell_HeapBlockReturn( blk% )
  7898. C    
  7899. shell_MenuWarnSubMenu( _Q%!20, x%, y%, warn_fn$, sel_fn$ )
  7900.  *|Stop PROCshell_MenuWarning
  7901. "*|Start PROCshell_MenuWarnDBox
  7902. shell_MenuWarnDBox(addr%,x%,y%)
  7903.  temp%,h%,void%
  7904. temp%=addr%!4
  7905. shell_CreateWindow($temp%!0,h%)
  7906. *|ifdef TraceInit
  7907.  PROCshell_Tracef0("MenuWarnDBox:Creating new dynamic dbox (handle=&"+STR$~h%+")")
  7908. *|endif
  7909.  $temp%!4<>"" 
  7910. *|ifdef TraceInit
  7911.  PROCshell_Tracef0("MenuWarnDBox:Calling preopen FN '"+$temp%!4+"'")
  7912. *|endif
  7913. )  void%=
  7914. ("FN"+$temp%!4+"("+
  7915.  h%+")")
  7916.  $temp%!8<>"" 
  7917. *|ifdef TraceInit
  7918.  PROCshell_Tracef0("MenuWarnDBox:Calling postopen FN '"+$temp%!8+"'")
  7919. *|endif
  7920. )  void%=
  7921. ("FN"+$temp%!8+"("+
  7922.  h%+")")
  7923.  h% is new window handle....
  7924.  "Wimp_CreateSubMenu",,h%,x%,y%
  7925. _U%!20=h%
  7926. !*|Stop PROCshell_MenuWarnDBox
  7927. %*|Start PROCshell_MenuWarnSubMenu
  7928. shell_MenuWarnSubMenu( s_menu%, x%, y%, warn_fn$, sel_fn$ )
  7929.  void%,temp%,f_menu%,ctr%
  7930. !_shell_FontMenuSelFN$=sel_fn$
  7931. shell_HeapBlockExists(_U%!224) 
  7932. shell_HeapBlockReturn(_U%!224)
  7933. 5_U%!224 = 
  7934. shell_HeapBlockFetch( 
  7935.  warn_fn$ + 1 )
  7936. temp%  = _U%!224
  7937. $temp% = warn_fn$
  7938.  warn_fn$<>"" 
  7939. .  void%=
  7940. ("FN"+warn_fn$+"(_U%!52,_U%!56)")
  7941. *|ifdef PROCshell_TraceInit
  7942.  PROCshell_Tracef0("MenuWarnSubMenu:Calling FN"+warn_fn$)
  7943. *|endif
  7944. *|ifdef Using_FontMenu
  7945.  s_menu%=_U%!252 
  7946.  Submenu is FontMenu menu..
  7947. *|ifdef PROCshell_TraceInit
  7948.  PROCshell_Tracef0("MenuWarnSubMenu:FontMenu opening..")
  7949. *|endif
  7950. shell_HeapBlockExists(_U%!256) 
  7951. shell_HeapBlockReturn(_U%!256)
  7952.  Store current menu selection for testing later..
  7953.  First work out how many levels are in the selection..
  7954. 2  ctr%=0:
  7955. :ctr%+=4:
  7956.  !(_Q%+32+ctr%)=-1:ctr%+=4
  7957. 7  _U%!256=
  7958. shell_HeapBlockFetch(ctr%):temp%=_U%!256
  7959.   ctr%=0
  7960. $    !    temp%!ctr%=!(_Q%+32+ctr%)
  7961.     ctr%+=4
  7962.  !(_Q%+32+ctr%)=-1
  7963.   temp%!ctr%=!(_Q%+32+ctr%)
  7964.   temp%=_U%!256
  7965. *|ifdef PROCshell_TraceInit
  7966.  PROCshell_Tracef0("MenuWarnSubMenu:Selecting '"+FNshell_FontMenuGetLastSelectedFont+"' in FontMenu..")
  7967. *|endif
  7968.  "FontMenu_Select",
  7969. shell_FontMenuGetLastSelectedFont,_U%!260 
  7970.  ,f_menu%
  7971. +  _U%!264=1:
  7972.  Set 'FontMenuOpen' flag..
  7973.  f_menu%<>_U%!252 
  7974. $    
  7975.  FontMenu ptr has changed..
  7976. )    
  7977. shell_FontMenuUpdatePtr(f_menu%)
  7978. '    _U%!252=f_menu%:s_menu%=f_menu%
  7979. -  _U%!264=0:
  7980.  Clear 'FontMenuOpen' flag..
  7981. *|endif
  7982.  IF FNshell_ExReg_ColourMenu_Loaded THEN
  7983.    IF s_menu% = FNshell_WimpColMen_GetHandle THEN
  7984.      REM nothing needed here..
  7985.    ENDIF
  7986.  ENDIF
  7987.  "Wimp_CreateSubMenu",,s_menu%,x%,y%
  7988. $$$_m_Menu_SubLastOpened% = s_menu%
  7989. $($*|Stop PROCshell_MenuWarnSubMenu
  7990. $,#*|Start PROCshell_AttachSubMenu
  7991. shell_AttachSubMenu( item%, submenu%, warn_fn$ )
  7992.  "MenuUtil_SubMenu", item%, submenu%
  7993.  warn_fn$ <> "" 
  7994. $0   
  7995.  "MenuUtil_Warning", , 
  7996. $1?  
  7997. shell_EventListMenuWarn( item%, submenu%, warn_fn$, "" )
  7998. $5"*|Stop PROCshell_AttachSubMenu
  7999. *|Start FNshell_MenuNew
  8000. shell_MenuNew( menu_title$, menu_identifier$, estimated_nr_items% )
  8001.  menu_handle%
  8002. *|ifdef TraceInit
  8003.  PROCshell_Tracef0( "MenuNew:Creating new menu (title is '" + menu_title$ + "')")
  8004. *|endif
  8005.  estimated_nr_items% < _c_Menu_MinMenuItems% 
  8006. $C1  estimated_nr_items% = _c_Menu_MinMenuItems%
  8007.  "MenuUtil_New", , menu_title$, estimated_nr_items% 
  8008.  menu_handle%
  8009. shell_MenuList_AddMenu( menu_handle%, menu_identifier$ )
  8010. = menu_handle%
  8011. *|Stop FNshell_MenuNew
  8012. *|Start FNshell_MenuAdd
  8013. shell_MenuAdd( handle%, item$, sel_fn$ )
  8014.  item_handle%
  8015. *|ifdef TraceInit
  8016.  PROCshell_Tracef0("MenuAdd:Adding item ("+item$+")")
  8017. *|endif
  8018.  sel_fn$ <> "" 
  8019. $T<  
  8020.  "MenuUtil_Add",handle%,item$,sel_fn$ 
  8021.  item_handle%
  8022. $V4  
  8023.  "MenuUtil_Add",handle%,item$ 
  8024.  item_handle%
  8025. = item_handle%
  8026. *|Stop FNshell_MenuAdd
  8027. *|Start PROCshell_MenuTick
  8028. shell_MenuTick( item_handle%, state% )
  8029.  Tick the specified menu item. The state is 0 for no
  8030.  tick. non 0 for a tick
  8031.  "MenuUtil_Tick", item_handle%, state%
  8032. *|Stop PROCshell_MenuTick
  8033. $l"*|Start PROCshell_MenuTickItem
  8034. shell_MenuTickItem( item_handle% )
  8035. shell_MenuTick( item_handle%, 1 )
  8036. $s!*|Stop PROCshell_MenuTickItem
  8037. $w$*|Start PROCshell_MenuUnTickItem
  8038. shell_MenuUnTickItem( item_handle% )
  8039. shell_MenuTick( item_handle%, 0 )
  8040. $~#*|Stop PROCshell_MenuUnTickItem
  8041. #*|Start PROCshell_MenuTickOnly1
  8042. shell_MenuTickOnly1( menu_handle%, pos% )
  8043.  "MenuUtil_TickOnly", menu_handle%, pos%
  8044. "*|Stop PROCshell_MenuTickOnly1
  8045. #*|Start PROCshell_MenuTickOnly2
  8046. shell_MenuTickOnly2(item_handle%)
  8047.  "MenuUtil_TickOnly",item_handle%
  8048. "*|Stop PROCshell_MenuTickOnly2
  8049. &*|Start PROCshell_MenuTickAllItems
  8050. shell_MenuTickAllItems( menu_handle% )
  8051. shell_MenuTick( menu_handle%, 
  8052. %*|Stop PROCshell_MenuTickAllItems
  8053. (*|Start PROCshell_MenuUntickAllItems
  8054. shell_MenuUntickAllItems( menu_handle% )
  8055. shell_MenuTick( menu_handle%, 
  8056. '*|Stop PROCshell_MenuUntickAllItems
  8057. *|Start PROCshell_MenuShade
  8058. shell_MenuShade( handle%, state% )
  8059.  "MenuUtil_Fade", handle%, state%
  8060. *|Stop PROCshell_MenuShade
  8061. '*|Start PROCshell_MenuShadeAllItems
  8062. shell_MenuShadeAllItems( menu_handle% )
  8063. shell_MenuShade( menu_handle%, 
  8064. &*|Stop PROCshell_MenuShadeAllItems
  8065. )*|Start PROCshell_MenuUnshadeAllItems
  8066. shell_MenuUnshadeAllItems( menu_handle% )
  8067. shell_MenuShade( menu_handle%, 
  8068. (*|Stop PROCshell_MenuUnshadeAllItems
  8069.  *|Start PROCshell_MenuDotted
  8070. shell_MenuDotted( item_handle%, state% )
  8071.  "MenuUtil_Dots",item_handle%,state%
  8072. *|Stop PROCshell_MenuDotted
  8073. !*|Start PROCshell_MenuColours
  8074. shell_MenuColours(item_handle%,fg%,bg%)
  8075.  "MenuUtil_Colours",item_handle%,fg%,bg%
  8076.  *|Stop PROCshell_MenuColours
  8077. "*|Start PROCshell_MenuWritable
  8078. shell_MenuWritable(item_handle%,state%,size%,valid$)
  8079.  "MenuUtil_Writable",item_handle%,state%,size%,valid$
  8080. !*|Stop PROCshell_MenuWritable
  8081. !*|Start PROCshell_MenuPutData
  8082. shell_MenuPutData(item_handle%,data$)
  8083.  "MenuUtil_Text",item_handle%,data$
  8084.  *|Stop PROCshell_MenuPutData
  8085. #*|Start PROCshell_MenuSortItems
  8086. shell_MenuSortItems( menu%, compFN$, asc%, start%, end% )
  8087.  nr_items%
  8088. 0nr_items% = 
  8089. shell_MenuGetNrItems(menu%) - 1
  8090. _shell_MS_handle% = menu%
  8091.  end% > nr_items% 
  8092.  end% = nr_items%
  8093.  compFN$ = "" 
  8094.    compFN$ = "_shell_MS_comp"
  8095.  "Hourglass_On"
  8096. shell_QuickSort( compFN$, "_shell_MS_swap", asc%, start%, end% )
  8097.  "Hourglass_Off"
  8098. "*|Stop PROCshell_MenuSortItems
  8099. "*|Start FNshell_MenuGetNrItems
  8100. shell_MenuGetNrItems(menu_handle%)
  8101.  menu%,result%,items%
  8102.  "MenuUtil_Info",menu_handle% 
  8103.  menu%
  8104. menu% += 28
  8105.   result% = (menu%?0 
  8106.  &80)
  8107.   items% += 1
  8108.   menu%  += 24
  8109.  result%
  8110. =items%
  8111. !*|Stop FNshell_MenuGetNrItems
  8112. #*|Start FNshell_MenuGetNrDotted
  8113. shell_MenuGetNrDotted(menu_handle%)
  8114.  menu%,result%,nr%
  8115.  "MenuUtil_Info",menu_handle% 
  8116.  menu%
  8117. menu% += 28
  8118.   result% = (menu%?0 
  8119.  &80)
  8120.  (menu%?0 
  8121.  nr% += 1
  8122.   menu% += 24
  8123.  result% = -1
  8124. "*|Stop FNshell_MenuGetNrDotted
  8125. &*|Start FNshell_MenuGetItemHandler
  8126. shell_MenuGetItemHandler(menu_handle%,item_nr%)
  8127.  m_sel_blk%,ptr%,handler$
  8128. ,m_sel_blk%    = 
  8129. shell_HeapBlockFetch(8)
  8130. m_sel_blk%!00 = item_nr%
  8131. m_sel_blk%!04 = -1
  8132.  "MenuUtil_Decode",menu_handle%,m_sel_blk% 
  8133.  ptr%
  8134.  ptr% = 0 
  8135.   handler$ = ""
  8136.   handler$ = $(ptr%)
  8137. shell_HeapBlockReturn(m_sel_blk%)
  8138. = handler$
  8139. %%%*|Stop FNshell_MenuGetItemHandler
  8140. %'#*|Start FNshell_MenuGetItemText
  8141. shell_MenuGetItemText( menu_handle%, item_nr% )
  8142.  m_sel_blk%,ptr%,text$
  8143. %*+m_sel_blk% = 
  8144. shell_HeapBlockFetch( 8 )
  8145. m_sel_blk%!00 = item_nr%
  8146. m_sel_blk%!04 = -1
  8147.  "MenuUtil_Decode", menu_handle%, m_sel_blk% 
  8148.  , , ptr%
  8149. text$ = $( ptr%!12 )
  8150. shell_HeapBlockReturn( m_sel_blk% )
  8151. = text$
  8152. %2"*|Stop FNshell_MenuGetItemText
  8153. %6%*|Start FNshell_MenuGetItemHandle
  8154. shell_MenuGetItemHandle( menu_handle%, selection_blk% )
  8155.  ptr%, item_handle%, flags%
  8156. %;&ptr% = 
  8157. shell_HeapBlockFetch( 40 )
  8158.  "XMenuUtil_Decode", menu_handle%, selection_blk% 
  8159.  , , ptr% ; flags%
  8160.  flags% 
  8161.   item_handle% = 0
  8162.   item_handle% = ptr%!08
  8163. shell_HeapBlockReturn( ptr% )
  8164. = item_handle%
  8165. %I$*|Stop FNshell_MenuGetItemHandle
  8166.  *|Start FNshell_MenuGetItemHandle
  8167.  DEF FNshell_MenuGetItemHandle( menu_handle%, item_nr% )
  8168.  LOCAL m_sel_blk%, ptr%, item_handle%
  8169.  m_sel_blk% = FNshell_HeapBlockFetch( 8 )
  8170.  ptr%       = FNshell_HeapBlockFetch( 40 )
  8171.  m_sel_blk%!00 = item_nr%
  8172.  m_sel_blk%!04 = -1
  8173.  SYS "MenuUtil_Decode", menu_handle%, m_sel_blk% TO , , ptr%
  8174.  item_handle% = ptr%!08
  8175.  PROCshell_HeapBlockReturn( m_sel_blk% )
  8176.  PROCshell_HeapBlockReturn( ptr% )
  8177.  = item_handle%
  8178.  *|Stop FNshell_MenuGetItemHandle
  8179. %c%*|Start FNshell_MenuGetItemHeight
  8180. shell_MenuGetItemHeight(menu_handle%)
  8181.  menu%
  8182.  "MenuUtil_Info",menu_handle% 
  8183.  menu%
  8184. = menu%!20
  8185. %i$*|Stop FNshell_MenuGetItemHeight
  8186. %k'*|Start FNshell_MenuCalculateHeight
  8187. shell_MenuCalculateHeight(menu_handle%)
  8188.  height%
  8189. %nXheight% = 
  8190. shell_MenuGetNrItems(menu_handle%)*
  8191. shell_MenuGetItemHeight(menu_handle%)
  8192. %o;= height% + (
  8193. shell_MenuGetNrDotted(menu_handle%) * 24)
  8194. %q&*|Stop FNshell_MenuCalculateHeight
  8195. %u *|Start PROCshell_MenuDelete
  8196. shell_MenuDelete( menu_handle%, recursive% )
  8197.  ptr%,list_size%,event_list%
  8198.  menu_handle% <> 0 
  8199. %{5  
  8200.  "XMenuUtil_Delete", menu_handle%, recursive%
  8201. %|9  
  8202.  list_size%  = FNshell_HeapBlockInfo( _U%!12 ) - 8
  8203.  event_list% = _U%!12
  8204.  REPEAT
  8205.    IF ( event_list%!( ptr% + 8 ) = menu_handle%) THEN
  8206.      event_list%!( ptr% + 8 ) = 0 :REM remove reference to menu handle (detach)
  8207.    ELSE
  8208.      ptr% += 48
  8209.    ENDIF
  8210.  UNTIL (ptr% >= list_size%)
  8211. shell_MenuList_DeleteMenu( menu_handle% )
  8212. *|Stop PROCshell_MenuDelete
  8213. "*|Start PROCshell_MenuOpenLast
  8214. shell_MenuOpenLast
  8215.  "XMenuUtil_Show", _m_Menu_HandleLastOpened%
  8216. !*|Stop PROCshell_MenuOpenLast
  8217. "*|Start PROCshell_MenuCloseAll
  8218. shell_MenuCloseAll
  8219.  "Wimp_CreateMenu", , -1
  8220. !*|Stop PROCshell_MenuCloseAll
  8221. $*|Start FNshell_MenuMakeFromFile
  8222. shell_MenuMakeFromFile( title$, menu_identifier$, menuselectFN$, file$ )
  8223.  menu_handle%, X%, string$, void%, nr_items%
  8224. shell_FileExists( file$ ) 
  8225.   X% = 
  8226. ( file$ )
  8227.   nr_items% = 0
  8228.     string$ = 
  8229. 1    
  8230.  string$ <> "" 
  8231.  string$, 1 ) <> "#" 
  8232.       nr_items% += 1
  8233.         
  8234. # X% = 0
  8235. J  menu_handle% = 
  8236. shell_MenuNew( title$, menu_identifier$, nr_items% )
  8237.     string$ = 
  8238. 1    
  8239.  string$ <> "" 
  8240.  string$, 1 ) <> "#" 
  8241. H      void% = 
  8242. shell_MenuAdd( menu_handle%, string$, menuselectFN$ )
  8243.         
  8244. = menu_handle%
  8245. #*|Stop FNshell_MenuMakeFromFile
  8246. )*|Start PROCshell_AttachColourSubMenu
  8247. shell_AttachColourSubMenu( item_handle%, menu_handle%, warn_FN$ )
  8248. shell_AttachSubMenu( item_handle%, menu_handle%, warn_FN$ )
  8249. (*|Stop PROCshell_AttachColourSubMenu
  8250.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8251.  Module MenuList
  8252.  -----------------------------------------------------------------------
  8253.  MenuList Handling Routines (version 1.02 21-Dec-95)
  8254.  This library contains routines that handle the 'menu identifier'
  8255.  associated with each menu created. An identifier is required by
  8256.  EvntEdit because the menu handles created by the MenuUtils module
  8257.  can be different each time the program runs (like window handles).
  8258.  -----------------------------------------------------------------------
  8259.  Structure of Data used in this module
  8260.  Public Methods Supported:
  8261.    FN_shell_MenuList_Init                 Initialises module
  8262.    FNshell_MenuList_GetSysHandle
  8263.    FNshell_MenuList_GetIdentifier
  8264.    PROCshell_MenuList_AddMenu
  8265.    PROCshell_MenuList_DeleteMenu
  8266.    PROCshell_MenuList_SaveList
  8267.  Private Methods Supported:
  8268.    PROCshell_MenuList_CreateNewList
  8269.    PROCshell_MenuList_DestroyList
  8270. "*|Start FN_shell_MenuList_Init
  8271. _shell_MenuList_Init
  8272.  constants
  8273. _c_MenuList_HeaderSize% = 4
  8274.  _c_MenuList_ListTerm%   = -1
  8275.  variables
  8276. _m_MenuList_DataBlk%   = -1
  8277. _m_MenuList_NrMenus%   = 0
  8278. !*|Stop FN_shell_MenuList_Init
  8279. )*|Start FNshell_MenuList_GetSysHandle
  8280. shell_MenuList_GetSysHandle( menu_identifier$ )
  8281.  ptr%, menu_handle%, list_entry_addr%
  8282.  _m_MenuList_DataBlk% <> -1 
  8283.   ptr% = 0
  8284.  _m_MenuList_DataBlk%!ptr% <> _c_MenuList_ListTerm%
  8285. 4    list_entry_addr% = _m_MenuList_DataBlk%!ptr%
  8286. |    
  8287.  PROCshell_Tracef0( "MenuList_GetSysHandle:menu_identifier$ = " + $( list_entry_addr% + _c_MenuList_HeaderSize% ) )
  8288. N    
  8289.  $( list_entry_addr% + _c_MenuList_HeaderSize% ) = menu_identifier$ 
  8290. *      menu_handle% = !list_entry_addr%
  8291. \      
  8292.  PROCshell_Tracef0( "MenuList_GetSysHandle:menu_handle% = " +STR$~menu_handle%  )
  8293.         
  8294.     ptr% += 4
  8295. = menu_handle%
  8296. (*|Stop FNshell_MenuList_GetSysHandle
  8297. **|Start FNshell_MenuList_GetIdentifier
  8298. shell_MenuList_GetIdentifier( menu_handle% )
  8299.  ptr%, menu_identifier$, list_entry_addr%
  8300.  _m_MenuList_DataBlk% <> -1 
  8301.   ptr% = 0
  8302.  _m_MenuList_DataBlk%!ptr% <> _c_MenuList_ListTerm%
  8303. 4    list_entry_addr% = _m_MenuList_DataBlk%!ptr%
  8304. -    
  8305.  list_entry_addr%!0 = menu_handle% 
  8306. L      menu_identifier$ = $( list_entry_addr% + _c_MenuList_HeaderSize% )
  8307.         
  8308.     ptr% += 4
  8309. = menu_identifier$
  8310. &$)*|Stop FNshell_MenuList_GetIdentifier
  8311. &(&*|Start PROCshell_MenuList_AddMenu
  8312. shell_MenuList_AddMenu( menu_handle%, menu_identifier$ )
  8313.  ptr%, list_entry_addr%
  8314.  _m_MenuList_DataBlk% = -1 
  8315. &.#  
  8316. shell_MenuList_CreateNewList
  8317. &0N  _m_MenuList_DataBlk% = 
  8318. shell_HeapBlockExtend( _m_MenuList_DataBlk%, 4 )
  8319. &3#ptr% = _m_MenuList_NrMenus% * 4
  8320. &4k_m_MenuList_DataBlk%!ptr% = 
  8321. shell_HeapBlockFetch( _c_MenuList_HeaderSize% + 
  8322. ( menu_identifier$) + 1 )
  8323. &50list_entry_addr% = _m_MenuList_DataBlk%!ptr%
  8324. &6%list_entry_addr%!0 = menu_handle%
  8325. &7F$( list_entry_addr% + _c_MenuList_HeaderSize% ) = menu_identifier$
  8326. _m_MenuList_NrMenus% += 1
  8327. &:M_m_MenuList_DataBlk%!( _m_MenuList_NrMenus% * 4 ) = _c_MenuList_ListTerm%
  8328. &>%*|Stop PROCshell_MenuList_AddMenu
  8329. &B)*|Start PROCshell_MenuList_DeleteMenu
  8330. shell_MenuList_DeleteMenu( menu_handle% )
  8331.  ptr%, list_entry_addr%
  8332.  _m_MenuList_NrMenus% > 0 
  8333. &I"  
  8334.  _m_MenuList_NrMenus% = 1 
  8335. &J#    
  8336. shell_MenuList_DestroyList
  8337.     ptr% = 0
  8338. &M=    
  8339.  _m_MenuList_DataBlk%!ptr% <> _c_MenuList_ListTerm%
  8340. &N6      list_entry_addr% = _m_MenuList_DataBlk%!ptr%
  8341. &O/      
  8342.  list_entry_addr%!0 = menu_handle% 
  8343. &P@        $( list_entry_addr% + _c_MenuList_HeaderSize% ) = ""
  8344. &Q"        list_entry_addr%!0 = 0
  8345.       
  8346.       ptr% += 4
  8347. &T        
  8348. &[(*|Stop PROCshell_MenuList_DeleteMenu
  8349. &_'*|Start PROCshell_MenuList_SaveList
  8350. shell_MenuList_SaveList( file_name$ )
  8351.  ptr%, menu_identifier$, list_entry_addr%, file_handle%
  8352.  _m_MenuList_DataBlk% <> -1 
  8353.   ptr% = 0
  8354. &f$  file_handle% = 
  8355. ( file_name$ )
  8356. &g;  
  8357.  _m_MenuList_DataBlk%!ptr% <> _c_MenuList_ListTerm%
  8358. &h4    list_entry_addr% = _m_MenuList_DataBlk%!ptr%
  8359. &iJ    menu_identifier$ = $( list_entry_addr% + _c_MenuList_HeaderSize% )
  8360. &j)    
  8361. # file_handle%, menu_identifier$
  8362.     ptr% += 4
  8363. &m?  
  8364. # file_handle%, "" : 
  8365.  terminate list with a null string
  8366. # file_handle%
  8367. &o+  
  8368. ( "SetType " + file_name$ + " FFF" )
  8369. &t&*|Stop PROCshell_MenuList_SaveList
  8370.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8371.  Private module routines
  8372.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8373. ,*|Start PROCshell_MenuList_CreateNewList
  8374. shell_MenuList_CreateNewList
  8375. shell_MenuList_DestroyList
  8376. 7_m_MenuList_DataBlk%   = 
  8377. shell_HeapBlockFetch( 8 )
  8378. 2_m_MenuList_DataBlk%!4 = _c_MenuList_ListTerm%
  8379. +*|Stop PROCshell_MenuList_CreateNewList
  8380. **|Start PROCshell_MenuList_DestroyList
  8381. shell_MenuList_DestroyList
  8382.  _m_MenuList_DataBlk% <> -1 
  8383. shell_HeapBlockReturn( _m_MenuList_DataBlk% )
  8384. !  _m_MenuList_DataBlk%   = -1
  8385.    _m_MenuList_NrMenus%   = 0
  8386. )*|Stop PROCshell_MenuList_DestroyList
  8387.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8388.  Module StaticList
  8389.  This module handles the static window list.
  8390.  Structure of StaticList
  8391.    +00 window handle
  8392.    ..
  8393.    +nn -1 terminator
  8394.  Public Methods Supported:
  8395.    _StaticList_Init           Initialises module
  8396.    StaticWindowListAddHandle  Add a window handle to the StaticList
  8397.    RemoveStaticWindowFromList Remove a window handle from the StaticList
  8398.    UpdateStaticWindowHandle   Updates a window handle in the StaticList
  8399.    IsWindowStatic             Returns TRUE if window handle is in StaticList
  8400.  Private Methods Supported:
  8401.    SearchStatic               Returns offset in the StaticList given a window handle
  8402. $*|Start FN_shell_StaticList_Init
  8403. _shell_StaticList_Init
  8404. G_StaticList_WList% = 0
  8405. #*|Stop FN_shell_StaticList_Init
  8406. /*|Start PROCshell_StaticWindowListAddHandle
  8407. shell_StaticWindowListAddHandle( handle% )
  8408.  offset%, ctr%, temp%
  8409.  G_StaticList_WList% = 0 
  8410.  empty list
  8411.  PROCshell_Tracef0( "StaticWindowListAddHandle:Creating new list" )
  8412.  PROCshell_Tracef0( "StaticWindowListAddHandle:Window handle is &" + STR$~handle% )
  8413. 6  G_StaticList_WList% = 
  8414. shell_HeapBlockFetch( 8 )
  8415. %  G_StaticList_WList%!0 = handle%
  8416.    G_StaticList_WList%!4 = -1
  8417.  search list for window handle
  8418.  PROCshell_Tracef0( "StaticWindowListAddHandle:Searching for window handle &" + STR$~handle% )
  8419. .  offset% = 
  8420. shell_SearchStatic( handle% )
  8421.  offset% = -1 
  8422. P    
  8423.  add window handle to static list, but first search for a window handle
  8424. 7    
  8425.  of 0 which denotes a deleted static window...
  8426. c    
  8427.  PROCshell_Tracef0( "StaticWindowListAddHandle:Not found - adding window handle to list" )
  8428. \    
  8429.  PROCshell_Tracef0( "StaticWindowListAddHandle:Window handle is &" + STR$~handle% )
  8430. *    offset% = 
  8431. shell_SearchStatic( 0 )
  8432.  offset% = -1 
  8433. 6      
  8434.  No deleted window found, so extend list...
  8435. Y      
  8436.  PROCshell_Tracef0( "StaticWindowListAddHandle:Extending window handle list" )
  8437.       ctr% = 0
  8438. +      
  8439.  G_StaticList_WList%!ctr% <> -1
  8440.         ctr% += 4
  8441.       
  8442. P      G_StaticList_WList% = 
  8443. shell_HeapBlockExtend( G_StaticList_WList%, 4 )
  8444. .      temp%   = G_StaticList_WList% + ctr%
  8445.       temp%!0 = handle%
  8446. 7      
  8447.  And add terminator to denote end of list...
  8448.       temp%!4 = -1
  8449.         
  8450. W      
  8451.  PROCshell_Tracef0( "StaticWindowListAddHandle:Found unused space in list" )
  8452. 1      temp%   = G_StaticList_WList% + offset%
  8453.       temp%!0 = handle%
  8454.         
  8455. .*|Stop PROCshell_StaticWindowListAddHandle
  8456. 0*|Start PROCshell_RemoveStaticWindowFromList
  8457. shell_RemoveStaticWindowFromList( window_handle% )
  8458.  offset%, ctr%, found%
  8459. found%  = 
  8460. ctr%    = 0
  8461.  G_StaticList_WList% > 0 
  8462. 5    
  8463.  G_StaticList_WList%!ctr% = window_handle% 
  8464.       found% = 
  8465. &      G_StaticList_WList%!ctr% = 0
  8466.         
  8467.     ctr% += 4
  8468.  G_StaticList_WList%!ctr% <> -1 
  8469.  found% = 
  8470. /*|Stop PROCshell_RemoveStaticWindowFromList
  8471. .*|Start PROCshell_UpdateStaticWindowHandle
  8472. shell_UpdateStaticWindowHandle( old_handle%, new_handle% )
  8473.  offset%
  8474.  PROCshell_Tracef0( "UpdateStaticWindowHandle:Correcting static window list.." )
  8475. 0offset% = 
  8476. shell_SearchStatic( old_handle% )
  8477. -G_StaticList_WList%!offset% = new_handle%
  8478. -*|Stop PROCshell_UpdateStaticWindowHandle
  8479.  *|Start FNshell_SearchStatic
  8480. shell_SearchStatic( handle% )
  8481.  search static window list by window handle
  8482.  found%,ctr%
  8483. found% = -1:ctr% = 0
  8484.  G_StaticList_WList% <> 0 
  8485.  G_StaticList_WList%!ctr% <> -1
  8486. .    
  8487.  G_StaticList_WList%!ctr% = handle% 
  8488.       found% = ctr%
  8489.         
  8490.     ctr% += 4
  8491. = found%
  8492. *|Stop FNshell_SearchStatic
  8493. "*|Start FNshell_IsWindowStatic
  8494. shell_IsWindowStatic( window_handle% )
  8495.  result%
  8496.  window_handle% 
  8497.  -1,-2
  8498.     result% = 
  8499.  _U%!20
  8500.     result% = 
  8501. '"6    
  8502. shell_SearchStatic( window_handle% ) > -1 
  8503.       result% = 
  8504. '$        
  8505.       result% = 
  8506. '&        
  8507. = result%
  8508. ')!*|Stop FNshell_IsWindowStatic
  8509.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8510.  Module DataLoad
  8511.  -----------------------------------------------------------------------
  8512.  DataLoad Handling Routines version 1.10 (07-Jan-96)
  8513.  -----------------------------------------------------------------------
  8514.  Structure of Data used in this module
  8515.  Public Methods Supported:
  8516.    PROCshell_AttachDataLoad
  8517.  Access routines for EvntShell (not to be called by the user application)
  8518.    FN_shell_DataLoad_Init
  8519.    FNDataLoad_GetAnchor
  8520.    PROCshell_EvntHandle_DataLoad
  8521.    PROCshell_ListDataLoad
  8522.  Private Methods Supported (not to be called outside this module)
  8523.    PROCDataLoad_ProcessDClickLoad
  8524.    PROCDataLoad_ProcessDragLoad
  8525.    PROCDataLoad_ProcessLoadRequest
  8526.    PROCDataLoad_CallUserFN
  8527.    FNDataLoad_CheckType
  8528.    FNDataLoad_OKToLoad
  8529. 'J"*|Start FN_shell_DataLoad_Init
  8530. _shell_DataLoad_Init
  8531.  Constants used by this module..
  8532. _c_DLoad_ICONBAR_ICON% = -1
  8533. _c_DLoad_RecSize%      = 24
  8534.  Variables used by this module..
  8535. 'Q#_m_DLoad_FileType%         = -1
  8536. 'R#_m_DLoad_FileName$         = ""
  8537. 'S#_m_DLoad_DestIconHandle%   = -1
  8538. 'T#_m_DLoad_DestWindowHandle% = -1
  8539. 'U#_m_DLoad_WindowName$       = ""
  8540.  Store the command line arguments  if any and set various flags..
  8541. 'X=_m_DLoad_CmdLineFileName$  = 
  8542. shell_OSReadCommandArg( 1 )
  8543.  _m_DLoad_CmdLineFileName$ <> "" 
  8544. 'Z#  _m_DLoad_LoadPending%     = 
  8545. '[N  _m_DLoad_CmdLineFileType% = 
  8546. shell_FileType( _m_DLoad_CmdLineFileName$ )
  8547. ']#  _m_DLoad_LoadPending%     = 
  8548. '^$  _m_DLoad_CmdLineFileType% = -1
  8549.  _m_DLoad_Anchor%  4
  8550.  _m_DLoad_DataBlk% 4
  8551. !_m_DLoad_Anchor%  = 0
  8552. !_m_DLoad_DataBlk% = 0
  8553. 'e#_EVNTS_DATALOAD_DATAOFFSET% = 0
  8554.  _m_DLoad_WORKBUFFER%       4
  8555. 'j!*|Stop FN_shell_DataLoad_Init
  8556. 'n *|Start FNDataLoad_GetAnchor
  8557. DataLoad_GetAnchor
  8558. = _m_DLoad_Anchor%
  8559. *|Stop FNDataLoad_GetAnchor
  8560. 'v$*|Start PROCshell_AttachDataLoad
  8561. shell_AttachDataLoad( window_handle%, icon_handle%, file_type%, fn$, no_load% )
  8562.  evnt_blk%, offset%, window_name$, data_offset_addr%, nr_evnts%
  8563.  filetype_list%, ctr%, user_fn_list%, pos_new_type%, evnt_filetype%
  8564.  PROCshell_Tracef0( "" )
  8565.  window_handle% = _IBAR_RIGHT% 
  8566.  window_handle% = _IBAR_LEFT%
  8567.  window_handle% < 0 
  8568.  _c_DLoad_ICONBAR_ICON% = icon_handle%
  8569.  no_load% 
  8570.  file_type% = file_type% 
  8571.  1 << 31
  8572.  file_type% = -1 
  8573.  no_load% = 
  8574. ?window_name$ = 
  8575. shell_GetWindowIdentifier( window_handle% )
  8576. offset%        = 
  8577. Evnts_GetEvntListOffset3( window_name$, icon_handle%, file_type%, _m_DLoad_Anchor%, _c_DLoad_RecSize%, 
  8578. &evnt_blk%      = !_m_DLoad_Anchor%
  8579.  nr_evnts%      = evnt_blk%!4
  8580. evnt_blk%      += offset%
  8581. !$evnt_blk%     = window_name$
  8582. !evnt_blk%!12   = icon_handle%
  8583. evnt_blk%!16   = file_type%
  8584.  !_m_DLoad_DataBlk% = 0 
  8585. @  !_m_DLoad_DataBlk% = 
  8586. shell_HeapBlockFetch( 
  8587. ( fn$ ) + 1 )
  8588. &data_offset_addr% = evnt_blk% + 20
  8589. Evnts_UpdateData( data_offset_addr%, _m_DLoad_DataBlk%, _m_DLoad_DataOffset%, fn$ )
  8590.  PROCshell_Tracef0("AttachDataLoad:cmdline        = " + _m_DLoad_CmdLineFileName$ )
  8591.  PROCshell_Tracef0("AttachDataLoad:window_handle% = &" + STR$~window_handle% )
  8592.  PROCshell_Tracef0("AttachDataLoad:file_type%     = &" + STR$~file_type% )
  8593.  Now check if program was started by double clicking on a data file - we do this now because
  8594.  the dataload event may not have been attached until after the program was started (possibly
  8595.  by a double click on a file icon). We only check this once when the first DataLoad event is
  8596.  attached, if the first event doesn't match then the event list will be checked on subsequent
  8597.  calls using the filename, filetype etc taken from the command line arguments (if any ) stored
  8598.  when the module was initialised..
  8599.  _m_DLoad_CmdLineFileName$ <> "" 
  8600.  _m_DLoad_LoadPending% 
  8601.  It was and the file hasn't been loaded up until now so check file is correct type,
  8602.  ignoring the top bit...
  8603.  file_type% 
  8604.  1 << 31 
  8605. -    evnt_filetype% = file_type% 
  8606.  1 << 31
  8607. #    evnt_filetype% = file_type%
  8608.  Filetype matches that of an attached event, so load it...
  8609.  _m_DLoad_CmdLineFileType% = evnt_filetype% 
  8610. b    
  8611.  PROCshell_Tracef0( "AttachDataLoad:Loading file '" + _m_DLoad_CmdLineFileName$ + "'.." )
  8612. \    
  8613.  Just to be really sure we'll check that the file is still available and no one has
  8614. P    
  8615.  deleted it in the meantime (real defensive programming at work here..)
  8616. :    
  8617. shell_FileExists( _m_DLoad_CmdLineFileName$ ) 
  8618. Q      
  8619. shell_MessageSendDataLoad( evnt_filetype%, _m_DLoad_CmdLineFileName$ )
  8620. a      
  8621.  Unset load pending flag so that file is only loaded once even if multiple events have
  8622. .      
  8623.  been attached for this filetype...
  8624. #      _m_DLoad_LoadPending% = 
  8625.         
  8626.  PROCshell_Tracef0( "" )
  8627. #*|Stop PROCshell_AttachDataLoad
  8628. )*|Start PROCshell_EvntHandle_DataLoad
  8629. shell_EvntHandle_DataLoad( message_blk%, DataOpen% )
  8630. 0_m_DLoad_FileType%         = message_blk%!40
  8631. 0_m_DLoad_DestWindowHandle% = message_blk%!20
  8632. 0_m_DLoad_DestIconHandle%   = message_blk%!24
  8633. F_m_DLoad_FileName$         = 
  8634. shell_GetString( message_blk% + 44 )
  8635. DataLoad_OKToLoad( DataOpen% ) 
  8636.  PROCshell_Tracef0( "EvntHandle_DataLoad:DataLoad message received" )
  8637.  DataOpen% 
  8638. #    
  8639. DataLoad_ProcessDClickLoad
  8640. W    _m_DLoad_WindowName$ = 
  8641. shell_GetWindowIdentifier( _m_DLoad_DestWindowHandle% )
  8642. !    
  8643. DataLoad_ProcessDragLoad
  8644. (*|Stop PROCshell_EvntHandle_DataLoad
  8645. **|Start PROCDataLoad_ProcessDClickLoad
  8646. DataLoad_ProcessDClickLoad
  8647.  offset%
  8648. soffset% = 
  8649. Evnts_GetEvntListOffset( "iconbar", _c_DLoad_ICONBAR_ICON%, _m_DLoad_Anchor%, _c_DLoad_RecSize%, 
  8650. DataLoad_ProcessLoadRequest
  8651. )*|Stop PROCDataLoad_ProcessDClickLoad
  8652. (*|Start PROCDataLoad_ProcessDragLoad
  8653. DataLoad_ProcessDragLoad
  8654.  offset%, dataload_blk_size%, converted_file_type%, ptr%
  8655. !evnt_blk% = !_m_DLoad_Anchor%
  8656. $dataload_blk_size% = evnt_blk%!0
  8657.  Check first for a 'load any file type' event...
  8658. offset% = 
  8659. Evnts_GetEvntListOffset3( _m_DLoad_WindowName$, _m_DLoad_DestIconHandle%, -1, _m_DLoad_Anchor%, _c_DLoad_RecSize%, 
  8660.  offset% = -1 
  8661.   offset% = 
  8662. Evnts_GetEvntListOffset3( _m_DLoad_WindowName$, _m_DLoad_DestIconHandle%, &FFFFFFFF 
  8663.  ( 1 << 31 ), _m_DLoad_Anchor%, _c_DLoad_RecSize%, 
  8664.  Now check for a dataload event attached to a specific window/icon
  8665.  pair..
  8666.  offset% = -1 
  8667.   offset% = 
  8668. Evnts_GetEvntListOffset3( _m_DLoad_WindowName$, _m_DLoad_DestIconHandle%, _m_DLoad_FileType%, _m_DLoad_Anchor%, _c_DLoad_RecSize%, 
  8669.  offset% < 0 
  8670. +    
  8671.  No event found, try window only..
  8672.     offset%   = 
  8673. Evnts_GetEvntListOffset3( _m_DLoad_WindowName$, -1, _m_DLoad_FileType%, _m_DLoad_Anchor%, _c_DLoad_RecSize%, 
  8674. %    evnt_blk% = !_m_DLoad_Anchor%
  8675.  offset% > -1 
  8676. DataLoad_ProcessLoadRequest
  8677. '*|Stop PROCDataLoad_ProcessDragLoad
  8678. +*|Start PROCDataLoad_ProcessLoadRequest
  8679. DataLoad_ProcessLoadRequest
  8680.  file_type%, converted_file_type%
  8681.  offset% > -1 
  8682. #  evnt_blk% = !_m_DLoad_Anchor%
  8683.   evnt_blk% += offset%
  8684.   file_type% = evnt_blk%!16
  8685. 7  converted_file_type% = file_type% 
  8686.  ( 1 << 31 )
  8687.  converted_file_type% = _m_DLoad_FileType% 
  8688.  file_type% = -1 
  8689. h    
  8690.  PROCshell_Tracef0( "DataLoad_ProcessLoadRequest:File type recognised (&" + STR$~_Q%!40 + ")" )
  8691.     Reference%=_Q%!12
  8692.     _Q%!12=_Q%!8
  8693.     _Q%!16=4
  8694. *    
  8695.  "Wimp_SendMessage",18,_Q%,_Q%!4
  8696.  _U%!100 
  8697.  1 << 1 
  8698.       loadloc% = -1
  8699. %      _U%!100  = _U%!100 
  8700.  1 << 1
  8701.         
  8702. <      loadloc% = 
  8703. shell_LoadFile( Reference% = _U%!108 )
  8704.         
  8705. O    
  8706. DataLoad_CallUserFN( loadloc%, _m_DLoad_FileType%, _Q%!36, evnt_blk% )
  8707. ( 2    
  8708.  return copy of datasave message block...
  8709.  _U%!156<>0 
  8710. (")      
  8711. shell_HeapBlockReturn(_U%!156)
  8712.       _U%!156=0
  8713. ($        
  8714. (&l    
  8715.  PROCshell_Tracef0( "DataLoad_ProcessLoadRequest:File type NOT recognised (&" + STR$~_Q%!40 + ")" )
  8716. (,**|Stop PROCDataLoad_ProcessLoadRequest
  8717. (0 *|Start FNDataLoad_CheckType
  8718. DataLoad_CheckType( type_list%, DataOpen% )
  8719.  Exclude directories, applications & unstamped files
  8720.  type_list% is address of heapblock holding a list
  8721.  of allowable filetypes terminated by -1..
  8722.  Ok%,ctr%,found%,temp%,topbit_load%, return_code%
  8723. (8#ctr%=0:found%=-1:topbit_load%=
  8724.  _U%!100 
  8725.  1<<1 
  8726.  _U%!100=_U%!100 
  8727.  1<<1
  8728.  type_list% = -1 
  8729.  type_list%!ctr%<>-1
  8730.   temp%=type_list%!ctr%
  8731.  temp% 
  8732.  1<<31 
  8733.     temp%=temp% 
  8734.  1<<31
  8735.     topbit_load%=
  8736.     topbit_load%=
  8737. (C"  
  8738.  temp%=_m_DLoad_FileType% 
  8739.     found%=ctr%
  8740.  topbit_load% 
  8741. (F       _U%!100=_U%!100 
  8742.  1<<1
  8743. (GM      
  8744.  PROCshell_Tracef0( "DataLoad_CheckType:Top Bit Load detected.." )
  8745. (H        
  8746.   ctr%+=4
  8747.  DataOpen% 
  8748.  ( _m_DLoad_FileType% >= &1000 ) 
  8749.  found%=-1
  8750.  IF found%>-1 THEN
  8751.    PROCshell_Tracef0( "DataLoad_CheckType:File type OK (&" + STR$~type_list%!found% + ")" )
  8752.  ELSE
  8753.    PROCshell_Tracef0( "DataLoad_CheckType:File type NOT ok (&"" + STR$~_m_DLoad_FileType% + ")" )
  8754.  ENDIF
  8755.  found%<>-1 
  8756.   return_code% = 
  8757.   return_code% = 
  8758. = return_code%
  8759. *|Stop FNDataLoad_CheckType
  8760. (]#*|Start PROCDataLoad_CallUserFN
  8761. DataLoad_CallUserFN( loadloc%, file_type%, _file_size%, evnt_blk% )
  8762.  void%, userfn_offset%, user_FN_name$, data_blk%
  8763.  The file has been loaded, or the 'no load' flag was set - in any event
  8764.  call the specified user function now...
  8765. (d"userfn_offset%  = evnt_blk%!20
  8766.  userfn_offset% > -1 
  8767. (g$  data_blk% = !_m_DLoad_DataBlk%
  8768. (h5  user_FN_name$ = $( data_blk% + userfn_offset% )
  8769.  ERROR 99,user_FN_name$
  8770.  user_FN_name$ <> "" 
  8771.  PROCshell_Tracef0( "UserFNLoadFile:About to call FN" + user_FN_name$ + "(" + STR$ loadloc% + "," + STR$ _m_DLoad_FileType% + ",_m_DLoad_FileName$," + STR$ _file_size% + ")" )
  8772. (lX    
  8773.  PROCshell_Tracef0( "UserFNLoadFile:filename is '" + _m_DLoad_FileName$ + "'" )
  8774.     void% = 
  8775. ("FN" + user_FN_name$ + "(" + 
  8776.  loadloc% + "," + 
  8777.  _m_DLoad_FileType% + "," + 
  8778. 34 + _m_DLoad_FileName$ + 
  8779. 34 + "," + 
  8780.  _file_size% + ")" )
  8781. (s"*|Stop PROCDataLoad_CallUserFN
  8782. *|Start FNDataLoad_OKToLoad
  8783. DataLoad_OKToLoad( DataOpen% )
  8784.  result%, var$, branch$
  8785.  Check to see if this application should open the file. If the DataLoad
  8786.  message was caused by double clicking on a file then check the application
  8787.  named in the Run$Type variable matches the application linked to the
  8788.  file, otherwise the file would be loaded by the wrong application on
  8789.  a double click in a Filer window..
  8790.  DataOpen% = 
  8791.  PROCshell_Tracef0( "DataLoad_OKToLoad:Message reason code was 3, normal drag load..")
  8792.   result% = 
  8793.  PROCshell_Tracef0("DataOpenOKToLoad:Message reason code was 5, double click load..")
  8794.  Read value of Alias$@RunType_xxx variable where xxx = filetype in hex..
  8795. N  var$ = 
  8796. shell_OSVarGetVal( "Alias$@RunType_" + 
  8797. ~_m_DLoad_FileType%, 1 )
  8798.  PROCshell_Tracef0( "DataLoad_OKToLoad:Alias$@RunType=" + var$ )
  8799.  Compare name of app that set up Alias$@RunType with running app - of
  8800.  course all apps have unique names don't they..
  8801. %  branch$ = 
  8802. shell_Branch( var$ )
  8803. shell_Leaf( branch$ ) = "!" + 
  8804. shell_GetAppName 
  8805.  result% = 
  8806.  result% = 
  8807. = result%
  8808. *|Stop FNDataLoad_OKToLoad
  8809. "*|Start PROCshell_ListDataLoad
  8810. shell_ListDataLoad
  8811.  evnt_list%, ptr%, nr_evnts%, ctr%, type_list%, user_FN_list%
  8812.  icon_handle%, loop%, debug_message$, no_load$
  8813. "evnt_list% = !_m_DLoad_Anchor%
  8814. nr_evnts%  = evnt_list%!4
  8815. Evnts_DebugListHeader ( "DataLoad ", "Window       Icon  Filetype NL LoadFN" )
  8816.  evnt_list% = 0  
  8817.    REM PROCshell_Tracef0( "No DataLoad Events found" )
  8818.  ELSE
  8819.    ptr% = _m_Evnts_HeaderSize%
  8820.    FOR loop% = 1 TO nr_evnts%
  8821.      window_name$  = $( evnt_list% + ptr% )
  8822.      icon_handle%  = evnt_list%!( ptr% + 12 )
  8823.      type_list%    = evnt_list%!( ptr% + 16 )
  8824.      user_FN_list% = evnt_list%!( ptr% + 20 )
  8825.      ctr% = 0
  8826.      
  8827.      WHILE type_list%!ctr% <> -1
  8828.        debug_message$ =   FNshell_StringPadTrailing( window_name$, ".", 12 )
  8829.        debug_message$ +=  " " + FNshell_StringPadLeading( STR$ icon_handle%, " ", 3 )
  8830.        curr_type% = type_list%!ctr%
  8831.        IF curr_type% AND 1 << 31 THEN
  8832.          no_load$ = " Y  "
  8833.          curr_type% = curr_type% EOR  1 << 31
  8834.        ELSE
  8835.          no_load$ = " N  "
  8836.        ENDIF
  8837.        debug_message$ += "     &" + STR$~( curr_type% ) + "  " + no_load$
  8838.        debug_message$ += $( user_FN_list%!ctr% )
  8839.        REM PROCshell_Tracef0( debug_message$ )
  8840.        ctr% += 4
  8841.      ENDWHILE
  8842.      ptr% += _c_DLoad_EVNT_REC_SIZE%
  8843.    NEXT loop%
  8844.  PROCshell_Tracef0(" ")
  8845. !*|Stop PROCshell_ListDataLoad
  8846.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8847.  Module DataSave
  8848.  -----------------------------------------------------------------------
  8849.  DataSave Handling Routines version 1.04 (05-Jan-96)
  8850.  -----------------------------------------------------------------------
  8851.  Structure of Data used in this module
  8852.  Public Methods Supported:
  8853.    PROCshell_AttachDataSave
  8854.  Access routines for EvntShell (not to be called by the user application)
  8855.    FN_shell_DataSave_Init
  8856.    FNshell_DataSaveDragInProgress
  8857.    PROCshell_DataSaveResetDragFlags
  8858.    PROCshell_EvntHandle_DataSaveStartDrag
  8859.    PROCshell_EvntHandle_DataSaveEndDrag
  8860.    PROCshell_ListDataSave
  8861.    PROCshell_AckDataLoad
  8862.  Private Methods Supported (not to be called outside this module)
  8863. "*|Start FN_shell_DataSave_Init
  8864. _shell_DataSave_Init
  8865.  Variables used by this module..
  8866.  _m_DSave_Anchor%   4
  8867.  _m_DSave_DataBlk%  4
  8868. !_m_DSave_Anchor%    = 0
  8869. !_m_DSave_DataBlk%   = 0
  8870. _m_DSave_DataOffset%   = 0
  8871. _m_DSave_WindowName$   = ""
  8872. _m_DSave_EvntOffset%   = -1
  8873. _m_DSave_EvntList%     = -1
  8874. _m_DSave_FileName$     = ""
  8875. _m_DSave_FullFileName$ = ""
  8876. _m_DSave_NameIcon%     = -1
  8877. _m_DSave_FileType%     = -1
  8878. _m_DSave_DataAddress%  = -1
  8879. _m_DSave_UserFN$       = ""
  8880. #_m_DSave_DestTaskHandle%   = -1
  8881. #_m_DSave_DestWindowHandle% = -1
  8882. #_m_DSave_DestIconHandle%   = -1
  8883. #_m_DSave_MouseXCoord%      = -1
  8884. #_m_DSave_MouseYCoord%      = -1
  8885. #_m_DSave_MessageMyRef%     = -1
  8886. '_m_DSave_DragASpriteInProgress% = 
  8887. '_m_DSave_DragInProgress%        = 
  8888.  Constants used by this module..
  8889. ._c_DSave_NotSpriteMess$     = "SHELLMSG29"
  8890. ._c_DSave_NoFileNameMess$    = "SHELLMSG28"
  8891. ._c_DSave_NotASpriteIcon$    = "SHELLMSG19"
  8892. ._c_DSave_NotAHeapBlockMess$ = "SHELLMSG21"
  8893. ._c_DSave_RecDiedMess$       = "SHELLMSG39"
  8894. !_c_DSave_ButtonTypeClick% = 6
  8895. #_c_DSave_DataSize%        = 100
  8896. "_c_DSave_RecSize%         = 32
  8897. !*|Stop FN_shell_DataSave_Init
  8898. ,*|Start PROCshell_DataSaveResetDragFlags
  8899. shell_DataSaveResetDragFlags
  8900. '_m_DSave_DragASpriteInProgress% = 
  8901. '_m_DSave_DragInProgress%        = 
  8902. )!+*|Stop PROCshell_DataSaveResetDragFlags
  8903. )%$*|Start PROCshell_AttachDataSave
  8904. shell_AttachDataSave( window_handle%, icon_handle%, data_address%, file_type%, name_icon%, user_FN$ )
  8905.  window_name$, offset%, evnt_blk%, nr_evnts%, data_offset_addr%
  8906.  check file icon is a sprite icon, complain otherwise..
  8907. shell_IconIsSprite( window_handle%, icon_handle% ) 
  8908. )+B  
  8909. shell_OK( 
  8910. shell_MessageNoArgs( _c_DSave_NotSpriteMess$ ) )
  8911.  change file type icon button type to click/drag..
  8912. shell_IconSetButtonType( window_handle%, icon_handle%, _c_DSave_ButtonTypeClick% )
  8913.  estimated size for datasave message - wild guess, but it doesn't matter..
  8914.  data_address% = 0 
  8915. )3(  data_address% = _c_DSave_DataSize%
  8916.  Store data in evnt block..
  8917. )7?window_name$ = 
  8918. shell_GetWindowIdentifier( window_handle% )
  8919. )8soffset%        = 
  8920. Evnts_GetEvntListOffset( window_name$, icon_handle%, _m_DSave_Anchor%, _c_DSave_RecSize%, 
  8921. )9&evnt_blk%      = !_m_DSave_Anchor%
  8922. ): nr_evnts%      = evnt_blk%!4
  8923. evnt_blk%      += offset%
  8924. )<!$evnt_blk%     = window_name$
  8925. )=!evnt_blk%!12   = icon_handle%
  8926. evnt_blk%!16   = file_type%
  8927. evnt_blk%!20   = name_icon%
  8928. )@"evnt_blk%!24   = data_address%
  8929.  And the FN name..
  8930.  !_m_DSave_DataBlk% = 0 
  8931. )DE  !_m_DSave_DataBlk% = 
  8932. shell_HeapBlockFetch( 
  8933. ( user_FN$ ) + 1 )
  8934. )F&data_offset_addr% = evnt_blk% + 28
  8935. Evnts_UpdateData( data_offset_addr%, _m_DSave_DataBlk%, _m_DSave_DataOffset%, user_FN$ )
  8936. )K#*|Stop PROCshell_AttachDataSave
  8937. )ON*|Start PROCshell_EvntHandle_DataSaveStartDrag                            
  8938. shell_EvntHandle_DataSaveStartDrag( window_handle%, icon_handle% )
  8939.  user_FN_offset%, data_list%
  8940. )S _m_DSave_DragInProgress% = 
  8941. )TG_m_DSave_WindowName$ = 
  8942. shell_GetWindowIdentifier( window_handle% )
  8943. _m_DSave_EvntOffset% = 
  8944. Evnts_GetEvntListOffset( _m_DSave_WindowName$, icon_handle%, _m_DSave_Anchor%, _c_DSave_RecSize%, 
  8945.  _m_DSave_EvntOffset% >= 0 
  8946. )XS  
  8947.  Evnt found for this window/icon, check all is OK before starting the drag..
  8948. )YF  _m_DSave_EvntList%    = !_m_DSave_Anchor% + _m_DSave_EvntOffset%
  8949. )Z3  _m_DSave_FileType%    = _m_DSave_EvntList%!16
  8950. )[3  _m_DSave_NameIcon%    = _m_DSave_EvntList%!20
  8951. )\3  _m_DSave_DataAddress% = _m_DSave_EvntList%!24
  8952. )]/  data_list%           = !_m_DSave_DataBlk%
  8953. )^2  user_FN_offset%      = _m_DSave_EvntList%!28
  8954. )_?  _m_DSave_UserFN$      = $( data_list% + user_FN_offset% )
  8955. )aC  
  8956.  Check if valid filename is present in the 'filename' icon..
  8957. )bT  _m_DSave_FileName$  = 
  8958. shell_IconGetData( window_handle%, _m_DSave_NameIcon% )
  8959. )c!  
  8960.  _m_DSave_FileName$ = "" 
  8961. )dE    
  8962. shell_OK( 
  8963. shell_MessageNoArgs( _c_DSave_NoFileNameMess$ ) )
  8964. )g!  
  8965.  All OK, begin icon drag..
  8966. )h"  _m_DSave_DragInProgress% = 
  8967. )i:  
  8968. shell_IconDragBox( window_handle%, icon_handle% )  
  8969. )n1*|Stop PROCshell_EvntHandle_DataSaveStartDrag
  8970. )r0*|Start PROCshell_EvntHandle_DataSaveEndDrag
  8971. shell_EvntHandle_DataSaveEndDrag
  8972.  pointer_blk%, msg_blk%, estimated_file_size%
  8973.  _m_DSave_DragInProgress% 
  8974. )w)  
  8975.  _m_DSave_DragASpriteInProgress% 
  8976.  "DragASprite_Stop"
  8977. )y+    _m_DSave_DragASpriteInProgress% = 
  8978. )z+    _m_DSave_DragInProgress%        = 
  8979. )}H  
  8980.  retrieve current position of pointer (window and icon over which
  8981. )~3  
  8982.  the drag event ended plus pointer position)
  8983. 0  pointer_blk% = 
  8984. shell_HeapBlockFetch( 30 )
  8985.  "Wimp_GetPointerInfo", , pointer_blk%
  8986. 2  _m_DSave_DestTaskHandle%   = pointer_blk%!04
  8987. 2  _m_DSave_DestWindowHandle% = pointer_blk%!12
  8988. 2  _m_DSave_DestIconHandle%   = pointer_blk%!16
  8989. 2  _m_DSave_MouseXCoord%      = pointer_blk%!00
  8990. 2  _m_DSave_MouseYCoord%      = pointer_blk%!04
  8991.  _m_DSave_DataAddress% > &8000 
  8992. P    estimated_file_size% = 
  8993. shell_HeapBlockInfo( _m_DSave_DataAddress% ) - 4
  8994. 4    estimated_file_size% = _m_DSave_DataAddress%
  8995. ,  msg_blk% = 
  8996. shell_HeapBlockFetch( 60 )
  8997. 8  msg_blk%!00 = 60        :
  8998.  length of message block
  8999. 4  msg_blk%!12 = 0         :
  9000.  myref 0=originating
  9001. /  msg_blk%!16 = 1         :
  9002.  message action
  9003. .  msg_blk%!20 = _m_DSave_DestWindowHandle%
  9004. ,  msg_blk%!24 = _m_DSave_DestIconHandle%
  9005. )  msg_blk%!28 = _m_DSave_MouseXCoord%
  9006. )  msg_blk%!32 = _m_DSave_MouseXCoord%
  9007. (  msg_blk%!36 = estimated_file_size%
  9008. &  msg_blk%!40 = _m_DSave_FileType%
  9009. <  $( msg_blk% + 44 ) = 
  9010. shell_Leaf( _m_DSave_FileName$ )
  9011.  "Wimp_SendMessage", 18, msg_blk%, _m_DSave_DestWindowHandle%, _m_DSave_DestIconHandle%
  9012. )  _m_DSave_MessageMyRef% = msg_blk%!8
  9013. shell_HeapBlockReturn( pointer_blk% )
  9014. shell_HeapBlockReturn( msg_blk% )
  9015. /*|Stop PROCshell_EvntHandle_DataSaveEndDrag
  9016. !*|Start PROCshell_DataSaveAck
  9017. shell_DataSaveAck( block% )
  9018.  your_ref%, void%
  9019. your_ref% = block%!12
  9020.  your_ref% = _m_DSave_MessageMyRef% 
  9021.  Our DataSave Message from the last fileicon drag has been acknowledged so
  9022.  we can go ahead and save the file..
  9023. >  _m_DSave_FullFileName$ = 
  9024. shell_GetString( block% + 44 )
  9025.  _m_DSave_UserFN$ <> "" 
  9026. _    void% = 
  9027. ( "FN" + _m_DSave_UserFN$ + "( " + 
  9028. 34 + _m_DSave_FullFileName$ + 
  9029. 34 + " )" )
  9030. S    
  9031.  no file saving routine specified for this event, so check if data is in a
  9032.  heapblock..
  9033. ;    
  9034. shell_HeapBlockExists( _m_DSave_DataAddress% ) 
  9035. I      
  9036.  default save routine, just save the whole heapblock to disk..
  9037.       
  9038.  "OS_File", 10, _m_DSave_FullFileName$, _m_DSave_FileType%, , _m_DSave_DataAddress%, _m_DSave_DataAddress% + 
  9039. shell_HeapBlockInfo( _m_DSave_DataAddress% ) + 1
  9040.         
  9041. <      
  9042.  Whoops! not a heapblock - someone's screwed up..
  9043. C      
  9044.  99, 
  9045. shell_MessageNoArgs( _c_DSave_NotAHeapBlockMess$ )
  9046.         
  9047.  block%!36 > -1 
  9048.  file is 'secure'..
  9049.     block%!16 = 3
  9050.     block%!00 = 256
  9051. .    block%!20 = _m_DSave_DestWindowHandle%
  9052. ,    block%!24 = _m_DSave_DestIconHandle%
  9053. &    block%!40 = _m_DSave_FileType%
  9054. ?    block%!36 = 
  9055. shell_FileLength( _m_DSave_FullFileName$ )
  9056.     block%!12 = block%!08
  9057. ;    $( block% + 44 ) =  _m_DSave_FullFileName$ + 
  9058. ( 0 )
  9059. !    
  9060.  send dataload message..
  9061. ^    
  9062.  "XWimp_SendMessage", 18, block%, _m_DSave_DestIconHandle%, _m_DSave_DestIconHandle%
  9063. .    
  9064.  and store my_ref from this message..
  9065. *    _m_DSave_MessageMyRef% = block%!08
  9066. T    
  9067.  now close window that save originated from if it is not a 'dynamic' dbox..
  9068. H    
  9069. Evnts_GetLastWindowClicked <> 
  9070. shell_GetDynamicWindowHandle 
  9071. A      
  9072.  PROCshell_CloseWindow( FNEvnts_GetLastWindowClicked )
  9073.         
  9074. shell_MenuCloseAll
  9075. shell_PrintSave( _m_DSave_FullFileName$, _m_DSave_DestWindowHandle%, _m_DSave_DestIconHandle%, block%!8, _m_DSave_FileType% )
  9076.  _U%!336 > 0 
  9077.       _U%!336 -= 1
  9078. (      
  9079. shell_DoSendPrintSave( &FFF )
  9080.         
  9081.  *|Stop PROCshell_DataSaveAck
  9082. "*|Start PROCshell_ListDataSave
  9083. shell_ListDataSave
  9084. !*|Stop PROCshell_ListDataSave
  9085. "*|Start PROCDataSave_SaveEvnts
  9086. DataSave_SaveEvnts( file_handle% )
  9087. !*|Stop PROCDataSave_SaveEvnts
  9088. !*|Start PROCshell_AckDataLoad
  9089. shell_AckDataLoad( _Q% )
  9090.  _Q%!12 <> _m_DSave_MessageMyRef% 
  9091.  VDU 7
  9092.  ERROR 99,STR$(_Q%!12)+":"+STR$_m_DSave_MessageMyRef%
  9093.    REM Reference hasn't been updated,
  9094.    REM therefore the Wimp returned my call
  9095.    REM The receiver didn't understand scrap transfer
  9096.    SYS "XOS_File", 6, "<Wimp$Scrap>"
  9097.    ERROR 255, FNshell_MessageNoArgs( _c_DSave_RecDiedMess$ )
  9098.  *|Stop PROCshell_AckDataLoad
  9099. **|Start FNshell_DataSaveDragInProgress
  9100. shell_DataSaveDragInProgress
  9101. = _m_DSave_DragInProgress%
  9102. )*|Stop FNshell_DataSaveDragInProgress
  9103.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9104.  Module Sliders
  9105.  -----------------------------------------------------------------------
  9106.  Slider Icon Event Handling Routines (version 1.07 19-Feb-96)
  9107.  -----------------------------------------------------------------------
  9108.  Structure of Slider Event Block
  9109.  Each Event...
  9110.   +00 window name
  9111.   +12 icon handle of slider icon
  9112.   +16 icon handle of background icon
  9113.   +20 icon handle of value display icon (-1 if none)
  9114.   +24 icon handle of bump up icon       (-1 if none)
  9115.   +28 icon handle of bump down icon     (-1 if none)
  9116.   +32 offset in data block to FN name to call on value change (-1 if none)
  9117.   +36 slider value
  9118.  Public Methods Supported:
  9119.    FN_Sliders_Init               Initialises module
  9120.    PROCshell_SliderSetValue      Sets the specified slider to the given value
  9121.    FNshell_SliderGetValue        Reads the value of the slider
  9122.    FNshell_SliderGetHandle       Reads the slider handle attached to a window/icon
  9123.    FNshell_AttachSliderHandler   Attaches a slider handler
  9124.  Responses to events raised by other modules
  9125.    PROCshell_HandleSlider        Called from mouseclick routines
  9126.    PROCshell_Slider              Called during null poll event to drag slider bar
  9127.    PROCshell_SliderDragEnd
  9128.    FNshell_SliderDragInProgress
  9129.  Private Methods Supported:
  9130.    FN_Sliders_Bump
  9131.    FN_Sliders_Drag
  9132.    FN_Sliders_BackgroundClick
  9133. *1!*|Start FN_shell_Sliders_Init
  9134. _shell_Sliders_Init
  9135.  Define Constants
  9136.  Define Variables
  9137. *7(_m_Sliders_CurrentSliderHandle% = -1
  9138. *8"_m_Sliders_DragInProgess%  = 
  9139. *9#_m_Sliders_LastXPos%       = -1
  9140. *:#_m_Sliders_LastYPos%       = -1
  9141. *;#_m_Sliders_SliderIcon%     = -1
  9142. *<#_m_Sliders_MaxLength%      = -1
  9143. *=#_m_Sliders_MaxHeight%      = -1
  9144. *>#_m_Slider_NotifyFN$        = ""
  9145. *?#_m_Slider_CurrentValue%    = -1
  9146.  Define Storage
  9147.  _m_Sliders_IconBlk% 50
  9148.  _m_Sliders_DragBlk% 50
  9149.  _m_Sliders_MPtrBlk% 20
  9150.  _m_Sliders_WorkBlk% 50
  9151. *|extract FN_Sliders_Bump
  9152. *|extract FN_Sliders_Drag
  9153. *K!*|extract FN_Sliders_BarClick
  9154. *L(*|extract FN_Sliders_BackgroundClick
  9155. *N *|Stop FN_shell_Sliders_Init
  9156. *R$*|Start PROCshell_SliderSetValue
  9157. shell_SliderSetValue( slider_handle%, _value% )
  9158.  evnt_blk%, evnt_blk%, slider_icon%, backgr_icon%, display_icon%
  9159.  window_handle_list%, window_identifier$, icon_blk%, bi_min_x%, bi_min_y%
  9160.  bi_max_x%, bi_max_y%, new_max_x%, void%, window_identifier$
  9161.  notify_FN$, evnt_data_blk%, current_value%, background_icon_height%
  9162.  background_icon_width%
  9163.  First check for an invalid slider handle..
  9164.  slider_handle% < 0 
  9165. *]'evnt_blk% = !_EVNTS_SLIDERS_ANCHOR%
  9166. evnt_blk% += slider_handle%
  9167. *_!slider_icon%   = evnt_blk%!12
  9168. *`!backgr_icon%   = evnt_blk%!16
  9169. *a!display_icon%  = evnt_blk%!20
  9170. *b!current_value% = evnt_blk%!36
  9171. *e$window_identifier$  = $evnt_blk%
  9172. *fLwindow_handle_list% = 
  9173. shell_GetWindowHandleList( window_identifier$ )  
  9174. *g)window_handle% = !window_handle_list%
  9175.  window_handle% <= 0 
  9176. *j,  window_handle% = window_handle_list%!4
  9177. *ku  
  9178.  ERROR 99,"Bad window handle found for window '" + window_identifier$ + "' - handle was " + STR$window_handle%
  9179. *n+_m_Sliders_IconBlk%!00 = window_handle%
  9180. *o)_m_Sliders_IconBlk%!04 = backgr_icon%
  9181.  "Wimp_GetIconState", , _m_Sliders_IconBlk%
  9182. *q&max_x%    = _m_Sliders_IconBlk%!16
  9183. *r&min_x%    = _m_Sliders_IconBlk%!08
  9184. *s&min_y%    = _m_Sliders_IconBlk%!12
  9185. *t&max_y%    = _m_Sliders_IconBlk%!20
  9186. *v7background_icon_height% = 
  9187. ( min_y% ) - 
  9188. ( max_y% )
  9189. *w-background_icon_width%  = max_x% - min_x%
  9190. *y)_m_Sliders_IconBlk%!04 = slider_icon%
  9191.  "Wimp_GetIconState", , _m_Sliders_IconBlk%
  9192.  "Wimp_DeleteIcon", , _m_Sliders_IconBlk%
  9193. *}+_m_Sliders_IconBlk%!04 = window_handle%
  9194.  _value% > 100 
  9195.  _value% = 100
  9196.  _value% <= 0 
  9197.   _value% = 0
  9198.  background_icon_width% > background_icon_height% 
  9199. 6    _m_Sliders_IconBlk%!16 = _m_Sliders_IconBlk%!8
  9200. 8     _m_Sliders_IconBlk%!20 = _m_Sliders_IconBlk%!12
  9201.  background_icon_width% > background_icon_height% 
  9202. i    _m_Sliders_IconBlk%!16 = min_x% + ( max_x% * ( _value% / 100 ) ) - ( min_x% * ( _value% / 100 ) )
  9203. i    _m_Sliders_IconBlk%!20 = min_y% + ( max_y% * ( _value% / 100 ) ) - ( min_y% * ( _value% / 100 ) )
  9204. evnt_blk%!36 = _value%
  9205.  "Wimp_CreateIcon", , _m_Sliders_IconBlk% + 4
  9206.  "Wimp_ForceRedraw", window_handle%, min_x%, min_y%, max_x%, max_y%
  9207. *evnt_data_blk% = !_EVNTS_SLIDERS_DATA%
  9208.  evnt_data_blk% > 0 
  9209. 5  notify_FN$ = $( evnt_data_blk% + evnt_blk%!32 )
  9210.  notify_FN$ <> "" 
  9211. <  void% = 
  9212. ( "FN" + notify_FN$ + "(" + 
  9213.  _value% + ")" )
  9214.  display_icon% >= 0 
  9215. shell_IconPutData( window_handle%, display_icon%, 
  9216. ( _value% ), 
  9217.          
  9218. #*|Stop PROCshell_SliderSetValue
  9219. #*|Start FNshell_SliderGetHandle
  9220. shell_SliderGetHandle( window_handle%, icon_handle% )
  9221.  window_name$, evnt_blk%, offset%, slider_handle%
  9222. ?window_name$ = 
  9223. shell_GetWindowIdentifier( window_handle% )
  9224. *evnt_blk%    = !_EVNTS_SLIDERS_ANCHOR%
  9225. yoffset% = 
  9226. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_SLIDERS_ANCHOR%, _EVNTS_SLIDERS_REC_SIZE%, 
  9227.  offset% < 0 
  9228.   slider_handle% = -1
  9229.   slider_handle% = offset%
  9230. = slider_handle%
  9231. "*|Stop FNshell_SliderGetHandle
  9232. '*|Start FNshell_AttachSliderHandler
  9233. shell_AttachSliderHandler( window_handle%, backgic%, slideric%, dispic%, incric%, decric%, notify_fn$ )
  9234.  e_blk%,offset%, window_name$, evnt_blk%, data_offset_addr%
  9235. ?window_name$ = 
  9236. shell_GetWindowIdentifier( window_handle% )
  9237.  PROCshell_Tracef0( "AttachSliderHandler:Attaching slider event to icon " + STR$~slideric% + " in window '" + window_name$ + "'" )
  9238. voffset% = 
  9239. Evnts_GetEvntListOffset( window_name$, slideric%, _EVNTS_SLIDERS_ANCHOR%, _EVNTS_SLIDERS_REC_SIZE%, 
  9240. 'evnt_blk% = !_EVNTS_SLIDERS_ANCHOR%
  9241. evnt_blk% += offset%
  9242. $evnt_blk%   = window_name$
  9243. evnt_blk%!12 = slideric%
  9244. evnt_blk%!16 = backgic%
  9245. evnt_blk%!20 = dispic%
  9246. evnt_blk%!24 = incric%
  9247. evnt_blk%!28 = decric%
  9248. evnt_blk%!36 = -1
  9249.  !_EVNTS_SLIDERS_DATA% = 0 
  9250. 8  !_EVNTS_SLIDERS_DATA% = 
  9251. shell_HeapBlockFetch( 1 )
  9252. &data_offset_addr% = evnt_blk% + 32
  9253. Evnts_UpdateData( data_offset_addr%, _EVNTS_SLIDERS_DATA%, _EVNTS_SLIDERS_DATAOFFSET%, notify_fn$ )
  9254.  attach click select routines to slider and background..
  9255. shell_AttachClickSelect( window_handle%, slideric%, "_Sliders_BarClick" )        :
  9256.  _shell_icondrag
  9257. shell_AttachClickSelect( window_handle%, backgic%,  "_Sliders_BackgroundClick" ) :
  9258.  _Sliders_Drag
  9259.  attach click select routines for bump icons (if present)
  9260.  incric% >= 0 
  9261. shell_AttachBumpHandler( window_handle%, dispic%, incric%, decric%, 0, 100, 1, 
  9262. , "_Sliders_Bump", "" )
  9263. = offset%
  9264. &*|Stop FNshell_AttachSliderHandler
  9265. *|Start FN_Sliders_Bump
  9266. _Sliders_Bump( value%, mouse_button% )
  9267.  window_handle%, icon_handle%, evnt_blk%, evnt_ptr%, nr_events%, evnt_blk_size%
  9268.  found%, slider_handle%, window_name$, incr_icon%, decr_icon%
  9269. 0window_handle% = 
  9270. shell_GetLastWindowClicked
  9271. .icon_handle%   = 
  9272. shell_GetLastIconClicked
  9273. Awindow_name$   = 
  9274. shell_GetWindowIdentifier( window_handle% )
  9275. ,evnt_blk%      = !_EVNTS_SLIDERS_ANCHOR%
  9276.  evnt_blk_size% = evnt_blk%!0
  9277.  nr_events%     = evnt_blk%!4
  9278. )evnt_ptr%      = _m_Evnts_HeaderSize%
  9279. found% = 
  9280.  scan for bump icon handles in slider event block
  9281. /  incr_icon% = evnt_blk%!( evnt_ptr% + 24 )
  9282. /  decr_icon% = evnt_blk%!( evnt_ptr% + 28 )
  9283.  window_name$ = $( evnt_blk% + evnt_ptr% ) 
  9284. A    
  9285.  incr_icon% = icon_handle% 
  9286.  decr_icon% = icon_handle% 
  9287.       found% = 
  9288. $      slider_handle% = evnt_ptr%
  9289.         
  9290. +  evnt_ptr% += _EVNTS_SLIDERS_REC_SIZE%
  9291.  evnt_ptr% >= evnt_blk_size% 
  9292.  found%
  9293.  found% 
  9294. shell_SliderSetValue( slider_handle%, value% )
  9295. ( value% )
  9296. *|Stop FN_Sliders_Bump
  9297. "*|Start PROCshell_HandleSlider
  9298. shell_HandleSlider( window_handle%, icon_handle% )
  9299.  window_name$, evnt_blk%, background_icon%, display_icon%
  9300.  evnt_ptr%, notify_FN$, evnt_data_blk%, current_value%, offset%
  9301. Awindow_name$   = 
  9302. shell_GetWindowIdentifier( window_handle% )
  9303. 'evnt_blk% = !_EVNTS_SLIDERS_ANCHOR%
  9304. yoffset% = 
  9305. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_SLIDERS_ANCHOR%, _EVNTS_SLIDERS_REC_SIZE%, 
  9306.  offset% = -1 
  9307.  maybe click was on background icon, so check icon_handle% + 1 which would
  9308.  be the slider bar...
  9309.   icon_handle% += 1
  9310. {  offset% = 
  9311. Evnts_GetEvntListOffset( window_name$, icon_handle%, _EVNTS_SLIDERS_ANCHOR%, _EVNTS_SLIDERS_REC_SIZE%, 
  9312. -_m_Sliders_CurrentSliderHandle% = offset%
  9313.  offset% > -1 
  9314. %  evnt_ptr% = evnt_blk% + offset%
  9315. ,  background_icon% = !( evnt_ptr% + 16 )
  9316. ,  display_icon%    = !( evnt_ptr% + 20 )
  9317. ,  current_value%   = !( evnt_ptr% + 36 )
  9318. ,  evnt_data_blk% = !_EVNTS_SLIDERS_DATA%
  9319.  evnt_data_blk% > 0 
  9320. 7    notify_FN$ = $( evnt_data_blk% + evnt_ptr%!32 )
  9321. +",  _m_Sliders_DragBlk%!0 = window_handle%
  9322. +#.  _m_Sliders_DragBlk%!4 = background_icon%
  9323. +$3  
  9324.  "Wimp_GetIconState", , _m_Sliders_DragBlk%
  9325. +&O  _m_Sliders_MaxLength%    = _m_Sliders_DragBlk%!16 - _m_Sliders_DragBlk%!8
  9326. +'P  _m_Sliders_MaxHeight%    = _m_Sliders_DragBlk%!20 - _m_Sliders_DragBlk%!12
  9327. +(-  _m_Sliders_SliderIcon%   = icon_handle%
  9328. +).  _m_Sliders_DisplayIcon%  = display_icon%
  9329. +*+  _m_Slider_NotifyFN$      = notify_FN$
  9330. ++/  _m_Slider_CurrentValue%  = current_value%
  9331. +--  _m_Sliders_DragBlk%!00 = window_handle%
  9332. +.5  
  9333.  "Wimp_GetWindowState", , _m_Sliders_DragBlk%
  9334. +/:  x% = _m_Sliders_DragBlk%!04 - _m_Sliders_DragBlk%!20
  9335. +0:  y% = _m_Sliders_DragBlk%!16 - _m_Sliders_DragBlk%!24
  9336. +1+  _m_Sliders_DragBlk%!04 = icon_handle%
  9337. +23  
  9338.  "Wimp_GetIconState", , _m_Sliders_DragBlk%
  9339. +3.  _m_Sliders_DragBlk%!04  = 7 :
  9340.  drag type
  9341. +4"  _m_Sliders_DragBlk%!08 += x%
  9342. +5"  _m_Sliders_DragBlk%!12 += y%
  9343. +6"  _m_Sliders_DragBlk%!16 += x%
  9344. +7"  _m_Sliders_DragBlk%!20 += y%
  9345. +86  _m_Sliders_DragBlk%!24  = _m_Sliders_DragBlk%!08
  9346. +96  _m_Sliders_DragBlk%!28  = _m_Sliders_DragBlk%!12
  9347. +;7  
  9348.  _m_Sliders_MaxLength% > _m_Sliders_MaxHeight% 
  9349. +<P    _m_Sliders_DragBlk%!32  = _m_Sliders_DragBlk%!24 + _m_Sliders_MaxLength%
  9350. +=8    _m_Sliders_DragBlk%!36  = _m_Sliders_DragBlk%!20
  9351. +?P    _m_Sliders_DragBlk%!32  = _m_Sliders_DragBlk%!24 + _m_Sliders_MaxLength%
  9352. +@P    _m_Sliders_DragBlk%!36  = _m_Sliders_DragBlk%!28 + _m_Sliders_MaxHeight%
  9353. +C.  
  9354.  "Wimp_DragBox", , _m_Sliders_DragBlk%
  9355. +E#  _m_Sliders_DragInProgess% = 
  9356. +K!*|Stop PROCshell_HandleSlider
  9357. *|Start PROCshell_Slider
  9358. shell_Slider
  9359.  window_handle%, xp%, x%, blk%, void%, yp%, y%
  9360.  "Wimp_GetPointerInfo", , _m_Sliders_MPtrBlk%
  9361. +S+window_handle% = _m_Sliders_MPtrBlk%!12
  9362. xp% = !_m_Sliders_MPtrBlk%
  9363. yp% = _m_Sliders_MPtrBlk%!4
  9364.  xp% <> _m_Sliders_LastXPos% 
  9365.  yp% <> _m_Sliders_LastYPos% 
  9366.  value has changed..
  9367. +Y   _m_Sliders_LastXPos% = xp%
  9368. +Z   _m_Sliders_LastYPos% = yp%
  9369. +[!  blk%  = _m_Sliders_WorkBlk%
  9370.   !blk% = window_handle%
  9371. +]$  
  9372.  "Wimp_GetWindowState",,blk%
  9373.   x% = xp% - blk%!4
  9374.   y% = yp% - blk%!16
  9375. +`%  blk%!4 = _m_Sliders_SliderIcon%
  9376. +a"  
  9377.  "Wimp_GetIconState",,blk%
  9378. +b   
  9379.  "Wimp_DeleteIcon",,blk%
  9380.   blk%!04 = window_handle%
  9381. +e7  
  9382.  _m_Sliders_MaxLength% > _m_Sliders_MaxHeight% 
  9383.     blk%!16 = x%
  9384. +g&    
  9385.  "Wimp_CreateIcon",,blk% + 4
  9386. +hb    
  9387.  "Wimp_ForceRedraw",window_handle%,blk%!8,blk%!12,blk%!8 + _m_Sliders_MaxLength%,blk%!20
  9388. +iB    _value% = ( ( x% - blk%!8 ) * 100) / _m_Sliders_MaxLength%
  9389. +jI    
  9390. shell_SliderSetValue( _m_Sliders_CurrentSliderHandle%, _value% )
  9391.     blk%!20 = y%
  9392. +m&    
  9393.  "Wimp_CreateIcon",,blk% + 4
  9394. +nz    
  9395.  "Wimp_ForceRedraw",window_handle%,blk%!8,blk%!12,blk%!8 + _m_Sliders_MaxLength%,blk%!20 + _m_Sliders_MaxHeight%
  9396. +oC    _value% = ( ( y% - blk%!12 ) * 100) / _m_Sliders_MaxHeight%
  9397. +r#  
  9398.  _m_Slider_NotifyFN$ <> "" 
  9399. +sE    void% = 
  9400. ("FN" + _m_Slider_NotifyFN$ + "(" + 
  9401.  _value% + ")")
  9402. +w   _m_Sliders_LastXPos% = xp%
  9403. *|Stop PROCshell_Slider
  9404. "*|Start FNshell_SliderGetValue
  9405. shell_SliderGetValue( slider_handle% )
  9406.  evnt_blk%, current_value%
  9407. 'evnt_blk% = !_EVNTS_SLIDERS_ANCHOR%
  9408. evnt_blk% += slider_handle%
  9409. "current_value%  = evnt_blk%!36
  9410. = current_value%
  9411. !*|Stop FNshell_SliderGetValue
  9412. &*|Start FN_Sliders_BackgroundClick
  9413. _Sliders_BackgroundClick( window_handle%, icon_handle% )
  9414.  void%
  9415. :void% = 
  9416. _Sliders_Drag( window_handle%, icon_handle% )
  9417. %*|Stop FN_Sliders_BackgroundClick
  9418. *|Start FN_Sliders_Drag
  9419. _Sliders_Drag( window_handle%, icon_handle% )
  9420.  evnt_blk%, nr_events%, rec_size%, ptr%, window_name$
  9421.  found%, evnt_blk_size%, slider_handle%, display_icon% 
  9422. (evnt_blk%  = !_EVNTS_SLIDERS_ANCHOR%
  9423. )rec_size%  = _EVNTS_SLIDERS_REC_SIZE%
  9424.  evnt_blk_size% = evnt_blk%!0
  9425. nr_events% = evnt_blk%!4
  9426. ptr% = _m_Evnts_HeaderSize%
  9427. ?window_name$ = 
  9428. shell_GetWindowIdentifier( window_handle% )
  9429. found% = 
  9430.  $( evnt_blk% + ptr% ) = window_name$ 
  9431. ?    
  9432.  scan for background icon handle in slider event block
  9433. 2    
  9434.  evnt_blk%!( ptr% + 16 ) = icon_handle% 
  9435.       found% = 
  9436. 2      slideric%      = evnt_blk%!( ptr% + 12 )
  9437. 2      display_icon%  = evnt_blk%!( ptr% + 20 )
  9438.       slider_handle% = ptr%
  9439.         
  9440.   ptr% += rec_size%
  9441.  ptr% >= evnt_blk_size% 
  9442.  found%
  9443. shell_IconDragBox( window_handle%, slideric% )
  9444.  display_icon% <> -1 
  9445. shell_Slider
  9446. *|Stop FN_Sliders_Drag
  9447. (*|Start FNshell_SliderDragInProgress
  9448. shell_SliderDragInProgress
  9449. = _m_Sliders_DragInProgess%
  9450. '*|Stop FNshell_SliderDragInProgress
  9451. #*|Start PROCshell_SliderDragEnd
  9452. shell_SliderDragEnd
  9453. !_m_Sliders_DragInProgess% = 
  9454. "*|Stop PROCshell_SliderDragEnd
  9455. *|Start FN_Sliders_BarClick
  9456. _Sliders_BarClick( wh%, ih% )
  9457. shell_IconDragBox( wh%, ih% )
  9458. *|Stop FN_Sliders_BarClick
  9459.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9460.  Module Errors
  9461.  -----------------------------------------------------------------------
  9462.  Errors Handling Routines
  9463.  -----------------------------------------------------------------------
  9464.  Structure of Data used in this module
  9465.  Public Methods Supported:
  9466.    FN_shell_Errors_Init                 Initialises module
  9467.    PROCshell_Error
  9468.    PROCshell_FatalError
  9469.    PROCshell_ErrorBox
  9470.    PROCshell_OK
  9471.  Private Methods Supported:
  9472.       None
  9473.  *|Start FN_shell_Errors_Init
  9474. _shell_Errors_Init
  9475.  Error numbers
  9476. _ERRNR_NONFATAL = &D00
  9477. _ERRNR_CLAIMMEM = &903
  9478.  _ERRORS_ERR_BLK% 256
  9479. *|Stop FN_shell_Errors_Init
  9480. *|Start PROCshell_Error
  9481. shell_Error
  9482.  pos%,report$
  9483.  "XHourglass_Smash"
  9484.  <> _ERRNR_NONFATAL 
  9485.  <> _ERRNR_CLAIMMEM 
  9486.  unexpected (possibly fatal) error - if bit 31 of ERR is set then
  9487.  error is 'address exception' etc..
  9488.  1 << 31) 
  9489. shell_FatalError
  9490. shell_OSCheckVersion(3) 
  9491. shell_FileExists("Resources:$.Resources.Edit.ThrowBack") 
  9492. /    
  9493.  Set up system variable for !ThrowBack
  9494. ,    A    
  9495. ("Set Basic$File <" + 
  9496. shell_GetAppName + "$BasicFile>")
  9497. T    
  9498.  Following line aborts existing program, but only if !ThrowBack is running,
  9499. %    
  9500.  so normally not a problem..
  9501.  "Edit:ThrowBack"
  9502. shell_ErrorBox("Unexpected error:- " + 
  9503. $ + " (Internal error code " + 
  9504.  + ")")
  9505.  Non-fatal error from shell_OK, or out of memory error from heap
  9506.  manager routines....
  9507.   report$ = 
  9508.  Strip out name of library file if present..
  9509. 4  pos% = 
  9510. $,"in " + 
  9511. 34 + "EvntShell:ShellLib")
  9512.  pos% > 0 
  9513.  report$ = 
  9514. $,pos% - 1)
  9515. 5  report$ += " (Internal error code " + 
  9516.  + ")"
  9517. shell_ErrorBox(report$)
  9518. shell_DataSaveResetDragFlags
  9519. *|Stop PROCshell_Error
  9520. *|Start PROCshell_OK
  9521. shell_OK(e$)
  9522.  Cause an non-fatal error to display message and return control
  9523.  to wimp poll loop
  9524.  _ERRNR_NONFATAL,e$
  9525. *|Stop PROCshell_OK
  9526. ,6 *|Start PROCshell_FatalError
  9527. shell_FatalError
  9528.  "XHourglass_Smash"
  9529.  An error has occurred that makes it impossible to continue, so tidy
  9530.  up as much as possible and end the program.
  9531. shell_OSCheckVersion(3) 
  9532. shell_FileExists("Resources:$.Resources.Edit.ThrowBack") 
  9533. ,@#  
  9534.  1 << 31) 
  9535. shell_Exit
  9536. ,B-  
  9537.  Set up system variable for !ThrowBack
  9538. ,C?  
  9539. ("Set Basic$File <" + 
  9540. shell_GetAppName + "$BasicFile>")
  9541. ,EP  
  9542.  chaining another program has the effect of ending the current program...
  9543.  "Edit:ThrowBack"
  9544. ,JQ  
  9545. shell_ErrorBox("Unexpected error:- " + 
  9546. $ + " Internal error code " + 
  9547. *|Stop PROCshell_FatalError
  9548. *|Start PROCshell_ErrorBox
  9549. shell_ErrorBox(r$)
  9550. !_ERRORS_ERR_BLK% = 
  9551. ,Z'$(_ERRORS_ERR_BLK% + 4) = r$ + 
  9552.  = _ERRNR_NONFATAL 
  9553.  = _ERRNR_CLAIMMEM 
  9554. ,^`  
  9555.  "XWimp_ReportError", _ERRORS_ERR_BLK%, %10001, "Message from " + 
  9556. shell_GetAppName 
  9557. ,bI  
  9558.  "XWimp_ReportError", _ERRORS_ERR_BLK%, 1, 
  9559. shell_GetAppName 
  9560. *|Stop PROCshell_ErrorBox
  9561.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9562.  Module WindowList
  9563.  This module handles the window list which is created when the templates
  9564.  are loaded.
  9565.  Structure of WindowList
  9566.    +00 nr of templates in this list
  9567.    +04 windowlist data repeated for each window loaded
  9568.  Structure of windowlist data
  9569.    +00 ptr to window definition block
  9570.    +04 window identifier string (&0D terminated)
  9571.    +16 ptr to a heapblock containing a list of window handles for this template (-1 terminated)
  9572.  Public Methods Supported:
  9573.    TemplatesInit                Load data from template file and create windowlist
  9574.    WindowLoaded                 Returns TRUE if window has been loaded in this windowlist
  9575.    UpdateWindowHandleList       Updates a stored window handle
  9576.    WindowListAddHandle          Adds a window handle to the windowlist
  9577.    GetWB                        Returns ptr to window definition block given a window name
  9578.    FNshell_GetWindowIdentifier  Returns a window name given a window handle
  9579.    RemoveHandleFromWindowList   Removes a window handle from the windowlist
  9580.    PROCshell_WindowListPrint            Sends debug data to ShellDBug
  9581.    PROCshell_CreateWindowStatic
  9582.    FNshell_GetWindowHandleList    Returns address of window handle list given a window name
  9583.    FNshell_WindowHandleKnown      Return TRUE if window handle is belongs to the current task
  9584.    FNshell_GetNrTemplatesLoaded   Returns nr of templates in this windowlist
  9585.  Private Methods Supported:
  9586.    GetWindowListOffset        Returns offset in the windowlist given a window name
  9587.    WindowListGetAddr          Returns address of windowlist structure
  9588. $*|Start FN_shell_WindowList_Init
  9589. _shell_WindowList_Init
  9590. #*|Stop FN_shell_WindowList_Init
  9591. #*|Start PROCshell_TemplatesInit
  9592. shell_TemplatesInit( templatefile_name$, 
  9593.  window_list_handle% )
  9594.  TemplatePtr%, IndirectPtr%, IndirectEnd%, buff_size%
  9595.  filelen%, pos%, name_buffer%, name$, nr_templates%, flgs%, result%
  9596.  nr_of_icons%, templ_list_ptr%
  9597. /name_buffer%  = 
  9598. shell_HeapBlockFetch( 12 )
  9599. pos%          = 0
  9600. nr_templates% = 0
  9601. ;filelen%      = 
  9602. shell_FileLength( templatefile_name$ )
  9603.  Reserve space for window definitions
  9604. 4TemplateBlk% = 
  9605. shell_HeapBlockFetch( filelen% )
  9606. TemplatePtr% = TemplateBlk%
  9607. shell_TemplateFileInfo( templatefile_name$, buff_size%, nr_templates%, result% )
  9608.  result% = 0 
  9609.  Reserve a block to hold window identifiers (12 bytes) plus address of
  9610.  window block (4 bytes), plus addr of window handle list (4 bytes)
  9611. O  window_list_buffer% = 
  9612. shell_HeapBlockFetch( 4 + ( 20 * nr_templates% ) )
  9613. !  _U%!4 = window_list_buffer%
  9614.  Reserve space for indirected icon data (size of largest window definition
  9615.  plus all of the indirected data)..
  9616. 9  IndirectBlk%  = 
  9617. shell_HeapBlockFetch( buff_size% )
  9618. "  IndirectPtr%  = IndirectBlk%
  9619. /  IndirectEnd%  = IndirectBlk% + buff_size%
  9620.   nr_templates%   = 0
  9621.   templ_list_ptr% = 4
  9622.  "XWimp_OpenTemplate", , templatefile_name$ 
  9623.  ;flgs%
  9624.  ( flgs% 
  9625.  1 ) 
  9626. <    
  9627.  An error has occurred opening the template file...
  9628. R    
  9629. shell_MessageTwoArgs( "SHELLMSG34", "template", templatefile_name$ )
  9630.         
  9631.       $name_buffer% = "*"
  9632.       
  9633.  "Wimp_LoadTemplate", , TemplatePtr%, IndirectPtr%, IndirectEnd%, _U%!232, name_buffer%, pos% 
  9634.  ,,IndirectPtr%,,,name$,pos%
  9635.       
  9636.  pos% <> 0 
  9637. I        window_list_buffer%!templ_list_ptr%            = TemplatePtr%
  9638. B        $(window_list_buffer% + templ_list_ptr% + 04 ) = name$
  9639. ?        window_list_buffer%!( templ_list_ptr%   + 16)  = -1
  9640. !        templ_list_ptr% += 20
  9641. N        
  9642.  PROCshell_Tracef0( "TemplatesInit:  Template Loaded: " + name$ )
  9643. 5        nr_of_icons%   = ( TemplatePtr%!84 ) * 32
  9644. 2        TemplatePtr%  += ( 88 + nr_of_icons% )
  9645.         nr_templates% += 1
  9646.       
  9647.  pos% = 0
  9648.  "Wimp_CloseTemplate"
  9649.     _U%!0 = nr_templates%
  9650.  PROCshell_Tracef0("TemplatesInit:Templates resource file loaded at       &"+STR$~TemplateBlk%+" ("+STR$ nr_templates%+" templates)")
  9651. f    
  9652.  PROCshell_Tracef0("TemplatesInit:Indirected buffer size used for loading &"+STR$~buff_size%)
  9653.  result% 
  9654.      
  9655.  File does not exist...
  9656. W    
  9657. shell_MessageTwoArgs( "SHELLMSG35", "template", templatefile_name$ )
  9658. 3    
  9659.  File exists but is not a template file...
  9660. W    
  9661. shell_MessageTwoArgs( "SHELLMSG36", templatefile_name$, "template" )
  9662. shell_HeapBlockReturn( name_buffer% )
  9663. window_list_handle%  = 0
  9664. (!window_list_buffer% = nr_templates%
  9665. "*|Stop PROCshell_TemplatesInit
  9666.  *|Start FNshell_WindowLoaded
  9667. shell_WindowLoaded( win_identifier$ )
  9668.  offset%, loaded%
  9669. ;offset% = 
  9670. shell_GetWindowListOffset( win_identifier$ )
  9671.  offset% >= 0 
  9672.  loaded% = 
  9673.  loaded% = 
  9674. = loaded%
  9675. *|Stop FNshell_WindowLoaded
  9676. '*|Start FNshell_GetWindowListOffset
  9677. shell_GetWindowListOffset( win_identifier$ )
  9678.  Searches the window list block and returns an offset to the chunk
  9679.  pertaining to the given identifier. Returns -1 if identifier not
  9680.  found...
  9681.  offset%, nr_templates%, window_list%, ctr%
  9682. ( win_identifier$ ) > 11 
  9683. shell_MessageOneArg( "SHELLMSG02", win_identifier$ )
  9684. /nr_templates% = 
  9685. shell_GetNrTemplatesLoaded
  9686. 0window_list%  = 
  9687. shell_WindowListGetAddr + 4
  9688. ctr%          = 0
  9689. offset%       = -1
  9690.  $( ( ( window_list% ) + ( 20 * ctr% ) ) + 4 ) = win_identifier$ 
  9691.     offset% = ctr% * 20
  9692.   ctr% += 1
  9693.  offset% <> -1 
  9694.  ctr% > ( nr_templates% - 1 )
  9695. = offset%
  9696. &*|Stop FNshell_GetWindowListOffset
  9697. *|Start FNshell_GetWB
  9698. shell_GetWB( win_identifier$ )
  9699.  offset%, window_block%, window_list%
  9700. @offset%      = 
  9701. shell_GetWindowListOffset( win_identifier$ )
  9702.  offset% < 0 
  9703.  99, win_identifier$+":"+
  9704.  offset%
  9705. /window_list% = 
  9706. shell_WindowListGetAddr + 4
  9707.  offset% >= 0 
  9708. *  window_block% = window_list%!offset%
  9709. shell_MessageOneArg( "SHELLMSG03", win_identifier$ )
  9710. = window_block%
  9711. *|Stop FNshell_GetWB
  9712. '*|Start FNshell_GetWindowHandleList
  9713. shell_GetWindowHandleList( win_identifier$ )
  9714.  offset%, window_handle_list%, window_list%
  9715. -    @offset%      = 
  9716. shell_GetWindowListOffset( win_identifier$ )
  9717. /window_list% = 
  9718. shell_WindowListGetAddr + 4
  9719.  offset% >= 0 
  9720. <  window_handle_list% = !( window_list% + offset% + 16 )
  9721. shell_MessageOneArg( "SHELLMSG03", win_identifier$ )
  9722. = window_handle_list%
  9723. &*|Stop FNshell_GetWindowHandleList
  9724. (*|Start PROCshell_CreateWindowStatic
  9725. shell_CreateWindowStatic( win_identifier$, 
  9726.  window_handle% )
  9727.  wb_ptr%
  9728.  Retrieve the window block from the window list...
  9729. -wb_ptr% = 
  9730. shell_GetWB( win_identifier$ )
  9731.  PROCshell_Tracef0( "DEBUG::" + STR$ wb_ptr% )
  9732.  set 'sprite area' pointer to usersprites area
  9733. wb_ptr%!64 = _U%!16
  9734.  And create the window...
  9735.  "Wimp_CreateWindow",,wb_ptr% 
  9736.  window_handle%
  9737.  PROCshell_Tracef0( "DEBUG::" + STR$ window_handle% )
  9738. shell_StaticWindowListAddHandle( window_handle% )
  9739.  Now update the window list block to include the handle of
  9740.  the newly created window...
  9741. shell_WindowListAddHandle( win_identifier$, window_handle% )
  9742. -%'*|Stop PROCshell_CreateWindowStatic
  9743. -))*|Start PROCshell_WindowListAddHandle
  9744.  Given a window handle update the window handle lists...
  9745. shell_WindowListAddHandle( win_identifier$, window_handle% )
  9746.  window_list_offset%, window_list_addr%, ptr%, placed%
  9747.  window_list%
  9748.  win_identifier$ = "" 
  9749.  99,"Bad window name passed to WindowListAddHandle"
  9750. -1Lwindow_list_offset% = 
  9751. shell_GetWindowListOffset( win_identifier$ ) + 16
  9752. -2Lwindow_list_addr%   = 
  9753. shell_WindowListGetAddr + 4 + window_list_offset%
  9754.  !window_list_addr% = -1 
  9755. -6A  
  9756.  No existing window list for this window, so create one...
  9757. -7d  
  9758.  PROCshell_Tracef0( "DEBUG::Creating window handle list for window '" + win_identifier$+"'" )
  9759. -8N  
  9760.  PROCshell_Tracef0( "DEBUG::Window handle is &" + STR$~window_handle% )
  9761. -95  !window_list_addr% = 
  9762. shell_HeapBlockFetch( 8 )
  9763.   ptr% = !window_list_addr%
  9764.   ptr%!00 = window_handle%
  9765.   ptr%!04 = -1
  9766. -@Y  
  9767.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9768. -BV  
  9769.  If a list of window handles for this window identifier already exists, scan it
  9770. -CV  
  9771.  for a deleted window handle (0) and if found insert the new one in its place..
  9772. -EY  
  9773.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9774. -G$  
  9775.  window_list_addr%!16 <> -1 
  9776. -H0    window_handle_list% = !window_list_addr%
  9777.     ptr% = 0
  9778.     placed% = 
  9779. -K)    
  9780.  window_handle_list%!ptr% <> -1
  9781. -L*      
  9782.  window_handle_list%!ptr% = 0 
  9783. -M6        window_handle_list%!ptr%  = window_handle%
  9784.         placed% = 
  9785.       
  9786.       ptr% += 4
  9787. -Q        
  9788. -TY  
  9789.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9790. -VU  
  9791.  If no deleted window handle has been found in the window handle list for this
  9792. -WE  
  9793.  template extend the heapblock and add the handle to the end..
  9794. -YY  
  9795.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9796.  placed% = 
  9797. -\g    
  9798.  PROCshell_Tracef0( "DEBUG::Extending window handle list for window '" + win_identifier$+"'" )
  9799. -]P    
  9800.  PROCshell_Tracef0( "DEBUG::Window handle is &" + STR$ window_handle% )
  9801. -^L    !window_list_addr% = 
  9802. shell_HeapBlockExtend( !window_list_addr%, 4 )
  9803. -_)    window_list% = !window_list_addr%
  9804.     ptr% = 0
  9805. -a"    
  9806.  window_list%!ptr% <> -1
  9807.       ptr% += 4
  9808. -c        
  9809. -d2    window_list%!( ptr% + 0 ) = window_handle%
  9810. -e&    window_list%!( ptr% + 4 ) = -1
  9811. -j(*|Stop PROCshell_WindowListAddHandle
  9812. -n'*|Start FNshell_GetWindowIdentifier
  9813. shell_GetWindowIdentifier( handle% )
  9814.  window_list_addr%, nr_templates%, ptr%, ctr%, window_identifiers$
  9815. -q5nr_templates%       = 
  9816. shell_GetNrTemplatesLoaded
  9817. -r6window_list_addr%   = 
  9818. shell_WindowListGetAddr + 4
  9819. window_identifiers$ = ""
  9820.  handle% 
  9821.  -1, -2
  9822. -w'    window_identifiers$ = "iconbar"
  9823. -z        
  9824. -{&    
  9825.  window_list_addr%!16 <> -1 
  9826. -|4      window_handle_list% = window_list_addr%!16
  9827.       ptr% = 0
  9828. -~+      
  9829.  window_handle_list%!ptr% <> -1
  9830. b       
  9831.  window_handle_list%!ptr% = handle% 
  9832.  window_identifiers$ = $( window_list_addr% + 4 )
  9833.         ptr% += 4
  9834.       
  9835.         
  9836.     ctr% += 1
  9837.     window_list_addr% += 20
  9838.  window_identifiers$ <> "" 
  9839.  ctr% = nr_templates%
  9840.  Not all windows will be created by the application (i.e. Colour Picker dialog), so not all
  9841.  handles will appear in the window list - check for null returns instead..
  9842.  IF window_identifiers$ = "" THEN ERROR 99,FNshell_MessageOneArg( "SHELLMSG38", STR$~handle% )
  9843. = window_identifiers$
  9844. &*|Stop FNshell_GetWindowIdentifier
  9845. 0*|Start PROCshell_RemoveHandleFromWindowList
  9846. shell_RemoveHandleFromWindowList( handle% )
  9847.  window_list_addr%, nr_templates%, I%, ptr%
  9848. /nr_templates% = 
  9849. shell_GetNrTemplatesLoaded
  9850. 4window_list_addr% = 
  9851. shell_WindowListGetAddr + 4
  9852.  I% = 1 
  9853.  nr_templates%
  9854.  window_list_addr%!16 <> -1 
  9855. 2    window_handle_list% = window_list_addr%!16
  9856.     ptr% = 0
  9857. )    
  9858.  window_handle_list%!ptr% <> -1
  9859. 0      
  9860.  window_handle_list%!ptr% = handle% 
  9861. )        window_handle_list%!ptr%  = 0
  9862.       
  9863.       ptr% += 4
  9864.         
  9865.   window_list_addr% += 20
  9866. /*|Stop PROCshell_RemoveHandleFromWindowList
  9867. ,*|Start PROCshell_UpdateWindowHandleList
  9868. shell_UpdateWindowHandleList( old_handle%, new_handle% )
  9869.  window_list_addr%, nr_templates%, I%, ptr%
  9870. /nr_templates% = 
  9871. shell_GetNrTemplatesLoaded
  9872. 4window_list_addr% = 
  9873. shell_WindowListGetAddr + 4
  9874.  I% = 1 
  9875.  nr_templates%
  9876.  window_list_addr%!16 <> -1 
  9877. 2    window_handle_list% = window_list_addr%!16
  9878.     ptr% = 0
  9879. )    
  9880.  window_handle_list%!ptr% <> -1
  9881. \      
  9882.  window_handle_list%!ptr% = old_handle% 
  9883.  window_handle_list%!ptr%  = new_handle%
  9884.       ptr% += 4
  9885.         
  9886.   window_list_addr% += 20
  9887. +*|Stop PROCshell_UpdateWindowHandleList
  9888. (*|Start FNshell_GetNrTemplatesLoaded
  9889. shell_GetNrTemplatesLoaded
  9890.  window_list_addr%
  9891. 0window_list_addr% = 
  9892. shell_WindowListGetAddr
  9893. = !window_list_addr%
  9894. '*|Stop FNshell_GetNrTemplatesLoaded
  9895. %*|Start FNshell_WindowListGetAddr
  9896. shell_WindowListGetAddr
  9897. = _U%!4
  9898. $*|Stop FNshell_WindowListGetAddr
  9899. %*|Start FNshell_WindowHandleKnown
  9900. shell_WindowHandleKnown( window_handle% )
  9901.  result%, window_list_addr%, found%, I%, nr_templates%, handle%
  9902.  ptr%
  9903.  window_handle% = 
  9904. shell_GetDynamicWindowHandle 
  9905.   result% = 
  9906.  result% = 
  9907. 1  nr_templates% = 
  9908. shell_GetNrTemplatesLoaded
  9909. 6  window_list_addr% = 
  9910. shell_WindowListGetAddr + 4
  9911.  I% = 1 
  9912.  nr_templates%
  9913. &    
  9914.  window_list_addr%!16 <> -1 
  9915. 4      window_handle_list% = window_list_addr%!16
  9916.       ptr% = 0
  9917. +      
  9918.  window_handle_list%!ptr% <> -1
  9919. .        handle% = window_handle_list%!ptr%
  9920. (        
  9921.  handle% = window_handle% 
  9922.           found% = 
  9923.           result% = 
  9924.         
  9925.         ptr% += 4
  9926.       
  9927.         
  9928.     window_list_addr% += 20
  9929. = result%
  9930. $*|Stop FNshell_WindowHandleKnown
  9931. %*|Start PROCshell_WindowListPrint
  9932. shell_WindowListPrint
  9933.  window_list_addr%, nr_templates%, I%, ptr%
  9934. /nr_templates% = 
  9935. shell_GetNrTemplatesLoaded
  9936. shell_TraceOn
  9937. 4window_list_addr% = 
  9938. shell_WindowListGetAddr + 4
  9939.  PROCshell_Tracef0( "" )
  9940.  PROCshell_Tracef0( "Current Window List (" + STR$(nr_templates%) + " templates)")
  9941.  PROCshell_Tracef0( "-----------------------------------------" )
  9942.  I% = 1 
  9943.  nr_templates%
  9944.  PROCshell_Tracef0( $(window_list_addr% + 4) + ":" )
  9945.  window_list_addr%!16 = -1 
  9946. G    
  9947.  PROCshell_Tracef0( "No windows defined for this identifier" )
  9948. 2    window_handle_list% = window_list_addr%!16
  9949.     ptr% = 0
  9950. )    
  9951.  window_handle_list%!ptr% <> -1
  9952. U      
  9953.  PROCshell_Tracef0( "  window handle &" + STR$~(window_handle_list%!ptr%))
  9954.       ptr% += 4
  9955.         
  9956.   window_list_addr% += 20
  9957.  PROCshell_TraceOff
  9958. $*|Stop PROCshell_WindowListPrint
  9959.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9960.  Module Strings
  9961.  -----------------------------------------------------------------------
  9962.  String Handling Routines
  9963.  -----------------------------------------------------------------------
  9964.  Structure of Data used in this module
  9965.  Public Methods Supported:
  9966.    FN_shell_Strings_Init                 Initialises module
  9967.    FNshell_GetString
  9968.    FNshell_GetZeroTerminatedString
  9969.    FNshell_StringStripTrailing
  9970.    FNshell_StringStripLeading
  9971.    FNshell_StringStripAll
  9972.    FNshell_StringPadTrailing
  9973.    FNshell_StringPadLeading
  9974.    FNshell_StringUpperCase
  9975.    FNshell_StringExchange
  9976.    FNshell_StringArrayGetLongest
  9977.    FNmem_to_string
  9978.  Private Methods Supported:
  9979.       None
  9980. .,!*|Start FN_shell_Strings_Init
  9981. _shell_Strings_Init
  9982. ./ *|Stop FN_shell_Strings_Init
  9983. .3+*|Start FNshell_GetZeroTerminatedString
  9984. shell_GetZeroTerminatedString( address% )
  9985.  Given an address, read a zero terminated string. Technique from
  9986.  Risc User Volume 8 Issue 7 Page 45 (Alan Wrigley).
  9987.  string$
  9988.  Write 0 bytes of string$ to the screen. This has the side effect
  9989.  the string is returned terminated by ASC 13 in r0.
  9990.  "WriteN", address%, 0 
  9991.  string$
  9992. = string$
  9993. .A**|Stop FNshell_GetZeroTerminatedString
  9994. *|Start FNshell_GetString
  9995. shell_GetString( Address% )
  9996.  String$, Len%
  9997.  ( ( Address%?Len% ) > 31 
  9998.  Len% < 255 )
  9999. .J"  String$ += 
  10000. (Address%?Len% )
  10001.   Len% += 1
  10002. = String$
  10003. *|Stop FNshell_GetString
  10004. .T'*|Start FNshell_StringStripTrailing
  10005. shell_StringStripTrailing(string$,char$)
  10006. string$,1) = char$
  10007. .W(  string$ = 
  10008. string$,
  10009. (string$) - 1)
  10010. = string$
  10011. .[&*|Stop FNshell_StringStripTrailing
  10012. ._&*|Start FNshell_StringStripLeading
  10013. shell_StringStripLeading(string$,char$)
  10014. string$,1) = char$
  10015.   string$ = 
  10016. string$,2)
  10017. = string$
  10018. .f%*|Stop FNshell_StringStripLeading
  10019. .j"*|Start FNshell_StringStripAll
  10020. shell_StringStripAll(string$,char$)
  10021.  done,pos
  10022. done=
  10023.   pos=
  10024. string$,char$)
  10025.  pos 
  10026.     done=
  10027. .r/    string$=
  10028. string$,pos-1)+
  10029. string$,pos+1)
  10030.     done=
  10031.  done
  10032. =string$
  10033. .y!*|Stop FNshell_StringStripAll
  10034. .}%*|Start FNshell_StringPadTrailing
  10035. shell_StringPadTrailing(string$,char$,length%)
  10036. (string$) < length%
  10037. 6  string$ = string$ + 
  10038. length% - 
  10039. (string$),char$)
  10040. = string$
  10041. $*|Stop FNshell_StringPadTrailing
  10042. $*|Start FNshell_StringPadLeading
  10043. shell_StringPadLeading( string$, char$, length% )
  10044. (string$) < length%
  10045. ;  string$ = 
  10046.  length% - 
  10047. ( string$ ), char$ ) + string$
  10048. = string$
  10049. #*|Stop FNshell_StringPadLeading
  10050. #*|Start FNshell_StringUpperCase
  10051. shell_StringUpperCase(string$)
  10052.  loop%
  10053. (string$) > 0 
  10054.  loop% = 1 
  10055. (string$)
  10056. string$,loop%,1)>="a" 
  10057. string$,loop%,1)<="z" 
  10058. :     
  10059. string$,loop%,1) = 
  10060. string$,loop%,1)) 
  10061.  &DF)
  10062.  loop%
  10063. = string$
  10064. "*|Stop FNshell_StringUpperCase
  10065. "*|Start FNshell_StringExchange
  10066. shell_StringExchange(string$,target$,sub$)
  10067.  index%
  10068. string$,target$) 
  10069.   index%=
  10070. string$,target$)
  10071. @  string$=
  10072. string$,index%-1)+sub$+
  10073. string$,index%+
  10074.  target$)
  10075. =string$
  10076. !*|Stop FNshell_StringExchange
  10077. )*|Start FNshell_StringArrayGetLongest
  10078. shell_StringArrayGetLongest(array$(),nr%)
  10079.  loop%,longest%
  10080. longest% = 0
  10081.  loop% = 0 
  10082. (array$(loop%)) > longest% 
  10083. #    longest% = 
  10084. (array$(loop%))
  10085.  loop%
  10086. = longest%
  10087. (*|Stop FNshell_StringArrayGetLongest
  10088. *|Start FNmem_to_string
  10089. mem_to_string( block%, offset%, term% )
  10090.  string$
  10091.  block%?offset% <> term%
  10092. $  string$ += 
  10093. ( block%?offset% )
  10094.   offset% += 1
  10095. = string$
  10096. *|Stop FNmem_to_string
  10097.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10098.  Module Messages
  10099.  -----------------------------------------------------------------------
  10100.  Messages Handling Routines
  10101.  -----------------------------------------------------------------------
  10102.  Public Methods Supported:
  10103.    FN_shell_Messages_Init                 Initialises module
  10104.    PROCshell_BroadcastMessage
  10105.  Private Methods Supported:
  10106. "*|Start FN_shell_Messages_Init
  10107. _shell_Messages_Init
  10108.  _MESSAGES_WORK_BLK% 256
  10109.  Message Codes
  10110. _MESSAGE_QUIT          = 0
  10111. _MESSAGE_DATASAVE      = 1
  10112. _MESSAGE_DATASAVEACK   = 2
  10113. _MESSAGE_DATALOAD      = 3
  10114. _MESSAGE_DATALOADACK   = 4
  10115. _MESSAGE_RAMFETCH      = 6
  10116. _MESSAGE_RAMTRANSMIT   = 7
  10117. _MESSAGE_PREQUIT       = 8
  10118. _MESSAGE_PALETTECHANGE = 9
  10119. _MESSAGE_SAVEDESKTOP   = 10
  10120. _MESSAGE_SHUTDOWN      = 14
  10121. !_MESSAGE_HELP          = &502
  10122. #_MESSAGE_MENUWARNING   = &400C0
  10123. #_MESSAGE_MODECHANGE    = &400C1
  10124. #_MESSAGE_TASKINIT      = &400C2
  10125. #_MESSAGE_TASKCLOSEDOWN = &400C3
  10126. #_MESSAGE_TASKNAMEIS    = &400C7
  10127. &_MESSAGE_DESKFONT_CHANGED = &400CF
  10128. 6_MESSAGE_COLOURPICKERCOLOURCHOICE         = &47700
  10129. 6_MESSAGE_COLOURPICKERCLOSEDIALOGUEREQUEST = &47702
  10130. !*|Stop FN_shell_Messages_Init
  10131. &*|Start PROCshell_BroadcastMessage
  10132. shell_BroadcastMessage(reason_code%,msg$)
  10133.  m_len%
  10134. %m_len% = ( 
  10135.  ( msg$ ) + 30) 
  10136. _MESSAGES_WORK_BLK%!12 = 0
  10137. )_MESSAGES_WORK_BLK%!16 = reason_code%
  10138. 1$( _MESSAGES_WORK_BLK% + 20 ) = msg$ + 
  10139. ( 0 )
  10140. "_MESSAGES_WORK_BLK%!0 = m_len%
  10141.  use XSWI in case error occurs between trace init call and wimp init
  10142.  call - can't broadcast unless we have launched the wimp task..
  10143.  "XWimp_SendMessage", 17, _MESSAGES_WORK_BLK%, 0:
  10144.  broadcast message
  10145. %*|Stop PROCshell_BroadcastMessage
  10146.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10147.  Module Memory
  10148.  -----------------------------------------------------------------------
  10149.  Memory Handling Routines
  10150.  -----------------------------------------------------------------------
  10151.  Structure of Data used in this module
  10152.  Public Methods Supported:
  10153.    FN_shell_Memory_Init                 Initialises module
  10154.    FNshell_HeapBlockExtend
  10155.    FNshell_HeapBlockFetch
  10156.    FNshell_HeapBlockExists
  10157.    FNshell_HeapBlockInfo
  10158.    FNshell_HeapBlockExtendMid
  10159.    PROCshell_HeapManagerInit
  10160.    PROCshell_HeapBlockReturn
  10161.  Private Methods Supported:
  10162.       None
  10163.  *|Start FN_shell_Memory_Init
  10164. _shell_Memory_Init
  10165. *|Stop FN_shell_Memory_Init
  10166. /&%*|Start PROCshell_HeapManagerInit
  10167. shell_HeapManagerInit( path$, heapmanager_addr% )
  10168.  _heap_code% 900
  10169. ( "LOAD " + path$ + "heapcode " + 
  10170. ~_heap_code% )
  10171.  _heap_code% + 0, heapmanager_addr%
  10172. /,$*|Stop PROCshell_HeapManagerInit
  10173. //#*|Start FNshell_HeapBlockExtend
  10174. shell_HeapBlockExtend( heapblock_addr%, amount% )
  10175.  _heap_code% + 12, heapblock_addr%, amount%
  10176. = heapblock_addr%
  10177. /3"*|Stop FNshell_HeapBlockExtend
  10178. /7"*|Start FNshell_HeapBlockFetch
  10179. shell_HeapBlockFetch( amount% )
  10180.  addr%
  10181.  _heap_code% + 4, addr%, amount%
  10182. = addr%
  10183. /<!*|Stop FNshell_HeapBlockFetch
  10184. /@%*|Start PROCshell_HeapBlockReturn
  10185. shell_HeapBlockReturn( 
  10186.  a% )
  10187. shell_HeapBlockExists( a% ) 
  10188.  _heap_code% + 8, a%
  10189. a% = 0
  10190. /E$*|Stop PROCshell_HeapBlockReturn
  10191. /I#*|Start FNshell_HeapBlockExists
  10192. shell_HeapBlockExists( addr% )
  10193.  void%
  10194.  addr% < &8000 
  10195.  99, "No heapblock defined at this address"
  10196. /O)void% = 
  10197. shell_HeapBlockInfo( addr% )
  10198. /R"*|Stop FNshell_HeapBlockExists
  10199. /V!*|Start FNshell_HeapBlockInfo
  10200. shell_HeapBlockInfo( a% )
  10201.  "OS_Heap", 6, !( _heap_code% + 28 ), a% 
  10202.  , , , r3
  10203. /\ *|Stop FNshell_HeapBlockInfo
  10204. /`&*|Start FNshell_HeapBlockExtendMid
  10205. /a7*|!Function to extend already allocated heap block.
  10206. /b&*|!a%   = current address of block
  10207. /cL*|!b%   = amount to increase or decrease block size by (-ve to decrease)
  10208. /d,*|!loc% = offset to add or remove memory
  10209. /e4*|!returns address of block (block may be moved)
  10210. shell_HeapBlockExtendMid(a%,b%,loc%)
  10211.  initial_size%
  10212. /h.initial_size% = 
  10213. shell_HeapBlockInfo( a% )
  10214.  _heap_code% + 12,a%,b%
  10215.  "Wimp_TransferBlock",_U%!148,a% + loc%,_U%!148,a% + loc% + b%,initial_size% - b%
  10216. /l%*|Stop FNshell_HeapBlockExtendMid
  10217.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10218.  Module Poll
  10219.  -----------------------------------------------------------------------
  10220.  Poll Handling Routines
  10221.  -----------------------------------------------------------------------
  10222.  Structure of Data used in this module
  10223.  Public Methods Supported:
  10224.    FN_shell_Poll_Init                 Initialises module
  10225.    FNshell_PollIdle
  10226.    FNshell_PollReadInterval
  10227.    FNshell_PollReadPrevInterval
  10228.    FNshell_Poll_I
  10229.    FNpoll
  10230.    PROCshell_PollSetInterval
  10231.    PROCshell_PollSetPrevInterval
  10232.  Private Methods Supported:
  10233.       None
  10234. *|Start FN_shell_Poll_Init
  10235. _shell_Poll_Init
  10236.  POLL_BLK% 256
  10237. _POLL_EARLIEST_TIME%  = 0
  10238. _POLL_INTERVAL%       = 100
  10239. _POLL_PREVINTERVAL%   = 0
  10240. shell_PollSetInterval( _POLL_INTERVAL% )
  10241. shell_PollSetPrevInterval( _POLL_INTERVAL% )
  10242.  "OS_ReadMonotonicTime" 
  10243.  _POLL_EARLIEST_TIME%
  10244. +_POLL_EARLIEST_TIME% += _POLL_INTERVAL%
  10245. *|Stop FN_shell_Poll_Init
  10246. *|Start FNshell_PollIdle
  10247. shell_PollIdle( mask%, task% )
  10248.  reason%
  10249.  _U%!100 
  10250.  1 << 6 
  10251.  "WimpExt_PrePoll"
  10252.  "Wimp_PollIdle", mask%, POLL_BLK%, _POLL_EARLIEST_TIME% 
  10253.  reason%
  10254.  _U%!100 
  10255.  1 << 6 
  10256.  "WimpExt_Action", _U%!148, POLL_BLK%, reason%
  10257. = reason%
  10258. *|Stop FNshell_PollIdle
  10259. %*|Start PROCshell_PollSetInterval
  10260. shell_PollSetInterval( interval%)
  10261. _POLL_INTERVAL% = interval%
  10262. $*|Stop PROCshell_PollSetInterval
  10263. )*|Start PROCshell_PollSetPrevInterval
  10264. shell_PollSetPrevInterval( interval%)
  10265. #_POLL_PREVINTERVAL% = interval%
  10266. (*|Stop PROCshell_PollSetPrevInterval
  10267. $*|Start FNshell_PollReadInterval
  10268. shell_PollReadInterval
  10269. = _POLL_INTERVAL%
  10270. #*|Stop FNshell_PollReadInterval
  10271. (*|Start FNshell_PollReadPrevInterval
  10272. shell_PollReadPrevInterval
  10273. = _POLL_PREVINTERVAL%
  10274. '*|Stop FNshell_PollReadPrevInterval
  10275. *|Start FNshell_Poll_I
  10276. shell_Poll_I( mask%, task% )
  10277.  reason%
  10278.  _U%!100 
  10279.  1 << 6 
  10280.  "WimpExt_PrePoll"
  10281.  "Wimp_Poll", mask%, _Q% 
  10282.  reason%
  10283.  _U%!100 
  10284.  1 << 6 
  10285.  "WimpExt_Action", _U%!148, _Q%, reason%
  10286.  "Interface_Poll", reason%, , task%
  10287. = reason%
  10288. *|Stop FNshell_Poll_I
  10289. *|Start FNpoll
  10290. poll(mask%,task%)
  10291.  _U%!100 
  10292.  1 << 6 
  10293.  "WimpExt_PrePoll"
  10294.  "Wimp_Poll",mask%,_Q% 
  10295.  _U%!100 
  10296.  1 << 6 
  10297.  "WimpExt_Action",_U%!148,_Q%,a%
  10298. *|Stop FNpoll
  10299.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10300.  Module IntHelp
  10301.  -----------------------------------------------------------------------
  10302.  IntHelp Handling Routines (version 1.01 02-Nov-95)
  10303.  -----------------------------------------------------------------------
  10304.  Structure of Data used in this module
  10305.  Public Methods Supported:
  10306.    FN_shell_IntHelp_Init                 Initialises module
  10307.    FNshell_InteractiveHelpIsOn
  10308.    PROCshell_InteractiveHelpOn
  10309.    PROCshell_InteractiveHelpOff
  10310.  Responses to events raised by other modules
  10311.    PROCshell_InteractiveHelp
  10312.  Private Methods Supported:
  10313.       None
  10314. !*|Start FN_shell_IntHelp_Init
  10315. _shell_IntHelp_Init
  10316.  IHELP_ICON_SELECTION_BLK% 60
  10317.  Module variables
  10318. _IntHelp_IsOn% = 
  10319.  *|Stop FN_shell_IntHelp_Init
  10320. %*|Start PROCshell_InteractiveHelp
  10321. shell_InteractiveHelp( _Q% )
  10322.  tag$,mess$,validation$,pos1%,pos2%,help$,flags%
  10323. shell_EvntHandle_HelpTags( _Q%!32, _Q%!36, tag$ )
  10324.  check validation string - this overrides attached help tags!
  10325. ;validation$ = 
  10326. shell_IconGetValidation( _Q%!32,_Q%!36 )
  10327.  validation$<>"" 
  10328. shell_StringUpperCase( 
  10329.  validation$, 1 ) ) = "I" 
  10330. #    pos1% = 
  10331. validation$, ";" )
  10332.  i is first modifier
  10333.  pos1% = 0 
  10334. #      tag$ = 
  10335.  validation$, 2 )
  10336.         
  10337. .      tag$ = 
  10338.  validation$, 2, pos1% - 2 )
  10339.         
  10340. P    pos1%=
  10341. shell_StringUpperCase(validation$),
  10342. shell_StringUpperCase(";i"))
  10343. W    pos2%=
  10344. shell_StringUpperCase(validation$),
  10345. shell_StringUpperCase(";"),pos1%+1)
  10346.  pos1%>0 
  10347.       
  10348.  pos2%>0 
  10349. 4        tag$=
  10350. validation$,pos1%+2,pos2%-pos1%-2)
  10351.       
  10352. &        tag$=
  10353. validation$,pos1%+2)
  10354.       
  10355.         
  10356.  tag$<>"" 
  10357.   _Q%!16 = &503
  10358.   _Q%!12 = _Q%!8
  10359. 0#.  mess$ = 
  10360. shell_MessageLookup(tag$,"","")
  10361. 0$)  mess$ = 
  10362. shell_MessageExpand(mess$)
  10363.   $( _Q% + 20 ) = mess$
  10364. 0&#  !_Q% = ( 
  10365.  mess$ + 25 ) 
  10366. 0'(  
  10367.  "Wimp_SendMessage",17,_Q%,_Q%!4
  10368. 0+$*|Stop PROCshell_InteractiveHelp
  10369. 0/'*|Start PROCshell_InteractiveHelpOn
  10370. shell_InteractiveHelpOn
  10371. _IntHelp_IsOn% = 
  10372. 04&*|Stop PROCshell_InteractiveHelpOn
  10373. 08(*|Start PROCshell_InteractiveHelpOff
  10374. shell_InteractiveHelpOff
  10375. _IntHelp_IsOn% = 
  10376. 0='*|Stop PROCshell_InteractiveHelpOff
  10377.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10378.  Module PopUps
  10379.  -----------------------------------------------------------------------
  10380.  PopUps Handling Routines
  10381.  -----------------------------------------------------------------------
  10382.  Structure of Data used in this module
  10383.  Public Methods Supported:
  10384.    FN_shell_PopUps_Init                 Initialises module
  10385.  Private Methods Supported:
  10386. 0S *|Start FN_shell_PopUps_Init
  10387. _shell_PopUps_Init
  10388. *|Stop FN_shell_PopUps_Init
  10389.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10390.  Module Bumpers
  10391.  -----------------------------------------------------------------------
  10392.  Bumper Icon Event Handling Routines version 1.03 (30-Dec-95)
  10393.  -----------------------------------------------------------------------
  10394.  Structure of Bumper Event Block
  10395.  Each Event...
  10396.  +00 window name
  10397.  +12 bump icon handle (incr)
  10398.  +16 step size
  10399.  +20 display icon handle
  10400.  +24 lower limit
  10401.  +28 upper limit
  10402.  +32 pointer to display function        (-1 if none)
  10403.  +36 pointer to display decode function (-1 if none
  10404.  +40 flags (1 word)
  10405.      bit 0 wrap 
  10406.      bit 2 event for decrement icon if set
  10407.  First block duplicated for decrement event, only fields mentioned below are
  10408.  filled in however...
  10409.  +00 window name
  10410.  +12 bump icon handle (decr)
  10411.  +40 flags (1 word)
  10412.      bit 0 wrap 
  10413.      bit 2 event for decrement icon if set
  10414.  Public Methods Supported:
  10415.    FNshell_Bumpers_Init          Initialises module
  10416.    PROCshell_AttachBumpHandler   Attaches a bumper handler
  10417.    PROCshell_EvntHandle_Bumpers  Handles bumper events (called from mouse click handlers)
  10418.    PROCshell_ListBumpers         Outputs debug info for !ShellDBug
  10419.  Private Methods Supported:
  10420.    None
  10421. !*|Start FN_shell_Bumpers_Init
  10422. _shell_Bumpers_Init
  10423.  Define Constants
  10424. H_c_Bumpers_ShiftKeyFactor%     = 2  : 
  10425.  Speed up keys for bump icons
  10426. &_c_Bumpers_CtrlKeyFactor%      = 4
  10427. &_c_Bumpers_ShiftCtrlKeyFactor% = 8
  10428.  Define Variables
  10429.  *|Stop FN_shell_Bumpers_Init
  10430. '*|Start PROCshell_AttachBumpHandler
  10431. shell_AttachBumpHandler( window_handle%, icon_handle%, incr%, decr%, l_limit%, u_limit%, step%, wrap%, disp_fn$, decode_fn$ )
  10432.  evnt_blk%, offset%, window_name$
  10433. ?window_name$ = 
  10434. shell_GetWindowIdentifier( window_handle% )
  10435.  PROCshell_Tracef0( "AttachBumpHandler:Attaching bump event to icon " + STR$~icon_handle% + " in window '" + window_name$ + "'" )
  10436. loffset% = 
  10437. Evnts_GetEvntListOffset( window_name$, incr%, _EVNTS_BUMP_ANCHOR%, _EVNTS_BUMP_REC_SIZE%, 
  10438. $evnt_blk% = !_EVNTS_BUMP_ANCHOR%
  10439. evnt_blk% += offset%
  10440. $evnt_blk%   = window_name$
  10441. evnt_blk%!12 = incr%
  10442. evnt_blk%!16 = step%
  10443. evnt_blk%!20 = icon_handle%
  10444. evnt_blk%!24 = l_limit%
  10445. evnt_blk%!28 = u_limit%
  10446.  wrap% = -1 
  10447.  evnt_blk%!40 = 1 
  10448.  evnt_blk%!40 = 0
  10449.  !_EVNTS_BUMP_DATA% = 0 
  10450. 5  !_EVNTS_BUMP_DATA% = 
  10451. shell_HeapBlockFetch( 1 )
  10452. &data_offset_addr% = evnt_blk% + 32
  10453.  disp_fn$ <> "" 
  10454. Evnts_UpdateData( data_offset_addr%, _EVNTS_BUMP_DATA%, _EVNTS_BUMP_DATAOFFSET%, disp_fn$ )
  10455.   !data_offset_addr% = -1
  10456. &data_offset_addr% = evnt_blk% + 36
  10457.  decode_fn$ <> "" 
  10458. Evnts_UpdateData( data_offset_addr%, _EVNTS_BUMP_DATA%, _EVNTS_BUMP_DATAOFFSET%, decode_fn$ )
  10459.   !data_offset_addr% = -1
  10460. loffset% = 
  10461. Evnts_GetEvntListOffset( window_name$, decr%, _EVNTS_BUMP_ANCHOR%, _EVNTS_BUMP_REC_SIZE%, 
  10462. $evnt_blk% = !_EVNTS_BUMP_ANCHOR%
  10463. evnt_blk% += offset%
  10464. $evnt_blk%   = window_name$
  10465. evnt_blk%!12 = decr%
  10466.  wrap% = -1 
  10467.  evnt_blk%!40 = 1 
  10468.  evnt_blk%!40 = 0
  10469. ,evnt_blk%!40 = evnt_blk%!40 
  10470.  ( 1 << 2 )
  10471.  PROCshell_Tracef0("DEBUG:: nr of bump events is now " + STR$( e_list%!4 ) )
  10472. &*|Stop PROCshell_AttachBumpHandler
  10473. (*|Start PROCshell_EvntHandle_Bumpers
  10474. shell_EvntHandle_Bumpers( _window_handle%, _icon_handle% )
  10475.  window_name$, offset%, evnt_list%, decrementing%
  10476.  step_value%, disp_icon%, l_limit%, u_limit%, mouse_button%, shift_pressed%, control_pressed%
  10477.  curr_val%, wrapping%, _new_val$, _new_val%, data_offset_addr%, ValueChangeFN$, ValueDecodeFN$
  10478.  curr_val$
  10479. @window_name$ = 
  10480. shell_GetWindowIdentifier( _window_handle% )
  10481.  PROCshell_Tracef0( "EvntHandle_Bumpers:window_name$ = " + window_name$ )
  10482. toffset% = 
  10483. Evnts_GetEvntListOffset( window_name$, _icon_handle%, _EVNTS_BUMP_ANCHOR%, _EVNTS_BUMP_REC_SIZE%, 
  10484.  PROCshell_Tracef0( "EvntHandle_Bumpers:offset% = " + STR$ offset% )
  10485. -mouse_button% = 
  10486. shell_GetLastMouseButton
  10487.  offset% >= 0 
  10488. 4  evnt_list%    = !_EVNTS_BUMP_ANCHOR% + offset%
  10489.  evnt_list%!40 
  10490.  (1 << 2 ) 
  10491.  decrementing% = 
  10492.  decrementing% = 
  10493.  evnt_list%!40 
  10494.  (1 << 0 ) 
  10495.  wrapping% = 
  10496.  wrapping% = 
  10497.  decrementing% 
  10498.  evnt_list% -= _EVNTS_BUMP_REC_SIZE%
  10499. !  step_value% = evnt_list%!16
  10500. !  disp_icon%  = evnt_list%!20
  10501. !  l_limit%    = evnt_list%!24
  10502. !  u_limit%    = evnt_list%!28
  10503.    shift_pressed%   = 
  10504. ( -1 )
  10505.    control_pressed% = 
  10506. ( -2 )
  10507.  shift_pressed% 
  10508.  control_pressed% 
  10509. B    step_value% = step_value% * _c_Bumpers_ShiftCtrlKeyFactor%
  10510. S    
  10511.  shift_pressed%   
  10512.  step_value% = step_value% * _c_Bumpers_ShiftKeyFactor%
  10513. R    
  10514.  control_pressed% 
  10515.  step_value% = step_value% * _c_Bumpers_CtrlKeyFactor%
  10516. )  evnt_data_blk% = !_EVNTS_BUMP_DATA%
  10517.  evnt_data_blk% > 0 
  10518.  evnt_list%!32 >= 0 
  10519. >      ValueChangeFN$ = $( evnt_data_blk% + evnt_list%!32 )
  10520.         
  10521.  evnt_list%!36 >= 0 
  10522. >      ValueDecodeFN$ = $( evnt_data_blk% + evnt_list%!36 )
  10523.         
  10524. C  curr_val$ = 
  10525. shell_IconGetData( _window_handle%, disp_icon% )
  10526.  ValueDecodeFN$ <> "" 
  10527. Z    
  10528.  PROCshell_Tracef0( "DEBUG::" + "FN" + ValueDecodeFN$ + "( " + curr_val$ + " )" )
  10529. T    curr_val% = 
  10530. ( "FN" + ValueDecodeFN$ + "( " + 
  10531. 34 + curr_val$ + 
  10532. 34 + " )" )
  10533. "    curr_val% = 
  10534. ( curr_val$ )
  10535.  decrementing% 
  10536. *    
  10537.  mouse_button% = _MSE_ADJUSTBUT 
  10538. -      _new_val% = curr_val% + step_value%
  10539.         
  10540. -      _new_val% = curr_val% - step_value%
  10541.         
  10542. *    
  10543.  mouse_button% = _MSE_ADJUSTBUT 
  10544. -      _new_val% = curr_val% - step_value%
  10545.         
  10546. -      _new_val% = curr_val% + step_value%
  10547.         
  10548.  wrapping% = 
  10549. 5    
  10550.  _new_val% > u_limit% 
  10551.  _new_val% = u_limit%
  10552. 5    
  10553.  _new_val% < l_limit% 
  10554.  _new_val% = l_limit%
  10555. 5    
  10556.  _new_val% > u_limit% 
  10557.  _new_val% = l_limit%
  10558. 5    
  10559.  _new_val% < l_limit% 
  10560.  _new_val% = u_limit%
  10561.  ValueChangeFN$ <> "" 
  10562. V    _new_val$ = 
  10563. ( "FN" + ValueChangeFN$ + "(_new_val%," + 
  10564.  mouse_button% + ")" )
  10565.     _new_val$ = 
  10566.  _new_val%
  10567. shell_IconPutData( _window_handle%, disp_icon%, _new_val$, 
  10568.  PROCshell_Tracef0( "EvntHandle_Bumpers:No bumper event found.." )
  10569. 1 '*|Stop PROCshell_EvntHandle_Bumpers
  10570. 1$!*|Start PROCshell_ListBumpers
  10571. shell_ListBumpers
  10572.  list_size%, event_list%, rec_size%, ptr%, nr_events%, e_ptr%
  10573.  incr_icon%, decr_icon%, user_FN1$, user_FN2$, event_data_blk%, loop%, debug_message$
  10574.  step_icon%, disp_icon%, l_limit%, u_limit%
  10575. 1)&event_list% = !_EVNTS_BUMP_ANCHOR%
  10576. 1*'rec_size%   = _EVNTS_BUMP_REC_SIZE%
  10577. 1+'nr_events%  = ( event_list%!4 ) / 2
  10578. Evnts_DebugListHeader ( "Bump ", "Window       Inc Dec Disp Step Lower Upper Value Change FN" )
  10579.  event_list% = 0  
  10580. 1/1  
  10581.  PROCshell_Tracef0("No Bump Events found")
  10582. 11!  ptr% = _m_Evnts_HeaderSize%
  10583.  loop% = 1 
  10584.  nr_events%
  10585. 13.    window_name$ = $( event_list% + ptr% )
  10586. 14-    incr_icon% = event_list%!( ptr% + 12)
  10587. 15F    decr_icon% = event_list%!( ptr% + 12 + _EVNTS_BUMP_REC_SIZE% )
  10588. 16.    step_icon% = event_list%!( ptr% + 16 )
  10589. 17.    disp_icon% = event_list%!( ptr% + 20 )
  10590. 18.    l_limit%   = event_list%!( ptr% + 24 )
  10591. 19.    u_limit%   = event_list%!( ptr% + 28 )
  10592. 1:,    event_data_blk% = !_EVNTS_BUMP_DATA%
  10593.  event_data_blk% > 0 
  10594. 1<E      user_FN1$ = $( event_data_blk% + event_list%!( ptr% + 32 ))
  10595. 1=E      user_FN2$ = $( event_data_blk% + event_list%!( ptr% + 36 ))
  10596. 1>        
  10597. 1?L    debug_message$ =   
  10598. shell_StringPadTrailing( window_name$, ".", 12 )
  10599. 1@P    debug_message$ +=  " " + 
  10600. shell_StringPadLeading( 
  10601.  incr_icon%, " ", 3 )
  10602. 1AP    debug_message$ +=  " " + 
  10603. shell_StringPadLeading( 
  10604.  decr_icon%, " ", 3 )
  10605. 1BP    debug_message$ +=  " " + 
  10606. shell_StringPadLeading( 
  10607.  disp_icon%, " ", 4 )
  10608. 1CP    debug_message$ +=  " " + 
  10609. shell_StringPadLeading( 
  10610.  step_icon%, " ", 4 )
  10611. 1DN    debug_message$ +=  " " + 
  10612. shell_StringPadLeading( 
  10613.  l_limit%, " ", 5 )
  10614. 1EN    debug_message$ +=  " " + 
  10615. shell_StringPadLeading( 
  10616.  u_limit%, " ", 5 )
  10617. 1F,    debug_message$ +=  "   " + user_FN1$
  10618. 1G-    
  10619.  PROCshell_Tracef0( debug_message$ )
  10620. 1HV    
  10621.  Each bump event is actually a 'double event', one for the increment icon and
  10622. 1I&    
  10623.  one for the decrement icon..
  10624. 1J)    ptr% += _EVNTS_BUMP_REC_SIZE% * 2
  10625.  loop%
  10626.  PROCshell_Tracef0(" ")
  10627. 1Q *|Stop PROCshell_ListBumpers
  10628.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10629.  Module Pointer
  10630.  -----------------------------------------------------------------------
  10631.  Pointer Handling Routines (version 1.07 27-Jan-96)
  10632.  (entering/leaving windows, shape changing)
  10633.  -----------------------------------------------------------------------
  10634.  Public Methods Supported:
  10635.    PROCshell_AttachPointerEnteringWindowHandler
  10636.    PROCshell_AttachPointerLeavingWindowHandler
  10637.    PROCshell_PointerChangeShape
  10638.    PROCshell_PointerResetShape
  10639.    PROCshell_PointerGetPosition
  10640.    PROCshell_PointerGetWindow
  10641.    PROCshell_PointerGetIcon
  10642.    PROCshell_PointerGetMouseButton
  10643.    PROCshell_PointerGetLastMovementVector
  10644.    PROCshell_PointerGetMovementVector
  10645.    PROCshell_PointerLimit
  10646.    PROCshell_PointerRemoveLimits
  10647.    FNshell_PointerGetCurrentShape
  10648.    FNshell_PointerIsChanged
  10649.    FNshell_PointerIsBelowWindowCentre
  10650.    FNshell_PointerIsAboveWindowCentre
  10651.    FNshell_PointerIsRightOfWindowCentre
  10652.    FNshell_PointerIsLeftOfWindowCentre
  10653.  Access routines for EvntShell (not to be called by the user application)
  10654.    FN_shell_Pointer_Init
  10655.    PROCshell_EvntHandle_PointerEnteringWindow
  10656.    PROCshell_EvntHandle_PointerLeavingWindowHandler
  10657.    PROCshell_PointerSaveEvnts
  10658.    PROCshell_PointerLoadEvnts
  10659.  Private Methods Supported (not to be called outside this module)
  10660. !*|Start FN_shell_Pointer_Init
  10661. _shell_Pointer_Init
  10662. !_c_PointerIn_RecSize%    = 20
  10663.  _m_PointerIn_Anchor%   4
  10664.  _m_PointerIn_DataBlk%  4
  10665.  !_m_PointerIn_Anchor%    = 0
  10666.  !_m_PointerIn_DataBlk%   = 0
  10667.  _m_PointerIn_DataOffset% = 0
  10668. "_c_PointerOut_RecSize%    = 20
  10669.  _m_PointerOut_Anchor%   4
  10670.  _m_PointerOut_DataBlk%  4
  10671. !!_m_PointerOut_Anchor%    = 0
  10672. !!_m_PointerOut_DataBlk%   = 0
  10673. !_m_PointerOut_DataOffset% = 0
  10674. $_m_Pointer_SetShape_Reason% = 36
  10675. #_m_Pointer_SetShape_Ptr_Nr% = 2
  10676. #_m_Pointer_ShapeChanged%    = 
  10677. $_m_Pointer_CurrentShape$    = ""
  10678.  _m_Pointer_WorkBuffer% 4
  10679.  _m_Pointer_GetInfoBlk% 20
  10680.  *|Stop FN_shell_Pointer_Init
  10681.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10682.  Pointer Entering Window Handler Routines
  10683.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10684. 8*|Start PROCshell_AttachPointerEnteringWindowHandler
  10685. shell_AttachPointerEnteringWindowHandler( window_handle%, user_FN$ )
  10686.  evnt_blk%, offset%, window_name$, data_offset_addr%, nr_evnts%
  10687.  PROCshell_Tracef0( "" )
  10688.  window_handle% > 0 
  10689. B  window_name$ =  
  10690. shell_GetWindowIdentifier( window_handle% )
  10691. r  offset%      =  
  10692. Evnts_GetEvntListOffset( window_name$, -1, _m_PointerIn_Anchor%, _c_PointerIn_RecSize%, 
  10693. +  evnt_blk%    =  !_m_PointerIn_Anchor%
  10694. !  nr_evnts%    =  evnt_blk%!4
  10695.   evnt_blk%    += offset%
  10696. "  $evnt_blk%   =  window_name$
  10697.   evnt_blk%!12 =  -1
  10698.  !_m_PointerIn_DataBlk% = 0 
  10699. K    !_m_PointerIn_DataBlk% = 
  10700. shell_HeapBlockFetch( 
  10701. ( user_FN$ ) + 1 )
  10702. (  data_offset_addr% = evnt_blk% + 16
  10703. Evnts_UpdateData( data_offset_addr%, _m_PointerIn_DataBlk%, _m_PointerIn_DataOffset%, user_FN$ )
  10704.  PROCshell_Tracef0( "" )
  10705. 7*|Stop PROCshell_AttachPointerEnteringWindowHandler
  10706. 6*|Start PROCshell_EvntHandle_PointerEnteringWindow
  10707. shell_EvntHandle_PointerEnteringWindow( _window_handle% )
  10708.  window_name$, offset%, evnt_list%, user_FN_offset%, data_list%, user_FN$
  10709.  void%
  10710. @window_name$ = 
  10711. shell_GetWindowIdentifier( _window_handle% )
  10712.  window_name$ <> "" 
  10713. l  offset% = 
  10714. Evnts_GetEvntListOffset( window_name$, -1, _m_PointerIn_Anchor%, _c_PointerIn_RecSize%, 
  10715.  offset% >= 0 
  10716. 9    evnt_list%      = !_m_PointerIn_Anchor% + offset%
  10717. '    user_FN_offset% = evnt_list%!16
  10718. 0    data_list%      = !_m_PointerIn_DataBlk%
  10719. ;    user_FN$        = $( data_list% + user_FN_offset% )
  10720. <    void% = 
  10721. ( "FN" + user_FN$ + "( _window_handle% )" )
  10722. 5*|Stop PROCshell_EvntHandle_PointerEnteringWindow
  10723.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10724.  Pointer Leaving Window Handler Routines
  10725.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10726. 7*|Start PROCshell_AttachPointerLeavingWindowHandler
  10727. shell_AttachPointerLeavingWindowHandler( window_handle%, user_FN$ )
  10728.  evnt_blk%, offset%, window_name$, data_offset_addr%, nr_evnts%
  10729.  PROCshell_Tracef0( "" )
  10730.  window_handle% > 0 
  10731. B  window_name$ =  
  10732. shell_GetWindowIdentifier( window_handle% )
  10733. t  offset%      =  
  10734. Evnts_GetEvntListOffset( window_name$, -1, _m_PointerOut_Anchor%, _c_PointerOut_RecSize%, 
  10735. ,  evnt_blk%    =  !_m_PointerOut_Anchor%
  10736. !  nr_evnts%    =  evnt_blk%!4
  10737.   evnt_blk%    += offset%
  10738. "  $evnt_blk%   =  window_name$
  10739.   evnt_blk%!12 =  -1
  10740.  !_m_PointerOut_DataBlk% = 0 
  10741. L    !_m_PointerOut_DataBlk% = 
  10742. shell_HeapBlockFetch( 
  10743. ( user_FN$ ) + 1 )
  10744. (  data_offset_addr% = evnt_blk% + 16
  10745. Evnts_UpdateData( data_offset_addr%, _m_PointerOut_DataBlk%, _m_PointerOut_DataOffset%, user_FN$ )
  10746.  PROCshell_Tracef0( "" )
  10747. 6*|Stop PROCshell_AttachPointerLeavingWindowHandler
  10748. 2    5*|Start PROCshell_EvntHandle_PointerLeavingWindow
  10749. shell_EvntHandle_PointerLeavingWindow( _window_handle% )
  10750.  window_name$, offset%, evnt_list%, user_FN_offset%, data_list%, user_FN$
  10751.  void%
  10752. @window_name$ = 
  10753. shell_GetWindowIdentifier( _window_handle% )
  10754.  window_name$ <> "" 
  10755. n  offset% = 
  10756. Evnts_GetEvntListOffset( window_name$, -1, _m_PointerOut_Anchor%, _c_PointerOut_RecSize%, 
  10757.  offset% >= 0 
  10758. :    evnt_list%      = !_m_PointerOut_Anchor% + offset%
  10759. '    user_FN_offset% = evnt_list%!16
  10760. 1    data_list%      = !_m_PointerOut_DataBlk%
  10761. ;    user_FN$        = $( data_list% + user_FN_offset% )
  10762. <    void% = 
  10763. ( "FN" + user_FN$ + "( _window_handle% )" )
  10764. shell_PointerResetShape
  10765. 2 4*|Stop PROCshell_EvntHandle_PointerLeavingWindow
  10766. 2#(*|Start PROCshell_PointerChangeShape
  10767. shell_PointerChangeShape( pointer_sprite_name$, hot_spot_x_offset%, hot_spot_y_offset%  )
  10768.  "Wimp_SpriteOp", _m_Pointer_SetShape_Reason%, , pointer_sprite_name$, _m_Pointer_SetShape_Ptr_Nr%, hot_spot_x_offset%, hot_spot_x_offset%
  10769. 2& _m_Pointer_ShapeChanged% = 
  10770. 2'3_m_Pointer_CurrentShape$ = pointer_sprite_name$
  10771. 2*'*|Stop PROCshell_PointerChangeShape
  10772. 2.'*|Start PROCshell_PointerResetShape
  10773. shell_PointerResetShape
  10774.  _m_Pointer_ShapeChanged% = 
  10775. ( "Pointer" )
  10776. 22"  _m_Pointer_ShapeChanged% = 
  10777. 23#  _m_Pointer_CurrentShape$ = ""
  10778. 27&*|Stop PROCshell_PointerResetShape
  10779. 2;**|Start FNshell_PointerGetCurrentShape
  10780. shell_PointerGetCurrentShape
  10781. = _m_Pointer_CurrentShape$
  10782. 2?)*|Stop FNshell_PointerGetCurrentShape
  10783. 2C$*|Start FNshell_PointerIsChanged
  10784. shell_PointerIsChanged
  10785. = _m_Pointer_ShapeChanged%
  10786. 2G#*|Stop FNshell_PointerIsChanged
  10787. 2K(*|Start PROCshell_PointerGetPosition
  10788. shell_PointerGetPosition( 
  10789.  mouse_x%, 
  10790.  mouse_y% )
  10791.  "Wimp_GetPointerInfo", , _m_Pointer_GetInfoBlk%
  10792. 2O(mouse_x% = _m_Pointer_GetInfoBlk%!00
  10793. 2P(mouse_y% = _m_Pointer_GetInfoBlk%!04
  10794. 2T'*|Stop PROCshell_PointerGetPosition
  10795. 2X&*|Start PROCshell_PointerGetWindow
  10796. shell_PointerGetWindow( 
  10797.  window_handle% )
  10798.  "Wimp_GetPointerInfo", , _m_Pointer_GetInfoBlk%
  10799. 2\.window_handle% = _m_Pointer_GetInfoBlk%!12
  10800. 2`%*|Stop PROCshell_PointerGetWindow
  10801. 2d$*|Start PROCshell_PointerGetIcon
  10802. shell_PointerGetIcon( 
  10803.  icon_handle% )
  10804.  "Wimp_GetPointerInfo", , _m_Pointer_GetInfoBlk%
  10805. 2h,icon_handle% = _m_Pointer_GetInfoBlk%!16
  10806. 2l#*|Stop PROCshell_PointerGetIcon
  10807. 2p+*|Start PROCshell_PointerGetMouseButton
  10808. shell_PointerGetMouseButton( 
  10809.  mouse_button% )
  10810.  "Wimp_GetPointerInfo", , _m_Pointer_GetInfoBlk%
  10811. 2t,mouse_button% = _m_Pointer_GetInfoBlk%!8
  10812. 2x**|Stop PROCshell_PointerGetMouseButton
  10813. 2|.*|Start FNshell_PointerIsBelowWindowCentre
  10814. shell_PointerIsBelowWindowCentre( window_handle% )
  10815.  result%, xmin%, ymin%, xmax%, ymax%, mouse_x%, mouse_y%
  10816. shell_WindowGetPosition( window_handle%, xmin%, ymin%, xmax%, ymax% )
  10817. shell_PointerGetPosition( mouse_x%, mouse_y% )
  10818.  mouse_y% < ( ymin% + ( ymax% - ymin% ) / 2 ) 
  10819.   result% = 
  10820.   result% = 
  10821. = result%
  10822. -*|Stop FNshell_PointerIsBelowWindowCentre
  10823. .*|Start FNshell_PointerIsAboveWindowCentre
  10824. shell_PointerIsAboveWindowCentre( window_handle% )
  10825.  result%, xmin%, ymin%, xmax%, ymax%, mouse_x%, mouse_y%
  10826. shell_WindowGetPosition( window_handle%, xmin%, ymin%, xmax%, ymax% )
  10827. shell_PointerGetPosition( mouse_x%, mouse_y% )
  10828.  mouse_y% >= ( ymin% + ( ymax% - ymin% ) / 2 ) 
  10829.   result% = 
  10830.   result% = 
  10831. = result%
  10832. -*|Stop FNshell_PointerIsAboveWindowCentre
  10833. 0*|Start FNshell_PointerIsRightOfWindowCentre
  10834. shell_PointerIsRightOfWindowCentre( window_handle% )
  10835.  result%, xmin%, ymin%, xmax%, ymax%, mouse_x%, mouse_y%
  10836. shell_WindowGetPosition( window_handle%, xmin%, ymin%, xmax%, ymax% )
  10837. shell_PointerGetPosition( mouse_x%, mouse_y% )
  10838.  mouse_x% >= ( xmin% + ( xmax% - xmin% ) / 2 ) 
  10839.   result% = 
  10840.   result% = 
  10841. = result%
  10842. /*|Stop FNshell_PointerIsRightOfWindowCentre
  10843. /*|Start FNshell_PointerIsLeftOfWindowCentre
  10844. shell_PointerIsLeftOfWindowCentre( window_handle% )
  10845.  result%, xmin%, ymin%, xmax%, ymax%, mouse_x%, mouse_y%
  10846. shell_WindowGetPosition( window_handle%, xmin%, ymin%, xmax%, ymax% )
  10847. shell_PointerGetPosition( mouse_x%, mouse_y% )
  10848.  mouse_x% < ( xmin% + ( xmax% - xmin% ) / 2 ) 
  10849.   result% = 
  10850.   result% = 
  10851. = result%
  10852. .*|Stop FNshell_PointerIsLeftOfWindowCentre
  10853. &*|Start PROCshell_PointerSaveEvnts
  10854. shell_PointerSaveEvnts( file_handle% )
  10855. Evnts_SaveEvnt( file_handle%, _m_PointerIn_Anchor%,  _m_PointerIn_DataBlk%,  _m_PointerIn_DataOffset% )
  10856. Evnts_SaveEvnt( file_handle%, _m_PointerOut_Anchor%, _m_PointerOut_DataBlk%, _m_PointerOut_DataOffset% )
  10857. %*|Stop PROCshell_PointerSaveEvnts
  10858. &*|Start PROCshell_PointerLoadEvnts
  10859. shell_PointerLoadEvnts( file_handle% )
  10860. Evnts_LoadEvnt( file_handle%, _m_PointerIn_Anchor%,  _m_PointerIn_DataBlk%,  _m_PointerIn_DataOffset% )
  10861. Evnts_LoadEvnt( file_handle%, _m_PointerOut_Anchor%, _m_PointerOut_DataBlk%, _m_PointerOut_DataOffset% )
  10862. %*|Stop PROCshell_PointerLoadEvnts
  10863. .*|Start PROCshell_PointerGetMovementVector
  10864. shell_PointerGetMovementVector( x_ref%, y_ref%, mouse_x%, mouse_y%, 
  10865.  up%, 
  10866.  down%, 
  10867.  left%, 
  10868.  right%, 
  10869.  dx%, 
  10870.  dy% )
  10871. dx% = mouse_x% - x_ref%
  10872. dy% = mouse_y% - y_ref% 
  10873. up%    = 
  10874. down%  = 
  10875. right% = 
  10876. left%  = 
  10877. ( dx% ) > 
  10878. ( dy% ) 
  10879.  mouse_x% > x_ref% 
  10880.     right% = 
  10881.     left% = 
  10882.  mouse_y% < y_ref% 
  10883.     down% = 
  10884.     up% = 
  10885.  dx% <> 0 
  10886.  dy% <> 0 
  10887. -  _m_evnts_DragIconLastScrollUp%    = up%
  10888. /  _m_evnts_DragIconLastScrollDown%  = down%
  10889. /  _m_evnts_DragIconLastScrollLeft%  = left%
  10890. 0  _m_evnts_DragIconLastScrollRight% = right%
  10891. -  _m_evnts_DragIconLastDX%          = dx%
  10892. -  _m_evnts_DragIconLastDY%          = dy%
  10893. -*|Stop PROCshell_PointerGetMovementVector
  10894. 2*|Start PROCshell_PointerGetLastMovementVector
  10895. shell_PointerGetLastMovementVector( 
  10896.  up%, 
  10897.  down%, 
  10898.  left%, 
  10899.  right%, 
  10900.  dx%, 
  10901.  dy% )
  10902. +up%    = _m_evnts_DragIconLastScrollUp%
  10903. -down%  = _m_evnts_DragIconLastScrollDown%
  10904. -left%  = _m_evnts_DragIconLastScrollLeft%
  10905. .right% = _m_evnts_DragIconLastScrollRight%
  10906. %dx%    = _m_evnts_DragIconLastDX%
  10907. %dy%    = _m_evnts_DragIconLastDY%
  10908. 1*|Stop PROCshell_PointerGetLastMovementVector
  10909. "*|Start PROCshell_PointerLimit
  10910. shell_PointerLimit( window_handle% )
  10911. shell_MouseLimit( window_handle% )
  10912. !*|Stop PROCshell_PointerLimit
  10913. )*|Start PROCshell_PointerRemoveLimits
  10914. shell_PointerRemoveLimits
  10915. shell_MouseRemoveLimits
  10916. (*|Stop PROCshell_PointerRemoveLimits
  10917.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10918.  Module CaretMove
  10919.  -----------------------------------------------------------------------
  10920.  Caret Movement Evnt Handling Routines version 1.01 (01-Oct-95)
  10921.  -----------------------------------------------------------------------
  10922.  Public Methods Supported:
  10923.    PROCshell_AttachCaretPreMoveHandler
  10924.    PROCshell_AttachCaretPostMoveHandler
  10925.  Access routines for EvntShell (not to be called by the user application)
  10926.    FN_shell_CaretMove_Init
  10927.    PROCshell_EvntHandle_CaretPreMove
  10928.    PROCshell_EvntHandle_CaretPostMove
  10929.  Private Methods Supported (not to be called outside this module)
  10930. 37#*|Start FN_shell_CaretMove_Init
  10931. _shell_CaretMove_Init
  10932. 39#c_CaretPreMove_RecSize%    = 20
  10933.  m_CaretPreMove_Anchor%   4
  10934.  m_CaretPreMove_DataBlk%  4
  10935. 3<"!m_CaretPreMove_Anchor%    = 0
  10936. 3="!m_CaretPreMove_DataBlk%   = 0
  10937. 3>"m_CaretPreMove_DataOffset% = 0
  10938. 3@$c_CaretPostMove_RecSize%    = 20
  10939.  m_CaretPostMove_Anchor%   4
  10940.  m_CaretPostMove_DataBlk%  4
  10941. 3C#!m_CaretPostMove_Anchor%    = 0
  10942. 3D#!m_CaretPostMove_DataBlk%   = 0
  10943. 3E#m_CaretPostMove_DataOffset% = 0
  10944. 3I"*|Stop FN_shell_CaretMove_Init
  10945.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10946.  Caret PreMove Handler Routines
  10947.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10948. 3U/*|Start PROCshell_AttachCaretPreMoveHandler
  10949. shell_AttachCaretPreMoveHandler( window_handle%, user_FN$ )
  10950.  evnt_blk%, offset%, window_name$, data_offset_addr%, nr_evnts%
  10951.  PROCshell_Tracef0( "" )
  10952.  window_handle% > 0 
  10953. 3\B  window_name$ =  
  10954. shell_GetWindowIdentifier( window_handle% )
  10955. 3]v  offset%      =  
  10956. Evnts_GetEvntListOffset( window_name$, -1, m_CaretPreMove_Anchor%, c_CaretPreMove_RecSize%, 
  10957. 3^-  evnt_blk%    =  !m_CaretPreMove_Anchor%
  10958. 3_!  nr_evnts%    =  evnt_blk%!4
  10959.   evnt_blk%    += offset%
  10960. 3a"  $evnt_blk%   =  window_name$
  10961.   evnt_blk%!12 =  -1
  10962. 3d&  
  10963.  !m_CaretPreMove_DataBlk% = 0 
  10964. 3eM    !m_CaretPreMove_DataBlk% = 
  10965. shell_HeapBlockFetch( 
  10966. ( user_FN$ ) + 1 )
  10967. 3h(  data_offset_addr% = evnt_blk% + 16
  10968. 3ik  
  10969. Evnts_UpdateData( data_offset_addr%, m_CaretPreMove_DataBlk%, m_CaretPreMove_DataOffset%, user_FN$ )
  10970.  PROCshell_Tracef0( "" )
  10971. 3q.*|Stop PROCshell_AttachCaretPreMoveHandler
  10972. 3u-*|Start PROCshell_EvntHandle_CaretPreMove
  10973. shell_EvntHandle_CaretPreMove( _window_handle%, _icon_handle% )
  10974.  window_name$, offset%, evnt_list%, user_FN_offset%, data_list%, user_FN$
  10975.  void%
  10976. 3{@window_name$ = 
  10977. shell_GetWindowIdentifier( _window_handle% )
  10978.  window_name$ <> "" 
  10979. 3~p  offset% = 
  10980. Evnts_GetEvntListOffset( window_name$, -1, m_CaretPreMove_Anchor%, c_CaretPreMove_RecSize%, 
  10981.  offset% >= 0 
  10982. ;    evnt_list%      = !m_CaretPreMove_Anchor% + offset%
  10983. '    user_FN_offset% = evnt_list%!16
  10984. 2    data_list%      = !m_CaretPreMove_DataBlk%
  10985. ;    user_FN$        = $( data_list% + user_FN_offset% )
  10986. K    void% = 
  10987. ( "FN" + user_FN$ + "( _window_handle%, _icon_handle% )" )
  10988. ,*|Stop PROCshell_EvntHandle_CaretPreMove
  10989.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10990.  Caret PostMove Handler Routines                            
  10991.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10992. 0*|Start PROCshell_AttachCaretPostMoveHandler
  10993. shell_AttachCaretPostMoveHandler( window_handle%, user_FN$ )
  10994.  evnt_blk%, offset%, window_name$, data_offset_addr%, nr_evnts%
  10995.  PROCshell_Tracef0( "" )
  10996.  window_handle% > 0 
  10997. B  window_name$ =  
  10998. shell_GetWindowIdentifier( window_handle% )
  10999. x  offset%      =  
  11000. Evnts_GetEvntListOffset( window_name$, -1, m_CaretPostMove_Anchor%, c_CaretPostMove_RecSize%, 
  11001. .  evnt_blk%    =  !m_CaretPostMove_Anchor%
  11002. !  nr_evnts%    =  evnt_blk%!4
  11003.   evnt_blk%    += offset%
  11004. "  $evnt_blk%   =  window_name$
  11005.   evnt_blk%!12 =  -1
  11006.  !m_CaretPostMove_DataBlk% = 0 
  11007. N    !m_CaretPostMove_DataBlk% = 
  11008. shell_HeapBlockFetch( 
  11009. ( user_FN$ ) + 1 )
  11010. (  data_offset_addr% = evnt_blk% + 16
  11011. Evnts_UpdateData( data_offset_addr%, m_CaretPostMove_DataBlk%, m_CaretPostMove_DataOffset%, user_FN$ )
  11012.  PROCshell_Tracef0( "" )
  11013. /*|Stop PROCshell_AttachCaretPostMoveHandler
  11014. .*|Start PROCshell_EvntHandle_CaretPostMove
  11015. shell_EvntHandle_CaretPostMove( _window_handle%, _icon_handle% )
  11016.  window_name$, offset%, evnt_list%, user_FN_offset%, data_list%, user_FN$
  11017.  void%
  11018. @window_name$ = 
  11019. shell_GetWindowIdentifier( _window_handle% )
  11020.  window_name$ <> "" 
  11021. r  offset% = 
  11022. Evnts_GetEvntListOffset( window_name$, -1, m_CaretPostMove_Anchor%, c_CaretPostMove_RecSize%, 
  11023.  offset% >= 0 
  11024. <    evnt_list%      = !m_CaretPostMove_Anchor% + offset%
  11025. '    user_FN_offset% = evnt_list%!16
  11026. 3    data_list%      = !m_CaretPostMove_DataBlk%
  11027. ;    user_FN$        = $( data_list% + user_FN_offset% )
  11028. K    void% = 
  11029. ( "FN" + user_FN$ + "( _window_handle%, _icon_handle% )" )
  11030. -*|Stop PROCshell_EvntHandle_CaretPostMove
  11031.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11032.  Module Caret
  11033.  -----------------------------------------------------------------------
  11034.  Caret Handling Routines (version 1.00 03-Oct-95)
  11035.  This library contains routines that handle the caret
  11036.  -----------------------------------------------------------------------
  11037.  Structure of Data used in this module
  11038.  Public Methods Supported:
  11039.    FN_shell_Caret_Init                 Initialises module
  11040.    PROCshell_CaretSetPosition
  11041.    PROCshell_CaretReadPosition
  11042.    PROCshell_CaretSetRight
  11043.    PROCshell_CaretPutFirstIcon
  11044.    PROCshell_CaretPutLastIcon
  11045.    PROCshell_CaretPutNextIcon
  11046.    PROCshell_CaretPutPrevIcon
  11047.  Responses to events raised by other modules
  11048.  Private Methods Supported:
  11049.    PROCshell_CaretMoveCaret
  11050.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11051.  Public routines..
  11052.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11053. *|Start FN_shell_Caret_Init
  11054. _shell_Caret_Init
  11055. *|Stop FN_shell_Caret_Init
  11056. &*|Start PROCshell_CaretSetPosition
  11057. shell_CaretSetPosition(whandle%, ihandle%, xoff%, yoff%, height%, index%)
  11058.  "Wimp_SetCaretPosition",whandle%,ihandle%,xoff%,yoff%,height%,index%
  11059. shell_IconEnsureVisible( whandle%, ihandle% )
  11060. %*|Stop PROCshell_CaretSetPosition
  11061. '*|Start PROCshell_CaretReadPosition
  11062. shell_CaretReadPosition( 
  11063.  whandle%, 
  11064.  ihandle%, 
  11065.  x_offset%, 
  11066.  y_offset%, 
  11067.  index% )
  11068.  caret_blk%
  11069. ,caret_blk% = 
  11070. shell_HeapBlockFetch( 24 )
  11071.  "Wimp_GetCaretPosition", , caret_blk%
  11072. whandle%  = caret_blk%!00
  11073. ihandle%  = caret_blk%!04
  11074. x_offset% = caret_blk%!08
  11075. y_offset% = caret_blk%!12
  11076. index%    = caret_blk%!20
  11077. shell_HeapBlockReturn( caret_blk% )
  11078. &*|Stop PROCshell_CaretReadPosition
  11079. #*|Start PROCshell_CaretSetRight
  11080. shell_CaretSetRight( wh%, ih% )
  11081.  "Wimp_SetCaretPosition",wh%,ih%,-1,-1,-1,
  11082. shell_IconGetData(wh%,ih%))
  11083. "*|Stop PROCshell_CaretSetRight
  11084. '*|Start PROCshell_CaretPutFirstIcon
  11085. shell_CaretPutFirstIcon(wh%)
  11086.  caret_blk%
  11087. 4".caret_blk% = 
  11088. shell_HeapBlockFetch( 2048 )
  11089.  Get a list of writable icons in this window..
  11090.  "Wimp_WhichIcon", wh%, caret_blk%, &0040E000, &0000E000
  11091.  !caret_blk% <> -1 
  11092. 4'.  
  11093. shell_CaretSetRight( wh%, !caret_blk% )
  11094. 4(2  
  11095. shell_IconEnsureVisible( wh%, !caret_blk% )
  11096. shell_HeapBlockReturn( caret_blk% )
  11097.  PROCshell_CaretMoveCaret( wh%, 0 )
  11098. 4/&*|Stop PROCshell_CaretPutFirstIcon
  11099. 43&*|Start PROCshell_CaretPutLastIcon
  11100. shell_CaretPutLastIcon(wh%)
  11101. shell_CaretMoveCaret(wh%,1)
  11102. 48%*|Stop PROCshell_CaretPutLastIcon
  11103. 4<&*|Start PROCshell_CaretPutNextIcon
  11104. shell_CaretPutNextIcon(wh%)
  11105. shell_CaretMoveCaret(wh%,2)
  11106. 4A%*|Stop PROCshell_CaretPutNextIcon
  11107. 4E&*|Start PROCshell_CaretPutPrevIcon
  11108. shell_CaretPutPrevIcon(wh%)
  11109. shell_CaretMoveCaret(wh%,3)
  11110. 4J%*|Stop PROCshell_CaretPutPrevIcon
  11111.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11112.  Responses to events raised by other modules..
  11113.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11114.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11115.  Private module routines
  11116.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11117. 4]$*|Start PROCshell_CaretMoveCaret
  11118. shell_CaretMoveCaret(wh%,action%)
  11119.  caret_blk%,current_icon%,ctr%,ptr%,icon_nr%
  11120. ctr% = 0 :ptr% = 0
  11121. 4a,caret_blk% = 
  11122. shell_HeapBlockFetch(2048)
  11123.  Find current icon conatining the caret..
  11124.  "Wimp_GetCaretPosition",,caret_blk%
  11125.  caret_blk%!4 <> -1 
  11126.  There is a caret..
  11127. 4f"  current_icon% = caret_blk%!4
  11128. 4g5  
  11129.  Get a list of writable icons in this window..
  11130. 4h<  
  11131.  "Wimp_WhichIcon",wh%,caret_blk%,&0040E000,&0000E000
  11132. 4j7    
  11133.  caret_blk%!ctr% = current_icon% 
  11134.  ptr% = ctr%
  11135.     ctr% += 4
  11136.  caret_blk%!ctr% = -1
  11137.  action% 
  11138.       
  11139.  to first icon
  11140. 4p       icon_nr% = !caret_blk%
  11141.       
  11142.  to last icon
  11143. 4s*      icon_nr% = caret_blk%!(ctr% - 4)
  11144.       
  11145.  to next icon
  11146. 4v)      
  11147.  caret_blk%!(ptr% + 4) <> -1 
  11148. 4w,        icon_nr% = caret_blk%!(ptr% + 4)
  11149.       
  11150. 4y"        icon_nr% = !caret_blk%
  11151.       
  11152.       
  11153.  to previous icon
  11154.       
  11155.  ptr% > 0 
  11156. 4~,        icon_nr% = caret_blk%!(ptr% - 4)
  11157.       
  11158. 0        icon_nr% = caret_blk%!(ctr% - 4)    
  11159.       
  11160.  "Wimp_SetCaretPosition",wh%,icon_nr%,-1,-1,-1,
  11161. shell_IconGetData(wh%,icon_nr%))
  11162. shell_IconEnsureVisible( wh%, icon_nr% )
  11163. shell_HeapBlockReturn(caret_blk%)
  11164. #*|Stop PROCshell_CaretMoveCaret
  11165.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11166.  Module ExReg
  11167.  -----------------------------------------------------------------------
  11168.  ExReg Handling Routines (version 1.03 20-Jan-96)
  11169.  This library contains routines that handles extension library
  11170.  registration..
  11171.  -----------------------------------------------------------------------
  11172.  Structure of Data used in this module
  11173.  Public Methods Supported:
  11174.    FN_shell_ExReg_Init                 Initialises module
  11175.    FNshell_ExReg_FontMenu_Loaded
  11176.    FNshell_ExReg_Fonts_Loaded
  11177.    FNshell_ExReg_DrawLib_Loaded
  11178.    FNshell_ExReg_OLELib_Loaded
  11179.    FNshell_ExReg_FontLib_Loaded
  11180.    FNshell_ExReg_ShareBan_Loaded
  11181.    FNshell_ExReg_ColourMenu_Loaded
  11182.    PROCshell_ExReg_FontMenu_Loaded
  11183.    PROCshell_ExReg_Fonts_Loaded
  11184.    PROCshell_ExReg_OLELib_Loaded
  11185.    PROCshell_ExReg_DrawLib_Loaded
  11186.    PROCshell_ExReg_FontLib_Loaded
  11187.    PROCshell_ExReg_ShareBan_Loaded
  11188.    PROCshell_ExReg_ColourMenu_Loaded
  11189.  Responses to events raised by other modules
  11190.  Private Methods Supported:
  11191.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11192.  Public routines..
  11193.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11194. *|Start FN_shell_ExReg_Init
  11195. _shell_ExReg_Init
  11196. %_m_ExReg_FontMenu_Loaded%     = 
  11197. %_m_ExReg_Fonts_Loaded%        = 
  11198. %_m_ExReg_DrawLib_Loaded%      = 
  11199. %_m_ExReg_OLELib_Loaded%       = 
  11200. %_m_ExReg_FontLib_Loaded%      = 
  11201. %_m_ExReg_FontPickLib_Loaded%  = 
  11202. %_m_ExReg_ShareBan_Loaded%     = 
  11203. %_m_ExReg_ColourMenu_Loaded%   = 
  11204. *|Stop FN_shell_ExReg_Init
  11205. )*|Start FNshell_ExReg_FontMenu_Loaded
  11206. shell_ExReg_FontMenu_Loaded
  11207. = _m_ExReg_FontMenu_Loaded%
  11208. (*|Stop FNshell_ExReg_FontMenu_Loaded
  11209. +*|Start PROCshell_ExReg_FontMenu_Loaded
  11210. shell_ExReg_FontMenu_Loaded
  11211. !_m_ExReg_FontMenu_Loaded% = 
  11212. **|Stop PROCshell_ExReg_FontMenu_Loaded
  11213. )*|Start FNshell_ExReg_ShareBan_Loaded
  11214. shell_ExReg_ShareBan_Loaded
  11215. = _m_ExReg_ShareBan_Loaded%
  11216. (*|Stop FNshell_ExReg_ShareBan_Loaded
  11217. +*|Start PROCshell_ExReg_ShareBan_Loaded
  11218. shell_ExReg_ShareBan_Loaded
  11219. !_m_ExReg_ShareBan_Loaded% = 
  11220. **|Stop PROCshell_ExReg_ShareBan_Loaded
  11221. &*|Start FNshell_ExReg_Fonts_Loaded
  11222. shell_ExReg_Fonts_Loaded
  11223. = _m_ExReg_Fonts_Loaded%
  11224. %*|Stop FNshell_ExReg_Fonts_Loaded
  11225. (*|Start PROCshell_ExReg_Fonts_Loaded
  11226. shell_ExReg_Fonts_Loaded
  11227. _m_ExReg_Fonts_Loaded% = 
  11228. '*|Stop PROCshell_ExReg_Fonts_Loaded
  11229. (*|Start FNshell_ExReg_DrawLib_Loaded
  11230. shell_ExReg_DrawLib_Loaded
  11231. = _m_ExReg_DrawLib_Loaded%
  11232. '*|Stop FNshell_ExReg_DrawLib_Loaded
  11233. **|Start PROCshell_ExReg_DrawLib_Loaded
  11234. shell_ExReg_DrawLib_Loaded
  11235.  _m_ExReg_DrawLib_Loaded% = 
  11236. )*|Stop PROCshell_ExReg_DrawLib_Loaded
  11237. '*|Start FNshell_ExReg_OLELib_Loaded
  11238. shell_ExReg_OLELib_Loaded
  11239. = _m_ExReg_OLELib_Loaded%
  11240. &*|Stop FNshell_ExReg_OLELib_Loaded
  11241. )*|Start PROCshell_ExReg_OLELib_Loaded
  11242. shell_ExReg_OLELib_Loaded
  11243. _m_ExReg_OLELib_Loaded% = 
  11244. 5!(*|Stop PROCshell_ExReg_OLELib_Loaded
  11245. 5%(*|Start FNshell_ExReg_FontLib_Loaded
  11246. shell_ExReg_FontLib_Loaded
  11247. = _m_ExReg_FontLib_Loaded%
  11248. 5)'*|Stop FNshell_ExReg_FontLib_Loaded
  11249. 5-**|Start PROCshell_ExReg_FontLib_Loaded
  11250. shell_ExReg_FontLib_Loaded
  11251. 5/ _m_ExReg_FontLib_Loaded% = 
  11252. 52)*|Stop PROCshell_ExReg_FontLib_Loaded
  11253. 56+*|Start FNshell_ExReg_ColourMenu_Loaded
  11254. shell_ExReg_ColourMenu_Loaded
  11255. 58!= _m_ExReg_ColourMenu_Loaded%
  11256. 5:**|Stop FNshell_ExReg_ColourMenu_Loaded
  11257. 5>-*|Start PROCshell_ExReg_ColourMenu_Loaded
  11258. shell_ExReg_ColourMenu_Loaded
  11259. 5@#_m_ExReg_ColourMenu_Loaded% = 
  11260. 5C,*|Stop PROCshell_ExReg_ColourMenu_Loaded
  11261.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11262.  Responses to events raised by other modules..
  11263.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11264.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11265.  Private module routines
  11266.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11267.  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11268.  Module Sprites
  11269.  -----------------------------------------------------------------------
  11270.  Sprites Handling Routines (version 1.03 17-Dec-95)
  11271.  -----------------------------------------------------------------------
  11272.  Structure of Data used in this module
  11273.  Public Methods Supported:
  11274.    FN_shell_Sprites_Init                 Initialises module
  11275.    FNshell_SpriteAreaLoad
  11276.    FNshell_SpriteGetPtr
  11277.    FNshell_UserSpritesBase
  11278.    FNshell_NameOfFirstSprite
  11279.    FNshell_SpriteExists
  11280.    FNshell_SpriteExistsInUserArea
  11281.    FNshell_SpriteExistsInWimpPool
  11282.    FNshell_SpritesGetHeaderSize
  11283.    PROCshell_SpriteRename
  11284.    PROCshell_SpriteAreaSave
  11285.    PROCshell_SpriteAreaInit
  11286.    PROCshell_SpriteLoad
  11287.    PROCshell_SpriteRemoveLeftWastage
  11288.    PROCshell_SpriteGetSize
  11289.    PROCshell_SpriteGetMode
  11290.    PROCshell_SpriteLoadAsDraw
  11291.  Private Methods Supported:
  11292.    None
  11293. 5{!*|Start FN_shell_Sprites_Init
  11294. _shell_Sprites_Init
  11295.  Module constants
  11296. #_c_Sprites_AreaHeaderSize% = 16
  11297. ,_c_Sprites_ReasonInitArea%          =  9
  11298. ,_c_Sprites_ReasonLoad%              = 10
  11299. ,_c_Sprites_ReasonGetSize%           = 40
  11300. ,_c_Sprites_ReasonRemoveLeftWastage% = 54
  11301. \_c_Sprites_BadNameOrPtr$ = "Either a sprite name or a pointer to a sprite must be given"
  11302.  *|Stop FN_shell_Sprites_Init
  11303. (*|Start FNshell_SpritesGetHeaderSize
  11304. shell_SpritesGetHeaderSize
  11305. !=  _c_Sprites_AreaHeaderSize%
  11306. '*|Stop FNshell_SpritesGetHeaderSize
  11307. "*|Start FNshell_SpriteAreaLoad
  11308. shell_SpriteAreaLoad(filename$)
  11309.  sp%,S%,T%
  11310.  (filename$):T%=
  11311. #S%+16:
  11312. !sp%=
  11313. shell_HeapBlockFetch(T%)
  11314. !sp%   = T%
  11315. sp%!04 = 0
  11316. 'sp%!08 = _c_Sprites_AreaHeaderSize%
  11317. 'sp%!12 = _c_Sprites_AreaHeaderSize%
  11318.  "OS_SpriteOp",&209,sp%
  11319.  "OS_SpriteOp",&20A,sp%,filename$
  11320. *|ifdef TraceInit
  11321.  PROCshell_Tracef0("SpriteLoad:Sprite file loaded at &"+STR$~sp%)
  11322. *|endif
  11323. !*|Stop FNshell_SpriteAreaLoad
  11324. #*|Start FNshell_UserSpritesBase
  11325. shell_UserSpritesBase
  11326. =_U%!16
  11327. "*|Stop FNshell_UserSpritesBase
  11328.  *|Start FNshell_SpriteGetPtr
  11329. shell_SpriteGetPtr(spritearea%,name$)
  11330.  buffer%,ptr%
  11331. %buffer%=
  11332. shell_HeapBlockFetch(21)
  11333. $buffer%=name$
  11334.  "OS_SpriteOp",&118,spritearea%,buffer% 
  11335.  ,,ptr%
  11336. shell_HeapBlockReturn(buffer%)
  11337.     =ptr%
  11338. *|Stop FNshell_SpriteGetPtr
  11339. %*|Start FNshell_NameOfFirstSprite
  11340. shell_NameOfFirstSprite(File$)
  11341.  X%,N%,S$
  11342. (File$)
  11343. #X%=4
  11344. #X%*&100
  11345. #X%*&10000
  11346. #X%*&1000000
  11347. #X%=N%
  11348.     S$=""
  11349.  N%=0 
  11350. $*|Stop FNshell_NameOfFirstSprite
  11351. "*|Start PROCshell_SpriteRename
  11352. shell_SpriteRename(spritearea%,old$,new$)
  11353.  "OS_SpriteOp",&200+26,spritearea%,
  11354. shell_SpriteGetPtr(spritearea%,old$),new$
  11355. !*|Stop PROCshell_SpriteRename
  11356. $*|Start PROCshell_SpriteAreaSave
  11357. shell_SpriteAreaSave(spritearea%,filename$)
  11358.  "OS_SpriteOp",&200+12,spritearea%,filename$
  11359. #*|Stop PROCshell_SpriteAreaSave
  11360.  *|Start FNshell_SpriteExists
  11361. shell_SpriteExists( sprite_area%, sprite_name$ )
  11362.  reason_GetSpriteInfo%
  11363.  If sprite doesn't exist the call to OS_SpriteOp causes an
  11364.  error and FALSE is returned. If it does exist the return
  11365.  values are ignored and TRUE is returned.
  11366.  sprite_area% = 1 
  11367.    reason_GetSpriteInfo% = 40
  11368. &  reason_GetSpriteInfo% = 256 + 40
  11369.  "OS_SpriteOp", reason_GetSpriteInfo%, sprite_area%, 
  11370. shell_StringLowerCase( sprite_name$ )
  11371. *|Stop FNshell_SpriteExists
  11372. **|Start FNshell_SpriteExistsInUserArea
  11373. shell_SpriteExistsInUserArea( sprite_name$ )
  11374. shell_SpriteExists( 
  11375. shell_UserSpritesBase, sprite_name$ )
  11376. )*|Stop FNshell_SpriteExistsInUserArea
  11377. **|Start FNshell_SpriteExistsInWimpPool
  11378. shell_SpriteExistsInWimpPool( sprite_name$ )
  11379. shell_SpriteExists( 1, sprite_name$ )
  11380. )*|Stop FNshell_SpriteExistsInWimpPool
  11381.  --------------------------------------------------------------------------
  11382. 6    $*|Start PROCshell_SpriteAreaInit
  11383. shell_SpriteAreaInit( sprite_area%, area_size% )
  11384. sprite_area%!0 = area_size%
  11385.  ..no sprite loaded yet, so size of sprite area is just the header
  11386. /sprite_area%!8 = _c_Sprites_AreaHeaderSize%
  11387.  "OS_SpriteOp", _c_Sprites_ReasonInitArea% + 256, sprite_area%
  11388. #*|Stop PROCshell_SpriteAreaInit
  11389.  *|Start PROCshell_SpriteLoad
  11390. shell_SpriteLoad( sprite_area%, file_name$ )
  11391.  "OS_SpriteOp", _c_Sprites_ReasonLoad% + 256, sprite_area%, file_name$
  11392. *|Stop PROCshell_SpriteLoad
  11393. 6#-*|Start PROCshell_SpriteRemoveLeftWastage
  11394. shell_SpriteRemoveLeftWastage( sprite_area%, sprite_name$, sprite_ptr% )
  11395.  sprite_name$ = "" 
  11396.  sprite_ptr% <= 0 
  11397. 6(&    
  11398.  99, _c_Sprites_BadNameOrPtr$
  11399. 6*\  
  11400.  "OS_SpriteOp", _c_Sprites_ReasonRemoveLeftWastage% + 512, sprite_area%, sprite_ptr%
  11401. 6,]  
  11402.  "OS_SpriteOp", _c_Sprites_ReasonRemoveLeftWastage% + 256, sprite_area%, sprite_name$
  11403. 61,*|Stop PROCshell_SpriteRemoveLeftWastage
  11404. 65#*|Start PROCshell_SpriteGetSize
  11405. shell_SpriteGetSize( sprite_area%, sprite_name$, sprite_ptr%, 
  11406.  width%, 
  11407.  height% )
  11408.  sprite_name$ = "" 
  11409.  sprite_ptr% <= 0 
  11410. 6:&    
  11411.  99, _c_Sprites_BadNameOrPtr$
  11412. 6<k  
  11413.  "OS_SpriteOp", _c_Sprites_ReasonGetSize% + 512, sprite_area%, sprite_ptr% 
  11414.    , , ,width%, height%
  11415. 6>l  
  11416.  "OS_SpriteOp", _c_Sprites_ReasonGetSize% + 256, sprite_area%, sprite_name$ 
  11417.    , , ,width%, height%
  11418. 6C"*|Stop PROCshell_SpriteGetSize
  11419. 6G#*|Start PROCshell_SpriteGetMode
  11420. shell_SpriteGetMode( sprite_area%, sprite_name$, sprite_ptr%, 
  11421.  mode% )
  11422.  sprite_name$ = "" 
  11423.  sprite_ptr% <= 0 
  11424. 6L&    
  11425.  99, _c_Sprites_BadNameOrPtr$
  11426. 6Nh  
  11427.  "OS_SpriteOp", _c_Sprites_ReasonGetSize% + 512, sprite_area%, sprite_ptr% 
  11428.    , , , , , , mode%
  11429. 6Pi  
  11430.  "OS_SpriteOp", _c_Sprites_ReasonGetSize% + 256, sprite_area%, sprite_name$ 
  11431.    , , , , , , mode%
  11432. 6U"*|Stop PROCshell_SpriteGetMode
  11433. 6Y&*|Start PROCshell_SpriteLoadAsDraw
  11434. shell_SpriteLoadAsDraw( file_name$, file_size%, x_offset%, y_offset%, 
  11435.  drawsprite_buffer%, 
  11436.  sprite_area_handle% )
  11437.  Technique described in Risc User July/August 1995, original idea by
  11438.  Dean Sivell
  11439.  drawfile_block%, draw_header_size%, sprite_area%
  11440.  width%, height%, mode%, xeigfactor%, yeigfactor%
  11441.  object_type_sprite% 
  11442.  first claim a memory block to hold the created drawfile..
  11443. shell_DrawCreateFile( drawsprite_buffer% )
  11444. shell_DrawSpriteArea( drawsprite_buffer%, file_size%, sprite_area% )
  11445.  Return 'handle' of created sprite area (actually the offset from the start
  11446.  of the DrawFile buffer) in case the user wants to add graphics to it..
  11447. 6i;sprite_area_handle% = sprite_area% - drawsprite_buffer%
  11448.  offset from start of drawfile buffer to sprite area is 108..
  11449. 6l?drawfile_block% = drawsprite_buffer% + drawsprite_buffer%!4
  11450. draw_header_size% = 48
  11451.  Now actually load the file into the sprite area..
  11452. shell_SpriteLoad( sprite_area%, file_name$ )
  11453.  and remove any left hand wastage from the sprite..
  11454. shell_SpriteRemoveLeftWastage( sprite_area%, "", sprite_area% + _c_Sprites_AreaHeaderSize% )
  11455.  now find the size and mode of the loaded sprite..
  11456. shell_SpriteGetSize( sprite_area%, "", sprite_area% + _c_Sprites_AreaHeaderSize%, width%, height% )
  11457. shell_SpriteGetMode( sprite_area%, "", sprite_area% + _c_Sprites_AreaHeaderSize%, mode% )
  11458.  To scale the sprite image to the correct size for the mode it was
  11459.  created in, find the size of pixels for that mode..
  11460.  "OS_ReadModeVariable", mode%, 4 
  11461.  , , xeigfactor%
  11462.  "OS_ReadModeVariable", mode%, 5 
  11463.  , , yeigfactor%
  11464.  Adjust height and width accordingly..
  11465. $width%  = width%  << xeigfactor%
  11466. $height% = height% << yeigfactor%
  11467.  Create DrawFile header..
  11468. $drawfile_block% = "Draw"
  11469. drawfile_block%!4 = 201
  11470. drawfile_block%!8 = 0
  11471. +$( drawfile_block% + 12 ) = "SprToDraw"
  11472.  Set bounding box of DrawFile (same size as sprite as we have only one
  11473.  object)..
  11474. Kdrawfile_block%!24 = x_offset% * 256                        :
  11475.  OS units
  11476. Kdrawfile_block%!28 = y_offset% * 256                        :
  11477.  OS units
  11478. Kdrawfile_block%!32 = ( drawfile_block%!24 ) + width%  * 256 :
  11479.  OS units
  11480. Kdrawfile_block%!36 = ( drawfile_block%!28 ) + height% * 256 :
  11481.  OS units
  11482.  Create Sprite object info (this overwrites the sprite area info which was
  11483.  only needed for loading the sprite)..
  11484. object_type_sprite% = 5
  11485. ,drawfile_block%!40 = object_type_sprite%
  11486. (drawfile_block%!44 = file_size% + 24
  11487. Kdrawfile_block%!48 = x_offset% * 256                        :
  11488.  OS units
  11489. Kdrawfile_block%!52 = y_offset% * 256                        :
  11490.  OS units
  11491. Kdrawfile_block%!56 = ( drawfile_block%!48 ) + width%  * 256 :
  11492.  OS units
  11493. Kdrawfile_block%!60 = ( drawfile_block%!52 ) + height% * 256 :
  11494.  OS units
  11495.  PROCshell_DrawSaveFile( drawsprite_buffer%, "RAM::RamDisc0.$.paul" )
  11496. %*|Stop PROCshell_SpriteLoadAsDraw
  11497.