/* ************************************************************************* 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 "atv3d.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 */ /* * Above is an instance of the (empty) Requester stucture. 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. */ /* * In the RWindow structure containing the window's LeftEdge - TopEdge * definition, we wish to keep track of the requester position by means * of these two numbers once they are initialized. This structure is * housed in the user's section. */ short autoEnquire(); /* the enquirer subroutine is in this section */ /*************************************************************************** * 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; /* This is where we track position */ wtopedge = RWindow->TopEdge; /* of the requester if it was moved */ return (response); }