/*
 *	Copyright (c) 1993 Michael D. Bayne.
 *	All rights reserved.
 *
 *	Please see the documentation accompanying the distribution for distribution and disclaimer information.
 */

#include <exec/types.h>
#include <exec/memory.h>

#include <intuition/intuition.h>
#include <intuition/screens.h>

#include <libraries/gadtools.h>
#include <dos/dos.h>

#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>

#include "Moire.h"
#include "Moire_rev.h"
#include "/defs.h"

struct mPrefObject {
	LONG xSpeed, ySpeed, Trail, numLines, Cycle;
};

VOID blank( VOID );

	struct	mPrefObject	nP;
STATIC	const	UBYTE		VersTag[] = VERSTAG;
extern	struct	Task		**Task;
extern		ULONG		Depth, Mode;
extern		UBYTE		*prefData;

VOID setMoirePrefs( VOID )
{
        GT_SetGadgetAttrs( MoireGadgets[GD_TRAIL], MoireWnd, 0L, GTSL_Level, nP.Trail, 0L );
        GT_SetGadgetAttrs( MoireGadgets[GD_XSPEED], MoireWnd, 0L, GTSL_Level, nP.xSpeed, 0L );
        GT_SetGadgetAttrs( MoireGadgets[GD_YSPEED], MoireWnd, 0L, GTSL_Level, nP.ySpeed, 0L );
        GT_SetGadgetAttrs( MoireGadgets[GD_NUMLIN], MoireWnd, 0L, GTSL_Level, nP.numLines, 0L );
	GT_SetGadgetAttrs( MoireGadgets[GD_CYCLE], MoireWnd, 0L, GTCY_Active, nP.Cycle, 0L );
}

int OKClicked( VOID )
{
	CopyMem( &nP, prefData, sizeof( struct mPrefObject ));
	return( QUIT );
}

int TESTClicked( VOID )
{
	*Task = FindTask( 0L );
	blank();
	return( CONTINUE );
}

int CANCELClicked( VOID )
{
	return( QUIT );
}

int TRAILClicked( VOID )
{
	nP.Trail = MoireMsg.Code;
	return( CONTINUE );
}

int CYCLEClicked( VOID )
{
	nP.Cycle = MoireMsg.Code;
	return( CONTINUE );
}

int XSPEEDClicked( VOID )
{
	nP.xSpeed = MoireMsg.Code;
	return( CONTINUE );
}

int YSPEEDClicked( VOID )
{
	nP.ySpeed = MoireMsg.Code;
	return( CONTINUE );
}

int NUMLINClicked( VOID )
{
	nP.numLines = MoireMsg.Code;
	return( CONTINUE );
}

int MoireVanillaKey( VOID )
{
	switch( MoireMsg.Code ) {
	case 'o':
		return( OKClicked() );
	case 't':
		return( TESTClicked() );
	case 'c':
		return( CANCELClicked() );
	case 'r':
		GT_SetGadgetAttrs( MoireGadgets[GD_TRAIL], MoireWnd, 0L, GTSL_Level, ++(nP.Trail) > 256 ?
			nP.Trail = 256 : nP.Trail, 0L );
		return( CONTINUE );
	case 'R':
		GT_SetGadgetAttrs( MoireGadgets[GD_TRAIL], MoireWnd, 0L, GTSL_Level, --(nP.Trail) < 1 ?
			nP.Trail = 1 : nP.Trail , 0L );
		return( CONTINUE );
	case 'x':
		GT_SetGadgetAttrs( MoireGadgets[GD_XSPEED], MoireWnd, 0L, GTSL_Level, ++(nP.xSpeed) > 64 ?
			nP.xSpeed = 64 : nP.xSpeed, 0L );
		return( CONTINUE );
	case 'X':
		GT_SetGadgetAttrs( MoireGadgets[GD_XSPEED], MoireWnd, 0L, GTSL_Level, --(nP.xSpeed) < 1 ?
			nP.xSpeed = 1 : nP.xSpeed, 0L );
		return( CONTINUE );
	case 'y':
		GT_SetGadgetAttrs( MoireGadgets[GD_YSPEED], MoireWnd, 0L, GTSL_Level, ++(nP.ySpeed) > 64 ?
			nP.ySpeed = 64 : nP.ySpeed, 0L );
		return( CONTINUE );
	case 'Y':
		GT_SetGadgetAttrs( MoireGadgets[GD_YSPEED], MoireWnd, 0L, GTSL_Level, --(nP.ySpeed) < 1 ?
			nP.ySpeed = 1 : nP.ySpeed, 0L );
		return( CONTINUE );
	case 'n':
		GT_SetGadgetAttrs( MoireGadgets[GD_NUMLIN], MoireWnd, 0L, GTSL_Level, ++(nP.ySpeed) > 32 ?
			nP.ySpeed = 32 : nP.ySpeed, 0L );
		return( CONTINUE );
	case 'N':
		GT_SetGadgetAttrs( MoireGadgets[GD_NUMLIN], MoireWnd, 0L, GTSL_Level, --(nP.ySpeed) < 2 ?
			nP.ySpeed = 2 : nP.ySpeed, 0L );
		return( CONTINUE );
	default:
		return( CONTINUE );
	}
}

VOID prefs( LONG command )
{
	switch( command ) {
	case STARTUP:
		CopyMem( prefData, &nP, sizeof( struct mPrefObject ));
		if( !SetupScreen() ) {
			if( !OpenMoireWindow()) setMoirePrefs();
			CloseDownScreen();
		}
		break;
	case IDCMP:
		if( HandleMoireIDCMP() != QUIT ) break;
	case KILL:
		CloseMoireWindow();
	}
}

LONG winSig( VOID )
{
	return( MoireWnd ? 1L << MoireWnd->UserPort->mp_SigBit : 0L );
}
