/********************************************************************************/ /* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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!"); }