crunch@well.UUCP (John Draper) (11/30/86)
/*========================================================================= addgad.c - Add gadgets and allocate the new pointers into a global array called "gads[]". It also increments "nextgad". addgad() - Adds the gadget to the array of gadget pointers Changes: 11/17/86 - RRL fixed some problems with proportional gadgets =========================================================================*/ /* The usual header files to be inserted later */ #include <intuition/intuition.h> #include <libraries/dosextens.h> #include <graphics/gfxbase.h> #include <graphics/gfx.h> #include <graphics/display.h> #include <exec/memory.h> #include <workbench/workbench.h> #include <workbench/startup.h> #include <devices/narrator.h> #include <devices/audio.h> #include <libraries/translator.h> #include "gad.h" /*================== external functions ===================*/ extern struct Gadget testgad; extern struct Gadget *SelectedGadget; extern struct PropInfo Prop; extern struct StringInfo String; extern struct Window *w; extern struct RastPort *rp; extern USHORT oldtype; extern struct Gadget *gads[]; extern char gadimage[MAX_PROPINFOS][NAM_SIZ]; extern char selectimage[MAX_PROPINFOS][NAM_SIZ]; extern struct PropInfo *props[]; extern struct StringInfo *strings[]; extern APTR AllocRemember(); extern struct Remember *rememberBase; /*==================== external vars ======================*/ extern int nextgad; extern int curgad; extern int pflag; /* holds propinfo flags from menu selection */ /*=================== global vars ==================*/ char teststr[] = "12345678"; /*-------- Add gadget ------*/ addgad() { /* Allocates memory into the array */ if ((gads[nextgad] = (struct Gadget *)AllocRemember(rememberBase, (long)sizeof(struct Gadget), MEMF_PUBLIC | MEMF_CLEAR)) == NULL) kprintf("Cannot allocate gadget at index %d", nextgad); /* Makes curgad = nextgad */ curgad = nextgad; /* Bumps up the "nextgad" index pointer */ nextgad++; /* Deal with the particular gadget type */ switch(testgad.GadgetType) { case BOOLGADGET: add_bool_gad(); makeborder(); break; case STRGADGET : add_str_gad(); makeborder(); break; case PROPGADGET: add_prop_gad(); break; } *gads[curgad] = testgad; /* copy the structure */ } /*========================================================================== Add the StringInfo structure and buffer to the current gadget. If the gadget is already another type of gadget, De-Allocate the memory used by the gadget such as the PropInfo structure and other attached data structures =========================================================================*/ add_str_gad() { struct StringInfo *si; if ((testgad.SpecialInfo = AllocRemember(rememberBase, (long)sizeof(struct StringInfo), MEMF_PUBLIC | MEMF_CLEAR)) == NULL) kprintf("Stringinfo allocation failed in 'add_str_gad'\n"); si = (struct StringInfo *)testgad.SpecialInfo; /* Allocate text buffer */ if ((si->Buffer = (UBYTE *) AllocRemember(rememberBase,BUFSIZE, MEMF_PUBLIC | MEMF_CLEAR)) == NULL) kprintf("Buffer Alloc failed at 'add_str_gad'\n"); /* Init the SpecialInfo field and the Buffer pointer */ strcpy(si->Buffer, teststr); si->MaxChars = BUFSIZE; si->NumChars = 8; } /*========================================================================= add_prop_gad - Adds a proportional type gadget. Allocates PropInfo structure. ========================================================================*/ add_prop_gad() { long flags; struct PropInfo *prop; /* Allocate 2 image structures - Add 2 more tables in globals */ /* Nope - one will do. RRL */ if ((testgad.GadgetRender = AllocRemember(rememberBase, (long)sizeof(struct Image), MEMF_CLEAR | MEMF_PUBLIC)) == NULL) kprintf("No image allocated\n"); /**************************************************** Commented out by RRL - This is not needed for an AUTOKNOB propgad and will be generated automatically if a custom image is created. if ((testgad.SelectRender = AllocRemember(rememberBase,(long)sizeof(struct Image), MEMF_CLEAR | MEMF_PUBLIC)) == NULL) kprintf("No select image allocated\n"); ****************************************************/ testgad.SelectRender = NULL; /*rrl*/ /* Allocate a PropInfo structure */ if ((testgad.SpecialInfo = AllocRemember(rememberBase,(long)sizeof(struct PropInfo), MEMF_CLEAR | MEMF_PUBLIC)) == NULL) kprintf("No Propinfo Allocated\n"); /* ### We set the "UserData" flag fields to a special type */ flags = KNOB_IMAGE_TYPE; /* this is NEW RRL */ testgad.UserData = (APTR)flags; /*************************************************** Commented out by RRL. These flags are NOT set for a propgad unless a true custom image has been created. AUTOKNOB handles its own image flags. testgad.Flags = GADGHIMAGE | GADGIMAGE; ****************************************************/ /* Fill in the PropInfo structure */ prop = (struct PropInfo *)testgad.SpecialInfo; if (prop != NULL) { /* Set Both height and width for all propgads - RRL */ prop->HorizBody = 0x1000; prop->HorizPot = 0x8000; prop->VertBody = 0x1000; prop->VertPot = 0x8000; prop->Flags = pflag; /* the global set by menu selections */ } } add_bool_gad() { } /*======================================================================== makeborder - Make a border around boolean and string gadget. User can always remove them later if they don't want it =========================================================================*/ makeborder() { struct Border *bord; /* Pointer to a border structure */ SHORT *pairs; int i; long flags; /* flags that go into UserData field */ /* ###Allocate memory for the border and the "pairs" */ if ((bord = (struct Border *)AllocRemember(rememberBase, (long)sizeof(struct Border), MEMF_PUBLIC | MEMF_CLEAR)) == NULL) kprintf("Border Allocation failed in 'makeborder'\n"); /* AllocMemory for the Border Pairs */ if ((pairs = (SHORT *) AllocRemember(rememberBase, 20L, MEMF_PUBLIC | MEMF_CLEAR)) == NULL ) kprintf("No pairs allocated in makeborder\n"); /* Calculation of the border pairs */ pairs[2] = testgad.Width; pairs[4] = testgad.Width; pairs[5] = testgad.Height; pairs[7] = testgad.Height; /* Init the Border structure */ bord->LeftEdge = -1; bord->TopEdge = -1; bord->Count = 5; bord->FrontPen = 1; bord->BackPen = 3; bord->XY = pairs; bord->DrawMode = JAM1; /* Put Border pointer into BOTH Gadget and Select render */ /* Well.. not any more - if the gadget had some alternate */ /* border this might be worthwhile, but since they are the*/ /* same it just caused problems in freeing memory. RRL */ testgad.GadgetRender = (APTR)bord; testgad.SelectRender = NULL; flags = GAD_BORDER_TYPE; testgad.UserData = (APTR)flags; }