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

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

#include <libraries/gadtools.h>

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/alib_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/utility_protos.h>

#include "LineBlank.h"
#include "LineBlank_rev.h"
#include "/defs.h"
#include "/utility.h"

struct lPrefObject { USHORT Mode; };

VOID blank( VOID );

struct	lPrefObject	nP;
STATIC	const	UBYTE		VersTag[] = VERSTAG;
extern		UBYTE		*prefData;
extern ULONG *Blanking;

VOID setLineBlankPrefs( VOID )
{
  GT_SetGadgetAttrs( LineBlankGadgets[GD_Mode], LineBlankWnd, 0L, GTCY_Active, nP.Mode, 0L );
}

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

int TESTClicked( VOID )
{
  *Blanking = TRUE;
  blank();
  return( CONTINUE );
}

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

int ModeClicked( VOID )
{
  nP.Mode = LineBlankMsg.Code;
  return( CONTINUE );
}

int LineBlankVanillaKey( VOID )
{
  switch( LineBlankMsg.Code ) {
  case 'o':
    return( OKClicked() );
  case 'c':
    return( CANCELClicked() );
  case 'm':
    GT_SetGadgetAttrs( LineBlankGadgets[GD_Mode], LineBlankWnd, 0L, GTCY_Active, ++(nP.Mode) > 4 ?
		      nP.Mode = 0 : nP.Mode, 0L );
    return( CONTINUE );
  case 'M':
    GT_SetGadgetAttrs( LineBlankGadgets[GD_Mode], LineBlankWnd, 0L, GTCY_Active, (nP.Mode == 0) ?
					 nP.Mode = 4 : --nP.Mode, 0L );
    return( CONTINUE );
  case 't':
    return( TESTClicked() );
  default:
    return( CONTINUE );
  }
}

VOID prefs( LONG command )
{
  switch( command ) {
  case STARTUP:
    CopyMem( prefData, &nP, sizeof( struct lPrefObject ));
    if( !SetupScreen() ) {
      if( !OpenLineBlankWindow()) setLineBlankPrefs();
      CloseDownScreen();
    }
    break;
  case IDCMP:
    if( HandleLineBlankIDCMP() != QUIT ) break;
  case KILL:
    CloseLineBlankWindow();
    break;
  }		
}

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