/************************************************************\
 *                    SCREEN MOD                            *
 *                                                          *
 *  A little utility to make life just that oh, little      *
 *  bit easier .... have fun!                               *
 *                                                          *
 *  This program, source code, and documentation are        *
 *  Copyrighted ©1991 by Legendary Design Technologies Inc. *
 *  but are freely distributable.                           *
 *                                                          *
 *   Written by Syd L. Bolton on May 1, 1991 at ~ 11:00pm   *
 *                                                          *
 *                     Version: 1.0                         *
\************************************************************/

#include <stdio.h>
#include <exec/types.h>
#include <exec/ports.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <functions.h>

#include "main.h"

#define VMODES Screens[scr]->ViewPort.Modes   /* shortcut */

long *IntuitionBase=0,*GfxBase=0;
struct Screen *Screen;
struct Window *Window;
struct RastPort *rport;
struct ViewPort *vport;

struct Screen *Screens[20];

char string[80],origtitle[80];
int count,origwidth,origheight,scr=0;

main(argc,argv)
int argc;
char *argv[];
{
struct IntuiMessage *message;
ULONG class;
int exit_flag=0;

openstuff();

if (argc > 1) {
	if((!(strcmp(argv[1],"small")))||(!(strcmp(argv[1],"SMALL")))) {
		iconify();
		goto mloop;
		}
	}

opendisplay();
screenlist();
updatestats();

mloop:
do {
	WaitPort(Window->UserPort);
		while ( ( message=(struct IntuiMessage *)
			GetMsg(Window->UserPort) ) != NULL)
		{
		class=message->Class;
		ReplyMsg(message); 

		if (class==GADGETUP) option(message);
		if (class==MOUSEBUTTONS) click(message);
		if (class==MENUPICK) exit_flag=menu(message);
		if (class==VANILLAKEY) keystroke(message);
		}
	} while (exit_flag==0);

closestuff();
}			

#include "message.c"  
#include "save.c"
#include "iconify.c"
#include "palette.c"

keystroke(message)
struct IntuiMessage *message;
{
switch(message->Code) {
	case 'R':
	case 'r': remakescreen();
		  break;

	case 'V':
	case 'v': viewscreen();
		  break;

	case 'H':
	case 'h': Message(2);    /* help */
	            break;

	case 'A':
	case 'a': adjustcolor();
		  break;

	case 'U':
	case 'u': screenlist();
		  scr=0;
		  updatestats();
		  break;

	case 27: strcpy(Gadget3SIBuff,"0");
		 strcpy(Gadget4SIBuff,"0");
		 strcpy(Gadget5SIBuff,"640");
		 strcpy(Gadget6SIBuff,"200");
		 strcpy(Gadget7SIBuff,"0");
		 strcpy(Gadget8SIBuff,"1");
		 strcpy(Gadget9SIBuff,"ScreenMod v1.0 ©1991 Legendary Design Technologies Inc.");
		 strcpy(Gadget10SIBuff,Gadget9SIBuff);
		 Gadget12.Flags |= SELECTED;
		 Gadget13.Flags &= ~SELECTED;
		 Gadget14.Flags |= SELECTED;
		 Gadget15.Flags &= ~SELECTED;
		 Gadget16.Flags &= ~SELECTED;
		 Gadget17.Flags &= ~SELECTED;
		 remakescreen();
		 screenlist();
		 scr=0;
		 updatestats();
		 break;
		
	default: break;
	}
}

menu(message)
struct IntuiMessage *message;
{
int rv=0;

switch(MENUNUM(message->Code)) {
	case 0: rv=project(message);
		break;

	case 1: rv=special(message);
		break;

	default: break;
	}
return(rv);
}

project(message)
struct IntuiMessage *message;
{
switch(ITEMNUM(message->Code)) {

	case 0: save();
		break;         /* save settings */

	case 1: Message(1);           /* about */
 		break;

	case 2: Message(2);           /* help */
		break;

	case 3: return(1);            /* quit */

	default: break;
	}
return(0);
}
	
special(message)
struct IntuiMessage *message;
{
int rv=0;

switch(ITEMNUM(message->Code)) {

	case 0: rv=iconify();
		break;

	default: break;
	}
return(rv);
}

click(message)
struct IntuiMessage *message;
{
int x,y;

if(!(message->Code==SELECTUP))
	return();

x=message->MouseX;
y=message->MouseY;

if (x < 12 || x > 340 || y < 26 || y > 196)
	return();

y=(y-28)/10;

if (y >count-1) return();

displaysname(scr,1,0);
scr=y;
updatestats();
}

option(message)
struct IntuiMessage *message;
{
struct Gadget *igad;
int gadgid;

igad=(struct Gadget *) message->IAddress;
gadgid=igad->GadgetID;

switch(gadgid) {
	case 20: screenlist();
		 scr=0;
		 updatestats();

	case 30: remakescreen();
		 break;

	case 40: adjustcolor();
		 break;

	case 50: viewscreen();
		 break;

	default: break;
	}
}

viewscreen()
{
struct IntuiMessage *waitmsg;

if (scr==0) return();   /* screen already in front */
ScreenToFront(Screens[scr]);
WaitPort(Window->UserPort);
	while ( ( waitmsg=(struct IntuiMessage *)
		GetMsg(Window->UserPort) ) != NULL)
			ReplyMsg(waitmsg); 
ScreenToFront(Screens[0]);
}

adjustcolor()
{
ScreenToFront(Screens[scr]);
doPalette(Screens[scr]);
ScreenToFront(Screens[0]);  /* this brings SCREENMOD back */
}

remakescreen()
{
Screens[scr]->LeftEdge=atoi(Gadget3SIBuff);
Screens[scr]->TopEdge=atoi(Gadget4SIBuff);
Screens[scr]->Width=atoi(Gadget5SIBuff);
Screens[scr]->Height=atoi(Gadget6SIBuff);
Screens[scr]->DetailPen=atoi(Gadget7SIBuff);
Screens[scr]->BlockPen=atoi(Gadget8SIBuff);
strcpy(Screens[scr]->Title,Gadget9SIBuff);
strcpy(Screens[scr]->DefaultTitle,Gadget10SIBuff);
Screens[scr]->ViewPort.DxOffset=atoi(Gadget3SIBuff);
Screens[scr]->ViewPort.DyOffset=atoi(Gadget4SIBuff);
if (Gadget12.Flags & SELECTED) Screens[scr]->ViewPort.Modes |= HIRES;
	else Screens[scr]->ViewPort.Modes &= ~HIRES;
if (Gadget13.Flags & SELECTED) Screens[scr]->ViewPort.Modes |= LACE;
	else Screens[scr]->ViewPort.Modes &= ~LACE;
if (Gadget14.Flags & SELECTED) Screens[scr]->ViewPort.Modes |= SPRITES;
	else Screens[scr]->ViewPort.Modes &= ~SPRITES;
if (Gadget15.Flags & SELECTED) Screens[scr]->ViewPort.Modes |= DUALPF;
	else Screens[scr]->ViewPort.Modes &= ~DUALPF;
if (Gadget16.Flags & SELECTED) Screens[scr]->ViewPort.Modes |= HAM;
	else Screens[scr]->ViewPort.Modes &= ~HAM;
if (Gadget17.Flags & SELECTED) Screens[scr]->ViewPort.Modes |= EXTRA_HALFBRITE;
	else Screens[scr]->ViewPort.Modes &= ~EXTRA_HALFBRITE;
RemakeDisplay();
if (Screens[scr]->Flags & SHOWTITLE) ShowTitle(Screens[scr],TRUE);
}

updatestats()
{
int i,j;

sprintf(Gadget3SIBuff,"%-d",Screens[scr]->LeftEdge);
sprintf(Gadget4SIBuff,"%-d",Screens[scr]->TopEdge);
sprintf(Gadget5SIBuff,"%-d",Screens[scr]->Width);
sprintf(Gadget6SIBuff,"%-d",Screens[scr]->Height);
sprintf(Gadget7SIBuff,"%-d",Screens[scr]->DetailPen);
sprintf(Gadget8SIBuff,"%-d",Screens[scr]->BlockPen);
strcpy(Gadget9SIBuff,Screens[scr]->Title);
strcpy(Gadget10SIBuff,Screens[scr]->DefaultTitle);
strcpy(Gadget11SIBuff,(STRPTR)Screens[scr]->Font.ta_Name);
strcpy(origtitle,Screens[scr]->DefaultTitle);
origheight=Screens[scr]->Height;
origwidth=Screens[scr]->Width;
SetAPen(rport,0);
for (i=0; i<2; i++) {
	for (j=0; j<3; j++)
		RectFill(rport,357+j*97,132+i*16,357+76+j*97,132+8+i*16);
	}
if (VMODES & HIRES) Gadget12.Flags |= SELECTED;
	else Gadget12.Flags &= ~SELECTED;
if (VMODES & LACE) Gadget13.Flags |= SELECTED;
	else Gadget13.Flags &= ~SELECTED;
if (VMODES & SPRITES) Gadget14.Flags |= SELECTED;
	else Gadget14.Flags &= ~SELECTED;
if (VMODES & DUALPF) Gadget15.Flags |= SELECTED;
	else Gadget15.Flags &= ~SELECTED;
if (VMODES & HAM) Gadget16.Flags |= SELECTED;
	else Gadget16.Flags &= ~SELECTED;
if (VMODES & EXTRA_HALFBRITE) Gadget17.Flags |= SELECTED;
	else Gadget17.Flags &= ~SELECTED;
RefreshGadgets(&Gadget3,Window,NULL);
displaysname(scr,3,1);
}

screenlist()
{
int done=0,i;

count=0;

Screens[0]=IntuitionBase->FirstScreen;

do {
	Screens[count+1]=Screens[count]->NextScreen;
	if (Screens[count+1]==NULL) done=1;
	count++;
	if (count==17) done=1;
	} while (done==0);

for (i=0; i<count; i++) 
	displaysname(i,1,0);	
}

displaysname(i,a,b)
int i,a,b;
{
char tempstring[15];

SetAPen(rport,a); SetBPen(rport,b);
sprintf(string,"%-30s",Screens[i]->Title);
string[30]=' ';string[31]='\0';
if (Screens[i]->Title[0]=='\0') strcpy(string,"** NO NAME **                  ");
sprintf(tempstring,"%4dX%-4d",Screens[i]->Width,Screens[i]->Height);
strcat(string,tempstring);
Move(rport,15,35+i*10);
Text(rport,string,strlen(string));
}

openstuff()
{
if((IntuitionBase=OpenLibrary("intuition.library",0L))==NULL)
	exit(1);
if((GfxBase=OpenLibrary("graphics.library",0L))==NULL)
	exit(1);
}

opendisplay()
{
if(!(Screen=OpenScreen(&NewScreenStructure))) {
	puts("Can't open screen!");
	closestuff();
	exit(1);
	}

NewWindowStructure1.Screen=Screen;

if (!(Window=OpenWindow(&NewWindowStructure1))) {
	puts("Cannot open the window.");
	closestuff();
	exit(1);
	}
vport=&Screen->ViewPort;

LoadRGB4(vport,&Palette[0],PaletteColorCount);

rport=Window->RPort;
PrintIText(rport,&IntuiTextList1,0,0);
DrawBorder(rport,&BorderList1,0,0);
SetMenuStrip(Window,&MenuList1);
}

closestuff()
{
if (Window) ClearMenuStrip(Window);
if (Window) CloseWindow(Window);
if (Screen) CloseScreen(Screen);
if (IntuitionBase) CloseLibrary(IntuitionBase);
if (GfxBase) CloseLibrary(GfxBase);
}
