/* $Revision Header built automatically *************** (do not edit) ************
**
** © Copyright by Thule Software
**
** File             : HardCore:Code/Project/FullBench/FullBench.c
** Created on       : Fredag, 02.02.96 20:27:16
** Created by       : Nils Peter Sudmann
** Current revision : V2.0
**
**
** Purpose
** -------
**     Removes the menu line on the Workbench.
**
** Revision V2.0
** --------------
** created on Fredag, 02.02.96 20:27:16  by  Nils Peter Sudmann.   LogMessage :
**     --- Initial release ---
**
*********************************************************************************/
#define REVISION "2.0"
#define REVDATE  "02.02.96"
#define REVTIME  "20:27:16"
#define AUTHOR   "Nils Peter Sudmann"
#define VERNUM   2
#define REVNUM   0
#define TITLE    "FullBench"

#include <string.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/screennotify.h>
#include <intuition/imageclass.h>     
#include <intuition/gadgetclass.h>     
#include <dos/dos.h>
#include <libraries/screennotify.h>

#define INTUINAME   "intuition.library"
#define INTUIVER    36L

BOOL Full(BOOL);

const char vs[]="$VER: "TITLE" "REVISION" ("REVDATE")(c) "AUTHOR;
struct ExecBase *SysBase;
struct IntuitionBase *IntuitionBase;

struct EasyStruct err = {
  sizeof(struct EasyStruct), 0,
  vs, 
  "Can't find Worbench screen\nor WB is not backdrop",
  "Continue",
};

int __saveds FullBench( void ) {
	struct Process *fullTask;
	int signal,rc=RETURN_OK;
	STRPTR oldname;
	APTR handle;
	struct MsgPort *mp;
	struct ScreenNotifyMessage *snm;
	struct Library *ScreenNotifyBase;
	struct DosLibrary *DOSBase;

	SysBase = *((struct ExecBase **) 4);

	Forbid();
	if (fullTask = (struct Process *)FindTask("task_FullBench")) {
		Signal((struct Task *)fullTask, SIGBREAKF_CTRL_C);
		Permit();
		goto quit2;
  }
 	Permit();

	if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary(INTUINAME,INTUIVER))) return(0);

	oldname = FindTask(NULL)->tc_Node.ln_Name;
  FindTask(NULL)->tc_Node.ln_Name = "task_FullBench";

	if (ScreenNotifyBase = OpenLibrary(SCREENNOTIFY_NAME,SCREENNOTIFY_VERSION)) {
		if ((mp = CreateMsgPort()) && (DOSBase = (struct DosLibrary *)OpenLibrary(DOSNAME,NULL))) {
			handle=AddWorkbenchClient(mp,0);
		} else {
			rc = RETURN_ERROR;
			goto quit;
		}
	}  

	if (Full(TRUE)) {
	  for(;;){
  	  signal = Wait((long)(SIGBREAKF_CTRL_C | (1<<mp->mp_SigBit)));
    	if (signal & SIGBREAKF_CTRL_C) break;
			while (snm = (struct ScreenNotifyMessage *) GetMsg(mp)) {
				if (snm->snm_Type == SCREENNOTIFY_TYPE_WORKBENCH) Full((BOOL)snm->snm_Value);
        ReplyMsg((struct Message *) snm);
			}
  	}

	  Full(FALSE);
	}  

quit:
	CloseLibrary((struct Library*)IntuitionBase);
	if (ScreenNotifyBase) {
		while (!RemPubScreenClient(handle)) Delay(10);
		CloseLibrary(ScreenNotifyBase);
		CloseLibrary((struct Library *)DOSBase);
		DeleteMsgPort(mp);
	}
quit2:
  (fullTask=(struct Process *)FindTask(NULL))->pr_Task.tc_Node.ln_Name = oldname;
	if (!fullTask->pr_CLI) {
		WaitPort(&fullTask->pr_MsgPort);
		Forbid();
		ReplyMsg(GetMsg(&fullTask->pr_MsgPort));
	}
  return(rc);
}


BOOL Full(BOOL on)
{
  struct Window *WBWin;
  BOOL success = FALSE;
  struct Screen *WBScreen;
	static struct Window *Fwin;
	static struct Image *id;
	static struct Gadget *gad;
	static struct DrawInfo *dri;

  if (!(WBScreen = LockPubScreen("Workbench"))) {
    EasyRequestArgs(NULL, &err, NULL, NULL);
    return(FALSE);
  }

  Forbid();
  for(WBWin = WBScreen->FirstWindow; WBWin
    && (strncmp(WBWin->ScreenTitle,"Amiga Workbench",15)
	  && strncmp(WBWin->ScreenTitle,"Attempting to load program",25)
	  && strncmp(WBWin->ScreenTitle,"Copyright © 1985-199",20)
	  && strncmp(WBWin->ScreenTitle,"Cannot Quit yet",15)
	  || WBWin->Title!=NULL); WBWin = WBWin->NextWindow);
  Permit();

  if (!WBWin) {
    EasyRequestArgs(NULL, &err, NULL, NULL);
  	UnlockPubScreen(NULL, WBScreen);
	  return(FALSE);
  }

  ShowTitle(WBScreen, (long)!on);
  if (on) {
		id = NewObject(NULL, SYSICLASS,
     		SYSIA_DrawInfo, dri = GetScreenDrawInfo(WBScreen),
     		SYSIA_Which, SDEPTHIMAGE,
				IA_Height,WBScreen->BarHeight+1,
     		SYSIA_Size, (WBScreen->Flags & SCREENHIRES ? SYSISIZE_MEDRES : SYSISIZE_LOWRES),
     	TAG_DONE);
		gad = NewObject(NULL, BUTTONGCLASS,
				GA_Image, id,
				GA_SysGType, GTYP_SDEPTH,
			TAG_DONE);
    ChangeWindowBox(WBWin,(long)WBWin->LeftEdge,0,(long)WBWin->Width,(long)WBScreen->Height);
    if (Fwin = OpenWindowTags(NULL, 
				WA_Title,"win_FullBench",
				WA_PubScreen, WBScreen,
				WA_Top, 0,
				WA_Left, 32000,
				WA_Height, id->Height,
				WA_Width, id->Width -1, /* Dunno why I need this -1 */
				WA_AutoAdjust, TRUE,
				WA_Gadgets, gad,
				WA_Flags, WFLG_BORDERLESS,
				TAG_END)
			) success=TRUE;
	} else {
    ChangeWindowBox(WBWin,(long)WBWin->LeftEdge,(long)(WBScreen->BarHeight+1),
	    (long)WBWin->Width,(long)WBScreen->Height-(WBScreen->BarHeight+1));
		CloseWindow(Fwin);
		DisposeObject(gad);
		DisposeObject(id);
		FreeScreenDrawInfo(WBScreen,dri);
		success=TRUE;
  }
  
  UnlockPubScreen(NULL, WBScreen);
  return(success);
}
