/************************************************************************** * F U N W I T H G A D G E T S * by John Draper ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*************************************************************************** IMPORTANT CONSTANTS ***************************************************************************/ unsigned int mask = 0; /* ONE BIT SET FOR EACH OPEN */ #define INTUITION 0x00000001 #define GRAPHICS 0x00000002 #define SCREEN 0x00000004 #define WINDOW 0x00000008 #define COLORMAP 0x00000010 #define MATH 0x00000020 #define MATHTRANS 0x00000040 #define NL 0 /*************************************************************************** * I N T U I T I O N G L O B A L V A R S ***************************************************************************/ struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct IntuiMessage *message; struct RastPort *rp; struct Window *w; /*************************************************************************** G A D G E T S L I V E H E R E ***************************************************************************/ /* Image for a custom proportional gadget */ UWORD custimage[] = { 0x0000, 0x0000, 0x0180, 0x0660, 0x1818, 0x2004, 0x4002, 0x4002, 0x4002, 0x4002, 0x2004, 0x1818, 0x0660, 0x0180, 0x0000, 0x0000 }; struct Image cus_image = { 0, 0, /* LeftEdge, TopEdge */ 16, 16, 1, /* Width, Height, Depth */ &custimage[0], /* Pointer to bit image */ 1, 0, /* PlanePick, Planeonoff */ NULL /* No other images */ }; struct IntuiText rtxt = {2,2,JAM1,-9,2,NL,(UBYTE *)"R",NL}; struct IntuiText gtxt = {2,2,JAM1,-9,2,NL,(UBYTE *)"G",NL}; struct IntuiText btxt = {2,2,JAM1,-9,2,NL,(UBYTE *)"B",NL}; struct IntuiText ntext = {2,2,JAM1, 10, -11, NL, (UBYTE *) "Number entry", NL}; struct IntuiText cus_text = {2,2,JAM1, 2, -11, NL, (UBYTE *) "Custom Prop Gadget", NL}; struct IntuiText cus1_txt = {2,2,JAM1, 161, 23, NL, (UBYTE *) "Vert side", &cus_text }; struct IntuiText cus2_txt = {2,2,JAM1, 20, 50, NL, (UBYTE *) "Hor side", &cus1_txt }; struct IntuiText bool_str = {2,2,JAM1, 4, 1, NL, (UBYTE *) "START", NL }; struct IntuiText bool2_str = {2,2,JAM1, 9, 1, NL, (UBYTE *) "STOP", NL }; struct Image r_img, g_img, b_img; struct PropInfo r_prop,g_prop,b_prop; struct PropInfo cust_prop = { FREEHORIZ | FREEVERT, /* Want knob to go both vert and horiz */ 0x8000, 0x8000, /* Want knob to be centered initially */ 0x800, 0x800, /* Smallest increment the knob can move */ 150, 50, /* cWidth, cHeight - Container w & h */ 1, 1, /* HPosres, VPotres - Pot increments */ 0, 0 /* Container borders */ }; #define STRINGSIZE 512 UBYTE DefString[STRINGSIZE] = "000000000000"; UBYTE Undo [STRINGSIZE]; struct StringInfo TexString = { DefString, /* Buffer - Pointer to Buffer */ Undo, /* UndoBuffer - Undo buf ptr */ 0, /* BufferPos - Init Chr Posn */ STRINGSIZE, /* MaxChars - Max number of Chars */ 0, 0, /* DispPos - First Disp Chr */ 13, /* NumChars - Number of Characters */ 0, 0, 0, /* Posn Vars calc by Intuition */ NULL, /* No pointer to Rasport */ 0, /* Longint Value */ NULL /* No pointer to alt Keyboard */ }; USHORT Pairs[] = { -1, -1, /* Information describing the */ 160, -1, /* border around the gadget */ 160, 9, -1, 9, -1, -1 }; USHORT Pairs1[] = { 0, 0, 51, 0, 51, 11, 0, 11, 0, 0 }; #define NUM_PAIRS 5 /* There are Four pairs above */ struct Border StrBorder = { -1, -1, /* LeftEdge, TopEdge */ 1, 0, JAM1, /* FrontPen, BackPen DrawMode */ NUM_PAIRS, /* Number of XY Pairs */ (APTR)&Pairs, /* XY, Pointer to XY Pairs */ NULL /* No more borders */ }; struct Border butt_border = { -1, -1, 1, 0, JAM1, NUM_PAIRS, (APTR)&Pairs1, NULL }; #define BLUE_GADGET 0 struct Gadget blue_gad = { NL, 17,112, 150,11, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, PROPGADGET,(APTR)&b_img, NL, &btxt, NL,(APTR)&b_prop, BLUE_GADGET, NL }; #define GREEN_GADGET 1 /* Another personal ID */ struct Gadget green_gad = { &blue_gad, 17,97, 120,11, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, PROPGADGET,(APTR)&g_img, NL, >xt, NL,(APTR)&g_prop, GREEN_GADGET, NL }; #define RED_GADGET 2 /* And yet another gadget */ struct Gadget red_gad = { &green_gad, 17,82, 90,11, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, PROPGADGET,(APTR)&r_img, NL, &rtxt, NL,(APTR)&r_prop, RED_GADGET, NL }; #define TEX_GAD 3 struct Gadget tex_gad = { &red_gad, 30, 30, 150,11, GADGHCOMP, STRINGCENTER | LONGINT | RELVERIFY, STRGADGET, (APTR)&StrBorder, NL, &ntext, NL, (APTR)&TexString, TEX_GAD, NL }; #define CUST_KNOB 4 struct Gadget cust_knob = { &tex_gad, 17, 140, 150, 50, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, PROPGADGET, (APTR)&cus_image, NL, &cus2_txt, NL, (APTR)&cust_prop, CUST_KNOB, NL }; #define BOOL_GAD1 5 struct Gadget bool_gad = { &cust_knob, 30, 46, 50, 10, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, BOOLGADGET, (APTR)&butt_border, NL, &bool_str, NL, NL, BOOL_GAD1, NL }; #define BOOL_GAD2 6 struct Gadget bool2_gad = { &bool_gad, 30, 60, 50, 10, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, BOOLGADGET, (APTR)&butt_border, NL, &bool2_str, NL, NL, BOOL_GAD2, NL }; /*************************************************************************** * N E W W I N D O W S T R U C T U R E ***************************************************************************/ struct NewWindow nw = { 0, 0, /* Start position */ 320, 200, /* width, height, */ 0, 1, /* detail, block pens */ CLOSEWINDOW /* IDCMP flags */ | REFRESHWINDOW | MOUSEBUTTONS | MOUSEMOVE | GADGETDOWN | GADGETUP, /* Regular flags for gadgets and such */ WINDOWDEPTH | WINDOWSIZING | WINDOWDRAG | REPORTMOUSE | WINDOWCLOSE | SMART_REFRESH, &bool2_gad, /* First gadget in list */ NULL, /* User checkmark */ "Fun with Gadgets", /* Window Title */ NULL, /* Pointer to screen (Set later) */ NULL, /* Pointer to superbitmap */ 0, 0, 320, 186, /* Ignored because not sizeable */ WBENCHSCREEN, /* Using the Workbench screen */ }; /*************************************************************************** M A I N P R O G R A M M O D U L E ***************************************************************************/ main() { ULONG MessageClass; USHORT code; int good_boy = FALSE; /* Be a "Bad boy", and hog the system **/ /*************************************************************************** Must Initialize the Proportional "Specialinfo" before opening up the window. Init Flags, and position. ***************************************************************************/ r_prop.Flags = g_prop.Flags = b_prop.Flags = FREEHORIZ | AUTOKNOB; r_prop.HorizBody = g_prop.HorizBody = b_prop.HorizBody = 0x1000; r_prop.HorizPot = g_prop.HorizPot = b_prop.HorizPot = 0x8000; /*************************************************************************** Read in the ligraries, and set each "read" mask bit. ***************************************************************************/ if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0))) { printf("no graphics library!!!\n"); close_things(); exit(1); } mask |= GRAPHICS; if(!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0))) { printf("no intuition here!!\n"); close_things(); exit(2); } mask |= INTUITION; /*************************************************************************** OPEN UP THE WINDOW ON TOP OF WORKBENCH SCREEN ***************************************************************************/ if (!(w = (struct Window *)OpenWindow(&nw) )) { printf("could not open the window\n"); close_things(); exit(3); } mask |= WINDOW; /*************************************************************************** INITIALIZATION BEFORE ENTERING MAIN LOOP ***************************************************************************/ rp = w->RPort; RefreshGadgets(&red_gad,w,NULL); /*************************************************************************** MAIN EVENT LOOP ***************************************************************************/ for (;;) { if (message = (struct IntuiMessage *)GetMsg(w->UserPort)) { MessageClass = message->Class; code = message->Code; ReplyMsg(message); switch (MessageClass) { case GADGETUP : case GADGETDOWN : do_gadgets(message, w); break; case CLOSEWINDOW : close_things(); exit(0); break; case MOUSEBUTTONS: break; } /* Case */ } /* if */ } /* for */ } /* main */ /*************************************************************************** HANDLE THE GADGETS ***************************************************************************/ do_gadgets (mes, win) struct IntuiMessage *mes; struct Window *win; { struct Gadget *igad; /* Ptr to gadget that Intuition found */ int gadgid; /* ID Code identifying which gadget */ ULONG val; igad = (struct Gadget *) mes->IAddress; /* Ptr to a gadget */ gadgid = igad->GadgetID; /* My own personal code for this gad */ val = (ULONG)TexString.LongInt; switch(gadgid) { case GREEN_GADGET: break; case BLUE_GADGET : break; case TEX_GAD : printf("got here ...\n"); printf("val = %ld\n", val); break; } } /*************************************************************************** CLOSE EVERYTHING DOWN ***************************************************************************/ close_things() { if (mask & WINDOW) CloseWindow(w); if (mask & GRAPHICS) CloseLibrary(GfxBase); (void) OpenWorkBench(); if (mask & INTUITION) CloseLibrary(IntuitionBase); }