/*========================================================*/ /* */ /* Show gadgets in a window V1.0 */ /* © J.Tyberghein */ /* Mon Mar 5 09:16:17 1990 V1.0 */ /* */ /*========================================================*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*=============================== Data ======================================*/ APTR SysBase; struct DosLibrary *DOSBase; struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; void OpenStuff (); void __regargs CloseStuff (int); void Print (char *); /* NewWindow structure for our dummy window */ struct NewWindow nWin = { 0,0,0,0,0,1, NULL, BORDERLESS, NULL,NULL,NULL,NULL,NULL, 0,0,0,0, CUSTOMSCREEN }; /* Everything for the input device */ #define GKEY 0x24 #define ESCAPEKEY 0x45 /* The following structure is needed to pass information from our input device handler to our task */ typedef struct { struct Task *TaskToSig; /* Pointer to our own task */ ULONG QuitSig,QuitSigNum; /* Signal to quit ShowGadgets */ ULONG ActionSig,ActionSigNum; /* Someone pressed AMIGA-AMIGA-G */ } Global_Data; Global_Data Global; struct MsgPort *InputDevPort = NULL; struct IOStdReq *InputRequestBlock = NULL; struct Interrupt HandlerStuff; /*=============================== Code ======================================*/ /*------------------------------ main program -------------------------------*/ void __saveds myMain () { struct Window *win,*myWin; int w,h,sig,xx,yy; struct RastPort *rp; struct Gadget *g; OpenStuff (); Print ("ShowGadgets 1.0 Written by J.Tyberghein 5 Mar 90\n"); Print ("Press 'AMIGA-AMIGA-G' for gadget view "); Print ("(Left mouse button to stop view)\n"); Print ("Press 'AMIGA-AMIGA-ESC' to quit\n"); for ( ; ; ) { sig = Wait (Global.QuitSig | Global.ActionSig); if (sig & Global.QuitSig) break; if (sig & Global.ActionSig) { win = IntuitionBase->ActiveWindow; nWin.LeftEdge = win->LeftEdge; nWin.TopEdge = win->TopEdge; w = nWin.Width = win->Width; h = nWin.Height = win->Height; nWin.Screen = win->WScreen; if (!(myWin = (struct Window *)OpenWindow (&nWin))) { Print ("Error opening window\n"); DisplayBeep (0L); } else { rp = myWin->RPort; Forbid (); SetRast (rp,0L); SetAPen (rp,1L); g = win->FirstGadget; while (g) { int x1,y1,x2,y2; x1 = g->LeftEdge; y1 = g->TopEdge; if (g->Flags & GRELRIGHT) x1 += w; if (g->Flags & GRELBOTTOM) y1 += h; if (g->Flags & GRELWIDTH) xx = x2 = x1+g->Width+w-1; else x2 = x1+g->Width-1; if (g->Flags & GRELHEIGHT) yy = y2 = y1+g->Height+h-1; else y2 = y1+g->Height-1; Move (rp,x1,y1); Draw (rp,x2,y1); Draw (rp,x2,y2); Draw (rp,x1,y2); Draw (rp,x1,y1); g = g->NextGadget; } while ((*(BYTE *)0xbfe001)&64) ; CloseWindow (myWin); Permit (); } } } Print ("Done !\n"); CloseStuff (0); } /*-------------------------- Print something --------------------------------*/ void Print (char *str) { Write (Output (),str,strlen (str)); } /*------------------------ InputEvent handler -------------------------------*/ struct InputEvent * __saveds __asm MyHandler (register __a0 struct InputEvent *ev, register __a1 Global_Data *gdptr) { register struct InputEvent *ep; for (ep=ev ; ep ; ep=ep->ie_NextEvent) if (ep->ie_Class == IECLASS_RAWKEY) if (ep->ie_Code == GKEY && (ep->ie_Qualifier & IEQUALIFIER_RCOMMAND) && (ep->ie_Qualifier & IEQUALIFIER_LCOMMAND)) { ep->ie_Class = IECLASS_NULL; Signal (gdptr->TaskToSig,gdptr->ActionSig); } else if (ep->ie_Code == ESCAPEKEY && (ep->ie_Qualifier & IEQUALIFIER_RCOMMAND) && (ep->ie_Qualifier & IEQUALIFIER_LCOMMAND)) { ep->ie_Class = IECLASS_NULL; Signal (gdptr->TaskToSig,gdptr->QuitSig); } return (ev); } /*----------------------------- OpenStuff -----------------------------------*/ void OpenStuff () { SysBase = (APTR)*(LONG *)4; DOSBase = (struct DosLibrary *)OpenLibrary ("dos.library",0L); IntuitionBase = (struct IntuitionBase *)OpenLibrary ("intuition.library",0L); GfxBase = (struct GfxBase *)OpenLibrary ("graphics.library",0L); Global.QuitSigNum = Global.ActionSigNum = 0L; Global.TaskToSig = FindTask (0L); if ((Global.QuitSigNum = AllocSignal (-1L)) == -1L) { Print ("Error allocating signal\n"); CloseStuff (4); } Global.QuitSig = 1L<io_Command = IND_ADDHANDLER; InputRequestBlock->io_Data = (APTR)&HandlerStuff; DoIO ((struct IORequest *)InputRequestBlock); } /*---------------------------- CloseStuff -----------------------------------*/ void __regargs CloseStuff (int Error) { if (DOSBase) CloseLibrary ((struct Library *)DOSBase); if (IntuitionBase) CloseLibrary ((struct Library *)IntuitionBase); if (GfxBase) CloseLibrary ((struct Library *)GfxBase); if (Global.ActionSigNum) FreeSignal (Global.ActionSigNum); if (Global.QuitSigNum) FreeSignal (Global.QuitSigNum); if (InputRequestBlock) { InputRequestBlock->io_Command = IND_REMHANDLER; InputRequestBlock->io_Data = (APTR)&HandlerStuff; DoIO ((struct IORequest *)InputRequestBlock); CloseDevice ((struct IORequest *)InputRequestBlock); DeleteStdIO (InputRequestBlock); } if (InputDevPort) DeletePort (InputDevPort); Exit (Error); } /*================================ End ======================================*/