home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 106 / EnigmaAmiga106CD.iso / software / sviluppo / ahisrc / ahi / gui_ca.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-04-22  |  42.2 KB  |  1,461 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_ca.c,v 1.4 1999/04/22 19:41:18 lcs Exp $
  21.  * $Log: gui_ca.c,v $
  22.  * Revision 1.4  1999/04/22 19:41:18  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 1.3  1999/03/28 22:30:46  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 1.2  1999/01/09 23:14:10  lcs
  33.  * Switched from SAS/C to gcc
  34.  *
  35.  * Revision 1.1.1.1  1998/12/20 12:09:27  lcs
  36.  * Import of AHI sources 1998-12-20
  37.  *
  38.  */
  39.  
  40. #define NO_INLINE_STDARG
  41.  
  42. #include <config.h>
  43. #include <CompilerSpecific.h>
  44.  
  45. #include <intuition/icclass.h>
  46. #include <libraries/asl.h>
  47. #include <libraries/gadtools.h>
  48. #include <gadgets/slider.h>
  49. #include <gadgets/layout.h>
  50. #include <classact_macros.h>
  51. #include <proto/exec.h>
  52. #include <proto/dos.h>
  53. #include <proto/gadtools.h>
  54. #include <proto/intuition.h>
  55. #include <proto/slider.h>
  56. #include <math.h>
  57. #include <stdio.h>
  58. #include <string.h>
  59.  
  60. #include "ahi.h"
  61. #include "ahiprefs_Cat.h"
  62. #include "support.h"
  63. #include "gui.h"
  64.  
  65.  
  66. static void GUINewSettings(void);
  67. static void GUINewUnit(void);
  68. static void GUINewMode(void);
  69.  
  70.  
  71. enum windowIDs {
  72.   WINID_MAIN=1,
  73.   WINID_COUNT
  74. };
  75.  
  76. enum actionIDs {
  77.   LAYOUT_PAGE,
  78.   ACTID_OPEN, ACTID_SAVEAS, ACTID_ABOUT, ACTID_QUIT,
  79.   ACTID_DEFAULT, ACTID_LASTSAVED, ACTID_RESTORE,
  80.   ACTID_ICONS,
  81.   ACTID_HELP, ACTID_GUIDE, ACTID_HELPINDEX,
  82.   ACTID_SAVE, ACTID_USE,
  83.  
  84.   ACTID_TABS, ACTID_PAGE,
  85.  
  86.   ACTID_UNIT, ACTID_MODE, 
  87.   SHOWID_MODE,
  88.  
  89.   ACTID_FREQ, ACTID_CHANNELS, ACTID_OUTVOL, ACTID_MONVOL, ACTID_GAIN,
  90.   ACTID_INPUT, ACTID_OUTPUT,
  91.   SHOWID_FREQ, SHOWID_CHANNELS, SHOWID_OUTVOL, SHOWID_MONVOL, SHOWID_GAIN,
  92.   SHOWID_INPUT, SHOWID_OUTPUT,
  93.  
  94.   ACTID_DEBUG, ACTID_SURROUND, ACTID_ECHO, ACTID_CLIPMV,
  95.   ACTID_CPULIMIT, SHOWID_CPULIMIT,
  96.   
  97.  
  98.   ACTID_COUNT
  99. };
  100.  
  101.  
  102. /* Version of ClassAct gadgets to use */
  103. long __classactversion = 41;
  104.  
  105. static struct Window *Window                   = NULL;
  106. static struct Menu   *Menu                     = NULL;
  107. static void          *vi                       = NULL;
  108. static Object        *WO_Window                = NULL;
  109. static Object        *Window_Objs[ACTID_COUNT] = {NULL};
  110. static Object        *openreq                  = NULL;
  111. static Object        *savereq                  = NULL;
  112.  
  113. /* Dynamic */
  114. static struct List   *unitlist                 = NULL;
  115. static struct List   *modelist                 = NULL;
  116. static struct List   *infolist                 = NULL;
  117.  
  118. /* Static */
  119. static struct List   *pagelist                 = NULL;
  120. static struct List   *debuglist                = NULL;
  121. static struct List   *echolist                 = NULL;
  122. static struct List   *surroundlist             = NULL;
  123. static struct List   *clipMVlist               = NULL;
  124.  
  125. static char *infotext     = NULL;    // Copy of msgProperties
  126. static char *infotexts[7] = {NULL};  // Entries + NULL
  127. static char *infoargs[7]  = {NULL};
  128.  
  129. struct ColumnInfo ci[] = {
  130.   { 100, NULL, 0 },
  131.   { 100, NULL, 0 },
  132.   { -1, (STRPTR)~0, -1 }
  133. };
  134.  
  135. #define Title(t)        { NM_TITLE, t, NULL, 0, 0, NULL }
  136. #define Item(t,s,i)     { NM_ITEM, t, s, 0, 0, (APTR)i }
  137. #define ItemBar         { NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL }
  138. #define SubItem(t,s,i)  { NM_SUB, t, s, 0, 0, (APTR)i }
  139. #define SubBar          { NM_SUB, NM_BARLABEL, NULL, 0, 0, NULL }
  140. #define EndMenu         { NM_END, NULL, NULL, 0, 0, NULL }
  141. #define ItCk(t,s,i,f)   { NM_ITEM, t, s, f, 0, (APTR)i }
  142.  
  143. static struct NewMenu NewMenus[] = {
  144.   Title( NULL /* Project */ ),
  145.     Item( NULL /* Open... */,             NULL, ACTID_OPEN      ),
  146.     Item( NULL /* Save As... */,          NULL, ACTID_SAVEAS    ),
  147.     ItemBar,
  148.     Item( NULL /* About... */,            NULL, ACTID_ABOUT     ),
  149.     ItemBar,
  150.     Item( NULL /* Quit */,                NULL, ACTID_QUIT      ),
  151.   Title( NULL /* Edit */ ),
  152.     Item( NULL /* Reset To Defaults */,   NULL, ACTID_DEFAULT   ),
  153.     Item( NULL /* Last Saved */,          NULL, ACTID_LASTSAVED ),
  154.     Item( NULL /* Restore */,             NULL, ACTID_RESTORE   ),
  155.   Title( NULL /* Settings */ ),
  156.     ItCk( NULL /* Create Icons? */,       NULL, ACTID_ICONS, CHECKIT|MENUTOGGLE ),
  157.   Title( NULL /* Help */ ),
  158.     ItCk( NULL /* Help... */,             NULL, ACTID_HELP, COMMSEQ),
  159.     ItemBar,
  160.     Item( NULL /* AHI User's guide... */, NULL, ACTID_GUIDE),
  161.     Item( NULL /* Concept Index... */,    NULL, ACTID_HELPINDEX ),
  162.   EndMenu
  163. };
  164.  
  165. struct TagItem MapTab2Page[] = {
  166.   { CLICKTAB_Current, PAGE_Current },
  167.   { TAG_DONE, NULL }
  168. };
  169.  
  170.  
  171. /***** Local function to set gadget attributes *******************************/
  172.  
  173. static void MySetGadgetAttrsA(Object *gadget, struct TagItem *tags) {
  174.  
  175.   if(SetPageGadgetAttrsA((struct Gadget *) gadget, Window_Objs[ACTID_PAGE],
  176.                          Window, NULL, tags)) {
  177.     RefreshGList((struct Gadget *) gadget, Window, NULL, 1);
  178.   }
  179. }
  180.  
  181. static void MySetGadgetAttrs(Object *gadget, ULONG tag1, ...) {
  182.  
  183.   MySetGadgetAttrsA(gadget, (struct TagItem *) &tag1);
  184. }
  185.  
  186. /***** Local function to update the strings above ****************************/
  187.  
  188. static void UpdateStrings(void) {
  189.   char ** strings[] =
  190.   {
  191.     (char**) &msgMenuProject,
  192.     (char**) &msgItemOpen,
  193.     (char**) &msgItemSaveAs,
  194.     (char**) &msgItemAbout,
  195.     (char**) &msgItemQuit,
  196.     (char**) &msgMenuEdit,
  197.     (char**) &msgItemDefaults,
  198.     (char**) &msgItemLastSaved,
  199.     (char**) &msgItemRestore,
  200.     (char**) &msgMenuSettings,
  201.     (char**) &msgItemCreateIcons,
  202.     (char**) &msgMenuHelp,
  203.     (char**) &msgItemHelp,
  204.     (char**) &msgItemUsersGuide,
  205.     (char**) &msgItemConceptIndex
  206.   };
  207.  
  208.   struct NewMenu   *menuptr;
  209.   char           ***stringptr;
  210.  
  211.   menuptr   = (struct NewMenu *) &NewMenus;
  212.   stringptr = (char ***) &strings;
  213.  
  214.   while(menuptr->nm_Type != NM_END)
  215.   {
  216.     if(menuptr->nm_Label == NULL)
  217.     {
  218.       if(strlen(**stringptr) != 0) {
  219.         menuptr->nm_CommKey = **stringptr;
  220.       }
  221.       menuptr->nm_Label = **stringptr + strlen(**stringptr) + 1;
  222.       stringptr++;
  223.     }
  224.     menuptr++;
  225.   }
  226.  
  227.   /* Convert the \n-separated properties texts to 6 separate texts */
  228.  
  229.   {
  230.     char  *s, *d;
  231.     char **p;
  232.  
  233.     infotext = AllocVec(strlen((char *) msgProperties) + 1, MEMF_PUBLIC);
  234.     if(infotext == NULL) return;
  235.  
  236.     s = (char *) msgProperties;
  237.     d = infotext;
  238.     p = infotexts;
  239.  
  240.     *p++ = d;
  241.  
  242.     while(*s) {
  243.       if(*s == '\n') {
  244.         *d = '\0';
  245.         *p++ = d + 1;
  246.       }
  247.       else *d = *s;
  248.       s++;
  249.       d++;
  250.     }
  251.     *d = '\0';
  252.   }
  253. }
  254.  
  255. /***** Local function to update a slider indicator ***************************/
  256.  
  257. static void UpdateSliderLevel(int src, int dst, LONG *index, char * (*func)(void)) {
  258.   if(GetAttr( SLIDER_Level, Window_Objs[src], (ULONG *) index)) {
  259.     Printf("%ld\n", *index);
  260.     MySetGadgetAttrs(Window_Objs[dst],
  261.         GA_Text, (*(func))(), 
  262.         TAG_DONE );
  263.   }
  264. }
  265.  
  266. /***** Local function to find a menu item ************************************/
  267.  
  268. static struct MenuItem *FindMenuItem(ULONG id) {
  269.   struct Menu     *menu;
  270.   struct MenuItem *item;
  271.  
  272.   menu = Menu;
  273.  
  274.   while(menu) {
  275.     for(item = menu->FirstItem; item; item = item->NextItem) {
  276.       if(GTMENUITEM_USERDATA(item) == (APTR) id) {
  277.         return item;
  278.       }
  279.     }
  280.     menu = menu->NextMenu;
  281.   }
  282.  
  283.   return NULL;
  284. }
  285.  
  286.  
  287. /***** Local functions to handle the multicolumn list ************************/
  288.  
  289. static void FreeBrowserNodes2(struct List *list) {
  290.   struct Node *node, *nextnode;
  291.  
  292.   if(list == NULL) return;
  293.  
  294.   node = list->lh_Head;
  295.  
  296.   while( ( nextnode = node->ln_Succ ) != NULL ) {
  297.     FreeListBrowserNode(node);
  298.     node = nextnode;
  299.   }
  300.  
  301.   FreeVec(list);
  302. }
  303.  
  304.  
  305. static struct List *BrowserNodes2(char **labels1, char **labels2) {
  306.   struct List *list;
  307.  
  308.   list = AllocVec(sizeof(struct List), MEMF_PUBLIC|MEMF_CLEAR);
  309.  
  310.   if(list != NULL) {
  311.     struct Node *node;
  312.  
  313.     NewList(list);
  314.  
  315.     while (*labels1 && *labels2)
  316.     {
  317.       node = AllocListBrowserNode(2,
  318.               LBNA_Column, 0,
  319.                 LBNCA_Text, *labels1,
  320.               LBNA_Column, 1,
  321.                 LBNCA_Text, *labels2,
  322.               TAG_DONE );
  323.       if (node != NULL )
  324.       {
  325.         AddTail(list, node);
  326.       }
  327.       else {
  328.         FreeBrowserNodes2(list);
  329.         list = NULL;
  330.         break;
  331.       }
  332.  
  333.       labels1++;
  334.       labels2++;
  335.     }
  336.  
  337.   }
  338.  
  339.   return list;
  340. }
  341.  
  342.  
  343. /***** Local function to update the unit gadget (and everything below) *******/
  344.  
  345. static void GUINewSettings(void) {
  346.   struct List *tmp;
  347.  
  348.   tmp = ChooserLabelsA( (STRPTR *) Units);
  349.  
  350.   MySetGadgetAttrs(Window_Objs[ACTID_UNIT],
  351.     CHOOSER_Labels, tmp,
  352.     CHOOSER_Active, state.UnitSelected,
  353.     TAG_DONE);
  354.  
  355.   if(unitlist) FreeChooserLabels(unitlist);
  356.  
  357.   unitlist = tmp;
  358.  
  359.   MySetGadgetAttrs(Window_Objs[ACTID_DEBUG],
  360.       CHOOSER_Active, globalprefs.ahigp_DebugLevel, TAG_DONE);
  361.   MySetGadgetAttrs(Window_Objs[ACTID_SURROUND],
  362.       CHOOSER_Active, globalprefs.ahigp_DisableSurround, TAG_DONE);
  363.   MySetGadgetAttrs(Window_Objs[ACTID_ECHO],
  364.       CHOOSER_Active, (globalprefs.ahigp_DisableEcho ? 2 : 0) | 
  365.                   (globalprefs.ahigp_FastEcho    ? 1 : 0),     TAG_DONE);
  366.   MySetGadgetAttrs(Window_Objs[ACTID_CLIPMV],
  367.       CHOOSER_Active, globalprefs.ahigp_ClipMasterVolume, TAG_DONE);
  368.   MySetGadgetAttrs(Window_Objs[ACTID_CPULIMIT],
  369.       INTEGER_Number, (globalprefs.ahigp_MaxCPU * 100 + 32768) >> 16, TAG_DONE);
  370.  
  371.   GUINewUnit();
  372. }
  373.  
  374.  
  375. /***** Local function to update all gadgets that depend on the unit **********/
  376.  
  377. static void GUINewUnit(void) {
  378.  
  379.   MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  380.     LISTBROWSER_Labels, ~0,
  381.     TAG_DONE);
  382.  
  383.   if(modelist) FreeBrowserNodes(modelist);
  384.  
  385.   modelist = BrowserNodesA( (STRPTR *) Modes);
  386.  
  387.   MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  388.     LISTBROWSER_Labels, modelist,
  389.     TAG_DONE);
  390.  
  391.   MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  392.     LISTBROWSER_Selected,    state.ModeSelected,
  393.     LISTBROWSER_MakeVisible, state.ModeSelected,
  394.     TAG_DONE);
  395.  
  396.   GUINewMode();
  397. }
  398.  
  399.  
  400. /***** Local function to update all gadgets that depend on the mode **********/
  401.  
  402. static char modetext[11];
  403. static char drivertext[128];
  404.  
  405. static void GUINewMode(void) {
  406.   int Max, Sel;
  407.  
  408.   sprintf(modetext,"0x%08lx", getAudioMode());
  409.   infoargs[0] = modetext;
  410.   infoargs[1] = getRecord();
  411.   infoargs[2] = getAuthor();
  412.   infoargs[3] = getCopyright();
  413.   sprintf(drivertext, "Devs:AHI/%s.audio", getDriver());
  414.   infoargs[4] = drivertext;
  415.   infoargs[5] = getVersion();
  416.  
  417.   MySetGadgetAttrs(Window_Objs[SHOWID_MODE],
  418.     LISTBROWSER_Labels, ~0,
  419.     TAG_DONE);
  420.  
  421.   if(infolist) FreeBrowserNodes2(infolist);
  422.  
  423.   infolist = BrowserNodes2(infotexts, infoargs);
  424.  
  425.   MySetGadgetAttrs(Window_Objs[SHOWID_MODE],
  426.     LISTBROWSER_Labels, infolist,
  427.     TAG_DONE);
  428.  
  429.   Max = max(state.Frequencies -1, 0);
  430.   Sel = min(Max, state.FreqSelected);
  431.   MySetGadgetAttrs(Window_Objs[ACTID_FREQ],
  432.       SLIDER_Min,       0,
  433.       SLIDER_Max,       Max,
  434.       SLIDER_Level,     Sel,
  435.       GA_Disabled,      (Max == 0),
  436.       TAG_DONE );
  437.   Max = max(state.Channels, 1);
  438.   Sel = min(Max, state.ChannelsSelected);
  439.   MySetGadgetAttrs(Window_Objs[ACTID_CHANNELS],
  440.       SLIDER_Min,       1,
  441.       SLIDER_Max,       Max,
  442.       SLIDER_Level,     Sel,
  443.       GA_Disabled,      (Max == 1) || state.ChannelsDisabled,
  444.       TAG_DONE );
  445.   Max = max(state.OutVols -1, 0);
  446.   Sel = min(Max, state.OutVolSelected);
  447.   MySetGadgetAttrs(Window_Objs[ACTID_OUTVOL],
  448.       SLIDER_Min,       0,
  449.       SLIDER_Max,       Max,
  450.       SLIDER_Level,     Sel,
  451.       GA_Disabled,      (Max == 0),
  452.       TAG_DONE );
  453.   Max = max(state.MonVols -1, 0);
  454.   Sel = min(Max, state.MonVolSelected);
  455.   MySetGadgetAttrs(Window_Objs[ACTID_MONVOL],
  456.       SLIDER_Min,       0,
  457.       SLIDER_Max,       Max,
  458.       SLIDER_Level,     Sel,
  459.       GA_Disabled,      (Max == 0),
  460.       TAG_DONE );
  461.   Max = max(state.Gains -1, 0);
  462.   Sel = min(Max, state.GainSelected);
  463.   MySetGadgetAttrs(Window_Objs[ACTID_GAIN],
  464.       SLIDER_Min,       0,
  465.       SLIDER_Max,       Max,
  466.       SLIDER_Level,     Sel,
  467.       GA_Disabled,      (Max == 0),
  468.       TAG_DONE );
  469.   Max = max(state.Inputs -1, 0);
  470.   Sel = min(Max, state.InputSelected);
  471.   MySetGadgetAttrs(Window_Objs[ACTID_INPUT],
  472.       SLIDER_Min,       0,
  473.       SLIDER_Max,       Max,
  474.       SLIDER_Level,     Sel,
  475.       GA_Disabled,      (Max == 0),
  476.       TAG_DONE );
  477.   Max = max(state.Outputs -1, 0);
  478.   Sel = min(Max, state.OutputSelected);
  479.   MySetGadgetAttrs(Window_Objs[ACTID_OUTPUT],
  480.       SLIDER_Min,       0,
  481.       SLIDER_Max,       Max,
  482.       SLIDER_Level,     Sel,
  483.       GA_Disabled,      (Max == 0),
  484.       TAG_DONE );
  485.  
  486.     // Update indicators..
  487.  
  488.     MySetGadgetAttrs(Window_Objs[SHOWID_FREQ],
  489.         GA_Text, getFreq(), TAG_DONE );
  490.  
  491.     MySetGadgetAttrs(Window_Objs[SHOWID_CHANNELS],
  492.         GA_Text, getChannels(), TAG_DONE );
  493.  
  494.     MySetGadgetAttrs(Window_Objs[SHOWID_OUTVOL],
  495.         GA_Text, getOutVol(), TAG_DONE );
  496.  
  497.     MySetGadgetAttrs(Window_Objs[SHOWID_MONVOL],
  498.         GA_Text, getMonVol(), TAG_DONE );
  499.  
  500.     MySetGadgetAttrs(Window_Objs[SHOWID_GAIN],
  501.         GA_Text, getGain(), TAG_DONE );
  502.  
  503.     MySetGadgetAttrs(Window_Objs[SHOWID_INPUT],
  504.         GA_Text, getInput(), TAG_DONE );
  505.  
  506.     MySetGadgetAttrs(Window_Objs[SHOWID_OUTPUT],
  507.         GA_Text, getOutput(), TAG_DONE );
  508.  
  509. }
  510.  
  511.  
  512. /***** Gadget hook ***********************************************************/
  513.  
  514. static ULONG HOOKCALL 
  515. GadgetHookFunc( REG( a0, struct Hook *hook ),
  516.                       REG( a2, Object *obj ),
  517.                       REG( a1, struct opUpdate *opu ) ) {
  518.  
  519.   if(obj == Window_Objs[ ACTID_FREQ] ) {
  520.     UpdateSliderLevel(ACTID_FREQ, SHOWID_FREQ,
  521.         &state.FreqSelected, getFreq);
  522.   }
  523.  
  524.   else if(obj == Window_Objs[ ACTID_CHANNELS] ) {
  525.     UpdateSliderLevel(ACTID_CHANNELS, SHOWID_CHANNELS,
  526.         &state.ChannelsSelected, getChannels);
  527.   }
  528.  
  529.   else if(obj == Window_Objs[ ACTID_OUTVOL] ) {
  530.     UpdateSliderLevel(ACTID_OUTVOL, SHOWID_OUTVOL,
  531.         &state.OutVolSelected, getOutVol);
  532.   }
  533.  
  534.   else if(obj == Window_Objs[ ACTID_MONVOL] ) {
  535.     UpdateSliderLevel(ACTID_MONVOL, SHOWID_MONVOL,
  536.         &state.MonVolSelected, getMonVol);
  537.   }
  538.  
  539.   else if(obj == Window_Objs[ ACTID_GAIN] ) {
  540.     UpdateSliderLevel(ACTID_GAIN, SHOWID_GAIN,
  541.         &state.GainSelected, getGain);
  542.   }
  543.  
  544.   else if(obj == Window_Objs[ ACTID_INPUT] ) {
  545.     UpdateSliderLevel(ACTID_INPUT, SHOWID_INPUT,
  546.         &state.InputSelected, getInput);
  547.   }
  548.  
  549.   else if(obj == Window_Objs[ ACTID_OUTPUT] ) {
  550.     UpdateSliderLevel(ACTID_OUTPUT, SHOWID_OUTPUT,
  551.         &state.OutputSelected, getOutput);
  552.   }
  553.   else return 0;
  554.  
  555.     return 1;
  556. }
  557.  
  558. static struct Hook GadgetHook = 
  559. {
  560.   { NULL, NULL },
  561.   (HOOKFUNC) GadgetHookFunc,
  562.   NULL,
  563.   NULL
  564. };
  565.  
  566. static void HOOKCALL IDCMPhookFunc(
  567.   REG( a0, struct Hook *hook ),
  568.   REG( a2, Object *obj ),
  569.   REG( a1, struct IntuiMessage *msg ) )
  570. {
  571.   switch(msg->Code) {
  572.   
  573.     case 0x42:
  574.     {
  575.       /*
  576.       **      TAB             - Next page
  577.       **      SHIFT + TAB     - Prev page
  578.       */
  579.       ULONG          pos = 0;
  580.       struct TagItem tags[] = {
  581.         {CLICKTAB_Current, 0}, 
  582.         {TAG_END, NULL}
  583.       };
  584.  
  585.       GetAttr( CLICKTAB_Current,  Window_Objs[ACTID_TABS], &pos );
  586.  
  587.       if ( msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  588.         pos--;
  589.       else 
  590.         pos++;
  591.  
  592.       pos %= 2;
  593.  
  594.       tags[0].ti_Data = pos;
  595.  
  596.       MySetGadgetAttrs(Window_Objs[ACTID_TABS],
  597.           CLICKTAB_Current, pos, TAG_END );
  598.       MySetGadgetAttrs(Window_Objs[ACTID_PAGE],
  599.           PAGE_Current, pos, TAG_END );
  600.  
  601.       RethinkLayout((struct Gadget *) Window_Objs[LAYOUT_PAGE], Window, NULL, TRUE);
  602.  
  603.       break;
  604.     }
  605.  
  606.     case 0x4C:
  607.     {
  608.       /*
  609.       **      UP              - Move entry up.
  610.       **      SHIFT + UP      - Move page up.
  611.       **      CTRL + UP       - Move to the top.
  612.       **/
  613.       ULONG mode = 0;
  614.  
  615.       if(msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  616.         MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  617.             LISTBROWSER_Position, LBP_PAGEUP, TAG_END );
  618.       else if(msg->Qualifier & IEQUALIFIER_CONTROL )
  619.         MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  620.             LISTBROWSER_Position, LBP_TOP, TAG_END );
  621.       else
  622.         MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  623.             LISTBROWSER_Position, LBP_LINEUP, TAG_END );
  624.  
  625.       GetAttr( LISTBROWSER_Selected, Window_Objs[ACTID_MODE], &mode);
  626.       FillUnit();
  627.       NewMode(mode);
  628.       GUINewMode();
  629.       break;
  630.     }
  631.  
  632.     case 0x4D:
  633.     {
  634.       /*
  635.       **      DOWN            - Move entry down.
  636.       **      SHIFT + DOWN    - Move page down.
  637.       **      CTRL + DOWN     - Move to the end.
  638.       **/
  639.       ULONG mode = 0;
  640.  
  641.       if(msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  642.         MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  643.             LISTBROWSER_Position, LBP_PAGEDOWN, TAG_END );
  644.       else if(msg->Qualifier & IEQUALIFIER_CONTROL )
  645.         MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  646.             LISTBROWSER_Position, LBP_BOTTOM, TAG_END );
  647.       else
  648.         MySetGadgetAttrs(Window_Objs[ACTID_MODE],
  649.             LISTBROWSER_Position, LBP_LINEDOWN, TAG_END );
  650.  
  651.       GetAttr( LISTBROWSER_Selected, Window_Objs[ACTID_MODE], &mode);
  652.       FillUnit();
  653.       NewMode(mode);
  654.       GUINewMode();
  655.       break;
  656.     }
  657.  
  658.     case 0x4f:
  659.     {
  660.       /*
  661.       **      LEFT            - Prev unit
  662.       */
  663.       LONG pos = 0;
  664.       int i;
  665.       char **u = Units;
  666.  
  667.       for(i=0; *u; i++, u++);
  668.  
  669.       GetAttr( CHOOSER_Active, Window_Objs[ACTID_UNIT], (ULONG *) &pos );
  670.  
  671.       pos = (pos - 1) % i;
  672.       if(pos < 0) pos += i;
  673.  
  674.       MySetGadgetAttrs(Window_Objs[ACTID_UNIT],
  675.           CHOOSER_Active, pos, TAG_END );
  676.  
  677.       GetAttr( CHOOSER_Active, Window_Objs[ACTID_UNIT], (ULONG *) &pos);
  678.       FillUnit();
  679.       NewUnit(pos);
  680.       GUINewUnit();
  681.       break;
  682.     }
  683.  
  684.     case 0x4e:
  685.     {
  686.       /*
  687.       **      RIGHT           - Prev unit
  688.       */
  689.       LONG pos = 0;
  690.       int i;
  691.       char **u = Units;
  692.  
  693.       for(i=0; *u; i++, u++);
  694.  
  695.       GetAttr( CHOOSER_Active, Window_Objs[ACTID_UNIT], (ULONG *) &pos );
  696.  
  697.       pos = (pos + 1) % i;;
  698.  
  699.       MySetGadgetAttrs(Window_Objs[ACTID_UNIT],
  700.           CHOOSER_Active, pos, TAG_END );
  701.  
  702.       GetAttr( CHOOSER_Active, Window_Objs[ACTID_UNIT], (ULONG *) &pos);
  703.  
  704.       FillUnit();
  705.       NewUnit(pos);
  706.       GUINewUnit();
  707.       break;
  708.     }
  709.  
  710.   }
  711. }
  712.  
  713. static struct Hook IDCMPhook =
  714. {
  715.   { NULL, NULL },
  716.   ( HOOKFUNC ) IDCMPhookFunc,
  717.   NULL,
  718.   NULL
  719. };
  720.  
  721.  
  722. /******************************************************************************
  723. **** Call to open a requester *************************************************
  724. ******************************************************************************/
  725.  
  726. static ULONG Req( UBYTE *gadgets, UBYTE *body, ... ) {
  727.   struct EasyStruct req = {
  728.     sizeof (struct EasyStruct), 0, NULL, NULL, NULL
  729.   };
  730.   ULONG rc;
  731.  
  732.   req.es_Title        = (char *) msgTextProgramName;
  733.   req.es_TextFormat   = body; 
  734.   req.es_GadgetFormat = gadgets;
  735.  
  736.   SetAttrs( WO_Window, WA_BusyPointer, TRUE, TAG_DONE);
  737.      rc = EasyRequestArgs( Window, &req, NULL, ( ULONG * )( &body + 1 ) );
  738.   SetAttrs( WO_Window, WA_BusyPointer, FALSE, TAG_DONE);
  739.  
  740.   return rc;
  741. }
  742.  
  743.  
  744. /******************************************************************************
  745. **** Call to open the window **************************************************
  746. ******************************************************************************/
  747.  
  748.  
  749. BOOL BuildGUI(char *screenname) {
  750.  
  751.     Object **ar = Window_Objs;
  752.   struct Screen *screen;
  753.   BOOL OptionFrame = FALSE;
  754.   LONG indicatorwidth = 100;
  755.   Object *l1, *l2, *l3, *l4, *l5, *l6, *l7;
  756.  
  757.   UpdateStrings();
  758.  
  759.   if (ButtonBase == NULL) { /* force it open */
  760.     Printf((char *) msgTextNoOpen, "button.gadget", __classactversion);
  761.     Printf("\n");
  762.     return FALSE;
  763.   }
  764.  
  765.   /* Dynamic */
  766.   unitlist      = ChooserLabelsA( (STRPTR *) Units);
  767.   modelist      = BrowserNodesA( (STRPTR *) Modes);
  768.   infolist      = BrowserNodes2(infotexts, infoargs);
  769.  
  770.   /* Static */
  771.   pagelist      = ClickTabs( (char *) msgPageMode, (char *) msgPageAdvanced, NULL);
  772.   debuglist     = ChooserLabels( (char *) msgDebugNone,
  773.                                  (char *) msgDebugLow,
  774.                                  (char *) msgDebugHigh,
  775.                                  (char *) msgDebugFull,
  776.                                  NULL);
  777.   echolist      = ChooserLabels( (char *) msgEchoEnabled,
  778.                                  (char *) msgEchoFast,
  779.                                  (char *) msgEchoDisabled,
  780.                                  NULL);
  781.   surroundlist  = ChooserLabels( (char *) msgSurroundEnabled,
  782.                                  (char *) msgSurroundDisabled,
  783.                                  NULL);
  784.   clipMVlist    = ChooserLabels( (char *) msgMVNoClip,
  785.                                  (char *) msgMVClip,
  786.                                  NULL);
  787.  
  788.  
  789.   screen = LockPubScreen(screenname);
  790.  
  791.   vi = GetVisualInfoA(screen, NULL);
  792.  
  793.   Menu = CreateMenusA(NewMenus, NULL);
  794.  
  795.   if(vi == NULL || Menu == NULL) {
  796.     Printf((char *) msgTextNoWindow);
  797.     Printf("\n");
  798.     return FALSE;
  799.   }
  800.  
  801.   if(!LayoutMenus(Menu, vi, GTMN_NewLookMenus, TRUE, TAG_DONE)) {
  802.     Printf((char *) msgTextNoWindow);
  803.     Printf("\n");
  804.     return FALSE;
  805.   }
  806.  
  807.   indicatorwidth = max(indicatorwidth, 16 * screen->RastPort.Font->tf_XSize);
  808.   if(screen->Height > 240) {
  809.     OptionFrame = TRUE;
  810.   }
  811.  
  812.   ar[ACTID_PAGE] = PageObject,
  813.     PAGE_Current,         0,
  814.  
  815. /* PAGE 1 */
  816.     PAGE_Add, HLayoutObject,
  817.       LAYOUT_VertAlignment, LALIGN_CENTER,
  818.  
  819.       LAYOUT_AddChild, VLayoutObject,
  820.  
  821.         LAYOUT_AddChild, ar[ACTID_UNIT] = PopUpObject,
  822.           CHOOSER_Labels,         unitlist,
  823.           CHOOSER_Active,         state.UnitSelected,
  824.         ChooserEnd,
  825.         CHILD_WeightedHeight, 0,
  826.  
  827.         LAYOUT_AddChild, ar[ACTID_MODE] = ListBrowserObject,
  828.           LISTBROWSER_Labels,     modelist,
  829.           LISTBROWSER_MakeVisible,state.ModeSelected,
  830.           LISTBROWSER_Selected,   state.ModeSelected,
  831.           LISTBROWSER_ShowSelected,TRUE,
  832.         ListBrowserEnd,
  833.  
  834.         LAYOUT_AddChild, ar[SHOWID_MODE] = ListBrowserObject,
  835.           LISTBROWSER_Labels,     infolist,
  836.           LISTBROWSER_ColumnInfo, (ULONG)&ci,
  837.           LISTBROWSER_AutoFit,    TRUE,
  838.           LISTBROWSER_VertSeparators, FALSE,
  839.           GA_ReadOnly,            TRUE,
  840.         ListBrowserEnd,
  841.         CHILD_MaxHeight, screen->RastPort.Font->tf_YSize * 6 + 6, // UHH!!
  842.       LayoutEnd,
  843.  
  844.       LAYOUT_AddChild, HLayoutObject,
  845.         (OptionFrame ? LAYOUT_SpaceOuter   : TAG_IGNORE), TRUE,
  846.         (OptionFrame ? LAYOUT_RightSpacing : TAG_IGNORE), 0,
  847.         (OptionFrame ? LAYOUT_BevelStyle   : TAG_IGNORE), BVS_GROUP,
  848.         (OptionFrame ? LAYOUT_Label        : TAG_IGNORE), (char *) msgOptions,
  849.  
  850.         LAYOUT_AddChild, VLayoutObject,
  851.  
  852.           LAYOUT_AddChild, l1 = HLayoutObject,
  853.             LAYOUT_AddChild, ar[ACTID_FREQ] = SliderObject,
  854.               SLIDER_Min,           0,
  855.               SLIDER_Max,           state.Frequencies,
  856.               SLIDER_Level,         state.FreqSelected,
  857.               SLIDER_Orientation,   SORIENT_HORIZ,
  858.               GA_UserData,            &GadgetHook,
  859.             SliderEnd,
  860.             CHILD_Label, LabelObject,
  861.               LABEL_Text,             (char *) msgOptFrequency,
  862.             LabelEnd,
  863.             LAYOUT_AddChild, ar[SHOWID_FREQ] = ButtonObject,
  864.               GA_Text,                getFreq(),
  865.               GA_ReadOnly,            TRUE,
  866.               BUTTON_BevelStyle,      BVS_NONE,
  867.               BUTTON_Transparent,     TRUE,
  868.               BUTTON_Justification,   BCJ_LEFT,
  869.             ButtonEnd,
  870.             CHILD_MinWidth,         indicatorwidth,
  871.             CHILD_MaxWidth,         indicatorwidth,
  872.           LayoutEnd,
  873.  
  874.           LAYOUT_AddChild, l2 = HLayoutObject,
  875.             LAYOUT_AddChild, ar[ACTID_CHANNELS] = SliderObject,
  876.               SLIDER_Min,           1,
  877.               SLIDER_Max,           state.Channels,
  878.               SLIDER_Level,         state.ChannelsSelected,
  879.               SLIDER_Orientation,   SORIENT_HORIZ,
  880.               GA_UserData,            &GadgetHook,
  881.             SliderEnd,
  882.             CHILD_Label, LabelObject,
  883.               LABEL_Text,             (char *) msgOptChannels,
  884.             LabelEnd,
  885.             LAYOUT_AddChild, ar[SHOWID_CHANNELS] = ButtonObject,
  886.               GA_Text,                getChannels(),
  887.               GA_ReadOnly,            TRUE,
  888.               BUTTON_BevelStyle,      BVS_NONE,
  889.               BUTTON_Transparent,     TRUE,
  890.               BUTTON_Justification,   BCJ_LEFT,
  891.             ButtonEnd,
  892.             CHILD_MinWidth,         indicatorwidth,
  893.             CHILD_MaxWidth,         indicatorwidth,
  894.           LayoutEnd,
  895.  
  896.           LAYOUT_AddChild, l3 = HLayoutObject,
  897.             LAYOUT_AddChild, ar[ACTID_OUTVOL] = SliderObject,
  898.               SLIDER_Min,           0,
  899.               SLIDER_Max,           state.OutVols,
  900.               SLIDER_Level,         state.OutVolSelected,
  901.               SLIDER_Orientation,   SORIENT_HORIZ,
  902.               GA_UserData,            &GadgetHook,
  903.             SliderEnd,
  904.             CHILD_Label, LabelObject,
  905.               LABEL_Text,             (char *) msgOptVolume,
  906.             LabelEnd,
  907.             LAYOUT_AddChild, ar[SHOWID_OUTVOL] = ButtonObject,
  908.               GA_Text,                getOutVol(),
  909.               GA_ReadOnly,            TRUE,
  910.               BUTTON_BevelStyle,      BVS_NONE,
  911.               BUTTON_Transparent,     TRUE,
  912.               BUTTON_Justification,   BCJ_LEFT,
  913.             ButtonEnd,
  914.             CHILD_MinWidth,         indicatorwidth,
  915.             CHILD_MaxWidth,         indicatorwidth,
  916.           LayoutEnd,
  917.  
  918.           LAYOUT_AddChild, l4 = HLayoutObject,
  919.             LAYOUT_AddChild, ar[ACTID_MONVOL] = SliderObject,
  920.               SLIDER_Min,           0,
  921.               SLIDER_Max,           state.MonVols,
  922.               SLIDER_Level,         state.MonVolSelected,
  923.               SLIDER_Orientation,   SORIENT_HORIZ,
  924.               GA_UserData,            &GadgetHook,
  925.             SliderEnd,
  926.             CHILD_Label, LabelObject,
  927.               LABEL_Text,             (char *) msgOptMonitor,
  928.             LabelEnd,
  929.             LAYOUT_AddChild, ar[SHOWID_MONVOL] = ButtonObject,
  930.               GA_Text,                getMonVol(),
  931.               GA_ReadOnly,            TRUE,
  932.               BUTTON_BevelStyle,      BVS_NONE,
  933.               BUTTON_Transparent,     TRUE,
  934.               BUTTON_Justification,   BCJ_LEFT,
  935.             ButtonEnd,
  936.             CHILD_MinWidth,         indicatorwidth,
  937.             CHILD_MaxWidth,         indicatorwidth,
  938.           LayoutEnd,
  939.  
  940.           LAYOUT_AddChild, l5 = HLayoutObject,
  941.             LAYOUT_AddChild, ar[ACTID_GAIN] = SliderObject,
  942.               SLIDER_Min,           0,
  943.               SLIDER_Max,           state.Gains,
  944.               SLIDER_Level,         state.GainSelected,
  945.               SLIDER_Orientation,   SORIENT_HORIZ,
  946.               GA_UserData,            &GadgetHook,
  947.             SliderEnd,
  948.             CHILD_Label, LabelObject,
  949.               LABEL_Text,             (char *) msgOptGain,
  950.             LabelEnd,
  951.             LAYOUT_AddChild, ar[SHOWID_GAIN] = ButtonObject,
  952.               GA_Text,                getGain(),
  953.               GA_ReadOnly,            TRUE,
  954.               BUTTON_BevelStyle,      BVS_NONE,
  955.               BUTTON_Transparent,     TRUE,
  956.               BUTTON_Justification,   BCJ_LEFT,
  957.             ButtonEnd,
  958.             CHILD_MinWidth,         indicatorwidth,
  959.             CHILD_MaxWidth,         indicatorwidth,
  960.           LayoutEnd,
  961.  
  962.           LAYOUT_AddChild, l6 = HLayoutObject,
  963.             LAYOUT_AddChild, ar[ACTID_INPUT] = SliderObject,
  964.               SLIDER_Min,           0,
  965.               SLIDER_Max,           state.Inputs,
  966.               SLIDER_Level,         state.InputSelected,
  967.               SLIDER_Orientation,   SORIENT_HORIZ,
  968.               GA_UserData,            &GadgetHook,
  969.             SliderEnd,
  970.             CHILD_Label, LabelObject,
  971.               LABEL_Text,             (char *) msgOptInput,
  972.             LabelEnd,
  973.             LAYOUT_AddChild, ar[SHOWID_INPUT] = ButtonObject,
  974.               GA_Text,                getInput(),
  975.               GA_ReadOnly,            TRUE,
  976.               BUTTON_BevelStyle,      BVS_NONE,
  977.               BUTTON_Transparent,     TRUE,
  978.               BUTTON_Justification,   BCJ_LEFT,
  979.             ButtonEnd,
  980.             CHILD_MinWidth,         indicatorwidth,
  981.             CHILD_MaxWidth,         indicatorwidth,
  982.           LayoutEnd,
  983.  
  984.           LAYOUT_AddChild, l7 = HLayoutObject,
  985.             LAYOUT_AddChild, ar[ACTID_OUTPUT] = SliderObject,
  986.               SLIDER_Min,           0,
  987.               SLIDER_Max,           state.Outputs,
  988.               SLIDER_Level,         state.OutputSelected,
  989.               SLIDER_Orientation,   SORIENT_HORIZ,
  990.               GA_UserData,            &GadgetHook,
  991.             SliderEnd,
  992.             CHILD_Label, LabelObject,
  993.               LABEL_Text,             (char *) msgOptOutput,
  994.             LabelEnd,
  995.             LAYOUT_AddChild, ar[SHOWID_OUTPUT] = ButtonObject,
  996.               GA_Text,                getOutput(),
  997.               GA_ReadOnly,            TRUE,
  998.               BUTTON_BevelStyle,      BVS_NONE,
  999.               BUTTON_Transparent,     TRUE,
  1000.               BUTTON_Justification,   BCJ_LEFT,
  1001.             ButtonEnd,
  1002.             CHILD_MinWidth,         indicatorwidth,
  1003.             CHILD_MaxWidth,         indicatorwidth,
  1004.           LayoutEnd,
  1005.  
  1006.         LayoutEnd,
  1007.  
  1008.       LayoutEnd,
  1009.       CHILD_WeightedHeight, 0,
  1010.  
  1011.     LayoutEnd,
  1012.  
  1013. /* PAGE 2 */
  1014.     PAGE_Add, HLayoutObject,
  1015.       LAYOUT_VertAlignment, LALIGN_CENTER,
  1016.       LAYOUT_HorizAlignment,  LALIGN_CENTER,
  1017.  
  1018.       LAYOUT_AddChild, VLayoutObject,
  1019.         LAYOUT_SpaceOuter,      TRUE,
  1020.         LAYOUT_BevelStyle,      BVS_GROUP,
  1021.         LAYOUT_Label,           (char *) msgGlobalOptions,
  1022.         LAYOUT_VertAlignment, LALIGN_BOTTOM,
  1023.  
  1024.         LAYOUT_AddChild, ar[ACTID_DEBUG] = PopUpObject,
  1025.           CHOOSER_Labels,       debuglist,
  1026.           CHOOSER_Active,       globalprefs.ahigp_DebugLevel,
  1027.         ChooserEnd,
  1028.         CHILD_Label, LabelObject,
  1029.           LABEL_Text,             (char *) msgGlobOptDebugLevel,
  1030.         LabelEnd,
  1031.  
  1032.         LAYOUT_AddChild, ar[ACTID_ECHO] = PopUpObject,
  1033.           CHOOSER_Labels,       echolist,
  1034.           CHOOSER_Active,       (globalprefs.ahigp_DisableEcho ? 2 : 0) |
  1035.                                 (globalprefs.ahigp_FastEcho    ? 1 : 0),
  1036.         ChooserEnd,
  1037.         CHILD_Label, LabelObject,
  1038.           LABEL_Text,             (char *) msgGlobOptEcho,
  1039.         LabelEnd,
  1040.  
  1041.         LAYOUT_AddChild, ar[ACTID_SURROUND] = PopUpObject,
  1042.           CHOOSER_Labels,       surroundlist,
  1043.           CHOOSER_Active,       globalprefs.ahigp_DisableSurround,
  1044.         ChooserEnd,
  1045.         CHILD_Label, LabelObject,
  1046.           LABEL_Text,             (char *) msgGlobOptSurround,
  1047.         LabelEnd,
  1048.  
  1049.         LAYOUT_AddChild, ar[ACTID_CLIPMV] = PopUpObject,
  1050.           CHOOSER_Labels,       clipMVlist,
  1051.           CHOOSER_Active,       globalprefs.ahigp_ClipMasterVolume,
  1052.         ChooserEnd,
  1053.         CHILD_Label, LabelObject,
  1054.           LABEL_Text,             (char *) msgGlobOptMasterVol,
  1055.         LabelEnd,
  1056.  
  1057.         LAYOUT_AddChild, ar[ACTID_CPULIMIT] = IntegerObject,
  1058.           INTEGER_MaxChars,       3,
  1059.           INTEGER_MinVisible,     3,
  1060.           INTEGER_Minimum,        0,
  1061.           INTEGER_Maximum,        100,
  1062.           INTEGER_Number,         (globalprefs.ahigp_MaxCPU * 100 + 32768) >> 16,
  1063.           INTEGER_Arrows,         TRUE,
  1064.         IntegerEnd,
  1065.         CHILD_Label, LabelObject,
  1066.           LABEL_Text,             (char *) msgGlobOptCPULimit,
  1067.          LabelEnd,
  1068.  
  1069.       LayoutEnd,
  1070.       CHILD_WeightedHeight, 0,
  1071.       CHILD_WeightedWidth, 0,
  1072.     LayoutEnd,
  1073.  
  1074.   PageEnd;
  1075.  
  1076.   if(ar[ACTID_PAGE] != NULL) {
  1077.     SetAttrs( l1, LAYOUT_AlignLabels, l2, TAG_DONE);
  1078.     SetAttrs( l2, LAYOUT_AlignLabels, l3, TAG_DONE);
  1079.     SetAttrs( l3, LAYOUT_AlignLabels, l4, TAG_DONE);
  1080.     SetAttrs( l4, LAYOUT_AlignLabels, l5, TAG_DONE);
  1081.     SetAttrs( l5, LAYOUT_AlignLabels, l6, TAG_DONE);
  1082.     SetAttrs( l6, LAYOUT_AlignLabels, l7, TAG_DONE);
  1083.     SetAttrs( l7, LAYOUT_AlignLabels, l1, TAG_DONE);
  1084.   }
  1085.  
  1086.   WO_Window = WindowObject,
  1087.     WA_PubScreen,           screen,
  1088.     WA_Title,               (char *) msgTextProgramName,
  1089.     WA_CloseGadget,         TRUE,
  1090.     WA_DepthGadget,         TRUE,
  1091.     WA_DragBar,             TRUE,
  1092.     WA_Activate,            TRUE,
  1093.     WA_SizeGadget,          TRUE,
  1094.     WA_SizeBBottom,         TRUE,
  1095.     WA_NewLookMenus,        TRUE,
  1096.     WA_InnerWidth,          800,
  1097.     WA_InnerHeight,         400,
  1098.  
  1099.     WINDOW_MenuStrip,       Menu,
  1100.     WINDOW_Position,        WPOS_CENTERSCREEN,
  1101.     WINDOW_GadgetUserData,  WGUD_HOOK,
  1102.     WINDOW_IDCMPHook,      &IDCMPhook,
  1103.     WINDOW_IDCMPHookBits,   IDCMP_RAWKEY,
  1104.  
  1105.     WINDOW_Layout, VLayoutObject,
  1106.       LAYOUT_SpaceOuter,    TRUE,
  1107.       LAYOUT_DeferLayout,   TRUE,
  1108.       
  1109.  
  1110. /* TABS */
  1111.       LAYOUT_AddChild, ar[LAYOUT_PAGE] = VLayoutObject,
  1112.         LAYOUT_AddChild, ar[ACTID_TABS] = ClickTabObject,
  1113.           CLICKTAB_Labels,      pagelist,
  1114.           CLICKTAB_Current,     0L,
  1115.           ICA_TARGET,           ar[ACTID_PAGE],
  1116.           ICA_MAP,              MapTab2Page,
  1117.         ClickTabEnd,
  1118.  
  1119.         LAYOUT_AddChild, ar[ACTID_PAGE],
  1120.       LayoutEnd,
  1121.  
  1122. /* BUTTONS */
  1123.       LAYOUT_AddChild, HLayoutObject,
  1124.         LAYOUT_EvenSize, TRUE,
  1125.  
  1126.         LAYOUT_AddChild, ar[ACTID_SAVE] = ButtonObject,
  1127.           GA_Text,              (char *) msgButtonSave,
  1128.         ButtonEnd,
  1129.         CHILD_WeightedHeight, 0,
  1130.  
  1131.         LAYOUT_AddChild, ar[ACTID_USE] = ButtonObject,
  1132.           GA_Text,              (char *) msgButtonUse,
  1133.         ButtonEnd,
  1134.         CHILD_WeightedHeight, 0,
  1135.  
  1136.         LAYOUT_AddChild, ar[ACTID_QUIT] = ButtonObject,
  1137.           GA_Text,              (char *) msgButtonCancel,
  1138.         ButtonEnd,
  1139.         CHILD_WeightedHeight, 0,
  1140.  
  1141.       LayoutEnd,
  1142.       CHILD_WeightedHeight, 0,
  1143.  
  1144.     LayoutEnd,
  1145.   WindowEnd;
  1146.  
  1147.   if(WO_Window) {
  1148.     int i;
  1149.     for(i = 0; i < ACTID_COUNT; i++) {
  1150.       if(Window_Objs[i] != NULL) {
  1151.         SetAttrs(Window_Objs[i], GA_ID,        i,
  1152.                                  GA_RelVerify, TRUE, 
  1153.                                  TAG_END);
  1154.       }
  1155.     }
  1156.     Window = (struct Window *) CA_OpenWindow(WO_Window);
  1157.   }
  1158.  
  1159.   if(screen) {
  1160.     UnlockPubScreen(NULL, screen);
  1161.   }
  1162.  
  1163.   if(Window == NULL) {
  1164.     Printf((char *) msgTextNoWindow);
  1165.     Printf("\n");
  1166.     return FALSE;
  1167.   }
  1168.  
  1169.   openreq = GetFileObject,
  1170.     GETFILE_RejectIcons,   TRUE,
  1171.     GETFILE_Drawer,        "SYS:Prefs/Presets",
  1172.   EndObject;
  1173.  
  1174.   savereq = GetFileObject,
  1175.     GETFILE_RejectIcons,   TRUE,
  1176.     GETFILE_Drawer,        "SYS:Prefs/Presets",
  1177.     GETFILE_DoSaveMode,    TRUE,
  1178.   EndObject;
  1179.  
  1180.   if((openreq == NULL) || (savereq == NULL)) {
  1181.     Printf((char *) msgTextNoFileRequester);
  1182.     Printf("\n");
  1183.     return FALSE;
  1184.   }
  1185.  
  1186.   // Update the checkmark for "Create Icons?"
  1187.   {
  1188.     struct Menu     *menu;
  1189.     struct MenuItem *item;
  1190.  
  1191.     menu = Menu;
  1192.  
  1193.     ClearMenuStrip(Window);
  1194.  
  1195.     item = FindMenuItem(ACTID_ICONS);
  1196.  
  1197.     if(item) {
  1198.       if(SaveIcons)
  1199.         item->Flags |= CHECKED;
  1200.       else
  1201.         item->Flags &= ~CHECKED;
  1202.     }
  1203.     ResetMenuStrip(Window, menu);
  1204.   }
  1205.  
  1206.   GUINewUnit();
  1207.   return TRUE;
  1208. }
  1209.  
  1210.  
  1211. /******************************************************************************
  1212. **** Call to close the window *************************************************
  1213. ******************************************************************************/
  1214.  
  1215. void CloseGUI(void) {
  1216.  
  1217.   if(savereq) DisposeObject(savereq);
  1218.   if(openreq) DisposeObject(openreq);
  1219.  
  1220.   savereq   = NULL;
  1221.   openreq   = NULL;
  1222.  
  1223.   if(WO_Window) DisposeObject(WO_Window);
  1224.  
  1225.   WO_Window = NULL;
  1226.   Window    = NULL;
  1227.  
  1228.   /* Dynamic */
  1229.   if(unitlist)     FreeChooserLabels(unitlist);
  1230.   if(modelist)     FreeBrowserNodes(modelist);
  1231.   if(infolist)     FreeBrowserNodes2(infolist);
  1232.  
  1233.   /* Static */
  1234.   if(pagelist)     FreeClickTabs(pagelist);
  1235.   if(debuglist)    FreeChooserLabels(debuglist);
  1236.   if(echolist)     FreeChooserLabels(echolist);
  1237.   if(surroundlist) FreeChooserLabels(surroundlist);
  1238.   if(clipMVlist)   FreeChooserLabels(clipMVlist);
  1239.  
  1240.   unitlist = modelist = infolist =
  1241.   pagelist = debuglist = echolist = surroundlist = clipMVlist = NULL;
  1242.  
  1243.   if(Menu) FreeMenus(Menu);
  1244.  
  1245.   Menu = NULL;
  1246.  
  1247.   if(vi) FreeVisualInfo(vi);
  1248.  
  1249.   vi = NULL;
  1250.  
  1251.   if(infotext) FreeVec(infotext);
  1252.  
  1253.   infotext = NULL;
  1254.  
  1255. }
  1256.  
  1257.  
  1258.  
  1259. /******************************************************************************
  1260. **** Handles the input events *************************************************
  1261. ******************************************************************************/
  1262.  
  1263. void EventLoop(void) {
  1264.   ULONG signal  = NULL, rc;
  1265.   WORD  code;
  1266.   BOOL  running = TRUE;
  1267.  
  1268.   GetAttr( WINDOW_SigMask, WO_Window, &signal );
  1269.   if(signal) {
  1270.     do {
  1271.       if(Wait(signal | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C ) {
  1272.         running=FALSE;
  1273.       }
  1274.  
  1275.       while (( rc = CA_HandleInput( WO_Window, &code)) != WMHI_LASTMSG) {
  1276.  
  1277.         switch(rc & WMHI_CLASSMASK) {
  1278.  
  1279.           case WMHI_CLOSEWINDOW:
  1280.             running=FALSE;
  1281.             break;
  1282.  
  1283.           case WMHI_GADGETUP:
  1284.           case WMHI_MENUPICK:
  1285.           {
  1286.  
  1287.             if((rc & WMHI_CLASSMASK) == WMHI_MENUPICK) {
  1288.               struct MenuItem *mi;
  1289.               
  1290.               mi = ItemAddress(Menu, rc & WMHI_MENUMASK);
  1291.               
  1292.               if(mi) {
  1293.                 rc = (ULONG) GTMENUITEM_USERDATA(mi);
  1294.               }
  1295.             }
  1296.  
  1297.  
  1298.             switch( rc & WMHI_GADGETMASK) {
  1299.  
  1300. #if 0
  1301.               case ACTID_OPEN:
  1302.               {
  1303.                 if(DoMethod( openreq, FRM_DOREQUEST ) == FRQ_OK) {
  1304.                   char *file = NULL;
  1305.     
  1306.                   GetAttr( FRQ_Path, openreq, (ULONG *) &file);
  1307.                   NewSettings(file);
  1308.                   GUINewSettings();
  1309.                 }
  1310.                 break;
  1311.               }
  1312.     
  1313.               case ACTID_SAVEAS:
  1314.               {
  1315.                 FillUnit();
  1316.                 if(DoMethod( savereq, FRM_DOREQUEST ) == FRQ_OK) {
  1317.                   char *file = NULL;
  1318.     
  1319.                   GetAttr( FRQ_Path, savereq, (ULONG *) &file);
  1320.                   SaveSettings(file, UnitList);
  1321.                   if(SaveIcons) {
  1322.                     WriteIcon(file);
  1323.                   }
  1324.                 }
  1325.                 break;
  1326.               
  1327.               }
  1328.               
  1329. #endif
  1330.               case ACTID_ABOUT:
  1331.                 Req( (char *) msgButtonOK,
  1332.                     (char *) msgTextCopyright,
  1333.                     "",(char *) msgTextProgramName,
  1334.                     "1996-1999 Martin Blom" );
  1335.                 break;
  1336.  
  1337.               case ACTID_SAVE:
  1338.                 FillUnit();
  1339.                 SaveSettings(ENVFILE, UnitList);
  1340.                 SaveSettings(ENVARCFILE, UnitList);
  1341.                 running=FALSE;
  1342.                 break;
  1343.     
  1344.               case ACTID_USE:
  1345.                 FillUnit();
  1346.                 SaveSettings(ENVFILE, UnitList);
  1347.                 running=FALSE;
  1348.                 break;
  1349.     
  1350.               case ACTID_QUIT:
  1351.                 running=FALSE;
  1352.                 break;
  1353.     
  1354.               case ACTID_DEFAULT:
  1355.                 SetAttrs( WO_Window, WA_BusyPointer, TRUE, TAG_DONE);
  1356.                 NewSettings(NULL);    // This is VERY slow!!
  1357.                 SetAttrs( WO_Window, WA_BusyPointer, FALSE, TAG_DONE);
  1358.                 GUINewSettings();
  1359.                 break;
  1360.     
  1361.               case ACTID_LASTSAVED:
  1362.                 NewSettings(ENVARCFILE);
  1363.                 GUINewSettings();
  1364.                 break;
  1365.     
  1366.               case ACTID_RESTORE:
  1367.                 NewSettings(args.from);
  1368.                 GUINewSettings();
  1369.                 break;
  1370.  
  1371.               case ACTID_ICONS:
  1372.               {
  1373.                 struct MenuItem *item;
  1374.     
  1375.                 item = FindMenuItem(ACTID_ICONS);
  1376.     
  1377.                 if(item) {
  1378.                   if(item->Flags & CHECKED)
  1379.                     SaveIcons = TRUE;
  1380.                   else
  1381.                     SaveIcons = FALSE;
  1382.                 }
  1383.                 break;
  1384.               }
  1385.  
  1386. #if 0
  1387.     
  1388.               case ACTID_HELP: {
  1389.                 APTR lock = BGUI_LockWindow(Window);
  1390.                 if(!BGUI_Help( Window, HELPFILE, "AHI", NULL)) {
  1391.                   Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE);
  1392.                 }
  1393.                 BGUI_UnlockWindow(lock);
  1394.                 break;
  1395.               }
  1396.     
  1397.               case ACTID_GUIDE: {
  1398.                 APTR lock = BGUI_LockWindow(Window);
  1399.                 if(!BGUI_Help( Window, HELPFILE, NULL, NULL)) {
  1400.                   Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE);
  1401.                 }
  1402.                 BGUI_UnlockWindow(lock);
  1403.                 break;
  1404.               }
  1405.     
  1406.               case ACTID_HELPINDEX: {
  1407.                 APTR lock = BGUI_LockWindow(Window);
  1408.                 if(!BGUI_Help( Window, HELPFILE, "Concept Index", 0)) {
  1409.                   Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE);
  1410.                 }
  1411.                 BGUI_UnlockWindow(lock);
  1412.                 break;
  1413.               }
  1414. #endif
  1415.     
  1416.               case ACTID_UNIT: {
  1417.                 FillUnit();
  1418.                 NewUnit(code);
  1419.                 GUINewUnit();
  1420.                 break;
  1421.               }
  1422.     
  1423.               case ACTID_MODE: {
  1424.                 FillUnit();
  1425.                 NewMode(code);
  1426.                 GUINewMode();
  1427.                 break;
  1428.               }
  1429.  
  1430.               case ACTID_DEBUG:
  1431.               case ACTID_SURROUND:
  1432.               case ACTID_ECHO:
  1433.               case ACTID_CPULIMIT:
  1434.               case ACTID_CLIPMV:
  1435.               {
  1436.                 ULONG debug = AHI_DEBUG_NONE, surround = FALSE, echo = 0, cpu = 90;
  1437.                 ULONG clip = FALSE;
  1438.     
  1439.                 GetAttr( CHOOSER_Active, Window_Objs[ACTID_DEBUG],    &debug);
  1440.                 GetAttr( CHOOSER_Active, Window_Objs[ACTID_SURROUND], &surround);
  1441.                 GetAttr( CHOOSER_Active, Window_Objs[ACTID_ECHO],     &echo);
  1442.                 GetAttr( CHOOSER_Active, Window_Objs[ACTID_CLIPMV],   &clip);
  1443.                 GetAttr( INTEGER_Number, Window_Objs[ACTID_CPULIMIT], &cpu);
  1444.     
  1445.                 globalprefs.ahigp_DebugLevel      = debug;
  1446.                 globalprefs.ahigp_DisableSurround = surround;
  1447.                 globalprefs.ahigp_DisableEcho     = (echo == 2);
  1448.                 globalprefs.ahigp_FastEcho        = (echo == 1);
  1449.                 globalprefs.ahigp_MaxCPU = (cpu << 16) / 100;
  1450.                 globalprefs.ahigp_ClipMasterVolume= clip;
  1451.     
  1452.                 break;
  1453.               }
  1454.             } /* switch(GADGETMASK) */
  1455.           }
  1456.         } /* switch(CLASSMASK) */
  1457.       } /* HandleInput */
  1458.     } while(running);
  1459.   }
  1460. }
  1461.