/* *** reqsupp.c ************************************************************ * * Requester Support Routine * from Book 1 of the Amiga Programmers' Suite by RJ Mical * * Copyright (C) 1986, 1987, Robert J. Mical * All Rights Reserved. * * Created for Amiga developers. * Any or all of this code can be used in any program as long as this * entire copyright notice is retained, ok? * * The Amiga Programmer's Suite Book 1 is copyrighted but freely distributable. * All copyright notices and all file headers must be retained intact. * The Amiga Programmer's Suite Book 1 may be compiled and assembled, and the * resultant object code may be included in any software product. However, no * portion of the source listings or documentation of the Amiga Programmer's * Suite Book 1 may be distributed or sold for profit or in a for-profit * product without the written authorization of the author, RJ Mical. * * HISTORY NAME DESCRIPTION * ----------- -------------- -------------------------------------------- * 4 Feb 87 RJ Real release * 12 Aug 86 RJ >:-{)* Prepare (clean house) for release * 3 May 86 =RJ Mical= Fix prop gadget for both 1.1 and 1.2 * 1 Feb 86 =RJ Mical= Created this file. * * *********************************************************************** */ #include #include struct IntuiMessage *GetMsg(); /* *** DoRequest() ********************************************************** * * NAME * DoRequest -- Creates and manages a requester * * * SYNOPSIS * DoRequest(ReqSupport); * * * FUNCTION * Creates a requester according to the specifications laid out * by you in a ReqSupport structure, and manages the interaction * with the requester for you. In the end this routine returns control * to you with an identifier describing which gadget the user selected * to terminate the requester; this identifier can be found in the * SelectedGadgetID field of your ReqSupport structure. * * Note that if anything goes wrong while trying to create the * requester (usually out of memory) this routine returns * immediately with the SelectedGadgetID field set to zero. * Because of this, you should either avoid GadgetIDs of zero * or at least you should have your Cancel Gadget have an * ID of zero. * * You can specify routines that will be called when certain events * occur while the requester is displayed. For instance, you can * specify that a particular routine be called every time the * user selects any of the requester gadgets. See the documentation * and the ReqSupport structure for details about what * routine vectors you can supply. * * * INPUTS * ReqSupport = pointer to a ReqSupport structure * * * RESULT * Returns the identifier of the gadget that ended the requester * in the ReqSupport's SelectedGadgetID field. * If anything goes wrong (usually out of memory) the SelectedGadgetID * field is set to zero. */ VOID DoRequest(reqsupp) struct ReqSupport *reqsupp; { ULONG class; SHORT x, y; struct IntuiMessage *message; struct Gadget *gadget; ULONG saveidcmp; BOOL IAintGotNoSatisfaction, mousemoved; struct Window *window; LONG seconds, micros; window = reqsupp->Window; saveidcmp = window->IDCMPFlags; ModifyIDCMP(window, GADGETUP | GADGETDOWN | REQSET | REQCLEAR | MOUSEMOVE | DISKINSERTED | MOUSEBUTTONS); if (Request(&reqsupp->Requester, window) == FALSE) { reqsupp->SelectedGadgetID = 0; goto JUMP_SHIP; } IAintGotNoSatisfaction = TRUE; while (IAintGotNoSatisfaction) { Wait(1 << window->UserPort->mp_SigBit); mousemoved = FALSE; while (message = GetMsg(window->UserPort)) { gadget = (struct Gadget *)message->IAddress; class = message->Class; x = message->MouseX; y = message->MouseY; seconds = message->Seconds; micros = message->Micros; ReplyMsg(message); switch (class) { case MOUSEBUTTONS: break; case REQSET: /* Does the caller have some startup * stuff to perform now that the * requester has been opened? */ if (reqsupp->StartRequest) (*reqsupp->StartRequest)(); break; case DISKINSERTED: if (reqsupp->NewDiskHandler) (*reqsupp->NewDiskHandler)(); break; case MOUSEMOVE: mousemoved = TRUE; break; case GADGETDOWN: case GADGETUP: reqsupp->SelectedGadgetID = gadget->GadgetID; if (reqsupp->GadgetHandler) { if ((*reqsupp->GadgetHandler)(gadget, x, y, seconds, micros)) { EndRequest(&reqsupp->Requester, window); IAintGotNoSatisfaction = FALSE; } } break; case REQCLEAR: IAintGotNoSatisfaction = FALSE; break; } } if (mousemoved && reqsupp->MouseMoveHandler) (*reqsupp->MouseMoveHandler)(); } JUMP_SHIP: ModifyIDCMP(window, saveidcmp); }