#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dosextens.h>
#include <intuition/screens.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <diskfont/diskfont.h>
#include <utility/utility.h>
#include <graphics/gfxbase.h>
#include <workbench/workbench.h>
#include <graphics/scale.h>
#include <clib/exec_protos.h>
#include <clib/wb_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <string.h>
#include <clib/diskfont_protos.h>

#include "ControlGUI.h"

#include "/common/types.h"
#include "/common/defines.h"
#include "/common/structures.h"

extern struct BBSGlobalData *BBSGlobal;
extern UWORD *CtrlScrndefpens;

UWORD HbbsLogo_new_brushColours[] =  /* Use LoadRGB4 to use this. */
	{
	2730,0,4095,1675,2457,3003,2985,4026
	};

UWORD HbbsLogo_new_brushData[240] =
	{
	0,0,0,0,0,0,0,0,0,0,256,4096,0,0,0,256,4127,49409,64528,8129,256,4112,257,16,
	4097,256,4112,257,16,4127,256,4112,257,16,4096,0,4096,768,48,0,0,4096,512,32,0,
	508,4127,49153,64515,65281,256,4112,257,16,1,256,4112,257,16,1,256,4112,257,16,
	16385,256,4096,256,16,1,256,4096,768,48,3,32513,63487,65151,65507,65534,0,0,0,
	0,0,65027,61439,64767,65479,65532,65027,61439,65279,65519,65534,65027,61408,
	16126,1007,57406,65027,61408,16126,1007,57406,65027,61408,16126,1007,57344,
	65027,61408,16126,1007,57344,65535,61439,64767,65487,65532,65535,61439,64767,
	65479,65534,65027,61408,16126,992,254,65027,61408,16126,992,254,65027,61408,
	16126,1007,33022,65027,61408,16126,1007,33022,65027,61439,65279,65519,65534,
	65027,61439,64767,65479,65532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	};

struct Menu *CtrlMenu = NULL;

struct NewMenu CtrlMenuNewMenu[] =
	{
	NM_TITLE, (STRPTR)"HBBS"        ,  NULL , 0, NULL, (APTR)~0,
	NM_ITEM , (STRPTR)"About"       , (STRPTR)"?", 0, 0L, (APTR)~0,
	NM_ITEM , (STRPTR)"Screen Mode" , (STRPTR)"M", 0, 0L, (APTR)~0,
	NM_ITEM , NM_BARLABEL           ,  0 , 0, 0L, (APTR)~0,
	NM_ITEM , (STRPTR)"Quit!"       , (STRPTR)"Q", 0, 0L, (APTR)~0,
	NM_END  , NULL                  ,  NULL , 0, 0L, (APTR)~0
	};

ULONG CtrlMenuTags[] =
	{
	(GT_TagBase+67), TRUE,
	(GTMN_TextAttr), (ULONG)&HBBS8066,
	(TAG_DONE)
	};

ULONG BevelTags[] =
	{
	(GTBB_Recessed), TRUE,
	(GT_VisualInfo), 0,
	(TAG_DONE)
	};

struct Window *Ctrl = NULL;
APTR CtrlVisualInfo;
APTR CtrlDrawInfo;
struct Gadget *CtrlGList;
struct Gadget *CtrlGadgets[13];
UBYTE CtrlFirstRun = 0;

STRPTR Ctrl_LV1_CycleLabels[] =
{
	(STRPTR)"Last Callers",
	(STRPTR)"Last Downloads",
	(STRPTR)"Last Uploads",
	(STRPTR)"Last Pagers",
	(STRPTR)"Last PWFails",
	(STRPTR)"Last Carrier",
	NULL
};

ULONG CtrlGadgetTags[] =
	{
	(GTLV_Selected), 0,
	(TAG_END),
	(GTCY_Labels), (ULONG)&Ctrl_LV1_CycleLabels[0],
	(TAG_END),
	(GTLV_ShowSelected), 0,
	(GTLV_Selected), 0,
	(TAG_END),
	(GTLV_Selected), 0,
	(TAG_END),
	};

UWORD CtrlGadgetTypes[] =
	{
	LISTVIEW_KIND,
	CYCLE_KIND,
	LISTVIEW_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	LISTVIEW_KIND,
	TEXT_KIND,
	};

struct NewGadget CtrlNewGad[] =
	{
	170, 17, 182, 76, NULL, &HBBS8066, Ctrl_LV1, 1, NULL,  (APTR)&CtrlGadgetTags[0],
	170, 1, 182, 15, NULL, &HBBS8066, Ctrl_LV1_Cycle, 1, NULL,  (APTR)&CtrlGadgetTags[3],
	1, 1, 90, 92, NULL, &HBBS8066, Ctrl_LV2_Nodes, 4, NULL,  (APTR)&CtrlGadgetTags[6],
	92, 49, 77, 14, (UBYTE *)"Window", &HBBS8066, Ctrl_Window, 16, NULL,  NULL,
	92, 34, 77, 14, (UBYTE *)"Watch", &HBBS8066, Ctrl_Screen, 16, NULL,  NULL,
	92, 17, 77, 15, (UBYTE *)"Stop", &HBBS8066, Ctrl_Stop, 16, NULL,  NULL,
	92, 1, 77, 15, (UBYTE *)"Start", &HBBS8066, Ctrl_Start, 16, NULL,  NULL,
	92, 64, 77, 14, (UBYTE *)"Config", &HBBS8066, Ctrl_Config, 16, NULL,  NULL,
	92, 79, 77, 14, (UBYTE *)"Device", &HBBS8066, Ctrl_Device, 16, NULL,  NULL,
	353, 1, 85, 15, (UBYTE *)"Configure", &HBBS8066, Ctrl_Configure, 16, NULL,  NULL,
	439, 1, 85, 15, (UBYTE *)"Stop All", &HBBS8066, Ctrl_Shutdown, 16, NULL,  NULL,
	353, 17, 278, 76, NULL, &HBBS8066, Ctrl_LV3_Commands, 1, NULL,  (APTR)&CtrlGadgetTags[11],
	68, 96, 560, 12, (UBYTE *)"Status:", &HBBS8066, Ctrl_StatusText, 1, NULL,  NULL,
	};
UWORD CtrlZoomInfo[4] = { 0, 11, 150, 11 };

struct IntuiText CtrlCfgTexts[] =
	{
	2, 0, JAM2, 16, 3, &HBBS8066, (UBYTE *)"Screen Settings", &CtrlCfgTexts[1],
	2, 0, JAM2, 16, 39, &HBBS8066, (UBYTE *)"Misc Settings", NULL
	};

struct Window *CtrlCfg = NULL;
APTR CtrlCfgVisualInfo;
struct DrawInfo *CtrlCfgDrawInfo;
struct Gadget *CtrlCfgGList;
struct Gadget *CtrlCfgGadgets[3];
UBYTE CtrlCfgFirstRun = 0;

UWORD CtrlCfgGadgetTypes[] =
	{
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	};

struct NewGadget CtrlCfgNewGad[] =
	{
	11, 13, 110, 13, (UBYTE *)"Screen Mode", &HBBS8066, CtrlCfg_ScreenMode, 16, NULL,  NULL,
	124, 13, 110, 13, (UBYTE *)"Save", &HBBS8066, CtrlCfg_Save, 16, NULL,  NULL,
	11, 50, 110, 13, (UBYTE *)"BBSGlobal", &HBBS8066, CtrlCfg_EditBBSConfig, 16, NULL,  NULL,
	};

struct IntuiText LoadingTexts[] =
	{
	2, 0, JAM2, 12, 4, &HBBS8066, (UBYTE *)"HydraBBS", &LoadingTexts[1],
	2, 0, JAM1, 46, 34, &HBBS8066, (UBYTE *)"(C) 1994-1999 Dominic Clifton", &LoadingTexts[2],
	1, 3, JAM1, 25, 48, &HBBS8066, (UBYTE *)"HydraBBS Now Loading, Please Wait", NULL
	};

struct Window *Loading = NULL;
APTR LoadingVisualInfo;
APTR LoadingDrawInfo;
UBYTE LoadingFirstRun = 0;

UWORD   CtrlScrnColors[] =
    {
    0,10,10,10,
    1,0,0,0,
    65535,0,0,0
    };

ULONG  CtrlScrnError=0;

ULONG   CtrlScrnTags[] =
    {
    (SA_Title),(ULONG)"HBBS",
    (SA_PubName),(ULONG)"CtrlScrn",
    (SA_Depth)   ,2,
    (SA_Left)    ,0,
    (SA_Top)     ,0,
    (SA_Width)   ,640,
    (SA_Height)  ,256,
    (SA_DisplayID),167936,
    (SA_Overscan),1,
    (SA_Font),(ULONG)&HBBS8066,
    (SA_Behind),1,
    (SA_Quiet),0,
    (SA_ShowTitle),1,
    (SA_AutoScroll),1,
    (SA_FullPalette),1,
    (SA_ErrorCode),(ULONG)(&CtrlScrnError),
    (SA_Pens),(ULONG)&CtrlScrndefpens,
    (SA_Colors),(ULONG)CtrlScrnColors,
    (TAG_DONE)
    };

struct Library *DiskfontBase = NULL;
struct Library *GadToolsBase = NULL;
struct GfxBase *GfxBase = NULL;
struct IntuitionBase *IntuitionBase = NULL;

struct Image HbbsLogo_new_brush = { 0, 0, 80, 16, 3, NULL, 7, 0, NULL};

APTR WaitPointer = NULL;
UWORD WaitPointerData[] =
    {
    0x0000,0x0000,0x0400,0x07c0,
    0x0000,0x07c0,0x0100,0x0380,
    0x0000,0x07e0,0x07c0,0x1ff8,
    0x1ff0,0x3fec,0x3ff8,0x7fde,
    0x3ff8,0x7fbe,0x7ffc,0xff7f,
    0x7ffc,0xffff,0x7ffc,0xffff,
    0x3ff8,0x7ffe,0x3ff8,0x7ffe,
    0x1ff0,0x3ffc,0x07c0,0x1ff8,
    0x0000,0x07e0,0x0000,0x0000
    };

struct TextAttr HBBS8066 = { (STRPTR)"HBBS.font", 8, 0, 66 };

int MakeMenuCtrlMenu( APTR MenuVisualInfo )
{
	if (NULL == (CtrlMenu = CreateMenusA( CtrlMenuNewMenu, NULL)))
		return( 1L );
	LayoutMenusA( CtrlMenu, MenuVisualInfo, (struct TagItem *)(&CtrlMenuTags[0]));
	return( 0L );
}

void RendWindowCtrl( struct Window *Win, void *vi )
{
UWORD offx = Win->BorderLeft;
UWORD offy = Win->BorderTop;
if (Win != NULL)
	{
	if (BBSGlobal->ScreenInfo->ScrDepth <4) DrawImage( Win->RPort, &HbbsLogo_new_brush, 539+offx, 0+offy);
	BevelTags[3] = (ULONG)vi;
	DrawBevelBoxA( Win->RPort, 1+offx,95+offy,630,13, (struct TagItem *)(&BevelTags[2]));
	}
}

int OpenCtrlWindow( struct Screen *Scr)
{
UWORD offx, offy;
UWORD loop;
struct NewGadget newgad;
struct Gadget *Gad;
struct Gadget *Gad2;
APTR Cla;
if (CtrlFirstRun == 0)
	{
	CtrlFirstRun = 1;
	}
if (Ctrl == NULL)
	{
	offx = Scr->WBorLeft;
	offy = Scr->WBorTop + Scr->Font->ta_YSize+1;
	if (NULL != ( CtrlVisualInfo = GetVisualInfoA( Scr, NULL)))
		{
		if (NULL != ( CtrlDrawInfo = GetScreenDrawInfo( Scr)))
			{
			CtrlGList = NULL;
			Gad = CreateContext( &CtrlGList);
			for ( loop=0 ; loop<13 ; loop++ )
				if (CtrlGadgetTypes[loop] != 198)
					{
					CopyMem((char * )&CtrlNewGad[loop], ( char * )&newgad, (long)sizeof( struct NewGadget ));
					newgad.ng_VisualInfo = CtrlVisualInfo;
					newgad.ng_LeftEdge += offx;
					newgad.ng_TopEdge += offy;
					CtrlGadgets[ loop ] = NULL;
					CtrlGadgets[ newgad.ng_GadgetID - CtrlFirstID ] = Gad = CreateGadgetA( CtrlGadgetTypes[loop], Gad, &newgad, newgad.ng_UserData );
					}
			for ( loop=0 ; loop<13 ; loop++ )
				if (CtrlGadgetTypes[loop] == 198)
					{
					CtrlGadgets[ loop ] = NULL;
					Cla = NULL;
					if (Gad)
						CtrlGadgets[ loop ] = Gad2 = (struct Gadget *) NewObjectA( (struct IClass *)Cla, CtrlNewGad[ loop ].ng_GadgetText, CtrlNewGad[ loop ].ng_UserData );
					}
			if (Gad != NULL)
				{
				if (NULL != (Ctrl = OpenWindowTags( NULL,
				        (WA_Left), BBSGlobal->CtrlX,
								(WA_Top), BBSGlobal->CtrlY,
								(WA_Width), 636+offx,
								(WA_Height), 111+offy,
								(WA_Title), "HBBS Control",
								(WA_MinWidth), 196,
								(WA_MinHeight), 11,
								(WA_MaxWidth), 640,
								(WA_MaxHeight), 160,
								(WA_DragBar), TRUE,
								(WA_DepthGadget), TRUE,
								(WA_CloseGadget), TRUE,
								(WA_Activate), TRUE,
								(WA_Dummy+0x30), TRUE,
								(WA_SmartRefresh), TRUE,
								(WA_AutoAdjust), TRUE,
								(WA_Gadgets), CtrlGList,
								(WA_Zoom), CtrlZoomInfo,
								(WA_PubScreen) , (LONG)Scr,
								(WA_IDCMP),6293372,
                BBSGlobal->ScreenInfo->UsingBackfill==FALSE ? (TAG_IGNORE) : (WA_BackFill) , &BBSGlobal->backfillhook,
								(TAG_END))))
					{
					RendWindowCtrl(Ctrl, CtrlVisualInfo );
					GT_RefreshWindow( Ctrl, NULL);
					RefreshGList( CtrlGList, Ctrl, NULL, ~0);
					if (CtrlMenu == NULL)
						MakeMenuCtrlMenu( CtrlVisualInfo);
					if (CtrlMenu != NULL)
						{
						SetMenuStrip( Ctrl, CtrlMenu);
						return( 0L );
						}
					CloseWindow( Ctrl );
					}
				}
			FreeGadgets( CtrlGList);
			FreeScreenDrawInfo( Scr, CtrlDrawInfo );
			}
		FreeVisualInfo( CtrlVisualInfo );
		}
	}
else
	{
	WindowToFront(Ctrl);
	ActivateWindow(Ctrl);
	return( 0L );
	}
return( 1L );
}

void CloseCtrlWindow( void )
{
if (Ctrl != NULL)
	{
	ClearMenuStrip( Ctrl);
	FreeMenus( CtrlMenu);
	CtrlMenu = NULL;
	FreeScreenDrawInfo( Ctrl->WScreen, CtrlDrawInfo );
	CtrlDrawInfo = NULL;
	CloseWindow( Ctrl);
	Ctrl = NULL;
	FreeVisualInfo( CtrlVisualInfo);
	FreeGadgets( CtrlGList);
	}
}

void RendWindowCtrlCfg( struct Window *Win, void *vi )
{
int loop;
UWORD offx = Win->BorderLeft;
UWORD offy = Win->BorderTop;
if (Win != NULL)
	{
	BevelTags[3] = (ULONG)vi;
	DrawBevelBoxA( Win->RPort, 2+offx,5+offy,242,29, (struct TagItem *)(&BevelTags[0]));
	DrawBevelBoxA( Win->RPort,2+4+offx,5+2+offy,242-8,29-4, (struct TagItem *)(&BevelTags[2]));
	DrawBevelBoxA( Win->RPort, 2+offx,41+offy,241,29, (struct TagItem *)(&BevelTags[0]));
	DrawBevelBoxA( Win->RPort,2+4+offx,41+2+offy,241-8,29-4, (struct TagItem *)(&BevelTags[2]));
	for( loop=0; loop<2; loop++) // *!* Start of modification
	{
		CtrlCfgTexts[loop].FrontPen = CtrlCfgDrawInfo->dri_Pens[TEXTPEN];
		CtrlCfgTexts[loop].BackPen = CtrlCfgDrawInfo->dri_Pens[BACKGROUNDPEN];

		if (CtrlCfgTexts[loop].ITextFont==NULL)
			CtrlCfgTexts[loop].ITextFont=Win->WScreen->Font;
  } // *!* End of modification
	PrintIText( Win->RPort, CtrlCfgTexts, offx, offy);
	}
}

int OpenCtrlCfgWindow( struct Screen *Scr)
{
UWORD offx, offy;
UWORD loop;
struct NewGadget newgad;
struct Gadget *Gad;
struct Gadget *Gad2;
APTR Cla;
if (CtrlCfgFirstRun == 0)
	{
	CtrlCfgFirstRun = 1;
	}
if (CtrlCfg == NULL)
	{
	offx = Scr->WBorLeft;
	offy = Scr->WBorTop + Scr->Font->ta_YSize+1;
	if (NULL != ( CtrlCfgVisualInfo = GetVisualInfoA( Scr, NULL)))
		{
		if (NULL != ( CtrlCfgDrawInfo = GetScreenDrawInfo( Scr)))
			{
			CtrlCfgGList = NULL;
			Gad = CreateContext( &CtrlCfgGList);
			for ( loop=0 ; loop<3 ; loop++ )
				if (CtrlCfgGadgetTypes[loop] != 198)
					{
					CopyMem((char * )&CtrlCfgNewGad[loop], ( char * )&newgad, (long)sizeof( struct NewGadget ));
					newgad.ng_VisualInfo = CtrlCfgVisualInfo;
					newgad.ng_LeftEdge += offx;
					newgad.ng_TopEdge += offy;
					CtrlCfgGadgets[ loop ] = NULL;
					CtrlCfgGadgets[ newgad.ng_GadgetID - CtrlCfgFirstID ] = Gad = CreateGadgetA( CtrlCfgGadgetTypes[loop], Gad, &newgad, newgad.ng_UserData );
					}
			for ( loop=0 ; loop<3 ; loop++ )
				if (CtrlCfgGadgetTypes[loop] == 198)
					{
					CtrlCfgGadgets[ loop ] = NULL;
					Cla = NULL;
					if (Gad)
						CtrlCfgGadgets[ loop ] = Gad2 = (struct Gadget *) NewObjectA( (struct IClass *)Cla, CtrlCfgNewGad[ loop ].ng_GadgetText, CtrlCfgNewGad[ loop ].ng_UserData );
					}
			if (Gad != NULL)
				{
				if (NULL != (CtrlCfg = OpenWindowTags( NULL, (WA_Left), 205,
								(WA_Top), 84,
								(WA_Width), 249+offx,
								(WA_Height), 74+offy,
								(WA_Title), "Configure",
								(WA_MinWidth), 150,
								(WA_MinHeight), 25,
								(WA_MaxWidth), 1200,
								(WA_MaxHeight), 1200,
								(WA_DragBar), TRUE,
								(WA_DepthGadget), TRUE,
								(WA_CloseGadget), TRUE,
								(WA_Activate), TRUE,
								(WA_SmartRefresh), TRUE,
								(WA_AutoAdjust), TRUE,
								(WA_Gadgets), CtrlCfgGList,
								(WA_PubScreen) , (LONG)Scr,
								(WA_IDCMP),1604,
                BBSGlobal->ScreenInfo->UsingBackfill==FALSE ? (TAG_IGNORE) : (WA_BackFill) , &BBSGlobal->backfillhook,
								(TAG_END))))
					{
					RendWindowCtrlCfg(CtrlCfg, CtrlCfgVisualInfo );
					GT_RefreshWindow( CtrlCfg, NULL);
					RefreshGList( CtrlCfgGList, CtrlCfg, NULL, ~0);
					return( 0L );
					}
				}
			FreeGadgets( CtrlCfgGList);
			FreeScreenDrawInfo( Scr, CtrlCfgDrawInfo );
			}
		FreeVisualInfo( CtrlCfgVisualInfo );
		}
	}
else
	{
	WindowToFront(CtrlCfg);
	ActivateWindow(CtrlCfg);
	return( 0L );
	}
return( 1L );
}

void CloseCtrlCfgWindow( void )
{
if (CtrlCfg != NULL)
	{
	FreeScreenDrawInfo( CtrlCfg->WScreen, CtrlCfgDrawInfo );
	CtrlCfgDrawInfo = NULL;
	CloseWindow( CtrlCfg);
	CtrlCfg = NULL;
	FreeVisualInfo( CtrlCfgVisualInfo);
	FreeGadgets( CtrlCfgGList);
	}
}

void RendWindowLoading( struct Window *Win, void *vi )
{
int loop;
UWORD offx = Win->BorderLeft;
UWORD offy = Win->BorderTop;
if (Win != NULL)
	{
	DrawImage( Win->RPort, &HbbsLogo_new_brush, 119+offx, 13+offy);
	BevelTags[3] = (ULONG)vi;
	DrawBevelBoxA( Win->RPort, 12+offx,44+offy,299,16, (struct TagItem *)(&BevelTags[0]));
	DrawBevelBoxA( Win->RPort, 2+offx,6+offy,319,60, (struct TagItem *)(&BevelTags[2]));
	for( loop=0; loop<3; loop++)
		if (LoadingTexts[loop].ITextFont==NULL)
			LoadingTexts[loop].ITextFont=Win->WScreen->Font;
	PrintIText( Win->RPort, LoadingTexts, offx, offy);
	}
}

int OpenLoadingWindow( void )
{
struct Screen *Scr;
UWORD offx, offy;
if (LoadingFirstRun == 0)
	{
	LoadingFirstRun = 1;
	}
if (Loading == NULL)
	{
	Scr = LockPubScreen(NULL);
	if (NULL != Scr)
		{
		offx = Scr->WBorLeft;
		offy = Scr->WBorTop + Scr->Font->ta_YSize+1;
		if (NULL != ( LoadingVisualInfo = GetVisualInfoA( Scr, NULL)))
			{
			if (NULL != ( LoadingDrawInfo = GetScreenDrawInfo( Scr)))
				{
				if (NULL != (Loading = OpenWindowTags( NULL,
				        (WA_Left), (Scr->Width - 327) / 2, // center horizontal
								(WA_Top), (Scr->Height - 154) / 2, // center vert.
								(WA_Width), 327+offx,
								(WA_Height), 70+offy,
								(WA_Title), "HBBS - Loading",
								(WA_MinWidth), 150,
								(WA_MinHeight), 25,
								(WA_MaxWidth), 1200,
								(WA_MaxHeight), 1200,
								(WA_DragBar), TRUE,
								(WA_DepthGadget), TRUE,
								(WA_Activate), TRUE,
								(WA_SmartRefresh), TRUE,
								(WA_IDCMP),580,
								(TAG_END))))
					{
					RendWindowLoading(Loading, LoadingVisualInfo );
					UnlockPubScreen( NULL, Scr);
					return( 0L );
					}
				FreeScreenDrawInfo( Scr, LoadingDrawInfo );
				}
			FreeVisualInfo( LoadingVisualInfo );
			}
		UnlockPubScreen( NULL, Scr);
		}
	}
else
	{
	WindowToFront(Loading);
	ActivateWindow(Loading);
	return( 0L );
	}
return( 1L );
}

void CloseLoadingWindow( void )
{
if (Loading != NULL)
	{
	FreeScreenDrawInfo( Loading->WScreen, LoadingDrawInfo );
	LoadingDrawInfo = NULL;
	CloseWindow( Loading);
	Loading = NULL;
	FreeVisualInfo( LoadingVisualInfo);
	}
}

struct Screen *OpenCtrlScrnScreen(void)
{
CtrlScrnError = 0;
return OpenScreenTagList(NULL,(struct TagItem *)CtrlScrnTags);
}

int OpenLibs( void )
{
if ( NULL != (DiskfontBase = OpenLibrary((UBYTE *)"diskfont.library" , 36)))
	if ( NULL != (GadToolsBase = OpenLibrary((UBYTE *)"gadtools.library" , 37)))
		if ( NULL != (GfxBase = (struct GfxBase * )OpenLibrary((UBYTE *)"graphics.library" , 37)))
			if ( NULL != (IntuitionBase = (struct IntuitionBase * )OpenLibrary((UBYTE *)"intuition.library" , 37)))
				return( 0L );
CloseLibs();
return( 1L );
}

void CloseLibs( void )
{
if (NULL != DiskfontBase )
	CloseLibrary( DiskfontBase );
if (NULL != GadToolsBase )
	CloseLibrary( GadToolsBase );
if (NULL != GfxBase )
	CloseLibrary( ( struct Library * )GfxBase );
if (NULL != IntuitionBase )
	CloseLibrary( ( struct Library * )IntuitionBase );
}

int OpenDiskFonts( void )
{
	int OKSoFar = 0;
if (NULL == OpenDiskFont( &HBBS8066 ) )
	OKSoFar = 1;
return ( OKSoFar );
}

int MakeImages( void )
{
UWORD failed = 0;
if (NULL != (WaitPointer=AllocMem( 72, MEMF_CHIP)))
	CopyMem( WaitPointerData, WaitPointer, 72);
else
	failed = 1;
if (NULL != (HbbsLogo_new_brush.ImageData=AllocMem( 480, MEMF_CHIP)))
	CopyMem( HbbsLogo_new_brushData, HbbsLogo_new_brush.ImageData, 480);
else
	failed = 1;
if (failed==0)
	return( 0L );
else
	{
	FreeImages();
	return( 1L );
	}
}

void FreeImages( void )
{
if (WaitPointer != NULL)
	FreeMem( WaitPointer, 72);
WaitPointer = NULL;
if (HbbsLogo_new_brush.ImageData != NULL)
	FreeMem(HbbsLogo_new_brush.ImageData, 480);
HbbsLogo_new_brush.ImageData = NULL;
}

