/********************************************************************************/
/* Urouhack V1.4 by Tinic Urou 24.03.96                                         */
/*                                                                              */
/* Please leave me a mail, if you are using this code.                          */
/* And, it would be nice, if you could send me a copy of your modified codes    */
/* uuencoded via mail.                                                          */
/*                                                                              */
/* 5uro@informatik.uni-hamburg.de                                               */
/********************************************************************************/

/********************************************************************************/
/* Some macros for class creation handling                                      */
/********************************************************************************/

#define BOOPSI_Class( initName, dispatchName, ClassID, SuperClass, SuperClassPtr, InstantStruct, Flags)\
Class  *initName(void);\
ULONG   dispatchName(Class *, Object *, Msg);\
Class * initName(void)\
{\
    Class *cl;\
    extern ULONG HookEntry();\
    if(cl=MakeClass(ClassID,SuperClass,SuperClassPtr,sizeof(struct InstantStruct), Flags))\
    {\
	cl->cl_Dispatcher.h_Entry   = HookEntry;\
	cl->cl_Dispatcher.h_SubEntry= dispatchName;\
    }\
    return(cl);\
}\
__geta4 ULONG dispatchName(Class *cl, Object *object,Msg msg)\
{\
    struct InstantStruct *data;\
    data=(struct *InstantStruct)0;\
    switch(msg->MethodID)\
    {

#define BOOPSI_Method( MethodID)\
	case MethodID:

#define BOOPSI_Method_End\
	break;

#define BOOPSI_InitData\
	data=INST_DATA(cl,object);

#define BOOPSI_Method_SuperDefault\
	default : return(DoSuperMethodA(cl,object,msg));

#define BOOPSI_Method_SuperReturn\
	return(DoSuperMethodA(cl,object,msg));

#define BOOPSI_End\
    }\
}

/********************************************************************************/
/* Includes and libbases                                                        */
/********************************************************************************/

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <intuition/cghooks.h>
#include <intuition/icclass.h>
#include <utility/tagitem.h>
#include <utility/hooks.h>
#include <clib/intuition_protos.h>
#include <clib/utility_protos.h>
#include <clib/alib_protos.h>
#include <clib/alib_stdio_protos.h>
#include <intuition/IntuitionBase.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <datatypes/datatypes.h>
#include <datatypes/pictureclass.h>
#include <dos/dos.h>
#include <dos/rdargs.h>
#include <exec/memory.h>
#include <exec/tasks.h>
#include <clib/macros.h>

extern       struct IntuitionBase *IntuitionBase;
extern       struct Library       *UtilityBase;
static const char                 *version="$VER: Urouhack V1.4 by Tinic Urou. This is GIFTWARE!";

ULONG       *swim_in_my_pool;

BOOL    pframes         = TRUE,
	psysi           = TRUE,
	sysihackstyle   = FALSE,
	pwin            = TRUE,
	trymwb          = FALSE,
	XStyle          = FALSE;

/********************************************************************************/
/* Append new pens to the DrawInfo and allocate them                            */
/********************************************************************************/

#define HALFSHADOWPEN   (0x000C)
#define HALFSHINEPEN    (0x000D)
#define DARKPAINTPEN    (0x000E)    /* Brown  on MagicWB */
#define SHINEPAINTPEN   (0x000F)    /* Orange on MagicWB */

#define NEWNUMDRIPENS   (0x0010)
#define NEWDRIVERSION   (0x0003)

struct NewPenStruct
{
    UWORD halfdark;
    UWORD halfshine;
    UWORD darkpaint;
    UWORD shinepaint;
};

struct ExtNewPenStruct
{
    ULONG   c1r;
    ULONG   c1g;
    ULONG   c1b;
    ULONG   c2r;
    ULONG   c2g;
    ULONG   c2b;
    ULONG   c3r;
    ULONG   c3g;
    ULONG   c3b;
    ULONG   c4r;
    ULONG   c4g;
    ULONG   c4b;
};

/********************************************************************************/
/* Default shit                                                                 */
/********************************************************************************/

BYTE    b_top   = 3,
	b_bottom= 3,
	b_left  = 3,
	b_right = 3,

	b_height=14,
	b_width =18;

struct NewPenStruct p1={1,0,1,1};
struct NewPenStruct p2={4,5,6,7};

struct NewPenStruct *penlist[256]=
{
    &p1,
    &p2
};

BOOL exttrymwb[256];

char *namelist[256]=
{
    "Free Britanny!",
    "Workbench"
};

/********************************************************************************/
/* Patch area                                                                   */
/********************************************************************************/

static ULONG AllocVecPooled(ULONG *pool, ULONG memsize)
{
    ULONG *memory;
    memsize += ( sizeof(ULONG) + sizeof(ULONG) );
    if(memory=(ULONG *)AllocPooled(pool,memsize))
    {
	memory[0]=pool;
	memory[1]=memsize;
	memory+=2L;        /* Why +=2L? Its a Pointer to ULONG, so DICE will convert this to 8.*/
    }                      /* Didn´t know that and had serious problems with it 8))            */
    return(memory);
}
static void  FreeVecPooled(ULONG *memory)
{
    FreePooled(memory[-2L],memory-2L,memory[-1L]);
}

int GetPubScreens(struct Screen *src, char *namelist[])
{
    struct List     *PubScreenList;
    struct PubScreenNode *ScreenNode;

    PubScreenList = LockPubScreenList();
    for(ScreenNode=(struct PubScreenNode *)PubScreenList->lh_Head;ScreenNode->psn_Node.ln_Succ;ScreenNode=(struct PubScreenNode *)ScreenNode->psn_Node.ln_Succ)
    {
	if(ScreenNode->psn_Screen==src)
	{
	    int i=0;

	    while(namelist[i])
	    {
		if(strcmp(ScreenNode->psn_Node.ln_Name,namelist[i])==0)
		{
		    UnlockPubScreenList();
		    return(i);
		}
		i++;
	    }
	    UnlockPubScreenList();
	    return(0);
	}
    }
    UnlockPubScreenList();
    return(0);
}

__geta4 void allocNewPens(__A2 struct Screen *scr)
{
    struct DrawInfo *dr;
    int                     i;

    static struct ExtNewPenStruct defpens=
    {
	0x80808080,0x80808080,0x80808080,
	0xafafafaf,0xafafafaf,0xafafafaf,
	0xaaaaaaaa,0x99999999,0x77777777,
	0xffffffff,0xa9a9a9a9,0x97979797
    };

    if(dr=GetScreenDrawInfo(scr))
    {
	if(dr->dri_Version==DRI_VERSION)
	{
	    UWORD   *newpens;
	    if(newpens=(UWORD *)AllocVecPooled(swim_in_my_pool, (NEWNUMDRIPENS+1) * sizeof(UWORD) + sizeof(ULONG) ))
	    {
		((ULONG *)newpens)[0] =dr->dri_Pens;
		((ULONG *)newpens)   +=1L;             /* Save old pens */

		CopyMem(dr->dri_Pens,newpens,NUMDRIPENS<<1);
		dr->dri_Pens            = newpens;
		dr->dri_Version         = NEWDRIVERSION;
		newpens[NEWNUMDRIPENS]  = ~0;

		if(i=GetPubScreens(scr,namelist))
		{
		    if(exttrymwb[i]) /* Try to allocate Mwb colors on selected screen */
		    {
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c1r,defpens.c1g, defpens.c1b,OBP_Precision,PRECISION_IMAGE,TAG_DONE);
			newpens[HALFSHADOWPEN]= i>-1 ? i : penlist[0]->halfdark;
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c2r,defpens.c2g, defpens.c2b,OBP_Precision,PRECISION_IMAGE,TAG_DONE);
			newpens[HALFSHINEPEN] = i>-1 ? i : penlist[0]->halfshine;
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c3r,defpens.c3g, defpens.c3b,OBP_Precision,PRECISION_IMAGE,TAG_DONE);
			newpens[DARKPAINTPEN] = i>-1 ? i : penlist[0]->darkpaint;
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c4r,defpens.c4g, defpens.c4b,OBP_Precision,PRECISION_IMAGE,TAG_DONE);
			newpens[SHINEPAINTPEN]= i>-1 ? i : penlist[0]->shinepaint;
		    }
		    else
		    {
			newpens[HALFSHADOWPEN]=penlist[i]->halfdark;
			newpens[HALFSHINEPEN]= penlist[i]->halfshine;
			newpens[DARKPAINTPEN]= penlist[i]->darkpaint;
			newpens[SHINEPAINTPEN]=penlist[i]->shinepaint;
		    }
		}
		else
		{
		    if(trymwb) /* Try to allocate Mwb colors on any screen */
		    {
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c1r,defpens.c1g, defpens.c1b,OBP_Precision,PRECISION_IMAGE,OBP_FailIfBad,TRUE,TAG_DONE);
			newpens[HALFSHADOWPEN]= i>-1 ? i : penlist[0]->halfdark;
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c2r,defpens.c2g, defpens.c2b,OBP_Precision,PRECISION_IMAGE,OBP_FailIfBad,TRUE,TAG_DONE);
			newpens[HALFSHINEPEN] = i>-1 ? i : penlist[0]->halfshine;
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c3r,defpens.c3g, defpens.c3b,OBP_Precision,PRECISION_IMAGE,OBP_FailIfBad,TRUE,TAG_DONE);
			newpens[DARKPAINTPEN] = i>-1 ? i : penlist[0]->darkpaint;
			i=ObtainBestPen(scr->ViewPort.ColorMap,defpens.c4r,defpens.c4g, defpens.c4b,OBP_Precision,PRECISION_IMAGE,OBP_FailIfBad,TRUE,TAG_DONE);
			newpens[SHINEPAINTPEN]= i>-1 ? i : penlist[0]->shinepaint;
		    }
		    else /* No! */
		    {
			newpens[HALFSHADOWPEN]= penlist[0]->halfdark;
			newpens[HALFSHINEPEN] = penlist[0]->halfshine;
			newpens[DARKPAINTPEN] = penlist[0]->darkpaint;
			newpens[SHINEPAINTPEN]= penlist[0]->shinepaint;
		    }
		}
	    }
	}
	FreeScreenDrawInfo(scr,dr);
    }
}

__geta4 freeNewPens(__A0 struct Screen *scr)
{
    struct DrawInfo *dr;
    if(dr=GetScreenDrawInfo(scr))
    {
	if(dr->dri_Version==NEWDRIVERSION)
	{
	    UWORD *newpens  = dr->dri_Pens;
	    dr->dri_Pens    = (UWORD *)((ULONG *)newpens)[-1L];
	    dr->dri_Version = DRI_VERSION;

	    FreeVecPooled     (((ULONG *)newpens)-1L);
	    FreeScreenDrawInfo(scr,dr);
	}
    }
}

/********************************************************************************/
/* This change is needed for some programs like DeliTrackerII etc...            */
/********************************************************************************/

__geta4 void changeSize(__A0 struct NewWindow *win,__A1 struct TagItem *tags)
{
    struct TagItem  *ti;
    if(tags)
    {
	ULONG flags=GetTagData(WA_Flags,win ? win->Flags : 0 ,tags); /* Oh yeah, I forgot to check if win was TRUE in 1.3 8)) */
	if(flags&WFLG_SIZEGADGET)
	{
	    if(flags&WFLG_SIZEBBOTTOM)
	    {
		if(ti=FindTagItem(WA_InnerHeight,tags))
		{
		    ti->ti_Data+=(b_height-10);
		}
	    }
	    if(flags&WFLG_SIZEBRIGHT)
	    {
		if(ti=FindTagItem(WA_InnerWidth,tags))
		{
		    ti->ti_Data+=(b_width-10);
		}
	    }
	}
    }
}

/********************************************************************************/
/* standard function for drawing frames, I should convert this to assembler.... */
/********************************************************************************/

void draw_frame(struct RastPort *rp, UWORD x, UWORD y, UWORD width, UWORD height, UWORD col1, UWORD col2, UWORD col3, UWORD col4, UWORD col5, BOOL bg)
{
    if((width>x)&&(height>y))
    {
	UWORD *ptr=rp->AreaPtrn; rp->AreaPtrn=0L;
	SetAPen(rp,col1);
	RectFill(rp,x,y,width,y);
	RectFill(rp,x,y,x,height);
	SetAPen(rp,col2);
	RectFill(rp,width,y,width,height);
	RectFill(rp,x,height,width,height);
	x++;y++;height--;width--;
	if(bg)
	{
	    SetAPen(rp,col5);
	    RectFill(rp,x+1,y+1,width-1,height-1);
	}
	SetAPen(rp,col3);
	RectFill(rp,x,y,width,y);
	RectFill(rp,x,y,x,height);
	SetAPen(rp,col4);
	RectFill(rp,x,height,width,height);
	RectFill(rp,width,y,width,height);
	rp->AreaPtrn=ptr;
    }
}

void draw_simple(struct RastPort *rp,UWORD x, UWORD y, UWORD width, UWORD height, UWORD col1, UWORD col2)
{
    if((width>x)&&(height>y))
    {
	SetAPen(rp,col1);
	RectFill(rp,x,y,width,y);
	RectFill(rp,x,y,x,height);
	SetAPen(rp,col2);
	RectFill(rp,width,y,width,height);
	RectFill(rp,x,height,width,height);
    }
}

/******************************************************************/
/* FRAMEICLASS Hack                                               */
/******************************************************************/

struct FRAMEData
{
    ULONG type;
    ULONG edgesonly;
    ULONG recessed;
    ULONG data;
};

BOOL DrawXEN(struct impDraw *imsg,struct FRAMEData *data, struct RastPort *rp, UWORD minx, UWORD miny, UWORD maxx, UWORD maxy, UWORD *pens)
{
    switch (data->type)
    {
	case    FRAME_DEFAULT:
	case    FRAME_BUTTON:
		if (imsg->imp_State==IDS_NORMAL)
		{
		    if(data->edgesonly)
		    {
			if(!data->recessed) draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[SHADOWPEN],pens[HALFSHINEPEN],pens[HALFSHADOWPEN],0,FALSE);
			else                draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],0,FALSE);
		    }
		    else
		    {
			if(!data->recessed) draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],TRUE);
			else                draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHADOWPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[BACKGROUNDPEN],TRUE);
		    }
		}
		else
		{
		    if(data->edgesonly)     draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],0,FALSE);
		    else                    draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHADOWPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[BACKGROUNDPEN],TRUE);
		}
		break;
	case    FRAME_RIDGE:
		if(data->edgesonly)
		{
		    if(!data->recessed)     draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[SHADOWPEN],pens[SHADOWPEN],pens[SHINEPEN],0,FALSE);
		    else                    draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHINEPEN],pens[SHINEPEN],pens[SHADOWPEN],0,FALSE);
		}
		else
		{
		    if(!data->recessed)     draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[SHADOWPEN],pens[SHADOWPEN],pens[SHINEPEN],pens[BACKGROUNDPEN],TRUE);
		    else                    draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHINEPEN],pens[SHINEPEN],pens[SHADOWPEN],pens[BACKGROUNDPEN],TRUE);
		}
		break;
    }
    return(TRUE);
}

BOOL DrawX(struct impDraw *imsg,struct FRAMEData *data, struct RastPort *rp, UWORD minx, UWORD miny, UWORD maxx, UWORD maxy, UWORD *pens)
{
    switch (data->type)
    {
	case    FRAME_DEFAULT:
	case    FRAME_BUTTON:
		if (imsg->imp_State==IDS_NORMAL)
		{
		    if(data->edgesonly)
		    {
			if(!data->recessed) draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],0,FALSE);
			else                draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],0,FALSE);
		    }
		    else
		    {
			if(!data->recessed) draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],TRUE);
			else                draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[BACKGROUNDPEN],TRUE);
		    }
		}
		else
		{
		    if(data->edgesonly)     draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],0,FALSE);
		    else                    draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[BACKGROUNDPEN],TRUE);
		}
		break;
	case    FRAME_RIDGE:
		if(data->edgesonly)
		{
		    if(!data->recessed)     draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],0,FALSE);
		    else                    draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],0,FALSE);
		}
		else
		{
		    if(!data->recessed)     draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[BACKGROUNDPEN],TRUE);
		    else                    draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[BACKGROUNDPEN],TRUE);
		}
		break;
    }
    return(TRUE);
}


BOOPSI_Class(initFRAMEClass,dispatchFRAME,"frameiclass","breizhclass",NULL,FRAMEData, 0)

    BOOPSI_Method(OM_NEW)
    {
	ULONG   type,edgesonly,recessed;
	type      =GetTagData(IA_FrameType,0L,((struct opSet *)msg)->ops_AttrList);
	edgesonly =GetTagData(IA_EdgesOnly,0L,((struct opSet *)msg)->ops_AttrList);
	recessed  =GetTagData(IA_Recessed ,0L,((struct opSet *)msg)->ops_AttrList);
	if(object=(Object *)DoSuperMethodA(cl,object,msg))
	{
	    BOOPSI_InitData
	    data->type      =type;
	    data->edgesonly =edgesonly;
	    data->recessed  =recessed;
	}
	return(object);
    }
    BOOPSI_Method_End

    BOOPSI_Method(IM_DRAWFRAME)
    BOOPSI_Method(IM_DRAW)
    {
	BOOPSI_InitData

	if((data->type==FRAME_BUTTON)||(data->type==FRAME_RIDGE))
	{
	    struct  impDraw     *imsg;
	    imsg=(struct impDraw *)msg;
	    if(imsg->imp_DrInfo)
	    {
		UWORD   *pens;
		pens=imsg->imp_DrInfo->dri_Pens;
		if(imsg->imp_DrInfo->dri_Version==NEWDRIVERSION)
		{
		    UWORD   minx,miny,maxx,maxy;
		    struct  RastPort    *rp;
		    rp  =imsg->imp_RPort;
		    minx=imsg->imp_Offset.X+((struct Image *)object)->LeftEdge;
		    miny=imsg->imp_Offset.Y+((struct Image *)object)->TopEdge;
		    maxx=minx+((msg->MethodID==IM_DRAWFRAME) ? imsg->imp_Dimensions.Width  : ((struct Image *)object)->Width )-1;
		    maxy=miny+((msg->MethodID==IM_DRAWFRAME) ? imsg->imp_Dimensions.Height : ((struct Image *)object)->Height)-1;
		    if(XStyle)
		    {
			return(DrawX(imsg,data,rp,minx,miny,maxx,maxy,pens));
		    }
		    else
		    {
			return(DrawXEN(imsg,data,rp,minx,miny,maxx,maxy,pens));
		    }
		}
	    }
	}
	BOOPSI_Method_SuperReturn
    }
    BOOPSI_Method_End

    BOOPSI_Method_SuperDefault

BOOPSI_End

/********************************************************************/
/* GADCLASS Hack                                                    */
/*                                                                  */
/* This patch is needed to adjust the position of the sizing gadget */
/********************************************************************/

struct GADData
{
    ULONG what;
};

BOOPSI_Class(initGADClass, dispatchGADClass, "buttongclass","tinicclass",NULL,GADData, 0)

    BOOPSI_Method(OM_NEW)
    {
	ULONG type=GetTagData(GA_SysGType,0L,((struct opSet *)msg)->ops_AttrList);

	if(object=(Object *)DoSuperMethodA(cl,object,msg))
	{
	    if(type==GTYP_SIZING)
	    {
		SetAttrs(object,GA_RelBottom,1-((struct Gadget *)(object))->Height,
				GA_RelRight, 1-((struct Gadget *)(object))->Width,
				TAG_DONE);
	    }
	}
	return(object);
    }
    BOOPSI_Method_End

    BOOPSI_Method_SuperDefault

BOOPSI_End

/******************************************************************/
/* SYSIClass Hack                                                 */
/******************************************************************/

struct SYSIData
{
    UWORD what;
    UWORD dummy;
};

ULONG DrawUrou(struct SYSIData *data,struct impDraw *imsg,Object *object, Class *cl, Msg msg)
{
    UWORD   y_size,dummy,minx,miny,maxx,maxy;
    struct  RastPort    *rp;
    UWORD   *pens;
    pens=imsg->imp_DrInfo->dri_Pens;
    rp=imsg->imp_RPort;
    y_size=((struct Image *)object)->Height-1;
    dummy=(y_size+1)>>1;
    minx=imsg->imp_Offset.X+((struct Image *)object)->LeftEdge;
    miny=imsg->imp_Offset.Y+((struct Image *)object)->TopEdge;
    maxx=minx+((struct Image *)object)->Width-1;
    maxy=miny+((struct Image *)object)->Height-1;

    switch (data->what)
    {
	case    SDEPTHIMAGE:
		SetAPen(rp,pens[BACKGROUNDPEN]);
		RectFill(rp,minx+1,miny+1,maxx-1,maxy-1);
	case    ZOOMIMAGE:
	case    DEPTHIMAGE:
		minx++;
	case    LEFTIMAGE:
	case    UPIMAGE:
	case    DOWNIMAGE:
	case    RIGHTIMAGE:
	case    SIZEIMAGE:
	case    CLOSEIMAGE:
		if(XStyle)
		{
		    if(imsg->imp_State==IDS_SELECTED) draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHINEPEN],TRUE);
		    else                              draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],TRUE);
		}
		else
		{
		    if(imsg->imp_State==IDS_SELECTED) draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],pens[BACKGROUNDPEN],TRUE);
		    else                              draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[SHADOWPEN],pens[HALFSHINEPEN],pens[HALFSHADOWPEN],pens[BACKGROUNDPEN],TRUE);
		}
		break;
    };
    switch (data->what)
    {
	case    LEFTIMAGE:
		SetAPen(rp,pens[SHADOWPEN]);
		Move(rp,minx+3,miny+dummy);
		Draw(rp,maxx-3,maxy-3);
		Draw(rp,maxx-3,miny+3);
		SetAPen(rp,pens[SHINEPEN]);
		Draw(rp,minx+3,maxy-dummy);
		return(0L);
	case    RIGHTIMAGE:
		SetAPen(rp,pens[SHINEPEN]);
		Move(rp,maxx-3,maxy-dummy);
		Draw(rp,minx+3,miny+3);
		Draw(rp,minx+3,maxy-3);
		SetAPen(rp,pens[SHADOWPEN]);
		Draw(rp,maxx-3,miny+dummy);
		return(0L);
	case    UPIMAGE:
		SetAPen(rp,pens[SHADOWPEN]);
		Move(rp,maxx-((maxx-minx)>>1),miny+3);
		Draw(rp,maxx-3,maxy-3);
		Draw(rp,minx+3,maxy-3);
		SetAPen(rp,pens[SHINEPEN]);
		Draw(rp,minx+((maxx-minx)>>1),miny+3);
		return(0L);
	case    DOWNIMAGE:
		SetAPen(rp,pens[SHADOWPEN]);
		Move(rp,maxx-((maxx-minx)>>1),maxy-3);
		Draw(rp,maxx-3,miny+3);
		SetAPen(rp,pens[SHINEPEN]);
		Draw(rp,minx+3,miny+3);
		Draw(rp,minx+((maxx-minx)>>1),maxy-3);
		return(0L);
		break;
	case    SIZEIMAGE:
		switch (imsg->imp_State)
		{
		    case    IDS_NORMAL:
		    case    IDS_SELECTED:
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+1,miny+1,minx+((maxx-minx)>>1)-1,miny+dummy-1);
			    break;
		}
		SetAPen(rp,pens[SHADOWPEN]);
		RectFill(rp,minx+1,miny+dummy,minx+((maxx-minx)>>1),miny+dummy);
		RectFill(rp,minx+((maxx-minx)>>1),miny+1,minx+((maxx-minx)>>1),miny+dummy);
		SetAPen(rp,pens[SHINEPEN]);
		RectFill(rp,minx+1,miny+dummy+1,minx+((maxx-minx)>>1)+1,miny+dummy+1);
		RectFill(rp,minx+((maxx-minx)>>1)+1,miny+1,minx+((maxx-minx)>>1)+1,miny+dummy+1);
		return(0L);
	case    CLOSEIMAGE:
		SetAPen(rp,pens[SHINEPEN]);
		RectFill(rp,maxx+1,miny+1,maxx+1,maxy);
		switch (imsg->imp_State)
		{
		    case    IDS_NORMAL:
			    SetAPen(rp,pens[SHINEPEN]);
			    RectFill(rp,minx+4,miny+dummy-2,maxx-4,miny+dummy-2);
			    RectFill(rp,minx+4,miny+dummy-2,minx+4,miny+dummy+1);
			    SetAPen(rp,pens[SHADOWPEN]);
			    RectFill(rp,minx+4,miny+dummy+1,maxx-4,miny+dummy+1);
			    RectFill(rp,maxx-4,miny+dummy-2,maxx-4,miny+dummy+1);
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+5,miny+dummy-1,maxx-5,miny+dummy);
			    break;
		    case    IDS_SELECTED:
			    RectFill(rp,minx+6,miny+dummy-2,maxx-6,miny+dummy-2);
			    RectFill(rp,minx+6,miny+dummy-2,minx+6,miny+dummy+1);
			    SetAPen(rp,pens[SHADOWPEN]);
			    RectFill(rp,minx+6,miny+dummy+1,maxx-6,miny+dummy+1);
			    RectFill(rp,maxx-6,miny+dummy-2,maxx-6,miny+dummy+1);
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+7,miny+dummy-1,maxx-7,miny+dummy);
			    break;
		    default:
			    SetAPen(rp,pens[SHINEPEN]);
			    RectFill(rp,minx+4,miny+dummy-2,maxx-4,miny+dummy-2);
			    RectFill(rp,minx+4,miny+dummy-2,minx+4,miny+dummy+1);
			    SetAPen(rp,pens[SHADOWPEN]);
			    RectFill(rp,minx+4,miny+dummy+1,maxx-4,miny+dummy+1);
			    RectFill(rp,maxx-4,miny+dummy-2,maxx-4,miny+dummy+1);
			    break;
		}
		return(0L);
	case    DEPTHIMAGE:
	case    SDEPTHIMAGE:
		minx--;
		SetAPen(rp,pens[SHADOWPEN]);
		RectFill(rp,minx,miny+1,minx,maxy);
		switch (imsg->imp_State)
		{
		    case    IDS_NORMAL:
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-3,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-5,pens[SHINEPEN],pens[SHADOWPEN]);
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+5,miny+4,minx+((maxx-minx)>>1)+2,maxy-6);
			    break;
		    case    IDS_SELECTED:
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-5,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-3,pens[SHINEPEN],pens[SHADOWPEN]);
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+((maxx-minx)>>1),miny+6,maxx-4,maxy-4);
			    break;
		    default:
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-3,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-5,pens[SHINEPEN],pens[SHADOWPEN]);
			    SetAPen(rp,pens[BACKGROUNDPEN]);
			    RectFill(rp,minx+5,miny+4,minx+((maxx-minx)>>1)+2,maxy-6);
			    break;
		}
		return(0L);
	case    ZOOMIMAGE:
		minx--;
		SetAPen(rp,pens[SHADOWPEN]);
		RectFill(rp,minx,miny+1,minx,maxy);
		draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+dummy-1,maxx-((maxx-minx)>>1)+2,miny+dummy,pens[SHADOWPEN],pens[SHINEPEN]);
		return(0L);
	default:
		BOOPSI_Method_SuperReturn
    }
}

ULONG DrawSysiHack(struct SYSIData *data,struct impDraw *imsg,Object *object, Class *cl, Msg msg)
{
    UWORD   y_size,dummy,minx,miny,maxx,maxy,h,w;
    struct  RastPort    *rp;
    UWORD   *pens;
    pens=imsg->imp_DrInfo->dri_Pens;
    rp=imsg->imp_RPort;
    y_size=((struct Image *)object)->Height-1;
    dummy=(y_size+1)>>1;
    minx=imsg->imp_Offset.X+((struct Image *)object)->LeftEdge;
    miny=imsg->imp_Offset.Y+((struct Image *)object)->TopEdge;
    w=((struct Image *)object)->Width;
    h=((struct Image *)object)->Height;
    maxx=minx+w-1;
    maxy=miny+h-1;

    switch (data->what)
    {
	case    ZOOMIMAGE:
	case    DEPTHIMAGE:
		minx++;
	case    LEFTIMAGE:
	case    UPIMAGE:
	case    DOWNIMAGE:
	case    RIGHTIMAGE:
	case    SIZEIMAGE:
	case    CLOSEIMAGE:
		switch(imsg->imp_State)
		{
		    case    IDS_SELECTED:
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+1,miny+1,maxx-1,maxy-1);
			    draw_simple(rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHINEPEN]);
			    break;
		    case    IDS_NORMAL:
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+1,miny+1,maxx-1,maxy-1);
			    draw_simple(rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[SHADOWPEN]);
			    break;
		    default:
			    SetAPen(rp,pens[BACKGROUNDPEN]);
			    RectFill(rp,minx+1,miny+1,maxx-1,maxy-1);
			    draw_simple(rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[SHADOWPEN]);
			    break;
		}
		break;
	case    SDEPTHIMAGE:
		SetAPen(rp,pens[BACKGROUNDPEN]);
		RectFill(rp,minx+1,miny+1,maxx-1,maxy-1);
		if(imsg->imp_State==IDS_SELECTED) draw_simple(rp,minx+1,miny,maxx,maxy,pens[SHADOWPEN],pens[SHINEPEN]);
		else                              draw_simple(rp,minx+1,miny,maxx,maxy,pens[SHINEPEN],pens[SHADOWPEN]);
		break;
    };
    switch (data->what)
    {
	case    LEFTIMAGE:
		SetAPen(rp,pens[SHADOWPEN]);
		Move(rp,minx+3,miny+dummy);
		Draw(rp,maxx-3,maxy-3);
		Draw(rp,maxx-3,miny+3);
		SetAPen(rp,pens[SHINEPEN]);
		Draw(rp,minx+3,maxy-dummy);
		return(0L);
	case    RIGHTIMAGE:
		SetAPen(rp,pens[SHINEPEN]);
		Move(rp,maxx-3,maxy-dummy);
		Draw(rp,minx+3,miny+3);
		Draw(rp,minx+3,maxy-3);
		SetAPen(rp,pens[SHADOWPEN]);
		Draw(rp,maxx-3,miny+dummy);
		return(0L);
	case    UPIMAGE:
		SetAPen(rp,pens[SHADOWPEN]);
		Move(rp,maxx-((maxx-minx)>>1),miny+3);
		Draw(rp,maxx-3,maxy-3);
		Draw(rp,minx+3,maxy-3);
		SetAPen(rp,pens[SHINEPEN]);
		Draw(rp,minx+((maxx-minx)>>1),miny+3);
		return(0L);
	case    DOWNIMAGE:
		SetAPen(rp,pens[SHADOWPEN]);
		Move(rp,maxx-((maxx-minx)>>1),maxy-3);
		Draw(rp,maxx-3,miny+3);
		SetAPen(rp,pens[SHINEPEN]);
		Draw(rp,minx+3,miny+3);
		Draw(rp,minx+((maxx-minx)>>1),maxy-3);
		return(0L);
		break;
	case    ZOOMIMAGE:
		minx--;
		SetAPen(rp,pens[SHADOWPEN]);
		RectFill(rp,minx,miny+1,minx,maxy);
		if(imsg->imp_State==IDS_SELECTED)
		{
		    draw_simple(rp,minx+4,miny+3,maxx-4,maxy-3,pens[SHINEPEN],pens[SHADOWPEN]);
		    draw_simple(rp,minx+5,miny+4,maxx-((w-4)>>1),maxy-((h-4)>>1)-1,pens[SHADOWPEN],pens[SHINEPEN]);
		}
		else
		{
		    draw_simple(rp,minx+4,miny+3,maxx-4,maxy-3,pens[SHADOWPEN],pens[SHINEPEN]);
		    draw_simple(rp,minx+5,miny+4,maxx-((w-4)>>1),maxy-((h-4)>>1)-1,pens[SHINEPEN],pens[SHADOWPEN]);
		}
		return(0L);
	case    CLOSEIMAGE:
		{
		    UWORD foo,fao;
		    SetAPen(rp,pens[SHINEPEN]);
		    RectFill(rp,maxx+1,miny+1,maxx+1,maxy);
		    foo=(h-1)/3;
		    fao=(w-1)/3;
		    if(imsg->imp_State==IDS_SELECTED)
		    {

			draw_simple(rp,minx+fao+1,miny+foo+1,maxx-fao-1,maxy-foo-1,pens[SHADOWPEN],pens[SHINEPEN]);
		    }
		    else
		    {
			draw_simple(rp,minx+fao,miny+foo,maxx-fao,maxy-foo,pens[SHADOWPEN],pens[SHINEPEN]);
		    }
		}
		return(0L);
	case    DEPTHIMAGE:
		minx--;
		SetAPen(rp,pens[SHADOWPEN]);
		RectFill(rp,minx,miny+1,minx,maxy);
		switch (imsg->imp_State)
		{
		    case    IDS_NORMAL:
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-2,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-4,pens[SHADOWPEN],pens[SHINEPEN]);
			    SetAPen(rp,pens[FILLPEN]);
			    RectFill(rp,minx+((maxx-minx)>>1),miny+6,maxx-4,maxy-3);
			    break;
		    case    IDS_SELECTED:
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-4,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-2,pens[SHINEPEN],pens[SHADOWPEN]);
			    break;
		    default:
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-2,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-4,pens[SHADOWPEN],pens[SHINEPEN]);
			    SetAPen(rp,pens[BACKGROUNDPEN]);
			    RectFill(rp,minx+((maxx-minx)>>1),miny+6,maxx-4,maxy-3);
			    break;
		}
		return(0L);
	case    SDEPTHIMAGE:
		SetAPen(rp,pens[SHADOWPEN]);
		RectFill(rp,minx,miny+1,minx,maxy);
		switch (imsg->imp_State)
		{
		    case    IDS_NORMAL:
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-2,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-4,pens[SHADOWPEN],pens[SHINEPEN]);
			    SetAPen(rp,pens[BACKGROUNDPEN]);
			    RectFill(rp,minx+((maxx-minx)>>1),miny+6,maxx-4,maxy-3);
			    break;
		    case    IDS_SELECTED:
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-4,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-2,pens[SHINEPEN],pens[SHADOWPEN]);
			    break;
		    default:
			    draw_simple(rp,minx+((maxx-minx)>>1)-1,miny+5,maxx-3,maxy-2,pens[SHINEPEN],pens[SHADOWPEN]);
			    draw_simple(rp,minx+4,miny+3,minx+((maxx-minx)>>1)+3,maxy-4,pens[SHADOWPEN],pens[SHINEPEN]);
			    SetAPen(rp,pens[BACKGROUNDPEN]);
			    RectFill(rp,minx+((maxx-minx)>>1),miny+6,maxx-4,maxy-3);
			    break;
		}
		return(0L);
	case    SIZEIMAGE:
		minx--;
		SetAPen(rp,pens[SHADOWPEN]);
		Move(rp,maxx-3,miny+3);
		Draw(rp,maxx-3,maxy-3);
		Draw(rp,minx+3,maxy-3);
		SetAPen(rp,pens[SHINEPEN]);
		Draw(rp,maxx-3,miny+3);
		return(0L);
	default:
		BOOPSI_Method_SuperReturn
    }
}

BOOPSI_Class(initSYSIClass,dispatchSYSIClass,"sysiclass","urouclass",NULL,SYSIData, 0)

    BOOPSI_Method(OM_NEW)
    {
	ULONG               what;
	BOOL                adjust_h=TRUE;
	BOOL                adjust_w=TRUE;
	struct  DrawInfo    *mydr;

	if(FindTagItem(IA_Height,((struct opSet *)msg)->ops_AttrList))adjust_h=FALSE;
	if(FindTagItem(IA_Width, ((struct opSet *)msg)->ops_AttrList))adjust_w=FALSE;

	what=   GetTagData(SYSIA_Which, 0x0, ((struct opSet *)msg)->ops_AttrList);
	mydr=   (struct DrawInfo *)GetTagData(SYSIA_DrawInfo,0x0,((struct opSet *)msg)->ops_AttrList);
	if(object=(Object *)DoSuperMethodA(cl,object,msg))
	{
	    BOOPSI_InitData

	    switch(what)
	    {
		case    SIZEIMAGE:
			SetAttrs(object,IA_Width,b_width,IA_Height,b_height,TAG_DONE);
			break;
		case    LEFTIMAGE:
		case    RIGHTIMAGE:
		case    UPIMAGE:
		case    DOWNIMAGE:
			if(adjust_h)
			{
			    SetAttrs(object,IA_Height,b_height,TAG_DONE);
			}
			if(adjust_w)
			{
			    SetAttrs(object,IA_Width,b_width,TAG_DONE);
			}
			break;
		case    CLOSEIMAGE:
		case    ZOOMIMAGE:
		case    DEPTHIMAGE:
			{
			    LONG    tmp;
			    GetAttr(IA_Height,object,&tmp);
			    if(tmp)  SetAttrs(object,IA_Height,tmp+(b_top-2),TAG_DONE);
			}
			break;
	    }
	    data->what=what;
	}
	return(object);
    }
    BOOPSI_Method_End

    BOOPSI_Method(IM_DRAW)
    {
	struct  impDraw     *imsg;

	BOOPSI_InitData;

	if((imsg=(struct impDraw *)msg)->imp_DrInfo)
	{
	    if(imsg->imp_DrInfo->dri_Version==NEWDRIVERSION)
	    {
		switch (data->what)
		{
		    case    CHECKIMAGE:
		    case    MXIMAGE:
			    {
				UWORD   minx,miny,maxx,maxy;
				struct  RastPort    *rp=imsg->imp_RPort;
				UWORD   *pens=imsg->imp_DrInfo->dri_Pens;
				minx=imsg->imp_Offset.X+((struct Image *)object)->LeftEdge;
				miny=imsg->imp_Offset.Y+((struct Image *)object)->TopEdge;
				maxx=minx+((struct Image *)object)->Width -1;
				maxy=miny+((struct Image *)object)->Height-1;
				if(XStyle)
				{
				    if(imsg->imp_State==IDS_SELECTED) draw_frame (rp,minx,miny,maxx,maxy,pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHINEPEN],TRUE);
				    else                              draw_frame (rp,minx,miny,maxx,maxy,pens[SHINEPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],TRUE);
				}
				else
				{
				    if(imsg->imp_State==IDS_SELECTED) draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHADOWPEN],pens[HALFSHADOWPEN],pens[SHINEPEN],pens[HALFSHINEPEN],TRUE);
				    else                              draw_frame (rp,minx,miny,maxx,maxy,pens[SHADOWPEN],pens[SHADOWPEN],pens[SHINEPEN],pens[HALFSHADOWPEN],pens[HALFSHINEPEN],TRUE);
				}
				if(imsg->imp_State==IDS_SELECTED)
				{
				    SetAPen(rp,pens[FILLPEN]);
				    if(((maxx-minx)>5)&&((maxy-miny)>5)) RectFill(rp,minx+3,miny+3,maxx-3,maxy-3);
				}
			    }
			    return(TRUE);
			    break;
		    default:
			    if(sysihackstyle)
			    {
				return(DrawSysiHack(data,imsg,object,cl,msg));
			    }
			    else
			    {
				return(DrawUrou    (data,imsg,object,cl,msg));
			    }
			    break;
		}
	    }
	}
	BOOPSI_Method_SuperReturn;
    }
    BOOPSI_Method_End

    BOOPSI_Method_SuperDefault
BOOPSI_End

/************************************************************************/
/* Patched functions                                                    */
/************************************************************************/

ULONG  oldOTLRoutine;
extern newOTLRoutine();
ULONG  oldOSRoutine;
extern newOSRoutine();
ULONG  oldCSRoutine;
extern newCSRoutine();
ULONG  oldOWTLRoutine;
extern newOWTLRoutine();
ULONG  oldOWRoutine;
extern newOWRoutine();

fail()
{
    PutStr("***uRøURAçK sUCKS! Please run it before any screen was opened or IPrefs was started!\n\nPlease reboot your machine now, the system could be unstable!");
    exit(0);
}

enum{SCRFIL,WIN_TOP,WIN_BOT,WIN_LEF,WIN_RIG,FINBOT,FINRIG,PATFRAME,PATSYSI,ONLYWIN,TRYMWB,SYSISTYLE,XWIN,ARG_COUNT};
#define ARGTEMPLATE "SCREENFILE/M,WINDOW_TOP/K/N,WINDOW_BOTTOM/K/N,WINDOW_LEFT/K/N,WINDOW_RIGHT/K/N,FINE_BOTTOM/K/N,FINE_RIGHT/K/N,NOFRAMEPATCH/S,NOSYSIPATCH/S,ONLYWINDOWIMAGES/S,TRYMAGICWB/S,SYSIHACKSTYLE/S,XWINSTYLE/S"

enum{SCRNAME,SCRPEN1,SCRPEN2,SCRPEN3,SCRPEN4,ALLMWB,SCRARG_COUNT};
#define SCRARGTMPL "SCREEN,PEN1/N,PEN2/N,PEN3/N,PEN4/N,ALLOCATEMWB/S"

getscreenlist(char *filename)
{
    BPTR    file;
    STRPTR  *ArgArray;
    char    *line,*name;

    if(line=(char *)AllocVecPooled(swim_in_my_pool,256L))
    {
	if(file=(BPTR)Open(filename,MODE_OLDFILE))
	{
	    int i=0;
	    while(FGets(file,line,255))
	    {
		i++;
		if(penlist[i]=(struct NewPenStruct *)AllocVecPooled(swim_in_my_pool,sizeof(struct NewPenStruct)))
		{
		    if(ArgArray = (STRPTR *)AllocVecPooled(swim_in_my_pool,(sizeof(STRPTR) * (SCRARG_COUNT)) + 16L))
		    {
			struct RDArgs *rd;
			if(rd=(struct RDArgs *)AllocDosObject(DOS_RDARGS,TAG_DONE))
			{
			    rd->RDA_Source.CS_Buffer=line;
			    rd->RDA_Source.CS_Length=strlen(line);
			    rd->RDA_Source.CS_CurChr=0L;

			    if(ReadArgs(SCRARGTMPL,(LONG *)ArgArray,rd))
			    {
				if(ArgArray[SCRNAME])
				{
				    if(name = (char *)((LONG *)ArgArray[SCRNAME]))
				    {
					if(namelist[i]=(char *)AllocVecPooled(swim_in_my_pool,strlen(name)+4L))
					{
					    strcpy(namelist[i],name);
					}
				    }
				}
				if(ArgArray[SCRPEN1])
				{
				    penlist[i]->halfdark   = (UWORD)(*(LONG *)ArgArray[SCRPEN1])&0xFFFF;
				}
				if(ArgArray[SCRPEN2])
				{
				    penlist[i]->halfshine  = (UWORD)(*(LONG *)ArgArray[SCRPEN2])&0xFFFF;
				}
				if(ArgArray[SCRPEN3])
				{
				    penlist[i]->darkpaint  = (UWORD)(*(LONG *)ArgArray[SCRPEN3])&0xFFFF;
				}
				if(ArgArray[SCRPEN4])
				{
				    penlist[i]->shinepaint = (UWORD)(*(LONG *)ArgArray[SCRPEN4])&0xFFFF;
				}
				if(ArgArray[ALLMWB])
				{
				    exttrymwb[i]=TRUE;
				}
				FreeArgs(rd);
			    }
			    FreeDosObject(rd);
			}
			FreeVecPooled(ArgArray);
		    }
		}
	    }
	    Close(file);
	}
	else PutStr("***UROUHACK: Could not open screenlist file!");
	FreeVecPooled(line);
    }
}

getconfig()
{
    STRPTR  *ArgArray;
    if(ArgArray = (STRPTR *)AllocVecPooled(swim_in_my_pool,(sizeof(STRPTR) * (ARG_COUNT)) + 16L))
    {
	struct RDArgs *rd;
	if(rd=(struct RDArgs *)AllocDosObject(DOS_RDARGS,TAG_DONE))
	{
	    if(ReadArgs(ARGTEMPLATE,(LONG *)ArgArray,rd))
	    {
		if(ArgArray[SCRFIL])
		{
		    if((char *)(*(LONG *)ArgArray[SCRFIL]))
		    {
			getscreenlist((char *)(*(LONG *)ArgArray[SCRFIL]));
		    }
		}
		if(ArgArray[WIN_TOP])
		{
		    b_top = (BYTE)(*(LONG *)ArgArray[WIN_TOP])&0xFF;
		}
		if(ArgArray[WIN_BOT])
		{
		    b_bottom = (BYTE)(*(LONG *)ArgArray[WIN_BOT])&0xFF;
		}
		if(ArgArray[WIN_LEF])
		{
		    b_left = (BYTE)(*(LONG *)ArgArray[WIN_LEF])&0xFF;
		}
		if(ArgArray[WIN_RIG])
		{
		    b_right = (BYTE)(*(LONG *)ArgArray[WIN_RIG])&0xFF;
		}
		if(ArgArray[FINBOT])
		{
		    b_height = (*(LONG *)ArgArray[FINBOT])&0xFF;
		}
		if(ArgArray[FINRIG])
		{
		    b_width = (*(LONG *)ArgArray[FINBOT])&0xFF;
		}
		if(ArgArray[PATFRAME])
		{
		    pframes=FALSE;
		}
		if(ArgArray[PATSYSI])
		{
		    psysi=FALSE;
		}
		if(ArgArray[ONLYWIN])
		{
		    pwin=FALSE;
		}
		if(ArgArray[TRYMWB])
		{
		    trymwb=TRUE;
		}
		if(ArgArray[SYSISTYLE])
		{
		    sysihackstyle=TRUE;
		}
		if(ArgArray[XWIN])
		{
		    XStyle=TRUE;
		}
		FreeArgs(rd);
	    }
	    FreeDosObject(rd);
	}
	FreeVecPooled(ArgArray);
    }
}

void main(int argc, char *argv[])
{
    UWORD   pens[8];
    struct  TextAttr topaz_font = { "topaz.font", 8, 0, FPF_ROMFONT, };
    struct  DrawInfo mydrawinfo = { DRI_VERSION, 9, &pens[BACKGROUNDPEN], 0, 2, 1, 1, NULL, NULL, NULL, 0, 0, 0, 0, 0 };
    Class   *my_cl,*oldcl;
    Object  *g;
    if(swim_in_my_pool=(ULONG *)CreatePool(MEMF_CLEAR|MEMF_PUBLIC,8192L,4096L))
    {
	getconfig();
	if(pframes)
	{
	    Forbid();
	    oldOTLRoutine = SetFunction(IntuitionBase,(WORD)-612,newOTLRoutine);
	    oldOSRoutine  = SetFunction(IntuitionBase,(WORD)-198,newOSRoutine);
	    oldCSRoutine  = SetFunction(IntuitionBase,(WORD)-66 ,newCSRoutine);
	    Permit();
	    if( g=(Object *)NewObject(NULL,"frameiclass",IA_Width,10,IA_Height,10, TAG_END))
	    {
		oldcl=OCLASS(g); DisposeObject(g);
		Forbid();

		oldcl->cl_ID="breizhclass";

		if(my_cl=initFRAMEClass())
		{
		    AddClass(my_cl);
		    Permit();
		}
		else fail();
	    }
	    else fail();
	}
	if(psysi)
	{
	    mydrawinfo.dri_Font=(struct TextFont *)OpenFont(&topaz_font);
	    Forbid();
	    oldOWTLRoutine= SetFunction(IntuitionBase,(WORD)-606,newOWTLRoutine);
	    oldOWRoutine  = SetFunction(IntuitionBase,(WORD)-204,newOWRoutine);
	    Permit();
	    if( g=(Object *)NewObject(NULL, "sysiclass", SYSIA_Which, RIGHTIMAGE, SYSIA_DrawInfo, &mydrawinfo, TAG_END))
	    {
		oldcl=OCLASS(g); DisposeObject(g);
		Forbid();

		oldcl->cl_ID="urouclass";

		if(my_cl=initSYSIClass())
		{
		    AddClass(my_cl);
		    Permit();
		}
		else fail();
	    }
	    else fail();
	    if( g=(Object *)NewObject(NULL,"buttongclass",GA_Width,10,GA_Height,10,TAG_END))
	    {
		oldcl=OCLASS(g); DisposeObject(g);
		Forbid();

		oldcl->cl_ID="tinicclass";

		if(my_cl=initGADClass())
		{
		    AddClass(my_cl);
		    Permit();
		}
		else fail();
	    }
	    else fail();
	}
	if(Cli()) ((struct CommandLineInterface *)Cli())->cli_Module=0L; /* That wwas a good tip ;-)) */
	else      Wait(0L); /* for the security */
    }
    else PutStr("***UROUHACK: Could not create memory pool!");
}

