/* Auto: make */ IMPORT LONGBITS startsignal, insertsignal, cancelsignal, donesignal; IMPORT LONGBITS movesignal, clicksignal, timersignal, initsignal, cwsignal; IMPORT ULONG startsignum, insertsignum, cancelsignum, donesignum; IMPORT ULONG movesignum, clicksignum, timersignum, initsignum, cwsignum; /* program */ IMPORT struct SnapRsrc *SnapRsrc; IMPORT struct Task *MyTask; /* Snap state machine */ IMPORT WORD action; IMPORT WORD state; /* clipboard */ IMPORT struct IOClipReq *ClipReq; IMPORT struct MsgPort *ClipPort; /* timer device */ IMPORT struct MsgPort *TimerPort; IMPORT struct timerequest MyTR; /* input device */ IMPORT struct MsgPort *inputDevPort; IMPORT struct Interrupt handlerStuff; IMPORT struct IOStdReq *inputRequestBlock; IMPORT UBYTE *CharData; /* console */ IMPORT struct MsgPort *ConPort; IMPORT struct IOStdReq *ConIOR; IMPORT struct KeyMap keymap; /* windows */ IMPORT struct MsgPort *Sharedport; IMPORT SHORT Sharedrefs; IMPORT struct MinList CachedWindows; /* libraries */ IMPORT struct IntuitionBase *IntuitionBase; IMPORT struct GfxBase *GfxBase; IMPORT struct LayersBase *LayersBase; IMPORT struct ArpBase *ArpBase; /* graphics */ IMPORT struct RastPort TempRp; IMPORT struct BitMap TempBM; IMPORT UBYTE *TempRaster; IMPORT struct Image DiskImage; UWORD ImData[24] = { /* BitPlane 0 */ 0xFFFF, 0xF00F, 0xF7EF, 0xF42F, 0xF7EF, 0xF00F, 0xF3CF, 0xF2CF, 0xF2CF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; VOID CloseStuff() { SafeRestore(); { struct CacheWindow *cw; while (cw = (struct CacheWindow *) RemHead((struct List *)&CachedWindows)) { FreeMem(cw, (LONG)sizeof(struct CacheWindow)); } } if (DiskImage.ImageData) FreeMem(DiskImage.ImageData, 32L); if (TempRaster) FreeRaster(TempRaster, 16L, 16L); if (CharData) FreeMem(CharData, 256L*32); if (inputRequestBlock) { if (inputRequestBlock->io_Device) { inputRequestBlock->io_Command = IND_REMHANDLER; /* Remove handler */ inputRequestBlock->io_Data = (APTR)&handlerStuff; DoIO(inputRequestBlock); CloseDevice(inputRequestBlock); } DeleteExtIO(inputRequestBlock); } if (inputDevPort) DeletePort(inputDevPort); if (TimerPort) { DeletePort(TimerPort); CloseDevice((struct IOStdReq *)&MyTR); } if (ConIOR) { CloseDevice(ConIOR); DeleteExtIO(ConIOR); } if (ConPort) DeletePort(ConPort); if (ClipReq) { if (ClipReq->io_Device) { CloseDevice(ClipReq); } DeleteExtIO(ClipReq); } if (ClipPort) DeletePort(ClipPort); if (startsignum != -1) FreeSignal(startsignum); if (donesignum != -1) FreeSignal(donesignum); if (cancelsignum != -1) FreeSignal(cancelsignum); if (movesignum != -1) FreeSignal(movesignum); if (insertsignum != -1) FreeSignal(insertsignum); if (clicksignum != -1) FreeSignal(clicksignum); if (timersignum != -1) FreeSignal(timersignum); if (initsignum != -1) FreeSignal(initsignum); if (cwsignum != -1) FreeSignal(cwsignum); if (SnapRsrc) { RemResource(SnapRsrc); Kill(SnapRsrc); } if (ArpBase) CloseLibrary((struct Library *)ArpBase); if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase); if (GfxBase) CloseLibrary((struct Library *)GfxBase); if (LayersBase) CloseLibrary((struct Library *)LayersBase); } WORD OpenStuff() { action = noaction; state = waiting; inputRequestBlock = NULL; Sharedrefs = 0; Sharedport = NULL; NewList((struct NewList *)&CachedWindows); /* Set up everything we need. */ /* libraries */ if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L))) return 0; if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L))) return 0; if (!(LayersBase = (struct LayersBase *)OpenLibrary("layers.library", 0L))) return 0; ArpBase = (struct ArpBase *)OpenLibrary(ArpName, ArpVersion); /* signals */ if ((startsignum = AllocSignal(-1L)) == -1L) return 0; if ((insertsignum = AllocSignal(-1L)) == -1L) return 0; if ((cancelsignum = AllocSignal(-1L)) == -1L) return 0; if ((donesignum = AllocSignal(-1L)) == -1L) return 0; if ((movesignum = AllocSignal(-1L)) == -1L) return 0; if ((clicksignum = AllocSignal(-1L)) == -1L) return 0; if ((timersignum = AllocSignal(-1L)) == -1L) return 0; if ((initsignum = AllocSignal(-1L)) == -1L) return 0; if ((cwsignum = AllocSignal(-1L)) == -1L) return 0; MyTask = FindTask(NULL); /* Find myself to Signal me. */ startsignal = 1L << startsignum; /* No good to use bit numbers */ insertsignal = 1L << insertsignum; cancelsignal = 1L << cancelsignum; donesignal = 1L << donesignum; movesignal = 1L << movesignum; clicksignal = 1L << clicksignum; timersignal = 1L << timersignum; initsignal = 1L << initsignum; cwsignal = 1L << cwsignum; /* clipboard device */ if (!(ClipPort = CreatePort(0L, 0L))) return 0; if (!(ClipReq = (struct IOClipReq *)CreateExtIO(ClipPort, (LONG)sizeof(*ClipReq)))) return 0; if (OpenDevice("clipboard.device", 0L, ClipReq, 0L)) return 0; ClipReq->io_ClipID = 0L; /* console device */ if (!(ConPort = CreatePort(0L, 0L))) return 0; if (!(ConIOR = (struct IOStdReq *)CreateExtIO(ConPort, (LONG)sizeof(struct IOStdReq)))) return 0; if (OpenDevice("console.device", -1L, ConIOR, 0L)) return 0; /* timer device */ if (!(TimerPort = CreatePort(NULL, 0L))) return 0; if (OpenDevice(TIMERNAME, UNIT_MICROHZ, (struct IOStdReq *)&MyTR, 0L)) return 0; MyTR.tr_node.io_Message.mn_ReplyPort = TimerPort; MyTR.tr_node.io_Command = TR_ADDREQUEST; /* input devive */ if (!(inputDevPort = CreatePort(0L, 0L))) return 0; if (!(inputRequestBlock = (struct IOStdReq *)CreateExtIO(inputDevPort, (LONG)sizeof(struct IOStdReq)))) return 0; if (OpenDevice("input.device", 0L, inputRequestBlock, 0L)) return 0; /* input handler */ handlerStuff.is_Data = (APTR)0x534E4150; /* Set up for installation of */ handlerStuff.is_Code = myhandler; /* myhandler. */ handlerStuff.is_Node.ln_Pri = SnapRsrc->Priority; /* Ahead of intuition, please */ handlerStuff.is_Node.ln_Name = "Snap Input Handler"; inputRequestBlock->io_Command = IND_ADDHANDLER; inputRequestBlock->io_Data = (APTR)&handlerStuff; DoIO(inputRequestBlock); /* Add me. */ /* Aligned font bitmap to use when matching */ if (!(CharData = AllocRaster(16L, 256L*16))) { return 0; } /* temporary raster */ if (!(TempRaster = AllocRaster(16L, 16L))) return 0; InitRastPort(&TempRp); /* Init RastPort used for */ InitBitMap(&TempBM, 1L, 16L, 16L); /* Locating position of */ TempBM.Planes[0] = TempRaster; /* first character. */ TempRp.BitMap = &TempBM; if (!(DiskImage.ImageData = AllocMem(48L, MEMF_CHIP))) { return 0; } CopyMem((char *)&ImData[0], (char *)DiskImage.ImageData, 48L); return 1; }