home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine CD 1995 / Archive Magazine CD 1995.iso / discs / shareware / share_37 / interface / demo / c / Interface
Encoding:
Text File  |  1990-11-07  |  20.9 KB  |  783 lines

  1. /*
  2.  *
  3.  *       Title                  : ADFS::$.c.interface
  4.  *       System                 : Risc-OS library
  5.  *       Version                : 1.2
  6.  *       Copyright              : © Software Interrupt
  7.  *       Date                   : 25nd September, 1990
  8.  *       Author                 : Simon Huntington
  9.  *
  10.  *       Function               : Demonstration of !Interface functions
  11.  *
  12.  *
  13.  *       Modification history.
  14.  *
  15.  *       Version                : Version 1 (August 1990)
  16.  *       Changes                : Total rewrite in C, many new features added to the module
  17.  *
  18.  */
  19.  
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include "baricon.h"
  23. #include "dbox.h"
  24. #include "event.h"
  25. #include "interface.h"
  26. #include "menu.h"
  27. #include "os.h"
  28. #include "res.h"
  29. #include "resspr.h"
  30. #include "template.h"
  31. #include "visdelay.h"
  32. #include "werr.h"
  33. #include "wimp.h"
  34. #include "wimpt.h"
  35. #include "win.h"
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42. /* 
  43.  *============================================================================
  44.  *
  45.  * Hash defines for the menu options
  46.  * 
  47.  *============================================================================
  48.  */
  49.  
  50. #define  iconbar_info           1
  51. #define  iconbar_operations     2
  52. #define  iconbar_quit           3
  53. #define  operations_boxes       1
  54. #define  operations_pointers    2
  55. #define  operations_misc        3
  56. #define  operations_help        4
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63. /* 
  64.  *============================================================================
  65.  *
  66.  * Global variables
  67.  * 
  68.  *============================================================================
  69.  */
  70.  
  71. static menu            iconbar_menu;
  72. static menu            operation_menu;
  73. static dbox            info_dialogue;
  74. static wimp_w          main_window;
  75. static wimp_menustr   *window_menu;
  76. static int             interface_window              = 1;
  77. static int             interface_window_onscreen     = 0;
  78. static char           *current_status                = "Pointers, help switched off     ";
  79. static BOOL            pointer_direct                = FALSE;
  80. static BOOL            pointer_hand                  = FALSE;
  81. static BOOL            pointer_writable              = FALSE;
  82. static BOOL            pointer_menu                  = FALSE;
  83. static BOOL            help_status                   = TRUE;
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90. /* 
  91.  *============================================================================
  92.  *
  93.  * Function for redrawing the window.  This uses wimp_borderwindow ()
  94.  * defined in the "interface.h" library
  95.  *
  96.  *    Parameters :     handle - window handle of window to be redrawn
  97.  *  
  98.  *============================================================================
  99.  */
  100.  
  101. void redraw_window (handle)
  102.      
  103.      wimp_w handle;
  104.      
  105.      {
  106.           BOOL redraw;
  107.           wimp_redrawstr redraw_box;
  108.           
  109.           redraw_box.w = handle;
  110.           wimpt_noerr (wimp_redraw_wind (&redraw_box, &redraw));
  111.           
  112.           while (redraw)
  113.           {
  114.                wimpt_complain (wimp_borderwindow (redraw_box));
  115.                wimp_get_rectangle (&redraw_box, &redraw);
  116.           }
  117.      }
  118.  
  119.  
  120.  
  121.  
  122.                                                      
  123. /* 
  124.  *============================================================================
  125.  *
  126.  * Function for redrawing the info dialogue box
  127.  *
  128.  *    Parameters :     dialogue_box - name of dialogue to be redrawn
  129.  *                     action       - the wimp poll action
  130.  *                     handle       - null
  131.  * 
  132.  *============================================================================
  133.  */
  134.  
  135. BOOL dialogue_raw_event (dialogue_box, action, handle)
  136.      
  137.      dbox dialogue_box;
  138.      wimp_eventstr *action;
  139.      void *handle;
  140.  
  141.      {
  142.  
  143.           switch (action->e)
  144.           {
  145.                case wimp_EREDRAW:
  146.                     redraw_window (action->data.o.w);
  147.                     break;
  148.                     
  149.                case wimp_EOPEN:
  150.                     wimpt_noerr (wimp_open_wind (&action->data.o));
  151.                     break;
  152.                     
  153.                case wimp_ECLOSE:
  154.                     dbox_dispose (&info_dialogue);
  155.           }
  156.  
  157.      return TRUE;
  158.      }
  159.  
  160.  
  161.  
  162.  
  163.  
  164. /* 
  165.  *============================================================================
  166.  *
  167.  * Function to open the about this program dialogue box
  168.  *
  169.  *    Parameters :     None
  170.  * 
  171.  *============================================================================
  172.  */
  173.  
  174. void info_about_program (void)
  175.      {          
  176.           if (info_dialogue = dbox_new ("prog_info"), info_dialogue != NULL)
  177.           {
  178.                dbox_raw_eventhandler (info_dialogue, (dbox_raw_handler_proc) dialogue_raw_event, 0);
  179.                dbox_show (info_dialogue);
  180.                dbox_fillin (info_dialogue);
  181.                dbox_dispose (&info_dialogue);
  182.           }
  183.      }
  184.  
  185.  
  186.  
  187.  
  188.  
  189. /* 
  190.  *============================================================================
  191.  *
  192.  * Function to border and change options of an icon
  193.  *
  194.  *    Parameters :     mouse - a mouse string containing icon, window, etc.
  195.  * 
  196.  *============================================================================
  197.  */
  198.  
  199. void workarea_button (mouse)
  200.  
  201.      wimp_mousestr mouse;
  202.      
  203.      {
  204.          if (mouse.bbits < 5)
  205.           wimpt_complain (wimp_bordericon (mouse));
  206.      }
  207.  
  208.  
  209.  
  210.  
  211.  
  212. /* 
  213.  *============================================================================
  214.  *
  215.  * Function to define a pointer
  216.  *
  217.  *    Parameters :     w_handle       - window handle
  218.  *                     x0             - workarea min x
  219.  *                     y0             - workarea min y
  220.  *                     x1             - workarea max x
  221.  *                     y1             - workarea max y
  222.  *                     pointer_string - string with pointer validation
  223.  * 
  224.  *============================================================================
  225.  */
  226.  
  227. wimp_pointer pointer_info (w_handle, x0, y0, x1, y1, pointer_string)
  228.  
  229.      int  w_handle,
  230.           x0,
  231.           y0,
  232.           x1,
  233.           y1;
  234.      char *pointer_string;
  235.  
  236.      {
  237.           wimp_pointer pointer;
  238.  
  239.           pointer.window_handle    = w_handle;
  240.           pointer.x0               = x0;
  241.           pointer.y0               = y0;
  242.           pointer.x1               = x1;
  243.           pointer.y1               = y1;
  244.           strcpy (pointer.ptr_validation, pointer_string);
  245.           
  246.           return pointer;
  247.      }
  248.  
  249.  
  250.  
  251.  
  252.  
  253. /* 
  254.  *============================================================================
  255.  *
  256.  * Function to switch pointers on and off
  257.  *
  258.  *    Parameters :     mouse - a mouse string containg window, icon, etc.
  259.  * 
  260.  *============================================================================
  261.  */
  262.      
  263. void pointer_handler (mouse)
  264.      
  265.      wimp_mousestr mouse;
  266.  
  267.      {
  268.  
  269.           if (mouse.bbits > 0 && mouse.bbits < 5)
  270.           {
  271.                wimp_pointer pointer_data;
  272.  
  273.                switch (mouse.i)
  274.                {
  275.                     case 2:
  276.                          pointer_data = pointer_info (mouse.w, 25, -80, 580, -228, "ptr_direct,13,7");
  277.  
  278.                          if (pointer_direct)
  279.                               wimpt_complain (wimp_releaseworkareapointer (pointer_data));
  280.                          else
  281.                               wimpt_complain (wimp_setworkareapointer (pointer_data));
  282.  
  283.                          pointer_direct = !pointer_direct;
  284.                          break;
  285.  
  286.                     case 3:
  287.                          pointer_data = pointer_info (mouse.w, 94, -80, 511, -193, "ptr_hand,10,9");
  288.  
  289.                          if (pointer_hand)
  290.                               wimpt_complain (wimp_releaseworkareapointer (pointer_data));
  291.                          else
  292.                               wimpt_complain (wimp_setworkareapointer (pointer_data));
  293.  
  294.                          pointer_hand = !pointer_hand;
  295.                          break;
  296.  
  297.                       case 4:
  298.                          pointer_data = pointer_info (mouse.w, 163, -80, 442, -165, "ptr_write,4,4");
  299.  
  300.                          if (pointer_writable)
  301.                               wimpt_complain (wimp_releaseworkareapointer (pointer_data));
  302.                          else
  303.                               wimpt_complain (wimp_setworkareapointer (pointer_data));
  304.  
  305.                          pointer_writable = !pointer_writable;
  306.                          break;
  307.  
  308.                     case 5:
  309.                          pointer_data = pointer_info (mouse.w, 232, -80, 373, -137, "ptr_menu,6,5");
  310.  
  311.                          if (pointer_menu)
  312.                               wimpt_complain (wimp_releaseworkareapointer (pointer_data));
  313.                          else
  314.                               wimpt_complain (wimp_setworkareapointer (pointer_data));
  315.  
  316.                          pointer_menu = !pointer_menu;
  317.                          break;
  318.  
  319.                     case 6:
  320.                          window_menu = (wimp_menustr *) menu_syshandle (iconbar_menu);
  321.                          wimpt_noerr (wimp_create_menu (window_menu, mouse.x - 64, mouse.y + 28));
  322.                          break;
  323.                }
  324.           }
  325.      }
  326.  
  327.  
  328.  
  329.  
  330.  
  331. /* 
  332.  *============================================================================
  333.  *
  334.  * Function to remove any pointers left once the window is deleted
  335.  *
  336.  *    Parameters :     None
  337.  * 
  338.  *============================================================================
  339.  */
  340.  
  341. void remove_any_pointers (void)
  342.      {
  343.      
  344.      wimp_pointer pointer_data;
  345.  
  346.  
  347.                pointer_data = pointer_info (main_window, 0, 0, 0, 0, "");
  348.                wimpt_complain (wimp_releaseworkareapointer (pointer_data));
  349.  
  350.                pointer_direct    = FALSE;
  351.                pointer_hand      = FALSE;
  352.                pointer_writable  = FALSE;
  353.                pointer_direct    = FALSE;
  354.      }
  355.  
  356.  
  357.  
  358.  
  359.  
  360. /* 
  361.  *============================================================================
  362.  *
  363.  * Function to close and delete the window and tidy up
  364.  *
  365.  *    Parameters :     window - window handle to delete 
  366.  * 
  367.  *============================================================================
  368.  */
  369.  
  370. void close_window (window)
  371.      
  372.      wimp_w window;
  373.  
  374.      {
  375.           wimpt_noerr (wimp_close_wind (window));
  376.  
  377.           if (interface_window_onscreen == 2)
  378.                remove_any_pointers ();
  379.  
  380.           wimpt_noerr (wimp_delete_wind (main_window));
  381.           win_claim_idle_events ((wimp_w) -1);
  382.           interface_window_onscreen = 0;
  383.      }
  384.  
  385.  
  386.  
  387.  
  388.  
  389. /* 
  390.  *============================================================================
  391.  *
  392.  * Function to handle button presses on the boxes window
  393.  *
  394.  *    Parameters :     mouse - a mouse string, which is used to determine
  395.  *                             what action to take
  396.  * 
  397.  *============================================================================
  398.  */
  399.  
  400. void boxes_handler (mouse)
  401.  
  402.      wimp_mousestr mouse;
  403.  
  404.      {
  405.           int time;
  406.  
  407.           switch (mouse.i)
  408.           {
  409.                case 10:
  410.                     help_status = !help_status;
  411.                     menu_setflags (operation_menu, operations_help, help_status, 0);
  412.                     mouse.bbits = 0;
  413.                     workarea_button (mouse);
  414.                     break;
  415.  
  416.                case 11:
  417.                     {
  418.                          int button_state;
  419.  
  420.                          visdelay_begin ();
  421.  
  422.                          for (time = 0; time < 1000000; time ++)
  423.                               time = time;
  424.                          visdelay_end ();
  425.  
  426.                          button_state = mouse.bbits;
  427.                          mouse.bbits = 0;
  428.                          workarea_button (mouse);
  429.  
  430.                          if (button_state != 1)
  431.                               close_window (mouse.w);
  432.                     }
  433.                     break;              
  434.       
  435.                case 12:
  436.                     mouse.bbits = 0;
  437.                     workarea_button (mouse);
  438.                     close_window (mouse.w);
  439.                     break;
  440.           }
  441.      }
  442.  
  443.  
  444.  
  445.  
  446.  
  447. /* 
  448.  *============================================================================
  449.  *
  450.  * Function to handle any wimp poll functions to do with the main window
  451.  *
  452.  *    Parameters :     action - wimp poll action
  453.  *                     handle - null
  454.  * 
  455.  *============================================================================
  456.  */
  457.  
  458. void main_event_handler (action, handle)
  459.      
  460.      wimp_eventstr *action;
  461.      void *handle;
  462.      
  463.      {
  464.           wimpt_complain (wimp_pollpointer (action->e));
  465.  
  466.           switch (action->e)
  467.           {
  468.                case wimp_EREDRAW:
  469.                     redraw_window (action->data.o.w);
  470.                     break;
  471.  
  472.                case wimp_EOPEN:
  473.                     wimpt_noerr (wimp_open_wind (&action->data.o));
  474.                     break;
  475.  
  476.                case wimp_ECLOSE:
  477.                     close_window (action->data.o.w);
  478.                     break;
  479.  
  480.                case wimp_EBUT:
  481.                     if (action->data.but.m.bbits != 2 | interface_window_onscreen == operations_pointers)
  482.                     {                                                                                    
  483.                          workarea_button (action->data.but.m);
  484.  
  485.                          switch (interface_window_onscreen)
  486.                          {
  487.                               case operations_boxes:      
  488.                                    boxes_handler (action->data.but.m);
  489.                                    break;
  490.  
  491.                               case operations_pointers:
  492.                                    pointer_handler (action->data.but.m);
  493.                                    action->data.but.m.bbits = 0;
  494.                                    workarea_button (action->data.but.m);
  495.                                    break;         
  496.  
  497.                               case operations_misc:
  498.                                    action->data.but.m.bbits = 0;
  499.                                    workarea_button (action->data.but.m);
  500.                                    break;
  501.                          }
  502.                     }
  503.                     break;
  504.  
  505.                case wimp_ESEND:
  506.                case wimp_ESENDWANTACK:
  507.  
  508.                     switch (action->data.msg.hdr.action)
  509.                     {
  510.                          case wimp_MHELPREQUEST:
  511.  
  512.                               if (help_status == TRUE)
  513.                                   wimpt_noerr (wimp_sendhelp (&action->data.msg.hdr));
  514.  
  515.                               break;
  516.                     }
  517.                     break;                             
  518.           }
  519.      }
  520.  
  521.  
  522.  
  523.  
  524.  
  525. /* 
  526.  *============================================================================
  527.  *
  528.  * Function to create a window
  529.  *
  530.  *    Parameters :     name          - name of window to create
  531.  *                     window_handle - variable to place the created 
  532.  *                                     windows handle in
  533.  *
  534.  *    Returns    :     TRUE is successful
  535.  *
  536.  * 
  537.  *============================================================================
  538.  */
  539.  
  540. BOOL wimp_create_window (name, window_handle)
  541.      
  542.      char *name;
  543.      wimp_w *window_handle;
  544.  
  545.      {
  546.           wimp_wind *window;
  547.           
  548.           window = template_syshandle (name);
  549.           if (window == 0)
  550.              return FALSE;
  551.  
  552.           return (wimpt_complain (wimp_create_wind (window, window_handle)) == 0);          
  553.      }
  554.  
  555.  
  556.  
  557.  
  558.  
  559. /* 
  560.  *============================================================================
  561.  *
  562.  * Function to build a string containg current settings
  563.  *
  564.  *    Parameters :     None
  565.  * 
  566.  *============================================================================
  567.  */
  568.  
  569. void operation_menu_status (void)
  570.      {
  571.           switch (interface_window)
  572.           {
  573.                case 1:
  574.                     strcpy (current_status, "Boxes, ");
  575.                     break;
  576.  
  577.                case 2:
  578.                     strcpy (current_status, "Pointers, ");
  579.                     break;
  580.  
  581.                case 3:
  582.                     strcpy (current_status, "Miscellaneous, ");
  583.                     break;
  584.           }
  585.           
  586.           if (help_status == TRUE)
  587.                strcat (current_status, "help switched on");
  588.           else
  589.                strcat (current_status, "help switched off");
  590.  
  591.           if (interface_window_onscreen == 2)
  592.           {
  593.                wimp_icon  writable_icon;
  594.                
  595.                wimpt_noerr (wimp_get_icon_info (main_window, 7, &writable_icon));
  596.                strcpy (writable_icon.data.indirecttext.buffer, current_status);
  597.                wimpt_noerr (wimp_set_icon_state (main_window, 7, 0, 0));
  598.           }                                                             
  599.      }
  600.  
  601.  
  602.  
  603.  
  604.  
  605. /* 
  606.  *============================================================================
  607.  *
  608.  * Function called when a click on the icon is received
  609.  *
  610.  *    Parameters :     None
  611.  * 
  612.  *============================================================================
  613.  */
  614.  
  615. void iconbar_click (icon)
  616.  
  617.      wimp_i icon;
  618.  
  619.      {
  620.           if (interface_window_onscreen == TRUE)
  621.                werr (FALSE, "Only one window may be viewed");
  622.           else
  623.           {
  624.                wimp_wstate state;
  625.                char *window_design = "............";
  626.              
  627.                switch (interface_window)
  628.                {
  629.                     case operations_boxes:
  630.                          window_design = "boxes";
  631.                          break;
  632.  
  633.                     case operations_pointers:
  634.                          window_design = "pointers";
  635.                          break;         
  636.  
  637.                     case operations_misc:
  638.                          window_design = "misc";
  639.                          break;
  640.                }
  641.  
  642.                if (wimp_create_window (window_design, &main_window));
  643.                {
  644.                     win_register_event_handler (main_window, main_event_handler, 0);
  645.                     win_claim_idle_events (main_window);
  646.                     win_claim_unknown_events (main_window);
  647.                     interface_window_onscreen = interface_window;
  648.  
  649.                     if (interface_window == 2)
  650.                          operation_menu_status ();
  651.  
  652.                     if (wimpt_complain (wimp_get_wind_state (main_window, &state)) == 0);
  653.                     {
  654.                          state.o.behind = -1;
  655.                          wimpt_noerr (wimp_open_wind (&state.o));
  656.                     }
  657.                }
  658.           }
  659.      }
  660.  
  661.  
  662.  
  663.  
  664.  
  665. /* 
  666.  *============================================================================
  667.  *
  668.  * Function to handle selection on menu
  669.  *
  670.  *    Parameters :     handle - null
  671.  *                     hit    - menu entry selected
  672.  * 
  673.  *============================================================================
  674.  */
  675.  
  676. void iconbar_menu_selection (handle, hit)
  677.      
  678.      void *handle;
  679.      char *hit;
  680.  
  681.      {
  682.           switch (hit [0])
  683.           {
  684.                case iconbar_info:
  685.                     info_about_program ();
  686.                     break;
  687.                  
  688.                case iconbar_operations:
  689.                     switch (hit [1])
  690.                     {
  691.                          case operations_help:
  692.                               help_status = !help_status;
  693.                               menu_setflags (operation_menu, operations_help, help_status, 0);
  694.                               break;
  695.  
  696.                          case operations_boxes:   
  697.                          case operations_pointers:    
  698.                          case operations_misc:   
  699.                               menu_setflags (operation_menu, interface_window, 0, 0);
  700.                               menu_setflags (operation_menu, hit [1], 1, 0);
  701.                               interface_window = hit [1];
  702.                               break;
  703.                     }
  704.                     operation_menu_status ();
  705.                     break;
  706.  
  707.                case iconbar_quit:
  708.                     exit (0);
  709.           }
  710.      }
  711.  
  712.  
  713.  
  714.  
  715.  
  716. /* 
  717.  *============================================================================
  718.  *
  719.  * Function to initialise application
  720.  *
  721.  *    Parameters :     None
  722.  *
  723.  *    Returns :        TRUE if all went well                    
  724.  * 
  725.  *============================================================================
  726.  */
  727.  
  728. BOOL initialise_application (void)
  729.      {
  730.           wimpt_init ("Interface");
  731.           res_init ("Interface");
  732.           resspr_init ();
  733.           template_init ();
  734.           dbox_init ();
  735.           visdelay_init ();
  736.  
  737.           baricon ("!Interface", (int) resspr_area (), iconbar_click);
  738.           iconbar_menu = menu_new ("Interface", ">Info, Operations, Quit");
  739.           operation_menu = menu_new ("Operations", "!Boxes, Pointers, Misc|!Help");
  740.           menu_submenu (iconbar_menu, 2, operation_menu);
  741.  
  742.           if (! event_attachmenu (win_ICONBAR, iconbar_menu, iconbar_menu_selection, 0))
  743.                return FALSE;
  744.    
  745.           wimpt_complain (wimp_claiminterface ());
  746.           return TRUE;
  747.      }
  748.  
  749.  
  750.  
  751.  
  752.  
  753. /* 
  754.  *============================================================================
  755.  *
  756.  * Main control of the program
  757.  *
  758.  *    Parameters :     None
  759.  *
  760.  *============================================================================
  761.  */
  762.  
  763. int main (void)
  764.      {
  765.           if (atexit ((void *) wimp_releaseinterface))
  766.                return 0;
  767.  
  768.           if (! initialise_application ())
  769.                return 0;
  770.  
  771.           event_setmask(event_getmask() & ~wimp_EMNULL);
  772.  
  773.           while (TRUE)
  774.                event_process ();
  775.  
  776.           return 0;
  777.      }
  778.          
  779.  
  780.  
  781.  
  782.  
  783.