home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / datafiles / text / c_manual / intuition / requesters / example9.c < prev    next >
C/C++ Source or Header  |  1995-02-27  |  22KB  |  553 lines

  1. /***********************************************************/
  2. /*                                                         */
  3. /* Amiga C Encyclopedia (ACE) V3.0      Amiga C Club (ACC) */
  4. /* -------------------------------      ------------------ */
  5. /*                                                         */
  6. /* Book:    ACM Intuition               Amiga C Club       */
  7. /* Chapter: Requesters                  Tulevagen 22       */
  8. /* File:    Example9.c                  181 41  LIDINGO    */
  9. /* Author:  Anders Bjerin               SWEDEN             */
  10. /* Date:    92-05-01                                       */
  11. /* Version: 1.10                                           */
  12. /*                                                         */
  13. /*   Copyright 1992, Anders Bjerin - Amiga C Club (ACC)    */
  14. /*                                                         */
  15. /* Registered members may use this program freely in their */
  16. /*     own commercial/noncommercial programs/articles.     */
  17. /*                                                         */
  18. /***********************************************************/
  19.  
  20. /* This program will open a normal window which is connected to the     */
  21. /* Workbench Screen. The window will use all System Gadgets, and will   */
  22. /* close first when the user has selected the System gadget Close       */
  23. /* window. Inside the window we have activated an Application requester */
  24. /* with three connecting gadgets. Two are Boolean gadgets ("OK and      */
  25. /* "CANCEL"), and one is a Proportional gadget.                         */
  26.  
  27.  
  28.  
  29. #include <intuition/intuition.h>
  30.  
  31.  
  32.  
  33. struct IntuitionBase *IntuitionBase;
  34.  
  35.  
  36.  
  37. /*****************************************/
  38. /* THE PROPORTIONAL GADGET's STRUCTURES: */
  39. /*****************************************/
  40.  
  41. /* The IntuiText structure for the proportional gadget: */
  42. struct IntuiText prop_text=
  43. {
  44.   1,         /* FrontPen, colour register 1. */
  45.   0,         /* BackPen, colour register 0. */
  46.   JAM1,      /* DrawMode, draw the characters with colour 1, do not */
  47.              /* change the background. */ 
  48.   -65, 2,    /* LeftEdge, TopEdge. */
  49.   NULL,      /* ITextFont, use default font. */
  50.   "Colour:", /* IText, the text that will be printed. */
  51.   NULL,      /* NextText, no other IntuiText structures. */
  52. };
  53.  
  54.  
  55. /* We need to declare an Image structure for the knob, but since */
  56. /* Intuition will take care of the size etc of the knob, we do not need */
  57. /* to initialize the Image structure: */
  58. struct Image prop_image;
  59.  
  60.  
  61. struct PropInfo prop_info=
  62. {
  63.   FREEHORIZ|      /* Flags, the knob should be moved horizontally, and */
  64.   AUTOKNOB,       /* Intuition should take care of the knob image. */
  65.   0,              /* HorizPot, start position of the knob. */
  66.   0,              /* VertPot, 0 since we will not move the knob hor. */
  67.   MAXBODY * 1/16, /* HorizBody, 16 steps. */
  68.   0,              /* VertBody, 0 since we will not move the knob hor. */
  69.  
  70.   /* These variables are initialized and maintained by Intuition: */
  71.  
  72.   0,              /* CWidth */
  73.   0,              /* CHeight */
  74.   0, 0,           /* HPotRes, VPotRes */
  75.   0,              /* LeftBorder */
  76.   0               /* TopBorder */
  77. };
  78.  
  79.  
  80. struct Gadget prop_gadget=
  81. {
  82.   NULL,              /* NextGadget, no more gadgets in the list. */
  83.   80,                /* LeftEdge, 80 pixels out. */
  84.   30,                /* TopEdge, 30 lines down. */
  85.   189,               /* Width, 189 pixels wide. */
  86.   12,                /* Height, 12 pixels lines heigh. */
  87.   GADGHCOMP,         /* Flags, complement the colours. */
  88.   GADGIMMEDIATE|     /* Activation, our program will recieve a message */
  89.   RELVERIFY,         /* when the user has selected this gadget, and when */
  90.                      /* the user has released it. */ 
  91.   PROPGADGET,        /* GadgetType, a Proportional gadget. */
  92.   (APTR) &prop_image,/* GadgetRender, a pointer to our Image structure. */
  93.                      /* (Intuition will take care of the knob image) */
  94.                      /* (See chapter 3 GRAPHICS for more information) */
  95.   NULL,              /* SelectRender, NULL since we do not supply the */
  96.                      /* gadget with an alternative image. */
  97.   &prop_text,        /* GadgetText, colour. */
  98.   NULL,              /* MutualExclude, no mutual exclude. */
  99.   (APTR) &prop_info, /* SpecialInfo, pointer to a PropInfo structure. */
  100.   0,                 /* GadgetID, no id. */
  101.   NULL               /* UserData, no user data connected to the gadget. */
  102. };
  103.  
  104.  
  105.  
  106. /*******************************/
  107. /* THE OK GADGET's STRUCTURES: */
  108. /*******************************/
  109.  
  110. /* The coordinates for the OK box: */
  111. SHORT ok_border_points[]=
  112. {
  113.    0,  0, /* Start at position (0,0) */
  114.   22,  0, /* Draw a line to the right to position (22,0) */
  115.   22, 10, /* Draw a line down to position (22,10) */
  116.    0, 10, /* Draw a line to the left to position (0,10) */
  117.    0,  0  /* Finish of by drawing a line up to position (0,0) */ 
  118. };
  119.  
  120. /* The Border structure: */
  121. struct Border ok_border=
  122. {
  123.   0, 0,        /* LeftEdge, TopEdge. */
  124.   1,           /* FrontPen, colour register 1. */
  125.   0,           /* BackPen, for the moment unused. */
  126.   JAM1,        /* DrawMode, draw the lines with colour 1. */
  127.   5,           /* Count, 5 pair of coordinates in the array. */
  128.   ok_border_points, /* XY, pointer to the array with the coord. */
  129.   NULL,        /* NextBorder, no other Border structures are connected. */
  130. };
  131.  
  132. /* The IntuiText structure: */
  133. struct IntuiText ok_text=
  134. {
  135.   1,      /* FrontPen, colour register 1. */
  136.   0,      /* BackPen, not used since JAM1. */
  137.   JAM1,   /* DrawMode, draw the characters with colour 1, do not */
  138.           /* change the background. */ 
  139.   4, 2,   /* LeftEdge, TopEdge. */
  140.   NULL,   /* ITextFont, use default font. */
  141.   "OK",   /* IText, the text that will be printed. */
  142.   NULL,   /* NextText, no other IntuiText structures are connected. */
  143. };
  144.  
  145. struct Gadget ok_gadget=
  146. {
  147.   &prop_gadget,  /* NextGadget, linked to the Proportional gadget. */
  148.   14,            /* LeftEdge, 14 pixels out. */
  149.   47,            /* TopEdge, 47 lines down. */
  150.   23,            /* Width, 23 pixels wide. */
  151.   11,            /* Height, 11 pixels lines heigh. */
  152.   GADGHCOMP,     /* Flags, when this gadget is highlighted, the gadget */
  153.                  /* will be rendered in the complement colours. */
  154.                  /* (Colour 0 (00) will be changed to colour 3 (11) */
  155.                  /* (Colour 1 (01)           - " -           2 (10) */
  156.                  /* (Colour 2 (10)           - " -           1 (01) */
  157.                  /* (Colour 3 (11)           - " -           0 (00) */  
  158.   GADGIMMEDIATE| /* Activation, our program will recieve a message when */
  159.   RELVERIFY|     /* the user has selected this gadget, and when the user */
  160.                  /* has released it. */
  161.   ENDGADGET,     /* When the user has selected this gadget, the */
  162.                  /* requester is satisfied, and is deactivated. */
  163.                  /* IMPORTANT! At least one gadget per requester */
  164.                  /* must have the flag ENDGADGET set. If not, the */
  165.                  /* requester would never be deactivated! */
  166.  
  167.   BOOLGADGET|    /* GadgetType, a Boolean gadget which is connected to */
  168.   REQGADGET,     /* a requester. IMPORTANT! Every gadget which is */
  169.                  /* connectd to a requester must have the REQGADGET flsg */
  170.                  /* set in the GadgetType field. */
  171.   (APTR) &ok_border, /* GadgetRender, a pointer to our Border struc. */
  172.   NULL,          /* SelectRender, NULL since we do not supply the gadget */
  173.                  /* with an alternative image. (We complement the */
  174.                  /* colours instead) */
  175.   &ok_text,      /* GadgetText, a pointer to our IntuiText structure. */
  176.                  /* (See chapter 3 GRAPHICS for more information) */
  177.   NULL,          /* MutualExclude, no mutual exclude. */
  178.   NULL,          /* SpecialInfo, NULL since this is a Boolean gadget. */
  179.                  /* (No binary mask) */
  180.   0,             /* GadgetID, no id. */
  181.   NULL           /* UserData, no user data connected to the gadget. */
  182. };
  183.  
  184.  
  185.  
  186. /***********************************/
  187. /* THE CANCEL GADGET's STRUCTURES: */
  188. /***********************************/
  189.  
  190. /* The coordinates for the CANCEL box: */
  191. SHORT cancel_border_points[]=
  192. {
  193.    0,  0, /* Start at position (0,0) */
  194.   54,  0, /* Draw a line to the right to position (54,0) */
  195.   54, 10, /* Draw a line down to position (54,10) */
  196.    0, 10, /* Draw a line to the left to position (0,10) */
  197.    0,  0  /* Finish of by drawing a line up to position (0,0) */ 
  198. };
  199.  
  200. /* The Border structure: */
  201. struct Border cancel_border=
  202. {
  203.   0, 0,        /* LeftEdge, TopEdge. */
  204.   1,           /* FrontPen, colour register 1. */
  205.   0,           /* BackPen, for the moment unused. */
  206.   JAM1,        /* DrawMode, draw the lines with colour 1. */
  207.   5,           /* Count, 5 pair of coordinates in the array. */
  208.   cancel_border_points, /* XY, pointer to the array with the coord. */
  209.   NULL,        /* NextBorder, no other Border structures are connected. */
  210. };
  211.  
  212. /* The IntuiText structure: */
  213. struct IntuiText cancel_text=
  214. {
  215.   1,        /* FrontPen, colour register 1. */
  216.   0,        /* BackPen, not used since JAM1. */
  217.   JAM1,     /* DrawMode, draw the characters with colour 1, do not */
  218.             /* change the background. */ 
  219.   4, 2,     /* LeftEdge, TopEdge. */
  220.   NULL,     /* ITextFont, use default font. */
  221.   "CANCEL", /* IText, the text that will be printed. */
  222.   NULL,     /* NextText, no other IntuiText structures are connected. */
  223. };
  224.  
  225. struct Gadget cancel_gadget=
  226. {
  227.   &ok_gadget,    /* NextGadget, linked to the OK gadget. */
  228.   214,           /* LeftEdge, 214 pixels out. */
  229.   47,            /* TopEdge, 47 lines down. */
  230.   55,            /* Width, 55 pixels wide. */
  231.   11,            /* Height, 11 pixels lines heigh. */
  232.   GADGHCOMP,     /* Flags, when this gadget is highlighted, the gadget */
  233.                  /* will be rendered in the complement colours. */
  234.                  /* (Colour 0 (00) will be changed to colour 3 (11) */
  235.                  /* (Colour 1 (01)           - " -           2 (10) */
  236.                  /* (Colour 2 (10)           - " -           1 (01) */
  237.                  /* (Colour 3 (11)           - " -           0 (00) */  
  238.   GADGIMMEDIATE| /* Activation, our program will recieve a message when */
  239.   RELVERIFY|     /* the user has selected this gadget, and when the user */
  240.                  /* has released it. */
  241.   ENDGADGET,     /* When the user has selected this gadget, the */
  242.                  /* requester is satisfied, and is deactivated. */
  243.                  /* IMPORTANT! At least one gadget per requester */
  244.                  /* must have the flag ENDGADGET set. If not, the */
  245.                  /* requester would never be deactivated! */
  246.  
  247.   BOOLGADGET|    /* GadgetType, a Boolean gadget which is connected to */
  248.   REQGADGET,     /* a requester. IMPORTANT! Every gadget which is */
  249.                  /* connectd to a requester must have the REQGADGET flsg */
  250.                  /* set in the GadgetType field. */
  251.   (APTR) &cancel_border, /* GadgetRender, a pointer to our Border struc. */
  252.   NULL,          /* SelectRender, NULL since we do not supply the gadget */
  253.                  /* with an alternative image. (We complement the */
  254.                  /* colours instead) */
  255.   &cancel_text,  /* GadgetText, a pointer to our IntuiText structure. */
  256.                  /* (See chapter 3 GRAPHICS for more information) */
  257.   NULL,          /* MutualExclude, no mutual exclude. */
  258.   NULL,          /* SpecialInfo, NULL since this is a Boolean gadget. */
  259.                  /* (No binary mask) */
  260.   0,             /* GadgetID, no id. */
  261.   NULL           /* UserData, no user data connected to the gadget. */
  262. };
  263.  
  264.  
  265.  
  266. /************************************************************************/
  267. /* Note:                                                                */
  268. /* Remember that every gadget which is connected to a requester must    */
  269. /* have the flag REQGADGET set in the GadgetType field. Remember also   */
  270. /* that at least one gadget per requester must have the ENDGADGET flag  */
  271. /* set in the Activation field.                                         */
  272. /* In this example we have three gadgets connected to the requester.    */
  273. /* All of them has the REQGADGET flag set, and the OK and CANCEL gadget */
  274. /* has also the ENDGADGET flag set.                                     */
  275. /************************************************************************/
  276.  
  277.  
  278.  
  279. /************************************/
  280. /* THE BORDER AROUND THE REQUESTER: */
  281. /************************************/
  282.  
  283. /* The coordinates for the box around the requester: */
  284. SHORT requester_border_points[]=
  285. {
  286.     0,  0, /* Start at position (0,0) */
  287.   282,  0, /* Draw a line to the right. */
  288.   282, 64, /* Draw a line down. */
  289.     0, 64, /* Draw a line to the left. */
  290.     0,  0  /* Finish of by drawing a line up to position (0,0) */ 
  291. };
  292.  
  293. /* The Border structure for the requester: */
  294. struct Border requester_border=
  295. {
  296.   0, 0,        /* LeftEdge, TopEdge. */
  297.   1,           /* FrontPen, colour register 1. */
  298.   0,           /* BackPen, for the moment unused. */
  299.   JAM1,        /* DrawMode, draw the lines with colour 1. */
  300.   5,           /* Count, 5 pair of coordinates in the array. */
  301.   requester_border_points, /* XY, pointer to the array with the coord. */
  302.   NULL,        /* NextBorder, no other Border structures are connected. */
  303. };
  304.  
  305.  
  306.  
  307. /**********************************/
  308. /* THE TEXT INSIDE THE REQUESTER: */
  309. /**********************************/
  310.  
  311. /* The IntuiText structure used to print some text inside the requester: */
  312. struct IntuiText requester_text=
  313. {
  314.   1,         /* FrontPen, colour register 1. */
  315.   0,         /* BackPen, unused since JAM1. */
  316.   JAM1,      /* DrawMode, draw the characters with colour 1, do not */
  317.              /* change the background. */ 
  318.   14, 8,     /* LeftEdge, TopEdge. */
  319.   NULL,      /* ITextFont, use default font. */
  320.   "Please set the colour value:", /* IText, the text. */
  321.   NULL,      /* NextText, no other IntuiText structures are connected. */
  322. };
  323.  
  324.  
  325.  
  326. /****************************/
  327. /* THE REQUESTER STRUCTURE: */
  328. /****************************/
  329.  
  330. struct Requester my_requester=
  331. {
  332.   NULL,              /* OlderRequester, used by Intuition. */
  333.   40, 20,            /* LeftEdge, TopEdge, 40 pixels out, 20 lines down. */
  334.   283, 65,           /* Width, Height, 283 pixels wide, 65 lines high. */
  335.   0, 0,              /* RelLeft, RelTop, Since POINTREL flag is not set, */
  336.                      /* Intuition ignores these values. */
  337.   &cancel_gadget,    /* ReqGadget, pointer to the first gadget. */
  338.   &requester_border, /* ReqBorder, pointer to a Border structure. */
  339.   &requester_text,   /* ReqText, pointer to a IntuiText structure. */
  340.   NULL,              /* Flags, no flags set. */
  341.   2,                 /* BackFill, draw everything on a black background. */
  342.   NULL,              /* ReqLayer, used by Intuition. Set to NULL. */
  343.   NULL,              /* ReqPad1, used by Intuition. Set to NULL. */
  344.   NULL,              /* ImageBMap, no predrawn Bitmap. Set to NULL. */
  345.                      /*            (The PREDRAWN flag was not set) */
  346.   NULL,              /* RWindow, used by Intuition. Set to NULL. */
  347.   NULL               /* ReqPad2, used by Intuition. Set to NULL. */
  348. };
  349.  
  350.  
  351.  
  352. /* Declare a pointer to a Window structure: */ 
  353. struct Window *my_window;
  354.  
  355. /* Declare and initialize your NewWindow structure: */
  356. struct NewWindow my_new_window=
  357. {
  358.   0,             /* LeftEdge    x position of the window. */
  359.   0,             /* TopEdge     y positio of the window. */
  360.   640,           /* Width       640 pixels wide. */
  361.   200,           /* Height      200 lines high. */
  362.   0,             /* DetailPen   Text should be drawn with colour reg. 0 */
  363.   1,             /* BlockPen    Blocks should be drawn with colour reg. 1 */
  364.   CLOSEWINDOW|   /* IDCMPFlags  The window will give us a message if the */
  365.                  /*             user has selected the Close window gad, */
  366.   GADGETDOWN|    /*             or a gadget has been pressed on, or */
  367.   GADGETUP|      /*             a gadge has been released. */
  368.   REQSET|        /*             Send a message also if a requester has */
  369.   REQCLEAR,      /*             been activated or deactivated. */
  370.   SMART_REFRESH| /* Flags       Intuition should refresh the window. */
  371.   WINDOWCLOSE|   /*             Close Gadget. */
  372.   WINDOWDRAG|    /*             Drag gadget. */
  373.   WINDOWDEPTH|   /*             Depth arrange Gadgets. */
  374.   WINDOWSIZING|  /*             Sizing Gadget. */
  375.   ACTIVATE,      /*             The window should be Active when opened. */
  376.   NULL,          /* FirstGadget No gadget connected to this window. */
  377.   NULL,          /* CheckMark   Use Intuition's default CheckMark. */
  378.   "The Window",  /* Title       Title of the window. */
  379.   NULL,          /* Screen      Connected to the Workbench Screen. */
  380.   NULL,          /* BitMap      No Custom BitMap. */
  381.   140,           /* MinWidth    We will not allow the window to become */
  382.   50,            /* MinHeight   smaller than 140 x 50, and not bigger */
  383.   300,           /* MaxWidth    than 300 x 200. */
  384.   200,           /* MaxHeight */
  385.   WBENCHSCREEN   /* Type        Connected to the Workbench Screen. */
  386. };
  387.  
  388.  
  389.  
  390. main()
  391. {
  392.   /* Boolean variable used for the while loop: */
  393.   BOOL close_me;
  394.  
  395.   /* Declare a variable in which we will store the IDCMP flag: */
  396.   ULONG class;
  397.   
  398.   /* Declare a variable in which we will store the address of the */
  399.   /* gadget which sent the message: */
  400.   APTR address;
  401.   
  402.   /* Declare a pointer to an IntuiMessage structure: */
  403.   struct IntuiMessage *my_message;
  404.  
  405.   /* We use this variable to check if the requester has ben activated */
  406.   /* or not: */
  407.   BOOL result;
  408.  
  409.  
  410.  
  411.   /* Before we can use Intuition we need to open the Intuition Library: */
  412.   IntuitionBase = (struct IntuitionBase *)
  413.     OpenLibrary( "intuition.library", 0 );
  414.   
  415.   if( IntuitionBase == NULL )
  416.     exit(); /* Could NOT open the Intuition Library! */
  417.  
  418.  
  419.  
  420.   /* We will now try to open the window: */
  421.   my_window = (struct Window *) OpenWindow( &my_new_window );
  422.   
  423.   /* Have we opened the window succesfully? */
  424.   if(my_window == NULL)
  425.   {
  426.     /* Could NOT open the Window! */
  427.     
  428.     /* Close the Intuition Library since we have opened it: */
  429.     CloseLibrary( IntuitionBase );
  430.  
  431.     exit();  
  432.   }
  433.  
  434.  
  435.  
  436.   /* We have opened the window, and everything seems to be OK. */
  437.  
  438.  
  439.  
  440.   /* We will now try to activate the requester: */
  441.   result=Request( &my_requester, my_window );
  442.  
  443.   if( !result )  /* !result is the same thing as result==FALSE */
  444.   {
  445.     /* Intuition could not activate the requester! */
  446.     /* In this case we do not need to quit since it does not matter if */
  447.     /* the requester was activated or not. I just wanted to show how */
  448.     /* you can check if you have opened or not the requester. */
  449.   
  450.     printf("Could not activate the requester!\n");
  451.   }
  452.   else
  453.   {
  454.     /* Intuition could open the requester! */
  455.     printf("Try to close the window!\n");
  456.   }
  457.  
  458.  
  459.  
  460.   close_me = FALSE;
  461.  
  462.   /* Stay in the while loop until the user has selected the Close window */
  463.   /* gadget. However, in this example the user first need to deactivate */
  464.   /* the requester before he can select the Close window gadget: */
  465.   while( !close_me )
  466.   {
  467.     /* Wait until we have recieved a message: */
  468.     Wait( 1 << my_window->UserPort->mp_SigBit );
  469.  
  470.     /* As long as we collect messages sucessfully: */
  471.     while(my_message=(struct IntuiMessage *) GetMsg(my_window->UserPort))
  472.     {
  473.       /* After we have collected the message we can read it, and save any */
  474.       /* important values which we maybe want to check later: */
  475.       
  476.       /* Store the IDCMP flag: */
  477.       class = my_message->Class;
  478.  
  479.       /* Store the address: */
  480.       address = my_message->IAddress;
  481.  
  482.       /* After we have read it we reply as fast as possible: */
  483.       /* REMEMBER! Do never try to read a message after you have replied! */
  484.       /* Some other process has maybe changed it. */
  485.       ReplyMsg( my_message );
  486.  
  487.       /* Check which IDCMP flag was sent: */
  488.       switch( class )
  489.       {
  490.         case CLOSEWINDOW:  /* The user selected the Close window gadget! */
  491.                close_me=TRUE;
  492.                break;
  493.              
  494.         case GADGETDOWN:   /* The user has pressed on a gadget. */
  495.                
  496.                if( address == (APTR) &ok_gadget )
  497.                  printf("The user pressed on the OK gadget!\n");
  498.  
  499.                if( address == (APTR) &cancel_gadget )
  500.                  printf("The user pressed on the CANCEL gadget!\n");
  501.                  
  502.                if( address == (APTR) &prop_gadget )
  503.                  printf("The user selected the Proportional gadget!\n");
  504.                
  505.                break;
  506.              
  507.         case GADGETUP:     /* The user has released a gadget. */
  508.  
  509.                if( address == (APTR) &ok_gadget )
  510.                  printf("The user released the OK gadget!\n");
  511.  
  512.                if( address == (APTR) &cancel_gadget )
  513.                  printf("The user released the CANCEL gadget!\n");
  514.                  
  515.                if( address == (APTR) &prop_gadget )
  516.                {
  517.                  printf("The user released the Proportional gadget!\n");
  518.                  
  519.                  /* Print out the colour value: */
  520.                  printf("Colour= %1.0f\n\n", (float) prop_info.HorizPot
  521.                                              / MAXPOT*16);
  522.                }
  523.                break;
  524.                
  525.         case REQSET:       /* Requester activated. */
  526.               printf("Requester activated!\n");
  527.               break;
  528.  
  529.         case REQCLEAR:     /* Requester deactivated. */
  530.               printf("Requester deactivated!\n");
  531.               printf("You can now close the window.\n");
  532.               break;
  533.       }
  534.     }
  535.   }
  536.  
  537.  
  538.  
  539.   /* Print out the colour value: */
  540.   printf( "Colour= %1.0f\n\n", (float) prop_info.HorizPot / MAXPOT*16 );
  541.  
  542.  
  543.  
  544.   /* We should always close the windows we have opened before we leave: */
  545.   CloseWindow( my_window );
  546.  
  547.  
  548.  
  549.   /* Close the Intuition Library since we have opened it: */
  550.   CloseLibrary( IntuitionBase );
  551.   
  552.   /* THE END */
  553. }