#include <intuition/intuitionbase.h>
#include <libraries/dosextens.h>
#include <workbench/workbench.h>
#include <devices/inputevent.h>
#include <workbench/startup.h>
#include <exec/interrupts.h>
#include <devices/input.h>
#include <exec/memory.h>

#include "mxmbase.h"

extern struct Library	*OpenLibrary();
extern struct MsgPort	*CreatePort();
extern struct MsgPort	*FindPort();
extern struct Message	*GetMsg();
extern struct Task	*FindTask();
extern void		*AllocMem();
extern struct IOStdReq	*CreateStdIO();
extern ULONG		 Wait();

#define PORTNAME	"KeyMacro"
#define REVISION	0

#define SIG_CLOSE	SIGBREAKF_CTRL_C
#define SIG_PORT	(1 << MSeg -> Port . mp_SigBit)

#define MK_UNUSED	0
#define MK_WORD		1
#define MK_COMMAND	2

#define MM_INPUT	0
#define MM_UPDATE	1
#define MM_EXECUTE	2

#define MAXMACROS	30

struct KeyAlias
{
	char	*ka_Name;
	ULONG	 ka_Key;
};

struct MacroKey
{
	UBYTE	 mk_Type;

	LONG	 mk_CommandKey;
	LONG	 mk_CommandQualifier;

	UBYTE	*mk_String;
	UBYTE	*mk_Window;
};

struct MacroMessage
{
	struct Message	 mm_Message;

	UBYTE		 mm_Type;

	struct MacroKey	*mm_MacroKey;

	LONG		 mm_NumMacros;
	struct MacroKey	*mm_MacroList;

	UBYTE		*mm_FileName;
	UBYTE		*mm_WindowName;
};

struct MSeg
{
	struct MsgPort	 Port;

	BPTR		 Segment;
	LONG		 SegSize;

	struct Task	*Father;
	struct Task	*Child;

	ULONG		 RingBack;
	UBYTE		 Revision;

	LONG		 NumMacros;
	struct MacroKey	*MacroList;
};
