/**************************************************************************** * * Screen - Screen Configurator (almost useless example of FileRequest use) * * By Kevin Lee Clague * 408 Tortolla Way * San Jose, Ca 95033 * 408-258-9891 work 408-737-5481 * * Copyright (C) 1986. All rights reserved. * * This program is freely distributable as long as this copyright notice * is retained. It intended for personal, non-commercial use. * ***************************************************************************/ #include "screen.h" struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; struct Window *window = NULL; struct Screen *screen = NULL; struct IntuiMessage *message; struct RastPort *rp; struct ViewPort *vp; UBYTE QuitScreen = FALSE; extern struct Menu Menu; struct NewScreen NewScreen = { 0,0, /* start position */ 320, 200, 6, /* width, height, depth */ 0,1, /* detail pen, block pen */ NULL, /* HIRES, INTERLACE, SPRITES, DUAL, HAM */ CUSTOMSCREEN, /* screen type */ NULL, /* font to use */ (UBYTE *) "Screen Configurator", /* default title for screen */ NULL /* pointer to extra gadgets */ }; struct NewWindow NewWindow = { 0,0, /* start position */ 320,200, /* width, height */ 0,1, /* detail pen, block pen */ MENUPICK|GADGETDOWN|GADGETUP|REQCLEAR, /* IDCMP flags */ ACTIVATE|BORDERLESS|BACKDROP, /* window flags */ NULL, /* first gadget */ NULL, /* user checkmark */ NULL, /* window title */ NULL, /* pointer to screen */ NULL, /* pointer to superbitmap */ 0,0,320,200, /* sizing */ CUSTOMSCREEN /* type of screen */ }; UBYTE ScreenName[80] = "df0:"; BOOL FileRequest(); main () { if (OpenLibs() | OpenDisp()) CleanUp(); else { ConfScreen(); CleanUp(); } } /* main */ CleanUp() { CloseDisp(); CloseLibs(); } /* CleanUp */ OpenLibs() { IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0); if (IntuitionBase == NULL) { printf("Couldn't get Intuition\n"); return(100); } GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0); if (GfxBase == NULL) { printf("Couldn't get Graphics\n"); return(100); } return(0); } /* OpenLibs */ CloseLibs() { if (IntuitionBase != NULL) CloseLibrary(IntuitionBase); if (GfxBase != NULL) CloseLibrary(GfxBase); } /* CloseLibs */ OpenDisp() { screen = (struct Screen *) OpenScreen(&NewScreen); if (screen == NULL) { printf("Can't open new screen!\n"); exit(200); } NewWindow.Screen = screen; window = (struct Window *) OpenWindow(&NewWindow); if (window == NULL) { CloseScreen(screen); printf("Can't open backdrop window\n"); exit(201); } SetMenuStrip(window, &Menu); rp = window->RPort; vp = &screen->ViewPort; InitFNR(); return(0); } /* opendisp */ CloseDisp() { if (window) { ClearMenuStrip(window); CloseWindow(window); } if (screen) CloseScreen(screen); } /* CloseDisp */ ConfScreen() { ULONG class; USHORT code = 0; struct MenuItem *Item; while (QuitScreen == FALSE) { if ((message=(struct IntuiMessage *) GetMsg(window->UserPort)) == 0L) { Wait(1L<UserPort->mp_SigBit); continue; } class = message->Class; code = message->Code; ReplyMsg(message); if (class == MENUPICK) while (code != MENUNULL) { switch (MENUNUM(code)) { case PROJECTMENU: ScreenProject(code); break; case EDITMENU: EditScreen(code); break; } Item = ItemAddress(&Menu,code); code = Item->NextSelect; } } } /* ConfScreen */ ScreenProject(code) USHORT code; { switch (ITEMNUM(code)) { case LOADITEM: if (FileRequest("Load NewScreen","Load",&ScreenName,window)) printf("You picked %s\n",&ScreenName); else printf("You punted\n"); break; case SAVEITEM: if (FileRequest("Save NewScreen","Save",&ScreenName,window)) printf("You picked %s\n",&ScreenName); else printf("You punted\n"); break; case USEITEM: CloseDisp(); OpenDisp(); break; case QUITITEM: QuitScreen = TRUE; } } /* DoProjectScreen */ EditScreen(code) USHORT code; { switch (ITEMNUM(code)) { case DEPTHITEM: NewScreen.Depth = SUBNUM(code) + 1; AdjustScreenDepth(); break; case VIEWMODEITEM: EditScreenViewModes(code); break; } } /* EditScreen */ EditScreenViewModes(code) USHORT code; { struct MenuItem *Item; Item = ItemAddress((struct Menu *) &Menu,code); if (Item->Flags & TOGGLED11) Item->Flags ^= CHECKED; Item->Flags = Item->Flags ^ TOGGLED11; switch (SUBNUM(code)) { case HIRESSUB: if (!((NewScreen.ViewModes ^= HIRES) & HIRES)) NewScreen.Width = 320; else { NewScreen.Width = 640; AdjustScreenDepth(); } break; case INTERLACESUB: if ((NewScreen.ViewModes ^= INTERLACE) & INTERLACE) NewScreen.Height = 400; else NewScreen.Height = 200; break; case SPRITESSUB: NewScreen.ViewModes ^= SPRITES; break; case DUALPFSUB: NewScreen.ViewModes ^= DUALPF; break; case HAMSUB: NewScreen.ViewModes ^= HAM; } } /* EditScreenViewMode */ AdjustScreenDepth() { /* Adjust the Number of bit planes to a sane number */ USHORT code; struct MenuItem *Item; if (NewScreen.Depth > 4 && NewScreen.ViewModes & HIRES) { code = SHIFTMENU(EDITMENU)|SHIFTITEM(DEPTHITEM)|SHIFTSUB((NewScreen.Depth - 1)); Item = ItemAddress((struct Menu *) &Menu,code); Item->Flags ^= CHECKED; NewScreen.Depth = 4; code = SHIFTMENU(EDITMENU)|SHIFTITEM(DEPTHITEM)|SHIFTSUB((NewScreen.Depth - 1)); Item = ItemAddress((struct Menu *) &Menu,code); Item->Flags ^= CHECKED; } } /* AdjustScreenDepth */