home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 1
/
ARM_CLUB_CD.iso
/
contents
/
apps
/
program
/
d
/
eventshell
/
!ShellSys
/
ShellLib
(
.txt
)
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
RISC OS BBC BASIC V Source
|
1993-12-07
|
177.1 KB
|
6,383 lines
>EvntShellSystem:ShellLib
"*|Start FNshell_LibraryVersion
shell_LibraryVersion
=1.27*100
1.27c (fix indirected data when loading templates)
!*|Stop FNshell_LibraryVersion
routine to find handle of parent needed..
or search all submenu handles so that it can be changed..
or store a list of menu item handles together with the submenu handles..
*|Start PROCshell_Error
shell_Error
pos%,report$
ON ERROR OFF
<> &D00
<> &903
fatal error..
"XHourglass_Smash"
shell_OSCheckVersion(3)
shell_FileExists("Resources:$.Resources.Edit.ThrowBack")
shell_Exit
=
("Set Basic$File <"+
shell_GetAppName+"$BasicFile>")
"Edit:ThrowBack"
L
shell_ErrorBox("Unexpected error:- "+
$+" Internal error code "+
Non-fatal error from shell_OK, or out of memory error from heap
manager routines....strip out name of library file..
: pos% =
$,"in " +
34 + "EvntShellSystem:ShellLib")
pos% > 0
report$ =
$,pos% - 1)
shell_ErrorBox(report$)
"XHourglass_Smash"
RESTORE ERROR
*|Stop PROCshell_Error
*|Start PROCshell_OK
shell_OK(e$)
&D00,e$
*|Stop PROCshell_OK
*|Start PROCshell_ErrorBox
shell_ErrorBox(r$)
r%,err_blk%
err_blk% = _shell_blk%
4-!err_blk% =
:$(err_blk% + 4) = r$ +
= &D00
= &903
"XWimp_ReportError",err_blk%,%10001,"Message from " +
shell_GetAppName
"XWimp_ReportError",err_blk%,1,
shell_GetAppName
IF r%=2 THEN _closedown%=TRUE
*|Stop PROCshell_ErrorBox
?)*|Start FNshell_GetLastSecureFileName
shell_GetLastSecureFileName
temp%
temp%=_U%!80
temp%=0
=$temp%
F(*|Stop FNshell_GetLastSecureFileName
*|Start FNshell_GetString
shell_GetString(Address%)
String$,Len%
((Address%?Len%)>31
Len%<255)
String$+=
(Address%?Len%)
Len%+=1
=String$
*|Stop FNshell_GetString
S#*|Start FNshell_GetEventHandler
shell_GetEventHandler(wh%,ic%,e_type%)
ptr%,event_list%,found%,list_size%,fn$
wh%=-1
wh%=-2
W-list_size%=
shell_HeapBlockInfo(_U%!12)-8
ptr%=0
found%=
event_list%=_U%!12
fn$=""
(event_list%!ptr%=wh%)
^!
event_list%!(ptr%+4)
`2
window handle found, icon handle is -1
aA
check that a pointer has been defined to a heap block
b@
containing a function name (if it is 0 then no event
defined)...
d7
event_list%!(ptr%+(12+(e_type%*4)))>&8000
e6 fn$=$(event_list%!(ptr%+(12+(e_type%*4))))
found%=
ptr%+=48
j
k7
check icon handle in event block as well...
l&
event_list%!(ptr%+4)=ic%
m5
window/icon handle event block found...
nC
check that a pointer has been defined to a heap block
oB
containing a function name (if it is 0 then no event
defined)...
q9
event_list%!(ptr%+(12+(e_type%*4)))>&8000
r8 fn$=$(event_list%!(ptr%+(12+(e_type%*4))))
found%=
ptr%+=48
ptr%+=48
z
ptr%+=48
((ptr%>=list_size%)
found%)
"*|Stop FNshell_GetEventHandler
*|Start FNshell_GetEventMenu
shell_GetEventMenu(button%,wh%,ic%)
ptr%,event_list%,found%,list_size%,menu%
wh%=-1
wh%=-2
-list_size%=
shell_HeapBlockInfo(_U%!12)-8
ptr%=0
found%=
event_list%=_U%!12
fn$=""
PROCshell_Tracef0("GetEventMenu:Started..")
PROCshell_Tracef0("GetEventMenu:button is "+STR$button%)
PROCshell_Tracef0("GetEventMenu:window is "+STR$wh%)
PROCshell_Tracef0("GetEventMenu:icon is "+STR$ic%)
(event_list%!ptr%=wh%)
?
shell_Tracef0("GetEventMenu:window handle matched..")
&
event_list%!(ptr%+4) = ic%
C
PROCshell_Tracef0("GetEventMenu:icon handle matched..")
$ menu%=event_list%!(ptr%+8)
$
menu%=-2
menu%=_U%!252
found%=
G
PROCshell_Tracef0("GetEventMenu:icon handle NOT matched..")
-
IF event_list%!(ptr%+4) = -1 THEN
IF button%=2 THEN
*
menu%=event_list%!(ptr%+8)
.
IF menu%=-2 THEN menu%=_U%!252
found%=TRUE
ELSE
ptr%+=48
ENDIF
ELSE
ptr%+=48
ENDIF
ptr% += 48
(ptr%>=list_size%
found%)
=menu%
*|Stop FNshell_GetEventMenu
&*|Start FNshell_GetEventListOffset
shell_GetEventListOffset(wh%,ih%,event_list%,rec_size%,add%)
find offset of data in event list block given the window/icon
handles. returns -1 if no events found, -2 if heapblock not defined
if add% is FALSE. when add is TRUE then the list is extended and the
offset to the new record is returned.
list_size%,ptr%,found%,offset%,empty%,temp%
(!event_list%=0
add%=
=-2:
no heapblock defined
(!event_list%=0)
no heap block defined and add flag is true...
3 !event_list%=
shell_HeapBlockFetch(rec_size%)
, temp%=!event_list%:temp%!0=0:temp%!4=0
3list_size%=
shell_HeapBlockInfo(!event_list%)-8
(ptr%=0:found%=
:offset%=-1:empty%=-1
temp%=!event_list%
PROCshell_Tracef0("GetEventListOffset:window handle=&"+STR$~temp%!ptr%)
when scanning list note offset of first empty record for use when
adding a new event to the list. Empty records have 0 for both
window and icon handles
empty%<0
7
(temp%!ptr%=0
temp%!ptr%+4=0)
empty%=ptr%
(temp%!ptr%=wh%)
C
events attached to no particular icon are registered with
an icon handle of -1
E
PROCshell_Tracef0("GetEventListOffset:window handle found")
ih%=-1
6
icon handle is -1, so event has been found
E
PROCshell_Tracef0("GetEventListOffset:icon handle is -1")
offset%=ptr%
found%=
6
check icon handle in event block as well..
*|ifdef PROCshell_TraceInit
D
shell_Tracef0("GetEventListOffset:icon handle is not -1")
*|endif
temp%!(ptr%+4)=ih%
offset%=ptr%
found%=
ptr%+=rec_size%
)
no match, so check next event..
ptr%+=rec_size%
((ptr%>=list_size%)
found%)
found%
PROCshell_Tracef0("GetEventListOffset:Event found")
PROCshell_Tracef0("GetEventListOffset:End of event list - event not found")
(offset%=-1
add%)
empty%<0
7
no empty records found to use for the new one
offset%=list_size%
C !event_list%=
shell_HeapBlockExtend(!event_list%,rec_size%)
temp%=!event_list%
* temp%+=offset%:temp%!0=0:temp%!4=0
"
re-use old deleted event
offset%=empty%
=offset%
%*|Stop FNshell_GetEventListOffset
*|Start PROCshell_AttachPane
shell_AttachPane(wh%,
pane_handle%,flags%,x_off%,y_off%)
blk%,offset%,temp%,nr_pane_events%,pane_flags%
shell_Tracef0("AttachPane:Attaching Pane Handler")
first check that the flags of the pane window are correctly set..
3pane_flags%=
shell_WindowGetFlags(pane_handle%)
(pane_flags%
1<<5)=0
shell_Tracef0("AttachPane:'Pane' bit of pane window is not set, fixing..")
shell_WindowToggleFlags(pane_handle%,1<<5)
(pane_flags%
1<<1)
shell_Tracef0("AttachPane:'Moveable' bit of pane window is set, fixing..")
shell_WindowToggleFlags(pane_handle%,1<<1)
9offset%=
shell_GetEventListOffset(wh%,-1,_U%+92,24,
offset%<0
no existing pane event block
shell_Tracef0("AttachPane:Creating pane event block")
; offset%=
shell_GetEventListOffset(wh%,-1,_U%+92,24,
blk%=_U%!92+offset%
blk%!0=wh%:blk%!4=-1
% blk%!8=
shell_HeapBlockFetch(4)
& blk%!12=
shell_HeapBlockFetch(4)
& blk%!16=
shell_HeapBlockFetch(4)
& blk%!20=
shell_HeapBlockFetch(4)
temp%=blk%!8:!temp%=-1
temp%=blk%!12:!temp%=-1
temp%=blk%!16:!temp%=-1
temp%=blk%!20:!temp%=-1
blk%=_U%!92+offset%
)temp%=blk%!8:ctr%=0:nr_pane_events%=0
temp%!ctr%<>-1
ctr%+=4
nr_pane_events%+=1
+blk%!8=
shell_HeapBlockExtend(blk%!8,4)
7temp%=blk%!8:temp%!(nr_pane_events%*4)=pane_handle%
$temp%!((nr_pane_events%+1)*4)=-1
-blk%!12=
shell_HeapBlockExtend(blk%!12,4)
2temp%=blk%!12:temp%!(nr_pane_events%*4)=flags%
$temp%!((nr_pane_events%+1)*4)=-1
-blk%!16=
shell_HeapBlockExtend(blk%!16,4)
2temp%=blk%!16:temp%!(nr_pane_events%*4)=x_off%
!$temp%!((nr_pane_events%+1)*4)=-1
"-blk%!20=
shell_HeapBlockExtend(blk%!20,4)
#2temp%=blk%!20:temp%!(nr_pane_events%*4)=y_off%
$$temp%!((nr_pane_events%+1)*4)=-1
*|Stop PROCshell_AttachPane
)$*|Start PROCshell_AttachDataLoad
shell_AttachDataLoad(wh%,ih%,type%,fn$,no_load%)
blk%,temp%,offset%,cmdline$
shell_Tracef0("AttachDataLoad:Attaching DataLoad Handler")
wh%=-1
wh%=-2
no_load%
type%=type%
1<<31
/:offset%=
shell_GetEventListOffset(wh%,ih%,_U%+96,16,
modify above to set first two words to 0 to denote a new
empty event block
blk%=_U%!96+offset%
blk%!0=0
blk%!4=0
this is first event......
shell_Tracef0("AttachDataLoad:This is the first DataLoad Event...")
blk%!0=wh%:blk%!4=ih%
8% blk%!8=
shell_HeapBlockFetch(8)
temp%=blk%!8
temp%!0=type%:temp%!4=-1
;& blk%!12=
shell_HeapBlockFetch(8)
temp%=blk%!12
=- temp%!0=
shell_HeapBlockFetch(
(fn$)+1)
temp%!4=-1
temp%=temp%!0:$temp%=fn$
adding new filetype/function to an existing event
extend filetype heapblock...
shell_Tracef0("AttachDataLoad:This is another DataLoad Event...")
D- blk%!8=
shell_HeapBlockExtend(blk%!8,4)
and function name heapblock...
F/ blk%!12=
shell_HeapBlockExtend(blk%!12,4)
find out how many filetypes there are now...
ctr%=0:temp%=blk%!8
temp%!ctr%<>-1
ctr%+=4
L( temp%!ctr%=type%:temp%!(ctr%+4)=-1
temp%=blk%!12
N. temp%!ctr%=
shell_HeapBlockFetch(
fn$+1)
O! temp%=temp%!ctr%:$temp%=fn$
Now check if program was started by double clicking on a data file...
R$cmdline$ =
shell_GetCmdLineArgs
PROCshell_Tracef0("LL:cmdline="+cmdline$)
PROCshell_Tracef0("LL:flag bit ="+STR$((_U%!100 AND 1 << 5)))
PROCshell_Tracef0("LL:wh% ="+STR$~wh%)
PROCshell_Tracef0("LL:type% ="+STR$~type%)
cmdline$ <> ""
wh% < 0
(_U%!100
1 << 5)
It was, check file is correct type, ignoring the top bit...
type%
1 << 31
temp% = type%
1 << 31
temp% = type%
shell_FileType(cmdline$) = temp%
It is, so load it...
\2
shell_MessageSendDataLoad(temp%,cmdline$)
]G _U%!100 = _U%!100
(1 << 5) :
Unset load pending flag bit...
b#*|Stop PROCshell_AttachDataLoad
d$*|Start PROCshell_AttachDataSave
shell_AttachDataSave(wh%,ih%,address%,type%,name_ic%,fn$)
blk%,temp%,offset%
check file icon is a sprite icon, complain otherwise..
shell_IconIsSprite(wh%,ih%)
shell_OK(
shell_MessageNoArgs("SHELLMSG29"))
change file type icon button type to click/drag..
shell_IconSetButtonType(wh%,ih%,6)
address%=0
address%=100:
estimated size - wild guess.
*|ifdef TraceInit
shell_Tracef0("AttachDataSave:Attaching DataSave Handler to icon "+
ih%+" in window &"+
~wh%)
shell_Tracef0("AttachDataSave:Handler function is '"+fn$+"'")
*|endif
p:offset%=
shell_GetEventListOffset(wh%,ih%,_U%+72,24,
blk%=_U%!72+offset%
r7blk%!0=wh%:blk%!4=ih%:blk%!8=address%:blk%!12=type%
blk%!16=name_ic%
t+blk%!20=
shell_HeapBlockFetch(
(fn$)+1)
temp%=blk%!20:$temp%=fn$
type%
&FF9
x:
kludge for sprite files as first word should not
be saved
address%>&8000
{2 _U%!136=
shell_HeapBlockInfo(address%)-8
|
_U%!136=address%
~
address%>&8000
2 _U%!136=
shell_HeapBlockInfo(address%)-4
_U%!136=address%
_U%!140=type%
_U%!144 holds address of file heapblock buffer. If address%<&8000 then
file is not in a buffer and address% is actually the estimated size..
_U%!144=address%
#*|Stop PROCshell_AttachDataSave
*|Start PROCshell_AttachMenu
shell_AttachMenu(wh%,ic%,menu%,shift%,ctrl%,alt%)
offset%
wh%>0
ic%>=0
shell_IconSetButtonType(wh%,ic%,3)
offset%=FNshell_SearchStatic(_U%!184,wh%)
IF offset%=-1 THEN ERROR 99,FNshell_MessageNoArgs("SHELLMSG30")
*|ifdef TraceInit
shell_Tracef0("AttachMenu:Attaching menu handle &"+
~menu%+" to window handle &"+
~wh%)
*|endif
shell_EventAdd(wh%,ic%,0,menu%,"")
*|Stop PROCshell_AttachMenu
%*|Start PROCshell_AttachMenuMaker
shell_AttachMenuMaker(wh%,ic%,fn$)
shell_Tracef0("AttachMenuMaker:Attaching menumaker function '"+fn$+"'")
shell_EventAdd(wh%,ic%,1,0,fn$)
$*|Stop PROCshell_AttachMenuMaker
$*|Start PROCshell_AttachMenuDBox
shell_AttachMenuDBox(item%,window$,preopenfn$,postopenfn$)
Check current submenu handle. We should release any memory
allocated by previous calls (when I work out how to do it)
blk%,temp%,addr%
shell_WindowLoaded(window$)
shell_MessageOneArg("SHELLMSG03",window$)
"blk%=
shell_HeapBlockFetch(12)
,blk%!0=
shell_HeapBlockFetch(
window$+1)
temp%=blk%!0:$temp%=window$
/blk%!4=
shell_HeapBlockFetch(
preopenfn$+1)
"temp%=blk%!4:$temp%=preopenfn$
0blk%!8=
shell_HeapBlockFetch(
postopenfn$+1)
#temp%=blk%!8:$temp%=postopenfn$
Store address of heapblock in submenu pointer word of
menu item definition. Cunning huh........
"MenuUtil_SubMenu",item%,blk%
"MenuUtil_Warning",,
#*|Stop PROCshell_AttachMenuDBox
'*|Start PROCshell_AttachClickSelect
shell_AttachClickSelect(wh%,ic%,fn$)
shell_EventAdd(wh%,ic%,2,0,fn$)
&*|Stop PROCshell_AttachClickSelect
'*|Start PROCshell_AttachClickAdjust
shell_AttachClickAdjust(wh%,ic%,fn$)
shell_EventAdd(wh%,ic%,3,0,fn$)
&*|Stop PROCshell_AttachClickAdjust
&*|Start PROCshell_AttachUserRedraw
shell_AttachUserRedraw(
wh%,fn$)
blk%,f%,old_handle%
"blk%=
shell_HeapBlockFetch(40)
,!blk%=wh%:
"Wimp_GetWindowState",,blk%
f%=blk%!32
shell_HeapBlockReturn(blk%)
shell_Tracef0("AttachUserRedraw:flag%=&"+
(f%
1<<4)
shell_Tracef0("AttachUserRedraw:auto redraw set!!")
store original handle in case the wimp allocates a new handle..
old_handle% = wh%
shell_WindowToggleFlags(wh%,1 << 4)
wh% <> old_handle%
2
shell_UpdateWindowHandle(old_handle%,wh%)
shell_EventAdd(wh%,-1,4,0,fn$)
%*|Stop PROCshell_AttachUserRedraw
$*|Start PROCshell_AttachKeypress
shell_AttachKeypress(wh%,ic%,fn$)
shell_EventAdd(wh%,ic%,5,0,fn$)
#*|Stop PROCshell_AttachKeypress
*|Start PROCshell_AttachDrag
shell_AttachDrag(wh%,ic%,est_size%,fn$)
shell_EventAdd(wh%,ic%,6,0,fn$)
*|Stop PROCshell_AttachDrag
#*|Start PROCshell_AttachHelpTag
shell_AttachHelpTag(wh%,ic%,tag$)
shell_EventAdd(wh%,ic%,8,0,tag$)
"*|Stop PROCshell_AttachHelpTag
*|Start PROCshell_EventAdd
shell_EventAdd(wh%,ic%,e_type%,menu%,fn$)
ptr%,fn%,event_list%,list_size%,found%
fn_addr%
ptr%=0:found%=
wh%=-1
wh%=-2
-list_size%=
shell_HeapBlockInfo(_U%!12)-8
event_list%=_U%!12
PROCshell_Tracef0("XX:checking for wh &"+STR$~wh%+" ih &"+STR$~ic%)
(event_list%!ptr%=wh%)
0
PROCshell_Tracef0("XX:ptr%="+STR$ptr%)
U
PROCshell_Tracef0("XX:found window handle in list, checking icon handle..")
$
event_list%!(ptr%+4)=ic%
found%=
ptr%+=48
ptr%+=48
(ptr%>=list_size%
found%)
found%=
ptr%=0
(event_list%!ptr%<>0 )
ptr%+=48
ptr%>=list_size%
1 _U%!12=
shell_HeapBlockExtend(_U%!12,48)
event_list%=_U%!12
event_list%!(ptr%+0)=0
event_list%!(ptr%+4)=0
event_list%!(ptr%+8)=0
event_list%!(ptr%+12)=0
event_list%!(ptr%+16)=0
event_list%!(ptr%+20)=0
event_list%!(ptr%+24)=0
event_list%!(ptr%+28)=0
event_list%!(ptr%+32)=0
event_list%!(ptr%+36)=0
event_list%!(ptr%+40)=0
event_list%!(ptr%+44)=0
event_list%!(ptr%+0)=wh%
event_list%!(ptr%+4)=ic%
menu%<>0
event_list%!(ptr%+8)=menu%
""fn_addr%=ptr%+(12+(e_type%*4))
event_list%!fn_addr%<>0
shell_HeapBlockReturn(event_list%!fn_addr%)
&%fn%=
shell_HeapBlockFetch(
fn$+1)
$fn%=fn$
event_list%!fn_addr%=fn%
*|Stop PROCshell_EventAdd
-$*|Start PROCshell_EventDeleteAll
shell_EventDeleteAll(wh%)
ptr%,menu%,found%,list_size%,event_list%,loop%
ptr%=0:menu%=0:found%=
wh%=-1
wh%=-2
2-list_size%=
shell_HeapBlockInfo(_U%!12)-8
event_list%=_U%!12
(event_list%!ptr%=wh%)
found%=
ptr%+=48
(ptr%>=list_size%
found%)
found%
event_list%!(ptr%+0)=0
event_list%!(ptr%+4)=0
event_list%!(ptr%+8)=0
loop%=12
@'
event_list%!(ptr%+loop%)<>0
A:
shell_HeapBlockReturn(event_list%!(ptr%+loop%))
B$ event_list%!(ptr%+loop%)=0
C
loop%
remove all DataSave events for the current window...
shell_Tracef0("EventDeleteAll:wh%=&"+
~wh%)
shell_DeleteEventDataSave(wh%,-1)
shell_DeleteEventBump(wh%,-1)
should reduce size of event list block if possible.......
M#*|Stop PROCshell_EventDeleteAll
O%*|Start PROCshell_DeleteEventBump
shell_DeleteEventBump(wh%,ih%)
if I can find which words point to a heap block they could be
automatically detected and released. A general purpose routine
shell_DeleteEvent could then be written!
If ih%=-1 remove all events for window handle wh%
offset%,blk%,list_size%,event_list%,temp%
event_list%=_U%!104
X= offset%=
shell_GetEventListOffset(wh%,ih%,_U%+104,16,
shell_Tracef0("DeleteEventBump:offset%="+
offset%)
offset%>=0
ih%=-1
shell_Tracef0("DeleteEventBump:Deleting Bump Event (all events for window handle &"+
~wh%+")")
]
^w
shell_Tracef0("DeleteEventBump:Deleting Bump Event (window handle was &"+
~wh%+" icon handle was "+
ih%+")")
_
`*
event for window/icon is in list
a2 list_size%=
shell_HeapBlockInfo(_U%!104)-8
b!
offset%=list_size%-16
c+
it is the last one in this list
offset%=0
e(
only one event in the list
f$ info_blk%=event_list%!12
temp%=info_blk%!12
h,
shell_HeapBlockReturn(temp%!12)
i,
shell_HeapBlockReturn(temp%!16)
j)
shell_HeapBlockReturn(temp%)
k+
shell_HeapBlockReturn(_U%!104)
_U%!104=0
mO
shell_Tracef0("DeleteEventDataSave:No Bump events now registered")
o-
more than one event in the list
p7 _U%!104=
shell_HeapBlockExtend(_U%!104,-16)
r
s(
not the last one in the list
t" blk%=event_list%+offset%
u$ blk%!0=0:blk%!4=0:blk%!8=0
info_blk%=blk%!12
w.
shell_HeapBlockReturn(info_blk%!12)
x.
shell_HeapBlockReturn(info_blk%!16)
y+
shell_HeapBlockReturn(info_blk%)
z
repeat loop until offset%=-1 (event not found)
or offset%=-2 (event block doesn't exist)
offset%<0
$*|Stop PROCshell_DeleteEventBump
)*|Start PROCshell_DeleteEventDataSave
shell_DeleteEventDataSave(wh%,ih%)
if I can find which words point to a heap block they could be
automatically detected and released. A general purpose routine
shell_DeleteEvent could then be written!
If ih%=-1 remove all events for window handle wh%
offset%,blk%,list_size%
PROCshell_Tracef0("DeleteEventDataSave:wh%=&"+STR$~wh%)
PROCshell_Tracef0("DeleteEventDataSave:ih%="+STR$ih%)
< offset%=
shell_GetEventListOffset(wh%,ih%,_U%+72,24,
PROCshell_Tracef0("DeleteEventDataSave:offset%="+STR$offset%)
offset%>=0
ih%=-1
shell_Tracef0("DeleteEventDataSave:Deleting DataSave Event (all events for window handle &"+
~wh%+")")
shell_Tracef0("DeleteEventDataSave:Deleting DataSave Event (window handle was &"+
~wh%+" icon handle was "+
ih%+")")
*
event for window/icon is in list
1 list_size%=
shell_HeapBlockInfo(_U%!72)-8
!
offset%=list_size%-24
+
it is the last one in this list
offset%=0
(
only one event in the list
*
shell_HeapBlockReturn(_U%!72)
_U%!72=0
*|ifdef TraceInit
Q
shell_Tracef0("DeleteEventDataSave:No DataSave events now registered")
*|endif
-
more than one event in the list
5 _U%!72=
shell_HeapBlockExtend(_U%!72,-24)
(
not the last one in the list
" blk%=event_list%+offset%
8 blk%!0=0:blk%!4=0:blk%!8=0:blk%!12=0:blk%!16=0
3
shell_HeapBlockReturn(blk%!20):blk%!20=0
repeat loop until offset%=-1 (event not found)
or offset%=-2 (event block doesn't exist)
offset%<0
(*|Stop PROCshell_DeleteEventDataSave
!*|Start FNshell_MessageNoArgs
shell_MessageNoArgs(tag$)
shell_MessageLookup(tag$,"","")
*|Stop FNshell_MessageNoArgs
!*|Start FNshell_MessageOneArg
shell_MessageOneArg(tag$,arg1$)
shell_MessageLookup(tag$,arg1$,"")
*|Stop FNshell_MessageOneArg
!*|Start FNshell_MessageLookup
shell_MessageLookup(tag$,arg1$,arg2$)
flags%,L%,m$,ms_text%,ms_desc%
tag$,8)="SHELLMSG"
' ms_text%=_U%!284:ms_desc%=_U%!280
% ms_text%=_U%!64:ms_desc%=_U%!68
"XMessageTrans_Lookup",ms_desc%,tag$,ms_text%,256,arg1$,arg2$
,,,L%;flags%
flags%
m$="Message tag '"+tag$+"' not found in message file!"
ms_text%?L%=13
m$=$(ms_text%)
*|Stop FNshell_MessageLookup
*|Start FNshell_WimpInit
shell_WimpInit(Version%,TaskName$)
Taskid%
"Wimp_Initialise",Version%,&4B534154,TaskName$
Version%,Taskid%
_U%!148=Taskid%
=Taskid%
*|Stop FNshell_WimpInit
*|Start FNshell_WimpInit_I
shell_WimpInit_I(Version%,TaskName$)
"Wimp_Initialise",Version%,&4B534154,TaskName$
Version%,Taskid%
_U%!148=Taskid%
"Interface_Initialise",Taskid%
=Taskid%
*|Stop FNshell_WimpInit_I
%*|Start PROCshell_WimpCloseDown_I
shell_WimpCloseDown_I(Taskid%)
shell_LoseFonts
*|ifdef Using_FontMenu
_U%!240<>-1
"XFontMenu_Release"
*|endif
"XWimp_CloseDown",Taskid%,&4B534154
"XInterface_CloseDown",Taskid%
_U%!100
1<<2
"XImpulse_CloseDown",_U%!148
$*|Stop PROCshell_WimpCloseDown_I
*|Start PROCWimpCloseDown
WimpCloseDown(Taskid%)
shell_LoseFonts
*|ifdef Using_FontMenu
_U%!240<>-1
"XFontMenu_Release"
*|endif
"XWimp_CloseDown",Taskid%,&4B534154
_U%!100
1<<2
"XImpulse_CloseDown",_U%!148
("Unset "+_shell_AppName$+"$BasicFile")
*|Stop PROCWimpCloseDown
*|Start PROCshell_LoseFonts
shell_LoseFonts
loop%,temp%
temp%=_U%!232
loop%=0
temp%?loop%>0
"Font_LoseFont",loop%
temp%?loop%-=1
loop%
*|Stop PROCshell_LoseFonts
*|Start FNshell_FindFont
shell_FindFont(font$,pointsize%)
f%,fontcounts%
fontcounts%=_U%!232
"Font_FindFont",,font$,pointsize%*16,p*16,0,0
fontcounts%?f%+=1
fontcounts%?f%>=255
shell_OK(
shell_MessageNoArgs("SHELLMSG18"))
*|Stop FNshell_FindFont
*|Start PROCshell_Init
shell_Init
elist%,loop%,temp%,cmdline$
OSVarBuff%,shell_AppDir$,shell_AppName$
_U% 330,_shell_blk% 260
#_Q%=
shell_HeapBlockFetch(3000)
$elist%=
shell_HeapBlockFetch(48)
elist%!00=0
elist%!04=0
elist%!08=0
elist%!12=0
elist%!16=0
elist%!20=0
elist%!24=0
elist%!28=0
elist%!32=0
elist%!36=0
elist%!40=0
elist%!44=0
)'_U%!0=0 :
nr of templates
*0_U%!4=0 :
pointer to window blocks
+-_U%!8=0 :
pointer to menu block
,-_U%!12=elist% :
pointer to event list
-3_U%!16=1 :
address of user sprite area
.5_U%!20=0 :
handle of last dynamic window
//_U%!24=0 :
address of current menu
0B_U%!28=0 :
last window clicked over (select & adjust)
1B_U%!32=0 :
last icon clicked over (select & adjust)
2,_U%!36=0 :
last menu x position
3,_U%!40=0 :
last menu y position
4+_U%!44=-1 :
handle of tracefile
58_U%!48=0 :
FALSE=not tracing,TRUE = tracing
6>_U%!52=0 :
last window clicked over (menu button)
7>_U%!56=0 :
last icon clicked over (menu button)
8>_U%!60=0 :
pointer to 'HotKey' handler event list
90_U%!64=0 :
pointer to message block
:0_U%!68=0 :
pointer to message block
;7_U%!72=0 :
pointer to datasave event block
<5_U%!76=
shell_HeapBlockFetch(256):
message block
=6_U%!80=0 :
pointer to last full file name
>8_U%!84=-1 :
store my_ref from save operation
?"_U%!88=0 :
??????????
@;_U%!92=0 :
pointer to pane handler event block
A7_U%!96=0 :
pointer to dataload event block
B+_U%!100=0 :
EvntShell bit flags
CB :
bit 0 - DragASprite operation in progress
D= :
bit 1 - Top bit dataload in progress
E; :
bit 2 - Impulse module initialised
F5 :
bit 3 - ResFind in operation
GN :
bit 4 - Trace init message pending (set in TraceInit,
HJ :
cleared when ack received from ShellDBug)
IB :
bit 5 - command line contains arguments..
J;_U%!104=0 :
pointer to bump handler event block
K _U%!108=-1 :
ScrpRef%
L _U%!112=-1 :
FtchRef%
M _U%!116=-1 :
LoadRef%
N _U%!120=-1 :
SaveRef%
O _U%!124=-1 :
DragRef%
_U%!128=0 :
RAMPtr%
Q _U%!132=0 :
RAMSize%
R<_U%!136=-1 :
FileSize% from last datasave message
S<_U%!140=-1 :
FileType% from last datasave message
T<_U%!144=-1 :
FileBuff% from last datasave message
_U%!148=0 :
taskid%
VB_U%!152=0 :
Buffer list of loaded files, -1 terminator
WE_U%!156=0 :
HeapBlock with copy of DataSave message block
X3 :
for when RAM transfer fails
Y<_U%!160=0 :
Pointer to ModeChange event function
Z?_U%!164=0 :
Pointer to PaletteChange event function
[@_U%!168=0 :
Pointer to TaskInitialise event function
\?_U%!172=0 :
Pointer to TaskCloseDown event function
]5_U%!176=0 :
Pointer to current menu title
^8_U%!180=0 :
nr of 'hotkey' events registered
_9_U%!184=0 :
Pointer to list of static windows
`/_U%!188=0 :
to shell_AppDir$ buffer
a3_U%!192=0 :
to shell_AppDataDir$ buffer
b0_U%!196=0 :
to shell_AppName$ buffer
c@_U%!200=0 :
window handle from last DataSave message
d>_U%!204=0 :
icon handle from last DataSave message
e>_U%!208=-1 :
helphandle% (task handle of StrongHlp)
fD_U%!212=-1 :
icontry% (used by StrongHlp find routine)
gH_U%!216=0 :
pointer to pending$ buffer for StrongHlp command
h;_U%!220=0 :
pointer to menu warning event block
i;_U%!224=0 :
pointer to last menu_warn fn called
jI_U%!228=0 :
handle of warning dialog used for menu items that
k: :
have not had a dialog box attached
l<_U%!232=
shell_HeapBlockFetch(256):
fontcounts% array..
m=_U%!236=
shell_HeapBlockFetch(256):
fontbinding% array..
nN_U%!240=-1 :
nr of outline fonts on system, -1 if "FontMenu_Create"
o+ :
has not been called
pG_U%!244=0 :
ptr to currently selected font name in FontMenu
q3_U%!248=0 :
ptr to last known Font$Path
r<_U%!252=0 :
last known ptr to FontMenu structure
sM_U%!256=0 :
ptr to heapblock holding 'MenusSelectionSoFar' string
tL_U%!260=1 :
SystemFont flag for FontMenu 0 no sysfont, 1 sysfont
u3_U%!264=0 :
FontMenu is opened (1 or 0)
vJ_U%!268=0 :
FontMenu valid selection flag 0 non valid, 1 valid
w@_U%!272=0 :
x coord last mouse click (screen coords)
x@_U%!276=0 :
y coord last mouse click (screen coords)
y;_U%!280=0 :
m_filedesc% for system message file
z;_U%!284=0 :
m_buffer% for system message file
{9_U%!288=-1 :
window handle for last bump event
|7_U%!292=-1 :
icon handle for last bump event
}:_U%!296=-1 :
last event offset for bump handler
~:_U%!300=0 :
pointer to PreQuit Handler routine
9_U%!304=0 :
pointer to OpenWindow event block
:_U%!308=0 :
pointer to CloseWindow event block
;_U%!312=0 :
pointer to Shutdown Handler routine
D_U%!316=0 :
OS version nr as returned by Wimp_Initialise
1_U%!320=0 :
Last mouse button pressed
8_U%!324=0 :
stores command line arg (if any)
shell_MemFill(_U%!232,256,0)
shell_MemFill(_U%!236,256,0)
)OSVarBuff%=
shell_HeapBlockFetch(256)
Ashell_AppDir$=
shell_OSVarGetVal(OSVarBuff%,256,"Obey$Dir",1)
shell_HeapBlockReturn(OSVarBuff%)
1shell_AppName$=
shell_Leaf(shell_AppDir$),2)
5_U%!188=
shell_HeapBlockFetch((
shell_AppDir$)+1)
6_U%!196=
shell_HeapBlockFetch((
shell_AppName$)+1)
&temp%=_U%!188:$temp%=shell_AppDir$
'temp%=_U%!196:$temp%=shell_AppName$
Now have a look at the command line used to start the program...
)cmdline$ =
shell_OSReadCommandArg(1)
cmdline$ <> ""
B _U%!100 = _U%!100
1 << 5:
set 'command line args' flag...
Store command line for later reference...
2 temp% =
shell_HeapBlockFetch(
cmdline$ + 1)
+ $(temp%) = cmdline$ : _U%!324 = temp%
*|Stop PROCshell_Init
"*|Start FNshell_GetCmdLineArgs
shell_GetCmdLineArgs
cmdline$
_U%!324 <> 0
cmdline$ = $(_U%!324)
= cmdline$
!*|Stop FNshell_GetCmdLineArgs
*|Start FNshell_FileType
shell_FileType(object$)
type%
"OS_File",5,object$
,,type%
type%=(type%
&FFF00)>>>8
=type%
*|Stop FNshell_FileType
*|Start FNshell_FileExists
shell_FileExists(object$)
shell_CatInfoRead(object$)="Not Found":=
*|Stop FNshell_FileExists
*|Start FNshell_CatInfoRead
shell_CatInfoRead(object$)
type%,load_addr%,exec_addr%,length%,atts%,string$
"OS_File",5,object$
type%,,load_addr%,exec_addr%,length%,atts%
type%=0
= "Not Found"
atts%=51
string$+="WR "
atts%=187
string$+="LWR"
atts%=136
string$+="DL "
<string$+=" "+
shell_StringPadLeading(
~load_addr%,"0",8)
<string$+=" "+
shell_StringPadLeading(
~exec_addr%,"0",8)
9string$+=" "+
shell_StringPadLeading(
~length%,"0",8)
=string$
*|Stop FNshell_CatInfoRead
*|Start FNshell_GetAppDir
shell_GetAppDir
temp%
temp%=_U%!188
=$temp%
*|Stop FNshell_GetAppDir
!*|Start FNshell_GetAppDataDir
shell_GetAppDataDir
temp%
temp%=_U%!192
=$temp%
*|Stop FNshell_GetAppDataDir
*|Start FNshell_GetAppName
shell_GetAppName
temp%
temp%=_U%!196
=$temp%
*|Stop FNshell_GetAppName
#*|Start PROCshell_ResourcesInit
shell_ResourcesInit
shell_AppDataDir$,temp%,shell_AppName$,shell_AppDir$
OSVarBuff%,YEigFactor%,XEigFactor%
$shell_AppName$=
shell_GetAppName
#shell_AppDir$ =
shell_GetAppDir
)OSVarBuff%=
shell_HeapBlockFetch(256)
shell_OSVarExists(OSVarBuff%,shell_AppName$+"Res$Path")
3 _U%!100=_U%!100
1<<3:
set 'ResFind' flag..
shell_OSVarExists(OSVarBuff%,shell_AppName$+"Data$Dir")
V shell_AppDataDir$=
shell_OSVarGetVal(OSVarBuff%,256,shell_AppName$+"Data$Dir",1)
; _U%!192=
shell_HeapBlockFetch((
shell_AppDataDir$)+1)
, temp%=_U%!192:$temp%=shell_AppDataDir$
7 _U%!192=
shell_HeapBlockFetch((
shell_AppDir$)+1)
( temp%=_U%!192:$temp%=shell_AppDir$
_U%!100
1<<3
ResFind initialised..
*|define Using_ResFind
shell_FileExists(shell_AppName$+"Res:Messages")
H
shell_MessagesInit(shell_AppName$+"Res:Messages",_U%!68,_U%!64)
shell_FileExists(shell_AppName$+"Res:ShellMsgs")
shell_MessagesInit(shell_AppName$+"Res:ShellMsgs",_U%!280,_U%!284)
D
shell_MessagesInit("ShellSysRes:ShellMsgs",_U%!280,_U%!284)
"XOS_ReadModeVariable",-1,04
,,XEigFactor%
"XOS_ReadModeVariable",-1,05
,,YEigFactor%
YEigFactor% = 1
shell_FileExists(shell_AppName$+"Res:Sprites22")
A
Screen mode is hi-res, and hi-res sprite file exists...
F _U%!16 =
shell_SpriteAreaLoad(shell_AppName$+"Res:Sprites22")
;
shell_FileExists(shell_AppName$+"Res:Sprites")
5
No hi-res sprite file, load normal one...
D _U%!16=
shell_SpriteAreaLoad(shell_AppName$+"Res:Sprites")
> _U%!16=1:
use wimp sprite pool if no 'Sprites' file
check if templates need loading
shell_FileExists(shell_AppName$+"Res:Templates")
<
shell_TemplatesInit(shell_AppName$+"Res:Templates")
ResFind NOT initialised..
shell_FileExists(shell_AppDir$+".Messages")
D
shell_MessagesInit(shell_AppDir$+".Messages",_U%!68,_U%!64)
shell_FileExists(shell_AppDir$+".ShellMsgs")
G
shell_MessagesInit(shell_AppDir$+".ShellMsgs",_U%!280,_U%!284)
D
shell_MessagesInit("ShellSysRes:ShellMsgs",_U%!280,_U%!284)
Check if user sprites need loading, but first check if program
has been started in a hi-res screen mode...
"XOS_ReadModeVariable",-1,04
,,XEigFactor%
"XOS_ReadModeVariable",-1,05
,,YEigFactor%
YEigFactor% = 1
shell_FileExists(shell_AppDir$+".Sprites22")
A
Screen mode is hi-res, and hi-res sprite file exists...
B _U%!16 =
shell_SpriteAreaLoad(shell_AppDir$+".Sprites22")
7
shell_FileExists(shell_AppDir$+".Sprites")
@ _U%!16=
shell_SpriteAreaLoad(shell_AppDir$+".Sprites")
> _U%!16=1:
use wimp sprite pool if no 'Sprites' file
check if templates need loading
shell_FileExists(shell_AppDir$+".Templates")
!8
shell_TemplatesInit(shell_AppDir$+".Templates")
"MenuUtil_Initialise"
shell_HeapBlockReturn(_Q%)
&>_Q%=
shell_HeapBlockFetch(1024):
reduce global wimp block
shell_HeapBlockReturn(OSVarBuff%)
*"*|Stop PROCshell_ResourcesInit
,"*|Start FNshell_SpriteAreaLoad
shell_SpriteAreaLoad(filename$)
sp%,S%,T%
/%S%=
(filename$):T%=
#S%+16:
0!sp%=
shell_HeapBlockFetch(T%)
!sp%=T%:sp%!4=0
sp%!8=16:sp%!12=16
"OS_SpriteOp",&209,sp%
"OS_SpriteOp",&20A,sp%,filename$
*|ifdef TraceInit
shell_Tracef0("SpriteLoad:Sprite file loaded at &"+
~sp%)
*|endif
:!*|Stop FNshell_SpriteAreaLoad
<#*|Start FNshell_UserSpritesBase
shell_UserSpritesBase
=_U%!16
@"*|Stop FNshell_UserSpritesBase
B *|Start FNshell_SpriteGetPtr
shell_SpriteGetPtr(spritearea%,name$)
buffer%,ptr%
E%buffer%=
shell_HeapBlockFetch(21)
$buffer%=name$
"OS_SpriteOp",&118,spritearea%,buffer%
,,ptr%
shell_HeapBlockReturn(buffer%)
I =ptr%
*|Stop FNshell_SpriteGetPtr
M#*|Start PROCshell_TemplatesInit
shell_TemplatesInit(filename$)
TemplatePtr%,IndirectPtr%,IndirectEnd%,X%,ptr%
filelen% ,pos%,name_buffer%,name$,nr_templates%
file_offset%,data_size%,entry_type%,char%,identifier$,buff%
indirected_size%,nr_icons%,total_indirsize%,j%,largest_def%
name_buffer% 20
(name_buffer%
name_buffer%+=1
WDpos% = 0:nr_templates% = 0:total_indirsize% = 0:largest_def% = 0
X+filelen% =
shell_FileLength(filename$)
Sniff around in the template file and work out the size of the indirected
data buffer needed...
\%buff% =
shell_HeapBlockFetch(13)
]/X% =
(filename$) :
Open the template file
# X% = 16 :
Skip header info
identifier$ = ""
"OS_GBPB",4,X%,buff%,4
b9 file_offset% = !buff%:
File offset for this entry
shell_Tracef0("TemplatesInit:file offset% = "+
file_offset%)
file_offset% > 0
nr_templates% += 1
indirected_size% = 0
g!
"OS_GBPB",4,X%,buff%,4
h; data_size% = !buff% :
Size of data for this entry
iB
shell_Tracef0("TemplatesInit:data_size% = "+
data_size%)
j!
"OS_GBPB",4,X%,buff%,4
k5 entry_type% = !buff% :
Entry type (1=window)
l"
"OS_GBPB",4,X%,buff%,12
ctr% = 0
n
char% = buff%?ctr%
p.
char% > 31
identifier$ +=
char%
ctr% += 1
char% <32
sE old_ptr% =
# X% :
Save current pointer position..
tH
# X% = file_offset% + 56 :
Move pointer to title flags word..
uA
"OS_GBPB",4,X%,buff%,4 :
Read title bar flag word..
flags% = !buff%
wO
# X% = file_offset% + 72 :
Move pointer to start of title bar data..
xG
"OS_GBPB",4,X%,buff%,12 :
Read 3 words of title bar data..
yL indirected_size% +=
shell_IconIndirSize(file_offset%,flags%,buff%)
zG
# X% = file_offset% + 84 :
Move pointer to icon count word..
{9
"OS_GBPB",4,X%,buff%,4 :
Read nr of icons..
nr_icons% = !buff%
}O
shell_Tracef0("TemplatesInit:nr icons = "+
nr_icons%)
nr_icons% > 0
"
j% = 0
nr_icons% - 1
6
# X% = file_offset% + 88 + (j% * 32) + 16
>
"OS_GBPB",4,X%,buff%,4 :
Read icon flag word..
flags% = !buff%
6
# X% = file_offset% + 88 + (j% * 32) + 20
F
"OS_GBPB",4,X%,buff%,12 :
Read 3 words of icon data..
P indirected_size% +=
shell_IconIndirSize(file_offset%,flags%,buff%)
# X% = old_ptr%
G
shell_Tracef0("TemplatesInit:entry_type% = "+
entry_type%)
F
shell_Tracef0("TemplatesInit:identifier$ = "+identifier$)
L
shell_Tracef0("TemplatesInit:indirected size = "+
indirected_size%)
shell_Tracef0(" ")
, total_indirsize% += indirected_size%
Y
(88 + (nr_icons% * 32)) > largest_def%
largest_def% = (88 + (nr_icons% * 32))
file_offset% = 0
# X% :
Close the template file
shell_HeapBlockReturn(buff%)
shell_Tracef0("TemplatesInit:total indirected= "+
total_indirsize%)
Reserve space for window definitions
2TemplateBlk% =
shell_HeapBlockFetch(filelen%)
TemplatePtr% = TemplateBlk%
Reserve a block to hold window identifiers (12 bytes) plus address of
window block (4 bytes)
5_U%!4 =
shell_HeapBlockFetch(20 * nr_templates%)
Reserve space for indirected icon data (size of largest window definition
plus all of the indirected data)..
JIndirectBlk% =
shell_HeapBlockFetch(largest_def% + total_indirsize%)
IndirectPtr% = IndirectBlk%
DIndirectEnd% = IndirectBlk% + (largest_def% + total_indirsize%)
nr_templates% = 0
"Wimp_OpenTemplate",,filename$
$name_buffer%="*"
"Wimp_LoadTemplate",,TemplatePtr%,IndirectPtr%,IndirectEnd%,_U%!232,name_buffer%,pos%
,,IndirectPtr%,,,name$,pos%
pos%<>0
2 !((_U%!4)+(16*nr_templates%))=TemplatePtr%
/ $(((_U%!4)+(16*nr_templates%))+4)=name$
*|ifdef Trace_Init
A
shell_Tracef0("TemplatesInit: Template Loaded: "+name$)
*|endif
/ TemplatePtr%+=(88+(TemplatePtr%!84)*32)
nr_templates%+=1
pos%=0
"Wimp_CloseTemplate"
_U%!0=nr_templates%
*|ifdef Trace_Init
shell_Tracef0("TemplatesInit:Templates resource file loaded at &"+
~TemplateBlk%+" ("+
nr_templates%+" templates)")
*|endif
"*|Stop PROCshell_TemplatesInit
*|Start FNshell_WindowLoaded
shell_WindowLoaded(window$)
loop%,found%
(window$)>12
shell_MessageOneArg("SHELLMSG02",window$)
found%=
loop%=0
(_U%!0)-1
$(((_U%!4)+(16*loop%))+4)=window$
found%=
:loop%=(_U%!0)-1
loop%
=found%
*|Stop FNshell_WindowLoaded
*|Start FNshell_GetWB
shell_GetWB(window$)
loop%,found%
(window$)>12
shell_MessageOneArg("SHELLMSG02",window$)
found%=-1
loop%=0
(_U%!0)-1
$(((_U%!4)+(16*loop%))+4)=window$
$ found%=loop%:loop%=(_U%!0)-1
loop%
found%>-1
=!((_U%!4)+(16*found%))
shell_MessageOneArg("SHELLMSG03",window$)
*|Stop FNshell_GetWB
!*|Start FNshell_MessageExpand
shell_MessageExpand(h$)
s$, m$, index%
s$=""
h$,"\")>0
index%=
h$,"\")
s$+=
h$,index%-1)
m$=
h$,index%+1,1)
h$=
h$,index%+2)
#
"A":s$+="Click ADJUST to"
"a":s$+="ADJUST"
'
"D":s$+="Drag with SELECT to"
'
"d":s$+="Drag with ADJUST to"
5
"G":s$+="This option is greyed out because"
*
"R":s$+="Move the pointer right"
#
"S":s$+="Click SELECT to"
"s":s$+="SELECT"
"T":s$+="This is the"
"
"W":s$+="This window is"
"w":s$+="window"
s$+="\"+m$
=s$+h$
----------------------------------------------------------
*|Stop FNshell_MessageExpand
*|Start PROCshell_OpenMenu
shell_OpenMenu(x%,y%,m%)
/fn$=
shell_GetEventHandler(_U%!28,_U%!32,1)
fn$<>""
*|ifdef Trace_Init
shell_Tracef0("OpenMenu:About to call "+"FN"+fn$+"("+
_U%!28+","+
_U%!32+")")
*|endif
: void%=
("FN"+fn$+"(_U%!28,_U%!32)"):
call menumaker
shell_Tracef0("OpenMenu:no menumaker function registered")
m%<>_U%!24
If menu is not being re-opened by an adjust click, discard stored
'SelectionSoFar' string used by FontMenu routines..
shell_HeapBlockExists(_U%!256)
1
shell_HeapBlockReturn(_U%!256):_U%!256=0
And the name of the currently selected font in this menu..
shell_HeapBlockExists(_U%!244 )
1
shell_HeapBlockReturn(_U%!244):_U%!244=0
m%=_U%!252
"Wimp_CreateMenu",,m%,x% - 64,y%
_U%!264=1
_Q%!0 = x%:_Q%!4 = y%
"MenuUtil_Show",m%,_Q%
_U%!264=0
3_U%!24=m%:
store handle of currently open menu
%_U%!36=x%:
store menu x position
%_U%!40=y%:
store menu y position
_U%!52=_U%!28:
store window
_U%!56=_U%!32:
store icon
*|Stop PROCshell_OpenMenu
*|Start FNshell_MenuLastXPos
shell_MenuLastXPos
=_U%!36
*|Stop FNshell_MenuLastXPos
& *|Start FNshell_MenuLastYPos
shell_MenuLastYPos
=_U%!40
*|Stop FNshell_MenuLastYPos
,$*|Start PROCshell_MenuAttachDbox
shell_MenuAttachDbox(menu$)
attach a dummy window handle for now, just so that the sub window arrow
appears on the menu!
"Menu_SetSubHandle",_U%!8,
shell_MenuString(menu$),1
shell_Tracef0("MenuAttachDbox:Dialog box ("+menu$+") attached")
4#*|Stop PROCshell_MenuAttachDbox
6!*|Start FNshell_MessageWindow
shell_MessageWindow(text$,cancel%,progname$,head$)
keys%,err_blk%
9'err_blk%=
shell_HeapBlockFetch(260)
:(!err_blk%=0:$(err_blk%+4)=text$+
head$=""
head$="Message from "+progname$
cancel%
"Wimp_ReportError",err_blk%,19,head$
,keys%
"Wimp_ReportError",err_blk%,17,head$
,keys%
shell_HeapBlockReturn(err_blk%)
=keys%
D *|Stop FNshell_MessageWindow
F"*|Start PROCshell_CreateWindow
shell_CreateWindow(ident$,
handle%)
wb_ptr%
I wb_ptr%=
shell_GetWB(ident$)
set 'sprite area' pointer to usersprites area
wb_ptr%!64=_U%!16
"Wimp_CreateWindow",,wb_ptr%
handle%
O!*|Stop PROCshell_CreateWindow
P!*|Start FNshell_CreateWindow2
shell_CreateWindow2(title,flags%,fgcol%,bgcol%,maxx%,miny%,l%,b%,r%,t%)
S"Q%=
shell_HeapBlockFetch(3000)
T,Q%!0=l%:Q%!4=b%:Q%!8=r%:Q%!12=t%:Q%!16=0
U)Q%!20=0:Q%!24=-1:Q%!28=flags%:Q%?32=7
V%Q%?33=2:Q%?34=fgcol%:Q%?35=bgcol%
Q%?36=3:Q%?37=1
X'Q%?38=2:Q%?39=0:Q%!40=0:Q%!44=miny%
Y.Q%!48=maxx%:Q%!52=0:Q%!56=&13D:Q%!60=&3000
Z6Q%!68=1:Q%!72=title:Q%!76=-1:Q%!80=
$title:Q%!84=0
"Wimp_CreateWindow",,Q%
handle%
shell_HeapBlockReturn(Q%)
=handle%
_ *|Stop FNshell_CreateWindow2
a%*|Start FNshell_WindowHasTitleBar
shell_WindowHasTitleBar(wh%)
shell_WindowGetFlags(wh%)
1<<26)
e$*|Stop FNshell_WindowHasTitleBar
g$*|Start FNshell_WindowIsMoveable
shell_WindowIsMoveable(wh%)
shell_WindowGetFlags(wh%)
1<<1)
l#*|Stop FNshell_WindowIsMoveable
n!*|Start FNshell_WindowIsAPane
shell_WindowIsAPane(wh%)
shell_WindowGetFlags(wh%)
1<<5)
r *|Stop FNshell_WindowIsAPane
t&*|Start FNshell_WindowIsNotBounded
shell_WindowIsNotBounded(wh%)
shell_WindowGetFlags(wh%)
1<<6)
x%*|Stop FNshell_WindowIsNotBounded
z&*|Start FNshell_WindowTrapsHotKeys
shell_WindowTrapsHotKeys(wh%)
shell_WindowGetFlags(wh%)
1<<12)
~%*|Stop FNshell_WindowTrapsHotKeys
*|Start FNshell_WindowIsOpen
shell_WindowIsOpen(wh%)
shell_WindowGetFlags(wh%)
1<<16)
*|Stop FNshell_WindowIsOpen
!*|Start FNshell_WindowIsOnTop
shell_WindowIsOnTop(wh%)
shell_WindowGetFlags(wh%)
1<<17)
*|Stop FNshell_WindowIsOnTop
(*|Start FNshell_WindowHasBeenToggled
shell_WindowHasBeenToggled(wh%)
shell_WindowGetFlags(wh%)
1<<18)
'*|Stop FNshell_WindowHasBeenToggled
'*|Start FNshell_WindowHasInputFocus
shell_WindowHasInputFocus(wh%)
shell_WindowGetFlags(wh%)
1<<20)
&*|Stop FNshell_WindowHasInputFocus
%*|Start FNshell_WindowHasBackIcon
shell_WindowHasBackIcon(wh%)
shell_WindowGetFlags(wh%)
1<<24)
$*|Stop FNshell_WindowHasBackIcon
&*|Start FNshell_WindowHasCloseIcon
shell_WindowHasCloseIcon(wh%)
shell_WindowGetFlags(wh%)
1<<25)
%*|Stop FNshell_WindowHasCloseIcon
'*|Start FNshell_WindowHasToggleIcon
shell_WindowHasToggleIcon(wh%)
shell_WindowGetFlags(wh%)
1<<27)
&*|Stop FNshell_WindowHasToggleIcon
'*|Start FNshell_WindowHasVScrollBar
shell_WindowHasVScrollBar(wh%)
shell_WindowGetFlags(wh%)
1<<28)
&*|Stop FNshell_WindowHasVScrollBar
+*|Start FNshell_WindowHasAdjustSizeIcon
shell_WindowHasAdjustSizeIcon(wh%)
shell_WindowGetFlags(wh%)
1<<29)
**|Stop FNshell_WindowHasAdjustSizeIcon
'*|Start FNshell_WindowHasHScrollBar
shell_WindowHasHScrollBar(wh%)
shell_WindowGetFlags(wh%)
1<<30)
&*|Stop FNshell_WindowHasHScrollBar
"*|Start FNshell_WindowGetFlags
shell_WindowGetFlags(wh%)
flags%,blk%
"blk%=
shell_HeapBlockFetch(36)
blk%!0=wh%
"Wimp_GetWindowState",,blk%
flags%=blk%!32
shell_HeapBlockReturn(blk%)
=flags%
!*|Stop FNshell_WindowGetFlags
'*|Start FNshell_WindowGetTitleFlags
shell_WindowGetTitleFlags(wh%)
flags%,blk%
$blk%=
shell_HeapBlockFetch(6000)
blk%!0=wh%
"Wimp_GetWindowInfo",,blk%
flags%=blk%!60
shell_HeapBlockReturn(blk%)
=flags%
&*|Stop FNshell_WindowGetTitleFlags
*|Start FNshell_IconGetFlags
shell_IconGetFlags(wh%,ih%)
flags%,blk%
claim a block as temporary workspace big enough for data
returned by SWI call (icon block + 8 bytes)
"blk%=
shell_HeapBlockFetch(50)
blk%!0=wh%:blk%!4=ih%
"Wimp_GetIconState",,blk%
flags%=blk%!24
shell_HeapBlockReturn(blk%)
=flags%
*|Stop FNshell_IconGetFlags
$*|Start FNshell_WindowTitleFlags
shell_WindowTitleFlags(wh%)
flags%,blk%
$blk%=
shell_HeapBlockFetch(3000)
blk%!0=wh%
"Wimp_GetWindowInfo",,blk%
flags%=blk%!60
shell_HeapBlockReturn(blk%)
=flags%
#*|Stop FNshell_WindowTitleFlags
(*|Start FNshell_WindowTitleHasBorder
shell_WindowTitleHasBorder(wh%)
shell_WindowTitleFlags(wh%)
1<<2)
'*|Stop FNshell_WindowTitleHasBorder
'*|Start FNshell_WindowTitleIsSprite
shell_WindowTitleIsSprite(wh%)
shell_WindowTitleFlags(wh%)
1<<1)
&*|Stop FNshell_WindowTitleIsSprite
%*|Start FNshell_WindowTitleIsText
shell_WindowTitleIsText(wh%)
shell_WindowTitleFlags(wh%)
1<<0)
$*|Stop FNshell_WindowTitleIsText
)*|Start FNshell_WindowTitleIsHCentred
shell_WindowTitleIsHCentred(wh%)
shell_WindowTitleFlags(wh%)
1<<3)
(*|Stop FNshell_WindowTitleIsHCentred
)*|Start FNshell_WindowTitleIsVCentred
shell_WindowTitleIsVCentred(wh%)
shell_WindowTitleFlags(wh%)
1<<4)
(*|Stop FNshell_WindowTitleIsVCentred
'*|Start FNshell_WindowTitleIsFilled
shell_WindowTitleIsFilled(wh%)
shell_WindowTitleFlags(wh%)
1<<5)
&*|Stop FNshell_WindowTitleIsFilled
)*|Start FNshell_WindowTitleIsAAliased
shell_WindowTitleIsAAliased(wh%)
shell_WindowTitleFlags(wh%)
1<<6)
(*|Stop FNshell_WindowTitleIsAAliased
+*|Start FNshell_WindowTitleIsIndirected
shell_WindowTitleIsIndirected(wh%)
shell_WindowTitleFlags(wh%)
1<<8)
**|Stop FNshell_WindowTitleIsIndirected
"*|Start FNshell_WindowGetTitle
shell_WindowGetTitle(wh%)
title$,blk%
Check if window has a title bar..
"$blk%=
shell_HeapBlockFetch(3000)
blk%!0=wh%
"Wimp_GetWindowInfo",,blk%
(blk%!32
1<<26)
((blk%!60)
&100)=0
'#
Title is not indirected..
title$=$(blk%+76)
Title is indirected..
title$=$(!(blk%+76))
shell_HeapBlockReturn(blk%)
=title$
1!*|Stop FNshell_WindowGetTitle
3+*|Start FNshell_WindowTitleBufferLength
shell_WindowTitleBufferLength(wh%)
result%,blk%
6$blk%=
shell_HeapBlockFetch(3000)
blk%!0=wh%
"Wimp_GetWindowInfo",,blk%
((blk%!60)
&100)=0
result%=12
result%=blk%!84
shell_HeapBlockReturn(blk%)
=result%
A**|Stop FNshell_WindowTitleBufferLength
C&*|Start PROCshell_WindowMoveToIcon
shell_WindowMoveToIcon(wh%,iwh%,ih%,x_off%,y_off%)
i_blk%,w_blk%
F)i_blk% =
shell_HeapBlockFetch(50)
G)w_blk% =
shell_HeapBlockFetch(36)
w_blk%!20 = 0
shell_OSCheckVersion(3)
iwh% = -1
!w_blk% = -2
!w_blk% = iwh%
"Wimp_GetWindowState",,w_blk%
M$i_blk%!0 = iwh% : i_blk%!4 = ih%
"Wimp_GetIconState",,i_blk%
shell_WindowMoveTo(wh%,i_blk%!8+x_off%-w_blk%!20,i_blk%!20+y_off%)
PROCshell_WindowMoveTo(wh%,i_blk%!8+x_off%,i_blk%!20+y_off%)
shell_HeapBlockReturn(i_blk%)
shell_HeapBlockReturn(w_blk%)
U%*|Stop PROCshell_WindowMoveToIcon
W"*|Start PROCshell_WindowMoveTo
shell_WindowMoveTo(wh%,x%,y%)
win_width%,win_height%,offset%,blk%
Z$blk%=
shell_HeapBlockFetch(3000)
blk%!0=wh%
"Wimp_GetWindowInfo",,blk%
win_width% =blk%!12-blk%!4
win_height%=blk%!16-blk%!8
blk%!4=x%
blk%!8=y%
blk%!12=x%+win_width%
blk%!16=y%+win_height%
this looks really silly, but is necessary to tell the
window manager the new window coords. The shell_OpenWindow
call sets up any panes and actually opens the window in
the new position
"Wimp_OpenWindow",,blk%
"Wimp_CloseWindow",,blk%
i,offset%=
shell_SearchStatic(_U%!184,wh%)
offset%>-1
shell_OpenWindowStatic(wh%)
shell_OpenWindowDynamic(wh%,0,0)
shell_HeapBlockReturn(blk%)
r!*|Stop PROCshell_WindowMoveTo
t&*|Start PROCshell_WindowBringToTop
shell_WindowBringToTop(wh%)
msg%
w#msg%=
shell_HeapBlockFetch(256)
msg%!0=wh%
"Wimp_GetWindowState",,msg%
msg%!28=-1
"Wimp_SendMessage",2,msg%,wh%
now call wimp poll as this action must happen
without waiting for next wimp poll...
"Wimp_Poll",0,msg%
shell_HeapBlockReturn(msg%)
%*|Stop PROCshell_WindowBringToTop
"*|Start PROCshell_UpdateWindow
shell_UpdateWindow(handle%,l%,b%,r%,t%)
blk%
$blk%=
shell_HeapBlockFetch(blk%)
<blk%!0=handle%:blk%!4=l%:blk%!8=b%:blk%!12=r%:blk%!16=t%
"Wimp_UpdateWindow",,blk%
more%
"Wimp_GetWindowState",,blk%
shell_HeapBlockReturn(blk%)
!*|Stop PROCshell_UpdateWindow
'*|Start PROCshell_OpenWindowDynamic
shell_OpenWindowDynamic(wh%,x_off%,y_off%)
void%,ptr_blk%
&ptr_blk%=
shell_HeapBlockFetch(20)
_U%!20=wh%
"Wimp_GetPointerInfo",,ptr_blk%
"Wimp_CreateMenu",,wh%,ptr_blk%!0+x_off%,ptr_blk%!4+y_off%
shell_HeapBlockReturn(ptr_blk%)
&*|Stop PROCshell_OpenWindowDynamic
!*|Start FNshell_ClaimKeypress
shell_ClaimKeypress
Bodge to ensure that shell_OpenWindowDynamic works properly..
_U%!20<>0
"Wimp_CreateMenu",,-1
' void%=
shell_DeleteWindow(_U%!20)
_U%!20=0
*|Stop FNshell_ClaimKeypress
*|Start PROCshell_OpenWindow
shell_OpenWindow(wh%,full%,front%)
offset%,blk%,paneblk%,ctr%,first_pane%,behind%,height%,width%
flag%,toggle%,t%,last_pane%,prev_pane%,res%
:offset%=
shell_GetEventListOffset(wh%,-1,_U%+304,12,
offset%>=0
blk%=_U%!304+offset%
temp%=blk%!8
*|ifdef Trace_Init
shell_Tracef0("OpenWindow:About to call "+"FN"+$temp%)
*|endif
res%=
("FN"+$temp%)
res%=0
toggle%=
shell_HeapBlockFetch(100):t%!0=wh%
"Wimp_GetWindowState",,t%
(t%!32
&80000)=&80000
toggle%=
toggle%=
shell_HeapBlockReturn(t%)
_Q%!0=wh%
full%
"Wimp_GetWindowState",,_Q%
toggle%
"Wimp_OpenWindow",,_Q%
9offset%=
shell_GetEventListOffset(wh%,-1,_U%+92,24,
offset%>-1
blk%=(_U%!92)+offset%
pane handler event found
? ptr8%=blk%!8:ptr12%=blk%!12:ptr16%=blk%!16:ptr20%=blk%!20
_Q%!0=wh%
front%
behind%=-1
behind%=_Q%!28
full%
6
"Wimp_OpenWindow",,_Q% :
vbase fudge..
%
"Wimp_GetWindowState",,_Q%
6
"Wimp_CloseWindow",,_Q% :
vbase fudge..
reserve 1k as buffer - hope it's enough.....
* paneblk%=
shell_HeapBlockFetch(1024)
ctr%=0
ptr8%!ctr%<>-1
0 paneblk%!0=ptr8%!ctr%:
handle of 'pane'
0
first_pane%=0
first_pane%=paneblk%!0
last_pane%=paneblk%!0
*
"Wimp_GetWindowState",,paneblk%
0
Check flag word in pane event block...
flag%=ptr12%!ctr%
flag%
( height%=paneblk%!16-paneblk%!8
' width%=paneblk%!12-paneblk%!4
& paneblk%!4=_Q%!4+ptr16%!ctr%
' paneblk%!12=paneblk%!4+width%
( paneblk%!16=_Q%!16+ptr20%!ctr%
( paneblk%!8=paneblk%!16-height%
%
Attached to top edge.....
( height%=paneblk%!16-paneblk%!8
width%=_Q%!12-_Q%!4
& paneblk%!4=_Q%!4+ptr16%!ctr%
paneblk%!12=_Q%!12
( paneblk%!16=_Q%!16+ptr20%!ctr%
( paneblk%!8=paneblk%!16-height%
$
Attached to left edge...
height%=_Q%!16-_Q%!8
' width%=paneblk%!12-paneblk%!4
& paneblk%!4=_Q%!4+ptr16%!ctr%
' paneblk%!12=paneblk%!4+width%
1 paneblk%!16=_Q%!16 :
min y
1 paneblk%!8=_Q%!8+ptr20%!ctr% :
max y
&
Attached to bottom edge...
( height%=paneblk%!16-paneblk%!8
width%=_Q%!12-_Q%!4
& paneblk%!4=_Q%!4+ptr16%!ctr%
paneblk%!12=_Q%!12
/ paneblk%!16=_Q%!8+height%+ptr20%!ctr%
( paneblk%!8=paneblk%!16+height%
%
Attached to right edge...
height%=_Q%!16-_Q%!8
' width%=paneblk%!12-paneblk%!4
. paneblk%!4=_Q%!12-width%+ptr16%!ctr%
' paneblk%!12=paneblk%!4+width%
% paneblk%!16=_Q%!16 :
min y
% paneblk%!8=_Q%!8 :
max y
ctr%=0
paneblk%!28=behind%
paneblk%!28=prev_pane%
&
"Wimp_OpenWindow",,paneblk%
prev_pane%=paneblk%!0
ctr%+=4
toggle%
_Q%!28=last_pane%
!
"Wimp_OpenWindow",,_Q%
shell_HeapBlockReturn(paneblk%)
no pane event...
_Q%!0=wh%
full%
"Wimp_GetWindowState",,_Q%
behind%=-2
_Q%!28=-2
front%=-1
_Q%!28=-1
"Wimp_OpenWindow",,_Q%
*|Stop PROCshell_OpenWindow
!*|Start PROCshell_CloseWindow
shell_CloseWindow(wh%)
offset%,blk%,ptr8%,ptr12%,ptr16%,ptr20%,win_blk%,res%
:offset%=
shell_GetEventListOffset(wh%,-1,_U%+308,12,
offset%>=0
blk%=_U%!308+offset%
temp%=blk%!8
*|ifdef Trace_Init
shell_Tracef0("CloseWindow:About to call "+"FN"+$temp%)
*|endif
res%=
("FN"+$temp%)
res%=0
%&win_blk%=
shell_HeapBlockFetch(60)
wh%>0
'; offset%=
shell_GetEventListOffset(wh%,-1,_U%+92,24,
offset%>-1
blk%=(_U%!92)+offset%
*4 ptr12%=blk%!12:ptr16%=blk%!16:ptr20%=blk%!20
ctr%=0:ptr8%=blk%!8
ptr8%!ctr%<>-1
close pane windows
win_blk%!0=ptr8%!ctr%
/)
"Wimp_CloseWindow",,win_blk%
ctr%+=4
1
2*
PROCshell_HeapBlockReturn(ptr8%)
3+
PROCshell_HeapBlockReturn(ptr12%)
4+
PROCshell_HeapBlockReturn(ptr16%)
5+
PROCshell_HeapBlockReturn(ptr20%)
close parent window
84 win_blk%!0=wh%:
"Wimp_CloseWindow",,win_blk%
shell_HeapBlockReturn(win_blk%)
= *|Stop PROCshell_CloseWindow
? *|Start FNshell_DeleteWindow
shell_DeleteWindow(handle%)
win_blk%
B&win_blk%=
shell_HeapBlockFetch(20)
handle%<>0
oktodeletew(handle%)
E&
shell_EventDeleteAll(handle%)
F#
handle%=_U%!20
_U%!20=0
G4 offset%=
shell_SearchStatic(_U%!184,handle%)
offset%>-1
temp%=_U%!184+offset%
J7 temp%!0=0:
wipe window handle in static list
K
L.
and now actually delete the window..
win_blk%!0=handle%
N(
"Wimp_DeleteWindow",,win_blk%
handle%=0
shell_HeapBlockReturn(win_blk%)
=handle%
*|Stop FNshell_DeleteWindow
*|Start FNoktodeletew
oktodeletew(handle%)
*|Stop FNoktodeletew
*|Start FNoktoclosew
oktoclosew(handle%)
*|Stop FNoktoclosew
*|Start PROCcliprect
cliprect(b,
x1%,
y1%,
x2%,
y2%)
x0%,y0%
lwaorigin(b,x0%,y0%):x1%=b!24-x0%:y1%=b!28-y0%:x2%=b!32-x0%
y2%=b!36-y0%
*|Stop PROCcliprect
*|Start FNpoll
poll(mask%,task%)
"Wimp_Poll",mask%,_Q%
*|Stop FNpoll
*|Start FNshell_Poll_I
shell_Poll_I(mask%,task%)
"Wimp_Poll",mask%,_Q%
"Interface_Poll",a%,,task%
*|Stop FNshell_Poll_I
v&*|Start PROCshell_DoBackgroundTask
shell_DoBackgroundTask
z%*|Stop PROCshell_DoBackgroundTask
|#*|Start FNshell_IconIsDraggable
shell_IconIsDraggable(wh%,ih%)
flags%
'flags%=
shell_IconGetFlags(wh%,ih%)
temp%=(flags%
&6000)
temp%=&6000 =
"*|Stop FNshell_IconIsDraggable
*|Start FNshell_IconIsSprite
shell_IconIsSprite(wh%,ih%)
flags%,temp%
'flags%=
shell_IconGetFlags(wh%,ih%)
temp%=(flags%
1<<1)
temp%=(1<<1)
*|Stop FNshell_IconIsSprite
!*|Start PROCshell_IconDragBox
shell_IconDragBox(wh%,ih%)
blk%,wex,wey,e_offset%,flags%,f%,DragASprite%,spr_area%,valid%,spr$
name_ic%,name$
check if an event has been registered for when the drag ends..
<e_offset%=
shell_GetEventListOffset(wh%,ih%,_U%+72,24,
e_offset%>=0
it has, so go ahead and allow the drag, but first check if a filename
is present in the filename icon..
blk%=_U%!72+e_offset%
name_ic%=blk%!16
, name$=
shell_IconGetData(wh%,name_ic%)
name$=""
shell_OK(
shell_MessageNoArgs("SHELLMSG28"))
& blk%=
shell_HeapBlockFetch(6000)
!blk%=wh%
"Wimp_GetWindowInfo",,blk%
, wex=blk%!4-blk%!20:wey=blk%!16-blk%!24
spr_area%=blk%!68
blk%!4=ih%
"Wimp_GetIconState",,blk%
6 !blk%=wh%:blk%!4=5:flags%=blk%!24:valid%=blk%!32
blk%!8=blk%!8+wex
blk%!12=blk%!12+wey
blk%!16=blk%!16+wex
blk%!20=blk%!20+wey
blk%!24=0:blk%!28=0
) blk%!32=&7FFFFFFF:blk%!36=&7FFFFFFF
check dragasprite bit in CMOS RAM..
"OS_Byte",161,28
,,f%
DragASprite%=((f%
2)=2)
DragASprite%
f%=flags%
(f%
&100)
0 spr$=
shell_IconGetCommand(valid%,"s")
D
(f%
2)=0
shell_OK(
shell_MessageNoArgs("SHELLMSG19"))
spr$<>""
@
"DragASprite_Start",%10000101,spr_area%,spr$,blk%+8
8 _U%!100=_U%!100
set 'dragasprite' flag..
!
"Wimp_DragBox",,blk%
"Wimp_DragBox",,blk%
shell_HeapBlockReturn(blk%)
shell_Tracef0("IconDragBox:WARNING! no drag handler registered for this icon!")
*|Stop PROCshell_IconDragBox
(*|Start PROCshell_HandleAttachedMenu
shell_HandleAttachedMenu(_Q%,wh%,ih%)
menu%
Only executed when SELECT is pressed over an icon that has an
attached menu..
ih% <> -1
wh% > -1
0 menu% =
shell_GetEventMenu(_Q%!8,wh%,ih%)
menu% <> 0
2
shell_HandleMenuOpen(_Q%,menu%,wh%,ih%,
'*|Stop PROCshell_HandleAttachedMenu
*|Start PROCshell_Action
shell_Action(evnt%)
fn$,menu%,menu$,select$,menu_buffer%,mx%,my%,claimed%
wh%,ih%,void%,_temp28%,_temp32%,_temp24%,_temp%,fontmenuflag%
CheckSelect%,offset%
evnt%
&*|ifdef PROCshell_DoBackgroundTask
shell_DoBackgroundTask
*|endif
shell_RedrawWindow(_Q%!0)
shell_OpenWindow(_Q%!0,
shell_CloseWindow(_Q%!0)
**|ifdef PROCshell_PointerLeavingWindow
shell_PointerLeavingWindow(_Q%)
*|endif
+*|ifdef PROCshell_PointerEnteringWindow
shell_PointerEnteringWindow(_Q%)
*|endif
6:_U%!28=_Q%!12:_U%!32=_Q%!16:mx%=_Q%!0:my%=_Q%!4
6 _U%!272=_Q%!0:_U%!276=_Q%!4:_U%!320=_Q%!8
7 _temp28%=_Q%!12:_temp32%=_Q%!16:ih%=_Q%!16
*|ifdef TraceInit
@
shell_Tracef0("Action:Mouse_Click event detected")
^
shell_Tracef0("Action:Window Handle was &"+
~_Q%!12+" Icon Handle was "+
_Q%!16)
*|endif
0
_Q%!12=_U%!288
_Q%!16=_U%!292
C
same icon pressed again, use stored event offset..
B
shell_HandleBumpIcons(_U%!296,_Q%!12,_Q%!16,_Q%!8)
/ _U%!288=-1:_U%!292=-1:_U%!296=-1
_Q%!16>=0
N offset%=
shell_GetEventListOffset(_Q%!12,_Q%!16,_U%+104,16,0)
S
offset%>=0
shell_HandleBumpIcons(offset%,_Q%!12,_Q%!16,_Q%!8)
)
check first for drag flag!
(_Q%!8=64)
9
only check for SELECT and ADJUST buttons
< result%=
shell_IconIsDraggable(_Q%!12,_Q%!16)
result%
* mess$="Icon is draggable"
+
so now draw the drag box
2
shell_IconDragBox(_Q%!12,_Q%!16)
. mess$="Icon is not draggable"
.
shell_Tracef0("Action:"+mess$)
_Q%!8
,
shell_ActionSelectButton
*
shell_ActionMenuButton
,
shell_ActionAdjustButton
_U%!100
$
"DragASprite_Stop"
" _U%!100=_U%!100
F _U%!128=0:
set RAMPtr% to 0 in case a RAMFetch follows..
E
have to use last window/icon handles from _U% block as
?
_Q% block could be corrupted by other poll calls
8 fn$=
shell_GetEventHandler(_U%!28,_U%!32,6)
fn$<>""
N
shell_Tracef0("Action:Drag event detected - function is "+fn$)
6 void%=
("FN"+fn$+"(_temp28%,_temp32%)")
Q
shell_Tracef0("Action:Drag event detected - no handler function")
(
set up datasave message
1
shell_SendDataSave(_U%!28,_U%!32)
:
shell_Tracef0("Action:keypress is="+
_Q%!24)
_Q%!24
"
&0D,394,398,399,410
F claimed%=
shell_WritableIconHandler(_Q%!0,_Q%!4,_Q%!24)
4 claimed%=
shell_HotKeyProcess(_Q%!24)
claimed%
"K
shell_Tracef0("Action:Keypress not claimed, passing it on")
#*
"Wimp_ProcessKey",_Q%!24
%L
shell_Tracef0("Action:Keypress claimed by this application")
shell_ActionMenuSelect(_Q%)
17,18:
shell_Receive(_Q%)
19 :
shell_UserMessageAcknowledge(_Q%)
*|Stop PROCshell_Action
/(*|Start PROCshell_ActionSelectButton
shell_ActionSelectButton
*|ifdef Trace_Init
shell_Tracef0("ActionSelectButton:Mouse Button was SELECT")
*|endif
shell_HandleAttachedMenu(_Q%,_U%!28,_U%!32)
5/fn$=
shell_GetEventHandler(_U%!28,_U%!32,2)
check filename in icon if datasave event exists
_U%!32=0
icon was 0.....
shell_DataSaveCheckName(_U%!28,_U%!32)
fn$<>""
shell_IconSlab(4,_U%!28,_U%!32)
*|ifdef Trace_Init
shell_Tracef0("ActionSelectButton:About to call "+"FN"+fn$+"("+
_temp28%+","+
_temp32%+")")
*|endif
@- void%=
("FN"+fn$+"(_temp28%,_temp32%)")
if icon was 0 and dbox is dynamic then close dbox/menu
_U%!32=0
_U%!28=_U%!20
E
"Wimp_CreateMenu",,-1
I'*|Stop PROCshell_ActionSelectButton
K&*|Start PROCshell_ActionMenuButton
shell_ActionMenuButton
temp%,menu%,popup%
popup% =
*|ifdef PROCshell_TraceInit
shell_Tracef0("ActionMenuButton:Mouse Button was MENU")
*|endif
temp%=
(-1)
temp%=
shiftmenuclick(_Q%!12,_Q%!16)
temp%
*|ifdef PROCshell_TraceInit
shell_Tracef0("ActionMenuButton:Checking menu events..")
shell_Tracef0("ActionMenuButton:button="+
_Q%!8+" _Q%!12="+
_Q%!12+" _Q%!16="+
_Q%!16)
*|endif
Y4 menu%=
shell_GetEventMenu(_Q%!8,_Q%!12,_Q%!16)
(menu% <> 0
_Q%!12 > 0
_Q%!16 >= 0)
popup% =
menu% = 0
\G
No menu attached to the icon that was clicked over, therefore
]<
look for a menu attached to the window work area..
^5 menu% =
shell_GetEventMenu(_Q%!8,_Q%!12,-1)
*|ifdef PROCshell_TraceInit
shell_Tracef0("ActionMenuButton:Menu handle is:&"+
~menu%)
*|endif
menu%<>0
shell_HandleMenuOpen(_Q%,menu%,_Q%!12,_Q%!16,popup%)
g%*|Stop PROCshell_ActionMenuButton
i$*|Start PROCshell_HandleMenuOpen
shell_HandleMenuOpen(_Q%,menu%,wh%,ih%,popup%)
i_blk%,w_blk%
This routine handles the case of 'popup' menus, adjusting the menu
and pointer positions before opening to conform to the Style Guide
recommendations..
popup% =
Menu is a normal menu attached to a window, or to an icon on the
iconbar, so MenuUtils will open it in the correct place..
shell_OpenMenu(_Q%!0,_Q%!4,menu%)
Menu is a 'popup', i.e attached to a specific icon in a window that
is not the iconbar. Therefore open the menu to right right of the
icon as required by the Style Guide..
w( i_blk% =
shell_HeapBlockFetch(50)
x( w_blk% =
shell_HeapBlockFetch(36)
read coordinates of icon that has menu attached and open menu
to the right of it..
{# i_blk%!0 = wh%:i_blk%!4 = ih%
"Wimp_GetIconState",,i_blk%
w_blk%!0 = wh%
"Wimp_GetWindowState",,w_blk%
shell_OpenMenu(w_blk%!4 + i_blk%!16 + 64,_Q%!4,menu%)
And move the pointer appropriately..
w_blk%!4+i_blk%!16 + 64,_Q%!4
shell_HeapBlockReturn(i_blk%)
shell_HeapBlockReturn(w_blk%)
#*|Stop PROCshell_HandleMenuOpen
&*|Start PROCshell_ActionMenuSelect
shell_ActionMenuSelect(_Q%)
handler%,menu_buffer%,CheckSelect%,fontmenuflag%,void%,h_blk%
%h_blk%=
shell_HeapBlockFetch(256)
*|ifdef PROCshell_TraceInit
shell_Tracef0("ActionMenuSelect:Menu_Select event detected")
*|endif
"Wimp_GetPointerInfo",,_shell_blk%
*|ifdef Using_FontMenu
+menu_buffer%=
shell_HeapBlockFetch(256)
_U%!24=_U%!252
Current menu is FontMenu..
CheckSelect%=0:_U%!264=1
- CheckSelect%=
shell_CheckSelection(_Q%)
CheckSelect%>-1
_U%!264=1
_U%!264=0
_U%!264>0
"FontMenu_DecodeFontMenu",_Q%+CheckSelect%,menu_buffer%
fontmenuflag%
fontmenuflag%=1
%
'sensible' selection made..
*|ifdef PROCshell_TraceInit
b
shell_Tracef0("ActionMenuSelect:FontMenu selection ("+
shell_GetString(menu_buffer%)+")")
*|endif
I
shell_FontMenuSelectFont(
shell_GetString(menu_buffer%),_U%!260)
$
_shell_FontMenuSelFN$=""
7
"Wimp_DecodeMenu",,_U%!24,_Q%,menu_buffer%
5 fn$=
shell_GetEventHandler(_U%!52,_U%!56,0)
_temp%=menu_buffer%
9 $_temp%=
shell_StringStripTrailing($_temp%," ")
3
fn$<>""
void%=
("FN"+fn$+"($_temp%)")
'
_shell_FontMenuSelFN$<>""
W void%=
("FN"+_shell_FontMenuSelFN$+"(FNshell_FontMenuGetLastSelectedFont)")
shell_HeapBlockReturn(menu_buffer%)
*|endif
_U%!264=0
"MenuUtil_Decode",_U%!24,_Q%
handler%,,h_blk%
handler%
shell_MenuCallHandler(handler%,h_blk%)
_shell_blk%!8=1
shell_HeapBlockExists(_U%!224)
_temp%=_U%!224
$_temp%<>""
$
Call last menuwarning fn
1 void%=
("FN"+$_temp%+"(_U%!52,_U%!56)")
shell_OpenMenu(_U%!36,_U%!40,_U%!24)
_shell_FontMenuSelFN$=""
shell_HeapBlockReturn(h_blk%)
%*|Stop PROCshell_ActionMenuSelect
(*|Start PROCshell_ActionAdjustButton
shell_ActionAdjustButton
flags%,fn$,void%,sel_blk%,ctr%
)sel_blk% =
shell_HeapBlockFetch(100)
shell_Tracef0("Action:Mouse Button was ADJUST")
PROCshell_HandleAttachedMenu(_Q%,_U%!28,_U%!32)
Check if icon is a radio one, if so select icon to avoid Wimp
deselecting it...
"Wimp_WhichIcon",_U%!28,sel_blk%,&0000F000,&0000B000
ctr% = 0
sel_blk%!ctr% <> -1
sel_blk%!ctr% = _U%!32
shell_IconSet(_U%!28,_U%!32,1)
ctr% += 4
/fn$=
shell_GetEventHandler(_U%!28,_U%!32,3)
fn$<>""
shell_IconSlab(1,_U%!28,_U%!32)
- void%=
("FN"+fn$+"(_temp28%,_temp32%)")
shell_HeapBlockReturn(sel_blk%)
'*|Stop PROCshell_ActionAdjustButton
*|Start FNshiftmenuclick
shiftmenuclick(wh%,ih%)
*|Stop FNshiftmenuclick
*|Start PROCshell_IconSlab
shell_IconSlab(button%,wh%,ih%)
blk%
"blk%=
shell_HeapBlockFetch(50)
*blk%!8=button%:blk%!12=wh%:blk%!16=ih%
"Interface_SlabButton",,blk%
blk%!8=0
"Interface_SlabButton",,blk%
shell_HeapBlockReturn(blk%)
*|Stop PROCshell_IconSlab
**|Start PROCshell_PointerLeavingWindow
shell_PointerLeavingWindow(_Q%)
i_blk%,void%
&i_blk% =
shell_HeapBlockFetch(12)
"Wimp_WhichIcon",!_Q%,i_blk%,&003F0000,15 << 16
!i_blk% <> -1
PROCshell_Tracef0("LL:"+STR$(!i_blk%))
8 void% =
("FN" +
shell_IconGetData(!_Q%,!i_blk%))
shell_HeapBlockReturn(i_blk%)
':
*|Stop
+*|Start PROCshell_PointerEnteringWindow
shell_PointerEnteringWindow(_Q%)
i_blk%,void%,wh%
wh% = _Q%!0
&i_blk% =
shell_HeapBlockFetch(12)
"Wimp_WhichIcon",wh%,i_blk%,&003F0000,14 << 16
!i_blk% <> -1
PROCshell_Tracef0("LL:"+STR$(!i_blk%))
PROCshell_Tracef0("LL:"+"FN" + FNshell_IconGetData(wh%,!i_blk%))
7 void% =
("FN" +
shell_IconGetData(wh%,!i_blk%))
shell_HeapBlockReturn(i_blk%)
**|Stop PROCshell_PointerEnteringWindow
"*|Start PROCshell_RedrawWindow
shell_RedrawWindow(handle%)
more%,fn$,x0%,y0%,blk%,i_blk%
&i_blk% =
shell_HeapBlockFetch(12)
"Wimp_WhichIcon",handle%,i_blk%,&003F0000,13 << 16
!i_blk% <> -1
PROCshell_Tracef0("LL:"+STR$(!i_blk%))
PROCshell_Tracef0("LL:"+"FN" + FNshell_IconGetData(handle%,!i_blk%))
/ fn$ =
shell_IconGetData(handle%,!i_blk%)
shell_HeapBlockReturn(i_blk%)
#blk%=
shell_HeapBlockFetch(100)
fn$ = ""
Can't find the clever version of an attached event, check the
dumb one...
. fn$=
shell_GetEventHandler(handle%,-1,4)
blk%!0=handle%
"Wimp_RedrawWindow",,blk%
more%
"*x0%=blk%!4-blk%!20:y0%=blk%!16-blk%!24
more%
$)
"Interface_Render3dWindow",,blk%
%C
fn$<>""
void%=
("FN"+fn$+"("+
blk%+","+
x0%+","+
y0%+")")
&*
"Wimp_GetRectangle",,blk%
more%
shell_HeapBlockReturn(blk%)
+!*|Stop PROCshell_RedrawWindow
*|Start PROCshell_Receive
shell_Receive(_Q%)
temp%,void%
_Q%!16
0 :
shell_Exit:
1 :
shell_DataSave(_Q%)
2 :
shell_DataSaveAck(_Q%)
3 :
shell_DataLoad(_Q%,
4 :
shell_DataLoadAck(_Q%)
5 :
shell_DataLoad(_Q%,
6 :
shell_RAMFetch(_Q%)
7 :
shell_RAMTransmit(_Q%)
8 :
shell_Message_PreQuit(_Q%)
9 :
_U%!164>0
*|ifdef TraceInit
<J
shell_Tracef0("Receive:PaletteChange message received")
*|endif
temp%=_U%!164
?& void%=
("FN"+$temp%)
10 :
shell_Message_SaveDesktop(_Q%)
14 :
shell_Message_Shutdown(_Q%)
&502 :
shell_InteractiveHelp(_Q%)
&400C0:
shell_MenuWarning(_Q%)
&400C1:
shell_Message_ModeChange(_Q%)
&400C2:
TaskInitialise
_U%!168>0
*|ifdef TraceInit
IK
shell_Tracef0("Receive:TaskInitialise message received")
*|endif
temp%=_U%!168
L\ void%=
("FN"+$temp%+"("+
(_Q%!4)+","+
shell_GetString(_Q%+28)+
34+")")
NF
_U%!208=-1
shell_GetString(_Q%+28)="StrongHelp"
_U%!208=_Q%!4
Pj
shell_StrongHlpMsg("Help_Install -DieWithTask "+
shell_GetAppDir+"."+
shell_GetAppName)
temp%=_U%!216
R
$temp%<>""
S+
shell_HelpWord($temp%)
T3
shell_HeapBlockReturn(_U%!216)
_U%!216=0
&400C3:
TaskCloseDown
_U%!172>0
*|ifdef TraceInit
[>
shell_Tracef0("Receive:TaskCloseDown message received")
*|endif
temp%=_U%!172
^& void%=
("FN"+$temp%)
`,
_Q%!4=_U%!208
_U%!208=-1
&400C7:
TaskNameIs
*|ifdef TraceInit
c;
shell_Tracef0("Receive:TaskNameIs message received")
*|endif
e;
shell_GetString(_Q%+28) = "StrongHelp"
fD _U%!208=_Q%!20:
store task handle of StrongHlp...
h$
shell_ScanForHelp
shell_HandleUnknownMessage2(_Q%)
*|Stop PROCshell_Receive
p(*|Start PROCshell_Message_ModeChange
shell_Message_ModeChange(_Q%)
offset%,ctr%,sw_list%,w_blk%
sw_list%=_U%!184
_U%!160>0
uF
shell_Tracef0("Message_ModeChange:ModeChange message received")
temp%=_U%!160
void%=
("FN"+$temp%)
SYS "FontWindow_ModeChange",_U%!148
Now check if any windows containing panes are open, and if so
reopen them to avoid problems with panes appearing in the wrong
position...
~%w_blk%=
shell_HeapBlockFetch(100)
sw_list%<>0
*|ifdef TraceInit
shell_Tracef0("Message_ModeChange:Checking static window list for pane events")
*|endif
sw_list%!ctr%<>-1
%
now check pane event list..
G offset%=
shell_GetEventListOffset(sw_list%!ctr%,-1,_U%+92,24,
offset%>-1
*|ifdef TraceInit
I
shell_Tracef0("Message_ModeChange:Static window handle found")
*|endif
0
shell_WindowIsOpen(sw_list%!ctr%)
*|ifdef TraceInit
A
shell_Tracef0("Message_ModeChange:Window is open..")
*|endif
-
Reopen window if already open..
! !w_blk%=sw_list%!ctr%
)
"Wimp_CloseWindow",,w_blk%
1
shell_OpenWindow(sw_list%!ctr%,0,-1)
ctr%+=4
shell_HeapBlockReturn(w_blk%)
'*|Stop PROCshell_Message_ModeChange
&*|Start PROCshell_Message_Shutdown
shell_Message_Shutdown(_Q%)
_U%!312>0
shell_Tracef0("Message_Shutdown:Shutdown message received")
temp%=_U%!312
void%=
("FN"+$temp%)
%*|Stop PROCshell_Message_Shutdown
+*|Start PROCshell_HandleUnknownMessage2
shell_HandleUnknownMessage2(_Q%)
message$
I want to handle message &43B00 here as I use it for
communications between EvntShell applications..
_Q%!16
&43B00:
incoming EvntShell message...
message$=$(_Q%+20)
:
message$,30)="EvntShellLib:ShellDBug started"
_U%!100
1<<4
*
trace init message pending..
( _U%!100 = (_U%!100
1 << 4)
c
shell_BroadcastMessage(&43B00,"ShellDBug:Init Debug messages from "+
shell_GetAppName)
5
message$,25)="EvntShellLib:TraceInitAck"
O
unset trace init message pending flag, ShellDBug has acknowledged..
" _U%!100=(_U%!100
1<<4)
0
message$,20)="EvntShellLib:TraceOn"
shell_TraceOn
1
message$,21)="EvntShellLib:TraceOff"
shell_TraceOff
8
message$,28)="EvntShellLib:ListClickSelect"
shell_ListClickSelect
8
message$,28)="EvntShellLib:ListClickAdjust"
shell_ListClickAdjust
5
message$,25)="EvntShellLib:ListHelpTags"
shell_ListHelpTags
Pass message block on in case the user wants it too..
shell_HandleUnknownMessage(_Q%)
**|Stop PROCshell_HandleUnknownMessage2
**|Start PROCshell_HandleUnknownMessage
shell_HandleUnknownMessage(_Q%)
)*|Stop PROCshell_HandleUnknownMessage
**|Start PROCshell_AttachPreQuitHandler
shell_AttachPreQuitHandler(fn$)
temp%,void%
_U%!300>0
shell_HeapBlockReturn(_U%!300)
)_U%!300=
shell_HeapBlockFetch(
fn$+1)
temp%=_U%!300:$temp%=fn$
)*|Stop PROCshell_AttachPreQuitHandler
+*|Start PROCshell_AttachShutdownHandler
shell_AttachShutdownHandler(fn$)
temp%,void%
_U%!312>0
shell_HeapBlockReturn(_U%!312)
)_U%!312=
shell_HeapBlockFetch(
fn$+1)
temp%=_U%!312:$temp%=fn$
**|Stop PROCshell_AttachShutdownHandler
-*|Start PROCshell_AttachModeChangeHandler
shell_AttachModeChangeHandler(fn$)
temp%,void%
_U%!160>0
shell_HeapBlockReturn(_U%!160)
)_U%!160=
shell_HeapBlockFetch(
fn$+1)
temp%=_U%!160:$temp%=fn$
void%=
("FN"+fn$)
,*|Stop PROCshell_AttachModeChangeHandler
0*|Start PROCshell_AttachPaletteChangeHandler
shell_AttachPaletteChangeHandler(fn$)
temp%,void%
_U%!164>0
shell_HeapBlockReturn(_U%!164)
)_U%!164=
shell_HeapBlockFetch(
fn$+1)
temp%=_U%!164:$temp%=fn$
void%=
("FN"+fn$)
/*|Stop PROCshell_AttachPaletteChangeHandler
1*|Start PROCshell_AttachTaskInitialiseHandler
shell_AttachTaskInitialiseHandler(fn$)
temp%,void%
_U%!168>0
shell_HeapBlockReturn(_U%!168)
)_U%!168=
shell_HeapBlockFetch(
fn$+1)
temp%=_U%!168:$temp%=fn$
0*|Stop PROCshell_AttachTaskInitialiseHandler
0*|Start PROCshell_AttachTaskCloseDownHandler
shell_AttachTaskCloseDownHandler(fn$)
temp%,void%
_U%!172>0
shell_HeapBlockReturn(_U%!172)
)_U%!172=
shell_HeapBlockFetch(
fn$+1)
temp%=_U%!172:$temp%=fn$
/*|Stop PROCshell_AttachTaskCloseDownHandler
*|Start PROCshell_RAMFetch
shell_RAMFetch(_Q%)
RAMFetch_buffer%,len_data%,done%
done%=
If the address in the data save event block <&8000 then it is an
estimated size and the file is not already present in a RAM buffer.
In this case ignore RAMFetch message as the data will be written to a
file anyway..
_U%!144>&8000
Send file to application
send RAMTransmit message...
*|ifdef TraceInit
shell_Tracef0("RAMFetch:RAMFetch called..")
*|endif
_Q%!12=_Q%!08
"+ _Q%!16=7:
message action RAMTransmit
get buffer length..
len_data%=_U%!136
_U%!140=&FF9
&H
kludge for sprite files because when saving to a physical file
'I
with "OS_SpriteOp" the first word is dropped. Hence for the RAM
(I
save we have to incrememt the address the data is held at by 4!
)M
The estimated size has already been kludged in shell_AttachDataSave
_U%!144+=4
(len_data%-_U%!128)<_Q%!24
-&
This will be the last block
. _Q%!24=len_data%-_U%!128
done%=
*|ifdef TraceInit
shell_Tracef0("RAMFetch:Sending block")
*|endif
"Wimp_TransferBlock",_U%!148,_U%!144+_U%!128,_Q%!04,_Q%!20,_Q%!24
"Wimp_SendMessage",17,_Q%,_Q%!04
7 _U%!120=_Q%!8 :
SaveRef%
_U%!128+=_Q%!24:
RAMPtr%
done%
_U%!128=0
*|Stop PROCshell_RAMFetch
>!*|Start PROCshell_RAMTransmit
shell_RAMTransmit(_Q%)
offset%,blk%,f_name$,temp%
Receive file from application via RAM transfer..
_Q%!12=_U%!112
_U%!128+=_Q%!24
_Q%!24<_U%!132
E!
This was the last block
*|ifdef TraceInit
shell_Tracef0("RAMTransmit:Last block received")
*|endif
ID offset%=
shell_GetEventListOffset(_U%!28,_U%!32,_U%+96,16,
blk%=_U%!96+offset%
*|ifdef TraceInit
shell_Tracef0("RAMTransmit:_U%!28="+
_U%!28)
shell_Tracef0("RAMTransmit:_U%!32="+
_U%!32)
shell_Tracef0("RAMTransmit:offset%="+
offset%)
*|endif
P3
now call user function after file load...
QL
use copy of datasave message block to find file type, file name...
temp%=_U%!156
S* f_name$=
shell_GetString(temp%+44)
TK
shell_UserFNLoadFile(temp%!40,_U%!152,blk%!8,f_name$,_U%!132,blk%)
V'
There are more blocks to come
*|ifdef TraceInit
shell_Tracef0("RAMTransmit:Block received")
*|endif
Z=
check size of incoming block and increase buffer if
required...
_U%!128>_U%!132
*|ifdef TraceInit
shell_Tracef0("RAMTransmit:Increasing buffer size..")
*|endif
`A _U%!152=
shell_HeapBlockExtend(_U%!152,_U%!128,_U%!132)
a
_Q%!12=_Q%!08
_Q%!16=6
_Q%!20=_U%!152+_U%!128
_Q%!24=_U%!132
f+
"Wimp_SendMessage",18,_Q%,_Q%!04
_U%!112=_Q%!08
too much data sent...
shell_HeapBlockReturn(_U%!152)
_U%!152=0
shell_OK(
shell_MessageNoArgs("SHELLMSG15"))
q *|Stop PROCshell_RAMTransmit
*|Start FNshell_LoadFile
shell_LoadFile(Scrap%)
Name$,FileSize%,Flags%,loadloc%
u"Name$=
shell_GetString(_Q%+44)
v&FileSize%=
shell_FileLength(Name$)
FileSize%<0
shell_OK(
shell_MessageNoArgs("SHELLMSG16"))
x-loadloc%=
shell_HeapBlockFetch(FileSize%)
"XOS_File",16,Name$,loadloc%,0
;Flags%
shell_VFlag(Flags%)
shell_HeapBlockReturn(loadloc%)
shell_OK(
shell_MessageNoArgs("SHELLMSG17"))
*|ifdef TraceInit
shell_Tracef0("LoadFile:File "+Name$+" loaded ok at &"+
~loadloc%)
*|endif
Stuff for fileinfo box...........
PROCDate(FNFileTimeAndDate(Name$))
IF Scrap% THEN
SYS "XOS_FSControl",27,(_Q%+44),,2
PROCModified(TRUE)
ELSE
PROCName(Name$)
PROCType(_Q%!40)
PROCModified(FALSE)
ENDIF
PROCNewFile
=loadloc%
*|Stop FNshell_LoadFile
*|Start FNshell_VFlag
shell_VFlag(Flags%)
=((Flags%
%0001)=%0001)
*|Stop FNshell_VFlag
*|Start FNshell_CheckType
shell_CheckType(type%,type_list%,DataOpen%)
Exclude directories, applications & unstamped files
type_list% is address of heapblock holding a list
of allowable filetypes terminated by -1..
Ok%,ctr%,found%,temp%,topbit_load%
#ctr%=0:found%=-1:topbit_load%=
_U%!100
1<<1
_U%!100=_U%!100
1<<1
type_list%!ctr%<>-1
temp%=type_list%!ctr%
temp%
1<<31
temp%=temp%
1<<31
topbit_load%=
topbit_load%=
temp%=type%
found%=ctr%
topbit_load%
_U%!100=_U%!100
1<<1
*|ifdef TraceInit
=
shell_Tracef0("CheckType:Top Bit Load detected..")
*|endif
ctr%+=4
DataOpen%
(type%>=&1000)
found%=-1
*|ifdef TraceInit
found%>-1
shell_Tracef0("CheckType:File type OK "+
~type_list%!found%)
shell_Tracef0("CheckType:File type NOT ok "+
~type%)
*|endif
found%<>-1
*|Stop FNshell_CheckType
*|Start PROCshell_Exit
shell_Exit
ms_desc%
ms_desc%=_U%!68
"XMessageTrans_CloseFile",ms_desc%
"XOS_Module",7,,ms_desc%
*|ifdef TraceInit
shell_Tracef0("Exit:Application closing down")
*|endif
shell_TraceExit
"XHourglass_Smash"
"XWimp_DragBox",,-1
shell_WimpCloseDown_I(_U%!148)
*|Stop PROCshell_Exit
*|Start PROCshell_DataLoad
shell_DataLoad(_Q%,DataOpen%)
reference%,offset%,blk%,_temp%,type_list%,type%,fname$
type%=_Q%!40
#fname$=
shell_GetString(_Q%+44)
*|ifdef TraceInit
shell_Tracef0("DataLoad:DataLoad message received")
*|endif
check my_file_type set up in shell_AttachDataLoad
only works when dragging a file as when DataOpen% is TRUE
the _Q% block is set up differently!!
DataOpen%
double click load..
check if there are any dataload events set up...
_U%!96<>0
8 offset%=0:
look at first dataload event only...
! offset%=-1:
ignore it...
drag load, check for specific window/icon event..
B offset%=
shell_GetEventListOffset(_Q%!20,_Q%!24,_U%+96,16,
offset%=-1
,
now check for window handle only..
@ offset%=
shell_GetEventListOffset(_Q%!20,-1,_U%+96,16,
offset%>-1
DataLoadEvent exists
blk%=_U%!96+offset%
shell_CheckType(_Q%!40,blk%!8,DataOpen%)
file type is ok...
*|ifdef TraceInit
G
shell_Tracef0("DataLoad:File type recognised (&"+
~_Q%!40+")")
*|endif
Reference%=_Q%!12
_Q%!12=_Q%!8
_Q%!16=4
*
"Wimp_SendMessage",18,_Q%,_Q%!4
_U%!100
1<<1
loadloc%=-1
_U%!100=_U%!100
1<<1
6 loadloc%=
shell_LoadFile(Reference%=_U%!108)
G
shell_UserFNLoadFile(type%,loadloc%,blk%!8,fname$,_Q%!36,blk%)
2
return copy of datasave message block...
_U%!156<>0
)
shell_HeapBlockReturn(_U%!156)
_U%!156=0
*|ifdef TraceInit
shell_Tracef0("DataLoad:File type NOT recognised (&"+
~_Q%!40+")")
*|endif
*|Stop PROCshell_DataLoad
$*|Start PROCshell_UserFNLoadFile
shell_UserFNLoadFile(type%,loadloc%,type_list%,_filename$,_file_size%,blk%)
ctr%,found%,temp%,void%
call user function after loading file...
ctr%=0:found%=-1
type_list%!ctr%<>-1
temp%=type_list%!ctr%
temp%
1<<31
temp%=temp%
1<<31
temp%=type%
found%=ctr%
ctr%+=4
temp%=blk%!12
Zvoid%=
("FN"+$(temp%!found%)+"("+
loadloc%+","+
type%+",_filename$,"+
_file_size%+")")
#*|Stop PROCshell_UserFNLoadFile
*|Start PROCshell_DataSave
shell_DataSave(_Q%)
temp%,offset%,blk%,loop%
Called when another application wants to save data to our one..
*|ifdef TraceInit
shell_Tracef0("DataSave:DataSave message received")
*|endif
Receive file from application, but check first it didn't come from
this one!
_Q%!04<>_U%!148
check event list for window/icon at this point to see
which filetypes are valid...
*B offset%=
shell_GetEventListOffset(_Q%!20,_Q%!24,_U%+96,16,
offset%>-1
blk%=_U%!96+offset%
--
shell_CheckType(_Q%!40,blk%!8,
*|ifdef TraceInit
/H
shell_Tracef0("DataSave:Filetype recognized (&"+
~_Q%!40+")")
*|endif
1)
shell_TopBitLoadInProgress
2N
'no load' load taking place, just need the full filename so that
3O
the user app can do the load - therefore send Message_DataSaveAck
4/
with Wimp$Scrap as the filename..
*|ifdef TraceInit
69
shell_Tracef0("DataSave:'no load' flag set")
7B
shell_Tracef0("DataSave:Sending Message_DataSaveAck")
*|endif
_Q%!00=256
:B _Q%!12=_Q%!08:_Q%!36=-1:_Q%!16=2:
Message_DataSaveAck
;6 $(_Q%+44)=
shell_GetAppDir+".ScrapFile"+
<.
"Wimp_SendMessage",18,_Q%,_Q%!04
>M
Normal load from another application therefore offer to perform
?9
a RAM file transfer with Message_RAMFetch..
@M
Make a copy of the message block as I need it when RAM transfer
A<
is not supported by the sender of this message
BG
shell_HeapBlockReturn(_U%!156):
return temp message blk..
C4 _U%!156=
shell_HeapBlockFetch((_Q%!0)+8)
temp%=_U%!156
E9
loop%=0
_Q%!0
first word is size...
F# temp%!loop%=_Q%!loop%
loop%
H@
store destination window/icon handles for later...
I' _U%!28=_Q%!20:_U%!32=_Q%!24
_U%!128=0
K/ _U%!132=_Q%!36:
RAMSize%=est_size%
L5
set up heapblock to hold loaded file...
M1 _U%!152=
shell_HeapBlockFetch(_Q%!36)
And here we go !
_Q%!00=28
_Q%!12=_Q%!08
Q) _Q%!16=6:
Message_RAMFetch..
R" _Q%!20=_U%!152+_U%!128
_Q%!24=_U%!132
T/
"Wimp_SendMessage",18,_Q%,_Q%!04
_U%!112=_Q%!08
*|ifdef TraceInit
W?
shell_Tracef0("DataSave:Sending Message_RAMFetch")
*|endif
Z
*|ifdef TraceInit
\<
shell_Tracef0("DataSave:Filetype NOT recognized")
*|endif
^
*|Stop PROCshell_DataSave
Set all this stuff beforehand as RAM transfer
procedures may be entered more than once !
PROCName(FNLeaf(FNGetString(PollPtr%+44)))
PROCType(PollPtr%!40)
PROCModified(TRUE)
PROCDate(FNCurrentTimeAndDate)
k(*|Start FNshell_TopBitLoadInProgress
shell_TopBitLoadInProgress
_U%!100
1<<1
o(*|Stop FNshell_TopBitLoadInProgress
p"*|Start PROCshell_SendDataSave
shell_SendDataSave(wh%,ih%)
blk%,msgblk%,tmpblk%,offset%,FileSize%,void%
s%tmpblk%=
shell_HeapBlockFetch(30)
retrieve current position of pointer (window and icon over which
the drag event ended plus pointer position)
"Wimp_GetPointerInfo",,tmpblk%
w:offset%=
shell_GetEventListOffset(wh%,ih%,_U%+72,24,
offset%=-1
offset%=-2
yi void%=
shell_MessageWindow(
shell_MessageNoArgs("SHELLMSG13"),0,"",
shell_MessageNoArgs("warning"))
blk%=(_U%!72)+offset%
blk%!8>&8000
}0 FileSize%=
shell_HeapBlockInfo(blk%!8)-4
FileSize%=blk%!8
msgblk%=_U%!76
5 msgblk%!0 =256 :
length of message block
1 msgblk%!12=0 :
myref 0=originating
, msgblk%!16=1 :
message action
7 msgblk%!20=tmpblk%!12:
destination window handle
5 msgblk%!24=tmpblk%!16:
destination icon handle
+ msgblk%!28=tmpblk%!0 :
mouse x coord
+ msgblk%!32=tmpblk%!4 :
mouse y coord
4 msgblk%!36=FileSize% :
estimated size of file
' msgblk%!40=blk%!12 :
file type
@ $(msgblk%+44)=
shell_Leaf(
shell_IconGetData(wh%,blk%!16))
"Wimp_SendMessage",18,msgblk%,msgblk%!20,msgblk%!24
_U%!120=_Q%!8
$ _U%!136=FileSize% :
FileSize%
$ _U%!140=blk%!12 :
FileType%
$ _U%!144=blk%!8 :
FileBuff%
& _U%!156=blk%!4 :
TaskHandle%
( _U%!200=msgblk%!20:
window handle
& _U%!204=msgblk%!24:
icon handle
shell_HeapBlockReturn(tmpblk%)
!*|Stop PROCshell_SendDataSave
!*|Start PROCshell_DataSaveAck
shell_DataSaveAck(_Q%)
_fullname$,a%,b%,blk%,temp%,void%
*|ifdef TraceInit
shell_Tracef0("DataSaveAck:DataSaveAck message received")
*|endif
a%=0:b%=_Q%?(44+a%)
b%<>0
_fullname$+=
a%+=1
b%=_Q%?(44+a%)
*|ifdef TraceInit
shell_Tracef0("DataSaveAck:Full save name is: "+_fullname$)
shell_Tracef0("DataSaveAck:task="+
_Q%!4)
shell_Tracef0("DataSaveAck:mytask="+
_U%!148)
*|endif
@offset%=
shell_GetEventListOffset(_U%!28,_U%!32,_U%+72,24,
offset%=-1
offset%=-2
shell_MessageNoArgs("SHELLMSG05")
blk%=(_U%!72)+offset%
temp%=blk%!20
now call the file saving routine......
$temp%<>""
) void%=
("FN"+$temp%+"(_fullname$)")
no file saving routine specified for this event, so check if data is in a
heapblock..
shell_HeapBlockExists(blk%!8)
G
default save routine, just save the whole heapblock to disk..
X
"OS_File",10,_fullname$,blk%!12,,blk%!8,blk%!8+
shell_HeapBlockInfo(blk%!8)+1
:
Whoops! not a heapblock - someone's screwed up..
/
shell_MessageNoArgs("SHELLMSG21")
_Q%!36>-1
file is secure
_U%!80<>0
shell_HeapBlockReturn(_U%!80)
1 _U%!80=
shell_HeapBlockFetch(
_fullname$+1)
temp%=_U%!80
$temp%=_fullname$
B_Q%!16=3:!_Q%=256:_Q%!20=_U%!200:_Q%!24=_U%!204:_Q%!40=_U%!140
5_Q%!36=
shell_FileLength(_fullname$):_Q%!12=_Q%!8
*|ifdef TraceInit
shell_Tracef0("DataSaveAck:File length is "+
_Q%!36+" bytes")
*|endif
$(_Q%+44)=_fullname$+
send dataload message
store my_ref
_U%!84=_Q%!8
*|ifdef TraceInit
shell_Tracef0("DataSaveAck:Sending DataLoad Message")
*|endif
"Wimp_SendMessage",18,_Q%,_Q%!20,_Q%!24
now close window that save originated from if it is not a
'dynamic' dbox
_U%!28<>_U%!20
shell_CloseWindow(_U%!28)
"Wimp_CreateMenu",,-1:
close any open menus
*|Stop PROCshell_DataSaveAck
'*|Start PROCshell_DataSaveCheckName
shell_DataSaveCheckName(wh%,ih%)
offset%,blk%,list_size%
Routine to check if a 'datasave' event exists in the window wh%.
If it does then the filename is checked for a '.' character. An
error is generated if no '.' is found. This routine is called by
the library when a mouse click on icon 0 is detected.
blk%=_U%!72:offset%=0
blk%<>0
- list_size%=
shell_HeapBlockInfo(blk%)-8
blk%<>0 therefore a datasave event list exists..
2
check window handles of events in list..
!(blk%+offset%)=wh%
)
check for a valid path name..
1 name$=
shell_IconGetData(!blk%,blk%!16)
I
name$,".")=0
shell_OK(
shell_MessageNoArgs("SHELLMSG01"))
C offset%=list_size%:
window handle found so abort check..
( offset%+=24:
check next event..
offset%>=list_size%
&*|Stop PROCshell_DataSaveCheckName
!*|Start PROCshell_DataLoadAck
shell_DataLoadAck(_Q%)
*|ifdef TraceInit
shell_Tracef0("DataLoadAck:DataLoadAck message received (file received ok)")
*|endif
*|Stop PROCshell_DataLoadAck
,*|Start PROCshell_UserMessageAcknowledge
shell_UserMessageAcknowledge(_Q%)
_Q%!16
shell_AckDataLoad(_Q%)
shell_AckRAMFetch(_Q%)
+*|Stop PROCshell_UserMessageAcknowledge
!*|Start PROCshell_AckDataLoad
shell_AckDataLoad(_Q%)
_Q%!12<>_U%!84
Reference hasn't been updated,
therefore the Wimp returned my call
The receiver didn't understand scrap transfer
"XOS_File",6,"<Wimp$Scrap>"
255,"Data Transfer failed: Receiver died"
*|Stop PROCshell_AckDataLoad
!*|Start PROCshell_AckRAMFetch
shell_AckRAMFetch(_Q%)
Exist%,temp%
temp%=_U%!156
*|ifdef TraceInit
shell_Tracef0("AckRAMFetch:AckRAMFetch called....")
*|endif
_Q%!12<>_U%!112
Reference hasn't been updated,
therefore the Wimp returned my call
_U%!128=0
2
The receiver didn't support RAM transfer
*|ifdef TraceInit
shell_Tracef0("AckRAMFetch:Receiver does not support RAM transfer")
*|endif
";
"XOS_ReadVarVal","Wimp$Scrap",,-1,0,3
,,Exist%
Exist%<>0
$) $(temp%+44)="<Wimp$Scrap>"+
%8 temp%!00=(49+
shell_GetString(temp%+44)))
temp%!12=temp%!08
temp%!16=2
temp%!36=-1
)0
"Wimp_SendMessage",18,temp%,temp%!4
_U%!108=temp%!08
+
,8
shell_OK(
shell_MessageNoArgs("SHELLMSG14"))
-
/;
The receiver has initiated RAM transfer, and this
0?
was successful once, but I expected more data to come
*|ifdef TraceInit
shell_Tracef0("AckRAMFetch:RAM transfer started, but not enough data sent. Sender died?")
*|endif
4'
shell_HeapBlockReturn(_U%!152)
_U%!152=0
shell_OK("SHELLMSG06")
; *|Stop PROCshell_AckRAMFetch
=!*|Start PROCshell_MenuWarning
shell_MenuWarning(_Q%)
fn$,menu_buffer%,x%,y%,void%,_temp%,a%,warn_fn$,item_addr%,blk%
@!x%=_Q%!24:y%=_Q%!28:_U%!264=0
_U%!20<>0
*|ifdef PROCshell_TraceInit
shell_Tracef0("MenuWarning:Removing last dynamic dbox (handle=&"+
~_U%!20+")")
*|endif
E' void%=
shell_DeleteWindow(_U%!20)
*|ifdef PROCshell_TraceInit
shell_Tracef0("MenuWarning:Last dynamic dbox removed")
*|endif
Check submenu pointer and create window found there
Then call pre and post open FNs
If submenu pointer is the warning window, open it to remind the user
that no dbox has been attached to this menu entry..
_Q%!20
_U%!228:
handle of warning dbox..
won't need to do this if title/icon messages are substituted
when loading the templates
shell_WindowRetitle(_U%!228,
shell_MessageNoArgs("warning"))
still need to set up the message though...
shell_IconPutData(_U%!228,1,
shell_MessageNoArgs("SHELLMSG07"),0)
"Wimp_CreateSubMenu",,_U%!228,x%,y%
Sub menu is either a dialog box, or a menu!!
X9 item_addr%=
shell_MenuGetItemAddress(_U%!24,_Q%+32)
shell_HeapBlockExists(item_addr%!4)
DBox is attached..
[-
shell_MenuWarnDBox(item_addr%,x%,y%)
Submenu attached..
^& blk%=
shell_HeapBlockFetch(32)
_3
"MenuUtil_Decode",_U%!24,_Q%+32
,,blk%
`9
shell_FindMenuWarnEvent(blk%!8,warn_fn$,sel_fn$)
a$
shell_HeapBlockReturn(blk%)
b=
shell_MenuWarnSubMenu(_Q%!20,x%,y%,warn_fn$,sel_fn$)
g *|Stop PROCshell_MenuWarning
i"*|Start PROCshell_MenuWarnDBox
shell_MenuWarnDBox(addr%,x%,y%)
temp%,h%,void%
temp%=addr%!4
shell_CreateWindow($temp%!0,h%)
*|ifdef TraceInit
shell_Tracef0("MenuWarnDBox:Creating new dynamic dbox (handle=&"+
~h%+")")
*|endif
$temp%!4<>""
*|ifdef TraceInit
shell_Tracef0("MenuWarnDBox:Calling preopen FN '"+$temp%!4+"'")
*|endif
x( void%=
("FN"+$temp%!4+"("+
h%+")")
$temp%!8<>""
*|ifdef TraceInit
shell_Tracef0("MenuWarnDBox:Calling postopen FN '"+$temp%!8+"'")
*|endif
~( void%=
("FN"+$temp%!8+"("+
h%+")")
h% is new window handle....
"Wimp_CreateSubMenu",,h%,x%,y%
_U%!20=h%
!*|Stop PROCshell_MenuWarnDBox
'*|Start PROCshell_FindMenuWarnEvent
shell_FindMenuWarnEvent(item_handle%,
warn_fn$,
sel_fn$)
result%,e_list%,temp%,offset%,found%,list_size%,temp2%,ctr%
submenu%
;submenu%=0:
If still 0 on return then no event found..
=e_list%=_U%!220:offset%=0:found%=
:warn_fn$="":submenu%=0
shell_HeapBlockExists(e_list%)
ctr%+=4
e_list%!ctr%=-1
list_size%=ctr%:ctr%=0
*|ifdef PROCshell_TraceInit
shell_Tracef0("FindMenuWarnEvent:list_size%="+
list_size%)
*|endif
" temp%=!(e_list%+offset%+0)
temp%<>-1
temp%=item_handle%
found%=
7 temp2%=e_list%!(offset%+4):warn_fn$=$temp2%
( submenu%=e_list%!(offset%+8)
7 temp2%=e_list%!(offset%+12):sel_fn$=$temp2%
*|ifdef PROCshell_TraceInit
shell_Tracef0("FindMenuWarnEvent:submenu found")
*|endif
offset%+=16
offset%=list_size%
found%
offset%>=list_size%
warn_fn$="":sel_fn$=""
*|ifdef PROCshell_TraceInit
submenu%=0
shell_Tracef0("FindMenuWarnEvent:warn fn not found..")
*|endif
&*|Stop PROCshell_FindMenuWarnEvent
%*|Start PROCshell_MenuWarnSubMenu
shell_MenuWarnSubMenu(s_menu%,x%,y%,warn_fn$,sel_fn$)
void%,temp%,f_menu%,ctr%
!_shell_FontMenuSelFN$=sel_fn$
shell_HeapBlockExists(_U%!224)
shell_HeapBlockReturn(_U%!224)
._U%!224=
shell_HeapBlockFetch(
warn_fn$+1)
!temp%=_U%!224:$temp%=warn_fn$
warn_fn$<>""
. void%=
("FN"+warn_fn$+"(_U%!52,_U%!56)")
*|ifdef PROCshell_TraceInit
shell_Tracef0("MenuWarnSubMenu:Calling FN"+warn_fn$)
*|endif
*|ifdef Using_FontMenu
s_menu%=_U%!252
Submenu is FontMenu menu..
*|ifdef PROCshell_TraceInit
shell_Tracef0("MenuWarnSubMenu:FontMenu opening..")
*|endif
shell_HeapBlockExists(_U%!256)
shell_HeapBlockReturn(_U%!256)
Store current menu selection for testing later..
First work out how many levels are in the selection..
2 ctr%=0:
:ctr%+=4:
!(_Q%+32+ctr%)=-1:ctr%+=4
7 _U%!256=
shell_HeapBlockFetch(ctr%):temp%=_U%!256
ctr%=0
! temp%!ctr%=!(_Q%+32+ctr%)
ctr%+=4
!(_Q%+32+ctr%)=-1
temp%!ctr%=!(_Q%+32+ctr%)
temp%=_U%!256
*|ifdef PROCshell_TraceInit
shell_Tracef0("MenuWarnSubMenu:Selecting '"+
shell_FontMenuGetLastSelectedFont+"' in FontMenu..")
*|endif
"FontMenu_Select",
shell_FontMenuGetLastSelectedFont,_U%!260
,f_menu%
+ _U%!264=1:
Set 'FontMenuOpen' flag..
f_menu%<>_U%!252
$
FontMenu ptr has changed..
)
shell_FontMenuUpdatePtr(f_menu%)
' _U%!252=f_menu%:s_menu%=f_menu%
- _U%!264=0:
Clear 'FontMenuOpen' flag..
*|endif
"Wimp_CreateSubMenu",,s_menu%,x%,y%
$*|Stop PROCshell_MenuWarnSubMenu
#*|Start PROCshell_AttachSubMenu
shell_AttachSubMenu(item%,submenu%,warn_fn$)
"MenuUtil_SubMenu",item%,submenu%
warn_fn$<>""
"MenuUtil_Warning",,
shell_EventListMenuWarn(item%,submenu%,warn_fn$,"")
"*|Stop PROCshell_AttachSubMenu
'*|Start PROCshell_EventListMenuWarn
shell_EventListMenuWarn(item%,submenu_ptr%,warn_fn$,sel_fn$)
temp%,temp2%,ctr%,e_list%
_U%!220=0
Create event list..
' _U%!220=
shell_HeapBlockFetch(32)
temp%=_U%!220
temp%!0=item%
0 temp%!4=
shell_HeapBlockFetch(
warn_fn$+1)
$(temp%!4)=warn_fn$
temp%!8=submenu_ptr%
0 temp%!12=
shell_HeapBlockFetch(
sel_fn$+1)
$(temp%!12)=sel_fn$
5 temp%!16=-1:temp%!20=-1:temp%!24=-1:temp%!28=-1
Extend existing event list..
0 e_list%=
shell_HeapBlockExtend(_U%!220,32)
_U%!220=e_list%:ctr%=0
ctr%+=16
e_list%!ctr%=-1
temp%=_U%!220
temp%!ctr%=item%
7 temp%!(ctr%+4)=
shell_HeapBlockFetch(
warn_fn$+1)
. temp2%=temp%!(ctr%+4):$(temp2%)=warn_fn$
! temp%!(ctr%+8)=submenu_ptr%
7 temp%!(ctr%+12)=
shell_HeapBlockFetch(
sel_fn$+1)
. temp2%=temp%!(ctr%+12):$(temp2%)=sel_fn$
> temp%!(ctr%+16)=-1:temp%!(ctr%+20)=-1:temp%!(ctr%+24)=-1
temp%!(ctr%+28)=-1
&*|Stop PROCshell_EventListMenuWarn
%*|Start PROCshell_InteractiveHelp
shell_InteractiveHelp(_Q%)
tag$,mess$,validation$,pos1%,pos2%,help$,i_blk%
&i_blk% =
shell_HeapBlockFetch(12)
"Wimp_WhichIcon",_Q%!32,i_blk%,&003F0000,12 << 16
!i_blk% <> -1
PROCshell_Tracef0("LL:"+STR$(!i_blk%))
PROCshell_Tracef0("LL:"+"FN" + FNshell_IconGetData(_Q%!32,!i_blk%))
/ tag$ =
shell_IconGetData(_Q%!32,!i_blk%)
shell_HeapBlockReturn(i_blk%)
tag$ = ""
tag$=
shell_GetEventHandler(_Q%!32,_Q%!36,8)
check validation string - this overrides attached help tags!
7validation$=
shell_IconGetValidation(_Q%!32,_Q%!36)
validation$<>""
shell_StringUpperCase(
validation$,1))="I"
pos1%=
validation$,";")
i is first modifier
pos1%=0
tag$=
validation$,2)
$
%& tag$=
validation$,2,pos1%-2)
&
(P pos1%=
shell_StringUpperCase(validation$),
shell_StringUpperCase(";i"))
)W pos2%=
shell_StringUpperCase(validation$),
shell_StringUpperCase(";"),pos1%+1)
pos1%>0
pos2%>0
,4 tag$=
validation$,pos1%+2,pos2%-pos1%-2)
.& tag$=
validation$,pos1%+2)
0
tag$<>""
_Q%!16=&503:_Q%!12=_Q%!8
5, mess$=
shell_MessageLookup(tag$,"","")
6' mess$=
shell_MessageExpand(mess$)
$(_Q%+20)=mess$
!_Q%=(
mess$+25)
"Wimp_SendMessage",17,_Q%,_Q%!4
=$*|Stop PROCshell_InteractiveHelp
*|Start PROCack
*|Stop PROCack
D%*|Start PROCshell_Message_PreQuit
shell_Message_PreQuit(_Q%)
temp%,quitsender%,blk%,loop%,flagword%
_U%!300>0
H% blk%=
shell_HeapBlockFetch(256)
copy message block to private area..
loop%=0
_Q%!0
first word is size...
blk%!loop%=_Q%!loop%
loop%
*|ifdef TraceInit
shell_Tracef0("Message_PreQuit:PreQuit message received")
*|endif
temp%=_U%!300
quitsender%=blk%!4
!blk%<24
flagword%=0
flagword%=blk%!20
acknowledge message - this aborts shutdown..
T> blk%!12=blk%!8:
"Wimp_SendMessage",19,blk%,quitsender%
("FN"+$temp%)<>0
ok to quit..
flagword%
X!
quit just this task..
_closedown%=
Z
shutdown desktop..
!blk%=24:blk%!24=&1FC
]2
"Wimp_SendMessage",8,blk%,quitsender%
_closedown%=
_
shell_HeapBlockReturn(blk%)
e$*|Stop PROCshell_Message_PreQuit
*|Start PROClwaorigin
lwaorigin(b,
x%=b!0-b!16:y%=b!12-b!20
*|Stop PROClwaorigin
*|Start FNshell_Iconbar
shell_Iconbar(pos%,sname$,text$,w%,menu%,shift%,ctrl%,alt%)
handle%
text$=""
rQ !_Q%=pos%:_Q%!4=0:_Q%!8=0:_Q%!12=70:_Q%!16=70:_Q%!20=&301A:$(_Q%+24)=sname$
tF !_Q%=pos%:_Q%!4=0:_Q%!8=-16:_Q%!12=w%:_Q%!16=90:_Q%!20=&1700210B
_Q%!24 12
_Q%!28
(sname$)+2
$(_Q%!24)=text$
$(_Q%!28)="S"+sname$
_Q%!32=12
"Wimp_CreateIcon",,_Q%
handle%
shell_AttachMenu(-2,handle%,menu%,shift%,ctrl%,alt%)
=handle%
*|Stop FNshell_Iconbar
$*|Start PROCshell_IconbarSetText
shell_IconbarSetText(h%,in%,s$)
icon_blk%,w_blk%
'icon_blk%=
shell_HeapBlockFetch(40)
)w_blk% =
shell_HeapBlockFetch(36)
w_blk%!20 = 0
shell_OSCheckVersion(3)
h% = -1
!w_blk% = -2
!w_blk% = h%
"Wimp_GetWindowState",,w_blk%
%!icon_blk% = h%:icon_blk%!4 = in%
"Wimp_GetIconState",,icon_blk%
$(icon_blk%!28)=s$
"Wimp_ForceRedraw",-1,icon_blk%!8-100-w_blk%!20,icon_blk%!12,icon_blk%!16+100-w_blk%!20,icon_blk%!20
shell_HeapBlockReturn(icon_blk%)
shell_HeapBlockReturn(w_blk%)
#*|Stop PROCshell_IconbarSetText
'*|Start FNshell_WritableIconHandler
shell_WritableIconHandler(wh%,ih%,key%)
nr_icons%,first_write%,last_write%,ctr%
before%,after%,index%,mx%,my%,temp_blk%,caret_blk%
caret_blk% should be just large enough for the number of icons
actually in the window (limit is 254 icons)...
*caret_blk%=
shell_HeapBlockFetch(1024)
"Wimp_GetCaretPosition",,caret_blk%
caret_blk%!0=-1
shell_HeapBlockReturn(caret_blk%)
no caret so abort
must be icons in the window as the caret is present
"Wimp_WhichIcon",wh%,caret_blk%,&0040E000,&0000E000
ctr% = 0
REPEAT
PROCshell_Tracef0("DEBUG::"+STR$(caret_blk%!ctr%))
ctr% += 4
UNTIL caret_blk%!ctr% = -1
$first_write%=caret_blk%!0:ctr%=0
caret_blk%!ctr%=ih%
> before%=caret_blk%!(ctr%-4):after%=caret_blk%!(ctr%+4)
ctr%+=4
caret_blk%!ctr%=-1
#last_write%=caret_blk%!(ctr%-4)
key%
&0D :
return
#
IF ih%=last_write% THEN
%
fake a keypress on icon 0
%
SYS "Wimp_ProcessKey",&0D
(
shell_FakeMouseClick(wh%,0,4)
ELSE
`
SYS "Wimp_SetCaretPosition",wh%,after%,-1,-1,-1,LEN(FNshell_IconGetData(wh%,after%))
ENDIF
&18E,394 :
cursor down,TAB
ih%=last_write%
f
"Wimp_SetCaretPosition",wh%,first_write%,-1,-1,-1,
shell_IconGetData(wh%,first_write%))
Z
"Wimp_SetCaretPosition",wh%,after%,-1,-1,-1,
shell_IconGetData(wh%,after%))
&18F,410 :
cursor up,SHIFT TAB
ih%=first_write%
d
"Wimp_SetCaretPosition",wh%,last_write%,-1,-1,-1,
shell_IconGetData(wh%,last_write%))
\
"Wimp_SetCaretPosition",wh%,before%,-1,-1,-1,
shell_IconGetData(wh%,before%))
shell_HeapBlockReturn(caret_blk%)
&*|Stop FNshell_WritableIconHandler
$*|Start PROCshell_FakeMouseClick
shell_FakeMouseClick(wh%,ih%,button%)
"OS_Byte",15,1:
flush input buffer
'_Q%!8=button%:_Q%!12=wh%:_Q%!16=ih%
shell_Action(6)
#*|Stop PROCshell_FakeMouseClick
*|Start FNshell_IconCreate
shell_IconCreate(wh%,minx%,miny%,w%,h%,fg%,bg%,flg%,data$,addr%,len%,validation$)
i%,handle%,valid%,icon_blk%
'icon_blk%=
shell_HeapBlockFetch(40)
icon_blk%!0=wh%
'icon_blk%!4=minx%:icon_blk%!8=miny%
/icon_blk%!12=minx%+w%:icon_blk%!16=miny%+h%
)icon_blk%!20=flg%
bg%<<28
fg%<<24
icon_blk%!20
&100
i%=
data$,",")
icon_blk%!24=addr%
validation$<>""
4 valid%=
shell_HeapBlockFetch(
validation$+1)
$valid%=validation$
icon_blk%!28=valid%
icon_blk%!28=-1
icon_blk%!32=len%
$(icon_blk%+24)=
data$,11)
"Wimp_CreateIcon",,icon_blk%
handle%
shell_HeapBlockReturn(icon_blk%)
=handle%
*|Stop FNshell_IconCreate
*|Start PROCshell_IconDelete
shell_IconDelete(wh%,ih%)
shell_DoIconDelete(wh%,ih%,
*|Stop PROCshell_IconDelete
!*|Start PROCshell_IconDelete2
shell_IconDelete2(wh%,ih%)
shell_DoIconDelete(wh%,ih%,
*|Stop PROCshell_IconDelete2
"*|Start PROCshell_DoIconDelete
shell_DoIconDelete(wh%,ih%,redraw%)
blk%,x0%,y0%,x1%,y1%
"blk%=
shell_HeapBlockFetch(40)
blk%!0=wh%:blk%!4=ih%
"Wimp_GetIconState",,blk%
"Interface_BoundingBox",,blk%+8
2x0%=blk%!8:y0%=blk%!12:x1%=blk%!16:y1%=blk%!20
"Wimp_GetIconState",,blk%
shell_HeapBlockExists(blk%!28)
shell_HeapBlockReturn(blk%!28)
shell_HeapBlockExists(blk%!32)
shell_HeapBlockReturn(blk%!32)
"Wimp_DeleteIcon",,blk%
redraw%
"Wimp_ForceRedraw",wh%,x0%,y0%,x1%,y1%
shell_HeapBlockReturn(blk%)
!*|Stop PROCshell_DoIconDelete
!*|Start PROCshell_IconPutData
shell_IconPutData(whandle%,ihandle%,data$,redraw)
blk%,old_str$
4old_str$ =
shell_IconGetData(whandle%,ihandle%)
data$ <> old_str$
$ blk%=
shell_HeapBlockFetch(40)
blk%!0 = whandle%
blk%!4 = ihandle%
"Wimp_GetIconState",,blk%
(blk%!24
(1<<8)) <> 0
D
data$ > blk%!36
shell_MessageNoArgs("SHELLMSG12")
$(blk%!28) = data$
! $(blk% + 28) =
data$,11)
redraw <> 0
blk%!8 = 0:blk%!12 = 0
!$
"Wimp_SetIconState",,blk%
shell_HeapBlockReturn(blk%)
' *|Stop PROCshell_IconPutData
)$*|Start PROCshell_IconPutDataNow
shell_IconPutDataNow(whandle%,ihandle%,data$)
blk%
,#blk%=
shell_HeapBlockFetch(50)
blk%!0=whandle%
blk%!4=ihandle%
"Wimp_GetIconState",,blk%
(blk%!24
(1<<8))<>0
data$>blk%!36
shell_MessageNoArgs("SHELLMSG12")
$(blk%!28)=data$
$(blk%+28)=
data$,11)
blk%!8=0:blk%!12=0
"Wimp_SetIconState",,blk%
Call wimp poll immediately in case the user program doesn't..
shell_EnsurePoll
shell_HeapBlockReturn(blk%)
<#*|Stop PROCshell_IconPutDataNow
>!*|Start FNshell_IconNewSprite
shell_IconNewSprite(whandle%,ihandle%,newname$,redraw)
icon_blk%
A'icon_blk%=
shell_HeapBlockFetch(40)
B-icon_blk%!0=whandle%:icon_blk%!4=ihandle%
"Wimp_GetIconState",,icon_blk%
"Wimp_DeleteIcon",,icon_blk%
ENicon_blk%!4=icon_blk%!8:icon_blk%!8=icon_blk%!12:icon_blk%!12=icon_blk%!16
FPicon_blk%!16=icon_blk%!20:icon_blk%!20=icon_blk%!24:$(icon_blk%+24)=newname$
"Wimp_CreateIcon",,icon_blk%
ihandle%
redraw
"Wimp_ForceRedraw",icon_blk%!0,icon_blk%!4,icon_blk%!8,icon_blk%!12,icon_blk%!16
shell_HeapBlockReturn(icon_blk%)
=ihandle%
L *|Stop FNshell_IconNewSprite
*|Start FNshell_IconGetData
shell_IconGetData(whandle%,ihandle%)
result$,icon_blk%
Q'icon_blk%=
shell_HeapBlockFetch(40)
icon_blk%!0=whandle%
icon_blk%!4=ihandle%
"Wimp_GetIconState",,icon_blk%
(icon_blk%!24
(1<<8))<>0
result$=$(icon_blk%!28)
result$=$(icon_blk%+28)
shell_HeapBlockReturn(icon_blk%)
=result$
*|Stop FNshell_IconGetData
*|Start FNshell_IconMove2
shell_IconMove2(wh%,ih%,d_x%,d_y%)
m_blk%
^$m_blk%=
shell_HeapBlockFetch(40)
!m_blk%=wh%:m_blk%!4=ih%
"Wimp_GetIconState",,m_blk%
a"m_blk%!8+=d_x%:m_blk%!16+=d_x%
b#m_blk%!12+=d_y%:m_blk%!20+=d_y%
cGih%=
shell_IconMove(wh%,ih%,m_blk%!8,m_blk%!12,m_blk%!16,m_blk%!20)
shell_HeapBlockReturn(m_blk%)
*|Stop FNshell_IconMove2
*|Start FNshell_IconResize
shell_IconResize(wh%,ih%,x0%,y0%,x1%,y1%)
shell_IconMove(wh%,ih%,x0%,y0%,x1%,y1%)
*|Stop FNshell_IconResize
*|Start FNshell_IconMove
shell_IconMove(wh%,ih%,x0%,y0%,x1%,y1%)
i_blk%,i_flags%,i_data%,bdr%,blk%
oldflags%,odt0%,odt1%,odt2%
q$i_blk%=
shell_HeapBlockFetch(40)
r"blk%=
shell_HeapBlockFetch(40)
s;!i_blk%=wh%:i_blk%!4=ih%:
"Wimp_GetIconState",,i_blk%
!blk%=wh%:blk%!4=ih%
"Wimp_GetIconState",,blk%
"Interface_BoundingBox",,blk%+8
w&iflags%=i_blk%!24:idata%=i_blk%+28
xBoldflags%=iflags%:odt0%=idata%!0:odt1%=idata%!4:odt2%=idata%!8
bdr%=i_blk%!8-blk%!8
"Wimp_DeleteIcon",,i_blk%
"Wimp_ForceRedraw",!i_blk%,i_blk%!8-bdr%,i_blk%!12-bdr%,i_blk%!16+bdr%,i_blk%!20+bdr%
|Pih%=
shell_CreateIcon2(wh%,x0%,y0%,x1%,y1%,oldflags%,odt0%,odt1%,odt2%,bdr%)
shell_HeapBlockReturn(i_blk%)
shell_HeapBlockReturn(blk%)
*|Stop FNshell_IconMove
*|Start FNshell_CreateIcon2
shell_CreateIcon2(handle%,x0%,y0%,x1%,y1%,flags%,dt0%,dt1%,dt2%,bdr%)
ic%,q%,text$,sprite$,minx%,miny%
shell_HeapBlockFetch(60)
!q%=handle%
1q%!20=flags%:q%!24=dt0%:q%!28=dt1%:q%!32=dt2%
text$="":sprite$=""
flags%
flags%
&100 text$=$(q%!24)
text$=$(q%+24)
flags%
flags%
&100
. sprite$=
shell_IconGetCommand(q%!28,"S")
sprite$=$(q%+24)
shell_GetMinXY(flags%,text$,sprite$)
x1%-x0%<minx%
x1%=x0%+minx%
y1%-y0%<miny%
y1%=y0%+miny%
)q%!4=x0%:q%!8=y0%:q%!12=x1%:q%!16=y1%
"Wimp_CreateIcon",,q%
"Wimp_ForceRedraw",!q%,q%!4-bdr%,q%!8-bdr%,q%!12+bdr%,q%!16+bdr%
"Wimp_GetCaretPosition",,q%
!q%=handle%:
q%!4=ic%:
"Wimp_SetCaretPosition",handle%,ic%,0,0,-1,0
shell_HeapBlockReturn(q%)
*|Stop FNshell_CreateIcon2
*|Start PROCshell_GetMinXY
shell_GetMinXY(flags%,text$,sprite$)
x0%,y0%,x1%,y1%,mx%,my%
minx%=0:miny%=0
flags%
text$<>""
flags%
5
"Font_ReadInfo",flags%>>24
,,y0%,,y1%
D
"Font_StringBBox",,
(flags%>>24)+text$
,x0%,,x1%
,
"Font_ConverttoOS",,x0%
,x0%
,
"Font_ConverttoOS",,x1%
,x1%
& minx%=x1%-x0%:miny%=y1%-y0%
minx%=6*dx%+16*
text$:miny%=32
flags%
&04 miny%+=2*dy%
flags%
sprite$<>""
"XOS_SpriteOp",&128,
shell_UserSpritesBase,sprite$
,,,mx%,my%,,spm% ; P%
1)=0
A
"XOS_ReadModeVariable",spm%,4
,,spx%:mx%=mx%<<spx%
A
"XOS_ReadModeVariable",spm%,5
,,spy%:my%=my%<<spy%
+
flags%
&800 mx%=mx%/2:my%=my%/2
B
(flags%
&21B)=&13 mx%=minx%+mx% :
sprite+text (V~H~R)
mx%>minx% minx%=mx%
my%>miny% miny%=my%
*|Stop PROCshell_GetMinXY
"*|Start FNshell_IconGetCommand
shell_IconGetCommand(v%,c$)
I%,result$
v%<=0
result$=""
I I%=
shell_StringUpperCase($v%),";"+
shell_StringUpperCase(c$))
I%=0
result$=""
/ result$=
$(v%+I%),
$(v%+I%)+";",";")-1)
=result$
!*|Stop FNshell_IconGetCommand
*|Start PROCshell_IconRedraw
shell_IconRedraw(wh%,ih%)
blk%
"blk%=
shell_HeapBlockFetch(40)
!blk%=wh%:blk%!4=ih%
"Wimp_GetIconState",,blk%
"Interface_BoundingBox",,blk%+8
"Wimp_ForceRedraw",wh%,blk%!8,blk%!12,blk%!16,blk%!20
shell_Action(
shell_Poll_I(0,_U%!148))
shell_HeapBlockReturn(blk%)
*|Stop PROCshell_IconRedraw
%*|Start FNshell_IconGetValidation
shell_IconGetValidation(wh%,ih%)
blk%,validation$,flags%
ih%=-1
validation$=""
#blk%=
shell_HeapBlockFetch(100)
blk%!0=wh%:blk%!4=ih%
"Wimp_GetIconState",,blk%
check flags first to see if it has a
validation string!
flags%=blk%!24
flags%
&100
blk%!32>0
validation$=$(blk%!32)
shell_HeapBlockReturn(blk%)
=validation$
$*|Stop FNshell_IconGetValidation
'*|Start PROCshell_IconPutValidation
shell_IconPutValidation(wh%,ih%,valid$)
blk%,flags%
#blk%=
shell_HeapBlockFetch(100)
blk%!0=wh%:blk%!4=ih%
"Wimp_GetIconState",,blk%
flags%=blk%!24
flags%
&100
$(blk%!32)=valid$
shell_HeapBlockReturn(blk%)
&*|Stop PROCshell_IconPutValidation
"*|Start FNshell_IsIconSelected
shell_IsIconSelected(WindowHandle%,IconHandle%)
temp%
shell_IconGetState(WindowHandle%,IconHandle%)
flags%=_Q%!24
temp%=(flags%
&200000)
temp%=0
!*|Stop FNshell_IsIconSelected
*|Start PROCshell_IconSelect
shell_IconSelect(WindowHandle%,IconHandle%)
shell_IconSetState(WindowHandle%,IconHandle%,&200000,&200000)
*|Stop PROCshell_IconSelect
"*|Start PROCshell_IconDeselect
shell_IconDeselect(WindowHandle%,IconHandle%)
shell_IconSetState(WindowHandle%,IconHandle%,0,&200000)
!*|Stop PROCshell_IconDeselect
"*|Start PROCshell_IconGetState
shell_IconGetState(WindowHandle%,IconHandle%)
!_Q%=WindowHandle%
_Q%!4=IconHandle%
"Wimp_GetIconState",,_Q%
!*|Stop PROCshell_IconGetState
%*|Start PROCshell_IconSetSelected
shell_IconSetSelected(wh%,ih%,state%)
state%=0
shell_IconDeselect(wh%,ih%)
shell_IconSelect(wh%,ih%)
&$*|Stop PROCshell_IconSetSelected
*|Start PROCshell_IconSet
shell_IconSet(wh%,ih%,state%)
state%=0
shell_IconDeselect(wh%,ih%)
shell_IconSelect(wh%,ih%)
*|Stop PROCshell_IconSet
2"*|Start PROCshell_IconSetState
shell_IconSetState(WindowHandle%,IconHandle%,EorWord%,ClearWord%)
icon_blk%
5'icon_blk%=
shell_HeapBlockFetch(16)
!icon_blk%=WindowHandle%
icon_blk%!04=IconHandle%
icon_blk%!08=EorWord%
icon_blk%!12=ClearWord%
"Wimp_SetIconState",,icon_blk%
shell_HeapBlockReturn(icon_blk%)
>!*|Stop PROCshell_IconSetState
?&*|Start PROCshell_IconUnselectable
shell_IconUnselectable(handle%,icon%)
shell_IconSetState(handle%,icon%,&400000,&40000)
D%*|Stop PROCshell_IconUnselectable
E%*|Start PROCshell_IconSetBGColour
shell_IconSetBGColour(wh%,ih%,col%)
col%<0
col%>15
shell_MessageOneArg("SHELLMSG24","PROCshell_IconSetBGColour")
shell_IconSetState(wh%,ih%,col%<<28,&F0000000)
K$*|Stop PROCshell_IconSetBGColour
L%*|Start PROCshell_IconSetFGColour
shell_IconSetFGColour(wh%,ih%,col%)
col%<0
col%>15
shell_MessageOneArg("SHELLMSG24","PROCshell_IconSetFGColour")
shell_IconSetState(wh%,ih%,col%<<24,&0F000000)
R$*|Stop PROCshell_IconSetFGColour
T&*|Start PROCshell_CaretSetPosition
shell_CaretSetPosition(whandle%,ihandle%,xoff%,yoff%,height%,index%)
"Wimp_SetCaretPosition",whandle%,ihandle%,xoff%,yoff%,height%,index%
Y%*|Stop PROCshell_CaretSetPosition
['*|Start PROCshell_IconSetButtonType
shell_IconSetButtonType(wh%,ih%,button_type%)
button_type%=12
button_type%=13
shell_MessageOneArg("SHELLMSG23","PROCshell_IconSetButtonType")
button_type%<0
button_type%>15
shell_MessageOneArg("SHELLMSG22","PROCshell_IconSetButtonType")
shell_IconSetState(wh%,ih%,button_type%<<12,&F000)
b&*|Stop PROCshell_IconSetButtonType
c *|Start PROCshell_IconSetESG
shell_IconSetESG(wh%,ih%,esg%)
esg%<0
esg%>31
shell_MessageOneArg("SHELLMSG25","PROCshell_IconSetESG")
shell_IconSetState(wh%,ih%,esg%<<16,&1F0000)
*|Stop PROCshell_IconSetESG
k!*|Start PROCshell_IconSetText
shell_IconSetText(wh%,ih%,action%)
action%<>0
action%=1<<0
shell_IconSetState(wh%,ih%,action%,1<<0)
q *|Stop PROCshell_IconSetText
s#*|Start PROCshell_IconSetSprite
shell_IconSetSprite(wh%,ih%,action%)
action%<>0
action%=1<<1
shell_IconSetState(wh%,ih%,action%,1<<1)
y"*|Stop PROCshell_IconSetSprite
z#*|Start PROCshell_IconSetBorder
shell_IconSetBorder(wh%,ih%,action%)
action%<>0
action%=1<<2
shell_IconSetState(wh%,ih%,action%,1<<2)
"*|Stop PROCshell_IconSetBorder
%*|Start PROCshell_IconSetHCentred
shell_IconSetHCentred(wh%,ih%,action%)
shell_IconSetState(wh%,ih%,0,1<<9):
unset right justified bit...
action%<>0
action%=1<<3
shell_IconSetState(wh%,ih%,action%,1<<3)
$*|Stop PROCshell_IconSetHCentred
%*|Start PROCshell_IconSetVCentred
shell_IconSetVCentred(wh%,ih%,action%)
action%<>0
action%=1<<4
shell_IconSetState(wh%,ih%,action%,1<<4)
$*|Stop PROCshell_IconSetVCentred
#*|Start PROCshell_IconSetFilled
shell_IconSetFilled(wh%,ih%,action%)
action%<>0
action%=1<<5
shell_IconSetState(wh%,ih%,action%,1<<5)
"*|Stop PROCshell_IconSetFilled
&*|Start PROCshell_IconSetRightJust
shell_IconSetRightJust(wh%,ih%,action%)
shell_IconSetHCentred(wh%,ih%,0)
action%<>0
action%=1<<9
shell_IconSetState(wh%,ih%,action%,1<<9)
%*|Stop PROCshell_IconSetRightJust
%*|Start PROCshell_IconSetLeftJust
shell_IconSetLeftJust(wh%,ih%)
shell_IconSetHCentred(wh%,ih%,0)
shell_IconSetRightJust(wh%,ih%,0)
$*|Stop PROCshell_IconSetLeftJust
)*|Start PROCshell_IconSetUnselectable
shell_IconSetUnselectable(wh%,ih%,state%)
caret_blk%
state%<>0
state%=1<<22
shell_IconSetState(wh%,ih%,state%,1<<22)
state%<>0
check if icon has the caret, lose it if it has..
* caret_blk%=
shell_HeapBlockFetch(24)
"Wimp_GetCaretPosition",,caret_blk%
!caret_blk%=wh%
caret_blk%!4=ih%
%
"Wimp_SetCaretPosition",-1
shell_HeapBlockReturn(caret_blk%)
(*|Stop PROCshell_IconSetUnselectable
#*|Start PROCshell_CaretSetRight
shell_CaretSetRight(wh%,ih%)
"Wimp_SetCaretPosition",wh%,ih%,-1,-1,-1,
shell_IconGetData(wh%,ih%))
"*|Stop PROCshell_CaretSetRight
*|Start PROCprint_text
print_text(X,Y,text$)
in(X,Y-32,X+16*
(text$),Y)
text$
*|Stop PROCprint_text
*|Start FNin
in(A%,B%,C%,D%)
C%<gbx
A%>gtx
B%>gty
D%<gby
*|Stop FNin
*|Start PROCnewvals
newvals
gbx=_Q%!28:gby=_Q%!32
gtx=_Q%!36:gty=_Q%!40
wbx=_Q%!4:wby=_Q%!8
wtx=_Q%!12:wty=_Q%!16
xsc=_Q%!20:ysc=_Q%!24
!hp=wtx-wbx:vp=wty-wby:ebx=xsc
!etx=xsc+hp:ety=ysc:eby=ysc-vp
*|Stop PROCnewvals
max(a%,b%)
a%<b%
*|Start FNshell_Leaf
shell_Leaf(path$)
path$,".")
! path$=
path$,
path$,".")+1)
=path$
*|Stop FNshell_Leaf
*|Start FNshell_Branch
shell_Branch(fname$)
pos%,br$,temp%
fname$,".")=0
br$=""
temp%=0
pos%=temp%+1
temp%=
fname$,".",pos%)
temp%=0
br$=
fname$,pos%-2)
*|Stop FNshell_Branch
*|Start FNgname
gname(ptr)
f$=""
?ptr<>0
?ptr<>13
f$=f$+
?ptr:ptr+=1
*|Stop FNgname
"*|Start PROCshell_WindowResize
shell_WindowResize(whandle%,bx%,by%,tx%,ty%,open%)
+!_Q%=bx%:_Q%!4=by%:_Q%!8=tx%:_Q%!12=ty%
"Wimp_SetExtent",whandle%,_Q%
open%
_Q%!0=whandle%
"Wimp_GetWindowInfo",,_Q%
"Wimp_OpenWindow",,_Q%
!*|Stop PROCshell_WindowResize
#*|Start PROCshell_WindowRetitle
shell_WindowRetitle(
whandle%,title$)
temp%,win_blk%,handle%,t_buffer_len%
,win_blk% =
shell_HeapBlockFetch(6000)
win_blk%!0 = whandle%
"Wimp_GetWindowInfo",,win_blk%
((win_blk%!60)
&100) = 0
window title is not indirected..
temp% = win_blk% + 76
$temp% =
title$,11)
"Wimp_DeleteWindow",,win_blk%
"Wimp_CreateWindow",,win_blk% + 4
handle%
handle% <> whandle%
"9
Window handle has changed, update event data...
#3
shell_UpdateWindowHandle(whandle%,handle%)
whandle% = handle%
Window title is indirected, find buffer size..
(! t_buffer_len% = win_blk%!84
Truncate title if it won't fit the buffer...
*6 $(!(win_blk% + 76)) =
title$,t_buffer_len% - 1)
((win_blk%!32)
(1 << 16)) <> 0
,9
Window is open, so redraw the title bar area...
-T
"Wimp_ForceRedraw",-1,win_blk%!4,win_blk%!16,win_blk%!12,win_blk%!16 + 44
shell_HeapBlockReturn(win_blk%)
3"*|Stop PROCshell_WindowRetitle
5)*|Start FNshell_WindowTitleIndirected
shell_WindowTitleIndirected(flag%)
(flag%
(1<<8))=(1<<8)
:(*|Stop FNshell_WindowTitleIndirected
;**|Start PROCshell_ScreenToWindowCoords
shell_ScreenToWindowCoords(WHandle%,
Temp%,WXMin%,WYMin%,XScroll%,YScroll%,Scratch%
>'Scratch%=
shell_HeapBlockFetch(600)
Temp%=Scratch%
!Temp%=WHandle%
"Wimp_GetWindowInfo",,Temp%
WXMin%=Scratch%!4
WYMax%=Scratch%!16
XScroll%=Scratch%!20
YScroll%=Scratch%!24
X%=X%+(XScroll%-WXMin%)
Y%=Y%+(YScroll%-WYMax%)
shell_HeapBlockReturn(Scratch%)
K)*|Stop PROCshell_ScreenToWindowCoords
L#*|Start FNshell_WimpSlotReadEnd
shell_WimpSlotReadEnd
mem%
"Wimp_SlotSize",-1,-1
mem%
P =mem%
R"*|Stop FNshell_WimpSlotReadEnd
S'*|Start FNshell_WimpSlotClaimMemory
shell_WimpSlotClaimMemory(mem%,size%)
ssize%
"Wimp_SlotSize",mem%+size%,-1
ssize%
ssize%<mem%+size%
= ssize%
Z&*|Stop FNshell_WimpSlotClaimMemory
[+*|Start PROCshell_WimpSlotReleaseMemory
shell_WimpSlotReleaseMemory
"Wimp_SlotSize",mem%,-1
`**|Stop PROCshell_WimpSlotReleaseMemory
a *|Start PROCshell_MouseLimit
shell_MouseLimit(b,whandle%)
c,b!0=whandle%:
"Wimp_GetWindowState",,b
mouse_rectangle(b!4,b!8,b!12-b!4,b!16-b!8)
*|Stop PROCshell_MouseLimit
h%*|Start FNshell_NameOfFirstSprite
shell_NameOfFirstSprite(File$)
X%,N%,S$
(File$)
#X%=4
#X%*&100
#X%*&10000
#X%*&1000000
#X%=N%
r S$=""
N%=0
y$*|Stop FNshell_NameOfFirstSprite
{$*|Start PROCInitialiseSpriteArea
InitialiseSpriteArea(S%,Length%)
!S%=Length%
S%!8=16
"OS_SpriteOp",9+256,S%
#*|Stop PROCInitialiseSpriteArea
*|Start PROCshell_ListEvents
shell_ListEvents(wh%,ic%)
menu%,menu$
wh%=-1
wh%=-2
shell_Tracef0("MenuSelection="+
shell_GetEventHandler(wh%,ic%,0))
shell_Tracef0("MenuMaker ="+
shell_GetEventHandler(wh%,ic%,1))
shell_Tracef0("ClickSelect ="+
shell_GetEventHandler(wh%,ic%,2))
shell_Tracef0("ClickAdjust ="+
shell_GetEventHandler(wh%,ic%,3))
shell_Tracef0("Redraw ="+
shell_GetEventHandler(wh%,ic%,4))
shell_Tracef0("Keypress ="+
shell_GetEventHandler(wh%,ic%,5))
shell_Tracef0("Drag ="+
shell_GetEventHandler(wh%,ic%,6))
shell_Tracef0("Menu Warning ="+
shell_GetEventHandler(wh%,ic%,7))
shell_Tracef0("HelpTag ="+
shell_GetEventHandler(wh%,ic%,8))
(menu%=
shell_GetEventMenu(2,wh%,ic%)
menu%=0
menu$="None"
menu$=
menu%
shell_Tracef0("Menu handle =&"+menu$)
*|Stop PROCshell_ListEvents
----------- Heap Manager Routines ------------------------------------
Function to load heap manager machine code
%*|Start PROCshell_HeapManagerInit
shell_HeapManagerInit(path$,space%)
heap_code% 900
("LOAD "+path$+"heapcode "+
~heap_code%)
heap_code%+0,space%
$*|Stop PROCshell_HeapManagerInit
#*|Start FNshell_HeapBlockExists
shell_HeapBlockExists(addr%)
void%
addr%<&8000
99,"No heapblock defined at this address"
%void%=
shell_HeapBlockInfo(addr%)
"*|Stop FNshell_HeapBlockExists
#*|Start FNshell_HeapBlockExtend
7*|!Function to extend already allocated heap block.
$*|!a% = current address of block
J*|!b% = amount to increase or decrease block size by (-ve to decrease)
4*|!returns address of block (block may be moved)
shell_HeapBlockExtend(a%,b%)
heap_code%+12,a%,b%
"*|Stop FNshell_HeapBlockExtend
"*|Start FNshell_HeapBlockFetch
/*|!Function to allocate a block on the heap
,*|!a% = size of block to fetch from heap
)*|!returns address of allocated block
shell_HeapBlockFetch(a%)
addr%
heap_code%+4,addr%,a%
=addr%
!*|Stop FNshell_HeapBlockFetch
%*|Start PROCshell_HeapBlockReturn
3*|!Procedure to return a heap block to the heap
**|!a% = address of block to deallocate
shell_HeapBlockReturn(
shell_HeapBlockExists(a%)
heap_code%+8,a%
$*|Stop PROCshell_HeapBlockReturn
!*|Start FNshell_HeapBlockInfo
8*|!Function to return current length of a heap block
*|!a% = addr of heap block
shell_HeapBlockInfo(a%)
"OS_Heap",6,!(heap_code%+28),a%
,,,r3
*|Stop FNshell_HeapBlockInfo
*|Start FNshell_OSVarExists
shell_OSVarExists(buffer%,varname$)
nr_bytes
"XOS_ReadVarVal",varname$,buffer%,-1,0,0
,,nr_bytes
nr_bytes<0
*|Stop FNshell_OSVarExists
*|Start FNshell_OSVarGetVal
shell_OSVarGetVal(buffer%,size%,varname$,expand)
value$,nr_bytes,nameptr%
"XOS_ReadVarVal",varname$,buffer%,size%,0,-3*(expand=
,,nr_bytes,nameptr%,type%
loop%=0
nr_bytes-1
$ value$=value$+
(buffer%?loop%)
loop%
=value$
*|Stop FNshell_OSVarGetVal
$*|Start FNshell_OSReadCommandArg
shell_OSReadCommandArg(opt)
pointer%,command$,offset%
command$="":offset%=0
"OS_GetEnv"
pointer%
pointer%?offset%<>0
# command$+=
(pointer%?offset%)
offset%+=1
opt
, command$=
command$,
command$,
34)+1)
, command$=
command$,
command$,
34)+2)
=command$
#*|Stop FNshell_OSReadCommandArg
'*|Start FNshell_StringStripTrailing
shell_StringStripTrailing(string$,char$)
string$,1) = char$
( string$ =
string$,
(string$) - 1)
= string$
&*|Stop FNshell_StringStripTrailing
&*|Start FNshell_StringStripLeading
shell_StringStripLeading(string$,char$)
string$,1) = char$
string$ =
string$,2)
= string$
%*|Stop FNshell_StringStripLeading
"*|Start FNshell_StringStripAll
shell_StringStripAll(string$,char$)
done,pos
done=
pos=
string$,char$)
pos
done=
/ string$=
string$,pos-1)+
string$,pos+1)
done=
done
=string$
!!*|Stop FNshell_StringStripAll
#%*|Start FNshell_StringPadTrailing
shell_StringPadTrailing(string$,char$,length%)
(string$) < length%
&6 string$ = string$ +
length% -
(string$),char$)
= string$
*$*|Stop FNshell_StringPadTrailing
,$*|Start FNshell_StringPadLeading
shell_StringPadLeading(string$,char$,length%)
(string$) < length%
/6 string$ =
length% -
(string$),char$) + string$
= string$
3#*|Stop FNshell_StringPadLeading
5#*|Start FNshell_StringUpperCase
shell_StringUpperCase(string$)
loop%
(string$) > 0
loop% = 1
(string$)
::
string$,loop%,1)>="a"
string$,loop%,1)<="z"
;:
string$,loop%,1) =
string$,loop%,1))
&DF)
loop%
= string$
A"*|Stop FNshell_StringUpperCase
C"*|Start FNshell_StringExchange
shell_StringExchange(string$,target$,sub$)
index%
string$,target$)
index%=
string$,target$)
H? string$=
string$,index%-1)+sub$+
string$,index%+
target$)
=string$
L!*|Stop FNshell_StringExchange
M)*|Start FNshell_StringArrayGetLongest
shell_StringArrayGetLongest(array$(),nr%)
loop%,longest%
longest% = 0
loop% = 0
(array$(loop%)) > longest%
S# longest% =
(array$(loop%))
loop%
= longest%
X(*|Stop FNshell_StringArrayGetLongest
*|Start FNmem_to_string
mem_to_string(block%,offset%,term%)
string$
block%?offset%<>term%
] string$+=
(block%?offset%)
offset%+=1
=string$
*|Stop FNmem_to_string
*|Start FNshell_FileLength
shell_FileLength(object$)
type%,load_addr%,exec_addr%,length%,atts%,string$
"OS_File",5,object$
type%,,load_addr%,exec_addr%,length%,atts%
=length%
*|Stop FNshell_FileLength
*|Start PROCshell_TraceOn
shell_TraceOn
_U%!48=
shell_BroadcastMessage(&43B00,"ShellDBug:TraceOn")
*|Stop PROCshell_TraceOn
*|Start PROCshell_TraceOff
shell_TraceOff
_U%!48=
shell_BroadcastMessage(&43B00,"ShellDBug:TraceOff")
*|Stop PROCshell_TraceOff
*|Start PROCshell_TraceInit
*|Define TraceInit
shell_TraceInit(file$)
f%,blk%,shell_AppName$,shell_AppDir$
file$<>""
f%=
(file$)
_U%!44=f%
#blk%=
shell_HeapBlockFetch(256)
;shell_AppDir$=
shell_OSVarGetVal(blk%,256,"Obey$Dir",1)
1shell_AppName$=
shell_Leaf(shell_AppDir$),2)
shell_BroadcastMessage(&43B00,"ShellDBug:Init Debug messages from "+shell_AppName$)
shell_HeapBlockReturn(blk%)
set bit 4 of shell flag word. If ShellDBug start up is detected then
send init message again (ShellDBug was started after this task). Clear
bit when ShellDBug sends its ack message.
_U%!100
1<<4
_U%!100=(_U%!100
1<<4)
*|Stop PROCshell_TraceInit
*|Start FNshell_TraceIsOn
shell_TraceIsOn
=_U%!48
*|Stop FNshell_TraceIsOn
*|Start PROCshell_Tracef0
shell_Tracef0(a$)
shell_TraceIsOn)
_U%!44<>-1
f%=_U%!44
#f%,a$
check if task id has been set up...
_U%!148>0
shell_BroadcastMessage(&43B00,"ShellDBug:Trace "+a$)
PROCshell_EnsurePoll
*|Stop PROCshell_Tracef0
*|Start PROCshell_Tracef2
shell_Tracef2(addr%)
("MEDIT "+
~addr%)
*|Stop PROCshell_Tracef2
*|Start PROCshell_TraceExit
shell_TraceExit
_U%!44<>-1
#(_U%!44):_U%!44=-1
_U%!44=-1:_U%!48=FALSE
*|Stop PROCshell_TraceExit
"*|Start PROCshell_AttachHotKey
shell_AttachHotKey(key$,shift%,ctrl%,alt%,window$,wh%,fn1$,fn2$)
e_list%,offset%,temp%,temp2%,key%,f_key%
f_key%=
_U%!60=0
& _U%!60=
shell_HeapBlockFetch(24)
offset%=0:_U%!180=1
offset%=_U%!180*24
. _U%!60=
shell_HeapBlockExtend(_U%!60,24)
_U%!180=(_U%!180)+1
e_list%=_U%!60
key$
"F1" :key%=385
"F2" :key%=386
"F3" :key%=387
"F4" :key%=388
"F5" :key%=389
"F6" :key%=390
"F7" :key%=391
"F8" :key%=392
"F9" :key%=393
"F10":key%=458
"F11":key%=459
key%=(
key$)-64:f_key%=
f_key%
shift%
key%+=16
ctrl%
key%+=32
temp%=e_list%+offset%
temp%!0=key%
temp%?4=shift%:
shift flag
temp%?5=ctrl% :
ctrl flag
temp%?6=alt% :
alt flag
-temp%!8=
shell_HeapBlockFetch(
window$+1)
"temp2%=temp%!8:$temp2%=window$
wh%>0
check window handle is in static list...
. offset%=
shell_SearchStatic(_U%!184,wh%)
offset%=-1
shell_MessageNoArgs("SHELLMSG09")
?temp%!12=wh%:
>0 denotes a window handle to open as static
+temp%!16=
shell_HeapBlockFetch(
fn1$+1)
temp2%=temp%!16:$temp2%=fn1$
+temp%!20=
shell_HeapBlockFetch(
fn2$+1)
temp2%=temp%!20:$temp2%=fn2$
!*|Stop PROCshell_AttachHotKey
!*|Start FNshell_HotKeyProcess
shell_HotKeyProcess(key%)
e_list%,list_size%,found%,ptr%,h%,win$,fn1$,fn2$
ctrl%,shift%,alt%,x_off%,y_off%,flag%,key_flags%,offset%
result%,win_blk%
e_list%=_U%!60
list_size%=_U%!180*24
found%=
:ptr%=0
e_list%!ptr%=key%
found%=
ptr%+=24
found%
ptr%>=list_size%
found%
temp%=e_list%+ptr%
win$=$(temp%!8)
*|ifdef TraceInit
shell_Tracef0("HotKeyProcess:Template name is '"+win$+"'")
*|endif
(win$<>""
temp%!12=0)
5
only create a window if it is a dynamic one
2
static windows have already been created
$
shell_CreateWindow(win$,h%)
*|ifdef TraceInit
Y
shell_Tracef0("HotKeyProcess:Creating new dynamic window (handle is &"+
~h%+")")
*|endif
* win_blk%=
shell_HeapBlockFetch(36)
win_blk%!0=h%
*
"Wimp_GetWindowState",,win_blk%
) x_off%=(win_blk%!4-win_blk%!12)/2
) y_off%=(win_blk%!16-win_blk%!8)/2
(
shell_HeapBlockReturn(win_blk%)
fn1$=$(temp%!16)
fn1$<>""
*|ifdef TraceInit
F
shell_Tracef0("HotKeyProcess:Calling Pre-Open FN '"+fn1$+"'")
*|endif
temp%!12>0
. void%=
("FN"+fn1$+"("+
temp%!12+")")
( void%=
("FN"+fn1$+"("+
h%+")")
*|ifdef TraceInit
shell_Tracef0("HotKeyProcess:No Pre-Open FN registered")
*|endif
5 offset%=
shell_SearchStatic(_U%!184,temp%!12)
offset%>-1
+
shell_OpenWindowStatic(temp%!12)
!
temp%!12>0
#@
request to open a static window, but window handle
$C
has not been registered with shell_CreateWindowStatic
%3
shell_MessageNoArgs("SHELLMSG09")
'.
must be a dynamic window then...
(6
shell_OpenWindowDynamic(h%,x_off%,y_off%)
*
fn2$=$(temp%!20)
fn2$<>""
*|ifdef TraceInit
.G
shell_Tracef0("HotKeyProcess:Calling Post-Open FN '"+fn2$+"'")
*|endif
temp%!12>0
1. void%=
("FN"+fn1$+"("+
temp%!12+")")
2
3( void%=
("FN"+fn2$+"("+
h%+")")
4
*|ifdef TraceInit
7B
shell_Tracef0("HotKeyProcess:No Post-Open FN registered")
*|endif
result%=
<' win$="":fn1$="":fn2$="":result%=
=result%
@ *|Stop FNshell_HotKeyProcess
B+*|Start PROCshell_WindowCentreOnPointer
shell_WindowCentreOnPointer(h%)
w_blk%,p_blk%,x_off%,y_off%
E(p_blk% =
shell_HeapBlockFetch(20)
"Wimp_GetPointerInfo",,p_blk%
G(win_blk% =
shell_HeapBlockFetch(36)
win_blk%!0 = h%
"Wimp_GetWindowState",,win_blk%
J,x_off% = (win_blk%!04 - win_blk%!12) / 2
K,y_off% = (win_blk%!16 - win_blk%!08) / 2
shell_WindowMoveTo(h%,p_blk%!0 + x_off%,p_blk%!4 - y_off%)
shell_HeapBlockReturn(win_blk%)
shell_HeapBlockReturn(p_blk%)
Q**|Stop PROCshell_WindowCentreOnPointer
S**|Start PROCshell_WindowCentreOnScreen
shell_WindowCentreOnScreen(h%)
w_blk%,scrn_xmax%,scrn_ymax%,width%,height%,XEigFactor%,YEigFactor%
"XOS_ReadModeVariable",-1,04
,,XEigFactor%
"XOS_ReadModeVariable",-1,05
,,YEigFactor%
"XOS_ReadModeVariable",-1,11
,,scrn_xmax%
"XOS_ReadModeVariable",-1,12
,,scrn_ymax%
ZNscrn_xmax% = scrn_xmax% << XEigFactor%:
Convert pixels to screen coords..
[Nscrn_ymax% = scrn_ymax% << YEigFactor%:
Convert pixels to screen coords..
\*win_blk% =
shell_HeapBlockFetch(36)
win_blk%!0 = h%
"Wimp_GetWindowState",,win_blk%
_)width% = (win_blk%!12 - win_blk%!04)
`)height% = (win_blk%!16 - win_blk%!08)
shell_WindowMoveTo(h%,(scrn_xmax% / 2) - (width% / 2),(scrn_ymax% - height%) / 2)
shell_HeapBlockReturn(win_blk%)
e)*|Stop PROCshell_WindowCentreOnScreen
g-*|Start PROCshell_OpenWindowStaticNewView
shell_OpenWindowStaticNewView(wh%)
shell_OpenWindow(wh%,
l,*|Stop PROCshell_OpenWindowStaticNewView
n&*|Start PROCshell_OpenWindowStatic
shell_OpenWindowStatic(handle%)
shell_SearchStatic(_U%!184,handle%) > -1
shell_OpenWindow(handle%,0,-1)
ERROR 99,FNshell_MessageNoArgs("SHELLMSG09")
w%*|Stop PROCshell_OpenWindowStatic
y *|Start FNshell_SearchStatic
shell_SearchStatic(w_list%,handle%)
search static window list by window handle
found%,ctr%
found% = -1:ctr% = 0
PROCshell_Tracef0("DEBUG::old handle = &"+STR$~handle%)
w_list%<>0
w_list%!ctr% <> -1
Q
PROCshell_Tracef0("DEBUG::searching.. handle is &"+STR$~(w_list%!ctr%))
"
w_list%!ctr% = handle%
found% = ctr%
0
PROCshell_Tracef0("DEBUG::found...")
= found%
ctr% += 4
=found%
*|Stop FNshell_SearchStatic
(*|Start PROCshell_CreateWindowStatic
shell_CreateWindowStatic(ident$,
handle%)
wb_ptr%,w_list%,temp%,offset%
wb_ptr%=
shell_GetWB(ident$)
set 'sprite area' pointer to usersprites area
wb_ptr%!64=_U%!16
"Wimp_CreateWindow",,wb_ptr%
handle%
w_list%=_U%!184
w_list%=0
empty list
*|ifdef TraceInit
shell_Tracef0("CreateWindowStatic:Empty List")
*|endif
& _U%!184=
shell_HeapBlockFetch(8)
w_list%=_U%!184
$ w_list%!0=handle%:w_list%!4=-1
search list for window handle
*|ifdef TraceInit
shell_Tracef0("CreateWindowStatic:Searching for window handle")
*|endif
2 offset%=
shell_SearchStatic(_U%!184,handle%)
offset%=-1
*
add window handle to static list
*|ifdef TraceInit
shell_Tracef0("CreateWindowStatic:Not found - adding window handle to list")
*|endif
. offset%=
shell_SearchStatic(_U%!184,0)
offset%=-1
*|ifdef TraceInit
shell_Tracef0("CreateWindowStatic:Extending window handle list")
*|endif
ctr%=0
w_list%!ctr%<>-1
ctr%+=4
3 _U%!184=
shell_HeapBlockExtend(_U%!184,4)
w_list%=_U%!184
*|ifdef TraceInit
shell_Tracef0("CreateWindowStatic:Found unused space in list")
*|endif
ctr%=offset%
temp%=w_list%+ctr%
" temp%!0=handle%:temp%!4=-1
'*|Stop PROCshell_CreateWindowStatic
$*|Start PROCshell_InitHelpSystem
shell_InitHelpSystem(path$,die%)
tail$,pos%,OSVarBuff%,respath$,help_found%,abort%
<_U%!212=0:
_U%!216<>0
shell_HeapBlockReturn(_U%!216)
/_U%!216=0:
clear pending command buffer...
shell_ScanForHelp:
check if StrongHlp is running...
die%
tail$=" -DieWithTask"
tail$=""
*|ifdef Using_ResFind
_U%!100
1<<3
ResFind initialised, check ResPath..
path$=""
+ OSVarBuff%=
shell_HeapBlockFetch(256)
Q respath$=
shell_OSVarGetVal(OSVarBuff%,256,
shell_GetAppName+"Res$Path",-1)
shell_HeapBlockReturn(OSVarBuff%)
pos%=
respath$,",")
pos%>0
D
shell_FileExists(
respath$,pos%-1)+
shell_GetAppName)
5 path$=
respath$,pos%-1)+
shell_GetAppName
help_found%=
& respath$=
respath$,pos%+1)
;
shell_FileExists(respath$+
shell_GetAppName)
, path$=respath$+
shell_GetAppName
help_found%=
abort%=
K
shell_OK(
shell_MessageOneArg("SHELLMSG26",
shell_GetAppName))
path$<>""
help_found%
abort%
*|endif
abort%=0
shell_StrongHlpMsg("Help_Install "+path$+tail$)
#*|Stop PROCshell_InitHelpSystem
*|Start PROCshell_HelpWord
shell_HelpWord(word$)
read%,temp%,buff%
$buff%=
shell_HeapBlockFetch(512)
_U%!208 = -1
StrongHelp is not loaded. Try to run it..
shell_OSVarExists(buff%,"StrongHelp$Dir")
8
Variable exists, so attempt to run StrongHlp..
/
"XWimp_StartTask","<StrongHelp$Dir>"
6
_U%!216<>0
shell_HeapBlockReturn(_U%!216)
/ _U%!216=
shell_HeapBlockFetch(
word$+1)
temp%=_U%!216
$temp%=word$
A
It doesn't, so complain, but first release buffer as an
*
error is about to be generated..
%
shell_HeapBlockReturn(buff%)
5
shell_OK(
shell_MessageNoArgs("SHELLMSG11"))
shell_StrongHlpMsg("Help_Word "+word$)
shell_HeapBlockReturn(buff%)
*|Stop PROCshell_HelpWord
"*|Start PROCshell_StrongHlpMsg
shell_StrongHlpMsg(msg$)
shell_BroadcastMessage(&43B00,msg$)
!*|Stop PROCshell_StrongHlpMsg
!*|Start PROCshell_ScanForHelp
shell_ScanForHelp
wrk%,owner_taskhandle%
8wrk%=
shell_HeapBlockFetch(256):
block for messages
Finds out if StrongHelp is already running.
Does this by scanning the tasks installed on the iconbar..
This again is done by getting the task's handle, and sending a
sending a TaskNameRq to the taskhandler. When this returns
(as a TaskNameIs message) we compare the string with "StrongHelp".
If not equal, this routine is called again to check next icon..
This Wimp_SendMessage does *not* send a message to the owner of
the icon. It merely returns the taskhandle of the owner.
wrk%!12 = 0
"Wimp_SendMessage",19,wrk%,-2,_U%!212
,,owner_taskhandle%
" _U%!212=_U%!212+1:
icontry%
owner_taskhandle% <> -1
(_U%!212) > 64
owner_taskhandle% <> -1
Send request for name of this task.
wrk%!0 = 24
wrk%!12 = 0
wrk%!16 = &400C6
"! wrk%!20 = owner_taskhandle%
"Wimp_SendMessage",17,wrk%,0
shell_HeapBlockReturn(wrk%)
( *|Stop PROCshell_ScanForHelp
*&*|Start PROCshell_BroadcastMessage
shell_BroadcastMessage(reason_code%,msg$)
m_blk%,m_len%
m_len% = (
msg$ + 30)
.*m_blk% =
shell_HeapBlockFetch(m_len%)
m_blk%!12 = 0
m_blk%!16 = reason_code%
1 $(m_blk% + 20) = msg$ +
m_blk%!0 = m_len%
use XSWI in case error occurs between trace init call and wimp init
call - can't broadcast unless we have launched the wimp task..
"XWimp_SendMessage",17,m_blk%,0:
broadcast message
shell_HeapBlockReturn(m_blk%)
9%*|Stop PROCshell_BroadcastMessage
;**|Start PROCshell_WindowToggleBackIcon
shell_WindowToggleBackIcon(
wh%)
shell_WindowToggleFlags(wh%,1<<24)
@)*|Stop PROCshell_WindowToggleBackIcon
A+*|Start PROCshell_WindowToggleCloseIcon
shell_WindowToggleCloseIcon(
wh%)
shell_WindowToggleFlags(wh%,1<<25)
F**|Stop PROCshell_WindowToggleCloseIcon
G**|Start PROCshell_WindowToggleTitleBar
shell_WindowToggleTitleBar(
wh%)
shell_WindowToggleFlags(wh%,1<<26)
L)*|Stop PROCshell_WindowToggleTitleBar
M,*|Start PROCshell_WindowToggleToggleIcon
shell_WindowToggleToggleIcon(
wh%)
shell_WindowToggleFlags(wh%,1<<27)
R+*|Stop PROCshell_WindowToggleToggleIcon
S,*|Start PROCshell_WindowToggleHScrollBar
shell_WindowToggleHScrollBar(
wh%)
shell_WindowToggleFlags(wh%,1<<30)
X+*|Stop PROCshell_WindowToggleHScrollBar
Y0*|Start PROCshell_WindowToggleAdjustSizeIcon
shell_WindowToggleAdjustSizeIcon(
wh%)
shell_WindowToggleFlags(wh%,1<<29)
^/*|Stop PROCshell_WindowToggleAdjustSizeIcon
_,*|Start PROCshell_WindowToggleVScrollBar
shell_WindowToggleVScrollBar(
wh%)
shell_WindowToggleFlags(wh%,1<<28)
d+*|Stop PROCshell_WindowToggleVScrollBar
f'*|Start PROCshell_WindowToggleFlags
shell_WindowToggleFlags(
wh%,mask%)
blk%,flags%,open%,handle%
*|ifdef TraceInit
shell_Tracef0("WindowToggleFlags:wh%=&"+
~wh%)
*|endif
l"open%=
shell_WindowIsOpen(wh%)
m$blk%=
shell_HeapBlockFetch(6000)
blk%!0=wh%
"Wimp_GetWindowInfo",,blk%
flags%=blk%!32
flags%=(flags%
mask%)
blk%!32=flags%
"Wimp_DeleteWindow",,blk%
"Wimp_CreateWindow",,blk%+4
handle%
!blk%=handle%
open%
If window was open, open it again..
"Wimp_OpenWindow",,blk%
shell_HeapBlockReturn(blk%)
handle%<>wh%
shell_UpdateWindowHandle(wh%,handle%)
wh%=handle%
&*|Stop PROCshell_WindowToggleFlags
%*|Start PROCshell_ListClickSelect
shell_ListClickSelect
e_list%,ptr%,list_size%,temp%,temp2%
e_list%=_U%!12
,list_size%=
shell_HeapBlockInfo(e_list%)
*|ifdef TraceInit
shell_Tracef0(" ")
shell_Tracef0("List of ClickSelect events:")
*|endif
ptr%=0
1 temp%=e_list%!(ptr%+20):temp2%=e_list%+ptr%
shell_HeapBlockExists(temp%)
$temp%<>""
*|ifdef TraceInit
shell_Tracef0("&"+
shell_StringPadTrailing(
~temp2%!0," ",8)+" &"+
shell_StringPadTrailing(
~temp2%!4," ",8)+" "+$temp%)
*|endif
ptr%+=48
(ptr%>=list_size%)
*|ifdef TraceInit
shell_Tracef0(" ")
*|endif
$*|Stop PROCshell_ListClickSelect
%*|Start PROCshell_ListClickAdjust
shell_ListClickAdjust
e_list%,ptr%,list_size%,temp%,temp2%
e_list%=_U%!12
,list_size%=
shell_HeapBlockInfo(e_list%)
*|ifdef TraceInit
shell_Tracef0(" ")
shell_Tracef0("List of ClickAdjust events:")
*|endif
ptr%=0
1 temp%=e_list%!(ptr%+24):temp2%=e_list%+ptr%
shell_HeapBlockExists(temp%)
$temp%<>""
*|ifdef TraceInit
shell_Tracef0("&"+
shell_StringPadTrailing(
~temp2%!0," ",8)+" &"+
shell_StringPadTrailing(
~temp2%!4," ",8)+" "+$temp%)
*|endif
ptr%+=48
(ptr%>=list_size%)
*|ifdef TraceInit
shell_Tracef0(" ")
*|endif
$*|Stop PROCshell_ListClickAdjust
"*|Start PROCshell_ListHelpTags
shell_ListHelpTags
e_list%,ptr%,list_size%,temp%,temp2%
e_list%=_U%!12
,list_size%=
shell_HeapBlockInfo(e_list%)
*|ifdef TraceInit
shell_Tracef0(" ")
shell_Tracef0("List of attached help tags:")
*|endif
ptr%=0
1 temp%=e_list%!(ptr%+44):temp2%=e_list%+ptr%
shell_HeapBlockExists(temp%)
$temp%<>""
*|ifdef TraceInit
shell_Tracef0("&"+
shell_StringPadTrailing(
~temp2%!0," ",8)+" &"+
shell_StringPadTrailing(
~temp2%!4," ",8)+" "+$temp%)
*|endif
ptr%+=48
(ptr%>=list_size%)
*|ifdef TraceInit
shell_Tracef0(" ")
*|endif
!*|Stop PROCshell_ListHelpTags
*|Start PROCshell_MemFill
shell_MemFill(start%,nr_bytes%,value%)
I%,nr_words%,remainder%
nr_words%=nr_bytes%
remainder%=nr_bytes%
nr_words%>0
I%=1
(nr_words%*4)
start%!(I%-1)=value%
remainder%>0
! start%=start%+(nr_words%*4)
I%=0
remainder%-1
start%?I%=value%
*|Stop PROCshell_MemFill
$*|Start PROCshell_AttachFontMenu
*|Define Using_FontMenu
shell_AttachFontMenu(wh%,ih%,sel_fn$,maker_fn$)
menu%
shell_FontMenuInit
"FontMenu_Select",""+
0,_U%!260
,menu%
Store menu ptr in shell memory..
_U%!252=menu%
shell_EventAdd(wh%,ih%,0,-2,sel_fn$)
*|ifdef PROCshell_TraceInit
shell_Tracef0("AttachFontMenu:Attaching font menu")
*|endif
maker_fn$<>""
shell_AttachMenuMaker(wh%,ih%,maker_fn$)
#*|Stop PROCshell_AttachFontMenu
'*|Start PROCshell_AttachFontSubMenu
*|Define Using_FontMenu
shell_AttachFontSubMenu(item%,warn_fn$,sel_fn$)
itemstart%,menu%,temp%,ctr%
shell_FontMenuInit
"FontMenu_Select",""+
0,_U%!260
,menu%
"MenuUtil_SubMenu",item%,menu%
"MenuUtil_Warning",,
Store menu ptr in shell memory..
_U%!252=menu%
shell_EventListMenuWarn(item%,menu%,warn_fn$,sel_fn$)
*|ifdef PROCshell_TraceInit
shell_Tracef0("AttachFontSubMenu:Attaching font menu &"+
~menu%)
*|endif
&*|Stop PROCshell_AttachFontSubMenu
"*|Start PROCshell_FontMenuInit
shell_FontMenuInit
("RMEnsure FontMenu 1.16 RMLoad <EvntShellSystem$Path>FontMenu")
("RMEnsure FontMenu 1.16 Error Couldn't load FontMenu module")
_U%!240=-1
The above flag ensures that the library knows that "FontMenu_Create"
has been called. It should only be called once in a program as it
registers the program as a FontMenu module user..
"FontMenu_Create"
_U%!240
shell_FontMenuSelectFont("",
!*|Stop PROCshell_FontMenuInit
(*|Start PROCshell_FontMenuSelectFont
shell_FontMenuSelectFont(fontname$,systemfont%)
temp%,f_menu%
shell_HeapBlockExists(_U%!244)
shell_HeapBlockReturn(_U%!244)
/_U%!244=
shell_HeapBlockFetch(
fontname$+1)
"temp%=_U%!244:$temp%=fontname$
systemfont%<>0
systemfont%=1
_U%!260=systemfont%
"FontMenu_Select",fontname$,_U%!260
,f_menu%
f_menu%<>_U%!252
FontMenu ptr has changed..
shell_FontMenuUpdatePtr(f_menu%)
_U%!252=f_menu%
*|ifdef TraceInit
shell_Tracef0("FontMenuSelectFont:Font is '"+fontname$+"'")
*|endif
,'*|Stop PROCshell_FontMenuSelectFont
-/*|Start FNshell_FontMenuGetLastSelectedFont
shell_FontMenuGetLastSelectedFont
temp%
shell_HeapBlockExists(_U%!244)
=""
temp%=_U%!244:=$temp%
3.*|Stop FNshell_FontMenuGetLastSelectedFont
5'*|Start PROCshell_FontMenuUpdatePtr
shell_FontMenuUpdatePtr(ptr%)
e_list%,ctr%
*|ifdef TraceInit
shell_Tracef0("FontMenuUpdatePtr:Started..")
*|endif
shell_HeapBlockExists(_U%!220)
*|ifdef TraceInit
shell_Tracef0("FontMenuUpdatePtr:HeapBlock found..")
*|endif
e_list%=_U%!220:ctr%=0
*|ifdef TraceInit
shell_Tracef0("FontMenuUpdatePtr:Substituting ptr..")
*|endif
e_list%!(ctr%+8)=ptr%
ctr%+=12
e_list%!ctr%=-1
J&*|Stop PROCshell_FontMenuUpdatePtr
L&*|Start PROCshell_MenuUpdateHandle
shell_MenuUpdateHandle(old_h%,new_h%)
list_size%,ptr%,event_list%,menu%
O-list_size%=
shell_HeapBlockInfo(_U%!12)-8
ptr%=0
found%=
event_list%=_U%!12
T" menu%=event_list%!(ptr% + 8)
menu% = old_h%
event_list%!(ptr% + 8) = new_h%
ptr%+=48
(ptr% >= list_size%)
_U%!24 = old_h%
_U%!24 = new_h%
Z%*|Stop PROCshell_MenuUpdateHandle
*|Start PROCshell_FindFont
shell_FindFont(
font$,x_pt%,y_pt%,
font_handle%)
shell_FontIsAvailable(font$,x_pt%,y_pt%)
font$="Trinity.Medium"
"Font_FindFont",,font$,x_pt%*16,y_pt%*16,0,0
font_handle%
*|Stop PROCshell_FindFont
f#*|Start FNshell_FontIsAvailable
shell_FontIsAvailable(font$,x_pt%,y_pt%)
"Font_FindFont",0,font$,x_pt%*16,y_pt%*16,0,0
font_handle%
"Font_LoseFont",font_handle%
n"*|Stop FNshell_FontIsAvailable
p"*|Start FNshell_CheckSelection
shell_CheckSelection(sel%)
temp%,ctr%
temp%=_U%!256
temp%=0
_U%!24=_U%!252
sel%!ctr%<>temp%!ctr%
ctr%+=4
temp%!ctr%=-1
z =ctr%
|!*|Stop FNshell_CheckSelection
~&*|Start FNshell_MenuGetItemAddress
shell_MenuGetItemAddress(menu%,selection%)
ctr%,item_addr%
"MenuUtil_Info",menu%
menu%
0 item_addr%=menu%+28+((selection%!ctr%)*24)
/ menu%=item_addr%!4:
address of submenu..
ctr%+=4
selection%!ctr%=-1
=item_addr%
%*|Stop FNshell_MenuGetItemAddress
$*|Start FNshell_GetLastMouseXPos
shell_GetLastMouseXPos
=_U%!272
#*|Stop FNshell_GetLastMouseXPos
$*|Start FNshell_GetLastMouseYPos
shell_GetLastMouseYPos
=_U%!276
#*|Stop FNshell_GetLastMouseYPos
(*|Start PROCshell_UpdateWindowHandle
shell_UpdateWindowHandle(old_handle%,new_handle%)
*|ifdef TraceInit
shell_Tracef0("UpdateWindowHandle:Updating stored window handles")
shell_Tracef0("UpdateWindowHandle:old handle=&"+
~old_handle%)
shell_Tracef0("UpdateWindowHandle:new handle=&"+
~new_handle%)
*|endif
new_handle%<>old_handle%
_U%!28=old_handle%
_U%!28=new_handle%
shell_FixEventBlock(old_handle%,new_handle%,_U%!12,48):
main event block
shell_FixEventBlock(old_handle%,new_handle%,_U%!96,16):
dataload events
shell_FixEventBlock(old_handle%,new_handle%,_U%!72,24):
datasave events
shell_FixEventBlock(old_handle%,new_handle%,_U%!92,24):
pane events
shell_FixEventBlock(old_handle%,new_handle%,_U%!104,16):
bump events
shell_UpdateStaticWindows(old_handle%,new_handle%)
'*|Stop PROCshell_UpdateWindowHandle
)*|Start PROCshell_UpdateStaticWindows
shell_UpdateStaticWindows(old_handle%,new_handle%)
offset%,w_list%
*|ifdef TraceInit
shell_Tracef0("UpdateStaticWindows:Correcting static window list..")
*|endif
w_list%=_U%!184
4offset%=
shell_SearchStatic(_U%!184,old_handle%)
w_list%!offset%=new_handle%
(*|Stop PROCshell_UpdateStaticWindows
#*|Start PROCshell_FixEventBlock
shell_FixEventBlock(old_handle%,new_handle%,event_list%,offset%)
ptr%,list_size%
shell_HeapBlockExists(event_list%)
4 list_size%=
shell_HeapBlockInfo(event_list%)-8
*
(event_list%!ptr%=old_handle%)
& event_list%!ptr%=new_handle%
ptr%+=offset%
(ptr%>=list_size%)
"*|Stop PROCshell_FixEventBlock
#*|Start PROCshell_IconSelectAll
shell_IconSelectAll(wh%)
blk%,I%
$blk%=
shell_HeapBlockFetch(2000)
I%=blk%+&40:!blk%=wh%
blk%!8=1<<21:blk%!12=1<<21
"Wimp_WhichIcon",!blk%,I%,5<<21,0<<21
!I%>-1
blk%!4=!I%
"Wimp_SetIconState",,blk%
I%+=4
shell_HeapBlockReturn(blk%)
"*|Stop PROCshell_IconSelectAll
%*|Start PROCshell_IconDeselectAll
shell_IconDeselectAll(wh%)
blk%,I%
$blk%=
shell_HeapBlockFetch(2000)
0I%=blk%+&40:!blk%=wh%:blk%!8=0:blk%!12=1<<21
"Wimp_WhichIcon",!blk%,I%,5<<21,1<<21
!I%>-1
blk%!4=!I%
"Wimp_SetIconState",,blk%
I%+=4
shell_HeapBlockReturn(blk%)
$*|Stop PROCshell_IconDeselectAll
)*|Start PROCshell_Message_SaveDesktop
shell_Message_SaveDesktop(Q%)
boot$
%boot$="Run "+
shell_GetAppDir+
"OS_GBPB",2,Q%!20,boot$,
boot$
(*|Stop PROCshell_Message_SaveDesktop
"*|Start PROCshell_MessagesInit
shell_MessagesInit(filename$,
m_filedesc%,
m_buffer%)
size%,flags%
3,"Cannot open message file '"+filename$+"'"
"MessageTrans_FileInfo",,filename$
flags%,,size%
flags%
m_buffer%=0
m_buffer%=
shell_HeapBlockFetch(size%)
"OS_Module",6,,,17+
(filename$)
,,m_filedesc%
$(m_filedesc%+16)=filename$
"MessageTrans_OpenFile",m_filedesc%,m_filedesc%+16
*|ifdef TraceInit
shell_Tracef0("MessagesInit:Message resource file '"+filename$+"' loaded")
*|endif
!*|Stop PROCshell_MessagesInit
!*|Start FNshell_PrinterOnLine
shell_PrinterOnLine
inbuf%,online%
inbuf%=
2,1,0,1,0,1,0
online%=
(-4)<inbuf%)
*FX21,3
=online%
*|Stop FNshell_PrinterOnLine
'*|Start PROCshell_AttachBumpHandler
shell_AttachBumpHandler(wh%,ih%,incr%,decr%,l_limit%,u_limit%,step%,wrap%,disp_fn$,decode_fn$)
e_blk%,offset%,temp%,temp2%,bump_info_blk%
format of bump handler event block..
+0 window handle
+4 bump icon handle
+8 step size (-ve for decr icon)
+12 pointer to second info block
format of second block..
+0 display icon handle
+4 lower limit
+8 upper limit
+12 pointer to display function
+16 pointer to display decode function
+20 flags (1 byte)
bit 0 wrap upper
bit 1 wrap lower
deal with incr% icon event first..
$=offset%=
shell_GetEventListOffset(wh%,incr%,_U%+104,16,
%4e_blk%=_U%!104+offset%:
pointer to event list..
'0 e_blk%!0=wh%:e_blk%!4=incr%:e_blk%!8=step%
() e_blk%!12=
shell_HeapBlockFetch(24)
bump_info_blk%=e_blk%!12
bump_info_blk%!0=ih%
bump_info_blk%!4=l_limit%
bump_info_blk%!8=u_limit%
disp_fn$>0
.> bump_info_blk%!12=
shell_HeapBlockFetch((
disp_fn$)+1)
/1 temp2%=bump_info_blk%!12:$temp2%=disp_fn$
bump_info_blk%!12=0
decode_fn$>0
4@ bump_info_blk%!16=
shell_HeapBlockFetch((
decode_fn$)+1)
53 temp2%=bump_info_blk%!16:$temp2%=decode_fn$
bump_info_blk%!16=0
wrap%=-1
bump_info_blk%!20=1
bump_info_blk%!20=0
;? offset%=
shell_GetEventListOffset(wh%,decr%,_U%+104,16,
<6 e_blk%=_U%!104+offset%:
pointer to event list..
>5 e_blk%!0=wh%:e_blk%!4=decr%:e_blk%!8=step%*(-1)
e_blk%!12=bump_info_blk%
C&*|Stop PROCshell_AttachBumpHandler
E%*|Start PROCshell_HandleBumpIcons
shell_HandleBumpIcons(offset%,wh%,ih%,_button%)
display_ih%,info_blk%,e_blk%,curr_val%,_temp$,fn2%
new_val%,fn%
_button% <> 2
e_blk%=_U%!104+offset%
K- _U%!288=wh%:_U%!292=ih%:_U%!296=offset%
e_blk%!8 holds step value
info_blk%=e_blk%!12
info_blk%!0 holds display icon handle
info_blk%!4 holds lower limit
info_blk%!8 holds upper limit
info_blk%!20 holds wrap flag
fn2%=info_blk%!16
fn2%<>0
T2 _temp$=
shell_IconGetData(wh%,info_blk%!0)
U* curr_val%=
("FN"+$fn2%+"(_temp$)")
W8 curr_val%=
shell_IconGetData(wh%,info_blk%!0))
_button%=1
Z/
button is ADJUST, invert step value..
[- _new_val%=curr_val%+((e_blk%!8)*(-1))
]$ _new_val%=curr_val%+e_blk%!8
info_blk%!20=0
no wrap..
a7
_new_val%>info_blk%!8
_new_val%=info_blk%!8
b7
_new_val%<info_blk%!4
_new_val%=info_blk%!4
wrap..
e7
_new_val%>info_blk%!8
_new_val%=info_blk%!4
f7
_new_val%<info_blk%!4
_new_val%=info_blk%!8
fn%=info_blk%!12
fn%<>0
j5 _new_val$=
("FN"+$fn%+"(_new_val%,_button%)")
_new_val$=
_new_val%
_new_val%<>curr_val%
o8
shell_IconPutData(wh%,info_blk%!0,_new_val$,-1)
t$*|Stop PROCshell_HandleBumpIcons
v'*|Start FNshell_WindowSetSpriteArea
shell_WindowSetSpriteArea(h%,SpriteArea%)
blk%,new_handle%,icon%,ib%
y'blk% =
shell_HeapBlockFetch(6000)
!blk% = h%
"Wimp_GetWindowInfo",,blk%
blk%!68 = SpriteArea%
shell_IconSetSpriteArea(blk%!60,blk% + 76,SpriteArea%)
(blk%!88) > 0
icon% = 0
(blk%!88) - 1
$ ib% = blk% + 92 + icon% * 32
=
shell_IconSetSpriteArea(ib%!16,ib% + 20,SpriteArea%)
icon%
"Wimp_DeleteWindow",,blk%
"Wimp_CreateWindow",,blk% + 4
new_handle%
new_handle% <> h%
shell_UpdateWindowHandle(h%,new_handle%)
h% = new_handle%
shell_HeapBlockReturn(blk%)
&*|Stop FNshell_WindowSetSpriteArea
'*|Start PROCshell_IconSetSpriteArea
shell_IconSetSpriteArea(flags%,data%,area%)
((flags%
3) = 2)
((flags%
&100) <> 0)
data%!4 = area%
&*|Stop PROCshell_IconSetSpriteArea
(*|Start FNshell_StrongHlpIsAvailable
shell_StrongHlpIsAvailable
r%,buff%
$buff%=
shell_HeapBlockFetch(256)
shell_OSVarExists(buff%,"StrongHelp$Dir")
shell_HeapBlockReturn(buff%)
'*|Stop FNshell_StrongHlpIsAvailable
*|Start FNshell_MenuNew
shell_MenuNew(title$)
handle%
"MenuUtil_New",,title$
handle%
=handle%
*|Stop FNshell_MenuNew
*|Start FNshell_MenuAdd
shell_MenuAdd(handle%,item$,sel_fn$)
ret_handle%
sel_fn$<>""
"MenuUtil_Add",handle%,item$,sel_fn$
ret_handle%
"MenuUtil_Add",handle%,item$
ret_handle%
IF handle% <> ret_handle% THEN
*|ifdef TraceInit
PROCshell_Tracef0("MenuAdd:Menu handle has changed, updating event lists..")
*|endif
PROCshell_MenuUpdateHandle(handle%,ret_handle%)
ENDIF
=ret_handle%
*|Stop FNshell_MenuAdd
*|Start PROCshell_MenuTick
shell_MenuTick(item_handle%,state%)
"MenuUtil_Tick",item_handle%,state%
*|Stop PROCshell_MenuTick
#*|Start PROCshell_MenuTickOnly1
shell_MenuTickOnly1(menu_handle%,pos%)
"MenuUtil_TickOnly",menu_handle%,pos%
"*|Stop PROCshell_MenuTickOnly1
#*|Start PROCshell_MenuTickOnly2
shell_MenuTickOnly2(item_handle%)
"MenuUtil_TickOnly",item_handle%
"*|Stop PROCshell_MenuTickOnly2
*|Start PROCshell_MenuShade
shell_MenuShade(handle%,state%)
"MenuUtil_Fade",handle%,state%
*|Stop PROCshell_MenuShade
*|Start PROCshell_MenuDotted
shell_MenuDotted(item_handle%,state%)
"MenuUtil_Dots",item_handle%,state%
*|Stop PROCshell_MenuDotted
!*|Start PROCshell_MenuColours
shell_MenuColours(item_handle%,fg%,bg%)
"MenuUtil_Colours",item_handle%,fg%,bg%
*|Stop PROCshell_MenuColours
"*|Start PROCshell_MenuWritable
shell_MenuWritable(item_handle%,state%,size%,valid$)
"MenuUtil_Writable",item_handle%,state%,size%,valid$
!*|Stop PROCshell_MenuWritable
!*|Start PROCshell_MenuPutData
shell_MenuPutData(item_handle%,data$)
"MenuUtil_Text",item_handle%,data$
*|Stop PROCshell_MenuPutData
%*|Start PROCshell_MenuCallHandler
shell_MenuCallHandler(h%,_h_blk%)
("FN"+$h%+"(_h_blk%)")
$*|Stop PROCshell_MenuCallHandler
&*|Start PROCshell_AttachOpenWindow
shell_AttachOpenWindow(wh%,fn$)
blk%,temp%,offset%
*|ifdef TraceInit
shell_Tracef0("AttachOpenWindow:Attaching OpenWindow Handler")
*|endif
wh%<0
shell_MessageOneArg("SHELLMSG27","AttachOpenWindow")
:offset%=
shell_GetEventListOffset(wh%,-1,_U%+304,12,
blk%=_U%!304+offset%
blk%!0=wh%:blk%!4=-1
*blk%!8=
shell_HeapBlockFetch(
(fn$)+1)
temp%=blk%!8:$temp%=fn$
%*|Stop PROCshell_AttachOpenWindow
.*|Start PROCshell_AttachCloseWindowHandler
shell_AttachCloseWindowHandler(wh%,fn$)
blk%,temp%,offset%
*|ifdef TraceInit
shell_Tracef0("AttachCloseWindowHandler:Attaching CloseWindow Handler")
*|endif
wh%<0
shell_MessageOneArg("SHELLMSG27","AttachCloseWindow")
:offset%=
shell_GetEventListOffset(wh%,-1,_U%+308,12,
blk%=_U%!308+offset%
blk%!0=wh%:blk%!4=-1
*blk%!8=
shell_HeapBlockFetch(
(fn$)+1)
temp%=blk%!8:$temp%=fn$
-*|Stop PROCshell_AttachCloseWindowHandler
"*|Start PROCshell_SpriteRename
shell_SpriteRename(spritearea%,old$,new$)
"OS_SpriteOp",&200+26,spritearea%,
shell_SpriteGetPtr(spritearea%,old$),new$
!*|Stop PROCshell_SpriteRename
"$*|Start PROCshell_SpriteAreaSave
shell_SpriteAreaSave(spritearea%,filename$)
"OS_SpriteOp",&200+12,spritearea%,filename$
'#*|Stop PROCshell_SpriteAreaSave
) *|Start PROCshell_EnsurePoll
shell_EnsurePoll
action%
-( action% =
shell_Poll_I(0,_U%!148)
shell_Action(action%)
action% = 0
*|Stop PROCshell_EnsurePoll
4"*|Start FNshell_WimpGetVersion
shell_WimpGetVersion
=_U%!316
7!*|Stop FNshell_WimpGetVersion
9"*|Start FNshell_OSCheckVersion
shell_OSCheckVersion(version%)
shell_OSModuleCheckVersion("UtilityModule",version%)
<!*|Stop FNshell_OSCheckVersion
>(*|Start FNshell_OSModuleCheckVersion
shell_OSModuleCheckVersion(module$,version%)
blk%,len%
A#blk%=
shell_HeapBlockFetch(256)
("Set AppName$RISCOS Y")
("RMEnsure "+module$+" "+
version%+" Set AppName$RISCOS N")
"XOS_ReadVarVal","AppName$RISCOS",blk%,256,0,0
,,len%
blk%?len%=13
("Unset AppName$RISCOS")
shell_HeapBlockReturn(blk%)
$blk%="N"
J'*|Stop FNshell_OSModuleCheckVersion
L)*|Start PROCshell_MessageSendDataLoad
shell_MessageSendDataLoad(type%,name$)
m_blk%
O%m_blk%=
shell_HeapBlockFetch(256)
m_blk%!00=256
m_blk%!04=0
R"m_blk%!16=5:
dataopen message
m_blk%!20=0
m_blk%!28=0
m_blk%!32=0
m_blk%!36=0
m_blk%!40=type%
$(m_blk%+44)=name$+
"Wimp_SendMessage",17,m_blk%,0
shell_HeapBlockReturn(m_blk%)
](*|Stop PROCshell_MessageSendDataLoad
_$*|Start FNshell_MenuMakeFromFile
shell_MenuMakeFromFile(title$,menuselectFN$,file$)
handle%,X%,string$,void%
shell_FileExists(file$)
c$ handle%=
shell_MenuNew(title$)
X%=
(file$)
string$=
g; void%=
shell_MenuAdd(handle%,string$,menuselectFN$)
=handle%
m#*|Stop FNshell_MenuMakeFromFile
o *|Start FNshell_BinarySearch
shell_BinarySearch(_search_term$,get_termFN$,comp_FN$,lo%,hi%)
_pos%,m%,_wp$,off%,p%,hipos%,lopos%,lp2%,found%,missing%
hi% += 1
missing% =
found% =
m% = hi%
off% = 0
_pos% = m%
lopos% = lo% - 1
hipos% = hi%
{( _wp$=
("FN"+get_termFN$+"(_pos%)")
lastpos% = _pos%
_search_term$ = _wp$
found% =
3
("FN"+comp_FN$+"(_search_term$,_wp$)")
search lower half..
hipos% = _pos%
! m% = _pos% - lopos%
_pos% = m%
2 + off%
search upper half..
lopos% = _pos%
off% = _pos%
! m% = hipos% - _pos%
_pos% = m%
2 +off%
lp2% = lastpos%
missing% =
lp2% = lastpos%
found%
missing%
found%
=-1
= lastpos%
*|Stop FNshell_BinarySearch
#*|Start FNshell_IconLastClicked
shell_IconLastClicked
=_U%!32
"*|Stop FNshell_IconLastClicked
"*|Start FNshell_MenuGetNrItems
shell_MenuGetNrItems(menu_handle%)
menu%,result%,items%
"MenuUtil_Info",menu_handle%
menu%
menu% += 28
result% = (menu%?0
&80)
items% += 1
menu% += 24
result%
=items%
!*|Stop FNshell_MenuGetNrItems
#*|Start FNshell_MenuGetNrDotted
shell_MenuGetNrDotted(menu_handle%)
menu%,result%,nr%
"MenuUtil_Info",menu_handle%
menu%
menu% += 28
result% = (menu%?0
&80)
(menu%?0
nr% += 1
menu% += 24
result% = -1
=nr%
#*|Stop FNshell_MenuGetNrDotted
&*|Start FNshell_MenuGetItemHandler
shell_MenuGetItemHandler(menu_handle%,item_nr%)
m_sel_blk%,ptr%,handler$
,m_sel_blk% =
shell_HeapBlockFetch(8)
m_sel_blk%!00 = item_nr%
m_sel_blk%!04 = -1
"MenuUtil_Decode",menu_handle%,m_sel_blk%
ptr%
ptr% = 0
handler$ = ""
handler$ = $(ptr%)
shell_HeapBlockReturn(m_sel_blk%)
= handler$
%*|Stop FNshell_MenuGetItemHandler
#*|Start FNshell_MenuGetItemText
shell_MenuGetItemText(menu_handle%,item_nr%)
m_sel_blk%,ptr%,text$
)m_sel_blk% =
shell_HeapBlockFetch(8)
m_sel_blk%!00 = item_nr%
m_sel_blk%!04 = -1
"MenuUtil_Decode",menu_handle%,m_sel_blk%
,,ptr%
text$ = $(ptr%!12)
shell_HeapBlockReturn(m_sel_blk%)
= text$
"*|Stop FNshell_MenuGetItemText
%*|Start FNshell_MenuGetItemHandle
shell_MenuGetItemHandle(menu_handle%,item_nr%)
m_sel_blk%,ptr%,handle%
)m_sel_blk% =
shell_HeapBlockFetch(8)
m_sel_blk%!00 = item_nr%
m_sel_blk%!04 = -1
"MenuUtil_Decode",menu_handle%,m_sel_blk%
,,ptr%
handle% = ptr%!08
shell_HeapBlockReturn(m_sel_blk%)
= handle%
$*|Stop FNshell_MenuGetItemHandle
%*|Start FNshell_MenuGetItemHeight
shell_MenuGetItemHeight(menu_handle%)
menu%
"MenuUtil_Info",menu_handle%
menu%
= menu%!20
$*|Stop FNshell_MenuGetItemHeight
'*|Start FNshell_MenuCalculateHeight
shell_MenuCalculateHeight(menu_handle%)
height%
Xheight% =
shell_MenuGetNrItems(menu_handle%)*
shell_MenuGetItemHeight(menu_handle%)
;= height% + (
shell_MenuGetNrDotted(menu_handle%) * 24)
&*|Stop FNshell_MenuCalculateHeight
#*|Start PROCshell_MenuSortItems
shell_MenuSortItems(menu%,compFN$,asc%,start%,end%)
nr_items%
0nr_items% =
shell_MenuGetNrItems(menu%) - 1
_shell_MS_handle% = menu%
end% > nr_items%
end% = nr_items%
"Hourglass_On"
shell_QuickSort(compFN$,"_shell_MS_swap",asc%,0,end%)
"Hourglass_Off"
"*|Stop PROCshell_MenuSortItems
*|Start PROCshell_QuickSort
shell_QuickSort(comp_FN$,swap_FN$,_asc%,_start%,_end%)
_lo%,_h%,_F%,_temp%,void%
'_lo% = _start%:_hi% = _end%:_F% =
)_temp% = _lo% -1 +
(_hi% + 1 - _lo%)
,void% =
("FN"+swap_FN$+"(_lo%,_temp%)")
_asc% = 0
*
("FN"+comp_FN$+"(_lo%,_hi%)")
0 void% =
("FN"+swap_FN$+"(_lo%,_hi%)")
_F% =
*
("FN"+comp_FN$+"(_hi%,_lo%)")
0 void% =
("FN"+swap_FN$+"(_hi%,_lo%)")
_F% =
_F%
_hi% = _hi% - 1
_lo% = _lo% + 1
_lo% = _hi%
_start% < _lo% - 1
shell_QuickSort(comp_FN$,swap_FN$,_asc%,_start%,_lo% - 1)
_hi% + 1 < _end%
shell_QuickSort(comp_FN$,swap_FN$,_asc%,_hi% + 1,_end%)
*|Stop PROCshell_QuickSort
*|Start FNshell_MS_swap
_shell_MS_swap(e1%,e2%)
term1$,term2$,h1%,h2%
:term1$ =
shell_MenuGetItemText(_shell_MS_handle%,e1%)
:term2$ =
shell_MenuGetItemText(_shell_MS_handle%,e2%)
<h1% =
shell_MenuGetItemHandle(_shell_MS_handle%,e1%)
<h2% =
shell_MenuGetItemHandle(_shell_MS_handle%,e2%)
shell_MenuPutData(h1%,term2$)
shell_MenuPutData(h2%,term1$)
*|Stop FNshell_MS_swap
*|Start FN_shell_MS_comp
_shell_MS_comp(e1%,e2%)
term1$,term2$
(:term1$ =
shell_MenuGetItemText(_shell_MS_handle%,e1%)
):term2$ =
shell_MenuGetItemText(_shell_MS_handle%,e2%)
term1$ <
term2$
*|Stop FN_shell_MS_comp
.-*|Start PROCshell_WindowSetTitleRightJust
shell_WindowSetTitleRightJust(
wh%)
w_blk%,t_flags%,handle%,reopen%
1&reopen% =
shell_WindowIsOpen(wh%)
2(w_blk% =
shell_HeapBlockFetch(6000)
!w_blk% = wh%
"Wimp_GetWindowInfo",,w_blk%
t_flags% = w_blk%!60
(t_flags%
(1 << 3))
*|ifdef TraceInit
shell_Tracef0("WindowSetTitleRightJust:title flags = &"+
~t_flags%)
shell_Tracef0("WindowSetTitleRightJust:Horizontally centred bit set..")
shell_Tracef0("WindowSetTitleRightJust:Unsetting horizontally centred bit..")
*|endif
<$ t_flags% = t_flags%
(1 << 3)
*|ifdef TraceInit
shell_Tracef0("WindowSetTitleRightJust:title flags = &"+
~t_flags%)
*|endif
*|ifdef TraceInit
shell_Tracef0("WindowSetTitleRightJust:Horizontally centred bit NOT set..")
*|endif
*|ifdef TraceInit
shell_Tracef0("WindowSetTitleRightJust:Setting right justified bit..")
*|endif
H"t_flags% = t_flags%
(1 << 9)
w_blk%!60 = t_flags%
"Wimp_DeleteWindow",,w_blk%
"Wimp_CreateWindow",,w_blk% + 4
handle%
wh% <> handle%
*|ifdef TraceInit
shell_Tracef0("WindowSetTitleRightJust:Updating window handle...")
*|endif
shell_UpdateWindowHandle(wh%,handle%)
wh% = handle%
reopen%
shell_OpenWindow(handle%,0,0)
shell_HeapBlockReturn(w_blk%)
W,*|Stop PROCshell_WindowSetTitleRightJust
Y.*|Start PROCshell_WindowSetTitleCentreJust
shell_WindowSetTitleCentreJust(
wh%)
w_blk%,t_flags%,handle%,reopen%
\&reopen% =
shell_WindowIsOpen(wh%)
](w_blk% =
shell_HeapBlockFetch(6000)
!w_blk% = wh%
"Wimp_GetWindowInfo",,w_blk%
t_flags% = w_blk%!60
shell_Tracef0("WindowSetTitleCentreJust:title flags = &"+
~t_flags%)
shell_Tracef0("WindowSetTitleCentreJust:t_flags% AND (1 << 3) = "+
~(t_flags%
(1 << 3)))
(t_flags%
(1 << 3)) = 0
*|ifdef TraceInit
shell_Tracef0("WindowSetTitleCentreJust:Horizontally centred bit not set..")
shell_Tracef0("WindowSetTitleCentreJust:Setting horizontally centred bit..")
*|endif
h$ t_flags% = t_flags%
(1 << 3)
*|ifdef TraceInit
shell_Tracef0("WindowSetTitleCentreJust:title flags = &"+
~t_flags%)
*|endif
w_blk%!60 = t_flags%
"Wimp_DeleteWindow",,w_blk%
"Wimp_CreateWindow",,w_blk% + 4
handle%
wh% <> handle%
*|ifdef TraceInit
qL
shell_Tracef0("WindowSetTitleCentreJust:Updating window handle...")
*|endif
s.
shell_UpdateWindowHandle(wh%,handle%)
wh% = handle%
reopen%
shell_OpenWindow(handle%,0,0)
shell_HeapBlockReturn(w_blk%)
|-*|Stop PROCshell_WindowSetTitleCentreJust
~**|Start PROCshell_IconGetSelectedIcons
shell_IconGetSelectedIcons(wh%,esg%,
i_blk%)
imask%
'imask% = (esg% << 16) + (1 << 21)
"Wimp_WhichIcon",wh%,i_blk%,imask%,(esg% << 16) + (1 << 21)
)*|Stop PROCshell_IconGetSelectedIcons
&*|Start FNshell_GetLastMouseButton
shell_GetLastMouseButton
= _U%!320
%*|Stop FNshell_GetLastMouseButton
(*|Start FNshell_GetLastWindowClicked
shell_GetLastWindowClicked
= _U%!28
'*|Stop FNshell_GetLastWindowClicked
&*|Start FNshell_GetLastIconClicked
shell_GetLastIconClicked
= _U%!32
%*|Stop FNshell_GetLastIconClicked
!*|Start FNshell_IconIndirSize
shell_IconIndirSize(file_offset%,flags%,data%)
size%,valid_offset%,valid_buff%,ctr%,char%
(flags%
&800100) = &100
size% = data%!8
(flags%
(data%!4 <> -1)
valid_offset% = data%!4
0 valid_buff% =
shell_HeapBlockFetch(256)
,
# X% = file_offset% + valid_offset%
)
"OS_GBPB",4,X%,valid_buff%,512
ctr% = 0
" char% = valid_buff%?ctr%
ctr% += 1
char% < 32
size% = size% + ctr%
+
shell_HeapBlockReturn(valid_buff%)
size% = 0
= size%
*|Stop FNshell_IconIndirSize