home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
scrnutil
/
shadowma.lzh
/
source
/
savers
/
guard.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-01
|
4KB
|
148 lines
/*
* A template for use in building new saver utilities.
*
* Copyright 1991, Mike Meyer
* All Rights Reserved
*
* See the file "ShadowMaster:Distribution" for information on distribution.
*
* ===build instructions
* % lc guard ; output= guard.o input= guard.c utilitymain.h
* % blink guard.o LIB lib:lcr.lib SC SD ; output= guard input=guard.o
* % copy guard //savers
* ===endbuild
*
* Note: the lib:lcr.lib may not be needed. Try linking without it and see...
*
* Basically, the only thing to do is change doutility to run your code, and
* have it return the name of a blanker to run, or a NULL pointer if it shouldn't
* run any blanker at all.
*
* If you compile this with -dLOOPS, then your code is called multiple times,
* with a TRUE argument the first time and FALSE thereafter. If your argument
* is FALSE, your utility routine is expected to wait for the CTRL C, and then
* return either another name, or a NULL to indicate that we want to stop now.
* This code will kill the running saver module, and start the one you asked
* it to start.
*/
#include <exec/types.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#include <dos/rdargs.h>
#include <proto/dos.h>
#include <proto/exec.h>
char *doutility(int) ;
static void __saveds procend(void) ;
struct ExecBase *SysBase = NULL ;
struct DosLibrary *DOSBase = NULL ;
/* Don't change anything above this point... */
/*
* We use ReadArgs for parsing the arguments. Just define template correctly,
* and set up the opts array with appropriate names for your code. If you don't
* want the arguments looked at, comment out the define of template. Change opts
* to set any defaults you feel need setting.
*/
#define TEMPLATE "FROM"
static long opts[1] = { 0 };
/*
* Private variables used by the utility.
*/
#define MAXSTRING 200
static char command[MAXSTRING], *args = NULL ;
static int size, corners ;
#define TOP_LEFT 1
#define TOP_RIGHT 2
#define BOTTOM_LEFT 4
#define BOTTOM_RIGHT 8
/*
* The proctags table is here for you to change - to a degree. We expect the
* Seglist to be first, and CommandName to be second. Your code can rely on
* (if you want to) Arguments to be third.
*/
struct TagItem proctags[] = {
{NP_Seglist, 0},
{NP_CommandName, 0},
{NP_Arguments, &" "}, /* The space guards against a bug in 2.0 */
{NP_FreeSeglist, 1},
{NP_StackSize, 8000},
{NP_Cli, 1},
{NP_CopyVars, 0},
{NP_ExitCode, &procend},
{TAG_DONE, 0}
} ;
#include "utilitymain.h"
/*
* You should replace from here down with your own doutility function.
* Just return the name of the blanker you want run, and we'll do the
* rest. Note that it's valid to return a pointer to a static data area.
*/
#include <intuition/intuitionbase.h>
struct IntuitionBase *IntuitionBase = NULL ;
int LoadFile(char *) ;
char *
doutility(int x) {
int skip_corner ;
if ((IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", 37)) == NULL)
return NULL ;
if (!LoadFile(*opts ? (char *) *opts : "env:shadowmaster/guard.prefs"))
return NULL ;
if (IntuitionBase->FirstScreen->MouseY <= size)
skip_corner = TOP_LEFT | TOP_RIGHT ;
else if (IntuitionBase->FirstScreen->Height - IntuitionBase->FirstScreen->MouseY <= size)
skip_corner = BOTTOM_LEFT | BOTTOM_RIGHT ;
else skip_corner = 0 ;
if (IntuitionBase->FirstScreen->MouseX <= size)
skip_corner &= TOP_LEFT | BOTTOM_LEFT ;
else if (IntuitionBase->FirstScreen->Width - IntuitionBase->FirstScreen->MouseX <= size)
skip_corner &= TOP_RIGHT | BOTTOM_RIGHT ;
else skip_corner = 0 ;
CloseLibrary((struct Library *) IntuitionBase) ;
if (args)
proctags[2].ti_Data = (long) args ;
if ((skip_corner & corners) == 0) return (char *) command ;
Wait(SIGBREAKF_CTRL_C) ;
return NULL ;
}
#include <string.h>
#include <stdlib.h>
int
LoadFile(char *file) {
BPTR fh ;
char *cp ;
if (!(fh = Open(file, MODE_OLDFILE))) return FALSE ;
FGets(fh, command, MAXSTRING) ;
corners = atoi(command) ;
if (!corners) corners = TOP_LEFT ;
FGets(fh, command, MAXSTRING) ;
size = atoi(command) ;
FGets(fh, command, MAXSTRING) ;
if (cp = strchr(command, '\n')) *cp = '\0' ;
if (cp = strchr(command, ' ')) {
*cp = '\0' ;
args = cp ;
}
Close(fh) ;
return TRUE ;
}