home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / source / dorqstr.lha / reqsupp.c < prev    next >
C/C++ Source or Header  |  1987-10-12  |  5KB  |  164 lines

  1.  
  2. /* *** reqsupp.c ************************************************************
  3.  *
  4.  * Requester Support Routine
  5.  *     from Book 1 of the Amiga Programmers' Suite by RJ Mical
  6.  *
  7.  * Copyright (C) 1986, 1987, Robert J. Mical
  8.  * All Rights Reserved.
  9.  *
  10.  * Created for Amiga developers.
  11.  * Any or all of this code can be used in any program as long as this
  12.  * entire copyright notice is retained, ok?
  13.  *
  14.  * HISTORY      NAME            DESCRIPTION
  15.  * -----------  --------------  --------------------------------------------
  16.  * 4 Feb 87     RJ              Real release
  17.  * 12 Aug 86    RJ >:-{)*       Prepare (clean house) for release
  18.  * 3 May 86     =RJ Mical=      Fix prop gadget for both 1.1 and 1.2
  19.  * 1 Feb 86     =RJ Mical=      Created this file.
  20.  *
  21.  * *********************************************************************** */
  22.  
  23.  
  24. #include <prosuite\prosuite.h>
  25. #include <prosuite\reqsupp.h>
  26.  
  27.  
  28. struct IntuiMessage *GetMsg();
  29.  
  30.  
  31.  
  32. /* *** DoRequest() **********************************************************
  33.  * 
  34.  * NAME
  35.  *     DoRequest  --  Creates and manages a requester
  36.  * 
  37.  * 
  38.  * SYNOPSIS
  39.  *     DoRequest(ReqSupport);
  40.  * 
  41.  * 
  42.  * FUNCTION
  43.  *     Creates a requester according to the specifications laid out
  44.  *     by you in a ReqSupport structure, and manages the interaction
  45.  *     with the requester for you.  In the end this routine returns control
  46.  *     to you with an identifier describing which gadget the user selected
  47.  *     to terminate the requester; this identifier can be found in the
  48.  *     SelectedGadgetID field of your ReqSupport structure.
  49.  * 
  50.  *     Note that if anything goes wrong while trying to create the 
  51.  *     requester (usually out of memory) this routine returns 
  52.  *     immediately with the SelectedGadgetID field set to zero.
  53.  *     Because of this, you should either avoid GadgetIDs of zero
  54.  *     or at least you should have your Cancel Gadget have an
  55.  *     ID of zero.
  56.  * 
  57.  *     You can specify routines that will be called when certain events
  58.  *     occur while the requester is displayed.  For instance, you can
  59.  *     specify that a particular routine be called every time the
  60.  *     user selects any of the requester gadgets.  See the documentation
  61.  *     and the ReqSupport structure for details about what
  62.  *     routine vectors you can supply.
  63.  * 
  64.  * 
  65.  * INPUTS
  66.  *     ReqSupport = pointer to a ReqSupport structure
  67.  * 
  68.  * 
  69.  * RESULT
  70.  *     Returns the identifier of the gadget that ended the requester
  71.  *     in the ReqSupport's SelectedGadgetID field.
  72.  *     If anything goes wrong (usually out of memory) the SelectedGadgetID
  73.  *     field is set to zero.
  74.  */
  75. DoRequest(reqsupp)
  76. struct ReqSupport *reqsupp;
  77. {
  78.    ULONG class;
  79.    SHORT x, y;
  80.    struct IntuiMessage *message;
  81.    struct Gadget *gadget;
  82.    ULONG saveidcmp;
  83.    BOOL IAintGotNoSatisfaction, mousemoved;
  84.    struct Window *window;
  85.    LONG seconds, micros;
  86.  
  87.    window = reqsupp->Window;
  88.  
  89.    saveidcmp = window->IDCMPFlags;
  90.    ModifyIDCMP(window, 
  91.          GADGETUP | GADGETDOWN | REQSET | REQCLEAR
  92.          | MOUSEMOVE | DISKINSERTED | MOUSEBUTTONS);
  93.  
  94.    if (Request(&reqsupp->Requester, window) == FALSE)
  95.       {
  96.       reqsupp->SelectedGadgetID = 0;
  97.       goto JUMP_SHIP;
  98.       }
  99.  
  100.    IAintGotNoSatisfaction = TRUE;
  101.  
  102.    while (IAintGotNoSatisfaction)
  103.       {
  104.       Wait(1 << window->UserPort->mp_SigBit);
  105.  
  106.       mousemoved = FALSE;
  107.  
  108.       while (message = GetMsg(window->UserPort))
  109.          {
  110.          gadget = (struct Gadget *)message->IAddress;
  111.          class = message->Class;
  112.          x = message->MouseX;
  113.          y = message->MouseY;
  114.          seconds = message->Seconds;
  115.          micros = message->Micros;
  116.          ReplyMsg(message);
  117.  
  118.          switch (class)
  119.             {
  120.             case MOUSEBUTTONS:
  121.                break;
  122.             case REQSET:
  123.                /* Does the caller have some startup 
  124.                 * stuff to perform now that the
  125.                 * requester has been opened?
  126.                 */
  127.                if (reqsupp->StartRequest)
  128.                   (*reqsupp->StartRequest)();
  129.                break;
  130.             case DISKINSERTED:
  131.                if (reqsupp->NewDiskHandler) (*reqsupp->NewDiskHandler)();
  132.                break;
  133.             case MOUSEMOVE:
  134.                mousemoved = TRUE;
  135.                break;
  136.             case GADGETDOWN:
  137.             case GADGETUP:
  138.                reqsupp->SelectedGadgetID = gadget->GadgetID;
  139.                if (reqsupp->GadgetHandler)
  140.                   {
  141.                   if ((*reqsupp->GadgetHandler)(gadget, 
  142.                         x, y, seconds, micros))
  143.                      {
  144.                      EndRequest(&reqsupp->Requester, window);
  145.                      IAintGotNoSatisfaction = FALSE;
  146.                      }
  147.                   }
  148.                break;
  149.             case REQCLEAR:
  150.                IAintGotNoSatisfaction = FALSE;
  151.                break;
  152.             }
  153.          }
  154.  
  155.       if (mousemoved && reqsupp->MouseMoveHandler)
  156.          (*reqsupp->MouseMoveHandler)();
  157.       }
  158.  
  159. JUMP_SHIP:
  160.    ModifyIDCMP(window, saveidcmp);
  161. }
  162.  
  163.  
  164.