/* Copyright ) Darin Johnson, 1989 */ /* */ /* Permission is granted to use */ /* this program and to freely copy */ /* it and/or source code as long */ /* as these notices remain. */ /* No charges for these copies may */ /* be made, except for handling */ /* and distribution fees. */ /* This is the main process for MyMenu. This gets loaded and run in the */ /* background by MyMenu. When started, it finishes initializing itself, */ /* and starts monitoring the WorkBench IDCMP port. If any messages show */ /* up that we are interested in, we run them as a CLI or WorkBench */ /* process. We don't do any memory allocation or cleanup and leave that */ /* all to MyMenu (in order to save some space). Communication with */ /* MyMenu is done via a public port - never used as a port, but it holds */ /* "global" variables. */ #include #include #include #include #include #include #include "mymenu.h" static char *copyright = "Copyright ) Darin Johnson, 1989"; struct IntuitionBase *IntuitionBase; #ifdef DO_WB struct IconBase *IconBase; /* already defined in Manx C */ #endif struct MMData *MM; /* data shared with other tasks */ struct Process *MyProcess; #ifdef DO_WB int wb_cnt; /* number of wb processes run */ struct MsgPort *wb_reply_port; /* replies from terminating WB processes */ #endif #ifdef DO_WB /* error messages */ struct IntuiText wb_open_msg_5 = { 3,1,JAM2,24,36,NULL, (UBYTE*)"Do you REALLY want to quit now?", NULL }; struct IntuiText wb_open_msg_4 = { 0,1,JAM2,7,28,NULL, (UBYTE*)"the program finishes after MyMenu.", &wb_open_msg_5 }; struct IntuiText wb_open_msg_3 = { 0,1,JAM2,7,20,NULL, (UBYTE*)"still be open. This can cause a crash if", &wb_open_msg_4 }; struct IntuiText wb_open_msg_2 = { 0,1,JAM2,7,12,NULL, (UBYTE*)"A WorkBench program started by MyMenu may", &wb_open_msg_3 }; struct IntuiText wb_open_msg = { 3,1,JAM2,142,4,NULL, (UBYTE*)"WARNING!!", &wb_open_msg_2 }; struct IntuiText true_msg = { 0,1,JAM2,7,3,NULL, (UBYTE*)"Yes, quit MyMenu", NULL }; struct IntuiText false_msg = { 0,1,JAM2,7,3,NULL, (UBYTE*)"No! I didn't mean it", NULL }; #endif /* returns an error to MyMenu if we get one during initialization */ error(code) char code; { MM->error_code = code; if (IntuitionBase) CloseLibrary(IntuitionBase); #ifdef DO_WB if (IconBase) CloseLibrary(IconBase); #endif /* coordinate with add_handler() in MyMenu */ Signal(MM->parent_task, 1 << MM->parent_sig); /* now coordinate with remove_handler() in MyMenu */ Wait(SIGBREAKF_CTRL_C); /* wait for parent */ Signal(MM->parent_task, 1 << MM->parent_sig); _exit(0); } /* add personalized menus to menustrip */ add_menu_strip() { struct Menu *menu_strip; ULONG ilock; menu_strip = MM->WBWindow->MenuStrip; ilock = LockIBase(0L); ClearMenuStrip(MM->WBWindow); MM->prev_menu->NextMenu = MM->my_menu; SetMenuStrip(MM->WBWindow, menu_strip); UnlockIBase(ilock); } /* remove our personalized menus from menustrip */ del_menu_strip() { struct Menu *menu_strip; ULONG ilock; menu_strip = MM->WBWindow->MenuStrip; ilock = LockIBase(0L); ClearMenuStrip(MM->WBWindow); MM->prev_menu->NextMenu = NULL; SetMenuStrip(MM->WBWindow, menu_strip); UnlockIBase(ilock); } /* main program - initialize and start up monitor */ _main() { /* find data set up by parent */ MM = (struct MMData *)FindPort(MYMENU_NAME); if (!MM) _exit(0); /* some one ran us directly, bail out */ /* finish initialization */ MM->handler_task = FindTask(NULL); MyProcess = (struct Process *)MM->handler_task; MyProcess->pr_ConsoleTask = NULL; MyProcess->pr_CLI = NULL; MyProcess->pr_WindowPtr = (APTR)-1; /* disable requesters for FindIt() */ MyProcess->pr_CurrentDir = NULL; /* open necessary libraries */ IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0); if (IntuitionBase == NULL) error(ERR_LIB); #ifdef DO_WB IconBase = (struct IconBase *)OpenLibrary(ICONNAME, 0); if (IconBase == NULL) error(ERR_LIB); #endif if (!MM->WBWindow) error(ERR_WIN); if (!setup_mon()) error(ERR_MON); MM->error_code = ERR_OK; /* signal parent that we're fully weaned */ Signal(MM->parent_task, 1 << MM->parent_sig); add_menu_strip(); #ifdef DO_WB wb_cnt = 0; /* create port AFTER setup_mon() so we don't get same signal */ wb_reply_port = CreatePort(WBPORT_NAME, 0); NewList(&wb_reply_port->mp_MsgList); /* is this necessary? */ #endif restart: monitor(); #ifdef DO_WB /* see if we can leave gracefully */ /* we don't want to terminate and then have a WB reply message */ if ((wb_cnt > 0) && (AutoRequest(NULL,&wb_open_msg, &true_msg,&false_msg,0,0,370,80)==FALSE)) { MM->error_code = ERR_WB_OPEN; Signal(MM->parent_task, 1 << MM->parent_sig); goto restart; } #endif /* clean everything up */ MM->error_code = ERR_OK; /* let parent know that we finished up */ finish_mon(); del_menu_strip(); CloseLibrary(IntuitionBase); #ifdef DO_WB CloseLibrary(IconBase); #endif /* Forbid until we terminate, so that we don't get UnLoadSeg'ed to soon */ Forbid(); #ifdef DO_WB { register struct Message *msg; while ((msg=GetMsg(wb_reply_port))!=0) wbfree(msg); DeletePort(wb_reply_port); } #endif /* signal parent that we are done */ Signal(MM->parent_task, 1 << MM->parent_sig); }