/*
 *  Source machine generated by GadToolsBox V2.0
 *  which is (c) Copyright 1991-1993 Jaba Development
 *
 *  GUI Designed by : Jan van den Baard
 */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <intuition/intuitionbase.h>
#include <libraries/gadtools.h>
#include <libraries/iffparse.h>
#include <libraries/asl.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/asl_protos.h>
#include <clib/iffparse_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#include <resources.h>

#define CATCOMP_NUMBERS

#include "project.catalog.h"

#include "project.h"
#include "Special.h"

struct Window	      *ScreenPrefsWnd = NULL;
struct Window	      *PalettePrefsWnd = NULL;
struct Gadget	      *ScreenPrefsGList = NULL;
struct Gadget	      *PalettePrefsGList = NULL;
struct IntuiMessage    ScreenPrefsMsg;
struct IntuiMessage    PalettePrefsMsg;
UWORD		       ScreenPrefsZoom[4];
UWORD		       PalettePrefsZoom[4];
struct Gadget	      *ScreenPrefsGadgets[17];
struct Gadget	      *PalettePrefsGadgets[8];
UWORD		       ScreenPrefsLeft = 87;
UWORD		       ScreenPrefsTop = 289;
UWORD		       ScreenPrefsWidth = 409;
UWORD		       ScreenPrefsHeight = 203;
UWORD		       PalettePrefsLeft = 328;
UWORD		       PalettePrefsTop = 122;
UWORD		       PalettePrefsWidth = 455;
UWORD		       PalettePrefsHeight = 165;
UBYTE		      *ScreenPrefsWdt = (UBYTE *)"Project Handler : Screen Preferences 2.0";
UBYTE		      *PalettePrefsWdt = (UBYTE *)"Project Handler : Palette Control 2.0";

UBYTE *Type0Labels[] = {
	(UBYTE *)"Public",
	(UBYTE *)"Workbench",
	NULL };

UBYTE *Overscan0Labels[] = {
	(UBYTE *)"Nominal",
	(UBYTE *)"Maximum",
	(UBYTE *)"Video",
	(UBYTE *)"Standard",
	(UBYTE *)"Text",
	NULL };

extern struct MinList Pens1List;

struct Node Pens1Nodes[] = {
	&Pens1Nodes[1], (struct Node *)&Pens1List.mlh_Head,0,0,"Block Pen",
	&Pens1Nodes[2], &Pens1Nodes[0],0,0,"Detail Pen",
	&Pens1Nodes[3], &Pens1Nodes[1], 0, 0, "Text Pen",
	&Pens1Nodes[4], &Pens1Nodes[2], 0, 0, "3D Bright Edge",
	&Pens1Nodes[5], &Pens1Nodes[3], 0, 0, "3D Dark Edge",
	&Pens1Nodes[6], &Pens1Nodes[4], 0, 0, "Active/Selected Fill",
	&Pens1Nodes[7], &Pens1Nodes[5], 0, 0, "Active/Selected Text",
	&Pens1Nodes[8], &Pens1Nodes[6], 0, 0, "Background Pen",
	&Pens1Nodes[9], &Pens1Nodes[7], 0, 0, "Highlight Text",
	&Pens1Nodes[10], &Pens1Nodes[8], 0, 0, "Text Menu",
	&Pens1Nodes[11], &Pens1Nodes[9], 0, 0, "Background Menu",
	( struct Node * )&Pens1List.mlh_Tail, &Pens1Nodes[10], 0, 0, "Trim under Screen Bar" };

struct MinList Pens1List = {
	( struct MinNode * )&Pens1Nodes[0], ( struct MinNode * )NULL, ( struct MinNode * )&Pens1Nodes[8] };

UWORD ScreenPrefsGTypes[] = {
	LISTVIEW_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	STRING_KIND,
	CYCLE_KIND,
	SCROLLER_KIND,
	INTEGER_KIND,
	SCROLLER_KIND,
	INTEGER_KIND,
	CYCLE_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	BUTTON_KIND,
	CHECKBOX_KIND
};

UWORD PalettePrefsGTypes[] = {
	LISTVIEW_KIND,
	PALETTE_KIND,
	PALETTE_KIND,
	SLIDER_KIND,
	SLIDER_KIND,
	SLIDER_KIND
	BUTTON_KIND,
	BUTTON_KIND,
};

struct NewGadget ScreenPrefsNGad[] = {
	9, 48, 168, 130, (UBYTE *)"Display _ID", NULL, GD_DispID, PLACETEXT_ABOVE, NULL, (APTR)DispIDClicked,
	26, 182, 96, 16, NULL, NULL, GD_Use, PLACETEXT_IN, NULL, (APTR)UseClicked,
	142, 182, 96, 16, NULL, NULL, GD_Cancel, PLACETEXT_IN, NULL, (APTR)Cancel0Clicked,
	264, 182, 111, 16, (UBYTE *)"_Restore Default", NULL, GD_Workbench, PLACETEXT_IN, NULL, (APTR)WorkbenchClicked,
	288, 114, 111, 16, (UBYTE *)"_Palette", NULL, GD_Palette, PLACETEXT_IN, NULL, (APTR)Palette0Clicked,
	195, 9, 204, 17, NULL, NULL, GD_PubName, 0, NULL, (APTR)PubNameClicked,
	90, 9, 100, 17, (UBYTE *)"Screen _Type", NULL, GD_Type, PLACETEXT_LEFT, NULL, (APTR)TypeClicked,
	297, 70, 102, 17, NULL, NULL, GD_ScrWidth, 0, NULL, (APTR)ScrWidth0Clicked,
	248, 70, 44, 17, (UBYTE *)"_Width ", NULL, GD_Width, PLACETEXT_LEFT, NULL, (APTR)WidthClicked,
	297, 92, 102, 17, NULL, NULL, GD_ScrHeight, 0, NULL, (APTR)ScrHeight0Clicked,
	248, 92, 44, 17, (UBYTE *)"_Height", NULL, GD_Height, PLACETEXT_LEFT, NULL, (APTR)HeightClicked,
	185, 48, 214, 17, (UBYTE *)"_Overscan", NULL, GD_Overscan, PLACETEXT_ABOVE, NULL, (APTR)OverscanClicked,
	193, 114, 26, 11, (UBYTE *)"_Default", NULL, GD_DefPalette, PLACETEXT_RIGHT, NULL, (APTR)DefPaletteClicked,
	193, 156, 26, 11, (UBYTE *)"Autos_croll", NULL, GD_Autoscroll, PLACETEXT_RIGHT, NULL, (APTR)AutoscrollClicked,
	288, 135, 111, 16, (UBYTE *)"Select _Font", NULL, GD_Font, PLACETEXT_IN, NULL, (APTR)FontClicked,
	193, 135, 26, 11, (UBYTE *)"S_ysFonts", NULL, GD_SysFonts, PLACETEXT_RIGHT, NULL, (APTR)SysFontsClicked
};

struct NewGadget PalettePrefsNGad[] = {
	9, 23, 213, 100, (UBYTE *)"_Pen Attributes", NULL, GD_Pens, PLACETEXT_ABOVE, NULL, (APTR)PensClicked,
	9, 118, 216, 20, NULL, NULL, GD_PenColors, 0, NULL, (APTR)PenColorsClicked,
	232, 23, 216, 20, (UBYTE *)"Color _Table", NULL, GD_Table, PLACETEXT_ABOVE, NULL, (APTR)TableClicked,
	280, 68, 136, 17, (UBYTE *)"_Red", NULL, GD_Red, PLACETEXT_ABOVE, NULL, (APTR)Red0Clicked,
	280, 104, 136, 17, (UBYTE *)"_Green", NULL, GD_Green, PLACETEXT_ABOVE, NULL, (APTR)Green0Clicked,
	280, 141, 136, 17, (UBYTE *)"_Blue", NULL, GD_Blue, PLACETEXT_ABOVE, NULL, (APTR)Blue0Clicked
	26, 145, 96, 16, NULL, NULL, 11, PLACETEXT_IN, NULL, (APTR)Use1Clicked,
	142, 145, 96, 16, NULL, NULL, 10, PLACETEXT_IN, NULL, (APTR)Cancel1Clicked,
};

ULONG ScreenPrefsGTags[] = {
	(GTLV_ShowSelected), NULL, (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GTST_MaxChars), 256, (TAG_DONE),
	(GTCY_Labels), (ULONG)&Type0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTSC_Arrows), 8, (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (TAG_DONE),
	(GTIN_Number), 0, (GTIN_MaxChars), 10, (GT_Underscore), '_', (TAG_DONE),
	(GTSC_Arrows), 8, (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (TAG_DONE),
	(GTIN_Number), 0, (GTIN_MaxChars), 10, (GT_Underscore), '_', (TAG_DONE),
	(GTCY_Labels), (ULONG)&Overscan0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
	(GTCB_Checked), TRUE, (GT_Underscore), '_', (TAG_DONE),
	(GTCB_Checked), TRUE, (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GTCB_Checked), TRUE, (GT_Underscore), '_', (TAG_DONE)
};

ULONG PalettePrefsGTags[] = {
	(GTLV_Labels), (ULONG)&Pens1List, (GTLV_Selected) , 0 , (GTLV_ShowSelected) , 0 , (GT_Underscore), '_', (TAG_DONE),
	(GTPA_Depth), 2, (GTPA_Color), 1, (GTPA_ColorOffset), 0, (GTPA_IndicatorWidth) , 16 , (TAG_DONE),
	(GTPA_Depth), 2, (GTPA_Color), 0, (GTPA_ColorOffset), 0, (GTPA_IndicatorWidth) , 16 , (GT_Underscore), '_', (TAG_DONE),
	(GTSL_Max), 255, (GTSL_MaxLevelLen), 10, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
	(GTSL_Max), 255, (GTSL_MaxLevelLen), 10, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
	(GTSL_Max), 255, (GTSL_MaxLevelLen), 10, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
	(GT_Underscore), '_', (TAG_DONE),
};


extern void ComputeFont( UWORD , UWORD );

extern UWORD ComputeX( UWORD );
extern UWORD ComputeY( UWORD );

int HandleScreenPrefsIDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)(void);
	BOOL			running = TRUE;

	while( ScreenPrefsWnd != NULL && (m = GT_GetIMsg( ScreenPrefsWnd->UserPort )) ) {

		CopyMem(( char * )m, ( char * )&ScreenPrefsMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( ScreenPrefsMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( ScreenPrefsWnd );
				GT_EndRefresh( ScreenPrefsWnd, TRUE );
				break;

			case	IDCMP_VANILLAKEY:
				running = ScreenPrefsVanillaKey();
				break;

			case	IDCMP_RAWKEY:
				if ( ScreenPrefsMsg.Code == 95 )
				    ChargeAide( "WIN_Screen" );
				break;

			case	IDCMP_MOUSEMOVE:
			case	IDCMP_GADGETUP:
			case	IDCMP_GADGETDOWN:
				func = ( void * )(( struct Gadget * )ScreenPrefsMsg.IAddress )->UserData;
				running = func();
				break;

			case	IDCMP_MENUPICK:
				break;
		}
	}
	return( running );
}

int OpenScreenPrefsWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = ScreenPrefsLeft, wtop = ScreenPrefsTop, ww, wh;

	ComputeFont( ScreenPrefsWidth, ScreenPrefsHeight );

	ww = ComputeX( ScreenPrefsWidth );
	wh = ComputeY( ScreenPrefsHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( g = CreateContext( &ScreenPrefsGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < ScreenPrefs_CNT; lc++ ) {

		CopyMem((char * )&ScreenPrefsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		ScreenPrefsGadgets[ lc ] = g = CreateGadgetA((ULONG)ScreenPrefsGTypes[ lc ], g, &ng, ( struct TagItem * )&ScreenPrefsGTags[ tc ] );

		while( ScreenPrefsGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	ScreenPrefsZoom[0] = ScreenPrefsLeft;
	ScreenPrefsZoom[1] = ScreenPrefsTop;
	if ( ScreenPrefsWdt )
		ScreenPrefsZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)ScreenPrefsWdt, strlen((char *)ScreenPrefsWdt )) + 80;
	else
		ScreenPrefsZoom[2]  = 80L;
		ScreenPrefsZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( ScreenPrefsWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	LISTVIEWIDCMP|BUTTONIDCMP|STRINGIDCMP|CYCLEIDCMP|SCROLLERIDCMP|ARROWIDCMP|INTEGERIDCMP|CHECKBOXIDCMP|
						IDCMP_MENUPICK|IDCMP_MOUSEMOVE|IDCMP_VANILLAKEY|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
				WA_Gadgets,	ScreenPrefsGList,
				WA_Title,	ScreenPrefsWdt,
				WA_PubScreen,	Scr,
				WA_Activate,	TRUE,
				WA_Zoom,	ScreenPrefsZoom,
				WA_AutoAdjust,	TRUE,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( ScreenPrefsWnd, NULL );

	if ( ROMVersion >= 39 )
	    LendMenus( ScreenPrefsWnd , ProjectWnd );

	return( 0L );
}

void CloseScreenPrefsWindow( void )
{
	if ( ScreenPrefsWnd        ) {
		CloseWindow( ScreenPrefsWnd );
		ScreenPrefsWnd = NULL;
	}

	if ( ScreenPrefsGList      ) {
		FreeGadgets( ScreenPrefsGList );
		ScreenPrefsGList = NULL;
	}
}

int HandlePalettePrefsIDCMP( void )
{
	struct IntuiMessage	*m;
	int			(*func)(void);
	BOOL			running = TRUE;

	while( (PalettePrefsWnd != NULL) && (m = GT_GetIMsg( PalettePrefsWnd->UserPort )) ) {

		CopyMem(( char * )m, ( char * )&PalettePrefsMsg, (long)sizeof( struct IntuiMessage ));

		GT_ReplyIMsg( m );

		switch ( PalettePrefsMsg.Class ) {

			case	IDCMP_REFRESHWINDOW:
				GT_BeginRefresh( PalettePrefsWnd );
				GT_EndRefresh( PalettePrefsWnd, TRUE );
				break;

			case	IDCMP_VANILLAKEY:
				running = PalettePrefsVanillaKey();
				break;

			case	IDCMP_RAWKEY:
				if ( PalettePrefsMsg.Code == 95 )
				    ChargeAide( "WIN_Palette" );
				break;

			case	IDCMP_MOUSEMOVE:
			case	IDCMP_GADGETUP:
			case	IDCMP_GADGETDOWN:
				func = ( void * )(( struct Gadget * )PalettePrefsMsg.IAddress )->UserData;
				running = func();
				break;
		}
	}
	return( running );
}

int OpenPalettePrefsWindow( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		wleft = PalettePrefsLeft, wtop = PalettePrefsTop, ww, wh;

	ComputeFont( PalettePrefsWidth, PalettePrefsHeight );

	ww = ComputeX( PalettePrefsWidth );
	wh = ComputeY( PalettePrefsHeight );

	if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
	if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;

	if ( ! ( g = CreateContext( &PalettePrefsGList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < PalettePrefs_CNT; lc++ ) {

		CopyMem((char * )&PalettePrefsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr	 = Font;
		ng.ng_LeftEdge	 = OffX + ComputeX( ng.ng_LeftEdge );
		ng.ng_TopEdge	 = OffY + ComputeY( ng.ng_TopEdge );
		ng.ng_Width	 = ComputeX( ng.ng_Width );
		ng.ng_Height	 = ComputeY( ng.ng_Height);

		PalettePrefsGadgets[ lc ] = g = CreateGadgetA((ULONG)PalettePrefsGTypes[ lc ], g, &ng, ( struct TagItem * )&PalettePrefsGTags[ tc ] );

		while( PalettePrefsGTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	PalettePrefsZoom[0] = PalettePrefsLeft;
	PalettePrefsZoom[1] = PalettePrefsTop;
	if ( PalettePrefsWdt )
		PalettePrefsZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)PalettePrefsWdt, strlen((char *)PalettePrefsWdt )) + 80;
	else
		PalettePrefsZoom[2]  = 80L;
		PalettePrefsZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

	if ( ! ( PalettePrefsWnd = OpenWindowTags( NULL,
				WA_Left,	wleft,
				WA_Top, 	wtop,
				WA_Width,	ww + OffX + Scr->WBorRight,
				WA_Height,	wh + OffY + Scr->WBorBottom,
				WA_IDCMP,	LISTVIEWIDCMP|PALETTEIDCMP|SLIDERIDCMP|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW|IDCMP_MOUSEMOVE|IDCMP_RAWKEY,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
				WA_Gadgets,	PalettePrefsGList,
				WA_Title,	PalettePrefsWdt,
				WA_PubScreen,	Scr,
				WA_Activate,	TRUE,
				WA_Zoom,	PalettePrefsZoom,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( PalettePrefsWnd, NULL );

	if ( ROMVersion >= 39 )
	    LendMenus( PalettePrefsWnd , ProjectWnd );

	return( 0L );
}

void ClosePalettePrefsWindow( void )
{
	if ( PalettePrefsWnd        ) {
		CloseWindow( PalettePrefsWnd );
		PalettePrefsWnd = NULL;
	}

	if ( PalettePrefsGList      ) {
		FreeGadgets( PalettePrefsGList );
		PalettePrefsGList = NULL;
	}
}

struct List ScreenIDs;
char *PublicName;
UWORD Pens0[12],CurrentPen,OldPens0[12];		/* Ne pas changer les tailles comme ça, voir fct PaletteClicked */
ULONG Colors0[4][3],OldColors0[4][3],CurrentColor;	/* Idem */
struct TextAttr Font0;
UBYTE AutoScroll,Overscan,ScreenType;
long DisplayIDNum,DisplayID,Width,Height;
Point Res;
BOOL DefaultColors=TRUE,DefaultFont=TRUE;

void ActiveWB( BOOL act ) {
    GT_SetGadgetAttrs( ScreenPrefsGadgets[0] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[4] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[5] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[11] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[13] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[14] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
}

void UpdateDimension(void) {
  struct DimensionInfo DI;
  struct Rectangle *Rect;

    if ( GetDisplayInfoData( 0 , (UBYTE *)&DI , sizeof( struct DimensionInfo ) , DTAG_DIMS , DisplayID ) ) {
	switch( Overscan ) {
	  case 0:
	    Rect = &DI.Nominal;
	    break;
	  case 1:
	    Rect = &DI.MaxOScan;
	    break;
	  case 2:
	    Rect = &DI.VideoOScan;
	    break;
	  case 3:
	    Rect = &DI.TxtOScan;
	    break;
	  case 4:
	    Rect = &DI.StdOScan;
	}
	Width = Res.x = Rect->MaxX+1;
	Height = Res.y = Rect->MaxY+1;
    }
    if ( ScreenPrefsWnd ) {
	GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GTIN_Number , Width , TAG_DONE );
	GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GTIN_Number , Height , TAG_DONE );
	GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GTSC_Top , 0 , GTSC_Total , 16384-Res.x , TAG_DONE );
	GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GTSC_Top , 0 , GTSC_Total , 16384-Res.y , TAG_DONE );
    }
}


int DispIDClicked( void )
{
  long n = 0;
  struct ScreenNode *wn = ScreenIDs.lh_Head;

    while( wn->node.ln_Succ && n++<ScreenPrefsMsg.Code ) {
	wn = wn->node.ln_Succ;
    }
    if ( wn->node.ln_Succ )
    {
	DisplayID = wn->ID;
	DisplayIDNum = n;
    }
    UpdateDimension();
}

void ColorsTOTag32( ULONG *data ) {
  int i;

    *data++ = 4;
    *data++ = 0;
    for( i = 0;i<4;i++ ) {
	*data++ = Colors0[i][0]<<24;
	*data++ = Colors0[i][1]<<24;
	*data++ = Colors0[i][2]<<24;
    }
}

void ColorsTOTag4( struct ColorSpec *cs ) {
  int i;

    for( i = 0;i<4;i++ ) {
	cs->ColorIndex = i;
	cs->Red = (UWORD)Colors0[i][0]>>4;
	cs->Green = (UWORD)Colors0[i][1]>>4;
	cs->Blue = (UWORD)Colors0[i][2]>>4;
	cs++;
    }
    cs->ColorIndex = -1;
}

#define NUM_SCREEN_TAG 13

void BuildScreenTags( void ) {
    ScreenTags = AllocateTagItems( NUM_SCREEN_TAG );
    ScreenTags[0].ti_Tag = SA_PubName;
    ScreenTags[0].ti_Data = strdup( PublicName );
    ScreenTags[1].ti_Tag = SA_Overscan;
    switch( Overscan ) {
      case 0:
	ScreenTags[1].ti_Data = 0;
	break;
      case 2:
	ScreenTags[1].ti_Data = OSCAN_VIDEO;
	break;
      case 1:
	ScreenTags[1].ti_Data = OSCAN_MAX;
	break;
      case 3:
	ScreenTags[1].ti_Data = OSCAN_TEXT;
	break;
      case 4:
	ScreenTags[1].ti_Data = OSCAN_STANDARD;
	break;
    }
    ScreenTags[2].ti_Tag = SA_FullPalette;
    ScreenTags[2].ti_Data = TRUE;
    ScreenTags[3].ti_Tag = SA_Type;
    if ( ScreenType )
    {
	ScreenTags[0].ti_Tag = TAG_IGNORE;
	ScreenTags[3].ti_Data = WBENCHSCREEN;
    }
    else
	ScreenTags[3].ti_Data = PUBLICSCREEN;
    ScreenTags[4].ti_Tag = SA_AutoScroll;
    ScreenTags[4].ti_Data = AutoScroll;
    ScreenTags[5].ti_Tag = SA_DisplayID;
    ScreenTags[5].ti_Data = DisplayID;
    ScreenTags[6].ti_Tag = SA_Width;
    if ( Width != Res.x )
	ScreenTags[6].ti_Data = (long)Width;
    else
	ScreenTags[6].ti_Data = STDSCREENWIDTH;
    ScreenTags[7].ti_Tag = SA_Height;
    if ( Height != Res.y )
	ScreenTags[7].ti_Data = (long)Height;
    else
	ScreenTags[7].ti_Data = STDSCREENHEIGHT;
    ScreenTags[8].ti_Tag = SA_Pens;
    ScreenTags[8].ti_Data = malloc(26);
    *((UWORD *)ScreenTags[8].ti_Data) = ~0;
    ScreenTags[9].ti_Tag = TAG_IGNORE;
    ScreenTags[10].ti_Tag = TAG_IGNORE;
    if ( !DefaultColors ) {
	ScreenTags[9].ti_Tag = SA_Colors;
	memcpy( (UWORD *)ScreenTags[8].ti_Data , Pens0 , 24 );
	((UWORD *)ScreenTags[8].ti_Data)[12] = ~0;
	ScreenTags[9].ti_Data = malloc( 40 );
	ColorsTOTag4( (struct ColorSpec *)ScreenTags[9].ti_Data );
	ScreenTags[10].ti_Tag = SA_Colors32;
	ScreenTags[10].ti_Data = malloc( 56 );
	ColorsTOTag32( (ULONG *)ScreenTags[10].ti_Data );
    }
    if ( DefaultFont )
	ScreenTags[11].ti_Tag = SA_SysFont;
    else {
	ScreenTags[11].ti_Tag = SA_Font;
	ScreenTags[11].ti_Data = malloc( sizeof( struct TextAttr ) );
	memcpy( (void *)ScreenTags[11].ti_Data , &Font0 , sizeof( struct TextAttr ) );
	((struct TextAttr *)ScreenTags[11].ti_Data)->ta_Name = strdup( Font0.ta_Name );
    }
    ScreenTags[12].ti_Tag = TAG_END;
}

void DeleteScreenTags( void ) {
  struct TagItem *ti;

    if ( ti = FindTagItem( SA_PubName , ScreenTags ) )
	free( (void *)ti->ti_Data );
    if ( ti = FindTagItem( SA_Colors , ScreenTags ) )
	free( (void *)ti->ti_Data );
    if ( ti = FindTagItem( SA_Colors32 , ScreenTags ) )
	free( (void *)ti->ti_Data );
    if ( ti = FindTagItem( SA_Pens , ScreenTags ) )
	free( (void *)ti->ti_Data );
    if ( ti = FindTagItem( SA_Font , ScreenTags ) ) {
	free( ((struct TextAttr *)ti->ti_Data)->ta_Name );
	free( (void *)ti->ti_Data );
    }
    FreeTagItems( ScreenTags );
}

void LoadScreenTags( struct IFFHandle *iff ) {
struct StoredProperty *buf;
struct TagItem *ti;
char *fontname;

    PropChunk( iff , ID_SCRN , ID_TAGS );
    PropChunk( iff , ID_SCRN , ID_PENS );
    PropChunk( iff , ID_SCRN , ID_CLR2 );
    PropChunk( iff , ID_SCRN , ID_CLR4 );
    PropChunk( iff , ID_SCRN , ID_PUBN );
    PropChunk( iff , ID_SCRN , ID_FONT );
    StopOnExit( iff , ID_SCRN , ID_FORM );
    ParseIFF( iff , IFFPARSE_SCAN );
    if ( buf = FindProp( iff , ID_SCRN , ID_TAGS ) ) {
	DeleteScreenTags( );
	ScreenTags = AllocateTagItems( buf->sp_Size / sizeof( struct TagItem ) );
	memcpy( ScreenTags , buf->sp_Data , buf->sp_Size );
	if ( ti = FindTagItem( SA_PubName , ScreenTags ) )
	    if ( buf = FindProp( iff , ID_SCRN , ID_PUBN ) )
		ti->ti_Data = strdup( buf->sp_Data );
	    else
		ti->ti_Data = strdup( "DICE_Project_Handler" );
	if ( ti = FindTagItem( SA_Pens , ScreenTags ) )
	{
	    if ( buf = FindProp( iff , ID_SCRN , ID_PENS ) )
	    {
		ti->ti_Data = malloc( buf->sp_Size );
		memcpy( (void *)ti->ti_Data , buf->sp_Data , buf->sp_Size );
	    }
	    else
	    {
		ti->ti_Data = malloc( 2 );
		*((UWORD *)ti->ti_Data) = ~0;
	    }
	}
	if ( ti = FindTagItem( SA_Colors32 , ScreenTags ) )
	{
	    if ( buf = FindProp( iff , ID_SCRN , ID_CLR4 ) )
	    {
		ti->ti_Data = malloc( buf->sp_Size );
		memcpy( (void *)ti->ti_Data , buf->sp_Data , buf->sp_Size );
	    }
	    else
	    {
		ti->ti_Tag = TAG_SKIP;
		Message( "No 24-Bits Colors data found !" , "Continue" );
	    }
	}
	if ( ti = FindTagItem( SA_Colors , ScreenTags ) )
	{
	    if ( buf = FindProp( iff , ID_SCRN , ID_CLR2 ) )
	    {
		ti->ti_Data = malloc( buf->sp_Size );
		memcpy( (void *)ti->ti_Data , buf->sp_Data , buf->sp_Size );
	    }
	    else
	    {
		ti->ti_Tag = TAG_SKIP;
		Message( "No 12-Bits Colors data found !" , "Continue" );
	    }
	}
	if ( ti = FindTagItem( SA_Font , ScreenTags ) )
	{
	    if ( buf = FindProp( iff , ID_SCRN , ID_FONT ) )
	    {
		fontname = (char *)buf->sp_Data;
		ti->ti_Data = malloc( buf->sp_Size - strlen(fontname)-1 );
		memcpy( (void *)ti->ti_Data , &( (fontname)[strlen(fontname)+1] ) , buf->sp_Size-strlen(fontname)-1 );
		((struct TextAttr *)ti->ti_Data)->ta_Name = strdup( fontname );
	    }
	    else
	    {
		ti->ti_Tag = TAG_SKIP;
		Message( "No Screen Font data found !" , "Continue" );
	    }
	}
    }
}

void SaveScreenTags( struct IFFHandle *iff ) {
  struct TagItem *ti;
  long data;
  BOOL PutTags;

    PushChunk( iff , ID_SCRN , ID_FORM , IFFSIZE_UNKNOWN );
    if ( ti = FindTagItem( SA_PubName , ScreenTags ) )
	if ( stricmp( (void *)( data = ti->ti_Data ) , "DICE_Project_Handler" ) != 0 )
	{
	    PutTags = TRUE;
	    PushChunk( iff , ID_SCRN , ID_PUBN , strlen( (char *)data ) + 1 );
	    WriteChunkBytes( iff , (void *)data , strlen( (char *)data ) + 1 );
	    PopChunk( iff );
	}
    if ( ti = FindTagItem( SA_Pens , ScreenTags ) )
	if ( *((UWORD *)(data = ti->ti_Data)) != ~0 )
	{
	    PutTags = TRUE;
	    PushChunk( iff , ID_SCRN , ID_PENS , 26 );
	    WriteChunkBytes( iff , (void *)data , 26 );
	    PopChunk( iff );
	}
    if ( ti = FindTagItem( SA_Colors , ScreenTags ) )
	if ( data = ti->ti_Data )
	{
	    PutTags = TRUE;
	    PushChunk( iff , ID_SCRN , ID_CLR2 , 40 );
	    WriteChunkBytes( iff , (void *)data , 40 );
	    PopChunk( iff );
	}
    if ( ti = FindTagItem( SA_Colors32 , ScreenTags ) )
	if ( data = ti->ti_Data )
	{
	    PutTags = TRUE;
	    PushChunk( iff , ID_SCRN , ID_CLR4 , 56 );
	    WriteChunkBytes( iff , (void *)data , 56 );
	    PopChunk( iff );
	}
    if ( ti = FindTagItem( SA_Font , ScreenTags ) )
	if ( data = ti->ti_Data )
	{
	    PutTags = TRUE;
	    PushChunk( iff , ID_SCRN , ID_FONT , IFFSIZE_UNKNOWN );
	    WriteChunkBytes( iff , ((struct TextAttr *)data)->ta_Name , strlen( ((struct TextAttr *)data)->ta_Name ) + 1 );
	    WriteChunkBytes( iff , (void *)data , sizeof(struct TextAttr) );
	    PopChunk( iff );
	}
    if ( PutTags ) {
	PushChunk( iff , ID_SCRN , ID_TAGS , sizeof( struct TagItem )*NUM_SCREEN_TAG );
	WriteChunkBytes( iff , ScreenTags , sizeof(struct TagItem)*NUM_SCREEN_TAG );
	PopChunk( iff );
    }
    PopChunk( iff );
}

extern void AttachList(void);
extern void DettachList(void);
extern void CloseEverything( void );

extern BOOL named;

void CloseScreenPrefs( BOOL use ) {
  char *t;

    RemWinC( PalettePrefsWnd );
    RemWinC( ScreenPrefsWnd );
    ClosePalettePrefsWindow( );
    CloseScreenPrefsWindow( );
    if ( use ) {
	DeleteScreenTags( );
	BuildScreenTags( );
	DettachList( );
	CloseEverything( );
	CloseDownScreen( );
	if ( named )
	    saved = FALSE;
	SetupScreen( );
	OpenProjectWindow( );
	AttachList( );
	AddWinC( ProjectWnd , HandleProjectIDCMP );
	t = strdup( ProjectPathName );
	ChangeProjectName( t );
	free( t );
    }
    if ( PublicName ) {
	free( PublicName );
	free( Font0.ta_Name );
	FreeScreenList( &ScreenIDs );
	PublicName = NULL;
    }
}

int Cancel0Clicked( void )
{
    CloseScreenPrefs( FALSE );
}

void Use1Clicked( void ) {
    RemWinC( PalettePrefsWnd );
    ClosePalettePrefsWindow( );
}

int UseClicked( void )
{
    Use1Clicked();
    CloseScreenPrefs( TRUE );
}

void SetThisColor( ULONG num ) {
    if ( ROMVersion >= 39 )
	SetRGB32( &IntuitionBase->ActiveScreen->ViewPort , num , Colors0[num][0]<<24 , Colors0[num][1]<<24 , Colors0[num][2]<<24 );
    else
	SetRGB4( &IntuitionBase->ActiveScreen->ViewPort , num , Colors0[num][0]>>4 , Colors0[num][1]>>4 , Colors0[num][2]>>4 );
}

void SetBackColor( void ) {
  ULONG i;

    for(i=0;i<4;i++)
	SetThisColor( i );
}

void Cancel1Clicked( void ) {
    memcpy( Pens0 , OldPens0 , 24 );
    memcpy( Colors0 , OldColors0 , 48 );
    SetBackColor( );
    Use1Clicked( );
}

void BuildDefScreen( struct TagItem * );
void WindowCorrespond( void );

int WorkbenchClicked( void )
{
    Use1Clicked( );
    free( Font0.ta_Name );
    free( PublicName );
    BuildDefScreen( NULL );
    SetBackColor( );
    WindowCorrespond( );
}

void AffectColors( int num ) {
    GT_SetGadgetAttrs( PalettePrefsGadgets[3] , PalettePrefsWnd , NULL , GTSL_Level , (long)Colors0[num][0] , TAG_DONE );
    GT_SetGadgetAttrs( PalettePrefsGadgets[4] , PalettePrefsWnd , NULL , GTSL_Level , (long)Colors0[num][1] , TAG_DONE );
    GT_SetGadgetAttrs( PalettePrefsGadgets[5] , PalettePrefsWnd , NULL , GTSL_Level , (long)Colors0[num][2] , TAG_DONE );
}

int Palette0Clicked( void )
{
    if ( !PalettePrefsWnd ) {
	if ( !OpenPalettePrefsWindow( ) ) {
	    AddWinC( PalettePrefsWnd , HandlePalettePrefsIDCMP );
	    GT_SetGadgetAttrs( PalettePrefsGadgets[1] , PalettePrefsWnd , NULL , GTPA_Color , Pens0[0] , TAG_DONE );
	    GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
	    AffectColors( 0 );
	    memcpy( OldPens0 , Pens0 , 24 );
	    memcpy( OldColors0 , Colors0 , 48 );
	    CurrentColor = CurrentPen = 0;
	    DefaultColors = FALSE;
	}
    } else
	ActivateWindow( PalettePrefsWnd );
}

int PubNameClicked( void )
{
    free( PublicName );
    PublicName = strdup( GetString( ScreenPrefsGadgets[5] ) );
}

int TypeClicked( void )
{
    ScreenType = ScreenPrefsMsg.Code;
    ActiveWB( ScreenType );
    if ( ScreenType == FALSE )
	ActivateGadget( ScreenPrefsGadgets[5] , ScreenPrefsWnd , NULL );
}

int ScrWidth0Clicked( void )
{
    Width = Res.x + ScreenPrefsMsg.Code;
    GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GTIN_Number , Width , TAG_DONE );
}

int WidthClicked( void )
{
    Width = GetNumber( ScreenPrefsGadgets[8] );
    if ( Width < Res.x )
	Width = Res.x;
    GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GTSC_Top , Width - Res.x , TAG_DONE );
}

int ScrHeight0Clicked( void )
{
    Height = Res.y + ScreenPrefsMsg.Code;
    GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GTIN_Number , Height , TAG_DONE );
}

int HeightClicked( void )
{
    Height = GetNumber( ScreenPrefsGadgets[10] );
    if ( Height < Res.y )
	Height = Res.y;
    GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GTSC_Top , Height - Res.y , TAG_DONE );
}

int OverscanClicked( void )
{
    Overscan = ScreenPrefsMsg.Code;
    UpdateDimension();
}

void ColorsInit( void );

int DefPaletteClicked( void )
{
    GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
    DefaultColors = TRUE;
    Use1Clicked( );
    ColorsInit( );
    SetBackColor( );
}

int AutoscrollClicked( void )
{
    AutoScroll = 1 - AutoScroll;
    GT_SetGadgetAttrs( ScreenPrefsGadgets[13] , ScreenPrefsWnd , NULL , GTCB_Checked , AutoScroll , TAG_DONE );
}

int FontClicked( void )
{
  struct FontRequester *fr;

    GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
    DefaultFont = FALSE;
    SleepWinC( );
    if ( fr = AskFonts( StrMessages[MSG_MESSAGE_ASK_FONT] , &Font0 ) ) {
	free( Font0.ta_Name );
	Font0.ta_Name = strdup( fr->fo_Attr.ta_Name );
	Font0.ta_YSize = fr->fo_Attr.ta_YSize;
	Font0.ta_Flags = fr->fo_Attr.ta_Flags;
	Font0.ta_Style = fr->fo_Attr.ta_Style;
	FreeAslRequest( fr );
    }
    AwakeWinC( );
}

int SysFontsClicked( void )
{
    GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
    DefaultFont = TRUE;
}

int PensClicked( void )
{
    CurrentPen = PalettePrefsMsg.Code;
    GT_SetGadgetAttrs( PalettePrefsGadgets[1] , PalettePrefsWnd , NULL , GTPA_Color , Pens0[CurrentPen] , TAG_DONE );
}

int PenColorsClicked( void )
{
    Pens0[CurrentPen] = PalettePrefsMsg.Code;
}

int TableClicked( void )
{
    CurrentColor = (long)PalettePrefsMsg.Code;
    AffectColors( (int)(CurrentColor) );
}

int Red0Clicked( void )
{
    Colors0[CurrentColor][0] = PalettePrefsMsg.Code;
    SetThisColor( CurrentColor );
}

int Green0Clicked( void )
{
    Colors0[CurrentColor][1] = PalettePrefsMsg.Code;
    SetThisColor( CurrentColor );
}

int Blue0Clicked( void )
{
    Colors0[CurrentColor][2] = PalettePrefsMsg.Code;
    SetThisColor( CurrentColor );
}

int ScreenPrefsVanillaKey()
{
    switch( ScreenPrefsMsg.Code ) {
      case 'i':
      case 'I':
	if ( isupper( (int)ScreenPrefsMsg.Code ) )
	    DisplayIDNum++;
	else
	    DisplayIDNum--;
	ScreenPrefsMsg.Code = DisplayIDNum;
	DispIDClicked( );
	GT_SetGadgetAttrs( ScreenPrefsGadgets[0] , ScreenPrefsWnd , NULL , GTLV_Selected , DisplayIDNum , GTLV_Top , DisplayIDNum , TAG_DONE );
	break;
      case 'u':
      case 'U':
	UseClicked();
	break;
      case 'a':
      case 'A':
	Cancel0Clicked();
	break;
      case 'c':
      case 'C':
	AutoscrollClicked( );
	break;
      case 'p':
      case 'P':
	Palette0Clicked();
	break;
      case 't':
      case 'T':
	ScreenPrefsMsg.Code = 1 - ScreenType;
	TypeClicked();
	GT_SetGadgetAttrs( ScreenPrefsGadgets[6] , ScreenPrefsWnd , NULL , GTCY_Active , ScreenType , TAG_DONE );
      break;
      case 'w':
      case 'W':
	ActivateGadget( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL );
	break;
      case 'h':
      case 'H':
	ActivateGadget( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL );
	break;
      case 'o':
      case 'O':
	if ( isupper( ScreenPrefsMsg.Code ) )
	{
	    if ( Overscan > 0 )
		Overscan --;
	}
	else
	{
	    if ( Overscan < 3 )
		Overscan ++;
	}
	GT_SetGadgetAttrs( ScreenPrefsGadgets[11] , ScreenPrefsWnd , NULL , GTCY_Active , Overscan , TAG_DONE );
	UpdateDimension( );
	break;
      case 'd':
      case 'D':
	DefPaletteClicked();
	break;
      case 'f':
      case 'F':
	FontClicked();
	break;
      case 'y':
      case 'Y':
	SysFontsClicked();
	break;
      case 'r':
      case 'R':
	WorkbenchClicked( );
	break;
    }
}

int PalettePrefsVanillaKey()
{
    switch( PalettePrefsMsg.Code ) {
      case 'p':
      case 'P':
	if ( isupper( PalettePrefsMsg.Code ) )
	{
	    if ( CurrentPen > 0 )
		CurrentPen--;
	}
	else
	{
	    if ( CurrentPen < 12 )
		CurrentPen++;
	}
	GT_SetGadgetAttrs( PalettePrefsGadgets[0] , PalettePrefsWnd , NULL , GTLV_Selected , CurrentPen , GTLV_Top , CurrentPen , TAG_DONE );
	PalettePrefsMsg.Code = CurrentPen;
	PensClicked( );
	break;
      case 't':
      case 'T':
	if ( isupper( PalettePrefsMsg.Code ) )
	{
	    if ( CurrentColor > 0 )
		CurrentColor--;
	}
	else
	{
	    if ( CurrentColor < 3 )
		CurrentColor++;
	}
	GT_SetGadgetAttrs( PalettePrefsGadgets[2] , PalettePrefsWnd , NULL , GTPA_Color , CurrentColor , TAG_DONE );
	AffectColors( CurrentColor );
	break;
      case 'r':
      case 'R':
	if ( isupper( PalettePrefsMsg.Code ) )
	{
	    if ( Colors0[ CurrentColor ][0] > 0 )
		Colors0[CurrentColor][0]--;
	}
	else
	{
	    if ( Colors0[CurrentColor][0] < 255 )
		Colors0[CurrentColor][0]++;
	}
	GT_SetGadgetAttrs( PalettePrefsGadgets[3] , PalettePrefsWnd , NULL , GTSL_Level , Colors0[CurrentColor][0] , TAG_DONE );
	SetThisColor( CurrentColor );
	break;
      case 'g':
      case 'G':
	if ( isupper( PalettePrefsMsg.Code ) )
	{
	    if ( Colors0[ CurrentColor ][1] > 0 )
		Colors0[CurrentColor][1]--;
	}
	else
	{
	    if ( Colors0[CurrentColor][1] < 255 )
		Colors0[CurrentColor][1]++;
	}
	GT_SetGadgetAttrs( PalettePrefsGadgets[4] , PalettePrefsWnd , NULL , GTSL_Level , Colors0[CurrentColor][1] , TAG_DONE );
	SetThisColor( CurrentColor );
	break;
      case 'b':
      case 'B':
	if ( isupper( PalettePrefsMsg.Code ) )
	{
	    if ( Colors0[CurrentColor][2] > 0 )
		Colors0[CurrentColor][2]--;
	}
	else
	{
	    if ( Colors0[CurrentColor][2] < 255 )
		Colors0[CurrentColor][2]++;
	}
	GT_SetGadgetAttrs( PalettePrefsGadgets[5] , PalettePrefsWnd , NULL , GTSL_Level , Colors0[CurrentColor][2] , TAG_DONE );
	SetThisColor( CurrentColor );
	break;
      case 'u':
      case 'U':
	Use1Clicked();
	break;
      case 'A':
      case 'a':
	Cancel1Clicked();
	break;
    }
}

#define winsignal(win) (1 << win->UserPort->mp_SigBit)

void ColorsInit( void ) {
  struct Screen *WBScr;
  long i,val;

    WBScr = LockPubScreen( "Workbench" );
    if ( ROMVersion >= 39 ) {
	GetRGB32( WBScr->ViewPort.ColorMap , 0L , 4L , (ULONG *)Colors0 );
	for(i=0;i<4;i++)
	{
	    Colors0[i][0] >>= 24;
	    Colors0[i][1] >>= 24;
	    Colors0[i][2] >>= 24;
	}
    }
    else
    {
	for(i=0;i<4;i++)
	{
	    val = GetRGB4( WBScr->ViewPort.ColorMap , i );
	    Colors0[i][0] = ( (val&0x0F00)>>4 ) + ( (val&0x0F00)>>8 );
	    Colors0[i][1] = val&0x00F0 + ( (val&0x00F0)>>4 );
	    Colors0[i][2] = ( (val&0x0F)<<4 ) + val&0x0F;
	}
    }
    UnlockPubScreen( "Workbench" , WBScr );
}

void Tag4TOColors( struct ColorSpec *cs ) {
    while( cs->ColorIndex != -1 ) {
	if ( cs->ColorIndex >= 0 && cs->ColorIndex < 4 ) {
	    Colors0[cs->ColorIndex][0] = (cs->Red<<4)+cs->Red;
	    Colors0[cs->ColorIndex][1] = (cs->Green<<4)+cs->Red;
	    Colors0[cs->ColorIndex][2] = (cs->Blue<<4)+cs->Red;
	}
	DefaultColors = FALSE;
	cs++;
    }
}

void Tag32TOColors( ULONG *data ) {
  ULONG num = *data++ , index = *data++;

    while ( index < 4 && num-- ) {
	Colors0[index][0] = *data++>>24;
	Colors0[index][1] = *data++>>24;
	Colors0[index++][2] = *data++>>24;
	DefaultColors = FALSE;
    }
}

void PensInit( void ) {
  struct Screen *WBScr;
  struct DrawInfo *DI;
  int num;

    WBScr = LockPubScreen( "Workbench" );
    DI = GetScreenDrawInfo( WBScr );
    num = DI->dri_NumPens;
    if ( num>12 )
	num = 12;
    memcpy( Pens0 , DI->dri_Pens , num<<1 );
    FreeScreenDrawInfo( WBScr , DI );
    UnlockPubScreen( "Workbench" , WBScr );
}

void PensConvert( UWORD *pen ) {
  int num=0;

    if ( *pen != ~0 )
	DefaultColors = FALSE;
    while( *pen != ~0 && num<12 )
	Pens0[num++] = *pen++;
}

void BuildDefScreen( struct TagItem *intags )
{
  long data;
  struct TagItem *ti;

    DisplayID = HIRES_KEY;
    if ( ti = FindTagItem( SA_DisplayID , intags ) )
	if ( data = ti->ti_Data )
	    DisplayID = (long)data;
    DisplayIDNum = BuildScreenList( &ScreenIDs , DisplayID );
    PublicName = strdup( "DICE_Project_Handler" );
    if ( ti = FindTagItem( SA_PubName , intags ) )
	if ( data = ti->ti_Data ) {
	    free( PublicName );
	    PublicName = strdup( (char *)data );
	}
    Overscan = 0;
    if ( ti = FindTagItem( SA_Overscan , intags ) )
	switch( ti->ti_Data ) {
	  case OSCAN_STANDARD:
	    Overscan = 4;
	    break;
	  case OSCAN_TEXT:
	    Overscan = 3;
	    break;
	  case OSCAN_MAX:
	    Overscan = 1;
	    break;
	  case OSCAN_VIDEO:
	    Overscan = 2;
	    break;
	}
    ScreenType = 0;
    if ( ti = FindTagItem( SA_Type , intags ) )
	if ( ti->ti_Data == WBENCHSCREEN )
	    ScreenType = 1;
    AutoScroll = TRUE;
    if ( ti = FindTagItem( SA_AutoScroll , intags ) )
	AutoScroll = (UBYTE)ti->ti_Data;
    Height = 200;
    Width = 724;
    Res.x = 724;
    Res.y = 200;
    UpdateDimension();
    if ( ti = FindTagItem( SA_Height , intags ) )
	if ( ti->ti_Data!=STDSCREENHEIGHT ) {
	    Height = ti->ti_Data;
	}
    if ( ti = FindTagItem( SA_Width , intags ) )
	if ( ti->ti_Data!=STDSCREENWIDTH ) {
	    Width = ti->ti_Data;
	}
    DefaultColors = TRUE;
    ColorsInit();
    if ( ti = FindTagItem( SA_Colors32 , intags ) )
    {
	if ( data = ti->ti_Data )
	    Tag32TOColors( (ULONG *)data );
    }
    else if ( ti = FindTagItem( SA_Colors , intags ) )
	    if ( data = ti->ti_Data )
		Tag4TOColors( (struct ColorSpec *)data );
    PensInit( );
    if ( ti = FindTagItem( SA_Pens , intags ) )
	if ( data = ti->ti_Data )
	    PensConvert( (UWORD *)data );
    Font0.ta_Name = strdup( "times.font" );
    Font0.ta_YSize = 13;
    Font0.ta_Style = 0;
    DefaultFont = TRUE;
    if ( ti = FindTagItem( SA_Font , intags ) )
	if ( data = ti->ti_Data ) {
	    DefaultFont = FALSE;
	    free( Font0.ta_Name );
	    memcpy( (void *)&Font0 , (void *)data , sizeof(struct TextAttr) );
	    Font0.ta_Name = strdup( ((struct TextAttr *)data)->ta_Name );
	}
}

void WindowCorrespond( void ) {
    GT_SetGadgetAttrs( ScreenPrefsGadgets[0] , ScreenPrefsWnd , NULL , GTLV_Selected , DisplayIDNum , GTLV_Labels , &ScreenIDs , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[5] , ScreenPrefsWnd , NULL , GTST_String , PublicName , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GTSC_Top , Width-Res.x , GTSC_Total , 16384-Res.x , GTSC_Visible , 100 , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GTIN_Number , Width , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GTSC_Top , Height-Res.y , GTSC_Total , 16384-Res.y , GTSC_Visible , 100 , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GTIN_Number , Height , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[11] , ScreenPrefsWnd , NULL , GTCY_Active , Overscan , TAG_DONE );
    GT_SetGadgetAttrs( ScreenPrefsGadgets[13] , ScreenPrefsWnd , NULL , GTCB_Checked , AutoScroll , TAG_DONE );
    if ( !DefaultColors )
	GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
    else
	GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
    if ( !DefaultFont )
	GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
    else
	GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
    if ( ScreenType )
    {
	GT_SetGadgetAttrs( ScreenPrefsGadgets[6] , ScreenPrefsWnd , NULL , GTCY_Active , ScreenType , TAG_DONE );
	ActiveWB( TRUE );
    }
}


struct TagItem *ScreenPrefs( struct TagItem *intags ) {
    if ( !ScreenPrefsWnd ) {
	BuildDefScreen( intags );
	if ( !OpenScreenPrefsWindow( ) ) {
	    WindowCorrespond( );
	    AddWinC( ScreenPrefsWnd , HandleScreenPrefsIDCMP );
	}
    } else {
	WindowToFront( ScreenPrefsWnd );
	ActivateWindow( ScreenPrefsWnd );
    }
}

