home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 5
/
DATAFILE_PDCD5.iso
/
utilities
/
a
/
armbob
/
!ArmBob
/
progs
/
!Exec
/
main
< prev
next >
Wrap
Text File
|
1994-06-25
|
4KB
|
153 lines
/******************************************************************
*
* !Exec v.1 - an ArmBob wimp program GCW 02/06/94
*
* Run command file with pathname of file dragged onto icon.
*
* See doc.tutorial.4
*
******************************************************************/
main()
{
@b = @(newstring(500)); // global message buffer
/* Create vector of responses to the task manager */
handler = newvector(20);
handler[Mouse_Click] = do_Mouse_Click;
handler[Menu_Selection] = do_Menu_Selection;
handler[User_Message] = handler[User_Message_Recorded] = do_Message;
/* All but 4 of handler's components are nil */
in (mesg_list= newstring(8)) put
{ Message_DataLoad; 0; } // the messages we want to receive
/* register task with window manager */
wimp_init(310,"Exec",mesg_list);
/* create vector of windows and get their handles */
(wind = newvector(1))[0] = "info";
info = templates("<Exec$Dir>.Templates",wind)[0];
icon = make_icon();
menu = make_menu();
/* global register vector for functions in loops that use swi */
r = newvector(8);
/******* the central loop takes place here ********/
/* &1933 is the reason code mask.
@b is the message buffer address.
handler is the vector of message handlers.
nil is the current value of the "user-parameter" - we
might want to pass round a parameter to the handlers
containing extra data that each could decode. */
event_process(&1933,@b,handler,nil);
}
do_Mouse_Click(a,user)
{
if ((£(a+12)==-2) && // iconbar
(£(a+16)==icon)) // icon
switch (£(a+8))
{
case 2: // Menu button
r[1] = menu; // use global r
r[2] = £(a)-64;
r[3] = 140;
swi("Wimp_CreateMenu",r);
break;
case 1: // Adjust button
case 4: // Select button
oscli("Filer_run <Exec$Dir>.Exec"); // Exec must be a textfile
break;
}
return TRUE; // i.e. continue
}
do_Menu_Selection(a,user)
{
return (£(a)!=1);
}
do_Message(a,user)
{
switch(£(a+16))
{
case Message_Quit:
return FALSE; // i.e. do not continue
break;
case Message_DataLoad:
if (£(a+20)==-2 && £(a+24)==icon)
act(a,user_process);
return TRUE;
break;
default:
return TRUE;
break;
}
}
make_icon()
{
local r;
in @b put
{
-1; // right of icon bar
0; // xmin of bounding box
0; // ymin of bounding box
64; // xmax of bounding box
68; // ymax of bounding box
&1700210a; // icon flags
@(sprite = "!exec"); // pointer to sprite name
1; // Wimp sprite area
8; // Length of spritename
}
(r = newvector(8))[1] = @b;
swi("Wimp_CreateIcon",r);
return(r[0]);
}
make_menu()
{
in (menu = newstring(72)) put
{
"Exec"; 0; 0; // Menu title
&70207; // colours
100; // width
44; // height
0; // gap
0;
info; // submenu
1+(1<<4)+(9<<12)+(1<<16)+(7<<24); // flags
"Info"; 0; 0; // item title
&80; // last item
-1; // no submenu
1+(1<<4)+(9<<12)+(1<<16)+(7<<24); // flags
"Quit"; 0; // item title
}
return(menu);
}
act(a,f)
{
local filename, filetype;
filename = $(a+44);
filetype = £(a+40);
££(a+16,Message_DataLoadAck);
££(a+12,£(a+8));
r[0] = User_Message_Acknowledge;
r[1] = a;
r[2] = 0;
swi("Wimp_SendMessage",r);
f(filename,filetype);
}
// ------- end of harness, do your own stuff here -------- //
user_process(fname,ftype)
{
oscli("WimpTask Obey -c <Exec$Dir>.Exec "+fname);
}