#define ABSEXECBASE ((struct ExecBase **)4L)

/* this is for lattice bug with 16-bit ints */
#undef	RMBTRAP
#define RMBTRAP 0x00010000L

/* this is for missing limits */
#define WORD_MIN   SHRT_MIN
#define WORD_MAX   SHRT_MAX
#define UWORD_MIN  USHRT_MIN
#define UWORD_MAX  USHRT_MAX

/* this is for bug in AddSemaphore */
#undef AddSemaphore
#define AddSemaphore(SS) InitSemaphore(SS),\
			 Enqueue(&((*ABSEXECBASE)->SemaphoreList),\
				 &((SS)->ss_Link))

/* this is a fake intuimessage-class used to quit the popupmenu program */
#define QUITPOPUPMENU	   0

#define HIGHLIGHTON	   0
#define HIGHLIGHTOFF	   1

#define BORDERSIZE	   2
#define OVERLAP 	   7

#define AND		  &&
#define OR		  ||

#define ITEMWINDOW 0
#define SUBWINDOW  SHRT_MAX
/* used for drawing commandkeys */
#define LORESSCREEN	  TRUE
#define HIRESSCREEN	  FALSE

/* used by DrawMenuItem */
#define SELECTFILL   1
#define ITEMFILL     0

#define VERIFYOK   0x0001
#define QUIT	   0x0002

struct WindowSize {
  WORD Left, Top, Right, Bottom;
};

struct WindowData {
  BOOL	BitMapOk;
  BOOL	ItemsEnabled;
  WORD	LeftEdge, TopEdge;
  WORD	RightEdge, Bottom;
  WORD	Width, Height;
  WORD	TopValue, LeftValue;
  struct MenuItem *Items;
  struct BitMap Bm;
};

struct SignalData {
  struct Task *PopUpMenuTask;
  LONGBITS MenuUpSig;
  LONGBITS MenuDownSig;
  LONGBITS MouseMovedSig;
  LONGBITS SelectDownSig;
  BOOL	Down;
};

struct MenuSort {
  struct MenuSort *Next;
  struct Menu	  *MenuPtr;
};

/* My functioms */

VOID		   InitPopUpMenu(VOID);
VOID		   WriteAndClose(STRPTR,ULONG);
VOID		   PopUpMainLoop(struct SignalData *);
struct MsgPort	  *MyCreatePort(STRPTR);
VOID		   MyDeletePort(struct MsgPort *);
VOID		   PopUpMenu(struct SignalData *);
VOID		   QueTimer(VOID);
VOID		   InitGlobals(VOID);
BOOL		   OpenMenuWindow(WORD);
VOID		   DrawAllMenues(VOID);
VOID		   HighLightItem(struct MenuItem *, struct WindowData *, UWORD);
VOID		   HighLightCurrItemBehind(UWORD);
struct MenuItem   *FindMouseItem(struct WindowData *);
VOID		   SelectItem(VOID);
VOID		   OpenItemWindow(struct WindowData *, struct WindowData *, WORD, UWORD);
VOID		   CheckItemSize(struct MenuItem *, APTR);
VOID		   CloseItemWindow(struct WindowData *);
VOID		   ToggleMenu(UWORD,struct Menu *);
VOID		   DrawAllItems(struct WindowData *);
VOID		   DrawMenuItem(struct MenuItem *, struct WindowData *, UWORD);
struct Menu	  *FindMenuPtr(UWORD);
WORDBITS	   FinalSelect(VOID);
VOID		   CheckMark(struct MenuItem *, struct MenuItem *);
UWORD		   FindItemNr(struct MenuItem *, struct MenuItem *);
VOID		   TellWindow(WORDBITS);
BOOL		   BuildBitMap(struct WindowData *);
VOID		   ClearWindow(struct WindowData *);
VOID		   RemoveBitMap(struct WindowData *);
BOOL		   MouseInWindow(struct WindowData *);
WORD		   SendMessage(VOID);
struct IntuiMessage *BuildIntuiMsg(struct MsgPort *, ULONG, UWORD);
struct InputEvent *PopUpHandler(struct InputEvent *, struct SignalData *);
VOID		   MySetMenuStrip();
VOID		   MyClearMenuStrip();
VOID		   MyOnMenu();
VOID		   MyOffMenu();
ULONG		   Mystrlen(STRPTR);
VOID		   SwapBits(struct WindowData *);
BOOL		   FindWindow(VOID);
VOID		   FindItemWinSize(struct WindowData *, UWORD);
VOID		   PosItemWinLeft(struct WindowData *, struct WindowData *, UWORD);
VOID		   PosItemWinTop(struct WindowData *, WORD);

#define DeleteStdIO(IOReq) FreeMem((IOReq),sizeof(struct IOStdReq))

