#ifndef MACH_H
#define MACH_H

/* $Log:	mach.h,v $
 * Revision 37.002  93/10/14  08:48:00  Brian
 * Release 5.0.
 *
 *
 */

#include <ctype.h>
#include <devices/input.h>
#include <devices/inputevent.h>
#include <dos/datetime.h>
#include <exec/types.h>
#include <exec/libraries.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/semaphores.h>


/* Clock Types */

#define CLOCK_ONLY			0	/* hh:mm:ss */
#define CLOCK_PLUSMEMORY	1	/* Chip xxxx Fast xxxxx   hh:mm:ss */
#define CLOCK_MEMORYONLY	2	/* Chip xxxx Fast xxxxx */
#define CLOCK_PLUSDATE		3	/* 03-16-93   hh:mm:ss */
#define CLOCK_COORDS		4	/* xxx  yyy */
#define CLOCK_COMMANDBAR	5	/* gadgets only! */

#define CLOCK_BORDER_RIGHT	0	/* size gadget uses border on right. Normal */
#define CLOCK_BORDER_BOTTOM	1	/* size gadget uses bottom border */
#define CLOCK_BORDERLESS	2	/* no border at all! */

#define KEYTASK	"KeyTask"		/* task name for "Select A Hotkey" */
#define MACHV_REXX "MACHV_REXX"

#define UNKEYED				128	/* index for unkeyed macros */
#define MAXKEYS				128	/* keycodes 0-127. 128 is unkeyed */
#define MAX_CFG_TITLE		80	/* configuration title length */
#define MAX_LIST_TITLE		15	/* list window title */
#define MAX_LIST_STRINGBUF	14	/* string gadget under list gadget */
#define MAX_MACRO_NAME		MAX_LIST_STRINGBUF	
#define MAX_DIR_NAME		80	/* path to MachV.prefs */
#define MAX_FILE_NAME		31	/* MachV.prefs */
#define MAX_PASTE_APPEND	7	/* pasting prepend and append text */
#define MAX_ALARM_COMMAND	80	/* length of command for CLK_ALARM to use */
#define MAX_SETMACH_PATH	40	/* path to find SetMachV */
#define MAX_CUSTOM_MESSAGE  30  /* largest message for the clock. inc. \0 */

#define MAX_VARIABLE		80	/* number of chars for ml_Variable */
#define MAX_VARNAME			40	/* number of chars for ml_VarName */

#define MAX_AREXX_RESULT	80	/* max length of results returned */

#define MAX_NO_LAYERS		10	/* number of window titles to NOT layer */

#define DEFAULTS_SIZE		41	/* sizeof default cfg */

#define GAD_NOPOS 			-1	/* clock gadget has no position yet */

/* The following are set in ml_GeneralEvent and then MachV is signaled.
   Some must be send with PutMsg(). These are noted below. */

#define GE_BBLANK				0	/* blank the screen */
#define GE_BUNBLANK				1	/* unblank it */
#define GE_BBEEP				2	/* tell MachV to beep */
#define GE_BKILLCLOCK			3	/* kill the clock */
#define GE_BRUNCLOCK			4	/* run it */
#define GE_BADDCONFIG			5	/* add new configuration. Use PutMsg() */
#define GE_BDELCONFIG			6	/* del configuration. Use PutMsg() */
#define GE_BSAVECONFIG			7	/* save configuration. Use PutMsg() */
#define GE_BLOADCONFIG			8	/* load configuration. Use PutMsg() */
#define GE_BSET_VARIABLE		9	/* set variable ml_VarName to ml_Variable */
#define GE_BUPDATESETMACH		10	/* tell MachV to send update msg to interface */
#define GE_BLOADBEEP			11	/* load a beep sound file. pathname in */
									/* ml_BeepFileName */
#define GE_BSCREENUP			12	/* tell MachV to tell interface to come */
									/* to front and scroll up. */
#define GE_BABORTPRINT			13	/* abort printing */
#define GE_BDISPLAYTIME			14	/* display time (or message) in clock */
#define GE_BFREEGADGETS			15	/* free clock gadgets */
#define GE_BSET_MOUSE_PORT		16	/* set mouse port. port in mc_MousePort */
#define GE_BNEWCONFIG			17	/* tell MachV to switch configurations */
#define GE_BPRINTCLIP			18	/* print clipboard */
#define GE_BUPDATE_PATTERNS		19	/* tell MachV to update its StringPatterns */
#define GE_BTRACE				20	/* toggle tracing */
#define GE_BNEW_WINDOW        	21	/* tell MachV a new window is active */
#define GE_BHOTKEY            	22	/* tell MachV to do a hotkey */
#define GE_BDO_VAR            	23	/* set variable ml_VarName to ml_Variable */
									/* Use PutMsg(). \0 as first char gets it. */
									/* -1 as 1st char deletes the variable. */

           /* general event signals */

#define GE_BLANK                (1 << GE_BBLANK)
#define GE_UNBLANK              (1 << GE_BUNBLANK)
#define GE_BEEP                 (1 << GE_BBEEP)
#define GE_KILLCLOCK            (1 << GE_BKILLCLOCK)
#define GE_RUNCLOCK             (1 << GE_BRUNCLOCK)
#define GE_ADDCONFIG            (1 << GE_BADDCONFIG)
#define GE_DELCONFIG            (1 << GE_BDELCONFIG)
#define GE_SAVECONFIG           (1 << GE_BSAVECONFIG)
#define GE_LOADCONFIG           (1 << GE_BLOADCONFIG)
#define GE_SET_VARIABLE         (1 << GE_BSET_VARIABLE)
#define GE_UPDATESETMACH        (1 << GE_BUPDATESETMACH)
#define GE_LOADBEEP             (1 << GE_BLOADBEEP)
#define GE_SCREENUP             (1 << GE_BSCREENUP)
#define GE_ABORTPRINT           (1 << GE_BABORTPRINT)
#define GE_DISPLAYTIME          (1 << GE_BDISPLAYTIME)
#define GE_FREEGADGETS          (1 << GE_BFREEGADGETS)
#define GE_SET_MOUSE_PORT       (1 << GE_BSET_MOUSE_PORT)
#define GE_NEWCONFIG            (1 << GE_BNEWCONFIG)
#define GE_PRINTCLIP            (1 << GE_BPRINTCLIP)
#define GE_UPDATE_PATTERNS      (1 << GE_BUPDATE_PATTERNS)
#define GE_TRACE				(1 << GE_BTRACE)
#define GE_NEW_WINDOW           (1 << GE_BNEW_WINDOW)
#define GE_HOTKEY               (1 << GE_BHOTKEY)
#define GE_DO_VAR               (1 << GE_BDO_VAR)

/* These are set in ml_MouseEvents and then MachV is signaled. The handler */
/* usually is the only one that needs to set these. */

#define ME_BSUN			0	/* activate window under mouse */
#define ME_BKEYSUN		1	/* activate window under mouse caused by keystroke */
#define ME_BCLICKTF		2	/* move window under mouse to front */
#define ME_BCYCLE		3	/* move window or screen under mouse to back */
#define ME_BMOUSEOFF	4	/* turn mouse pointer off */

#define ME_SUN			(1 << ME_BSUN)
#define ME_KEYSUN		(1 << ME_BKEYSUN)
#define ME_CLICKTF		(1 << ME_BCLICKTF)
#define ME_CYCLE		(1 << ME_BCYCLE)
#define ME_MOUSEOFF		(1 << ME_BMOUSEOFF)


/* SetMachV's screen flags. Set in ml_ScreenFlags  */

#define SF_WB			1		/* Open on Workbench */
#define SF_CUSTOM		2		/* Open on custom screen */
#define SF_LACE			4		/* Use interlaced custom screen */
#define SF_SCROLL		8		/* Scroll up from bottom */
#define SF_TITLEBAR		0x10	/* Show titlebar */


/* ml_Trace flags. Set in ml_Trace */

#define TRACE_SERIAL  1
#define TRACE_CONSOLE 2


/* used to wakeup tasks or interface */

#define SIG_WAKEUP		SIGBREAKF_CTRL_F 

    /* mc_Flag flags */

#define MC_BSUNMOUSE		0		/* can sun? */
#define MC_BKEYACTIVATE		1		/* do key activate? */
#define MC_BMOUSETOMENU		2		/* allow mouse to menu? */
#define MC_BMENU_WRAP		3		/* let mouse wrap around menus? */
#define MC_BWINDOWCYCLE		4		/* window cycling? */
#define MC_BAUTO_POPTOP 	5		/* auto pop to front? */
#define MC_BKEYCLICK		6		/* key clicking? */
#define MC_BCLOCK			7		/* clock on? */
#define MC_BVERTICALCLOCK	8		/* vertical clock? */
#define MC_BCLOCKTOPWINDOW	9		/* clock can pop to top window? */
#define MC_BCLOCKFLOAT		10		/* clock can float when screen scrolls? */
#define MC_BCLOCK_GADGETS	11		/* clock has gadgets? */
#define MC_BCLOCK_SECONDS	12		/* clock has seconds? */
#define MC_BMETER			13		/* meter on? */
#define MC_BSPLINES         14		/* splines blanking? */
#define MC_BQUICKBLANK		15		/* quick blanking on? */
#define MC_BSPEAKMESSAGES	16		/* speak messages? */
#define MC_BDEBUG			17		/* debug mode? */
#define MC_BBUTTONSWAP		18		/* swap left and right mouse buttons? */
#define MC_BHOLDQUALS		19		/* hold qualifiers? */
#define MC_BHOTKEYENABLED	20		/* hotkeys enabled? */
#define MC_BSEND_UPKEYS  	21		/* send up key after each down key? */
#define MC_BNOCAPSLOCK      22		/* disabled caps lock key? */
#define MC_BCLIP_REMOVELF	23		/* remove lf? */
#define MC_BCLIP_CRLF		24		/* lf to crlf? */
#define MC_BFREEZEVERT		25		/* no vertical movements? */
#define MC_BFREEZEHORZ		26		/* no horz movements */
#define MC_BKEYSOFF			27		/* no keys? */
//#define MC_BBORDERLESS		28		/* no border? */
//#define MC_BBORDERBOTTOM	29		/* border bottom */

#define MC_SUNMOUSE			(1 << MC_BSUNMOUSE)
#define MC_KEYACTIVATE		(1 << MC_BKEYACTIVATE)
#define MC_MOUSETOMENU		(1 << MC_BMOUSETOMENU)
#define MC_MENU_WRAP		(1 << MC_BMENU_WRAP)
#define MC_WINDOWCYCLE		(1 << MC_BWINDOWCYCLE)
#define MC_AUTO_POPTOP 		(1 << MC_BAUTO_POPTOP)
#define MC_KEYCLICK			(1 << MC_BKEYCLICK)
#define MC_CLOCK			(1 << MC_BCLOCK)
#define MC_VERTICALCLOCK	(1 << MC_BVERTICALCLOCK)
#define MC_CLOCKTOPWINDOW	(1 << MC_BCLOCKTOPWINDOW)
#define MC_CLOCKFLOAT		(1 << MC_BCLOCKFLOAT)
#define MC_CLOCK_GADGETS	(1 << MC_BCLOCK_GADGETS)
#define MC_CLOCK_SECONDS	(1 << MC_BCLOCK_SECONDS)
#define MC_METER			(1 << MC_BMETER)
#define MC_SPLINES			(1 << MC_BSPLINES)
#define MC_QUICKBLANK		(1 << MC_BQUICKBLANK)
#define MC_SPEAKMESSAGES	(1 << MC_BSPEAKMESSAGES)
#define MC_DEBUG			(1 << MC_BDEBUG)
#define MC_BUTTONSWAP		(1 << MC_BBUTTONSWAP)
#define MC_HOLDQUALS		(1 << MC_BHOLDQUALS)
#define MC_HOTKEYENABLED	(1 << MC_BHOTKEYENABLED)
#define MC_SEND_UPKEYS	 	(1 << MC_BSEND_UPKEYS)
#define MC_NOCAPSLOCK		(1 << MC_BNOCAPSLOCK)
#define MC_CLIP_REMOVELF	(1 << MC_BCLIP_REMOVELF)
#define MC_CLIP_CRLF		(1 << MC_BCLIP_CRLF)
#define MC_FREEZEVERT		(1 << MC_BFREEZEVERT)
#define MC_FREEZEHORZ		(1 << MC_BFREEZEHORZ)
#define MC_KEYSOFF			(1 << MC_BKEYSOFF)
//#define MC_BORDERLESS		(1 << MC_BBORDERLESS)
//#define MC_BORDERBOTTOM		(1 << MC_BBORDERBOTTOM)

/* Macro mo_Flags. These control action of individual macros */

#define MFLG_BAUTOEXEC		0	/* auto executing macro */
#define MFLG_BGLOBAL		1	/* accessible from all configurations? */
#define MFLG_BNONRECURSE	2	/* non-recursive */
#define MFLG_BGADGET		3	/* has a gadget in the clock */
#define MFLG_BRELATIVE		4	/* mouse moves relative to window le/te */
#define MFLG_BTEMP			5	/* temporary? do not save */
#define MFLG_BDISABLED		6	/* disabled? key passed through */
#define MFLG_BWRITEPROT		7	/* write protected. cannot record over it */
#define MFLG_BSUPPRESS_MSG	8	/* do not show Executing Macro */
#define MFLG_BRESUME		9	/* macro resume execution */
#define MFLG_BCOUNTDOWN		10	/* counting down (for "Later" alarms)  */
#define MFLG_BREXXMACRO		11	/* macro came from arexx */
#define MFLG_BWAIT_WINDOW	12	/* macro is waiting for a window */
#define MFLG_BRECURSE  		13	/* recursive. execute again */
#define MFLG_BRESERVED2		14	/*  */
#define MFLG_BRESERVED3		15	/*  */
#define MFLG_BRESERVED4		16	/*  */

#define MFLG_AUTOEXEC		(1 << MFLG_BAUTOEXEC)
#define MFLG_GLOBAL			(1 << MFLG_BGLOBAL)
#define MFLG_NONRECURSE		(1 << MFLG_BNONRECURSE)
#define MFLG_GADGET			(1 << MFLG_BGADGET)
#define MFLG_RELATIVE		(1 << MFLG_BRELATIVE)
#define MFLG_TEMP			(1 << MFLG_BTEMP)
#define MFLG_DISABLED		(1 << MFLG_BDISABLED)
#define MFLG_WRITEPROT		(1 << MFLG_BWRITEPROT)
#define MFLG_SUPPRESS_MSG	(1 << MFLG_BSUPPRESS_MSG)
#define MFLG_MACRO_TOGGLE	(1 << MFLG_BMACRO_TOGGLE)
#define MFLG_RESUME			(1 << MFLG_BRESUME)
#define MFLG_COUNTDOWN		(1 << MFLG_BCOUNTDOWN)
#define MFLG_REXXMACRO		(1 << MFLG_BREXXMACRO)
#define MFLG_WAIT_WINDOW	(1 << MFLG_BWAIT_WINDOW)
#define MFLG_RECURSE    	(1 << MFLG_BRECURSE)

/* Macro mo_Link.ln_Type */

#define NT_MACRO_SOLO   	250		/* only executes when no others are waiting */
#define NT_MACRO_RESUMEING	251		/* macro is resumeing execution */
#define NT_MACRO_READY		252		/* ready to execute */
#define NT_MACRO_RUNNING	253		/* is currently running */
#define NT_MACRO_WAITING	254		/* is waiting */

/* ml_MachForbid Flags */

#define MF_NOHANDLER		0x8000	/* forbid all handler action */

/* Interface sends these mm_Commands to MachV.
   mm_SubCommands are the general and mouse events listed above,
   that is, GE_RUNCLOCK, GE_LOADCONFIG, ME_MOUSEOFF etc. 
*/

#define MACHV_GENERAL_EVENT	1
#define MACHV_MOUSE_EVENT	2

/* MachV sends these mm_Commands to the interface */

#define IFACE_GOTKEY		1	/* if "KeyTask" is running and user clicked */
								/* on clock gadget */
#define IFACE_SCREENUP		2	/* interface screen front and up */
#define IFACE_UPDATE		4	/* update interface gadgets */
#define IFACE_DEBUG			8	/* debug msg. display malfunctioning hotkey */

/* with IFACE_UPDATE command, these mm_SubCommands */

#define UPDATE_CLIP_WINDOW	0x1
#define UPDATE_CLOCK_WINDOW	0x2
#define UPDATE_MFEAT_WINDOW	0x4
#define UPDATE_MISC_WINDOW	0x8
#define UPDATE_FLAGS_WINDOW	0x10
#define UPDATE_MACROS		0x20
#define UPDATE_ALL			0x40

/* CodeLetterTable is an array of IECODEs and the ascii letter used to 
   represent it. E = ESC, D = Del, u = up arrow etc. Numerics are special
   in that they change with the keyboard in use. When MachV is first run,
   these are setup.
*/

#define CT_FIRST_NUMERIC	24	/* index into ml_CLTable 1st numeric */
#define CT_LAST_NUMERIC		41	/* index for ml_CLTable last numeric */


/* all locale text. ml_AppStrings will point to these */

#ifndef STRINGARRAY
struct AppString
{
    LONG   as_ID;
    STRPTR as_Str;
};
#endif

/* message to and from interface */

struct MachMessage {
	struct Message	mm_Msg;
	UWORD		mm_Command;		/* MACHV_GENERAL_EVENT, MACHV_MOUSE_EVENT, */
								/* or IFACE_ command */
	ULONG		mm_SubCommand;	/* the GE_ or ME_ event, or UPDATE_ command */
	UWORD		mm_Code;		/* debug keycode */
	UWORD		mm_Qualifier;	/* its qualifier */
	UWORD		mm_MacroPos;	/* position in macro of error */
};


struct TaskInfo {
  struct Task	*Task;
  long  		 Sig;
};

/* string and its wildcard pattern */

struct StringPattern {
  char *sp_String;
  STRPTR sp_Pattern;
};

/* code and letter table. see above */

struct Code_Letter_Table {UBYTE  code;char letter;};

/* qualifier and letter table */

struct Qual_Letter_Table {UWORD  code;UWORD letter;};

/* Every macro has this struct */

struct MacroObject {
  struct Node    mo_Link;		/* for key and execution list linking */
  UWORD          mo_Position;	/* ordinal position (also long aligns) */
  long           mo_Size;		/* size of macro (including \0) */
  char			*mo_Macro;		/* the macro string! */
  char          *mo_ResumePos;	/* position in macro to resume at */
  APTR          *mo_Owner;		/* config owner or ARexx message ptr */
  char           mo_Name[MAX_MACRO_NAME]; /* mo_Link.ln_Name points here */
  UWORD          mo_Flags;		/* see MFLG_ above */
  UWORD          mo_Qual;		/* hotkey qualifier for this macro */
  UWORD          mo_Code;		/* hotkey code */
  WORD           mo_ExeCnt;		/* number of times this macro has executed */
  WORD           mo_DelayCnt;	/* how long to delay before re-executing */
  BYTE			 mo_ErrorCode;	/* this macro's error code */
  WORD           mo_LE;			/* only relevant when MFLG_GADGET is set. */
  WORD           mo_TE;			/*   " */
  UWORD          mo_GID;		/* (mo_Code << 8) | mo_Qual */
};

/* every configuration has one of these structs */

struct MachCfg {
  struct Node		 mc_Link;
  struct List		 mc_Hotkeys[MAXKEYS+1]; /* the configs hotkeys */
  struct Gadget		*mc_CustomGadgets; /* list of gadgets for clock */
  char  mc_Title[MAX_CFG_TITLE]; /* to match window, screen or program name */
  char  mc_Append[MAX_PASTE_APPEND+1];  /* text to append when pasting*/
  char  mc_Prepend[MAX_PASTE_APPEND+1]; /* text to prepend */
  char  mc_ClockFont[MAX_FILE_NAME]; /* null for default font */
  ULONG mc_Clocksignature;	/* signature using leftedge, topedge, type etc. */
  WORD  mc_Cost;			/* clock meter cost or time in minutes */
  WORD  mc_Position;		/* ordinal number of configuration. */
  WORD  mc_Registered;		/* 43 for registered version 4.3 */
  WORD  mc_Accel;			/* acceleration -9 to 9 */
  WORD  mc_Threshold;		/* acceleration threshold 0 to 9 */
  WORD  mc_Clickstofront;	/* number of clicks required */
  WORD  mc_Clockle;			/* clock left edge */
  WORD  mc_Clockte;
  WORD  mc_Clockwidth;
  WORD  mc_Clockheight;
  WORD  mc_Altle;			/* alternate (zoomed) left edge */
  WORD  mc_Altte;
  WORD  mc_Altwidth;
  WORD  mc_Altheight;
  WORD  mc_Timele;			/* left edge for time */
  WORD  mc_Timete;			/* top edge for time */
  WORD  mc_Timetext;		/* time pen for clock */
  WORD  mc_Timeback;		/* background pen */
  WORD  mc_Datedelay;		/* delay in seconds to show date */
  WORD  mc_Lowmem;			/* low memory alert in kbytes */
  WORD  mc_Hours;			/* 12 or 24 */
  WORD  mc_Rate;			/* rate for meter */
  WORD  mc_Blankdelay;		/* delay in seconds */
  WORD  mc_Blanklevel;		/* 0 to 15 */
  WORD  mc_Mouseoffdelay;	/* delay in seconds */
  WORD  mc_Normalpriority;	/* -127 to 127 */
  WORD  mc_Playbackpriority;
  WORD  mc_Playdelay;		/* delay between mouse moves during playback in 50ths */
  WORD  mc_Buffersize;		/* buffer size when recording */
  WORD  mc_Chardelay;		/* delay in 50ths of sec. when pasting*/
  WORD  mc_Linedelay;
  UWORD mc_MMB;				/* qualifiers to substitute for mmb */
  WORD  mc_MousePort;		/* 0 or 1 */
  WORD  mc_BeepVolume;		/* 0-64 */
  WORD  mc_KeyClickVolume;	/* 0-64 */
  WORD  mc_Clocktype;  		/* CLOCK_ONLY, CLOCK_PLUSMEMORY etc. */
  WORD  mc_ClockBorder;  	/* CLOCK_BORDERLESS, CLOCK_BORDER_RIGHT etc. */
  WORD  mc_DateFormat; 		/* FORMAT_DOS, FORMAT_INT, FORMAT_USA, FORMAT_CDN */
  WORD  mc_DateSeparator;	/* -, /, . etc. */
  WORD  mc_NextLE;  /* left edge for next gadget to be added */
  WORD  mc_NextTE;
  WORD  mc_Pad; 	/* ensure longword alignment from mc_Registered! */
  ULONG mc_Flags;	/* sunmouse, cycle, clock on, etc */
  struct StringPattern mc_SunWindows;	/* for windows that this will work in */
  struct StringPattern mc_KeyActWindows;
  struct StringPattern mc_AutoPopWindows;
  struct StringPattern mc_CycleWindows;
  struct StringPattern mc_MTMWindows;
  struct StringPattern mc_MenuWrapWindows;
  struct StringPattern mc_ClickWindows;
  struct StringPattern mc_ClockScreens;
};

/* the library base. Everything is accessible from here */

struct MachLibrary {
  struct       Library ml_Lib;
  ULONG        ml_SegList;
  ULONG        ml_Flags;
  APTR         ml_ExecBase;
  struct SignalSemaphore ml_BaseSemaphore; /* Semaphore to Obtain/Release */
  struct List	     ml_ConfigHead; 	/* The first configuration */
  struct MachCfg 	*ml_CurConfig;		/* The current configuration */
  struct List       *ml_MacroQueue;     /* Macros executing or waiting. */
  struct MsgPort    *ml_MsgPort;		/* MachV receives msgs here */
  struct Window     *ml_ClockWindow;	/* NULL if no clock */
  struct Window     *ml_InterfaceWindow;/* Pointer to interface window. */
  struct Window     *ml_ListWindow;		/* List window pointer if open */
  struct MsgPort    *ml_Interface_Port;	/* Interface receives msgs here */
  struct TaskInfo    ml_MachV_Task;		/* MachV itself! */
  struct TaskInfo    ml_Interface_Task;	/* User interface task */
  struct Task       *ml_List_Task;		/* Task spawned by mach.library */
  struct Task       *ml_ScrCloseTask;	/* Task currently closing a screen */
  struct AppString  *ml_AppStrings;		/* All text (localized) */
  struct Code_Letter_Table *ml_CLTable;	/* iecodes and their letters */
  char *ml_ListSelection;				/* last list selection */
  char *ml_TempMacroBuffer;			/* ptr to recording buffer */
  char *ml_Variable;				/* ptr to buffer MAX_VARIABLE in len */
  char *ml_VarName;					/* ptr to name of variable */
  char *ml_RegName;					/* ptr to registered users name/num */
  char *ml_Interface_Path;			/* path to interface */
  char  ml_PrefsDirName[MAX_DIR_NAME];  /* path to prefs */
  char  ml_PrefsFileName[MAX_FILE_NAME];/* name of pref file */
  char  ml_BeepFileName[MAX_DIR_NAME+MAX_FILE_NAME];
  char  ml_AlarmCommand[MAX_ALARM_COMMAND]; /* default echo >speak: */
  ULONG ml_MouseEvent;		/* MachV mouse events */
  ULONG ml_GeneralEvent;	/* MachV other events */
  ULONG ml_ReqKeyQual;		/* -1 = request key/qualifier from MachV */
  UWORD ml_GVF_Flags;		/* Flags for env variables. def = GVF_LOCAL_ONLY */
  WORD  ml_MachForbid;		/* Forbid the handler from doing anything! */
  WORD  ml_Recording;		/* Currently recording a macro. */
  WORD  ml_SuspendAll;		/* Suspend MachV */
  WORD  ml_HandlerPri;		/* priority of interrupt handler */
  UWORD ml_Trace;			/* Trace options. TRACE_SERIAL or TRACE_CONSOLE */
  UWORD ml_ScreenFlags;		/* SetMachV screen types desired */
  char *ml_TodaysDate;      /* e.g. 03-25-93 (updated every second) */
  char *ml_TodaysTime;      /* e.g. 17:45:29 (updated every second) */
  WORD  ml_Smle;			/* Left/Top edges of SetMachV windows */
  WORD  ml_Smte;
  WORD  ml_Cliple;
  WORD  ml_Clipte;
  WORD  ml_Mfeatle;
  WORD  ml_Mfeatte;
  WORD  ml_Cfeatle;
  WORD  ml_Cfeatte;
  WORD  ml_Miscle;
  WORD  ml_Miscte;
};

#endif

