home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD2.img
/
d4xx
/
d418
/
psx
/
src
/
screens.c
< prev
Wrap
C/C++ Source or Header
|
1990-12-17
|
6KB
|
297 lines
/**********************************************************************/
/* Public screen Opening code, for creating new public screens */
/**********************************************************************/
#include "psx.h"
/*
struct ColorSpec ColourSpecs[] =
{
{0, 11, 9, 7},
{1, 3, 2, 2 },
{2, 15, 14, 13},
{3, 12, 2, 0 },
{-1,},
};
*/
ULONG OpenErr;
char *OpenErrors[] =
{
"Unknown Error",
"Named monitor not available",
"Proper chips not available",
"Not enough memory",
"Not enough chip memory",
"Screen name in use",
"Unknown screen mode",
};
/* I accept the default pens, but have to
* pass something to get the new look.
*/
UWORD Pens[] =
{
0, 1, ~0 /* just detail and block */
};
char NewPubScreenName[MAXPUBSCREENNAME];
ULONG NewScreenTags[] =
{
SA_PubName, (ULONG) NewPubScreenName,
SA_ErrorCode, (ULONG) &OpenErr,
SA_Pens, (ULONG) Pens,
TAG_DONE,
};
/**********************************************************************/
/* Get the parameters for the new public screen */
/**********************************************************************/
int
GetScreenParameters(struct NewScreen *NS)
{
ULONG TopBorder;
int WinHeight, WinWidth;
struct Window *ReqWindow;
struct IntuiMessage *Message;
ULONG Class, Code;
int AllOkay=TRUE;
int KG;
int XDim=0, YDim=0, Depth=0;
TopBorder=Screen->WBorTop;
strcpy(NewPubScreenName, "PSX_Screen");
SGadList=NULL;
WinHeight=CreateScreenGadgets(&SGadList, VI, TopBorder, TAttr, &WinWidth);
if (WinHeight==0)
{
SetMessage("Unable to create gadgets.");
return(FALSE);
};
ReqWindow = (struct Window *)OpenWindowTags( NULL,
WA_Left, WIN_LEFT+10,
WA_Top, WIN_TOP+5,
WA_Width, WinWidth,
WA_Height, WinHeight,
WA_IDCMP, GADGETUP|CLOSEWINDOW|BUTTONIDCMP|LISTVIEWIDCMP|REFRESHWINDOW,
WA_Activate, TRUE,
WA_DepthGadget, TRUE,
WA_DragBar, TRUE,
WA_RMBTrap, TRUE,
WA_Title, "Select Screen Style",
WA_SimpleRefresh, TRUE,
WA_PubScreen, Window->WScreen,
TAG_END
);
if (!ReqWindow) return(FALSE);
/** Set screen font **/
SetFont(ReqWindow->RPort, ScreenFont);
/** GadTools Init **/
AddGList(ReqWindow, SGadList, -1, -1, NULL);
RefreshGList(SGadList, ReqWindow, NULL, -1);
GT_RefreshWindow(ReqWindow, NULL);
KG=TRUE;
while (KG)
{
struct Gadget *Gad;
ULONG GadID;
Message=(struct IntuiMessage *)GT_GetIMsg(ReqWindow->UserPort);
if (Message==FALSE)
{
WaitPort(ReqWindow->UserPort);
continue;
};
Class=Message->Class;
Code=Message->Code;
Gad=Message->IAddress;
GadID=Gad->GadgetID;
GT_ReplyIMsg((struct IntuiMessage *)Message);
switch (Class)
{
case GADGETUP:
switch (GadID)
{
case SGID_NAME:
strcpy(NewPubScreenName, ((struct StringInfo *)Gad->SpecialInfo)->Buffer);
break;
case SGID_CANCEL:
KG=FALSE;
AllOkay=FALSE;
break;
case SGID_XDIM:
XDim=Code;
break;
case SGID_YDIM:
YDim=Code;
break;
case SGID_DEPTH:
Depth=Code;
break;
case SGID_OPEN:
KG=FALSE;
default:
break;
};
break;
case REFRESHWINDOW:
GT_BeginRefresh(ReqWindow);
GT_EndRefresh(ReqWindow, TRUE);
break;
default:
break;
};
};
NS->ViewModes=0;
if (XDim==0)
NS->ViewModes|=HIRES;
if (YDim==1)
NS->ViewModes|=LACE;
NS->Depth=Depth+1;
CloseWindow(ReqWindow);
return(AllOkay);
}
/**********************************************************************/
/* Open screen base routine */
/**********************************************************************/
void
OpenNewPublicScreen(void)
{
struct Screen *PubScreen;
struct ExtNewScreen NS;
setmem(&NS, sizeof(NS), 0);
if (GetScreenParameters(&NS)==FALSE)
return;
NS.Width = -1; // Set Non-Zero items
NS.Height = -1;
NS.BlockPen = 1;
NS.Type = CUSTOMSCREEN;
PubScreen=(struct Screen *)OpenScreenTagList(&NS, (struct TagItem *)&NewScreenTags[0]);
if (PubScreen==0)
SetMessage("Error opening screen.");
else
{
PubScreenStatus(PubScreen, 0L);
strcpy(CurPubScreenName, NewPubScreenName);
ClosePSXWindow();
ReleasePublicScreen();
FindPublicScreen();
OpenPSXWindow();
ScreenToFront(PubScreen);
SetMessage("Public screen opened.");
};
}
/**********************************************************************/
/* CLI-driven open public screen */
/**********************************************************************/
void
CLIOpenNewPublicScreen(char *Name, long HiresFlag, long LaceFlag, long *DepthPtr, long DefaultFlag)
{
struct Screen *PubScreen;
struct NewScreen NS;
setmem(&NS, sizeof(NS), 0);
NS.Depth = 2;
NS.Width = -1; // Set Non-Zero items
NS.Height = -1;
NS.BlockPen = 1;
NS.Type = CUSTOMSCREEN;
strcpy(NewPubScreenName, Name);
// Check args for HIRES, LORES, LACE, NOLACE, and DEPTH # arguments
if (HiresFlag) NS.ViewModes|=HIRES;
if (LaceFlag) NS.ViewModes|=LACE;
if (DepthPtr) NS.Depth=*DepthPtr;
PubScreen=(struct Screen *)OpenScreenTagList(&NS, (struct TagItem *)&NewScreenTags[0]);
if (PubScreen==0)
{
int ShowErr;
if (OpenErr>6) ShowErr=0;
else ShowErr=OpenErr;
printf("Public screen open error: %s (%d).\n", OpenErrors[ShowErr], OpenErr);
} else
{
PubScreenStatus(PubScreen, 0L);
if (DefaultFlag)
SetDefaultPubScreen(NewPubScreenName);
};
return;
}
/**********************************************************************/
/* Close a named public screen from the CLI */
/**********************************************************************/
void
CLIClosePublicScreen(char *Name)
{
struct Screen *ToClose;
long Result;
ToClose=LockPubScreen(Name);
if (ToClose==0)
{
printf("Unable to lock screen.\n");
return;
};
if ((ToClose->Flags&SCREENTYPE)==WBENCHSCREEN)
{
printf("Cannot close the Workbench screen!\n");
UnlockPubScreen(Name, ToClose);
return;
};
UnlockPubScreen(Name, ToClose);
Result=CloseScreen(ToClose);
if (Result==FALSE)
printf("Unable to close screen.\n");
else printf("Screen successfully closed.\n");
}