#define NULL 0L
#include <intuition/intuition.h>

struct NewScreen ns = {
	0,0,320,200,6,
	1,2,EXTRA_HALFBRITE,
	CUSTOMSCREEN,
	NULL,
	(UBYTE *)"Test screen",
	NULL, NULL
};

struct NewWindow nw = {
	20,20,280,160,1,2,
	CLOSEWINDOW | RAWKEY,
	WINDOWCLOSE | WINDOWSIZING | WINDOWDEPTH | WINDOWDRAG | GIMMEZEROZERO |
		SMART_REFRESH | ACTIVATE | NOCAREREFRESH,
	NULL, NULL,
	(UBYTE *)"Test Window: borderless or not",
	NULL,
	NULL,
	20,20, -1, -1,
	CUSTOMSCREEN
};

struct Library *GfxBase, *IntuitionBase, *LayersBase, *OpenLibrary();
struct Screen *screen, *OpenScreen();
struct Window *window, *OpenWindow();
struct RastPort *rp;
struct IntuiMessage *im, *WaitPort(), *GetMsg();
struct Gadget *gadget;

long int movex, movey, sizex, sizey;

struct BorderInfo
{
	BYTE SizeX, SizeY;
	BYTE MoveX, MoveY;
} borderinfo;

void DoBorderless(window, borderinfo)
struct Window *window;
struct BorderInfo *borderinfo;
{
	/* Make window borderless */

	register struct Layer_Info *LayerInfo = &window->WScreen->LayerInfo;
	register struct Layer *Layer = window->RPort->Layer;
	register long movex;
	register long movey;
	register long sizex;
	register long sizey;

	if (window->Flags & BORDERLESS)	return;

	LockLayer(LayerInfo, Layer);

	window->Flags |= BORDERLESS;

	movex = -window->BorderLeft;
	movey = -window->BorderTop;
	sizex = window->BorderRight - movex;
	sizey = window->BorderBottom - movey;

	window->BorderLeft =
	window->BorderTop =
	window->BorderRight =
	window->BorderBottom = 0;

	window->GZZWidth += sizex;
	window->GZZHeight += sizey;

	MoveLayer(LayerInfo, Layer, movex, movey);
	SizeLayer(LayerInfo, Layer, sizex, sizey);
	UnlockLayer(window->RPort->Layer);

	borderinfo->MoveX = movex;
	borderinfo->MoveY = movey;
	borderinfo->SizeX = sizex;
	borderinfo->SizeY = sizey;

	/* Done making borderless */
}

void UndoBorderless(window, borderinfo)
struct Window *window;
struct BorderInfo *borderinfo;
{
	/* ``Another fine mess you got me into!'' */

	register struct Layer_Info *LayerInfo = &window->WScreen->LayerInfo;
	register struct Layer *Layer = window->RPort->Layer;
	register long movex = borderinfo->MoveX;
	register long movey = borderinfo->MoveY;
	register long sizex = borderinfo->SizeX;
	register long sizey = borderinfo->SizeY;

	if (window->Flags & BORDERLESS == 0)	return;

	LockLayer(LayerInfo, Layer);
	SizeLayer(LayerInfo, Layer, -sizex, -sizey);
	MoveLayer(LayerInfo, Layer, -movex, -movey);

	window->GZZWidth -= sizex;
	window->GZZHeight -= sizey;

	window->BorderLeft = -movex;
	window->BorderTop = -movey;
	window->BorderRight = sizex + movex;
	window->BorderBottom = sizey + movey;

	window->Flags &= ~BORDERLESS;

	RefreshWindowFrame(window);

	UnlockLayer(Layer);

	/* Done Undoing Borderless */
}

main()
{
	long i;
	char text[50];

	GfxBase = OpenLibrary("graphics.library", LIBRARY_VERSION);
	LayersBase = OpenLibrary("layers.library", LIBRARY_VERSION);
	IntuitionBase = OpenLibrary("intuition.library", LIBRARY_VERSION);
	screen = OpenScreen(&ns);
	nw.Screen = screen;
	window = OpenWindow(&nw);

	DoBorderless(window, &borderinfo);

	rp = window->RPort;

	SetDrMd(rp, (long)JAM1);
	for (i=0; i < 64; i++) {
		sprintf(text, "This Is Color %2ld", i);
		Move(rp, i < 32? 10L: 150L, 10L + 4*(i & 31));
		SetAPen(rp, i);
		Text(rp, &text[0], (long) strlen(text));
	}

	printf("FirstGadget points at %lx\n", window->FirstGadget);

	for(gadget = window->FirstGadget; gadget; gadget=gadget->NextGadget) {
		PrintGadget(gadget);
		getchar();
	}

	UndoBorderless(window, &borderinfo);

	getchar();

	CloseWindow(window);
	CloseScreen(screen);
	CloseLibrary(IntuitionBase);
	CloseLibrary(LayersBase);
	CloseLibrary(GfxBase);
}

PrintGadget(gadget)
struct Gadget *gadget;
{
	short Bits;

	printf("----------------------------------------------------------\n");
	printf("Struct Gadget:\n");
	printf("NextGadget.....%08lx\n",gadget->NextGadget);
	printf("LeftEdge.......%d(dec)\n", gadget->LeftEdge);
	printf("TopEdge........%d(dec)\n", gadget->TopEdge);
	printf("Width..........%d(dec)\n", gadget->Width);
	printf("Height.........%d(dec)\n", gadget->Height);
	printf("Flags..........%04x\n", gadget->Flags);
	Bits = gadget->Flags;
	switch (Bits & GADGHIGHBITS) {
	case GADGHCOMP:  printf("                GADGHCOMP\n"); break;
	case GADGHBOX:   printf("                GADGHBOX\n"); break;
	case GADGHIMAGE: printf("                GADGHIMAGE\n"); break;
	case GADGHNONE:  printf("                GADGHNONE\n"); break;
	}
	if (Bits & GADGIMAGE)
		printf("                GADGIMAGE\n");
	if (Bits & GRELBOTTOM)
		printf("                GRELBOTTOM\n");
	if (Bits & GRELRIGHT)
		printf("                GRELRIGHT\n");
	if (Bits & GRELWIDTH)
		printf("                GRELWIDTH\n");
	if (Bits & GRELHEIGHT)
		printf("                GRELHEIGHT\n");
	if (Bits & SELECTED)
		printf("                SELECTED\n");
	if (Bits & GADGDISABLED)
		printf("                GADGDISABLED\n");

	printf("Activation.....%04x\n", gadget->Activation);
	Bits = gadget->Activation;
	if (Bits & RELVERIFY)
		printf("                RELVERIFY\n");
	if (Bits & GADGIMMEDIATE)
		printf("                GADGIMMEDIATE\n");
	if (Bits & ENDGADGET)
		printf("                ENDGADGET\n");
	if (Bits & FOLLOWMOUSE)
		printf("                FOLLOWMOUSE\n");
	if (Bits & RIGHTBORDER)
		printf("                RIGHTBORDER\n");
	if (Bits & LEFTBORDER)
		printf("                LEFTBORDER\n");
	if (Bits & TOPBORDER)
		printf("                TOPBORDER\n");
	if (Bits & BOTTOMBORDER)
		printf("                BOTTOMBORDER\n");
	if (Bits & TOGGLESELECT)
		printf("                TOGGLESELECT\n");
	if (Bits & STRINGCENTER)
		printf("                STRINGCENTER\n");
	if (Bits & STRINGRIGHT)
		printf("                STRINGRIGHT\n");
	if (Bits & LONGINT)
		printf("                LONGINT\n");
	if (Bits & ALTKEYMAP)
		printf("                ALTKEYMAP\n");

	printf("GadgetType.....%04x\n", gadget->GadgetType);
	Bits = gadget->GadgetType;
	if (Bits & SYSGADGET)
		printf("                SYSGADGET\n");
	if (Bits & SCRGADGET)
		printf("                SCRGADGET\n");
	if (Bits & GZZGADGET)
		printf("                GZZGADGET\n");
	if (Bits & REQGADGET)
		printf("                REQGADGET\n");

	switch (Bits & 0x00F0) {
	case SIZING:    printf("                SIZING\n"); break;
	case WDRAGGING: printf("                WDRAGGING\n"); break;
	case SDRAGGING: printf("                SDRAGGING\n"); break;
	case WUPFRONT:  printf("                WUPFRONT\n"); break;
	case SUPFRONT:  printf("                SUPFRONT\n"); break;
	case WDOWNBACK: printf("                WDOWNBACK\n"); break;
	case SDOWNBACK: printf("                SDOWNBACK\n"); break;
	case CLOSE:     printf("                CLOSE\n"); break;
	default:		printf("                Unknown System Gadget\n");
	}

	switch (Bits & 0x000F) {
	case BOOLGADGET: printf("                BOOLGADGET\n"); break;
	case GADGET0002: printf("                GADGET0002\n"); break;
	case PROPGADGET: printf("                PROPGADGET\n"); break;
	case STRGADGET:  printf("                STRGADGET\n"); break;
	default:		 printf("                Unknown Appli Gadget\n");
	}

	printf("GadgetRender...%08lx\n",gadget->GadgetRender);
	printf("SelectRender...%08lx\n",gadget->SelectRender);
	printf("GadgetText.....%08lx\n",gadget->GadgetText);
	printf("MutualExclude..%08lx\n",gadget->MutualExclude);
	printf("SpecialInfo....%08lx\n",gadget->SpecialInfo);
	printf("GadgetID.......%04x\n", gadget->GadgetID);
	printf("UserData.......%08lx\n",gadget->UserData);
}
