home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
600-699
/
ff624.lha
/
MachIV
/
SimpleBlanker.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-21
|
6KB
|
205 lines
#ifdef AZTEC_C
#include <functions.h>
#else
#include <clib/exec_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
#endif
#include <stdlib.h>
#include <exec/ports.h>
#include <intuition/intuition.h>
/*
* Simple blanking skeleton. This demonstrates a simply way to implement your
* own screen blanker that receives messages from MachIV. This eliminates
* the need for you to create an input handler or timer routines.
*
* Feel free to create your own customized screen blanker. While this code is
* Copyright 1991 by Brian Moats, you may use it and distibute both this code
* and yours anywhere that you want. When distributing this code, please do
* not alter it in anyway.
*
* This program is a bare bones skeleton. It merely opens and closes a screen
* when told to by MachIV. The screen is red so that you know that it is not
* MachIV's own blanker. You need only add your screen opening where it says
* // INSERT YOUR SCREEN OPENING HERE!
* Add you graphics drawing routines where it says
* // INSERT YOUR GRAPHIC ROUTINES HERE!
*
* MachIV will execute a macro named "Blank" when the timeout says to blank
* the screen. It also executes a macro named "Unblank" when screen blanking
* should terminate and a macro named "MachIVQuit" when MachIV is quiting.
* These macros could anything, but to communicate with SimpleBlanker, they
* would be something like this:
*
* MSC_PUTMSG"MyScreenBlanker,1" - Name this macro Blank.
* MSC_PUTMSG"MyScreenBlanker,2" - Name this macro Unblank.
* MSC_PUTMSG"MyScreenBlanker,3" - Name this macro MachIVQuit.
*
* SimpleBlanker waits on its port named "MyScreenBlanker" for one of three
* signals. When it receives a BLANK (1) signal, it loops doing whatever
* graphics on the screen that you program in. In this loop it also checks
* for an UNBLANK (2) or QUIT (3) signal. Messages sent are actually
* IntuiMessages structs but only Class, Code and Qualifier are filled in by
* MachIV. Only Class is used in this program.
*
* SimpleBlanker also quits when you execute it a second time.
*
* Compiles under Aztec 5.2a and SAS/C 5.10a.
*
* Aztec:
*
* cc SimpleBlanker
* ln SimpleBlanker.o -lc
*
* Lattice:
*
* lc SimpleBlanker
* blink from lib:c.o SimpleBlanker.o to SimpleBlanker LIB lib:lc.lib \
* lib:amiga.lib SC SD
*
* Both compilers allow the // comment and I've used it here. If you are
* using an older compiler, you will need to change them to the standard
* comment form which I can't even show you here or it would be a nested
* comment!
*/
// Signals sent from MachIV to your port.
#define BLANK 1
#define UNBLANK 2
#define QUIT 3
// Screen blanking constants.
#define SCREEN_DEPTH 1
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200
// Proto declaration.
static void die(void);
// Local vars
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
char *portname = "MyScreenBlanker";
struct NewScreen newScreen = {0,0,SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_DEPTH,
-1,-1,0,CUSTOMSCREEN,NULL,NULL,NULL,NULL};
struct Screen *s;
struct MsgPort *portptr,*rp;
struct IntuiMessage *imsg, quitmsg;
ULONG action; // Will receive the IntuiMessage Class value.
main(int argc, char **argv)
{
// First see if we are already running. If so, Put a message telling it
// to quit. Wait for SimpleBlanker to Reply.
if ((portptr = FindPort((STRPTR)portname)) != NULL) {
if (rp = CreateMsgPort()) { // Create a reply port for us.
quitmsg.ExecMessage.mn_Node.ln_Type = NT_MESSAGE;
quitmsg.ExecMessage.mn_ReplyPort = rp;
quitmsg.ExecMessage.mn_Length = 32;
quitmsg.Class = QUIT;
PutMsg(portptr,(struct Message*)&quitmsg);
WaitPort(rp); // Wait for SimpleBlanker does a ReplyMsg();
GetMsg(rp);
DeleteMsgPort(rp);
exit(0);
}
}
// Port not found so create and add our port.
if ((portptr = CreateMsgPort()) == NULL)
exit(0);
portptr->mp_Node.ln_Pri = 1; // Will be searched for.
portptr->mp_Node.ln_Name = portname;
AddPort(portptr);
IntuitionBase = (struct IntuitionBase *) OpenLibrary((UBYTE*)"intuition.library",37L);
GfxBase = (struct GfxBase *) OpenLibrary((UBYTE*)"graphics.library",37L);
for (;;) {
WaitPort(portptr); // Waiting for BLANK or QUIT
while (imsg = (struct IntuiMessage *)GetMsg(portptr)) {
action = imsg->Class;
ReplyMsg((struct Message *)imsg);
switch (action) {
case BLANK:
// INSERT YOUR SCREEN OPENING HERE!
// MachIV says to blank so insert your own stuff here. You can do
// pretty much want you want, just be sure to check every so often
// for an UNBLANK or QUIT message.
// For demonstration purposes only, I just open a screen and set
// it to red.
if ((s = OpenScreen(&newScreen)) == NULL)
break;
SetRGB4(&s->ViewPort,0L,15L,0L,0L); // Simply displays a red screen.
SetRGB4(&s->ViewPort,1L,15L,0L,0L);
SetRast(&s->RastPort,0L);
// Check for any messages.
while ((imsg = (struct IntuiMessage *)GetMsg(portptr)) == NULL) {
// INSERT YOUR GRAPHIC ROUTINES HERE!
// You can put you drawing or animation routines calls here.
// A little Delay() here is nice to the system.
Delay(5L);
}
// Got a message.
action = imsg->Class;
ReplyMsg((struct Message *)imsg);
if (action == QUIT)
die(); // Will never return.
else if (action != UNBLANK)
break; // UNBLANK falls through!!
case UNBLANK:
if (s)
CloseScreen(s);
s = NULL;
break;
case QUIT:
die();
break;
}
}
}
}
// This deletes and closes up everything.
static void die(void)
{
RemPort(portptr); // portptr must be valid or we wouldn't be here.
DeleteMsgPort(portptr);
if (s)
CloseScreen(s);
if (IntuitionBase)
CloseLibrary((struct Library*)IntuitionBase);
if (GfxBase)
CloseLibrary((struct Library*)GfxBase);
exit(0);
}