/* WINDOWS.C - Support routines for NEWZAP.C - (c) 1986 John Hodgson */ #include "iff.h" #define ERROR 1 /* error return code */ #define KICKSTART_REV 33 /* minimum 1.2 rev for special funcs */ extern struct ExecBase *SysBase; extern struct Gadget gadget[]; extern char ScreenDump[],BrushDump[],SearchDump[]; extern UBYTE title[],bakbuf[]; /* shared by all string gadgets */ extern void *IntuitionBase,Search1(); extern FreeBitMap(); struct PicMap pbitmap,arbitmap,brbitmap; struct Requester arequest,brequest; struct Window *pwindow,*OpenWindow(); UBYTE searchbuf[50]; /* string gadget input buffers */ OpenBackDrop() { struct NewWindow NewWindow; setmem(&NewWindow,sizeof(NewWindow),0); /* pre-init to all zeroes */ NewWindow.Width=640; NewWindow.Height=200; NewWindow.DetailPen=NewWindow.BlockPen=-1; NewWindow.IDCMPFlags= CLOSEWINDOW|MENUPICK|MOUSEMOVE|RAWKEY|GADGETDOWN|GADGETUP; NewWindow.Flags=WINDOWDEPTH|WINDOWCLOSE|WINDOWDRAG|SUPER_BITMAP|ACTIVATE; NewWindow.FirstGadget=&gadget[0]; NewWindow.Title=&title[0]; NewWindow.BitMap=&pbitmap.BitMap; NewWindow.Type=WBENCHSCREEN; if (ReadILBM(&ScreenDump[0],1,&pbitmap)) return(ERROR); if ((pwindow=OpenWindow(&NewWindow))==0L) { FreeBitMap(&pbitmap.BitMap); return(ERROR); } return(0); } CloseBackDrop() { short i; CloseWindow(pwindow); /* Note that we free raster AFTER closing window! Important! */ FreeBitMap(&pbitmap.BitMap); } InitHelpRequester() { static struct Gadget argadget = { 0L,340,97,75,9,GADGHNONE,ENDGADGET,BOOLGADGET|REQGADGET, 0L,0L,0L,0L,0L,0L,0L }; setmem(&arequest,sizeof(arequest),0); /* start w/fresh structure */ arequest.LeftEdge=97; arequest.TopEdge=32; arequest.Width=447; arequest.Height=113; arequest.ReqGadget=&argadget; arequest.Flags=PREDRAWN; arequest.ImageBMap=&arbitmap.BitMap; if (ReadILBM(&BrushDump[0],1,&arbitmap)) return(ERROR); return(0); } FreeRequester() { FreeBitMap(&arbitmap.BitMap); } InitSearchRequester() { static struct StringInfo searchinfo = { &searchbuf[0],&bakbuf[0],0,30,0,0,0,0,71,53,0L,0L,0L }; static struct Gadget brgadget[2] = { /* adjust if real requester! */ { &brgadget[1],344,6,40,12,GADGHNONE,RELVERIFY,BOOLGADGET, 0L,0L,0L,0L,0L,0L,0L }, { 0L,71,53,244,9, /* search string gadget */ GADGHCOMP,RELVERIFY, STRGADGET|REQGADGET,0L,0L,0L,0L,(APTR)&searchinfo,12,(APTR)&Search1 } }; setmem(&brequest,sizeof(brequest),0); /* start w/fresh structure */ brequest.LeftEdge=123; brequest.TopEdge=38; brequest.Width=400; brequest.Height=101; brequest.ReqGadget=&brgadget[0]; brequest.Flags=PREDRAWN; brequest.ImageBMap=&brbitmap.BitMap; if (ReadILBM(&SearchDump[0],1,&brbitmap)) return(ERROR); return(0); } FreeSearchRequester() /* provided for consistency */ { FreeBitMap(&brbitmap.BitMap); } FakeRequest() { /* I just can't get string gadgets in PREDRAWN requesters to work correctly under 1.2. For now, we'll fake it with a borderless window. */ struct NewWindow NewWindow; struct Window *window; struct IntuiMessage *reqmsg; static struct IntuiMessage relaymsg; /* static 'cuz referenced outside! */ struct Gadget *gadgetptr; setmem(&NewWindow,sizeof(NewWindow),0); /* pre-init to all zeroes */ NewWindow.LeftEdge=brequest.LeftEdge; NewWindow.TopEdge=brequest.TopEdge; NewWindow.Width=brequest.Width; NewWindow.Height=brequest.Height; NewWindow.IDCMPFlags=GADGETUP; NewWindow.Flags=BORDERLESS|SUPER_BITMAP|ACTIVATE; NewWindow.FirstGadget=brequest.ReqGadget; NewWindow.BitMap=brequest.ImageBMap; NewWindow.Type=WBENCHSCREEN; /* forget requester if lack of memory prevents window opening */ if ((window=OpenWindow(&NewWindow))==0L) return(ERROR); /* note : although this routine is meant to be a general-purpose requester emulator, it's just too handy to activate the Search menu's string requester (1.2 or later). We check the LibNode because SoftVer in ExecBase is 0 (??) at the time of this writing. */ if (SysBase->LibNode.lib_Version>=KICKSTART_REV) ActivateGadget(&brequest.ReqGadget[1],window,0L); WaitPort(window->UserPort); /* wait for gadgetup */ reqmsg=(struct IntuiMessage *)GetMsg(window->UserPort); /* & dequeue msg */ gadgetptr=(struct Gadget *)reqmsg->IAddress; /* fetch gadget pick */ /* Assume : 1) all gadgets have the ENDGADGET flag set, and : 2) we don't want to broadcast about gadgets w/no ID! Msgs we care about get pipelined over to the main window, where the newzap body should take care of replying to Intuition for us! */ if (gadgetptr->GadgetID) { relaymsg=*reqmsg; /* duplicate message */ relaymsg.ExecMessage.mn_ReplyPort=0; /* forget about replies */ PutMsg(pwindow->UserPort,&relaymsg); /* attach to main window! */ } ReplyMsg(reqmsg); /* always reply to messages */ CloseWindow(window); return(0); /* cleanup & leave */ }