home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 106 / EnigmaAmiga106CD.iso / software / sviluppo / ahisrc / ahi / gui_bgui.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-04-22  |  38.1 KB  |  1,273 lines

  1. /*
  2.      AHI - The AHI preferences program
  3.      Copyright (C) 1996-1999 Martin Blom <martin@blom.org>
  4.      
  5.      This program is free software; you can redistribute it and/or
  6.      modify it under the terms of the GNU General Public License
  7.      as published by the Free Software Foundation; either version 2
  8.      of the License, or (at your option) any later version.
  9.      
  10.      This program is distributed in the hope that it will be useful,
  11.      but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.      GNU General Public License for more details.
  14.      
  15.      You should have received a copy of the GNU General Public License
  16.      along with this program; if not, write to the Free Software
  17.      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19.  
  20. /* $Id: gui_bgui.c,v 4.11 1999/04/22 19:41:14 lcs Exp $
  21.  * $Log: gui_bgui.c,v $
  22.  * Revision 4.11  1999/04/22 19:41:14  lcs
  23.  * Removed SAS/C smakefile.
  24.  * I had the copyright date screwed up: Changed to 1996-1999 (which is only
  25.  * partly correct, but still better than 1997-1999....)
  26.  *
  27.  * Revision 4.10  1999/03/28 22:30:44  lcs
  28.  * AHI is now GPL/LGPL software.
  29.  * Make target bindist work correctly when using a separate build directory.
  30.  * Small first steps towards a WarpOS PPC version.
  31.  *
  32.  * Revision 4.9  1999/01/12 02:24:30  lcs
  33.  * *** empty log message ***
  34.  *
  35.  * Revision 4.8  1999/01/09 23:14:08  lcs
  36.  * Switched from SAS/C to gcc
  37.  *
  38.  * Revision 4.7  1997/05/11 16:16:45  lcs
  39.  * Removed leftover rtgbase variable
  40.  *
  41.  * Revision 4.6  1997/05/09 14:02:17  lcs
  42.  * Now uses FindTask("Picasso96") instead of OpenLibrary("rtg.library").
  43.  *
  44.  * Revision 4.5  1997/05/04 02:33:07  lcs
  45.  * Changed name to gui_bgui.c
  46.  *
  47.  * Revision 4.4  1997/04/27 16:16:06  lcs
  48.  * Added "Mastervolume with(out) clipping".
  49.  *
  50.  * Revision 4.3  1997/04/09 03:00:06  lcs
  51.  * Fixed globaloptions and "Restore"
  52.  *
  53.  * Revision 4.2  1997/04/07 01:36:51  lcs
  54.  * Localized it, bug fixes
  55.  *
  56.  */
  57.  
  58. //#define NO_INLINE_STDARG
  59.  
  60. #include <config.h>
  61. #include <CompilerSpecific.h>
  62.  
  63. #include <libraries/asl.h>
  64. #include <libraries/bgui.h>
  65. #include <libraries/bgui_macros.h>
  66. #include <proto/bgui.h>
  67. #include <proto/exec.h>
  68. #include <proto/dos.h>
  69. #include <proto/intuition.h>
  70. #include <math.h>
  71. #include <string.h>
  72.  
  73. #include "ahi.h"
  74. #include "ahiprefs_Cat.h"
  75. #include "support.h"
  76. #include "gui.h"
  77.  
  78. static void GUINewSettings(void);
  79. static void GUINewUnit(void);
  80. static void GUINewMode(void);
  81.  
  82.  
  83. enum windowIDs {
  84.   WINID_MAIN=1,
  85.   WINID_COUNT
  86. };
  87.  
  88. enum actionIDs {
  89.   ACTID_OPEN=1, ACTID_SAVEAS, ACTID_ABOUT, ACTID_QUIT,
  90.   ACTID_DEFAULT, ACTID_LASTSAVED, ACTID_RESTORE,
  91.   ACTID_ICONS,
  92.   ACTID_HELP, ACTID_GUIDE, ACTID_HELPINDEX,
  93.   ACTID_SAVE, ACTID_USE,
  94.  
  95.   ACTID_TABS, ACTID_PAGE,
  96.  
  97.   ACTID_UNIT, ACTID_MODE, 
  98.   SHOWID_MODE,
  99.  
  100.   ACTID_FREQ, ACTID_CHANNELS, ACTID_OUTVOL, ACTID_MONVOL, ACTID_GAIN,
  101.   ACTID_INPUT, ACTID_OUTPUT,
  102.   SHOWID_FREQ, SHOWID_CHANNELS, SHOWID_OUTVOL, SHOWID_MONVOL, SHOWID_GAIN,
  103.   SHOWID_INPUT, SHOWID_OUTPUT,
  104.  
  105.   ACTID_DEBUG, ACTID_SURROUND, ACTID_ECHO, ACTID_CLIPMV,
  106.   ACTID_CPULIMIT, SHOWID_CPULIMIT,
  107.   
  108.  
  109.   ACTID_COUNT
  110. };
  111.  
  112. #define ItCk(t,s,i,f) { NM_ITEM, t, s, f, 0, (APTR)i }
  113. #define HelpNode(n) BT_HelpFile, HELPFILE, BT_HelpNode, n
  114.  
  115. struct Library       *BGUIBase  = NULL;
  116. static struct Window *window    = NULL;
  117. static Object        *WO_Window = NULL;
  118. static Object        *Window_Objs[ACTID_COUNT];
  119. static Object        *openreq   = NULL;
  120. static Object        *savereq   = NULL;
  121. static Object        *vgroup    = NULL;  // To replace the unit cycle gadget
  122. struct TR_Project *Project = NULL;
  123.  
  124. static BOOL PopUpMenus = TRUE;         // Turn cycle gadgets into popup menus?
  125.  
  126. static const struct TagItem  pagemap[] = {
  127.   { MX_Active, PAGE_Active },
  128.   { TAG_END, NULL }
  129. };
  130.  
  131. static ULONG cpumap[] = { SLIDER_Level,  INDIC_Level, TAG_END };
  132.  
  133. static struct NewMenu Menus[] = {
  134.   Title( NULL /* Project */ ),
  135.     Item( NULL /* Open... */,             NULL, ACTID_OPEN      ),
  136.     Item( NULL /* Save As... */,          NULL, ACTID_SAVEAS    ),
  137.     ItemBar,
  138.     Item( NULL /* About... */,            NULL, ACTID_ABOUT     ),
  139.     ItemBar,
  140.     Item( NULL /* Quit */,                NULL, ACTID_QUIT      ),
  141.   Title( NULL /* Edit */ ),
  142.     Item( NULL /* Reset To Defaults */,   NULL, ACTID_DEFAULT   ),
  143.     Item( NULL /* Last Saved */,          NULL, ACTID_LASTSAVED ),
  144.     Item( NULL /* Restore */,             NULL, ACTID_RESTORE   ),
  145.   Title( NULL /* Settings */ ),
  146.     ItCk( NULL /* Create Icons? */,       NULL, ACTID_ICONS, CHECKIT|MENUTOGGLE ),
  147.   Title( NULL /* Help */ ),
  148.     ItCk( NULL /* Help... */,             NULL, ACTID_HELP, COMMSEQ),
  149.     ItemBar,
  150.     Item( NULL /* AHI User's guide... */, NULL, ACTID_GUIDE),
  151.     Item( NULL /* Concept Index... */,    NULL, ACTID_HELPINDEX ),
  152.   End
  153. };
  154.  
  155. static char *PageNames[] =
  156. {
  157.     NULL,  /* Mode settings */
  158.     NULL,  /* Advanced settings */
  159.     NULL
  160. };
  161.  
  162. static char * DebugLabels[] = {
  163.   NULL,  /* None */
  164.   NULL,  /* Low */
  165.   NULL,  /* High */
  166.   NULL,  /* Full */
  167.   NULL
  168. };
  169.  
  170. static char * EchoLabels[] = {
  171.   NULL,  /* Enabled */
  172.   NULL,  /* Fast */
  173.   NULL,  /* Disabled */
  174.   NULL
  175. };
  176.  
  177. static char * SurroundLabels[] = {
  178.   NULL,  /* Enabled */
  179.   NULL,  /* Disabled */
  180.   NULL
  181. };
  182.  
  183. static char * ClipMVLabels[] = {
  184.   NULL,  /* Without clipping */
  185.   NULL,  /* With clipping */
  186.   NULL
  187. };
  188.  
  189. /***** Local function to update the strings above ****************************/
  190.  
  191. static void UpdateStrings(void) {
  192.   char ** strings[] =
  193.   {
  194.     (char**) &msgMenuProject,
  195.     (char**) &msgItemOpen,
  196.     (char**) &msgItemSaveAs,
  197.     (char**) &msgItemAbout,
  198.     (char**) &msgItemQuit,
  199.     (char**) &msgMenuEdit,
  200.     (char**) &msgItemDefaults,
  201.     (char**) &msgItemLastSaved,
  202.     (char**) &msgItemRestore,
  203.     (char**) &msgMenuSettings,
  204.     (char**) &msgItemCreateIcons,
  205.     (char**) &msgMenuHelp,
  206.     (char**) &msgItemHelp,
  207.     (char**) &msgItemUsersGuide,
  208.     (char**) &msgItemConceptIndex
  209.   };
  210.  
  211.   struct NewMenu   *menuptr;
  212.   char           ***stringptr;
  213.   
  214.   menuptr   = (struct NewMenu *) &Menus;
  215.   stringptr = (char ***) &strings;
  216.  
  217.   while(menuptr->nm_Type != NM_END)
  218.   {
  219.     if(menuptr->nm_Label == NULL)
  220.     {
  221.       if(strlen(**stringptr) != 0) {
  222.         menuptr->nm_CommKey = **stringptr;
  223.       }
  224.       menuptr->nm_Label = **stringptr + strlen(**stringptr) + 1;
  225.       stringptr++;
  226.     }
  227.     menuptr++;
  228.   }
  229.  
  230.  
  231.   PageNames[0] = (char *) msgPageMode;
  232.   PageNames[1] = (char *) msgPageAdvanced;
  233.   DebugLabels[0] = (char *) msgDebugNone;
  234.   DebugLabels[1] = (char *) msgDebugLow;
  235.   DebugLabels[2] = (char *) msgDebugHigh;
  236.   DebugLabels[3] = (char *) msgDebugFull;
  237.   EchoLabels[0] = (char *) msgEchoEnabled;
  238.   EchoLabels[1] = (char *) msgEchoFast;
  239.   EchoLabels[2] = (char *) msgEchoDisabled;
  240.   SurroundLabels[0] = (char *) msgSurroundEnabled;
  241.   SurroundLabels[1] = (char *) msgSurroundDisabled;
  242.   ClipMVLabels[0] = (char *) msgMVNoClip;
  243.   ClipMVLabels[1] = (char *) msgMVClip;
  244.  
  245. }
  246.  
  247. /***** Local function to update a slider indicator ***************************/
  248.  
  249. static void UpdateSliderLevel(int src, int dst, LONG *index, char * (*func)(void)) {
  250.   if(GetAttr( SLIDER_Level, Window_Objs[src], (ULONG *) index)) {
  251.     SetGadgetAttrs((struct Gadget *) Window_Objs[dst],
  252.         window, NULL,
  253.         INFO_TextFormat, (ULONG) (*(func))(), 
  254.         TAG_DONE );
  255.   }
  256. }
  257.  
  258. /***** Local function to find a menu item ************************************/
  259.  
  260. static struct MenuItem *FindMenuItem(ULONG id) {
  261.   struct Menu     *menu = NULL;
  262.   struct MenuItem *item;
  263.  
  264.   GetAttr( WINDOW_MenuStrip, WO_Window, (ULONG *) &menu);
  265.   while(menu) {
  266.     for(item = menu->FirstItem; item; item = item->NextItem) {
  267.       if(GTMENUITEM_USERDATA(item) == (APTR) id) {
  268.         return item;
  269.       }
  270.     }
  271.     menu = menu->NextMenu;
  272.   }
  273.  
  274.   return NULL;
  275. }
  276.  
  277. /***** Local function to update the unit gadget (and everything below) *******/
  278.  
  279. static void GUINewSettings(void) {
  280.   Object *oldcycle;
  281.   Object *cycle = CycleObject,
  282.       CYC_Labels,    Units,
  283.       CYC_Active,    state.UnitSelected,
  284.       CYC_PopActive, PopUpMenus,
  285.       CYC_Popup,     PopUpMenus,
  286.       GA_ID,         ACTID_UNIT,
  287.   EndObject;
  288.  
  289.   if(cycle) {
  290.     oldcycle = (Object *) DoMethod( vgroup, GRM_REPLACEMEMBER,
  291.       Window_Objs[ACTID_UNIT], cycle, FixMinHeight, TAG_DONE);
  292.     if(oldcycle) {
  293.       DisposeObject(oldcycle);
  294.       Window_Objs[ACTID_UNIT] = cycle;
  295.     }
  296.     else {
  297.       DisposeObject(cycle);
  298.     }
  299.   }
  300.  
  301.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_DEBUG], window, NULL,
  302.       CYC_Active, globalprefs.ahigp_DebugLevel, TAG_DONE);
  303.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_SURROUND], window, NULL,
  304.       CYC_Active, globalprefs.ahigp_DisableSurround, TAG_DONE);
  305.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_ECHO], window, NULL,
  306.       CYC_Active, (globalprefs.ahigp_DisableEcho ? 2 : 0) | 
  307.                   (globalprefs.ahigp_FastEcho    ? 1 : 0),     TAG_DONE);
  308.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_CLIPMV], window, NULL,
  309.       CYC_Active, globalprefs.ahigp_ClipMasterVolume, TAG_DONE);
  310.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_CPULIMIT], window, NULL,
  311.       SLIDER_Level, (globalprefs.ahigp_MaxCPU * 100 + 32768) >> 16, TAG_DONE);
  312.  
  313.   GUINewUnit();
  314. }
  315.  
  316. /***** Local function to update all gadgets that depend on the unit **********/
  317.  
  318. static void GUINewUnit(void) {
  319.   DoMethod( Window_Objs[ACTID_MODE], LVM_CLEAR, NULL );
  320.   DoMethod( Window_Objs[ACTID_MODE], LVM_ADDENTRIES, NULL, Modes, LVAP_HEAD);
  321.   BGUI_DoGadgetMethod( Window_Objs[ACTID_MODE], window, NULL,
  322.     LVM_REFRESH );
  323.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MODE], window, NULL,
  324.     LISTV_Select,      state.ModeSelected,
  325.     TAG_DONE );
  326.   GUINewMode();
  327. }
  328.  
  329. /***** Local function to update all gadgets that depend on the mode **********/
  330.  
  331. static char *infoargs[6];
  332.  
  333. static void GUINewMode(void) {
  334.   int Max, Sel;
  335.  
  336.   infoargs[0] = (char *) getAudioMode();
  337.   infoargs[1] = getRecord();
  338.   infoargs[2] = getAuthor();
  339.   infoargs[3] = getCopyright();
  340.   infoargs[4] = getDriver();
  341.   infoargs[5] = getVersion();
  342.  
  343.   SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_MODE], window, NULL,
  344.       INFO_TextFormat, (ULONG) "0x%08lx\n"
  345.                        "%s\n"
  346.                        "%s\n"
  347.                        "%s\n"
  348.                        "Devs:AHI/%s.audio\n"
  349.                        "%s",
  350.       INFO_Args,       (ULONG) &infoargs,
  351.       TAG_DONE );
  352.  
  353.   Max = max(state.Frequencies -1, 0);
  354.   Sel = min(Max, state.FreqSelected);
  355.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_FREQ], window, NULL,
  356.       SLIDER_Min,   0,
  357.       SLIDER_Max,   Max,
  358.       SLIDER_Level, Sel,
  359.       GA_Disabled,  (Max == 0),
  360.       TAG_DONE );
  361.   Max = max(state.Channels, 0);
  362.   Sel = min(Max, state.ChannelsSelected);
  363.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_CHANNELS], window, NULL,
  364.       SLIDER_Min,   1,
  365.       SLIDER_Max,   Max,
  366.       SLIDER_Level, Sel,
  367.       GA_Disabled,  (Max == 1) || state.ChannelsDisabled,
  368.       TAG_DONE );
  369.   Max = max(state.OutVols -1, 0);
  370.   Sel = min(Max, state.OutVolSelected);
  371.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_OUTVOL], window, NULL,
  372.       SLIDER_Min,   0,
  373.       SLIDER_Max,   Max,
  374.       SLIDER_Level, Sel,
  375.       GA_Disabled,  (Max == 0),
  376.       TAG_DONE );
  377.   Max = max(state.MonVols -1, 0);
  378.   Sel = min(Max, state.MonVolSelected);
  379.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MONVOL], window, NULL,
  380.       SLIDER_Min,   0,
  381.       SLIDER_Max,   Max,
  382.       SLIDER_Level, Sel,
  383.       GA_Disabled,  (Max == 0),
  384.       TAG_DONE );
  385.   Max = max(state.Gains -1, 0);
  386.   Sel = min(Max, state.GainSelected);
  387.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_GAIN], window, NULL,
  388.       SLIDER_Min,   0,
  389.       SLIDER_Max,   Max,
  390.       SLIDER_Level, Sel,
  391.       GA_Disabled,  (Max == 0),
  392.       TAG_DONE );
  393.   Max = max(state.Inputs -1, 0);
  394.   Sel = min(Max, state.InputSelected);
  395.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_INPUT], window, NULL,
  396.       SLIDER_Min,   0,
  397.       SLIDER_Max,   Max,
  398.       SLIDER_Level, Sel,
  399.       GA_Disabled,  (Max == 0),
  400.       TAG_DONE );
  401.   Max = max(state.Outputs -1, 0);
  402.   Sel = min(Max, state.OutputSelected);
  403.   SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_OUTPUT], window, NULL,
  404.       SLIDER_Min,   0,
  405.       SLIDER_Max,   Max,
  406.       SLIDER_Level, Sel,
  407.       GA_Disabled,  (Max == 0),
  408.       TAG_DONE );
  409.  
  410.     // Update indicators..
  411.  
  412.     SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_FREQ], window, NULL,
  413.         INFO_TextFormat, (ULONG) getFreq(), TAG_DONE );
  414.  
  415.     SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_CHANNELS], window, NULL,
  416.         INFO_TextFormat, (ULONG) getChannels(), TAG_DONE );
  417.  
  418.     SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_OUTVOL], window, NULL,
  419.         INFO_TextFormat, (ULONG) getOutVol(), TAG_DONE );
  420.  
  421.     SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_MONVOL], window, NULL,
  422.         INFO_TextFormat, (ULONG) getMonVol(), TAG_DONE );
  423.  
  424.     SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_GAIN], window, NULL,
  425.         INFO_TextFormat, (ULONG) getGain(), TAG_DONE );
  426.  
  427.     SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_INPUT], window, NULL,
  428.         INFO_TextFormat, (ULONG) getInput(), TAG_DONE );
  429.  
  430.     SetGadgetAttrs((struct Gadget *) Window_Objs[SHOWID_OUTPUT], window, NULL,
  431.         INFO_TextFormat, (ULONG) getOutput(), TAG_DONE );
  432.  
  433. }
  434.  
  435. /***** Gadget hook ***********************************************************/
  436.  
  437. static ULONG HOOKCALL
  438. GadgetHookFunc( REG( a0, struct Hook *hook ),
  439.                 REG( a2, Object *obj ),
  440.                 REG( a1, struct opUpdate *opu ) ) {
  441.  
  442.   if(obj == Window_Objs[ ACTID_FREQ] ) {
  443.     UpdateSliderLevel(ACTID_FREQ, SHOWID_FREQ,
  444.         &state.FreqSelected, getFreq);
  445.   }
  446.  
  447.   else if(obj == Window_Objs[ ACTID_CHANNELS] ) {
  448.     UpdateSliderLevel(ACTID_CHANNELS, SHOWID_CHANNELS,
  449.         &state.ChannelsSelected, getChannels);
  450.   }
  451.  
  452.   else if(obj == Window_Objs[ ACTID_OUTVOL] ) {
  453.     UpdateSliderLevel(ACTID_OUTVOL, SHOWID_OUTVOL,
  454.         &state.OutVolSelected, getOutVol);
  455.   }
  456.  
  457.   else if(obj == Window_Objs[ ACTID_MONVOL] ) {
  458.     UpdateSliderLevel(ACTID_MONVOL, SHOWID_MONVOL,
  459.         &state.MonVolSelected, getMonVol);
  460.   }
  461.  
  462.   else if(obj == Window_Objs[ ACTID_GAIN] ) {
  463.     UpdateSliderLevel(ACTID_GAIN, SHOWID_GAIN,
  464.         &state.GainSelected, getGain);
  465.   }
  466.  
  467.   else if(obj == Window_Objs[ ACTID_INPUT] ) {
  468.     UpdateSliderLevel(ACTID_INPUT, SHOWID_INPUT,
  469.         &state.InputSelected, getInput);
  470.   }
  471.  
  472.   else if(obj == Window_Objs[ ACTID_OUTPUT] ) {
  473.     UpdateSliderLevel(ACTID_OUTPUT, SHOWID_OUTPUT,
  474.         &state.OutputSelected, getOutput);
  475.   }
  476.   else return 0;
  477.  
  478.     return 1;
  479. }
  480.  
  481. static struct Hook GadgetHook =
  482.   { NULL,NULL },
  483.   (HOOKFUNC) GadgetHookFunc,
  484.   NULL,
  485.   NULL
  486. };
  487.  
  488. static void HOOKCALL
  489. IDCMPhookFunc( REG( a0, struct Hook *hook ),
  490.                REG( a2, Object *obj ),
  491.                REG( a1, struct IntuiMessage *msg) )
  492. {
  493.   switch(msg->Code) {
  494.  
  495.     case 0x42:
  496.     {
  497.       /*
  498.       **      TAB             - Next page
  499.       **      SHIFT + TAB     - Prev page
  500.       */
  501.       ULONG          pos = 0;
  502.  
  503.       GetAttr( MX_Active,  Window_Objs[ACTID_TABS], &pos );
  504.  
  505.       if ( msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  506.         pos--;
  507.       else 
  508.         pos++;
  509.       SetGadgetAttrs(( struct Gadget * ) Window_Objs[ACTID_TABS], window, NULL,
  510.           MX_Active, pos, TAG_END );
  511.       break;
  512.     }
  513.  
  514.     case 0x4C:
  515.     {
  516.       /*
  517.       **      UP              - Move entry up.
  518.       **      SHIFT + UP      - Move page up.
  519.       **      CTRL + UP       - Move to the top.
  520.       **/
  521.       ULONG mode = 0;
  522.  
  523.       if(msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  524.         SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MODE], window, NULL,
  525.             LISTV_Select, LISTV_Select_Page_Up, TAG_END );
  526.       else if(msg->Qualifier & IEQUALIFIER_CONTROL )
  527.         SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MODE], window, NULL,
  528.             LISTV_Select, LISTV_Select_First, TAG_END );
  529.       else
  530.         SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MODE], window, NULL,
  531.             LISTV_Select, LISTV_Select_Previous, TAG_END );
  532.  
  533.       GetAttr( LISTV_LastClickedNum, Window_Objs[ACTID_MODE], &mode);
  534.       FillUnit();
  535.       NewMode(mode);
  536.       GUINewMode();
  537.       break;
  538.     }
  539.  
  540.     case 0x4D:
  541.     {
  542.       /*
  543.       **      DOWN            - Move entry down.
  544.       **      SHIFT + DOWN    - Move page down.
  545.       **      CTRL + DOWN     - Move to the end.
  546.       **/
  547.       ULONG mode = 0;
  548.  
  549.       if(msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  550.         SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MODE], window, NULL,
  551.             LISTV_Select, LISTV_Select_Page_Down, TAG_END );
  552.       else if(msg->Qualifier & IEQUALIFIER_CONTROL )
  553.         SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MODE], window, NULL,
  554.             LISTV_Select, LISTV_Select_Last, TAG_END );
  555.       else
  556.         SetGadgetAttrs((struct Gadget *) Window_Objs[ACTID_MODE], window, NULL,
  557.             LISTV_Select, LISTV_Select_Next, TAG_END );
  558.  
  559.       GetAttr( LISTV_LastClickedNum, Window_Objs[ACTID_MODE], &mode);
  560.       FillUnit();
  561.       NewMode(mode);
  562.       GUINewMode();
  563.       break;
  564.     }
  565.  
  566.     case 0x4f:
  567.     {
  568.       /*
  569.       **      LEFT            - Prev unit
  570.       */
  571.       LONG pos = 0;
  572.       int i;
  573.       char **u = Units;
  574.  
  575.       for(i=0; *u; i++, u++);
  576.  
  577.       GetAttr( CYC_Active,  Window_Objs[ACTID_UNIT], (ULONG *) &pos );
  578.  
  579.       pos = (pos - 1) % i;
  580.       if(pos < 0) pos += i;
  581.  
  582.       SetGadgetAttrs(( struct Gadget * ) Window_Objs[ACTID_UNIT], window, NULL,
  583.           CYC_Active, pos, TAG_END );
  584.  
  585.       GetAttr( CYC_Active, Window_Objs[ACTID_UNIT], (ULONG *) &pos);
  586.       FillUnit();
  587.       NewUnit(pos);
  588.       GUINewUnit();
  589.       break;
  590.     }
  591.  
  592.     case 0x4e:
  593.     {
  594.       /*
  595.       **      RIGHT           - Prev unit
  596.       */
  597.       LONG pos = 0;
  598.       int i;
  599.       char **u = Units;
  600.  
  601.       for(i=0; *u; i++, u++);
  602.  
  603.       GetAttr( CYC_Active,  Window_Objs[ACTID_UNIT], (ULONG *) &pos );
  604.  
  605.       pos = (pos + 1) % i;;
  606.  
  607.       SetGadgetAttrs(( struct Gadget * ) Window_Objs[ACTID_UNIT], window, NULL,
  608.           CYC_Active, pos, TAG_END );
  609.  
  610.       GetAttr( CYC_Active, Window_Objs[ACTID_UNIT], (ULONG *) &pos);
  611.  
  612.       FillUnit();
  613.       NewUnit(pos);
  614.       GUINewUnit();
  615.       break;
  616.     }
  617.  
  618.   }
  619. }
  620.  
  621.  
  622. static struct Hook IDCMPhook =
  623. {
  624.   { NULL, NULL },
  625.   (HOOKFUNC) IDCMPhookFunc,
  626.   NULL,
  627.   NULL
  628. };
  629.  
  630.  
  631. /******************************************************************************
  632. **** Call to open a requester *************************************************
  633. ******************************************************************************/
  634.  
  635. static ULONG Req( UBYTE *gadgets, UBYTE *body, ... ) {
  636.   struct bguiRequest   req = { NULL };
  637.  
  638.   req.br_Title        = (char *) msgTextProgramName;
  639.   req.br_ReqPos       = POS_TOPLEFT;
  640.   req.br_GadgetFormat = gadgets;
  641.   req.br_TextFormat   = body;
  642.   req.br_Flags        = BREQF_LOCKWINDOW | BREQF_AUTO_ASPECT;
  643.  
  644.   return( BGUI_RequestA( window, &req, ( ULONG * )( &body + 1 )));
  645. }
  646.  
  647.  
  648. /******************************************************************************
  649. **** Call to open the window **************************************************
  650. ******************************************************************************/
  651.  
  652.  
  653. BOOL BuildGUI(char *screenname) {
  654.     Object **ar = Window_Objs;
  655.   struct Screen *screen;
  656.   BOOL OptionFrame = FALSE;
  657.   LONG indicatorwidth = 100;
  658.  
  659.   UpdateStrings();
  660.  
  661.   // Kludge for Piccaso 96/BGUI.
  662.   if(FindTask("Picasso96"))
  663.   {
  664.     PopUpMenus = FALSE;
  665.   }
  666.  
  667.   BGUIBase = (void *)OpenLibrary("bgui.library", 41);
  668.   if(BGUIBase == NULL) {
  669.     Printf((char *) msgTextNoOpen, (ULONG) "bgui.library", 41);
  670.     Printf("\n");
  671.     return FALSE;
  672.   }
  673.  
  674.   screen = LockPubScreen(screenname);
  675.  
  676.   indicatorwidth = max(indicatorwidth, 16 * screen->RastPort.Font->tf_XSize);
  677.   if(screen->Height > 240) {
  678.     OptionFrame = TRUE;
  679.   }
  680.  
  681.   WO_Window = WindowObject,
  682.     WINDOW_PubScreen,       screen,
  683.     WINDOW_Title,           (char *) msgTextProgramName,
  684.     WINDOW_CloseGadget,     FALSE,
  685.     WINDOW_MenuStrip,       Menus,
  686.     WINDOW_AutoAspect,      TRUE,
  687.     WINDOW_AutoKeyLabel,    TRUE,
  688.     WINDOW_ScaleWidth,      60,
  689.     WINDOW_ScaleHeight,     20,
  690.     WINDOW_HelpFile,        HELPFILE,
  691.     WINDOW_HelpNode,        "AHI",
  692.     WINDOW_IDCMPHook,      &IDCMPhook,
  693.     WINDOW_IDCMPHookBits,   IDCMP_RAWKEY,
  694.  
  695.     WINDOW_MasterGroup, VGroupObject, NormalOffset,
  696.  
  697. /* TABS */
  698.  
  699.       StartMember, ar[ACTID_TABS] = MxObject,
  700.         MX_Labels, PageNames,
  701.         MX_TabsObject, TRUE,
  702.         GA_ID, ACTID_TABS,
  703.       EndObject, FixMinHeight, EndMember,
  704.  
  705.       StartMember, ar[ACTID_PAGE] = PageObject, NormalSpacing, 
  706.         PAGE_NoBufferRP, TRUE,
  707.  
  708. /* PAGE 1 */
  709.  
  710.         PageMember, HGroupObject, NormalOffset, NormalSpacing, TabAboveFrame,
  711.  
  712.           StartMember, vgroup = VGroupObject, NormalSpacing,
  713.  
  714.             StartMember, ar[ACTID_UNIT] = CycleObject,
  715.               CYC_Labels,    Units,
  716.               CYC_Active,    state.UnitSelected,
  717.               CYC_PopActive, PopUpMenus,
  718.               CYC_Popup,     PopUpMenus,
  719.               GA_ID,         ACTID_UNIT,
  720.             EndObject, FixMinHeight, EndMember,
  721.  
  722.             StartMember, ar[ACTID_MODE] = ListviewObject,
  723. //              LISTV_EntryArray,  Modes,
  724. //              LISTV_Select,      state.ModeSelected,
  725.               PGA_NewLook, TRUE,
  726.               GA_ID, ACTID_MODE,
  727.             EndObject, EndMember,
  728.  
  729.             StartMember, HGroupObject,
  730.               ButtonFrame, FRM_Flags, FRF_RECESSED,
  731.           
  732.               StartMember, InfoObject,
  733.                 INFO_TextFormat,  (char *) msgProperties,
  734.                 INFO_FixTextWidth,TRUE,
  735.                 INFO_MinLines,    6,
  736.               EndObject, FixMinWidth, EndMember,
  737.  
  738.               StartMember, ar[SHOWID_MODE] = InfoObject,
  739.                 INFO_MinLines,   6,
  740.               EndObject,  EndMember,
  741.             EndObject, FixMinHeight, EndMember,
  742.  
  743.           EndObject /* vgroup */, EndMember,
  744.  
  745.           StartMember, VGroupObject, NormalSpacing, 
  746.  
  747.             VarSpace(1),
  748.  
  749.             StartMember, VGroupObject,
  750.               (OptionFrame ? GROUP_HorizOffset : TAG_IGNORE), GRSPACE_NORMAL,
  751.               (OptionFrame ? GROUP_VertOffset  : TAG_IGNORE), GRSPACE_NORMAL,
  752.               (OptionFrame ? GROUP_Spacing     : TAG_IGNORE), GRSPACE_NORMAL,
  753.               (OptionFrame ? FRM_Type          : TAG_IGNORE), FRTYPE_RIDGE,
  754.               (OptionFrame ? FRM_Flags         : TAG_IGNORE), FRF_RECESSED,
  755.               (OptionFrame ? FRM_Title         : TAG_IGNORE), (char *) msgOptions,
  756.  
  757.               StartMember, HGroupObject,
  758.                 StartMember, ar[ACTID_FREQ] = SliderObject,
  759.                   LAB_Label,    (char *) msgOptFrequency,
  760.                   SLIDER_Min,   0,
  761.                   SLIDER_Max,   state.Frequencies -1 ,
  762.                   SLIDER_Level, state.FreqSelected,
  763.                   PGA_NewLook, TRUE,
  764.                   GA_ID, ACTID_FREQ,
  765.                 EndObject, EndMember,
  766.  
  767.                 StartMember, ar[SHOWID_FREQ] = InfoObject,
  768.                   INFO_TextFormat,    getFreq(),
  769.                   INFO_VertOffset,    0,
  770.                 EndObject, FixWidth(indicatorwidth), EndMember,
  771.               EndObject, FixMinHeight, EndMember,
  772.  
  773.               StartMember, HGroupObject,
  774.                 StartMember, ar[ACTID_CHANNELS] = SliderObject,
  775.                   LAB_Label,    (char *) msgOptChannels,
  776.                   SLIDER_Min,   1,
  777.                   SLIDER_Max,   state.Channels,
  778.                   SLIDER_Level, state.ChannelsSelected,
  779.                   PGA_NewLook, TRUE,
  780.                   GA_ID, ACTID_CHANNELS,
  781.                 EndObject, EndMember,
  782.  
  783.                 StartMember, ar[SHOWID_CHANNELS] = InfoObject,
  784.                   INFO_TextFormat,    getChannels(),
  785.                   INFO_VertOffset,    0,
  786.                 EndObject, FixWidth(indicatorwidth), EndMember,
  787.               EndObject, FixMinHeight, EndMember,
  788.  
  789.               StartMember, HGroupObject,
  790.                 StartMember, ar[ACTID_OUTVOL] = SliderObject,
  791.                   LAB_Label,    (char *) msgOptVolume,
  792.                   SLIDER_Min,   0,
  793.                   SLIDER_Max,   state.OutVols-1 ,
  794.                   SLIDER_Level, state.OutVolSelected,
  795.                   PGA_NewLook, TRUE,
  796.                   GA_ID, ACTID_OUTVOL,
  797.                 EndObject, EndMember,
  798.  
  799.                 StartMember, ar[SHOWID_OUTVOL] = InfoObject,
  800.                   INFO_TextFormat,    getOutVol(),
  801.                   INFO_VertOffset,    0,
  802.                 EndObject, FixWidth(indicatorwidth), EndMember,
  803.               EndObject, FixMinHeight, EndMember,
  804.  
  805.               StartMember, HGroupObject,
  806.                 StartMember, ar[ACTID_MONVOL] = SliderObject,
  807.                   LAB_Label,    (char *) msgOptMonitor,
  808.                   SLIDER_Min,   0,
  809.                   SLIDER_Max,   state.MonVols-1 ,
  810.                   SLIDER_Level, state.MonVolSelected,
  811.                   PGA_NewLook, TRUE,
  812.                   GA_ID, ACTID_MONVOL,
  813.                 EndObject, EndMember,
  814.  
  815.                 StartMember, ar[SHOWID_MONVOL] = InfoObject,
  816.                   INFO_TextFormat,    getMonVol(),
  817.                   INFO_VertOffset,    0,
  818.                 EndObject, FixWidth(indicatorwidth), EndMember,
  819.               EndObject, FixMinHeight, EndMember,
  820.  
  821.               StartMember, HGroupObject,
  822.                 StartMember, ar[ACTID_GAIN] = SliderObject,
  823.                   LAB_Label,    (char *) msgOptGain,
  824.                   SLIDER_Min,   0,
  825.                   SLIDER_Max,   state.Gains-1 ,
  826.                   SLIDER_Level, state.GainSelected,
  827.                   PGA_NewLook, TRUE,
  828.                   GA_ID, ACTID_GAIN,
  829.                 EndObject, EndMember,
  830.  
  831.                 StartMember, ar[SHOWID_GAIN] = InfoObject,
  832.                   INFO_TextFormat,    getGain(),
  833.                   INFO_VertOffset,    0,
  834.                 EndObject, FixWidth(indicatorwidth), EndMember,
  835.               EndObject, FixMinHeight, EndMember,
  836.  
  837.               StartMember, HGroupObject,
  838.                 StartMember, ar[ACTID_INPUT] = SliderObject,
  839.                   LAB_Label,    (char *) msgOptInput,
  840.                   SLIDER_Min,   0,
  841.                   SLIDER_Max,   state.Inputs-1 ,
  842.                   SLIDER_Level, state.InputSelected,
  843.                   PGA_NewLook, TRUE,
  844.                   GA_ID, ACTID_INPUT,
  845.                 EndObject, EndMember,
  846.  
  847.                 StartMember, ar[SHOWID_INPUT] = InfoObject,
  848.                   INFO_TextFormat,    getInput(),
  849.                   INFO_VertOffset,    0,
  850.                 EndObject, FixWidth(indicatorwidth), EndMember,
  851.               EndObject, FixMinHeight, EndMember,
  852.  
  853.               StartMember, HGroupObject,
  854.                 StartMember, ar[ACTID_OUTPUT] = SliderObject,
  855.                   LAB_Label,    (char *) msgOptOutput,
  856.                   SLIDER_Min,   0,
  857.                   SLIDER_Max,   state.Outputs-1 ,
  858.                   SLIDER_Level, state.OutputSelected,
  859.                   PGA_NewLook, TRUE,
  860.                   GA_ID, ACTID_OUTPUT,
  861.                 EndObject, EndMember,
  862.  
  863.                 StartMember, ar[SHOWID_OUTPUT] = InfoObject,
  864.                   INFO_TextFormat,    getOutput(),
  865.                   INFO_VertOffset,    0,
  866.                 EndObject, FixWidth(indicatorwidth), EndMember,
  867.               EndObject, FixMinHeight, EndMember,
  868.  
  869.             EndObject /* vgroup "Options" */, FixMinHeight, EndMember,
  870.  
  871.           VarSpace(1),
  872.  
  873.           EndObject /* vgroup */, EndMember,
  874.  
  875.         EndObject, /* (EndMember) page */
  876.  
  877. /* PAGE 2 */
  878.  
  879.         PageMember, HGroupObject, NormalSpacing, TabAboveFrame,
  880.  
  881.           VarSpace(1),
  882.  
  883.           StartMember, VGroupObject, NormalSpacing,
  884.  
  885.             VarSpace(1), 
  886.  
  887.             StartMember, VGroupObject, NormalOffset, NormalSpacing,
  888.               RidgeFrame, FRM_Flags, FRF_RECESSED, FrameTitle((char *) msgGlobalOptions),
  889.  
  890.               StartMember, HGroupObject, NormalSpacing,
  891.               StartMember, VGroupObject, NormalSpacing,
  892.  
  893.               StartMember, ar[ACTID_DEBUG] = CycleObject,
  894.                 LAB_Label,      (char *) msgGlobOptDebugLevel,
  895.                 LAB_Place,      PLACE_LEFT,
  896.                 CYC_Labels,     DebugLabels,
  897.                 CYC_Active,     globalprefs.ahigp_DebugLevel,
  898.                 CYC_PopActive,  PopUpMenus,
  899.                 CYC_Popup,      PopUpMenus,
  900.                 GA_ID,          ACTID_DEBUG,
  901.               EndObject, FixMinHeight, EndMember,
  902.  
  903.               StartMember, ar[ACTID_ECHO] = CycleObject,
  904.                 LAB_Label,      (char *) msgGlobOptEcho,
  905.                 LAB_Place,      PLACE_LEFT,
  906.                 CYC_Labels,     EchoLabels,
  907.                 CYC_Active,     (globalprefs.ahigp_DisableEcho ? 2 : 0) |
  908.                                 (globalprefs.ahigp_FastEcho    ? 1 : 0),
  909.                 CYC_PopActive,  PopUpMenus,
  910.                 CYC_Popup,      PopUpMenus,
  911.                 GA_ID,          ACTID_ECHO,
  912.               EndObject, FixMinHeight, EndMember,
  913.  
  914.               StartMember, ar[ACTID_SURROUND] = CycleObject,
  915.                 LAB_Label,      (char *) msgGlobOptSurround,
  916.                 LAB_Place,      PLACE_LEFT,
  917.                 CYC_Labels,     SurroundLabels,
  918.                 CYC_Active,     globalprefs.ahigp_DisableSurround,
  919.                 GA_ID,          ACTID_SURROUND,
  920.               EndObject, FixMinHeight, EndMember,
  921.  
  922.               StartMember, ar[ACTID_CLIPMV] = CycleObject,
  923.                 LAB_Label,      (char *) msgGlobOptMasterVol,
  924.                 LAB_Place,      PLACE_LEFT,
  925.                 CYC_Labels,     ClipMVLabels,
  926.                 CYC_Active,     globalprefs.ahigp_ClipMasterVolume,
  927.                 GA_ID,          ACTID_CLIPMV,
  928.               EndObject, FixMinHeight, EndMember,
  929.  
  930.               StartMember, ar[ACTID_CPULIMIT] = SliderObject,
  931.                 LAB_Label,    (char *) msgGlobOptCPULimit,
  932.                 SLIDER_Min,   0,
  933.                 SLIDER_Max,   100,
  934.                 SLIDER_Level, (globalprefs.ahigp_MaxCPU * 100 + 32768) >> 16,
  935.                 PGA_NewLook, TRUE,
  936.                 GA_ID, ACTID_CPULIMIT,
  937.               EndObject, EndMember,
  938.  
  939.               EndObject /* vgroup */, EndMember,
  940.  
  941.               StartMember, VGroupObject, NormalSpacing,
  942.  
  943.                 VarSpace(1),
  944.  
  945.                 StartMember, ar[SHOWID_CPULIMIT] = IndicatorObject,\
  946.                   INDIC_Min,              0,
  947.                   INDIC_Max,              100,
  948.                   INDIC_Level,            (globalprefs.ahigp_MaxCPU * 100 + 32768) / 65536,
  949.                   INDIC_Justification,    IDJ_LEFT,
  950.                   INDIC_FormatString,     "%ld%%",
  951.                 EndObject, FixMinWidth, FixMinHeight, EndMember,
  952.  
  953.               EndObject /* vgroup */, EndMember,
  954.               EndObject /* hgroup */, EndMember,
  955.  
  956.             EndObject, FixMinWidth, FixMinHeight, EndMember,
  957.  
  958.             VarSpace(1),
  959.  
  960.           EndObject /* vgroup */ , FixMinWidth, EndMember,
  961.  
  962.           VarSpace(1),
  963.  
  964.         EndObject, /* (EndMember) page */
  965.  
  966.       EndObject /* page */, EndMember,
  967.  
  968.  
  969. /* BUTTONS */
  970.       StartMember, HGroupObject, NormalSpacing, NormalVOffset,
  971.  
  972.         StartMember, ar[ACTID_SAVE] = ButtonObject,
  973.           ButtonFrame,
  974.           LAB_Label, (char *) msgButtonSave,
  975.           GA_ID,     ACTID_SAVE,
  976.         EndObject, EndMember,
  977.  
  978.         StartMember, ar[ACTID_USE] = ButtonObject,
  979.           ButtonFrame,
  980.           LAB_Label, (char *) msgButtonUse,
  981.           GA_ID,     ACTID_USE,
  982.         EndObject, EndMember,
  983.  
  984.         StartMember, ar[ACTID_QUIT] = ButtonObject,
  985.           ButtonFrame,
  986.           LAB_Label, (char *) msgButtonCancel,
  987.           GA_ID,     ACTID_QUIT,
  988.         EndObject, EndMember,
  989.       EndObject, FixMinHeight, EndMember,
  990.     EndObject,
  991.   EndObject;
  992.  
  993.   if(WO_Window) {
  994.     AddMap( ar[ACTID_TABS], ar[ACTID_PAGE], pagemap );
  995.  
  996.     DoMethod( ar[ACTID_FREQ],     BASE_ADDHOOK, &GadgetHook );
  997.     DoMethod( ar[ACTID_CHANNELS], BASE_ADDHOOK, &GadgetHook );
  998.     DoMethod( ar[ACTID_OUTVOL],   BASE_ADDHOOK, &GadgetHook );
  999.     DoMethod( ar[ACTID_MONVOL],   BASE_ADDHOOK, &GadgetHook );
  1000.     DoMethod( ar[ACTID_GAIN],     BASE_ADDHOOK, &GadgetHook );
  1001.     DoMethod( ar[ACTID_INPUT],    BASE_ADDHOOK, &GadgetHook );
  1002.     DoMethod( ar[ACTID_OUTPUT],   BASE_ADDHOOK, &GadgetHook );
  1003.  
  1004.     AddMap( ar[ACTID_CPULIMIT], ar[SHOWID_CPULIMIT], cpumap);
  1005.  
  1006.     window = WindowOpen(WO_Window);
  1007.   }
  1008.  
  1009.   if(screen) {
  1010.     UnlockPubScreen(NULL, screen);
  1011.   }
  1012.  
  1013.   if(window == NULL) {
  1014.     Printf((char *) msgTextNoWindow);
  1015.     Printf("\n");
  1016.     return FALSE;
  1017.   }
  1018.  
  1019.   openreq = FileReqObject,
  1020.     ASLFR_Window,        window,
  1021.     ASLFR_SleepWindow,   TRUE,
  1022.     ASLFR_RejectIcons,   TRUE,
  1023.     ASLFR_InitialDrawer, "SYS:Prefs/Presets",
  1024.   EndObject;
  1025.  
  1026.   savereq = FileReqObject,
  1027.     ASLFR_Window,        window,
  1028.     ASLFR_SleepWindow,   TRUE,
  1029.     ASLFR_RejectIcons,   TRUE,
  1030.     ASLFR_InitialDrawer, "SYS:Prefs/Presets",
  1031.     ASLFR_DoSaveMode,    TRUE,
  1032.   EndObject;
  1033.  
  1034.   if((openreq == NULL) || (savereq == NULL)) {
  1035.     Printf((char *) msgTextNoFileRequester);
  1036.     Printf("\n");
  1037.     return FALSE;
  1038.   }
  1039.  
  1040.   // Update the checkmark for "Create Icons?"
  1041.   {
  1042.     struct Menu     *menu = NULL;
  1043.     struct MenuItem *item;
  1044.  
  1045.     GetAttr( WINDOW_MenuStrip, WO_Window, (ULONG *) &menu);
  1046.     ClearMenuStrip(window);
  1047.  
  1048.     item = FindMenuItem(ACTID_ICONS);
  1049.  
  1050.     if(item) {
  1051.       if(SaveIcons)
  1052.         item->Flags |= CHECKED;
  1053.       else
  1054.         item->Flags &= ~CHECKED;
  1055.     }
  1056.     ResetMenuStrip(window, menu);
  1057.   }
  1058.  
  1059.   GUINewUnit();
  1060.   return TRUE;
  1061. }
  1062.  
  1063.  
  1064. /******************************************************************************
  1065. **** Call to close the window *************************************************
  1066. ******************************************************************************/
  1067.  
  1068. void CloseGUI(void) {
  1069.  
  1070.   if(savereq)
  1071.     DisposeObject(savereq);
  1072.   if(openreq)
  1073.     DisposeObject(openreq);
  1074.  
  1075.   savereq   = NULL;
  1076.   openreq   = NULL;
  1077.  
  1078.   if(WO_Window)
  1079.     DisposeObject(WO_Window);
  1080.  
  1081.   WO_Window = NULL;
  1082.   window    = NULL;
  1083.  
  1084.   if (BGUIBase)
  1085.     CloseLibrary(BGUIBase);
  1086.  
  1087.   BGUIBase = NULL;
  1088. }
  1089.  
  1090.  
  1091.  
  1092. /******************************************************************************
  1093. **** Handles the input events *************************************************
  1094. ******************************************************************************/
  1095.  
  1096. void EventLoop(void) {
  1097.   ULONG signal  = NULL, rc;
  1098.   BOOL  running = TRUE;
  1099.  
  1100.   GetAttr( WINDOW_SigMask, WO_Window, &signal );
  1101.   if(signal) {
  1102.     do {
  1103.       if(Wait(signal | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C ) {
  1104.         running=FALSE;
  1105.       }
  1106.  
  1107.       while (( rc = HandleEvent( WO_Window )) != WMHI_NOMORE ) {
  1108.         switch(rc) {
  1109.  
  1110.           case WMHI_CLOSEWINDOW:
  1111.             running=FALSE;
  1112.             break;
  1113.  
  1114.           case ACTID_OPEN:
  1115.           {
  1116.             if(DoMethod( openreq, FRM_DOREQUEST ) == FRQ_OK) {
  1117.               char *file = NULL;
  1118.  
  1119.               GetAttr( FRQ_Path, openreq, (ULONG *) &file);
  1120.               NewSettings(file);
  1121.               GUINewSettings();
  1122.             }
  1123.             break;
  1124.           }
  1125.  
  1126.           case ACTID_SAVEAS:
  1127.           {
  1128.             FillUnit();
  1129.             if(DoMethod( savereq, FRM_DOREQUEST ) == FRQ_OK) {
  1130.               char *file = NULL;
  1131.  
  1132.               GetAttr( FRQ_Path, savereq, (ULONG *) &file);
  1133.               SaveSettings(file, UnitList);
  1134.               if(SaveIcons) {
  1135.                 WriteIcon(file);
  1136.               }
  1137.             }
  1138.             break;
  1139.           
  1140.           }
  1141.           
  1142.           case ACTID_ABOUT:
  1143.             Req( (char *) msgButtonOK,
  1144.                 (char *) msgTextCopyright,
  1145.                 ISEQ_C,  msgTextProgramName,
  1146.                 "1996-1999 Martin Blom" );
  1147.             break;
  1148.  
  1149.           case ACTID_SAVE:
  1150.             FillUnit();
  1151.             SaveSettings(ENVFILE, UnitList);
  1152.             SaveSettings(ENVARCFILE, UnitList);
  1153.             running=FALSE;
  1154.             break;
  1155.  
  1156.           case ACTID_USE:
  1157.             FillUnit();
  1158.             SaveSettings(ENVFILE, UnitList);
  1159.             running=FALSE;
  1160.             break;
  1161.  
  1162.           case ACTID_QUIT:
  1163.             running=FALSE;
  1164.             break;
  1165.  
  1166.           case ACTID_DEFAULT:
  1167.             NewSettings(NULL);
  1168.             GUINewSettings();
  1169.             break;
  1170.  
  1171.           case ACTID_LASTSAVED:
  1172.             NewSettings(ENVARCFILE);
  1173.             GUINewSettings();
  1174.             break;
  1175.  
  1176.           case ACTID_RESTORE:
  1177.             NewSettings(args.from);
  1178.             GUINewSettings();
  1179.             break;
  1180.  
  1181.           case ACTID_ICONS:
  1182.           {
  1183.             struct MenuItem *item;
  1184.  
  1185.             item = FindMenuItem(ACTID_ICONS);
  1186.  
  1187.             if(item) {
  1188.               if(item->Flags & CHECKED)
  1189.                 SaveIcons = TRUE;
  1190.               else
  1191.                 SaveIcons = FALSE;
  1192.             }
  1193.             break;
  1194.           }
  1195.  
  1196.           case ACTID_HELP: {
  1197.             APTR lock = BGUI_LockWindow(window);
  1198.             if(!BGUI_Help( window, HELPFILE, "AHI", NULL)) {
  1199.               Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE);
  1200.             }
  1201.             BGUI_UnlockWindow(lock);
  1202.             break;
  1203.           }
  1204.  
  1205.           case ACTID_GUIDE: {
  1206.             APTR lock = BGUI_LockWindow(window);
  1207.             if(!BGUI_Help( window, HELPFILE, NULL, NULL)) {
  1208.               Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE);
  1209.             }
  1210.             BGUI_UnlockWindow(lock);
  1211.             break;
  1212.           }
  1213.  
  1214.           case ACTID_HELPINDEX: {
  1215.             APTR lock = BGUI_LockWindow(window);
  1216.             if(!BGUI_Help( window, HELPFILE, "Concept Index", 0)) {
  1217.               Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE);
  1218.             }
  1219.             BGUI_UnlockWindow(lock);
  1220.             break;
  1221.           }
  1222.  
  1223.           case ACTID_UNIT: {
  1224.             ULONG unit;
  1225.  
  1226.             FillUnit();
  1227.             GetAttr( CYC_Active, Window_Objs[rc], &unit);
  1228.             NewUnit(unit);
  1229.             GUINewUnit();
  1230.             break;
  1231.           }
  1232.  
  1233.           case ACTID_MODE: {
  1234.             ULONG mode;
  1235.  
  1236.             FillUnit();
  1237.             GetAttr( LISTV_LastClickedNum, Window_Objs[rc], &mode);
  1238.             NewMode(mode);
  1239.             GUINewMode();
  1240.             break;
  1241.           }
  1242.  
  1243.           case ACTID_DEBUG:
  1244.           case ACTID_SURROUND:
  1245.           case ACTID_ECHO:
  1246.           case ACTID_CPULIMIT:
  1247.           case ACTID_CLIPMV:
  1248.           {
  1249.             ULONG debug = AHI_DEBUG_NONE, surround = FALSE, echo = 0, cpu = 90;
  1250.             ULONG clip = FALSE;
  1251.  
  1252.             GetAttr( CYC_Active,   Window_Objs[ACTID_DEBUG],    &debug);
  1253.             GetAttr( CYC_Active,   Window_Objs[ACTID_SURROUND], &surround);
  1254.             GetAttr( CYC_Active,   Window_Objs[ACTID_ECHO],     &echo);
  1255.             GetAttr( CYC_Active,   Window_Objs[ACTID_CLIPMV],   &clip);
  1256.             GetAttr( SLIDER_Level, Window_Objs[ACTID_CPULIMIT], &cpu);
  1257.  
  1258.             globalprefs.ahigp_DebugLevel      = debug;
  1259.             globalprefs.ahigp_DisableSurround = surround;
  1260.             globalprefs.ahigp_DisableEcho     = (echo == 2);
  1261.             globalprefs.ahigp_FastEcho        = (echo == 1);
  1262.             globalprefs.ahigp_MaxCPU = (cpu << 16) / 100;
  1263.             globalprefs.ahigp_ClipMasterVolume= clip;
  1264.  
  1265.             break;
  1266.           }
  1267.         }
  1268.       }
  1269.     } while(running);
  1270.   }
  1271. }
  1272.