/*
				Strink.c

	This is a simple program which opens a window with a close gadget
	and a strink gadget which will make the window strink to an icon.

				  by

			      David Annett
			    3 Sutherland Ave,
			       Upper Hutt,
			      New Zealand.

			     © 25 June 1989

*/

#include "exec/types.h"
#include <exec/memory.h>

#include "graphics/gfx.h"
#include "libraries/dos.h"
#include "intuition/intuition.h"

#include "proto/graphics.h"
#include "proto/exec.h"
#include "proto/intuition.h"
#include "proto/dos.h"

extern struct Library *OpenLibrary();
extern VOID CloseLibrary ();

USHORT *TempPtr, *StrinkDatPtr, StrinkData []=
    {
    0xFFFF,
    0xFC3F,
    0xFC3F,
    0xFC3F,
    0xC003,
    0xF00F,
    0xFC3F,
    0xFFFF,
    /**/
    0x0000,
    0x03C0,
    0x03C0,
    0x03C0,
    0x3FFC,
    0x0FF0,
    0x03C0,
    0x0000
    };

struct Image StrinkImage =
    {
    0,0,			/* left, top			*/
    16,8,2,			/* width, height, depth		*/
    &StrinkData[0],		/* image data set by program	*/
    0x3,0x0,			/* Plane Pick, Plane On Off	*/
    NULL			/* Next Image			*/
    };

#define IconXsize 79
#define IconYsize 56

USHORT *IconDatPtr, IconData []=
    {
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFBEF, 0xFFFF, 0x7FFF, 0xFFFF, 0xFFFF,
0xFBEF, 0xFFFF, 0x7FFF, 0xFFFF, 0xFFFF,
0xFDE1, 0xBD83, 0x0DEE, 0x383F, 0xFFFF,
0xFEEF, 0xBD7F, 0x7DED, 0xF77F, 0xFFFF,
0xFF6F, 0xBD7F, 0x7DED, 0xF6FF, 0xFFFF,
0xFF6F, 0xBD7F, 0x7DED, 0xF7FF, 0xFFFF,
0xF0F1, 0xC383, 0x8E1D, 0xF83F, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0x82E8, 0x2E82, 0x0831, 0xBBFF,
0xFFFF, 0xEE6E, 0xEEEF, 0xBEEE, 0x9BFF,
0xFFFF, 0xEEAE, 0xEEEF, 0xBEEE, 0xABFF,
0xFFFF, 0xEECE, 0xEEEF, 0xBEEE, 0xB3FF,
0xFFFF, 0x82EE, 0xF183, 0xB831, 0xBBFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xC61C, 0x61BA, 0x0C70, 0xFFFF,
0xFFFF, 0xBEEB, 0xAEBB, 0xBBAF, 0xFFFF,
0xFFFF, 0xA218, 0x2183, 0xBBF1, 0xFFFF,
0xFFFF, 0xBADB, 0xAFBB, 0xBBBE, 0xFFFF,
0xFFFF, 0xC6EB, 0xAFBA, 0x0C61, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0x82E8, 0x31FF, 0xFFFF, 0xFFFF,
0xFFFF, 0xBF5B, 0xEEFF, 0xFFFF, 0xFFFF,
0xFFFF, 0x87B8, 0x6FFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xBF5B, 0xEEFF, 0xFFFF, 0xFFFF,
0xFFFF, 0x82E8, 0x31FF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0x871B, 0xA1C7, 0x183F, 0xFFFF,
0xFFFF, 0xBAE9, 0x2EBA, 0xEEFF, 0xFFFF,
0xFFFF, 0x86EA, 0xA1BA, 0xEEFF, 0xFFFF,
0xFFFF, 0xB6EB, 0xAEBA, 0xEEFF, 0xFFFF,
0xFFFF, 0xBB1B, 0xA0C7, 0x1EFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0x82E8, 0x71BB, 0x0831, 0xBBFF,
0xFFFF, 0xBF5B, 0xAE9A, 0xFEEE, 0x9BFF,
0xFFFF, 0x87B8, 0x60AB, 0x1EEE, 0xABFF,
0xFFFF, 0xBF5B, 0xEEB3, 0xEEEE, 0xB3FF,
0xFFFF, 0x82EB, 0xEEBA, 0x1831, 0xBBFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFF86, 0x182E, 0xFFFF, 0x7630, 0xC1FF,
0xFFBA, 0xEBEE, 0xFFFF, 0x25D7, 0x5FFF,
0xFF86, 0x1875, 0xFFFF, 0x55D0, 0xC3FF,
0xFFBE, 0xDBF5, 0xFFFF, 0x75D6, 0xDFFF,
0xFFBE, 0xE83B, 0xFFFF, 0x7637, 0x41FF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
/* Second bit plane */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0410, 0x0000, 0x8000, 0x0000, 0x0000,
0x0410, 0x0000, 0x8000, 0x0000, 0x0000,
0x021E, 0x427C, 0xF211, 0xC7C0, 0x0000,
0x0110, 0x4280, 0x8212, 0x0880, 0x0000,
0x0090, 0x4280, 0x8212, 0x0900, 0x0000,
0x0090, 0x4280, 0x8212, 0x0800, 0x0000,
0x0F0E, 0x3C7C, 0x71E2, 0x07C0, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7D17, 0xD17D, 0xF7CE, 0x4400,
0x0000, 0x1191, 0x1110, 0x4111, 0x6400,
0x0000, 0x1151, 0x1110, 0x4111, 0x5400,
0x0000, 0x1131, 0x1110, 0x4111, 0x4C00,
0x0000, 0x7D11, 0x0E7C, 0x47CE, 0x4400,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x39E3, 0x9E45, 0xF38F, 0x0000,
0x0000, 0x4114, 0x5144, 0x4450, 0x0000,
0x0000, 0x5DE7, 0xDE7C, 0x440E, 0x0000,
0x0000, 0x4524, 0x5044, 0x4441, 0x0000,
0x0000, 0x3914, 0x5045, 0xF39E, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7D17, 0xCE00, 0x0000, 0x0000,
0x0000, 0x40A4, 0x1100, 0x0000, 0x0000,
0x0000, 0x7847, 0x9000, 0x0000, 0x0000,
0x0000, 0x40A4, 0x1100, 0x0000, 0x0000,
0x0000, 0x7D17, 0xCE00, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x78E4, 0x5E38, 0xE7C0, 0x0000,
0x0000, 0x4516, 0xD145, 0x1100, 0x0000,
0x0000, 0x7915, 0x5E45, 0x1100, 0x0000,
0x0000, 0x4914, 0x5145, 0x1100, 0x0000,
0x0000, 0x44E4, 0x5F38, 0xE100, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x7D17, 0x8E44, 0xF7CE, 0x4400,
0x0000, 0x40A4, 0x5165, 0x0111, 0x6400,
0x0000, 0x7847, 0x9F54, 0xE111, 0x5400,
0x0000, 0x40A4, 0x114C, 0x1111, 0x4C00,
0x0000, 0x7D14, 0x1145, 0xE7CE, 0x4400,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x03FF, 0xFFFF, 0xC003, 0xFFFF, 0xFFC0,
0x0386, 0x182E, 0xC003, 0x7630, 0xC1C0,
0x03BA, 0xEBEE, 0xC003, 0x25D7, 0x5FC0,
0x0386, 0x1875, 0xC003, 0x55D0, 0xC3C0,
0x03BE, 0xDBF5, 0xC003, 0x75D6, 0xDFC0,
0x03BE, 0xE83B, 0xC003, 0x7637, 0x41C0,
0x03FF, 0xFFFF, 0xC003, 0xFFFF, 0xFFC0,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000
   }; 
struct Image IconImage =
    {
    0,0,			/* left, top			*/
    IconXsize,IconYsize,2,	/* width, height, depth		*/
    &StrinkData[0],		/* image data set by program	*/
    0x3,0x0,			/* Plane Pick, Plane On Off	*/
    NULL			/* Next Image			*/
    };

struct Gadget StrinkGadget =
    {
    NULL,			/* Next gadget			*/
    0,-8,16,8,			/* left, top, width, height	*/
    GADGHCOMP|GADGIMAGE|GRELBOTTOM, /* flags			*/
    RELVERIFY,			/* activation flags		*/
    BOOLGADGET,			/* gadget type			*/
    &StrinkImage,		/* gadget render		*/
    NULL,			/* select render		*/
    NULL,			/* gadget's IntuiText		*/
    NULL,			/* mutual exclude		*/
    NULL,			/* special info			*/
    NULL,			/* gadget id			*/
    NULL			/* user data			*/
    };

struct Gadget IconGadget =
    {
    NULL,			/* Next gadget			*/
    0,0,0,0,			/* left, top, width, height	*/
    GADGHCOMP|GADGIMAGE|GRELWIDTH|GRELHEIGHT, /* flags			*/
    GADGIMMEDIATE,		/* activation flags		*/
    WDRAGGING,			/* gadget type			*/
    &IconImage,			/* gadget render		*/
    NULL,			/* select render		*/
    NULL,			/* gadget's IntuiText		*/
    NULL,			/* mutual exclude		*/
    NULL,			/* special info			*/
    NULL,			/* gadget id			*/
    NULL			/* user data			*/
    };

struct NewWindow nw={
   180,20,
   200,40,
   0,1,
   CLOSEWINDOW | GADGETUP,
   WINDOWDEPTH|WINDOWCLOSE|WINDOWDRAG|WINDOWSIZING|SMART_REFRESH,
   &StrinkGadget,
   NULL,
   "Strink",
   NULL,
   NULL,
   10,20,
   640,256,
   WBENCHSCREEN};

struct NewWindow iw={
   100,100,
   IconXsize,IconYsize,
   0,1,
   GADGETDOWN,
   BORDERLESS|SMART_REFRESH,
   &IconGadget,
   NULL,
   NULL,
   NULL,
   NULL,
   0,0,0,0,
   WBENCHSCREEN};

struct Window *w;
struct RastPort *rp;
struct IntuiMessage *wmsg, *iwmsg;
extern void CleanUp();
extern void StrinkWindow();

void main()
{
ULONG Count, mClass;

  if(!(IntuitionBase=(struct IntuitionBase *)
	OpenLibrary("intuition.library",0)))
    CleanUp();
  if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0)))
    CleanUp();
  if(!(StrinkDatPtr=(APTR)AllocMem(sizeof(StrinkData),MEMF_CHIP))) CleanUp();
  TempPtr = StrinkDatPtr;
  for (Count = 0;Count < sizeof(StrinkData)/2;Count++)
	{
	*TempPtr++ = StrinkData[Count];
	}
  StrinkImage.ImageData = StrinkDatPtr;
  if(!(IconDatPtr=(APTR)AllocMem(sizeof(IconData),MEMF_CHIP))) CleanUp();
  TempPtr = IconDatPtr;
  for (Count = 0;Count < sizeof(IconData)/2;Count++)
	{
	*TempPtr++ = IconData[Count];
	}
  IconImage.ImageData = IconDatPtr;
  if(!(w=(struct Window *)OpenWindow(&nw))) CleanUp();
  mClass = INTUITICKS;
  while (mClass != CLOSEWINDOW)
  {
    (void) Wait (1<<w->UserPort->mp_SigBit);
    if ((wmsg = (struct IntuiMessage *)GetMsg (w->UserPort)) != NULL)
      {
      mClass = wmsg->Class;
      ReplyMsg ((struct Message *)wmsg);
#ifdef DEBUG
      printf ("\nMessage %d\n",mClass);
#endif
      switch (mClass)
	{
	case GADGETUP:
	  StrinkWindow ();
	  break;
	}
      }
  }
  while ((wmsg = (struct IntuiMessage *)GetMsg (w->UserPort)) != NULL)
    {
    ReplyMsg ((struct Message *)wmsg);
    }
  CleanUp();
}

void CleanUp()
{
  if (StrinkDatPtr) FreeMem(StrinkDatPtr,(ULONG)sizeof(StrinkData));
  if (IconDatPtr) FreeMem(IconDatPtr,(ULONG)sizeof(IconData));
  if (w) CloseWindow(w);
  if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  if (GfxBase) CloseLibrary((struct Library *)GfxBase);
  exit(0);
}

void StrinkWindow()
{
ULONG imClass, mSecs, mMicros, oSecs, oMicros;
BOOL DoubleClicked;
  while ((wmsg = (struct IntuiMessage *)GetMsg (w->UserPort)) != NULL)
    {
    ReplyMsg ((struct Message *)wmsg);
    }
  nw.LeftEdge = w->LeftEdge;
  nw.TopEdge  = w->TopEdge;
  nw.Width    = w->Width;
  nw.Height   = w->Height;
  CloseWindow(w);
  if(!(w=(struct Window *)OpenWindow(&iw))) CleanUp();
  imClass = INTUITICKS;
  DoubleClicked = FALSE;
  oSecs = 0;
  oMicros = 0;
  while (!DoubleClicked)
  {
    (void) Wait (1<<w->UserPort->mp_SigBit);
    if ((iwmsg = (struct IntuiMessage *)GetMsg (w->UserPort)) != NULL)
      {
      imClass = iwmsg->Class;
      mSecs   = iwmsg->Seconds;
      mMicros = iwmsg->Micros;
      ReplyMsg ((struct Message *)iwmsg);
      if (imClass = GADGETDOWN)
	{
	DoubleClicked = DoubleClick (oSecs,oMicros,mSecs,mMicros);
	oSecs = mSecs;
	oMicros = mMicros;
	}
#ifdef DEBUG
      printf ("\nIcon Message %d\n",imClass);
#endif
      }
  }
  while ((iwmsg = (struct IntuiMessage *)GetMsg (w->UserPort)) != NULL)
    {
    ReplyMsg ((struct Message *)iwmsg);
    }
  iw.LeftEdge = w->LeftEdge;
  iw.TopEdge  = w->TopEdge;
  iw.Width    = w->Width;
  iw.Height   = w->Height;
  CloseWindow(w);
  if(!(w=(struct Window *)OpenWindow(&nw))) CleanUp();
}
