/****************************************/ 
/*	Pointerz			*/
/*	  - a little demo that uses     */
/*	SetPointer() to create four     */
/*	animated pointers.              */
/*					*/
/*	Blake Freymann	4/2/87		*/
/*	CIS 73657,67			*/
/*					*/
/****************************************/



#include <intuall.h>

#define NUMWINS 4

struct IntuitionBase *IntuitionBase;
struct IntuiMessage *GetMsg();
struct IntuiMessage *message;
struct Window *OpenWindow();
struct InputEvent *Intuition();
struct Window *MyWindow[NUMWINS];

short i, mm, win;
ULONG Signals; /* for Wait() */
void findwindow();

/*******************************************************************/
/* Image Data (sprites)						   */
/*******************************************************************/

/* bird1.c */

UWORD Bird1Data[] =
{
0x0000,0x0000,

0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x07F0,0x0000,
0x0FF8,0x3000,
0x2FFC,0x57E0,
0x0FFE,0xF7F0,
0x07FA,0x83F0,
0x03FA,0x27F8,
0x01F8,0x19F8,
0x01F8,0x29F8,
0x01F8,0x01F8,
0x01F8,0x01F8,
0x0150,0x0150,
0x02A0,0x02A0,
0x0000,0x0000,

0x0000,0x0000
};

/* bird2.c */

UWORD Bird2Data[] =
{
0x0000,0x0000,

0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x07F0,0x0000,
0x0FF8,0x37F0,
0x2FFC,0x57F8,
0x0FFE,0xF7F8,
0x07FE,0x83FC,
0x01FE,0x25FE,
0x00FF,0x18FF,
0x0000,0x2800,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,

0x0000,0x0000
};


/* bird3.c */

UWORD Bird3Data[] =
{
0x0000,0x0000,

0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x001F,0x001F,
0x00FE,0x00FE,
0x07FE,0x03FE,
0x0FFC,0x37FC,
0x2FFC,0x57FC,
0x0FFE,0xF3F8,
0x07FA,0x8000,
0x0002,0x2400,
0x0000,0x1800,
0x0000,0x2800,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,

0x0000,0x0000
};


UWORD Bird4Data[] =
{
0x0000,0x0000,

0x03E0,0x03E0,
0x03F0,0x03F0,
0x01F8,0x01F8,
0x01F8,0x01F8,
0x01F8,0x01F8,
0x01F8,0x01F8,
0x01F8,0x01F8,
0x01F8,0x01F8,
0x07F0,0x03F0,
0x0FF0,0x33F0,
0x2FFE,0x50E0,
0x0FFC,0xF000,
0x07F0,0x8000,
0x0000,0x2400,
0x0000,0x1800,
0x0000,0x2800,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,

0x0000,0x0000
};


USHORT Face1Data[] =
{

0x0000,0x0000,

0x07C0,0x0000,
0x0FE0,0x0000,
0x1FF0,0x0000,
0x2388,0x1C70,
0x4104,0x3EF8,
0x0000,0x638C,
0x2288,0x638C,
0x8002,0x638C,
0xC106,0x3EF8,
0xE38E,0x1C70,
0xFFFE,0x0000,
0xF93E,0x0000,
0xF93E,0x0000,
0xFFFE,0x7838,
0x7FFC,0x3FF8,
0x77DC,0x1FF0,
0x783C,0x1FF0,
0x3FF8,0x0FE0,
0x1FF0,0x0380,
0x0FE0,0x0000,
0x07C0,0x0000,

0x0000,0x0000

};


USHORT Face2Data[] =
{
0x0000,0x0000,

0x07C0,0x0000,
0x0FE0,0x0000,
0x1FF0,0x0000,
0x2388,0x1C70,
0x4104,0x3EF8,
0x1860,0x7BEC,
0x3AE8,0x7BEC,
0x8002,0x638C,
0xC106,0x3EF8,
0xE38E,0x1C70,
0xFFFE,0x0000,
0xF93E,0x0000,
0xF93E,0x0000,
0xFFFE,0x0000,
0x7FFC,0x0FE0,
0x7FFC,0x1FF0,
0x783C,0x1FF0,
0x3FF8,0x0FE0,
0x1FF0,0x0380,
0x0FE0,0x0000,
0x0700,0x0000,

0x0000,0x0000
};


USHORT Face3Data[] =
{
0x0000,0x0000,

0x07C0,0x0000,
0x0FE0,0x0000,
0x1FF0,0x0000,
0x2388,0x1C70,
0x4104,0x3EF8,
0x0C30,0x6FBC,
0x1E78,0x5F7C,
0x8002,0x638C,
0xC106,0x3EF8,
0xE38E,0x1C70,
0xFFFE,0x0000,
0xF93E,0x0000,
0xF93E,0x0000,
0xFFFE,0x0000,
0x7FFC,0x0FE0,
0x7FFC,0x1C70,
0x783C,0x3FF8,
0x3FF8,0x3FF8,
0x1FF0,0x0380,
0x0FE0,0x0000,
0x07C0,0x0000,

0x0000,0x0000

};

USHORT Face4Data[] =
{

0x0000,0x0000,

0x07C0,0x0000,
0x0FE0,0x0000,
0x1FF0,0x0000,
0x2388,0x1C70,
0x4104,0x3EF8,
0x0410,0x679C,
0x0E38,0x4F3C,
0x8C32,0x6FBC,
0xC106,0x3EF8,
0xE38E,0x1C70,
0xFFFE,0x0000,
0xF93E,0x0000,
0xF11E,0x0280,
0xFFFE,0x0000,
0x7FFC,0x0FE0,
0x7FFC,0x1FF0,
0x7FFC,0x1830,
0x3838,0x1FF0,
0x1FF0,0x0FE0,
0x0FE0,0x0000,
0x07C0,0x0000,

0x0000,0x0000

};


USHORT Fish1Data[] =
{
0x0000,0x0000,

0x0000,0x0000,
0x0000,0x0000,
0xF800,0xF800,
0xF700,0xCF00,
0xE780,0xDF80,
0xC7C0,0xFFC0,
0xFFE0,0xFFE0,
0xFFF0,0xFFF0,
0x7FF0,0x0070,
0x7FF0,0x7FF0,
0x3FF0,0x01F0,
0x3FF0,0x3FF0,
0x1FE0,0x03E0,
0x0FC0,0x0FC0,
0x07FF,0x07FF,
0x007F,0x0003,
0x007E,0x007E,
0x007C,0x000C,
0x0078,0x0078,
0x0070,0x0030,
0x0060,0x0060,

0x0000,0x0000
};

USHORT Fish2Data[] =
{
0x0000,0x0000,

0xF800,0xF800,
0xFF00,0xFF00,
0xF780,0xCF80,
0xE7C0,0xDFC0,
0xC7E0,0xFFE0,
0xFFF0,0xFFF0,
0x7FF0,0x0070,
0x7FF0,0x7FF0,
0x3FF0,0x01F0,
0x3FFF,0x3FFF,
0x1FFF,0x0383,
0x0FFE,0x0FFE,
0x07FC,0x078C,
0x0078,0x0078,
0x0070,0x0030,
0x0060,0x0060,
0x0040,0x0040,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,

0x0000,0x0000
};

USHORT Fish3Data[] =
{
0x0000,0x0000,

0x0000,0x0000,
0x0000,0x0000,
0x1F00,0x1F00,
0x7F80,0x7F80,
0xF7C0,0xEFC0,
0xE7C0,0xDFC0,
0xE7E0,0xDFE0,
0xDFF0,0xF870,
0xFFF0,0xE7F0,
0xFFF0,0x99F0,
0x7FF0,0x67F0,
0x3FF8,0x1BB8,
0x3FFE,0x27C6,
0x0FFF,0x0FBB,
0x007F,0x004F,
0x007C,0x003C,
0x0070,0x0070,
0x0060,0x0060,
0x0000,0x0000,
0x0000,0x0000,
0x0000,0x0000,

0x0000,0x0000

};

USHORT Fish4Data[] =
{
0x0000,0x0000,

0x0000,0x0000,
0x001F,0x001F,
0x00EF,0x00F3,
0x01E7,0x01FB,
0x03E3,0x03FF,
0x07FF,0x07FF,
0x0FFF,0x0FFF,
0x0FFE,0x0E00,
0x0FFE,0x0FFE,
0x0FFC,0x0F80,
0x0FFC,0x0FFC,
0x07F8,0x07C0,
0x03F0,0x03F0,
0xFFE0,0xFFE0,
0xFE00,0xC000,
0x7E00,0x7E00,
0x3E00,0x3000,
0x1E00,0x1E00,
0x0E00,0x0C00,
0x0600,0x0600,
0x0000,0x0000,

0x0000,0x0000

};


USHORT Dodo1Data[] =
{
0x0000,0x0000,

0x1FE0,0x1C00,
0x7E60,0x7F80,
0xFE70,0xFF80,
0xFFF0,0xFE00,
0x7FE0,0x7E00,
0x1FC0,0x1800,
0x1FF0,0x0000,
0x3FF8,0x0000,
0x3DF8,0x0200,
0x7CFC,0x0300,
0x79FC,0x0600,
0x73FC,0x0C00,
0x73FC,0x0C00,
0x7804,0x07F8,
0x3FF8,0x0000,
0x3FF8,0x0600,
0x1FF0,0x0C00,
0x1FE0,0x1800,
0xF83C,0xF83C,
0xA83A,0xA83A,
0x2C29,0x2C29,

0x0000,0x0000

};

USHORT Dodo2Data[] =
{
0x0000,0x0000,

0x0FF0,0x0C00,
0x1F30,0x1FC0,
0x7F38,0x7FC0,
0x7FF8,0x7F00,
0x3FF0,0x3F00,
0x0FE0,0x0C00,
0x07F0,0x0000,
0x3FF8,0x0000,
0x3DF8,0x0200,
0x7CFC,0x0300,
0x79FC,0x0600,
0x73FC,0x0C00,
0x73FC,0x0C00,
0x7804,0x07F8,
0x3FF8,0x0000,
0x3FF8,0x0200,
0x1FF0,0x0600,
0x1FF0,0x0C10,
0x1F7C,0x1F7C,
0x1554,0x1554,
0x1554,0x1554,

0x0000,0x0000

};

USHORT Dodo3Data[] =
{
0x0000,0x0000,

0x03FC,0x0300,
0x07CE,0x07F0,
0x1FCE,0x1FF0,
0x1FFE,0x1FC0,
0x0FFC,0x0F80,
0x03F8,0x0300,
0x07F0,0x0000,
0x3FF8,0x0000,
0x3DF8,0x0200,
0x7CFC,0x0300,
0x79FC,0x0600,
0x73FC,0x0C00,
0x73FC,0x0C00,
0x7804,0x07F8,
0x3FF8,0x0000,
0x3FF8,0x0200,
0x1FF0,0x0200,
0x1FF0,0x0200,
0x07F0,0x07F0,
0x05D0,0x05D0,
0x05D0,0x05D0,

0x0000,0x000
};


USHORT Dodo4Data[] =
{
0x0000,0x0000,

0x07FC,0x0000,
0x18E2,0x07FC,
0x18E2,0x07FC,
0x1FFE,0x01F0,
0x0FFC,0x03F8,
0x07F8,0x01F0,
0x0FF0,0x00E0,
0x3FF8,0x0040,
0x3FF8,0x0000,
0x7F3C,0x00C0,
0x7F3C,0x00C0,
0x7F7C,0x0080,
0x7EFC,0x0100,
0x7E04,0x01F8,
0x3FF8,0x0000,
0x3FF8,0x0000,
0x1FF0,0x0810,
0x3FF8,0x3008,
0x500A,0x500A,
0xA815,0xA815,
0x2414,0x2414,

0x0000,0x0000

};

/* four pointers - each pointer has four images */
UWORD *BirdData[]={Bird1Data,Bird2Data,Bird3Data,Bird4Data};
UWORD *FaceData[]={Face1Data,Face2Data,Face3Data,Face4Data};
UWORD *FishData[]={Fish1Data,Fish2Data,Fish3Data,Fish2Data};
UWORD *DodoData[]={Dodo1Data,Dodo2Data,Dodo3Data,Dodo4Data};

UWORD **Data[]={BirdData,FaceData,FishData,DodoData};

/*******************************************************************/
/* struct for all four windows.  individual titles and pointerimage */
/* 	filled in below.       				*/
/*******************************************************************/
struct NewWindow nw = {
           0, 0,                 /* start position               */
           172, 40,               /* width, height                */
           -1, -1,                 /* detail pen, block pen        */
           CLOSEWINDOW|MOUSEMOVE|ACTIVEWINDOW|INACTIVEWINDOW,
                                    /* IDCMP flags                  */
           WINDOWDEPTH|WINDOWCLOSE|REPORTMOUSE|ACTIVATE|WINDOWDRAG,    
                                   /* window flags                 */
           NULL,                   /* pointer to first user gadget */
           NULL,                   /* pointer to user checkmark    */ 
           NULL,          /* window titles filled in below         */ 
           NULL,                   /* pointer to screen            */
            NULL,                   /* pointer to superbitmap       */
           0,0,0,0,          /* UNsized window */
           WBENCHSCREEN            /* type of screen in which to open */   
  };


main()
{

    if ((IntuitionBase = (struct IntuitionBase *)
		OpenLibrary("intuition.library", 0)) == 0){
	printf("Couldn't open intuition.library!");
	mycleanup();
    }

/*******************************************************************/
/* fill in each window position and title, and open it.		*/
/*******************************************************************/

    for (win=0;win<NUMWINS;++win){		
	    switch(win){
		case(0):
			nw.LeftEdge=40;
			nw.TopEdge=40;
			nw.Title="BirdPointer";
			break;
		case(1):
			nw.LeftEdge=nw.LeftEdge+nw.Width+10;
			nw.Title="FacePointer";
			break;

		case(2):
			nw.LeftEdge=40;
			nw.TopEdge=nw.TopEdge+50;
			nw.Title="FishPointer";
			break;
		case(3):
			nw.LeftEdge=nw.LeftEdge+nw.Width+10;
			nw.Title="DodoPointer";
			break;
		default:
			break;
	    }
	
	    if ((MyWindow[win] = (struct Window *)OpenWindow(&nw))==0){
		printf("Couldn't open a window.");
		mycleanup();
	    }
    }	

/* start with Dodo window active */
	
	win=3;
	SetPointer(MyWindow[win],Data[win][i],21,16,0,-7);

/*******************************************************************/
/* forever deal with mouse activities */
/*******************************************************************/
	for(;;){
		Wait(1<<MyWindow[win]->UserPort->mp_SigBit);
		while (message=GetMsg(MyWindow[win]->UserPort)){		
			switch(message->Class){
			case(CLOSEWINDOW):
				ReplyMsg(message);
				mycleanup();
				break;
			case(MOUSEMOVE):
				mm=1;
				ReplyMsg(message);
				break;
			case(INACTIVEWINDOW):   /* mouse clicked elsewhere! */
				ReplyMsg(message);
				findwindow();
				break;
			default:
				ReplyMsg(message);
				break;
			}
		}
/*******************************************************************/
/* no more messages - if mouse moved, change the pointer image! */
/*******************************************************************/
		if(mm==1){
			i=(i+1)%4;
			SetPointer(MyWindow[win],Data[win][i],21,16,0,-7);
			mm=0;
		}	
	} /*for(;;)*/
} /*main*/

/*******************************************************************/
/* Wait until mouse is clicked on one of our windows. */
/*******************************************************************/
void findwindow(){
    for(;;){
	Signals=Wait((1 << MyWindow[0]->UserPort->mp_SigBit)|
	(1 << MyWindow[1]->UserPort->mp_SigBit)|
	(1 << MyWindow[2]->UserPort->mp_SigBit)|
	(1 << MyWindow[3]->UserPort->mp_SigBit));

     for(win=0;win<NUMWINS;++win){
	 while((Signals)&(1 << MyWindow[win]->UserPort->mp_SigBit)){
	   if(((message=GetMsg(MyWindow[win]->UserPort))->Class)==ACTIVEWINDOW){
		    ReplyMsg(message);
		    return;
	   }
	   else ReplyMsg(message);	
	 }
       }
    }/*for(;;)*/
}/*findwindow()*/		

/*******************************************************************/
/* Clean up loose ends (most done by intuition?) */
/*******************************************************************/
mycleanup(){
for(win=0;win<NUMWINS;win++){ 
	while(message=GetMsg(MyWindow[win]->UserPort))ReplyMsg(message);
	ClearPointer(MyWindow[win]);
	if (MyWindow[win]) CloseWindow(MyWindow[win]);
}
if (IntuitionBase) CloseLibrary (IntuitionBase);
exit();
}


