/*********************************************************/
/* Programmname		  : WindowTool      						*/
/* Autor               : Klaas Hermanns						*/
/* Aktuelle Version    : 1.00          						*/
/* Erstellungsdatum    : 25-05-92								*/
/* Compileranweisungen : lmk lmkfile    						*/
/*********************************************************/
#define VERSIONSTRING "1.00"
#define DATESTRING __DATE__" "__TIME__
#include <stdio.h>
#include <exec/exec.h>
#include <exec/types.h>
#include <graphics/displayinfo.h>
#include <graphics/text.h>
#include <graphics/clip.h>
#include <dos/datetime.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <intuition/gadgetclass.h>
#include <libraries/commodities.h>
#include <libraries/gadtools.h>
#include <libraries/asl.h>
#include <libraries/reqtools.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/gadtools_pragmas.h>
#include <pragmas/asl_pragmas.h>
#include <pragmas/reqtools.h>
#include <clib/icon_protos.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/asl_protos.h>
#include <clib/intuition_protos.h>
#include <clib/reqtools_protos.h>
#include <clib/dos_protos.h>
#include <clib/commodities_protos.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>

#define DEFAULTPRIORITY 21

#define GD_Gadget0                             0
#define GD_Gadget1                             1
#define GD_Gadget2                             2
#define GD_Gadget3                             3
#define GD_Gadget4                             4
#define GD_Gadget5                             5
#define GD_Gadget6                             6
#define GD_Gadget7                             7
#define GD_Gadget8                             8
#define GD_Gadget9                             9
#define GD_Gadget10                             10
#define GD_Gadget11                             11
#define GD_GadgetSave                            50		/* Save */
#define GD_GadgetHide                            51		/* Hide */
#define GD_GadgetQuit                            52		/* Quit */
#define GD_GadgetCancel                          53		/* Cancel */

extern void activetofront(void);
extern void closewindow(void);
extern void bigwindow(void);
extern void smallwindow(void);
extern void zipwindow(void);
extern void activatefront(void);
extern void worktofront(void);

extern void checkstartup(int,char **,struct WBStartup *);

extern int windowopen;
extern struct Window        *Wnd        ;
extern struct Screen        *Scr        ;
extern APTR                  VisualInfo ;
extern struct Gadget        *GList      ;
extern struct Gadget        *Gadgets[14];
extern struct Menu          *Menus      ;
extern long InitStuff(void);
extern void CleanStuff(void);
extern struct IntuiText IText[];
extern char windowtitle[];

#define KEYNUMMER 12

struct Library *CxBase;
extern struct ExecBase *SysBase;
struct IntuitionBase *IntuitionBase;
struct Library *GadToolsBase;
struct Library *AslBase;
struct ReqToolsBase *ReqToolsBase;
struct GfxBase *GfxBase;
struct IconBase *IconBase;

extern struct WBStartup *WBenchMsg;

void ende(char *);
void openlibs(void);
void openrest(void);
void setkeys(void);
void switchstate(void);
void about(void);

BOOL state=0;						/* Status 0=Normal,~0=Dauerabfrage */
#define POPUPFLAG 1
#define NEWSETTINGSFLAG 2
int flags=0;
										/* Werte für Commoditie */
struct MsgPort *mp;
struct Message *msg;
CxObj *broker,*filter[KEYNUMMER];
struct NewBroker nb=
{
	NB_VERSION,
	"WindowTool(e.BB)",
	"WindowTool V1.0 by Klaas Hemanns .",
	"Just a nice programm ...",
	NBU_NOTIFY|NBU_UNIQUE,COF_SHOW_HIDE,DEFAULTPRIORITY,0,0
};

										/* Werte für Fensterabfrage */
struct IntuiMessage *mes;			/* Erhaltene Message */
long class;								/* Message Class */
short code;								/* Message Code */
struct Gadget *gad;

ULONG waitsignals;				/* Signale, auf die gewartet werden */

char oldkeys[KEYNUMMER][256];	/* Alte Tastenkombinationen (werden beim */
										/* Öffnen des Windows neu gesetzt */

char keys[KEYNUMMER][256]=		/* aktuelle Tastenkombinationen */
{
"rshift ralt j",								/* StopKey */
"shift alt DEL",								/* NewShell */
"control ralt lalt q",						/* Quit */
"lcommand b",									/* Cycle */
"lcommand v",									/* Work */
"lcommand g",									/* Closewindow */

"lcommand x",									/* ActivateFrontWindow */
"lcommand a",									/* Big Active Window */
"lcommand s",									/* Small Active Window */
"lcommand d",									/* Zip Active Window */
"lcommand h",									/* Popup */
"lcommand f"									/* ActiveToFront */
};

enum {	BK_ID,NS_ID,Q_ID,B_ID,V_ID,CL_ID,AF_ID,BW_ID,SW_ID,ZW_ID,PU_ID,ATF_ID};

char prgname[256];					/* Programm Pfad und Name */

char filename[34]="windowtool.config";	/* Default Settings */
char dirname[256]="s:";
fullname[300];				/* Nur Zwischenspeicher */

struct TagItem reqtags[]=
{
RT_ReqPos,REQPOS_CENTERSCR,TAG_END,0
};

BOOL filereq(int typ)
{
	struct rtFileRequester *filereq;
	char *match="#?.config";
	BOOL erg=FALSE;

	if (filereq = rtAllocRequestA (RT_FILEREQ, NULL))
	{
		rtChangeReqAttr(filereq,RTFI_Dir,dirname,RTFI_MatchPat,match,TAG_END);

		if(typ==0)
		{
		if (rtFileRequest (filereq, filename, "Save configuration",RTFI_Flags,FREQF_SAVE,TAG_END))
					erg=TRUE;
		}
		else
		{
		if (rtFileRequest (filereq, filename, "Load configuration",TAG_END))
					erg=TRUE;
		}
		strcpy(dirname,filereq->Dir);
		rtFreeRequest (filereq);
	}
	else
		rtEZRequest ("Error:\nNo memory for filerequester !", "Continue", NULL, NULL);
	return(erg);
}

void save()
{
	BPTR fh;
	strcpy(fullname,dirname);
	AddPart((UBYTE *)fullname,(UBYTE *)filename,300);
	if(fh=Open((UBYTE *)fullname,MODE_NEWFILE))
	{
		int k;
		for(k=0;k<KEYNUMMER;k++)
		{
			Write(fh,"\"",1);
			Write(fh,keys[k],strlen(keys[k]));
			Write(fh,"\"\n",2);
		}
		Close(fh);
	}
	else rtEZRequest("Error:\nUnable to open\nconfigurationfile\n%s !","Continue",NULL, reqtags,fullname);
}
void saveas()
{
	if(filereq(0)==TRUE)	save();
}

extern char *tt[];		/* NAMEN DER TOOLTYPES-KEYS */

USHORT chip imagedata[]=
{
	0x0000,0x0000,0x0000,0x0400,0x0000,0x0000,0x0000,0x0C00,
	0x0000,0x0000,0x0000,0x0C00,0x0000,0x0000,0x0000,0x0C00,
	0x0000,0x0000,0x0010,0x0C00,0x0000,0x0000,0x0010,0x0C00,
	0x0000,0x0000,0x0010,0x0C00,0x0000,0x1F04,0x0010,0x0C00,
	0x0000,0x398E,0x0010,0x0C00,0x0000,0x018E,0x0010,0x0C00,
	0x0000,0x070E,0x0010,0x0C00,0x0000,0x0C04,0x0010,0x0C00,
	0x0000,0x0E04,0x0010,0x0C00,0x0000,0x0000,0x0010,0x0C00,
	0x0000,0x0E0E,0x0010,0x0C00,0x0000,0x0000,0x0010,0x0C00,
	0x0000,0x0000,0x0010,0x0C00,0x0000,0x0000,0x0010,0x0C00,
	0x0000,0x0000,0x0010,0x0C00,0x001F,0xFFFF,0xFFE0,0x0C00,
	0x0000,0x0000,0x0000,0x0C00,0x7FFF,0xFFFF,0xFFFF,0xFC00,
	0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0xFFFF,0xF800,
	0xD555,0x5555,0x5555,0x5000,0xD555,0x5555,0x5555,0x5000,
	0xD53F,0xFFFF,0xFFE5,0x5000,0xD57F,0xFFFF,0xFFC5,0x5000,
	0xD578,0x0000,0x0085,0x5000,0xD571,0x5555,0x5405,0x5000,
	0xD575,0x4051,0x5505,0x5000,0xD575,0x4451,0x5505,0x5000,
	0xD575,0x5451,0x5505,0x5000,0xD575,0x5051,0x5505,0x5000,
	0xD575,0x5151,0x5505,0x5000,0xD575,0x5151,0x5505,0x5000,
	0xD575,0x5555,0x5505,0x5000,0xD575,0x5151,0x5505,0x5000,
	0xD571,0x5555,0x5405,0x5000,0xD578,0x0000,0x0085,0x5000,
	0xD570,0x0000,0x0045,0x5000,0xD560,0x0000,0x0025,0x5000,
	0xD540,0x0000,0x0015,0x5000,0xD555,0x5555,0x5555,0x5000,
	0x8000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
};
struct Image image =
{
	0,0,54,23,2,imagedata,3,0,0
};
void saveasinfo()
{
	char tooltypes[KEYNUMMER][256];
	long tooltypesadr[KEYNUMMER+1];
	int k;
	struct DiskObject *diskobj;
	struct DiskObject mydiskobj =
	{
		WB_DISKMAGIC,WB_DISKVERSION,
		{
			0,0,0,53,23,GADGIMAGE,RELVERIFY,BOOLGADGET,
			(APTR)&image,0,
			0,0,0,100,0
		},
		WBTOOL,0,0,NO_ICON_POSITION,NO_ICON_POSITION,0,0,4096
	};
	
	mydiskobj.do_ToolTypes=(char **)&tooltypesadr[0];
	
	for(k=0;k<KEYNUMMER;k++)
	{
		tooltypesadr[k]=(LONG)tooltypes[k];
		sprintf(tooltypes[k],"%s=%s",tt[k],keys[k]);
	}
	tooltypesadr[k]=0;
	
	if(diskobj=GetDiskObject(prgname))
	{
		mydiskobj.do_Gadget.LeftEdge=diskobj->do_Gadget.LeftEdge;
		mydiskobj.do_Gadget.TopEdge=diskobj->do_Gadget.TopEdge;
		mydiskobj.do_Gadget.Width=diskobj->do_Gadget.Width;
		mydiskobj.do_Gadget.Height=diskobj->do_Gadget.Height;
		mydiskobj.do_Gadget.Flags=diskobj->do_Gadget.Flags;
		mydiskobj.do_Gadget.Activation=diskobj->do_Gadget.Activation;
		mydiskobj.do_Gadget.GadgetRender=diskobj->do_Gadget.GadgetRender;
		mydiskobj.do_Gadget.SelectRender=diskobj->do_Gadget.SelectRender;
		mydiskobj.do_Gadget.GadgetID=diskobj->do_Gadget.GadgetID;
		mydiskobj.do_Gadget.UserData=diskobj->do_Gadget.UserData;
		mydiskobj.do_CurrentX=diskobj->do_CurrentX;
		mydiskobj.do_CurrentY=diskobj->do_CurrentY;
		mydiskobj.do_StackSize=diskobj->do_StackSize;
	}
	
	PutDiskObject(prgname,&mydiskobj);
	if(diskobj)FreeDiskObject(diskobj);
}

void open(void)
{
	BPTR fh;
	strcpy(fullname,dirname);
	AddPart((UBYTE *)fullname,(UBYTE *)filename,300);
	if(fh=Open((UBYTE *)fullname,MODE_OLDFILE))
	{
		char *mem;
		long memlen;
		Seek(fh,0,OFFSET_END);
		memlen=Seek(fh,0,OFFSET_BEGINNING);
		if(memlen==0)	rtEZRequest("Error:\nconfigurationfile\n%s\nis empty!","Continue",NULL, reqtags,fullname);
		else
		if(mem=AllocMem(memlen,0))
		{
			int aktu,a,e,k;
			
			Read(fh,mem,memlen);
			for(k=0,aktu=0;aktu<memlen,k<KEYNUMMER;aktu++,k++)
			{
				for(;mem[aktu]!='\"';aktu++);
				if(aktu>memlen){	rtEZRequest("Error:\nError in\nconfigurationfile\n%s !","Continue",NULL, reqtags,fullname);break;}
				aktu++;
				a=aktu;
					for(;mem[aktu]!='\"';aktu++);
				if(aktu>memlen){	rtEZRequest("Error:\nError in\nconfigurationfile\n%s !","Continue",NULL, reqtags,fullname);break;}
				e=aktu;
				mem[e]=0;
				strcpy(keys[k],&mem[a]);
			}
			if(k==KEYNUMMER)setkeys();
			FreeMem(mem,memlen);
		}
		else rtEZRequest("Error:\nNo memory to load\nconfigurationfile\n%s !","Continue",NULL, reqtags ,fullname);
		Close(fh);
	}
	else rtEZRequest("Error:\nError while opening the configurationfile\n%s !","Continue",NULL, reqtags,fullname);
}
void openas()
{
	if(filereq(1)==TRUE)
				open();
}

void openinfo()
{
	struct DiskObject *infoobj;
	int k;
	char *key;

	if(infoobj=GetDiskObject(prgname))
	{
		if(key=FindToolType(infoobj->do_ToolTypes,"SETTINGS"))
			{
				strcpy(filename,FilePart(key));
				*((char *)PathPart(key))=0;
				strcpy(dirname,key);
				open();
			}
		for(k=0;k<KEYNUMMER;k++)
		if(key=FindToolType(infoobj->do_ToolTypes,tt[k]))
						strcpy(keys[k],key);
		setkeys();
		FreeDiskObject(infoobj);
	}
	else rtEZRequest("Error:\nUnable to open %s.info !","Continue",NULL,reqtags,prgname);
}
		/* Öffnet Window neu */
void popup(void)
{
	int k;
	if(windowopen==FALSE) for(k=0;k<KEYNUMMER;k++)			/* KEYS SICHERN */
										strcpy(oldkeys[k],keys[k]);

	if(InitStuff()){
				rtEZRequest(	"Error:\nUnable to open HotkeyPrefsWindow !",
						"Continue",NULL, reqtags,NULL);
						}
	else
	{
	 	waitsignals= (1L<<Wnd->UserPort->mp_SigBit) | 
				(1<<mp->mp_SigBit) | SIGBREAKF_CTRL_C ;
		ScreenToFront(Scr);
	}
}
		/* Schließt Window */
void popdown(void)
{
	CleanStuff();
	waitsignals=(1<<mp->mp_SigBit) | SIGBREAKF_CTRL_C ;
}

void setkeys(void)
{
	int k;
	for(k=0;k<KEYNUMMER;k++)
	{
		if(windowopen==TRUE)GT_SetGadgetAttrs(Gadgets[k],Wnd,0,GTST_String,keys[k],TAG_DONE);
		DeleteCxObjAll(filter[k]);
		filter[k]=HotKey(keys[k],mp,k);
		AttachCxObj(broker,filter[k]);
	}
	if(windowopen==TRUE)
	{
		strcpy(&windowtitle[26],keys[10]);
		SetWindowTitles(Wnd,windowtitle,(char *)-1);
	}
}

void quit(void)
{
	if(rtEZRequestA("Quit WindowTool ?\n","Yes|No",
								NULL, NULL,NULL) )ende(0);;
}
			/* About Requester */
void about(void)
{
	rtEZRequest(	"WindowTool V"VERSIONSTRING" ("DATESTRING")\n"
						"This program is Giftware\n"
						"Copyright 1992 by Klaas Hermanns\n"
						"(Weberstraße 42/4190 Kleve/Germany)",
	"Continue",NULL, reqtags,NULL);
}


void main(argc,argv)
int argc;
char *argv[];
{
	ULONG signals;
	LONG id,k;

	openlibs();

	checkstartup(argc,argv,WBenchMsg);
	
	openrest();

	if(flags&POPUPFLAG)
	{
		waitsignals= (1L<<Wnd->UserPort->mp_SigBit) | 
				(1<<mp->mp_SigBit) | SIGBREAKF_CTRL_C ;
		popup();
	}
	else waitsignals = (1<<mp->mp_SigBit) | SIGBREAKF_CTRL_C ;

	if(flags&NEWSETTINGSFLAG)open();
	
	for(;;)
	{
		if(state==0)signals=Wait(waitsignals);
		else	while(0==(signals=CheckSignal( waitsignals )));

		if(signals & SIGBREAKF_CTRL_C )	quit();
		if(signals & 1L<<Wnd->UserPort->mp_SigBit)
	while(1)
		{
			if(windowopen==FALSE)break;
			if(!(mes=GT_GetIMsg(Wnd->UserPort)))break;
			
			class=mes->Class;
			code=mes->Code;
			gad=(struct Gadget *)mes->IAddress;
			GT_ReplyIMsg(mes);
			switch(class)
			{
				case IDCMP_REFRESHWINDOW:GT_BeginRefresh(Wnd);
												GT_RefreshWindow(Wnd,0);
									PrintIText( Wnd->RPort, IText, 0l, 0l );
												GT_EndRefresh(Wnd,TRUE);
												break;
				case IDCMP_CHANGEWINDOW:
												break;
				case IDCMP_CLOSEWINDOW:
										popdown();
										break;
				case IDCMP_GADGETUP:
											switch(gad->GadgetID)
												{
													case	GD_GadgetSave:save();break;	/*SAVE*/
													case	GD_GadgetHide:popdown();break;
													case	GD_GadgetQuit:quit();break;
													case	GD_GadgetCancel:
															for(k=0;k<KEYNUMMER;k++)/* KEYS ZURÜCK */
															{
																strcpy(keys[k],oldkeys[k]);
																DeleteCxObjAll(filter[k]);
																filter[k]=HotKey(keys[k],mp,k);
																AttachCxObj(broker,filter[k]);
															}
															popdown();
															break;
													default:if(gad->GadgetID<KEYNUMMER)
																{
																	k=gad->GadgetID;
																	DeleteCxObjAll(filter[k]);
																	strcpy(keys[k],((struct StringInfo *)gad->SpecialInfo)->Buffer);
																	filter[k]=HotKey(keys[k],mp,k);
																	AttachCxObj(broker,filter[k]);
																	ActivateGadget(Gadgets[k==11 ? 0 : k+1],Wnd,0);
																}
																if(gad->GadgetID==GD_Gadget10)
																	{
																		strcpy(&windowtitle[26],keys[10]);
																		SetWindowTitles(Wnd,windowtitle,(char *)-1);
																	}
															break;
												}
										break;
				case IDCMP_MENUPICK:	
								switch(MENUNUM(code))
									{
									case 0:switch(ITEMNUM(code))
										{
										case 0:for(k=0;k<KEYNUMMER;k++)
													GT_SetGadgetAttrs(Gadgets[k],Wnd,0,GTST_String,"",TAG_DONE);
												break;
										case 1:openas();break;			/* OPEN */
										case 2:openinfo();break;	/* OPEN INFO */
										case 4:save();break;			/* SAVE */
										case 5:saveas();break;		/* SAVE AS */
										case 6:saveasinfo();break;	/* SAVE AS INFO */
										case 8:about();				/* About */
												break;
										case 10:popdown();	 		/* HIDE */
												break;
										case 11:
											for(k=0;k<KEYNUMMER;k++)/* KEYS ZURÜCK */
												{
													strcpy(keys[k],oldkeys[k]);
													DeleteCxObjAll(filter[k]);
													filter[k]=HotKey(keys[k],mp,k);
													AttachCxObj(broker,filter[k]);
												}
												popdown();
												break;
										case 13:quit();					/* QUIT */
												break;
										default:break;
										}
									default:break;
									}
								break;
				case IDCMP_VANILLAKEY:
						switch(code)
						{	
								case 's':
								case 'S':save();
										break;
								case 'h':
								case 'H':popdown();
										break;
								case 'c':
								case 'C':for(k=0;k<KEYNUMMER;k++)/* KEYS ZURÜCK */
										{
											strcpy(keys[k],oldkeys[k]);
											DeleteCxObjAll(filter[k]);
											filter[k]=HotKey(keys[k],mp,k);
											AttachCxObj(broker,filter[k]);
										}
										popdown();
										break;
								case 'q':
								case 'Q':quit();
										break;
								case 'o':
								case 'O':ActivateGadget(Gadgets[0],Wnd,0);break;
								case 'n':
								case 'N':ActivateGadget(Gadgets[1],Wnd,0);break;
								case 'u':
								case 'U':ActivateGadget(Gadgets[2],Wnd,0);break;
								case 'y':
								case 'Y':ActivateGadget(Gadgets[3],Wnd,0);break;
								case 'r':
								case 'R':ActivateGadget(Gadgets[4],Wnd,0);break;
								case 'l':
								case 'L':ActivateGadget(Gadgets[5],Wnd,0);break;
								case 'a':
								case 'A':ActivateGadget(Gadgets[6],Wnd,0);break;
								case 'b':
								case 'B':ActivateGadget(Gadgets[7],Wnd,0);break;
								case 'm':
								case 'M':ActivateGadget(Gadgets[8],Wnd,0);break;
								case 'z':
								case 'Z':ActivateGadget(Gadgets[9],Wnd,0);break;
								case 'w':
								case 'W':ActivateGadget(Gadgets[10],Wnd,0);break;
								case 't':
								case 'T':ActivateGadget(Gadgets[11],Wnd,0);break;
						}
				default:break;
			}
		}

		if(signals & (1<<mp->mp_SigBit))
		while(msg=GetMsg(mp))
			{
				id=CxMsgID((CxMsg *)msg);

				switch( CxMsgType((CxMsg*)msg) )
				{
					case CXM_IEVENT:
							ReplyMsg(msg);
							switch(id)
							{
								case V_ID:worktofront();
										break;
								case AF_ID:activatefront();
										break;
								case B_ID:cycle();
										break;
								case BK_ID:switchstate();
										break;
								case Q_ID:quit();
										break;
								case NS_ID:system("newshell");
										break;
								case BW_ID:bigwindow();
										break;
								case SW_ID:smallwindow();
										break;
								case ZW_ID:zipwindow();
										break;
								case PU_ID:popup();
										break;
								case ATF_ID:activetofront();
										break;
								case CL_ID:closewindow();
										break;
								default:break;
							}
						break;
					case CXM_COMMAND:
							ReplyMsg(msg);
							switch(id)
							{
								case CXCMD_DISABLE:ActivateCxObj(broker,0);break;
								case CXCMD_ENABLE:ActivateCxObj(broker,-1);break;
								case CXCMD_KILL:quit();break;
								case CXCMD_UNIQUE:
								case CXCMD_APPEAR:popup();break;
								case CXCMD_DISAPPEAR:popdown();break;
								default:break;
							}
							break;
					default:
							ReplyMsg(msg);
							break;
				}
			}
	}
}

void openlibs(void)
{
	if(!(AslBase=OpenLibrary("asl.library",37)))
					ende("asl.library not found !");
	if(!(GadToolsBase=OpenLibrary("gadtools.library",37)))
					ende("gadtools.library not found !");
	if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37)))
					ende("graphics.library not found !");
	if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",37)))
					ende("Intuition.library not found !");
	if(!(	ReqToolsBase=(struct ReqToolsBase *)OpenLibrary(REQTOOLSNAME,REQTOOLSVERSION)))
			ende("reqtools.library not found !");
	if(!(CxBase=OpenLibrary("commodities.library",37)))
			ende("commodities.library not found !");
	if(!(IconBase=OpenLibrary("icon.library",37)))
					ende("icon.library not found !");
}

void openrest(void)
{
	int k;
	if(!(mp=CreateMsgPort()))ende("Unable to create MsgPort !");
	nb.nb_Port=mp;

	for(k=0;k<KEYNUMMER;k++)
			filter[k]=HotKey(keys[k],mp,k);

	if(!(broker=CxBroker(&nb,0)))ende(0);/* WT läuft schon */

	for(k=0;k<KEYNUMMER;k++)
	AttachCxObj(broker,filter[k]);

	ActivateCxObj(broker,-1);
}

void ende(char *text)
{
	if(text)rtEZRequest(text,"Continue",NULL, reqtags,NULL);

	CleanStuff();

	if(broker)DeleteCxObjAll(broker);
	if(mp)DeleteMsgPort(mp);

	if(CxBase)CloseLibrary(CxBase);
	if(IntuitionBase)
	{
		DisplayBeep(0);
		CloseLibrary((struct Library *)IntuitionBase);
	}
	if(ReqToolsBase)CloseLibrary ((struct Library *)ReqToolsBase);
	if(GfxBase)CloseLibrary ((struct Library *)GfxBase);
	if(GadToolsBase)CloseLibrary(GadToolsBase);
	if(AslBase)CloseLibrary(AslBase);
	if(IconBase)CloseLibrary((struct Library *)IconBase);

	exit(0);
}

LONG oldpri=4;
void switchstate(void)
{
	state=~state;
	oldpri=SetTaskPri(FindTask(0),oldpri);
}
