#include "WBTRIS.h" #define GD_SLIDER 0 #define GD_STRING 1 #define GD_CYCLE 2 #define GD_CHECK 3 #define GD_SLIDER2 4 #define GD_BUTTON1 5 #define GD_BUTTON2 6 #define GDX_SLIDER 0 #define GDX_STRING 1 #define GDX_CYCLE 2 #define GDX_CHECK 3 #define GDX_SLIDER2 4 #define GDX_BUTTON1 5 #define GDX_BUTTON2 6 #define Options_CNT 7 struct Window *OptionsWnd = NULL; struct Gadget *OptionsGList = NULL; struct Gadget *OptionsGadgets[7]; UWORD OptionsLeft = 119; UWORD OptionsTop = 125; UWORD OptionsWidth; UWORD OptionsHeight; UBYTE *OptionsWdt = (UBYTE *)"WBTRIS Options"; struct TextAttr *Font = NULL; struct TextAttr Attr; UWORD FontX, FontY; UWORD OffX, OffY; extern struct Screen *myscreen; extern APTR VisualInfo; extern struct GfxBase *GfxBase; extern struct TextAttr helvetica13; extern struct TextAttr topaz8; extern BOOL UseLace; extern char Name[25]; extern BOOL lockname; extern BOOL nextteil; extern int LevelOffset; extern int pulldownticks; struct EasyStruct myES = { sizeof(struct EasyStruct), 0, "WBTRIS INFO", "%s Version %s\n\nŠ 1993 by \n%s\n\nThis game is 'Cardware'!\nPlease read the manual for explanation.", "OK", }; UBYTE *CYCLE0Labels[] = { (UBYTE *)"Lock Name", (UBYTE *)"Ask Name", NULL }; UWORD OptionsGTypes[] = { SLIDER_KIND, STRING_KIND, CYCLE_KIND, CHECKBOX_KIND, SLIDER_KIND, BUTTON_KIND, BUTTON_KIND }; struct NewGadget OptionsNGad[] = { 33, 25, 200, 17, (UBYTE *)"Startlevel", NULL, GD_SLIDER, PLACETEXT_RIGHT, NULL, NULL, 33, 85, 200, 17, (UBYTE *)"Name", NULL, GD_STRING, PLACETEXT_RIGHT, NULL, NULL, 33, 110, 111, 17, (UBYTE *)"Nameoptions", NULL, GD_CYCLE, PLACETEXT_RIGHT, NULL, NULL, 133, 145, 26, 17, (UBYTE *)"Show next object", NULL, GD_CHECK, PLACETEXT_RIGHT ,NULL, NULL, 33, 50, 200, 17, (UBYTE *)"Pulldownspeed", NULL, GD_SLIDER2, PLACETEXT_RIGHT ,NULL, NULL, 33, 145, 71, 17, (UBYTE *)"Info", NULL, GD_BUTTON1, PLACETEXT_IN ,NULL, NULL, 33, 170, 71, 17, (UBYTE *)"OK", NULL, GD_BUTTON2, PLACETEXT_IN ,NULL, NULL }; ULONG OptionsGTags[] = { (GTSL_Max), 20, (GTSL_MaxLevelLen), 2, (GTSL_LevelFormat), (ULONG)"%2ld", (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE), (GTST_MaxChars), 20, (TAG_DONE), (GTCY_Labels), (ULONG)&CYCLE0Labels[0], (TAG_DONE), (GTCB_Checked), TRUE, (TAG_DONE), (GTSL_Max), 20, (GTSL_Level), 20, (GTSL_MaxLevelLen), 2, (GTSL_LevelFormat), (ULONG)"%2ld", (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE), (GA_Disabled), FALSE, (TAG_DONE), (TAG_DONE) }; int OpenOptionsWindow(void) { struct NewGadget ng; struct Gadget *g = NULL; UWORD lc, tc; UWORD wleft = OptionsLeft, wtop = OptionsTop; UWORD ww, wh = 195; if (UseLace) ww = 337; else ww= 367; if ( ! ( g = CreateContext( &OptionsGList ))) return( 1L ); for( lc = 0, tc = 0; lc < Options_CNT; lc++ ) { CopyMem((char * )&OptionsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget )); ng.ng_VisualInfo = VisualInfo; if (UseLace) ng.ng_TextAttr = &helvetica13; else ng.ng_TextAttr = &topaz8; ng.ng_LeftEdge = ng.ng_LeftEdge; ng.ng_TopEdge = ng.ng_TopEdge+(myscreen->Font->ta_YSize)-10; ng.ng_Width = ng.ng_Width; ng.ng_Height = ng.ng_Height; OptionsGadgets[ lc ] = g = CreateGadgetA((ULONG)OptionsGTypes[ lc ], g, &ng, ( struct TagItem * )&OptionsGTags[ tc ] ); while( OptionsGTags[ tc ] ) tc += 2; tc++; if ( NOT g ) return( 2L ); } if ( ! ( OptionsWnd = OpenWindowTags( NULL, WA_Left, wleft, WA_Top, wtop+(myscreen->Font->ta_YSize)+3, WA_Width, ww, WA_Height, wh+(myscreen->Font->ta_YSize), WA_IDCMP, SLIDERIDCMP|STRINGIDCMP|CYCLEIDCMP|CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW | IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY, WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_SIMPLE_REFRESH|WFLG_ACTIVATE, WA_Gadgets, OptionsGList, WA_Title, OptionsWdt, TAG_DONE ))) return( 4L ); GT_SetGadgetAttrs(OptionsGadgets[GD_SLIDER], OptionsWnd, NULL, GTSL_Level, LevelOffset, TAG_END); GT_SetGadgetAttrs(OptionsGadgets[GD_STRING], OptionsWnd, NULL, GTST_String, Name, TAG_END); GT_SetGadgetAttrs(OptionsGadgets[GD_SLIDER2], OptionsWnd, NULL, GTSL_Level, 20-pulldownticks*2, TAG_END); GT_SetGadgetAttrs(OptionsGadgets[GD_CHECK], OptionsWnd, NULL, GTCB_Checked, nextteil, TAG_END); GT_SetGadgetAttrs(OptionsGadgets[GD_CYCLE], OptionsWnd, NULL, GTCY_Active, !lockname, TAG_END); GT_RefreshWindow( OptionsWnd, NULL ); return( 0L ); } void CloseOptionsWindow( void ) { if (OptionsWnd) { CloseWindow( OptionsWnd ); OptionsWnd = NULL; } if (OptionsGList) { FreeGadgets( OptionsGList ); OptionsGList = NULL; } } /* ** Function to handle a GADGETUP or GADGETDOWN event. For GadTools gadgets, ** it is possible to use this function to handle MOUSEMOVEs as well, with ** little or no work. */ BOOL handleGadgetEvent(struct Window *win, struct Gadget *gad, UWORD code, struct Gadget *my_gads[]) { switch (gad->GadgetID) { case GD_SLIDER: LevelOffset = code; break; case GD_SLIDER2: pulldownticks = (20-code)/2; break; case GD_STRING: strcpy(Name, ((struct StringInfo *)gad->SpecialInfo)->Buffer); break; case GD_BUTTON1: EasyRequest(NULL, &myES, NULL, PROG_NAME, VERSION, AUTHOR); break; case GD_BUTTON2: return(TRUE); break; case GD_CYCLE: if (code == 0) lockname = TRUE; else lockname = FALSE; break; case GD_CHECK: nextteil = !nextteil; break; } return(FALSE); } /* ** Standard message handling loop with GadTools message handling functions ** used (GT_GetIMsg() and GT_ReplyIMsg()). */ VOID process_window_events(struct Window *mywin, struct Gadget *my_gads[]) { struct IntuiMessage *imsg = NULL; ULONG imsgClass; UWORD imsgCode; struct Gadget *gad = NULL; BOOL terminated = FALSE; while (!terminated) { Wait (1 << mywin->UserPort->mp_SigBit); while ((!terminated) && (imsg = GT_GetIMsg(mywin->UserPort))) { gad = (struct Gadget *)imsg->IAddress; imsgClass = imsg->Class; imsgCode = imsg->Code; GT_ReplyIMsg(imsg); switch (imsgClass) { case IDCMP_ACTIVEWINDOW: ActivateGadget(OptionsGadgets[1], mywin, NULL); break; case IDCMP_GADGETDOWN: case IDCMP_GADGETUP: terminated = handleGadgetEvent(mywin, gad, imsgCode, my_gads); break; case IDCMP_RAWKEY: if (imsg->Code == '\x45') terminated = TRUE; break; case IDCMP_CLOSEWINDOW: terminated = TRUE; break; case IDCMP_REFRESHWINDOW: GT_BeginRefresh(mywin); GT_EndRefresh(mywin, TRUE); break; } } } } /* ** Open all libraries and run. Clean up when finished or on error.. */ void OpenOptions(WORD winxpos, WORD winypos) { OptionsLeft = winxpos; OptionsTop = winypos; if (UseLace) OptionsWidth = 313; else OptionsWidth = 363; if (lockname == FALSE) strcpy(Name, ""); if (OpenOptionsWindow() == 0L) { process_window_events(OptionsWnd, OptionsGadgets); CloseOptionsWindow(); } }