/* This example shows how to create an AppMenuItem. The example adds a
* menu item named "Browse Files" to the Workbench Tools menu. (All
* AppMenuItems appear in the Workbench Tools menu.) When the menu item
* is activated, the example program receives a message from Workbench
* and then attempts to start up an instance of the More program. (The
* More program is in the Utilities directory of the Workbench disk.)
*
* The example starts up the More program as a separate, asynchronous
* process using the new SystemTags() function of Release 2 AmigaDOS.
* For more about the SystemTags() function refer to the AmigaDOS
* Manual, 3rd Edition from Bantam Books. When the AppMenuItem has been
* activated five times, the program exits after freeing any system
* resources it has used.
*/
/* appmenuitem.c - Compiled under SAS C 5.10 with lc -L appmenuitem.c */
/* Requires Kickstart version 37 or later. Works from the Shell (CLI) only */
#include <exec/types.h> /* Need this for the Amiga variable types */
#include <workbench/workbench.h> /* This has DiskObject and AppIcon structs */
#include <workbench/startup.h> /* This has WBStartup and WBArg structs */
#include <exec/libraries.h>
#include <dos/dostags.h>
#include <stdio.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h> /* Exec message, port and library functions*/
#include <clib/wb_protos.h> /* AppMenuItem function protos */
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); }/* really */
#endif
extern struct Library *SysBase;
struct Library *WorkbenchBase;
void main(int argc, char **argv)
{
struct MsgPort *myport=NULL;
struct AppMenuItem *appitem=NULL;
struct AppMessage *appmsg=NULL;
LONG result, x, count=0L;
BOOL success=0L;
BPTR file;
if (WorkbenchBase = OpenLibrary("workbench.library",37))
{
/* The CreateMsgPort() function is in Exec version 37 and later only */
if(myport = CreateMsgPort())
{
/* Add our own AppMenuItem to the Workbench Tools Menu */
appitem=AddAppMenuItemA(0L, /* Our ID# for item */
(ULONG)"SYS:Utilities/More", /* Our UserData */
"Browse Files", /* MenuItem Text */
myport,NULL); /* MsgPort, no tags */
if(appitem)
{
printf("Select Workbench Tools demo menuitem 'Browse Files'\n");
/* For this example, we allow the AppMenuItem to be selected */
/* only once, then we remove it and exit */
WaitPort(myport);
while((appmsg=(struct AppMessage *)GetMsg(myport)) && (count<1))
{
/* Handle messages from the AppMenuItem - we have only one */
/* item so we don't have to check its appmsg->am_ID number. */
/* We'll System() the command string that we passed as */
/* userdata when we added the menu item. */
/* We find our userdata pointer in appmsg->am_UserData */
printf("User picked AppMenuItem with %ld icons selected\n",
appmsg->am_NumArgs);
for(x=0;x<appmsg->am_NumArgs;x++)
printf(" #%ld name='%s'\n",x+1,appmsg->am_ArgList[x].wa_Name);
count++;
if( file=Open("CON:0/40/640/150/AppMenu Example/auto/close/wait",
MODE_OLDFILE) ) /* for any stdio output */
{
result=SystemTags((UBYTE *)appmsg->am_UserData,SYS_Input,file,
SYS_Output,NULL,
SYS_Asynch,TRUE,
TAG_DONE);
/* If Asynch System() itself fails, we must close file */
if(result == -1) Close(file);
}
ReplyMsg((struct Message *)appmsg);
}
success=RemoveAppMenuItem(appitem);
}
/* Clear away any messages that arrived at the last moment */
/* and let Workbench know we're done with the messages */
while(appmsg=(struct AppMessage *)GetMsg(myport))
{
ReplyMsg((struct Message *)appmsg);
}
DeleteMsgPort(myport);
}
CloseLibrary(WorkbenchBase);
}
}