home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
454.lha
/
ShowGadgets
/
ShowGadgets.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-06
|
7KB
|
233 lines
/*========================================================*/
/* */
/* Show gadgets in a window V1.0 */
/* © J.Tyberghein */
/* Mon Mar 5 09:16:17 1990 V1.0 */
/* */
/*========================================================*/
#include <exec/types.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <exec/interrupts.h>
#include <devices/inputevent.h>
#include <devices/input.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <string.h>
/*=============================== 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<<Global.QuitSigNum;
if ((Global.ActionSigNum = AllocSignal (-1L)) == -1L)
{
Print ("Error allocating signal\n");
CloseStuff (4);
}
Global.ActionSig = 1L<<Global.ActionSigNum;
if (!(InputDevPort = CreatePort (0L,0L)))
{
Print ("Error creating InputDevPort\n");
CloseStuff (1);
}
if (!(InputRequestBlock = CreateStdIO (InputDevPort)))
{
Print ("Error creating Standard IO\n");
CloseStuff (2);
}
HandlerStuff.is_Data = (APTR)&Global;
HandlerStuff.is_Code = (VOID (*)())MyHandler;
HandlerStuff.is_Node.ln_Pri = 53;
if (OpenDevice ("input.device",0L,(struct IORequest *)InputRequestBlock,0L))
{
Print ("Error opening Input.device\n");
CloseStuff (3);
}
InputRequestBlock->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 ======================================*/