/*======== Example Source-Code for an external Icon-Renderer ========= (C) Copyright 1997 by Georg Steger. Created with MaxonCPP 4.0 Pro Description: ŻŻŻŻŻŻŻŻŻŻŻŻ This IconRenderer does a very simple Rendering. But it also shows you how to use the UserData in riInitIcon, riRenderIcon and riExitIcon. When you iconify a Window opened by the "Workbench" Task it will look a little bit different. Try it out! NOTE: This IconRenderer does not support the method RI_REFRESHITITLE (refreshing of the icon title) ====================================================================*/ /* OS-Includes */ #include #include // #pragma header /* Compiler-Includes */ #include #include #include #include /* Program-Includes */ #include "/PWDevelopper.h" /* Vars */ struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; static struct TextExtent MyTE; static STRPTR title; static WORD a,b,c,slen,x1,y1,x2,y2; /* Program */ void DrawRect(struct Window *win, struct RastPort *rp,WORD col) { SetAPen(rp,col); RectFill(rp,0,0,win->Width-1,0); RectFill(rp,win->Width-1,1,win->Width-1,win->Height-1); RectFill(rp,0,win->Height-1,win->Width-2,win->Height-1); RectFill(rp,0,1,0,win->Height-2); } ULONG Icon_INIT(struct riInit *msg) { ULONG rc=RIR_OK; GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",36); IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",36); if ((!GfxBase) || (!IntuitionBase)) { if (GfxBase) CloseLibrary((struct Library *)GfxBase); if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase); rc=RIR_FAIL; } return rc; } ULONG Icon_EXIT(struct riExit *msg) { if (GfxBase) CloseLibrary((struct Library *)GfxBase); if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase); return RIR_OK; } ULONG Icon_INITICON(struct riInitIcon *msg) { if (msg->WinTask) { if (strcmp(msg->WinTask->tc_Node.ln_Name,"Workbench")==0) { msg->UserData=(APTR)1; } } return RIR_OK; } ULONG Icon_EXITICON(struct riExitIcon *msg) { return RIR_OK; } ULONG Icon_RENDERICON(struct riRenderIcon *msg) { struct DrawInfo *di; struct Window *IconWin; struct RastPort *rp; struct Gadget *gad; ULONG rc=RIR_FAIL; IconWin=msg->Icon; rp=IconWin->RPort; di=GetScreenDrawInfo(IconWin->WScreen); if (di) { rc=RIR_OK; DrawRect(IconWin,rp,di->dri_Pens[SHADOWPEN]); SetAPen(rp,di->dri_Pens[SHINEPEN]); RectFill(rp,1,1,IconWin->Width-2,IconWin->Height-2); title=msg->ParentWin->Title; if (title) { a=rp->TxBaseline+(IconWin->Height - rp->TxHeight + 1) / 2; b=TextFit(rp,title,strlen(title),&MyTE,0,1,IconWin->Width-4,IconWin->Height); while (b && (title[b-1]==' ')) b--; c=(IconWin->Width - TextLength(rp,title,b))/2; SetAPen(rp,di->dri_Pens[SHADOWPEN]); SetDrMd(rp,JAM1); Move(rp,c+1,a+1); Text(rp,title,b); } if (msg->UserData == (APTR) 1 ) { SetAPen(rp,di->dri_Pens[SHADOWPEN]); RectFill(rp,2,2,IconWin->Width-1-2,2); RectFill(rp,2,IconWin->Height-1-2,IconWin->Width-1-2,IconWin->Height-1-2); } /* Let's check if there's any Close/Depth-Gadget */ gad=IconWin->FirstGadget; while (gad) { x1=gad->LeftEdge;if (gad->Flags&GFLG_RELRIGHT) x1+=(IconWin->Width-1); y1=gad->TopEdge;if (gad->Flags&GFLG_RELBOTTOM) y1+=(IconWin->Height-1); x2=x1+gad->Width-1;if (gad->Flags&GFLG_RELWIDTH) x2+=(IconWin->Width); y2=y1+gad->Height-1;if (gad->Flags&GFLG_RELHEIGHT) y2+=(IconWin->Height); if ((gad->GadgetType>YP_SYSTYPEMASK)==GTYP_CLOSE) /* Close-Gadget found! */ { SetAPen(rp,di->dri_Pens[SHADOWPEN]); RectFill(rp,x1,y1,x2,y2); SetAPen(rp,di->dri_Pens[SHINEPEN]); RectFill(rp,x1+1,y1+1,x2-1,y2-1); SetAPen(rp,di->dri_Pens[SHADOWPEN]); RectFill(rp,x1+5,y1+3,x2-5,y2-3); } else if (gad->GadgetID==GID_WDEPTH) /* Depth-Gadget found! */ { SetAPen(rp,di->dri_Pens[SHADOWPEN]); RectFill(rp,x1,y1,x2,y2); SetAPen(rp,di->dri_Pens[SHINEPEN]); RectFill(rp,x1+1,y1+1,x2-1,y2-1); SetAPen(rp,di->dri_Pens[SHADOWPEN]); RectFill(rp,x1+3,y1+3,x1+7,y1+6); RectFill(rp,x1+4,y1+4,x1+8,y1+7); SetAPen(rp,di->dri_Pens[SHINEPEN]); RectFill(rp,x1+5,y1+5,x1+7,y1+6); } gad=gad->NextGadget; } FreeScreenDrawInfo(IconWin->WScreen,di); } // if (di) return rc; } ULONG Icon_REFRESHIFRAME(struct riRefreshIFrame *msg) { struct Window *IconWin; struct DrawInfo *di; IconWin=msg->Icon; if ((di=GetScreenDrawInfo(IconWin->WScreen))) { DrawRect(IconWin,IconWin->RPort,di->dri_Pens[SHADOWPEN]); FreeScreenDrawInfo(IconWin->WScreen,di); } return RIR_OK; } ULONG Icon_RENDERFRAME(struct riRenderFrame *msg) { struct Window *IconWin; struct RastPort *rp; struct DrawInfo *di; IconWin=msg->Icon; rp=msg->rp; if ((di=GetScreenDrawInfo(IconWin->WScreen))) { DrawRect(IconWin,rp,di->dri_Pens[SHADOWPEN]); FreeScreenDrawInfo(IconWin->WScreen,di); } return RIR_OK; } ULONG Icon_RENDERFRAMESEL(struct riRenderFrameSel *msg) { struct Window *IconWin; struct RastPort *rp; struct DrawInfo *di; IconWin=msg->Icon; rp=msg->rp; if ((di=GetScreenDrawInfo(IconWin->WScreen))) { DrawRect(IconWin,rp,di->dri_Pens[FILLPEN]); FreeScreenDrawInfo(IconWin->WScreen,di); } return RIR_OK; } /************* ENTRY **************/ LONG RenderIcon(Msg msg) { ULONG rc=RIR_FAIL; switch (msg->MethodID) { case RI_INIT: rc=Icon_INIT((struct riInit *)msg); break; case RI_EXIT: rc=Icon_EXIT((struct riExit *)msg); break; case RI_INITICON: rc=Icon_INITICON((struct riInitIcon *)msg); break; case RI_EXITICON: rc=Icon_EXITICON((struct riExitIcon *)msg); break; case RI_REFRESHIFRAME: rc=Icon_REFRESHIFRAME((struct riRefreshIFrame *)msg); break; case RI_RENDERICON: rc=Icon_RENDERICON((struct riRenderIcon *)msg); break; case RI_RENDERFRAME: rc=Icon_RENDERFRAME((struct riRenderFrame *)msg); break; case RI_RENDERFRAMESEL: rc=Icon_RENDERFRAMESEL((struct riRenderFrameSel *)msg); break; } return rc; }