home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d02xx
/
d0225.lha
/
MyMenu
/
MyMenu-Handler.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-06-24
|
6KB
|
187 lines
/* 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 <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <workbench/icon.h>
#include <functions.h>
#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);
}