kent@swrinde.nde.swri.edu (Kent D. Polk) (01/11/91)
Ok, here is a representation of a program that I am really having
trouble with. This program exhibits the same problem as the real one:
When the gadget window is removed so it can be redrawn, CloseWindow
hits low memory.
Warning: This will probably take your machine with it :^(
Compiled with Aztec 5.0d :
CFLAGS=-f8 -c2 -wonu
LFLAGS=+q
.c.o:
cc $(CFLAGS) -o $@ $*.c
play: play.o
ln $(LFLAGS) -o play play.o -lm8 -lc +l amiga.lib
If you can figure out what I am doing to get CloseWindow so confused, I sure
appreciate your response.
Kent Polk: Southwest Research Institute (512) 522-2882
Internet : kent@swrinde.nde.swri.edu
UUCP : $ {cs.utexas.edu, gatech!petro, sun!texsun}!swrinde!kent
------------------------------------- cut here ------------------------------
#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# play.c
# This archive created: Thu Jan 10 17:07:03 1991
export PATH; PATH=/bin:$PATH
echo shar: extracting "'play.c'" '(7257 characters)'
if test -f 'play.c'
then
echo shar: over-writing existing file "'play.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'play.c'
X/* Program : play.c
X * Purpose : Play waveforms.
X * kdp :
X * Thu 10-Jan-91 16:58:04
X *------------------------------------------------------------------------------
X * Generic Filter Exported functions:
X * int OpenFilter (int argc, char *argv[])
X * int InitFilter (struct event_header *e_h, int reinit)
X * int DoFilter (struct event *buf, long size, long flags)
X * ControlFilter ()
X * CloseFilter ()
X *------------------------------------------------------------------------------
X * ts=3
X */
X#include <functions.h>
X#include <clib/exec_protos.h>
X#include <clib/graphics_protos.h>
X#include <clib/intuition_protos.h>
X#include <clib/gadtools_protos.h>
X#include <graphics/gfxbase.h>
X#include <intuition/intuition.h>
X#include <intuition/gadgetclass.h>
X#include <libraries/gadtools.h>
X
X#define MAXCHANNELS 16
X
X/* Gadget defines of our choosing, to be used as GadgetID's: */
X#define AUDIOCHANS 4
X#define NUMGADS 4
X#define HEIGHT 256
X#define NOONE MAXCHANNELS
X
X/* Starting values for the gadgets */
X#define STCHN OFF
X#define STVOL 63
X#define STDUR 2000
X#define STREP 1
X
X/* Forward References */
Xstruct Gadget *CreateAllGadgets(struct Gadget **, void *, UWORD, UWORD);
X
X/***************** Window/Gadget Stuff ******************/
Xstruct GfxBase *GfxBase = NULL;
Xstruct IntuitionBase *IntuitionBase = NULL;
Xstruct Library *GadToolsBase = NULL;
Xstruct Screen *mysc = NULL;
Xstruct Gadget *glist = NULL;
Xstruct Window *mywin = NULL;
Xstruct TextAttr *SysDefTattr = NULL;
Xvoid *vi = NULL;
X
XUWORD topborder;
Xint numch = 1;
Xint w_HEIGHT = HEIGHT;
Xint opened = 0;
X
Xenum Gads {CHAN, VOL, DUR, REPT};
XSTRPTR GadLabels[] =
X {"Chn: ", "Vol: ", "Dur: ", "Rep: ", NULL};
X
Xenum Chans {CHAN1, CHAN2, CHAN3, CHAN4, OFF};
XSTRPTR ChanLabels[] = {"1", "2", "3", "4", "Off", NULL};
X
X/* Range for the sliders */
XWORD SliderMin[] = { 0, 0, 127, 1};
XWORD SliderMax[] = { 0, 63, 8000, 20};
XWORD SliderLevel[]= { STCHN, STVOL, STDUR, STREP};
X
X/* Current Gadget values */
XULONG GadVal [MAXCHANNELS] [NUMGADS];
X
X
X/******************************/
XCloseFilter()
X{
X closeinit();
X if (vi) FreeVisualInfo(vi);
X if (GadToolsBase) CloseLibrary(GadToolsBase);
X if (mysc) UnlockPubScreen(NULL, mysc);
X if (IntuitionBase)CloseLibrary(IntuitionBase);
X if (GfxBase) CloseLibrary(GfxBase);
X}
X
X/********** Exported Filter Functions *********/
X/* int OpenFilter (int argc, char *argv[]) */
Xmain(int argc, char *argv[])
X{
X register int i;
X
X if (!(GfxBase=(struct GfxBase *) OpenLibrary("graphics.library", 36L))) {
X puts("Requires V36 graphics.library");
X return(FALSE);
X }
X if (!(IntuitionBase = (struct IntuitionBase *)
X OpenLibrary("intuition.library", 36L))) {
X puts("Requires V36 intuition.library");
X return(FALSE);
X }
X if (!(GadToolsBase = OpenLibrary("gadtools.library", 36L))) {
X puts("Requires V36 gadtools.library");
X return(FALSE);
X }
X if (!(mysc = LockPubScreen(NULL))) {
X puts("Couldn't lock default public screen");
X return(FALSE);
X }
X if (!(vi = GetVisualInfo(mysc, TAG_DONE))) {
X puts("GetVisualInfo() failed");
X return(FALSE);
X }
X topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
X SysDefTattr = GfxBase->DefaultFont;
X SysDefTattr->ta_Style = 0;
X SysDefTattr->ta_Flags = 0;
X
X for (i=0;i<MAXCHANNELS;i++) {
X GadVal [i][CHAN] = STCHN;
X GadVal [i][VOL] = STVOL;
X GadVal [i][DUR] = STDUR;
X GadVal [i][REPT] = STREP;
X }
X
X MakeWindow();
X while (numch< 5) {
X ControlFilter();
X }
X CloseFilter();
X}
X
X
X/******************************/
XControlFilter ()
X{
X struct IntuiMessage *imsg;
X struct Gadget *gad;
X ULONG imsgClass;
X UWORD imsgCode;
X
X Wait (1 << mywin->UserPort->mp_SigBit);
X while (imsg = GT_GetIMsg(mywin->UserPort)) {
X imsgClass = imsg->Class;
X imsgCode = imsg->Code;
X
X /* Presuming a gadget, of course, but no harm... */
X gad = (struct Gadget *)imsg->IAddress;
X
X /* Use the toolkit message-replying function here... */
X GT_ReplyIMsg(imsg);
X switch (imsgClass) {
X case GADGETUP:
X GadVal[(gad->GadgetID/MAXCHANNELS)]
X [(gad->GadgetID%MAXCHANNELS)] = imsgCode;
X break;
X case MOUSEMOVE:
X GadVal[(gad->GadgetID/MAXCHANNELS)]
X [(gad->GadgetID%MAXCHANNELS)] = imsgCode;
X break;
X case CLOSEWINDOW:
X numch++;
X if (numch < 5) MakeWindow();
X break;
X }
X }
X}
X
X
X/******************************/
Xint MakeWindow()
X{
X int scale_height = 0;
X
X if (opened) closeinit();
X opened = TRUE;
X
X /*** Calculate how many plots/control sets in the window ***/
X /* For this example, numch had better be less than 5 :^) */
X if (numch<=1) scale_height = 0;
X else if (numch<= 2) scale_height = 1;
X else if (numch<= 4) scale_height = 2;
X else if (numch<= 8) scale_height = 3;
X else if (numch<=16) scale_height = 4;
X w_HEIGHT = HEIGHT>>scale_height;
X
X if (!CreateAllGadgets(&glist, vi, topborder, numch)) {
X puts("CreateAllGadgets() failed");
X return (FALSE);
X }
X
X /*** Create the Gadget Window ***/
X if (!(mywin = OpenWindowTags(NULL,
X WA_Left, 0,
X WA_Width, 190,
X WA_InnerHeight, w_HEIGHT * numch,
X
X WA_DragBar, TRUE,
X WA_Activate, TRUE,
X WA_DepthGadget, TRUE,
X WA_CloseGadget, TRUE,
X WA_SmartRefresh, TRUE, /* WA_PubScreenFallBack, TRUE, */
X
X WA_IDCMP, CLOSEWINDOW|SLIDERIDCMP|CYCLEIDCMP,
X WA_Title, "Play",
X TAG_DONE)))
X {
X puts("OpenWindow() failed");
X return (FALSE);
X }
X
X/* Add gadgets, refresh them, and call the toolkit refresh */
X AddGList(mywin, glist, ((UWORD) -1), ((UWORD) -1), NULL);
X RefreshGList(glist, mywin, NULL, ((UWORD) -1));
X GT_RefreshWindow(mywin, NULL);
X
X return (TRUE);
X}
X
X
X/******************************/
Xstruct Gadget *CreateAllGadgets(
X struct Gadget **glistptr, void *vi, UWORD topborder, UWORD num)
X/* Here is where all the initialization and creation of toolkit gadgets
X * take place. This function requires a pointer to a NULL-initialized
X * gadget list pointer. It returns a pointer to the last created gadget,
X * which can be checked for success/failure.
X */
X{
X register int i, j;
X struct NewGadget ng;
X struct Gadget *gad = NULL;
X
X /* We obligingly perform the following operation, required of
X any program that uses the toolkit. It gives the toolkit a
X place to stuff context data: */
X
X gad = CreateContext(glistptr);
X
X ng.ng_VisualInfo = vi;
X ng.ng_LeftEdge = 85;
X ng.ng_Height = 11;
X ng.ng_Width = 100;
X ng.ng_Flags = PLACETEXT_LEFT;
X ng.ng_TextAttr = &SysDefTattr;
X
X for (j=0;j<num;j++) {
X ng.ng_TopEdge = topborder + w_HEIGHT*j + 5*j +1;
X ng.ng_GadgetText = GadLabels[0];
X ng.ng_GadgetID = j * MAXCHANNELS;
X gad = CreateGadget(CYCLE_KIND, gad, &ng,
X GTCY_Labels, ChanLabels,
X GTCY_Active, GadVal [j][CHAN],
X TAG_DONE);
X
X for (i=1;i<NUMGADS;i++) {
X ng.ng_TopEdge = ng.ng_TopEdge + 12;
X ng.ng_GadgetText = GadLabels[i];
X ng.ng_GadgetID = j * MAXCHANNELS + i;
X gad = CreateGadget(SLIDER_KIND, gad, &ng,
X GTSL_Min, SliderMin[i],
X GTSL_Max, SliderMax[i],
X GTSL_Level, GadVal [j][i],
X GTSL_LevelFormat, "%4ld",
X GTSL_MaxLevelLen, 4,
X TAG_DONE);
X }
X }
X return(gad);
X}
X
X
X/******************************/
Xcloseinit()
X{
X if (glist) {
X puts("Freeing glist");
X FreeGadgets(glist);
X glist = NULL;
X }
X if (mywin) {
X puts("Closing window");
X CloseWindow(mywin); /* Here is where I see evidence of my problems */
X puts("Done Closing window");
X mywin = NULL;
X }
X}
SHAR_EOF
if test 7257 -ne "`wc -c 'play.c'`"
then
echo shar: error transmitting "'play.c'" '(should have been 7257 characters)'
fi
# End of shell archive
exit 0