[comp.sys.amiga] blackout.c

mwm@violet.berkeley.edu.UUCP (09/02/87)

This is a throwaway from a year ago. I never did much with it, but
recently needed part of it. I decided someone might be able to put it
to good use, or be inspired (huh?) by it.

Notes:

1) There are better ways to do many of the things I do here. I ain't
gonna fix it.

2) I tweaked it mildly just before posting it. It ought to work, but
there may be some oddness near the edges.

3) What I would like to see is this, my menu-bar clock/free memory
monitor and popcli integrated. There's enough shared functionality to
make it reasonable. If you wanna try, please e-mail me for the latest
version of said menu-bar clock/fmm.

4) No shar. Don't forget the signature line.

	<mike
/*
 * blackout - just black the screen out, and put and draw something that
 *	moves to show that we're up. It has to move so as not to mangle
 *	the phospher in one spot.
 *
 * Copyright (c) 1986, Mike Meyer
 *
 * Permission is hereby granted to distribute this program for any purposes
 * whatsoever, so long as this notice, including the above copyright, is
 * included with the distribution. Unlike other people, I don't care if you
 * make money off of this, so long as I get credit for having written it.
 */
 
#include <exec/types.h>
#include <graphics/gfxbase.h>
#include <devices/timer.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>

#include <stdio.h>
/*
 * Configuration defines:
 *
 *	INTENSITY is a number between 0 and 15, 0 being black, 15 being
 *	white.
 *
 *	WAIT-TIME controls the speed the picture moves at.
 *	It's the number of seconds to wait between moves. If you've got
 *	the clock picture, it's also the update frequency of the clock.
 */

#define INTENSITY	15
#define WAIT_TIME	1

struct NewScreen New_Screen = {
	0, 0,			/* Top left corner */
	640, 200,		/* Full hires, interlaced screen */
	1,			/* Only need two colors */
	0, 1,			/* Standard pens */
	HIRES,			/* Didn't I tell you that? */
	CUSTOMSCREEN,		/* Of course! */
	(struct TextAttr *) NULL,
	"Blackout!",
	(struct Gadget *) NULL,
	(struct BitMap *) NULL
	} ;

static struct NewWindow	New_Window = {
	0, 0,			/* Start in the upper left */
	640, 200,		/* and cover the whole screen */
	-1, -1,			/* Default pens */
	MOUSEBUTTONS,		/* Catching both buttons to restart */
	BORDERLESS | ACTIVATE	/* A window that gets it all */
	| SMART_REFRESH | NOCAREREFRESH | BACKDROP | RMBTRAP,
	(struct Gadget *) NULL,
	(struct Image *) NULL,
	"",			/* Empty title */
	(struct Screen *) NULL,	/* Filled in later */
	(struct BitMap *) NULL,
	0, 0, 0, 0,		/* no change sizes, doesn't matter */
	CUSTOMSCREEN,		/* Natch! */
	} ;

static char	Date_Buffer[11] ;	/* Now you know where the time goes! */

static struct IntuiText	Date_Text = {
	1, 0,				/* Use the standard pen colors */
	JAM2,				/* Use both of them */
	29, 1,				/* in the upper left-hand corner */
	(struct TextAttr *) NULL,	/* Use default text */
	Date_Buffer,			/* Buffer for time */
	(struct IntuiText *) NULL	/* All of text */
	} ;

static UWORD My_Pointer[8] ;

#define INTUITION_REV	1
#define GRAPHICS_REV	1

struct IntuitionBase	*IntuitionBase = NULL ;
struct GfxBase		*GfxBase = NULL ;
struct Screen		*My_Screen = NULL, *OpenScreen() ;
struct Window		*My_Window = NULL, *OpenWindow() ;
struct timerequest	Time_Req ;
struct MsgPort		*Timer_Port = NULL, *CreatePort() ;
short			cli = FALSE ;

void	done(int, char *) ;

void
main(argc, argv) int argc; char *argv; {
	register short		hours, minutes, seconds ;
	register short		x_delta = 0, y_delta = 0, x_where, y_where ;
	UWORD			Color_Map[2] ;
	register char		*buffer = Date_Buffer ;
	struct DateStamp	now ;
	struct IntuiMessage	*Msg, *GetMsg() ;

	cli = argc != 0 ;

	if ((IntuitionBase = (struct IntuitionBase *)
		OpenLibrary("intuition.library", INTUITION_REV)) == NULL)
		done(20, "Can't open intuition library") ;

	if ((GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",
		GRAPHICS_REV)) == NULL)
		done(20, "Can't open open graphics library") ;

	if ((My_Screen = OpenScreen(&New_Screen)) == NULL)
		done(20, "Can't open screen") ;

	New_Window . Screen = My_Screen ;
	if ((My_Window = OpenWindow(&New_Window)) == NULL)
		done(20, "Can't open window") ;

	if ((Timer_Port = CreatePort("Timer Port", 0)) == NULL)
		done(20, "Can't create timer port") ;
	if (OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &Time_Req, 0) != NULL)
		done(20, "Can't open timer device") ;
	Time_Req . tr_node . io_Message . mn_ReplyPort = Timer_Port ;
	Time_Req . tr_node . io_Command = TR_ADDREQUEST ;
	Time_Req . tr_node . io_Flags = Time_Req . tr_node . io_Error = 0 ;

	/* Black out the screen */
	Color_Map[0] = 0 ;	/* BLACKEST BLACK for the background */
	Color_Map[1] = (INTENSITY << 8) | (INTENSITY << 4) | INTENSITY ;
	LoadRGB4(&(My_Screen -> ViewPort), Color_Map, 2) ;
	ShowTitle(My_Screen, FALSE) ;
	SetPointer(My_Window, My_Pointer, 2, 2, 1, 1) ;
	SetRast(My_Window -> RPort, 0) ;

	DateStamp(&now) ;
	srand(now . ds_Tick) ;
	minutes = 0 ;		/* Used to trigger first setting of deltas */
	x_where = 310 ;
	y_where = 95 ;

	buffer[3] = buffer[6] = ':' ;
	buffer[0] = buffer[9] = ' ' ;

	for (;;) {
		if (minutes == 0) {
			while (x_delta == 0)
				x_delta = (rand() >> 4) % 13 - 6 ;
			while (y_delta == 0)
				y_delta = (rand() >> 4) % 9 - 4 ;
			}
		DateStamp(&now) ;
		hours = now . ds_Minute / 60 ;
		minutes = now . ds_Minute % 60 ;
		seconds = now . ds_Tick / TICKS_PER_SECOND ;
		buffer[1] = hours / 10 + '0' ;
		if (buffer[1] == '0') buffer[1] = ' ' ;
		buffer[2] = hours % 10 + '0' ;
		buffer[4] = minutes / 10 + '0' ;
		buffer[5] = minutes % 10 + '0' ;
		buffer[7] = seconds / 10 + '0' ;
		buffer[8] = seconds % 10 + '0' ;
		SetRast(My_Window -> RPort, 0) ;
		PrintIText(My_Window -> RPort, &Date_Text, x_where, y_where) ;

		Time_Req . tr_time . tv_secs = WAIT_TIME ;
		Time_Req . tr_time . tv_micro = 0 ;
		SendIO((char *) &Time_Req . tr_node) ;

		Wait(1 << My_Window -> UserPort -> mp_SigBit
		   | 1 << Timer_Port -> mp_SigBit) ;

		if (Msg = GetMsg(My_Window -> UserPort)) {
			ReplyMsg(Msg) ;
			done(0, "exit") ;
			}

		(void) GetMsg(Timer_Port) ;

		/* Now, move the window */
		if (x_where + x_delta > 620
		 || x_where + x_delta < 0) x_delta = -x_delta ;
		if (y_where + y_delta > 390
		 || y_where + y_delta < 0) y_delta = -y_delta ;
		x_where += x_delta ;
		y_where += y_delta ;
		}
	done(20, "Dropped out of forever loop") ;
	}
/*
 * done - close things, and then exit.
 */
void
done(how, why) int how; char *why; {

	AbortIO((char *) &Time_Req . tr_node) ;
	if (Time_Req . tr_node . io_Message . mn_ReplyPort != NULL)
		CloseDevice(&Time_Req) ;
	if (Timer_Port != NULL) DeletePort(Timer_Port) ;
	if (My_Window != NULL) CloseWindow(My_Window) ;
	if (My_Screen != NULL) CloseScreen(My_Screen) ;
	if (GfxBase != NULL) CloseLibrary(GfxBase) ;
	if (IntuitionBase != NULL) CloseLibrary(IntuitionBase) ;
	(void) OpenWorkBench() ;

	if (cli) printf("blackout: %s\n", why) ;
	exit(how) ;
}
--
Take a magic carpet to the olden days			Mike Meyer
To a mythical land where everybody lays			mwm@berkeley.edu
Around in the clouds in a happy daze			ucbvax!mwm
In Kizmiaz ... Kizmiaz					mwm@ucbjade.BITNET

mwm@eris.BERKELEY.EDU (Mike (My watch has windows) Meyer) (09/02/87)

In article <4960@jade.BERKELEY.EDU> I wrote:
<2) I tweaked it mildly just before posting it. It ought to work, but
<there may be some oddness near the edges.

Naturally, one of those bit me.

Also, want to add:

5) I don't think this is worth filling space in a source archive. If a
moderator somewhere feels different, feel free to make it do so.

Now, on to the important part. The marked lines should change


		/* Now, move the window */
		if (x_where + x_delta > 620
		 || x_where + x_delta < 0) x_delta = -x_delta ;
!		if (y_where + y_delta > 390
		 || y_where + y_delta < 0) y_delta = -y_delta ;

to

		if (y_where + y_delta > 190



	Sigh,
	<mike

P.S. - I want to take this chance to congratulate Leo on "The dream
goes berserk," since no one else has done so here yet! Nice job, Leo.
--
ICUROK2C, ICUROK2.				Mike Meyer
ICUROK2C, ICWR2.				mwm@berkeley.edu
URAQT, I WANT U2.				ucbvax!mwm
OO2EZ, I WANT U2.				mwm@ucbjade.BITNET