/* The example listed here shows how to create an AppIcon and obtain
* arguments from Workbench when the user drops other icons on top of
* it. The AppIcon will appear as a disk icon named "TestAppIcon" on the
* Workbench screen. (All AppIcons appear on the Workbench screen or
* window.)
*
* For convenience, this example code uses GetDefDiskObject() to create
* the icon imagery for the AppIcon. Applications should never do this.
* Use your own custom imagery for AppIcons instead.
*/
/* appicon.c - Compiled under SAS C 5.10 with lc -L appicon.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> /* Need this to check library versions */
#include <clib/icon_protos.h> /* Icon (DiskObject) function prototypes */
#include <clib/exec_protos.h> /* Exec message, port and library functions*/
#include <clib/wb_protos.h> /* AppIcon function protos */
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable SAS Lattice CTRL/C handling */
int chkabort(void) { return(0); }/* really */
#endif
extern struct Library *SysBase;
struct Library *IconBase;
struct Library *WorkbenchBase;
void main(int argc, char **argv)
{
struct DiskObject *dobj=NULL;
struct MsgPort *myport=NULL;
struct AppIcon *appicon=NULL;
struct AppMessage *appmsg=NULL;
LONG dropcount=0L;
ULONG x;
BOOL success=0L;
/* Get the the right version of the Icon Library, initialize IconBase */
if(IconBase = OpenLibrary("icon.library",37))
{
/* Get the the right version of the Workbench Library */
if (WorkbenchBase=OpenLibrary("workbench.library",37))
{
/* This is the easy way to get some icon imagery */
/* Real applications should use custom imagery */
dobj=GetDefDiskObject(WBDISK);
if(dobj!=0)
{
/* The type must be set to NULL for a WBAPPICON */
dobj->do_Type=NULL;
/* The CreateMsgPort() function is in Exec version 37 and later only */
myport=CreateMsgPort();
if(myport)
{
/* Put the AppIcon up on the Workbench window */
appicon=AddAppIconA(0L,0L,"TestAppIcon",myport,NULL,dobj,NULL);
if(appicon)
{
/* For the sake of this example, we allow the AppIcon */
/* to be activated only five times. */
printf("Drop files on the Workbench AppIcon\n");
printf("Example exits after 5 drops\n");
while(dropcount<5)
{
/* Here's the main event loop where we wait for */
/* messages to show up from the AppIcon */
WaitPort(myport);
/* Might be more than one message at the port... */
while(appmsg=(struct AppMessage *)GetMsg(myport))
{
if(appmsg->am_NumArgs==0L)
{
/* If NumArgs is 0 the AppIcon was activated directly */
printf("User activated the AppIcon.\n");
printf("A Help window for the user would be good here\n");
}
else if(appmsg->am_NumArgs>0L)
{
/* If NumArgs is >0 the AppIcon was activated by */
/* having one or more icons dropped on top of it */
printf("User dropped %ld icons on the AppIcon\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);
}
}
/* Let Workbench know we're done with the message */
ReplyMsg((struct Message *)appmsg);
}
dropcount++;
}
success=RemoveAppIcon(appicon);
}
/* Clear away any messages that arrived at the last moment */
while(appmsg=(struct AppMessage *)GetMsg(myport))
ReplyMsg((struct Message *)appmsg);
DeleteMsgPort(myport);
}
FreeDiskObject(dobj);
}
CloseLibrary(WorkbenchBase);
}
CloseLibrary(IconBase);
}
}