/*
 *  ZOOM-DAEMON   A program that implements Zoom gadgets for all Intuition
 *                windows that are opened while it is running.
 *
 *              Copyright 1989 by Davide P. Cervone.
 *  You may use this code, provided this copyright notice is kept intact.
 */

#include "Zoom-Handler.h"

struct IntuitionBase *IntuitionBase = NULL;
struct SysBase *SysBase;

/*
 *  These are the assembly code stubs that replace the Intuition Library
 *  vectors.  Thes stubs in turn call the C-language routines that actually
 *  do the work.
 */

extern void aOpenWindow();
extern void aCloseWindow();
extern void aAddGadget();
extern void aAddGList();


/*
 *  These are used by the assembly stubs to call the original routines when
 *  needed.  They also are used to replace the Intution vectors when 
 *  Zoom-Daemon exits.
 */

long OldOpenWindow;
long OldCloseWindow;
long OldAddGadget;
long OldAddGList;


/*
 *  These are the structures that need to be passed to the loader
 *  so that it can clean up after Zoom-Handler is removed.
 */

extern struct ExtGadget *FirstZoom;

extern void ZoomHandlerStub();
extern void cOpenWindow();


static struct Interrupt Zoom_Interrupt =  /* the Interrupt needed to add a */
{                                         /*  handler to the input chain */
   {NULL, NULL, 0, 51, NULL},             /*  ln_Pri = 51 (before Intuition) */
   NULL,
   &ZoomHandlerStub                       /* the handler to add */
};


/*
 *  This is the main structure passed from the handler to the loader.
 *  It is used to exchange variables between the loader and the handler
 *  (like IntuitionBase, and any application-specific structures that
 *  need to be initialized or freed by the loader).
 */

static struct Zoom_HandlerInfo Zoom_HandlerData =
{
   {                                            /* the MsgPort is pre-setup */
      {NULL,NULL, NT_MSGPORT, 0, PORTNAME},     /*  to include the name and */
      PA_IGNORE, 0, NULL,                       /*  type so that it can just */
      {NULL,NULL,NULL, 0,0}                     /*  be added to the port list */
   },                                           /*  so it can be found later */
   MAJVERS,MINVERS, MINLOADVER,
   NULL,
   &IntuitionBase,
   &SysBase,
   
   &Zoom_Interrupt,
   
   &aOpenWindow,
   &aCloseWindow,
   &aAddGadget,
   &aAddGList,

   &OldOpenWindow,
   &OldCloseWindow,
   &OldAddGadget,
   &OldAddGList,

   &cOpenWindow,
   &FirstZoom
};


/*
 *  Setup()
 *
 *  This routine MUST be linked into the Zoom-Handler executable 
 *  as the first routine, so that the loader can find it.
 *  It should check the version number for compatibility with the loader,
 *  and should return NULL for an error, or the pointer to the shared
 *  data structure if everything is OK.
 */

struct Zoom_HandlerInfo *Setup(version)
int version;
{
   if (version < MINLOADVER) return(NULL);
   return(&Zoom_HandlerData);
}
