/*
 *	ParMBase.h - Copyright © 1991 by S.R. & P.C.
 *
 *	Created:	22 Mar 1991  17:28:15
 *	Modified:	18 Jan 1992  10:40:27
 *
 *	Make>> make
 */

#define CMDBUFSIZE	255		/* MUST be odd for alignement in ParMConfig */

#define DEFAULT_CMD_WINDOW		"CON:0000/0011/0640/0100/Command window/auto/close/wait"
#define DEFAULT_SHELL_WINDOW	"CON:0000/0011/0640/0100/Shell/close"
#define DEFAULT_SHELL_CMD		"NewShell"
#define DEFAULT_WAIT_CMD		"WaitReturn"
#define DEFAULT_TMP_DIR			"T:"
#define DEFAULT_MOUSEOPT_FILE	"Devs:Mouse.Opt"


/* This only for Mouse stuff */

struct MouseOpt {
	USHORT Version;				/* Version of this Mouse.Opt file */
	BYTE HandlerPri;			/* Input Handler priority */
	UBYTE NClick;				/* Number of click before WindowToFront() ( = 0 if not ) */
	USHORT Flags;				/* See below */
	USHORT Threshold;			/* Threshold: minimum varation before acceleration */
	USHORT Acc;					/* Acceleration factor */
	SHORT SunMouse;				/* Auto activate window */
	USHORT MouseBlank;			/* Time before mouse blank, zero to disable */
	USHORT ScreenBlank;			/* Time before screen blank, zero to disable */
	USHORT WTFQual;				/* Qualifier for Window to front */
};

#define MOUSEOPT_VERSION	2

#define MO_SCREENTOBACK		0x0001
#define MO_WINDOWTOBACK		0x0002


struct Extended_WBStartup {
	struct WBStartup WBStartup;
	struct WBArg *ArgArray;
	short ArrayLength;
	long Stack;
};


struct RunInfo {
	char  *ri_Cmd;		/* Command */
	char  *ri_Args;		/* Command arguments */
	char  *ri_Window;	/* Console when mode = CLI */
	long  ri_Stack;		/* Stack for command */
	short ri_Pri;		/* Pri of command */
};


struct Extended_MenuItem {
	struct MenuItem emi_MenuItem;
	struct RunInfo emi_RunInfo;
	short emi_Mode;					/* TOK_ARUN | TOK_RUN | TOK_WB | TOK_CFG */
	USHORT emi_Flags;				/* See below */
};

#define EMIF_WBTOFRONT	0x0001		/* Bring WB screen to front just after running cmd */


struct ParMConfig {
	struct Window *Win;
	struct Menu *LinkMenu;
	char CurCfg[80];
	char CmdWindow[80];
	char ShellWindow[80];
	char ShellCmd[80];
	char WaitCmd[80];
	char TmpDir[40];
	char *ReqTitle;
	long DefaultStack;
	short MenuPen;
	short ItemHeight;		/* Obsolete */
	USHORT ShortCutQual;
	BOOL SimpleCmdMode;
	char CommandBuffer[CMDBUFSIZE+1];
	SHORT ReservedFutureUse[10];
	/* Reserved internal use */
	struct Menu *CurrentMenu;
	struct MenuItem *CurrentSubMenu;
	struct MenuItem **CurrentItem;
	struct Remember *MemList;
	char *mem;			/* local to Malloc() */
	size_t Avail;		/* local to Malloc() */
};


/* ParM Events flags */
#define PEF_PASSTHROUGH		0x0001
#define PEF_SCREENTOFRONT	0x0002
#define PEF_NOCHECK			0x0004
#define PEF_OUT_OF_ORDER	0x0008


struct ParMBase {
	struct Library pb_Lib;
	ULONG  pb_SegList;					/* seg list of lib itself */
	struct ArpBase  *ArpBase;			/* Copy of ArpBase */
	struct ReqLib   *ReqBase;			/* Copy of reqBase */
	struct IconBase *IconBase;			/* Copy of IconBase */
	struct LayersBase *LayersBase;		/* Copy of LayersBase */
	struct MsgPort  pb_MsgPort;			/* For WB replies */
	short  pb_MsgCnt;					/* Number of WB running processes */
};


/* Tokens.h  */

#define TOK_ITEM			1
#define TOK_ARUN			2
#define TOK_RUN				3
#define TOK_SHELL			4
#define TOK_WB				5
#define TOK_CFG				6
#define TOK_WIN				7
#define TOK_PRI				8
#define TOK_STACK			9
#define TOK_MENU			10
#define TOK_SUBMENU			11
#define TOK_ENDSUBMENU		12
#define TOK_COLOR			13
#define TOK_CMDWIN			14
#define TOK_SHELLWIN		15
#define TOK_SHELLCMD		16
#define TOK_WAITCMD			17
#define TOK_TMPDIR			18
#define TOK_SHORTCUTQUAL	19
#define TOK_ACTIVATEKEY		20
#define TOK_PASSTHROUGH		21
#define TOK_SCREENTOFRONT	22
#define TOK_NOCHECK			23
#define TOK_WBTF			24
#define TOK_STR				25	/* not a keyword! */

#define MAX_KEYWORD 24


long ParseMenus(struct ParMConfig *PCfg);
void FreeMenus(struct ParMConfig *PCfg);
long ARun(struct ParMConfig *PCfg, struct RunInfo *Command);
long Run(struct ParMConfig *PCfg, struct RunInfo *Command, BYTE Mode);
long WBRun(struct ParMConfig *PCfg, struct Extended_WBStartup *EWBS, BYTE Pri);
long GetTool(struct ParMConfig *PCfg, struct Extended_WBStartup *EWBS, long Stack);
long MakeWBArg(struct ParMConfig *PCfg, struct WBArg *WBArg, char *Cmd);
struct Extended_WBStartup *MakeWBStartup(struct ParMConfig *PCfg, struct RunInfo *Command);
void WBFree(struct Extended_WBStartup *EWBS);
void Command(struct ParMConfig *PCfg);
void ParseLine(char *cmd);
char *DosError(long);
char *StrIoErr(void);
ULONG MakeMenuShortCut(struct Menu *M, ULONG c);
void InitDefaults(struct ParMConfig *PCfg);
void FreeRepliedWBMessages(void);
void NewMinList(struct MinList *MinList);
char *CopyStr(char *str);
void FreeStr(char *str);
long IsHidden(struct Window *W);
struct Window *GetWindow(void);
struct IORequest *CreateExtIO(struct MsgPort *ioReplyPort, long size);
void CleanUp(struct Menu *Menu, short LeftEdge, short ItemHeight);
void NewCleanUp(struct Menu *Menu, struct TextAttr *MenuFont, short LeftEdge);
void UpdateParMEventsWindow(struct Window *OldWindow, struct Window *NewWindow);
void UpdateMouseOpt(struct MouseOpt *NewMouseOpt);
void GetCurrentMouseOpt(struct MouseOpt *MouseOpt);

#pragma amicall(ParMBase, 0x1e, ParseMenus(a0))
#pragma amicall(ParMBase, 0x24, FreeMenus(a0))
#pragma amicall(ParMBase, 0x2a, ARun(a0,a1))
#pragma amicall(ParMBase, 0x30, Run(a0,a1,d0))
#pragma amicall(ParMBase, 0x36, WBRun(a0,a1,d0))
#pragma amicall(ParMBase, 0x3c, GetTool(a0,a1,d0))
#pragma amicall(ParMBase, 0x42, MakeWBArg(a0,a1,a2))
#pragma amicall(ParMBase, 0x48, MakeWBStartup(a0,a1))
#pragma amicall(ParMBase, 0x4e, WBFree(a0))
#pragma amicall(ParMBase, 0x54, Command(a0))
#pragma amicall(ParMBase, 0x5a, ParseLine(a0))
#pragma amicall(ParMBase, 0x60, DosError(d0))
#pragma amicall(ParMBase, 0x66, StrIoErr())
#pragma amicall(ParMBase, 0x6c, MakeMenuShortCut(a0,d0))
#pragma amicall(ParMBase, 0x72, InitDefaults(a0))
#pragma amicall(ParMBase, 0x78, FreeRepliedWBMessages())
#pragma amicall(ParMBase, 0x7e, NewMinList(a0))
#pragma amicall(ParMBase, 0x84, CopyStr(a0))
#pragma amicall(ParMBase, 0x8a, FreeStr(a0))
#pragma amicall(ParMBase, 0x90, IsHidden(a0))
#pragma amicall(ParMBase, 0x96, GetWindow())
#pragma amicall(ParMBase, 0x9c, CreateExtIO(a0, d0))
#pragma amicall(ParMBase, 0xa2, CleanUp(a0, d0, d1))
#pragma amicall(ParMBase, 0xa8, NewCleanUp(a0, a1, d0))
#pragma amicall(ParMBase, 0xae, UpdateParMEventsWindow(a0, a1))
#pragma amicall(ParMBase, 0xb4, UpdateMouseOpt(a0))
#pragma amicall(ParMBase, 0xba, GetCurrentMouseOpt(a0))

