/**************************************************************************
*  NAME: RawInfo                                               _          *
*  FUNCTION: Display infos about key pressed                _ //   _      *
*  WRITTEN BY: Piero Filippin (omega@sabrina.unipd.dei.it)  \X/ _ //   _  *
*                                                               \X/ _ //  *
*  This program is Public Domain (donation pleased)                 \X/   *
*                                                                         *
**************************************************************************/

#define CODETOQUIT 0x10
#define QUALIFIERTOQUIT (0x19|IEQUALIFIER_RELATIVEMOUSE)

extern void RawInsert(long code,long qualifier);
extern void RemoveHandler(void);
extern void InstallHandler(void);
extern void Print(char *string,BOOL newline);
extern char *ltoh(char *string,register long val);

extern BPTR _Backstdout;         /* standard output when run in background */
long _BackGroundIO = TRUE;       /* Flag to tell it we want to do I/O      */
long _stack = 1000;              /* Amount of stack space our task needs   */
char *_procname = "RawInfo";     /* The name of the task to create         */
long _priority = 1;              /* The priority to run us at              */

struct handlerdata {
	struct Task *thistask;
	short sigbit;
	UWORD code;
	UWORD qualifier;
};

struct handlerdata data;

void main (void) 
{
	char string[11];
	data.sigbit = AllocSignal(-1);
	data.thistask = FindTask(NULL);
	InstallHandler();

	Delay(2*50);

	Print("\n\nRaw Key Information v1.0 - by Piero Filippin\n",TRUE); 
	while(!( (data.code==CODETOQUIT) && (data.qualifier==QUALIFIERTOQUIT) )) {
		Wait(1<<data.sigbit);
		Print("Key Code        = ",FALSE);
		Print(ltoh(string,(long)data.code),FALSE);
		if (data.code & IECODE_UP_PREFIX) Print("    RELASED",FALSE); else Print("    PRESSED",FALSE);
		Print("\nKey Qualifier = ",FALSE);
		Print(ltoh(string,(long)data.qualifier),FALSE);
		Print(" - ",FALSE);
		if (data.qualifier&IEQUALIFIER_LSHIFT)     Print("LSHIFT ",FALSE);
		if (data.qualifier&IEQUALIFIER_RSHIFT)     Print("RSHIFT ",FALSE);
		if (data.qualifier&IEQUALIFIER_CAPSLOCK)   Print("CAPSLOCK ",FALSE);
		if (data.qualifier&IEQUALIFIER_CONTROL)    Print("CONTROL ",FALSE);
		if (data.qualifier&IEQUALIFIER_LALT)       Print("LALT ",FALSE);
		if (data.qualifier&IEQUALIFIER_RALT)       Print("RALT ",FALSE);
		if (data.qualifier&IEQUALIFIER_LCOMMAND)   Print("LCOMMAND ",FALSE);
		if (data.qualifier&IEQUALIFIER_RCOMMAND)   Print("RCOMMAND ",FALSE);
		if (data.qualifier&IEQUALIFIER_NUMERICPAD) Print("NUMERICPAD ",FALSE);
		if (data.qualifier&IEQUALIFIER_REPEAT)     Print("REPEAT ",FALSE);
		if (data.qualifier&IEQUALIFIER_INTERRUPT)  Print("INTERRUPT ",FALSE);
		if (data.qualifier&IEQUALIFIER_MIDBUTTON)  Print("MIDBUTTON ",FALSE);
		if (data.qualifier&IEQUALIFIER_RBUTTON)    Print("RBUTTON ",FALSE);
		if (data.qualifier&IEQUALIFIER_LEFTBUTTON) Print("LBUTTON ",FALSE);
		if (data.qualifier&IEQUALIFIER_RELATIVEMOUSE)  Print("RELATIVEMOUSE ",FALSE);
		if (data.qualifier&IEQUALIFIER_MULTIBROADCAST) Print("MULTIBROADCAST ",FALSE);
		Print("\n",TRUE);
	}
	Print("QUIT",TRUE);
	RemoveHandler();	
	Close(_Backstdout);
}

struct InputEvent *myhandler(struct InputEvent *event,struct handlerdata *data) {
	register struct InputEvent *ep, *lastevent;
	for (ep = event, lastevent = NULL; ep != NULL; ep = ep->ie_NextEvent) {
		if (ep->ie_Class == IECLASS_RAWKEY) {

			data->code = ep->ie_Code;
			data->qualifier = ep->ie_Qualifier;

			Signal(data->thistask,1<<data->sigbit);
/* Remove handled events
			if (lastevent == NULL) event = ep->ie_NextEvent; 
			else lastevent->ie_NextEvent = ep->ie_NextEvent; 
			lastevent = ep;
*/
		}
	}
	return(event);
}
