/* ************************************************************************* The modified code in the appended section was extracted from MENUS, REQUESTORS, AND GADGETS BY John T. Draper A service from the Programmers Network on the WELL in Sausalito. Article 408@well and 409@well December 31, 1985 Permission to post this on other networks is granted provided the source of this information is included. The programmers network is a non-profit network exchange of programming information. For more information, mail your requests to: WELL: crunch orsomewellprogrammerwhosequipmenthasnotbeenseized BIX: crunch orsomewellprogrammerwhosequipmenthasnotbeenseized USENET: ihnp4!ptsfa!well!crunch orsomewellprogrammerwhosequipmenthasnotbeenseized DELPHI: crunch orsomewellprogrammerwhosequipmenthasnotbeenseized ************************************************************************* */ /* * Hacked to make autoEnquirer, a positionable position-tracking requester * * Date: July 11, 1987 * Barbarian: Howard Hull * Implements: custom requester code from John Draper's gadget tutorial * + blood, sweat, tears, & additions to the explative list... */ /* ********************************************************** * * :::::::::::::::::::::::::::::::::::::::::::::::::::::::: * :: When you're a tiger trainer, it's a bad deal when :: * :: the tiger gets your attention by putting a paw in :: * :: your face. This is not only because tiger paws :: * :: don't smell very good - it's also because you'll :: * :: shortly begin to wonder what the rest of the tiger :: * :: is up to. With that paw in your face, you can't :: * :: determine what you need to know to decide on what :: * :: ought to be done next. With tigers, it's much the :: * :: same as it is with anything else: As Will Rogers :: * :: once said, "It ain't what we know that gets us in :: * :: trouble. It's what we know that ain't so..." :: * :::::::::::::::::::::::::::::::::::::::::::::::::::::::: * * * I wrote this thing up because I got tired of moving the requester * out of the way so I could see what was going on, and that in turn * so that I could then decide what to do with the requester. As all * of you by now know, and as is evident in the net programs, if you * make an AutoRequest, you get a requester at 0,0 with no programmable * options to reposition it anywhere that you'd rather it be put. (Correct?) * * Given that the Gadget Editor Boys have not yet released their product * (I think they are waiting for John Draper's life to get a little less * complicated) I thought I'd put this out in the mean time. As I'm very * much a C programming novice, I'm putting this up for some presumably * critical guidance. Rather than being an example of proper code, I'm * certain it contains a number of spectacular boo boos - maybe including * some assumptions that would make the whole program completely unnecessary. * Just as John said, requesters are a pain in the *ss. But without a * gadget editor, this is the sort of thing that has to be done... * */ #include "atv.h" extern short wleftedge; /* These are the variables in which we */ extern short wtopedge; /* put the first received positions. */ extern struct IntuiText negtext; /* Let the user keep the button names in */ extern struct IntuiText postext; /* in his stuff, like for AutoRequest */ struct Requester req; /* custom requester structure */ /* * Following is the (empty) Requester stucture template. It contains a * pointer to the host window through the RWindow structure. (The empty * Requester structure was defined just above this comment. It is not * declared, since it gets wiped clean by the InitRequester() call in the * user's program. That call could be moved into this section if the user * didn't have to follow through by initializing the structure before it * can be used. */ /* struct Requester req You'll notice this is info, and not code, as it is commented out { struct Requester *OlderRequest; short LeftEdge, TopEdge; <-- these are relative to RWindow, so we don't short Width, Height; need to adjust them when window is moved. short RelLeft, RelTop; struct Gadget *ReqGadget; struct Border *ReqBorder; struct IntuiText *ReqText; unsigned short Flags; unsigned char BackFill; struct Layer *ReqLayer; unsigned char ReqPad1[32]; struct BitMap *ImageBMap; struct Window *RWindow; <-- this is the link to the window in which the unsigned char ReqPad2[36]; requester background is plastered. }; */ /* * Following is the RWindow structure containing the LeftEdge - TopEdge * definition. We wish to keep track of these two numbers once they are * initialized. This structure is housed in the user's section. */ /* struct Window *RWindow Again, notice that this is a comment { struct Window *NextWindow; short LeftEdge, TopEdge; <-- NULL when uninitialized, but gets set for us. short Width, Height; short MouseY, MouseX; short MinWidth, MinHeight; unsigned short MaxWidth, MaxHeight; unsigned long Flags; struct Menu *MenuStrip; unsigned char *Title; struct Requester *FirstRequest; struct Requester *DMRequest; short ReqCount; struct Screen *WScreen; struct RastPort *RPort; unsigned char BorderLeft, BorderTop, BorderRight, BorderBottom; struct RastPort *BorderRPort; struct Gadget *FirstGadget; struct Window *Parent, *Descendant; ushort *Pointer; short PtrHeight; short PtrWidth; short XOffset, YOffset; unsigned long IDCMPFlags; struct MsgPort *UserPort, *WindowPort; struct IntuiMessage *MessageKey; unsigned char DetailPen, BlockPen; struct Image *CheckMark; unsigned char *ScreenTitle; short GZZMouseX; short GZZMouseY; short GZZWidth; short GZZHeight; unsigned char *ExtData; char *UserData; struct Layer *WLayer; struct TextFont *IFont; }; */ short autoEnquire(); /*************************************************************************** * I M P O R T A N T C O N S T A N T S ***************************************************************************/ #define NL 0 #define REDP 3 #define BLKP 2 #define WHTP 1 #define BLUP 0 /*************************************************************************** CUSTOM REQUEST WITH TEXT, BORDERS, AND GADGETS ***************************************************************************/ /* Border for buttons */ SHORT Pairs[] = { 0, 0, /* Coordinates relative to button position definition */ 43, 0, 43, 12, 0, 12, 0, 0 }; #define NUM_PAIRS 5 /* 5 pairs make a rectangle, start and stop incl */ struct Border butt_border = { -1, -1, BLUP, 0, JAM1, NUM_PAIRS, (SHORT *) Pairs, NULL }; /* FALSE BUTTON */ #define ONE_BUTT 1 /** GadgetID used to identify the action ***/ struct Gadget offgad = { NULL, 7, 42, /* LeftEdge, TopEdge */ 42, 11, /* Width, Height */ GADGHCOMP, /* Flag */ RELVERIFY | ENDGADGET, /* Activation */ BOOLGADGET | REQGADGET, /* GadgetType */ (APTR)&butt_border, /* GadgetRender - Border */ NULL, /* SelectRender */ &negtext, /* "OK" text */ NL, NL, ONE_BUTT, NL /* Mut Excl, Spec Info, */ }; /* TRUE BUTTON */ #define TWO_BUTT 2 struct Gadget ongad = { &offgad, 7, 22, /* LeftEdge, TopEdge */ 42, 11, /* Width, Height */ GADGHCOMP, /* Flag */ RELVERIFY | GADGIMMEDIATE, /* Activation */ BOOLGADGET | REQGADGET, /* GadgetType */ (APTR)&butt_border, /* GadgetRender - Border */ NULL, /* SelectRender */ &postext, /* "OK" text */ NL, NL, TWO_BUTT, NL /* Mut Excl, Spec Info, */ }; /* Outside Border of Requester */ SHORT ReqPairs[] = { 3, 3, /* Coordinates relative to requester sheet top left corner */ 53, 3, 53, 57, 3, 57, 3, 3 }; struct Border out_border = { -1, -1, BLKP, 0, JAM1, NUM_PAIRS, (SHORT *) ReqPairs, NULL }; /*************************************************************************** D O C U S T O M R E Q U E S T ***************************************************************************/ /* * Just as Enquiring minds want to know, Enquiring eyes want to see... */ autoEnquire() { short looping = TRUE; short response = FALSE; struct IntuiMessage *mes; struct Gadget *gad; /* Gadget chosen */ unsigned long class; while (looping) { if ((mes = (struct IntuiMessage *)GetMsg(RWindow->UserPort)) == 0L) { (VOID) Wait(1L<UserPort->mp_SigBit); continue; } class = mes->Class; gad = (struct Gadget *)mes->IAddress; (VOID) ReplyMsg(mes); if (class == REQCLEAR) looping = FALSE; if (class == GADGETDOWN) { switch (gad->GadgetID) { case TWO_BUTT: response = (short)TWO_BUTT-1; EndRequest(&req, RWindow); break; case ONE_BUTT: response = (short)ONE_BUTT-1; EndRequest(&req, RWindow); break; /* As you can see, adding more buttons would be easy */ } } } wleftedge = RWindow->LeftEdge; wtopedge = RWindow->TopEdge; return (response); }