#include "ToolManager.h" /* Library pointers */ extern struct Library *SysBase,*IntuitionBase,*GfxBase; /* Autoinit Libs */ struct Library *WorkbenchBase,*IconBase,*GadToolsBase; /* Structures for icon */ extern struct DiskObject MyIcon; static struct AppIcon *MyAppIcon; /* Name of the message port & icon */ static char *MyName="ToolManager"; /* Tags for System() */ extern struct TagItem MyTags[]; #define SYSTAGS_IN 0 #define SYSTAGS_OUT 1 /* miscellaneous */ static struct AppMenuItem *MyAppMenuItem; /* Workbench main entry point */ void wbmain(struct WBStartup *wbarg) { BPTR fl; fl=CurrentDir(wbarg->sm_ArgList->wa_Lock); /* Goto a valid directory */ startup(); /* common startup code */ CurrentDir(fl); /* Go back to old directory */ /* Process WB startup parameters */ WBAddToolNode(&wbarg->sm_ArgList[1],wbarg->sm_NumArgs-1); mainloop(); /* Go into main loop */ } /* CLI main entry point */ void main(int argc, char **argv) { int i; BPTR fl; startup(); /* common startup code */ fl=CurrentDir(NULL); /* Get current directory lock */ /* Process CLI startup parameters */ for (i=1; ilib_Version<36) /* Sanity check */ { puts("You need a Kickstart 2.0 or better to run ToolManager!"); exit(20); } Forbid(); /* Is "ToolManager" already running? */ MyMP=FindPort(MyName); Permit(); if (MyMP) { /* Yes, exit gracefully */ puts("ToolManager already running!"); exit(5); } /* Open libraries */ if (!(WorkbenchBase=OpenLibrary(WORKBENCH_NAME,0))) cleanup(1); if (!(IconBase=OpenLibrary(ICONNAME,0))) cleanup(2); if (!(GadToolsBase=OpenLibrary("gadtools.library",0))) cleanup(3); /* Create message port */ if (!(MyMP=CreateMsgPort())) cleanup(4); MyMP->mp_Node.ln_Pri=0; MyMP->mp_Node.ln_Name=MyName; /* Our name */ AddPort(MyMP); /* Announce our presence */ /* Notify Workbench about icon */ if (!(MyAppIcon=AddAppIcon(NULL,NULL,MyName,MyMP,NULL,&MyIcon,NULL))) cleanup(5); /* Notify Workbench about special menu item. If this item is selected, the program will quit */ if (!(MyAppMenuItem=AddAppMenuItem(NULL,NULL,"Quit ToolManager",MyMP,NULL))) cleanup(6); NewList(&ToolList); /* Initialize tool list */ fl=CurrentDir(NULL); /* Get the current directory */ if (fh=fopen(ConfigName,"r")) /* Scan config file */ { while (!feof(fh)) /* if not end of file, read one line into buffer */ if (fgets(ConfigLine,BUFLEN,fh) && (strlen(ConfigLine)>1)) { char *tp; ConfigLine[strlen(ConfigLine)-1]='\0'; /* Strip newline */ if (tp=strchr(ConfigLine,';')) /* scan config line */ { *tp='\0'; /* Menu entry ; real program name */ AddToolNode(fl,ConfigLine,++tp); } else AddToolNode(fl,ConfigLine,NULL); /* Menu entry == real program name */ } fclose(fh); /* close config file */ } CurrentDir(fl); /* go back to old directory */ } /* The main processing loop */ void mainloop(void) { BOOL end=TRUE; /* Flag for main loop */ BOOL windowopen=FALSE; /* Flag for status window */ ULONG sigs,bsigs,psigs,wsigs; /* Buffers for signals */ bsigs=SIGBREAKF_CTRL_C| /* break signals */ SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_E|SIGBREAKF_CTRL_F; psigs=1L<mp_SigBit; /* port signal */ sigs=bsigs|psigs; /* merge signals */ while (end) /* main loop */ { struct AppMessage *msg; /* pointer to received message */ ULONG gotsigs; /* received signals */ gotsigs=Wait(sigs); /* Wait for specified signals */ if (gotsigs&bsigs) /* Got break signals? */ end=FALSE; /* Yes, quit program */ if (gotsigs&psigs) /* Message arrived at message port? */ while (msg=GetMsg(MyMP)) /* Yes, empty message queue */ { switch(msg->am_Type) /* Switch between message types */ { case MTYPE_APPWINDOW: /* Window action */ case MTYPE_APPICON: /* Icon action */ if (msg->am_NumArgs==0) /* Did the user double click my icon? */ { /* Yes! If window not open, open it */ if ((!windowopen) && (wsigs=OpenStatusWindow())) { sigs|=wsigs; /* Merge with other signals */ windowopen=TRUE; /* Window is open */ } } else /* User dropped an icon on my icon */ { /* Add Workbench parameters to tool list */ if (!WBAddToolNode(msg->am_ArgList,msg->am_NumArgs)) DisplayBeep(NULL); if (windowopen) /* Refresh status window if open */ RefreshStatusWindow(); } break; case MTYPE_APPMENUITEM: /* Menu action */ if (msg->am_ID==NULL) /* Special menu item selected? */ end=FALSE; /* Yes, quit program */ else /* No, scan list for selected tool */ { struct ToolNode *tn; for (tn=GetHead(&ToolList); tn; tn=GetSucc(tn)) if (tn->tn_ID==msg->am_ID) { /* Corresponding tool found */ BPTR fl,dfh; /* AmigaDOS Filehandles */ char *cp; fl=CurrentDir(tn->tn_DirLock); /* Change to tool's directory */ dfh=Open("NIL:",MODE_NEWFILE); /* Open dummy files for */ MyTags[SYSTAGS_IN].ti_Data=dfh; /* program I/O */ dfh=Open("NIL:",MODE_NEWFILE); MyTags[SYSTAGS_OUT].ti_Data=dfh; if (!(cp=tn->tn_RealName)) /* Get tool name */ cp=tn->tn_Node.ln_Name; if (System(cp,MyTags)==-1) /* Start tool */ DisplayBeep(NULL); CurrentDir(fl); /* Change to old directory */ break; /* quit loop */ } } break; } /* end of switch(msg->am_Type) */ ReplyMsg(msg); /* Reply message to sender */ } /* end of while(msg=GetMsg(MyMP)) */ if (windowopen && (gotsigs&wsigs)) /* If window open, got window signal? */ if (HandleWindowEvent()) /* Handle window event */ { /* Window close event? */ CloseStatusWindow(); /* Yes, close window */ sigs&=~wsigs; /* Remove window signals */ windowopen=FALSE; /* Window closed */ } } /* end of main loop */ /* If window open, close it */ if (windowopen) CloseStatusWindow(); /* Exit program */ cleanup(99); } /* Final cleanup routine */ void cleanup(int i) { register struct Message *msg; switch(i) { case 99: RemoveTools(); RemoveAppMenuItem(MyAppMenuItem); case 6:RemoveAppIcon(MyAppIcon); case 5:RemPort(MyMP); /* Remove message port */ while (msg=GetMsg(MyMP)) ReplyMsg(MyMP); /* Reply all messages */ DeleteMsgPort(MyMP); case 4:CloseLibrary(GadToolsBase); case 3:CloseLibrary(IconBase); case 2:CloseLibrary(WorkbenchBase); case 1:break; } if (i!=99) exit(i); /* error if i!=99 */ exit(RETURN_OK); /* all o.k. */ }