#ifdef AZTEC_C #include #else #include #include #include #endif #include #include #include /* * 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); }