/*
 *	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 "Moiré.h"
#include "Moiré_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		ULONG		Depth, Mode, *Blanking;
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 )
{
  *Blanking = TRUE;
  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 );
}
