/* Screentool */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <exec/memory.h>
#include <intuition/intuitionbase.h>

#include "version.h"

struct IntuitionBase *IntBase;

CHARVERSTAG;

struct SToolArgs {
  UBYTE **Screen;
  LONG List,ToFront,ToBack,Constring,Winsize;
};

char *NOTAPP = "n/a";

char *Template = "SCREEN/M,LIST=L/S,TOFRONT=F/S,TOBACK=B/S,CONSTRING=C/S,WINSIZE=W/S";

char *Options[] = {
	"screentitle or pattern (casesensitive!)",
	"list screens",
	"bring object to front",
	"send object to back",
	"windowsize as CON:-like string",
	"windowsize as info-string"
};
char *Errlist[] = {
	"TOFRONT only valid with SCREEN.",
	"LIST not valid with SCREEN. Use patterns instead.",
	"TOFRONT or TOBACK, there could only be ONE.",
	"TOFRONT / TOBACK not valid with LIST.",
	"n/a"
};

char ProgName[80];

void Help(int err) 
{
  if (!err) {
	char *p,**o;
	o=&Options[0];
	Printf("Usage:\n%s %s\n",ProgName,Template);
	for (p=strtok(Template,",");p;p=strtok(NULL,","))
		Printf("  %s\t%s\n",p,*o++);
  }
  else
	Printf("Error: %s\n",Errlist[err-1]);
}


void DumpScreen(struct Screen *scr)
{
	UBYTE *s;
	ULONG m;
	s=NOTAPP;
	if (scr->Title) {
		s=scr->Title;
		Printf("Title: \"%s\"\n",s);
	}
	if (scr->DefaultTitle) s=scr->DefaultTitle;
	if (scr->Title != s) 
		Printf("DefaultTitle: \"%s\"\n",s);
    m=GetVPModeID(&scr->ViewPort);
	Printf("%ldx%ld",(long)scr->Width,(long)scr->Height);
	Printf("x%ld",scr->RastPort.BitMap->Depth);
	Printf(" Mode: 0x%lx",m);
	Printf(" @(%ld,%ld)\n\n",scr->LeftEdge,scr->TopEdge);
}


LONG __saveds main(void)
{
  struct Window *win;
  struct Screen *scr;
  struct Screen *scr_p;
  UBYTE *s;
  UBYTE **ScreenName;

  UBYTE *patbuf;
  int ret;

  struct RDArgs *RDArgs;
  struct SToolArgs Args = {0}; // everything will be FALSE

  if (!GetProgramName(ProgName,(long)sizeof(ProgName))) (void)strcpy(ProgName,VERS);

  if ((RDArgs=ReadArgs(Template,(LONG *)&Args,NULL))==NULL) {
	PrintFault (IoErr(),ProgName);
	exit(1);
  }
  ScreenName = Args.Screen;

  ret = 0;
  if (!(ScreenName || 
		Args.List ||
		Args.ToFront ||
	  	Args.ToBack ||
		Args.Constring ||
		Args.Winsize)) {
	FreeArgs (RDArgs);
	Help(0);
	exit(0);
  }

  if (!ScreenName && Args.ToFront) ret = 1;
  else
  if (Args.ToFront && Args.ToBack) ret = 2;
  else
  if (Args.List && (Args.ToFront || Args.ToBack)) ret = 3;

  if (ret) {
	FreeArgs (RDArgs);
	Help(1);
	exit(0);
  }

  patbuf = NULL;
  if (ScreenName) {
	LONG ret;
    LONG patsiz;
	patsiz = strlen(*ScreenName)*2+20;
	if (!(patbuf = AllocVec(patsiz,MEMF_PUBLIC))) {
		FreeArgs (RDArgs);
		PrintFault(IoErr(),ProgName);
		exit(10);
	}
	ret = ParsePattern(*ScreenName,patbuf,patsiz);
	if (ret==-1) {
		FreeVec(patbuf);
		FreeArgs (RDArgs);
		PrintFault(IoErr(),ProgName);
		exit(10);
	}
  }

  win = IntuitionBase->ActiveWindow;
  scr = IntuitionBase->FirstScreen;

  if (ScreenName || Args.ToFront || Args.ToBack || Args.List) {
    scr_p = scr;
    while (scr_p) {
	  s="n/a";
	  if (scr_p->DefaultTitle) s=scr_p->DefaultTitle;
	  if (scr_p->Title) s=scr_p->Title;
	  if (Args.List && !patbuf) {
		DumpScreen(scr_p);
	  }
	  if (patbuf)
		if (MatchPattern(patbuf,s)) {
			if (Args.List) {
				DumpScreen(scr_p);
			}
			if (Args.ToFront) {
				ScreenToFront(scr_p);
				break;
			}
			else
			if (Args.ToBack) {
				ScreenToBack(scr_p);
				break;
			}
		} 
	  scr_p=scr_p->NextScreen;
    }
  }


  if (Args.Winsize) { // this ones from WinSize
    Printf ("Window Position: %d x %d , Size: %d x %d\n",win->LeftEdge,win->TopEdge,win->Width,win->Height);
  }

  if (Args.Constring) { // this 2
    Printf ("%d/%d/%d/%d/",win->LeftEdge,win->TopEdge,win->Width,win->Height);
  }

  if (patbuf) FreeVec(patbuf);
  FreeArgs (RDArgs);
}
