/* 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 */
}
  
