/*
 *
 * Plop up roetine, maakt het mogelijk om een programma te laten slapen
 * en met de left A toets wakker te maken
 *
 */

#include "Calc.h"

#define	Qcode	0x10
#define Ccode	0x33

struct InputEvent __regargs *handlerinterface(ev,mm)
struct InputEvent *ev;
register hand_d *mm;
{
	register struct InputEvent *ep, *last;

	for (ep=ev, last=NULL; ep!=NULL; ep=ep->ie_NextEvent)
	{
	  if ((ep->ie_Class==IECLASS_RAWKEY) &&
	     ((ep->ie_Code ==Qcode) || (ep->ie_Code ==Ccode)) &&
	     (ep->ie_Qualifier & IEQUALIFIER_LCOMMAND))
	     {
	       if (last==NULL)
		  ev=ep->ie_NextEvent;
	       else
		  last->ie_NextEvent=ep->ie_NextEvent;
	       if (ep->ie_Code==Qcode)
		  Signal(mm->mtask,mm->quitsig);
	       else
		  Signal(mm->mtask,mm->plopupsig);
	      }
	  else
	      if ((ep->ie_Class==IECLASS_RAWMOUSE)&&
	          (ep->ie_Code==IECODE_NOBUTTON))
		  Signal(mm->mtask,mm->muissig);
	      last=ep;
	}
	return(ev);
}

struct	IntuitionBase	*IntuitionBase=NULL;
struct	MsgPort			*inputDevPort=NULL;
struct	IOStdReq		*inputRequestBlock=NULL;
struct	Interrupt		handlerStuff;
hand_d					mijn_hand={0,0,0,0,-1,-1,-1};
long					signals;
short					error=1;

extern long				Doe_um();
extern long				Wait();
extern struct MsgPort	*CreatePort();
extern struct IOStdreq	*CreateStdIO();
extern struct Task		*FindTask();
short					flag=0;

void het_tocht()
{
	if (flag) {
	inputRequestBlock->io_Command=IND_REMHANDLER;
	DoIO(inputRequestBlock); }
	if (IntuitionBase)	CloseLibrary(IntuitionBase);
	if (mijn_hand.plopupbit != -1)
				FreeSignal(mijn_hand.plopupbit);
	if (mijn_hand.quitbit != -1)
				FreeSignal(mijn_hand.quitbit);
	if (mijn_hand.muisbit != -1)
				FreeSignal(mijn_hand.muisbit);
	if (!error)		CloseDevice(inputRequestBlock);
	if (inputRequestBlock)	DeleteStdIO(inputRequestBlock);
	if (inputDevPort)	DeletePort(inputDevPort);
	exit(0);
}

void open_de_deur()
{
	if ((IntuitionBase=(struct IntuitionBase *)
		OpenLibrary("intuition.library",0L))==NULL)
		het_tocht();
	mijn_hand.mtask=FindTask(0L);
	if ((inputDevPort=CreatePort(0L,0L))==NULL)
		het_tocht();
	if ((inputRequestBlock=CreateStdIO(inputDevPort))==NULL)
		het_tocht();
	if ((mijn_hand.plopupbit=AllocSignal(-1L))==-1)
		het_tocht();
	if ((mijn_hand.quitbit=AllocSignal(-1L))==-1)
		het_tocht();
	if ((mijn_hand.muisbit=AllocSignal(-1L))==-1)
		het_tocht();
	if ((error=OpenDevice("input.device",0L,inputRequestBlock,0L))!=NULL)
		het_tocht();
	mijn_hand.plopupsig = 1L<<mijn_hand.plopupbit;
	mijn_hand.quitsig = 1L<<mijn_hand.quitbit;
	mijn_hand.muissig = 1L<<mijn_hand.muisbit;
	handlerStuff.is_Data=(APTR)&mijn_hand;
	handlerStuff.is_Code=(void *)handlerinterface;
	handlerStuff.is_Node.ln_Pri=51;
	inputRequestBlock->io_Command=IND_ADDHANDLER;
	inputRequestBlock->io_Data=(APTR)&handlerStuff;
}

void _main()
{
	long gmdt;	/* geef me de tweeendertig */
	open_de_deur();

	DoIO(inputRequestBlock);
	flag=-1;
	signals=mijn_hand.plopupsig|mijn_hand.quitsig;

	for (;;)	/* For ever and ever */
	{
	  gmdt=Wait(signals);

	  if (gmdt & mijn_hand.plopupsig)
	       gmdt=Doe_um(&mijn_hand); 

	  if (gmdt & mijn_hand.quitsig) het_tocht();
	}
}
