home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / spirit / tut / !Lesson3_C_Lesson3 < prev    next >
Encoding:
Text File  |  1993-11-27  |  8.2 KB  |  321 lines

  1. /*
  2.  *      Title     : Lesson 3
  3.  *      System    : New Risc-OS library. */
  4. #define Version     "1.0"
  5. /*      Copyright : (c) John Winters
  6.  *      Date      : 31st May, 1993
  7.  *      Author    : John H. Winters
  8.  *
  9.  *      Function  : Lesson 3 of the Spirit library tutorial.
  10.  *
  11.  *      This example follows on from lesson 2 by introducing a window.
  12.  *      Note how much of the work is still done by the programming
  13.  *      library.
  14.  *
  15.  *      This lesson introduces LOG_OSError - a very useful function
  16.  *      for checking the return from system calls.
  17.  *
  18.  *      Modification history.
  19.  *
  20.  *      Version   : 
  21.  *      Date      : 
  22.  *      Author    : 
  23.  *      Changes   : 
  24.  *
  25.  */
  26.  
  27. #include <stdlib.h>
  28. #include "winapp.h"
  29.  
  30. /*
  31.  *==========================================================================
  32.  *
  33.  *  Hash defines.
  34.  *
  35.  *==========================================================================
  36.  */
  37.  
  38. #define MENU_INFO   0   /* Menu entry for information */
  39. #define MENU_QUIT   1   /* Menu entry to quit */
  40. #define TFN_VERSION 4   /* Field number for version string */
  41.  
  42. /*
  43.  *==========================================================================
  44.  *
  45.  *  Local data.
  46.  *
  47.  *==========================================================================
  48.  */
  49.  
  50. /*
  51.  *  Handle on the dialogue box which we use to give process information.
  52.  */
  53. static t_dbox          InfoDbox ;
  54. /*
  55.  *  Name of our template file.
  56.  */
  57. static const char      TemplateFileName [] = "Templates" ;
  58. /*
  59.  *  String to place in our information dialogue box.
  60.  */
  61. static char            VersionString [] = Version " (27th November, 1993)" ;
  62. /*
  63.  *  Handle for our window.
  64.  */
  65. static t_window_handle WindowHandle ;
  66.  
  67. /*
  68.  *==========================================================================
  69.  *
  70.  *  Externally visible data.
  71.  *
  72.  *==========================================================================
  73.  */
  74.  
  75. /*
  76.  *  This data item gives the name of the directory to look in when loading
  77.  *  resources.  It will make the library code look for an environment
  78.  *  variable <Lesson3$Dir> which points to the correct directory.
  79.  */
  80. const char WA_resource_dir [] = "Lesson3" ;
  81. /*
  82.  *  This data item defines the task name.
  83.  */
  84. const char WA_task_name [] = "Lesson 3" ;
  85.  
  86. /*
  87.  *==========================================================================
  88.  *
  89.  *  Forward declarations.
  90.  *
  91.  *==========================================================================
  92.  */
  93.  
  94. static unsigned int ClickHandler (
  95.     t_poll_block *poll_block,
  96.     void         *reference) ;
  97.  
  98. static void MenuHandler (
  99.     void      *reference,
  100.     const int *hit) ;
  101.  
  102. /*
  103.  *==========================================================================
  104.  *
  105.  *  Externally visible routines.
  106.  *
  107.  *==========================================================================
  108.  */
  109.  
  110. unsigned int WA_BeginProcessing (void)
  111.  
  112. /*
  113.  *  Function :
  114.  *                  This routine is called after we have succesfully
  115.  *                  called WIMP_Initialise and are ready to go ahead.
  116.  *
  117.  *  Parameters :
  118.  *                  None.
  119.  *
  120.  *  Returns :
  121.  *                  TRUE if we are happy to go on, FALSE otherwise.
  122.  *
  123.  */
  124.  
  125. {
  126.     t_menu_block    *MainMenu ;
  127.  
  128.     /*
  129.      *  Create a menu to attach to our icon.  The syntax for the menu
  130.      *  string is as for Acorn's product.
  131.      */
  132.     MainMenu = WA_BuildMenu (WA_resource_dir,
  133.                              ">Info, Quit") ;
  134.     if (MainMenu == NULL)
  135.     {
  136.         LOG_Error ("Failed to create a menu.\n") ;
  137.     }
  138.     else
  139.     {
  140.         /*
  141.          *  Now create a dialogue box from the template we loaded
  142.          *  earlier.  It's a non-persistent one (FALSE), and
  143.          *  doesn't require a handler or reference (NULL, NULL).
  144.          */
  145.         InfoDbox = WA_CreateDbox ("ProgInfo", FALSE, NULL, NULL) ;
  146.         if (InfoDbox == NULL)
  147.         {
  148.             LOG_Error ("Can't create information dbox.\n") ;
  149.         }
  150.         else
  151.         {
  152.             /*
  153.              *  Inject our current version number into the dialogue
  154.              *  box.
  155.              */
  156.             WA_SetDboxField (InfoDbox,
  157.                              TFN_VERSION,
  158.                              VersionString) ;
  159.             /*
  160.              *  Create a window.
  161.              */
  162.             if (WA_CreateWindow ("Window", NULL, &WindowHandle))
  163.             {
  164.                 /*
  165.                  *  Now pop our icon on the bar, and attach a menu to it.
  166.                  *  If an error occurs it will be reported for us.
  167.                  */
  168.                 return ((WA_IconToBar ("!lesson3", TRUE)) &&
  169.                         (WA_AttachMenu (ICON_BAR,
  170.                                         MainMenu,
  171.                                         MenuHandler,
  172.                                         NULL)) &&
  173.                         (WA_ClaimEvent (ET_MouseClick,
  174.                                         ICON_BAR,
  175.                                         DONT_CARE,
  176.                                         ClickHandler,
  177.                                         NULL))) ;
  178.             }
  179.         }
  180.     }
  181.     return (FALSE) ;
  182. }
  183.  
  184.  
  185. unsigned int WA_LoadResources (void)
  186.  
  187. /*
  188.  *  Function :
  189.  *                  This is our opportunity to load whatever resources
  190.  *                  we require before WIMP_Initialise is called.
  191.  *
  192.  *  Parameters :
  193.  *                  None.
  194.  *
  195.  *  Returns :
  196.  *                  TRUE if we are happy to go on, FALSE otherwise.
  197.  *
  198.  */
  199.  
  200. {
  201.     t_LOG_HandlerMask mask ;
  202.  
  203.     /*
  204.      *  Arrange for any messages to appear in a pop-up box.  A more
  205.      *  sophisticated application would probably arrange its own
  206.      *  message handling, but this easy method is provided for noddy
  207.      *  code.
  208.      */
  209.     mask.value             = 0 ;
  210.     mask.b.LHM_Debug       = TRUE ;
  211.     mask.b.LHM_Info        = TRUE ;
  212.     mask.b.LHM_Warning     = TRUE ;
  213.     mask.b.LHM_Error       = TRUE ;
  214.     mask.b.LHM_SevereError = TRUE ;
  215.     WA_SetPopupErrors (mask) ;
  216.     /*
  217.      *  Now we need a sprite to put on the icon bar, and a template
  218.      *  for our information box.  Note that we are here loading our sprite
  219.      *  from the !Sprites file in our application directory.  If we were
  220.      *  using more than one sprite, we would probably use a separate
  221.      *  sprite file.
  222.      */
  223.     return ((WA_LoadSprites ("!Sprites")) &&
  224.             (WA_LoadTemplate (TemplateFileName, "ProgInfo")) &&
  225.             (WA_LoadTemplate (TemplateFileName, "Window"))) ;
  226. }
  227.  
  228. /*
  229.  *==========================================================================
  230.  *
  231.  *  Local routines.
  232.  *
  233.  *==========================================================================
  234.  */
  235.  
  236. static unsigned int ClickHandler (
  237.     t_poll_block *poll_block,
  238.     void         *reference)
  239.  
  240. /*
  241.  *  Function :
  242.  *                  Click handler.
  243.  *
  244.  *  Parameters :
  245.  *                  poll_block  Pointer to block describing the event.
  246.  *                  reference   Ignored.
  247.  *
  248.  *  Returns :
  249.  *                  TRUE if we handled the event, FALSE otherwise.
  250.  *
  251.  */
  252.  
  253. {
  254.     t_state_block state ;
  255.  
  256.     reference = reference ;
  257.     /*
  258.      *  Check for left or right.
  259.      */
  260.     if ((poll_block->data.mc.button_state.m.adjust) ||
  261.         (poll_block->data.mc.button_state.m.select))
  262.     {
  263.         /*
  264.          *  The customer has clicked on our icon.  Display our window.
  265.          *  If it is already on view, this sequence will have the effect
  266.          *  of bringing it to the front.
  267.          */
  268.         if (LOG_OSError (WIMP_GetWindowState (WindowHandle,
  269.                                               &state)) == NULL)
  270.         {
  271.             state.open_block.behind = -1 ;
  272.             LOG_OSError (WIMP_OpenWindow (&(state.open_block))) ;
  273.         }
  274.         return (TRUE) ;
  275.     }
  276.     else
  277.     {
  278.         return (FALSE) ;
  279.     }
  280. }
  281.  
  282.  
  283. static void MenuHandler (
  284.     void      *reference,
  285.     const int *hit)
  286.  
  287. /*
  288.  *  Function :
  289.  *                  Menu event handler.
  290.  *
  291.  *  Parameters :
  292.  *                  reference  Ignored.
  293.  *                  hit        Indication of the menu hit.
  294.  *
  295.  *  Returns :
  296.  *                  None.
  297.  *
  298.  */
  299.  
  300. {
  301.     reference = reference ;
  302.     /*
  303.      *  See which menu entry has been chosen.
  304.      */
  305.     switch (hit [0])
  306.     {
  307.         case MENU_INFO :
  308.             WA_DisplayDbox (InfoDbox) ;
  309.             break ;
  310.  
  311.         case MENU_QUIT :
  312.             /*
  313.              *  This call causes our application to exit in an
  314.              *  orderly manner.
  315.              */
  316.             WA_WindUp () ;
  317.             break ;
  318.  
  319.     }
  320. }
  321.