MAG Disk (Jun 1990) : source / PopUpMenu.h

#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 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 CLEAROLD     TRUE
#define DONTCLEAROLD FALSE

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

union FillTypes {
  APTR		    APTR;
  struct IntuiText *IText;
  struct Image	   *Image;
};

struct WindowData {
  BOOL	BitMapOk;
  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;
};

/* My functioms */

VOID		   WriteAndClose(STRPTR,ULONG);
VOID		   PopUpMainLoop(struct SignalData *, struct MsgPort *);
VOID		   PopUpMenu(struct SignalData *);
VOID		   QueueTimer(VOID);
VOID		   InitGlobals(VOID);
BOOL		   OpenMenuWindow(WORD);
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 WindowSize *,struct MenuItem *,LONG);
VOID		   CloseItemWindow(struct WindowData *);
VOID		   ToggleMenu(UWORD,struct Menu *);
VOID		   DrawAllItems(struct WindowData *);
VOID		   DrawMenuItem(struct MenuItem *, struct WindowData *, UWORD, BOOL);
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(struct MsgPort *);
struct IntuiMessage *BuildIntuiMsg(struct MsgPort *, ULONG, UWORD);
struct InputEvent *PopUpHandler(struct InputEvent *,struct SignalData *);
ULONG		   Mystrlen(STRPTR);
VOID		   SwapBits(struct WindowData *);

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