home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d566 / am.lha / AM / AMwindow.c < prev    next >
C/C++ Source or Header  |  1991-11-21  |  14KB  |  624 lines

  1. /*
  2.  * AMwindow.c: Subtask für Parameterfenster
  3.  *
  4.  * Auto: make AMwindow.o
  5.  *
  6.  */
  7.  
  8.  
  9. #include "AM.h"
  10. #include <exec/execbase.h>
  11. #include <exec/tasks.h>
  12. #include <intuition/intuition.h>
  13. #include <intuition/gadgetclass.h>
  14. #include <graphics/gfxmacros.h>
  15. #include <utility/tagitem.h>
  16. #include <libraries/gadtools.h>
  17.  
  18. #if 0
  19. # define D(debug) debug
  20. #else
  21. # define D(debug)
  22. #endif
  23.  
  24. #define abbruch SIGBREAKF_CTRL_C
  25. #define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
  26.  
  27.  
  28. /*------------------------- Daten anderer Module...*/
  29.  
  30.  
  31. extern struct ExecBase    *SysBase;
  32. extern struct Library    *DOSBase;
  33.  
  34. extern long            channel, instr,
  35.                     freqmitte, freqabw,
  36.                     volmitte, volabw;
  37. extern double        pausen, tonaus;
  38. extern char            skala[13], cskala[12][13];
  39.  
  40.  
  41. /*------------------------- Daten dieses Moduls...*/
  42.  
  43.  
  44. static struct TextAttr Topaz80 =
  45. {
  46.     "topaz.font",            /*  Name */
  47.     8,                        /*  YSize */
  48.     0,                        /*  Style */
  49.     0,                        /*  Flags */
  50. };
  51.  
  52. struct GfxBase            *GfxBase = NULL;
  53. struct IntuitionBase    *IntuitionBase = NULL;
  54. struct Library            *GadToolsBase = NULL;
  55.  
  56. struct TextFont            *font = NULL;
  57. struct Screen            *mysc = NULL;
  58. struct Gadget            *glist = NULL;
  59. struct Window            *mywin = NULL;
  60. void                    *vi = NULL;
  61. static struct Task        *windowtask = NULL,
  62.                         *maintask = NULL;
  63.  
  64. static ULONG            topborder = 0,
  65.                         bottomEdge = 0;
  66.  
  67. enum {
  68.     GAD_KANAL = 0, GAD_INSTR, GAD_FREQMITTE, GAD_FREQABW,
  69.     GAD_VOLMITTE, GAD_VOLABW, GAD_PAUSEN, GAD_TONAUS, GAD_SKALA,
  70.     GAD_CSKALA_LIST, GAD_CSKALA_STRING,
  71.     GAD_ANZAHL
  72. };
  73.  
  74. struct Gadget *mgg[ GAD_ANZAHL ];
  75.  
  76.  
  77. char                    lt_skala[12][16];    /* Texte für ListView */
  78. struct List                lh_skala;            /* ListHeader         */
  79. struct Node                nd_skala[12];        /* Knoten für Liste   */
  80.  
  81.  
  82. /*------------------------- Code-Deklarationen...*/
  83.  
  84.  
  85. extern void ProgChange( int );
  86. extern void AllNotesOff( void );
  87. extern LONG Printf( UBYTE *, ... );
  88.  
  89. BOOL subinit( void );
  90. void subclosedown( void );
  91. void handlewindowmsg( void );
  92. struct Gadget *CreateAllGadgets(struct Gadget **, void *, UWORD);
  93. void closewindow( void );
  94.  
  95.  
  96. /*------------------------- Stub-Code...*/
  97.  
  98.  
  99. struct Gadget *CreateGadget( unsigned long kind, struct Gadget *gad,
  100.     struct NewGadget *ng, Tag tag1, ... )
  101. {
  102.     return CreateGadgetA( kind, gad, ng, (struct TagItem *)&tag1 );
  103. }
  104.  
  105. APTR GetVisualInfo( struct Screen *screen, Tag tag1, ... )
  106. {
  107.     return GetVisualInfoA( screen, (struct TagItem *)&tag1 );
  108. }
  109.  
  110. struct Window *OpenWindowTags( struct NewWindow *newWindow,
  111.     unsigned long tag1Type, ... )
  112. {
  113.     return OpenWindowTagList( newWindow, (struct TagItem *)&tag1Type );
  114. }
  115.  
  116. void GT_SetGadgetAttrs( struct Gadget *gad, struct Window *win,
  117.     struct Requester *req, Tag tag1, ... )
  118. {
  119.     GT_SetGadgetAttrsA( gad, win, req, (struct TagItem *)&tag1 );
  120. }
  121.  
  122.  
  123. /*------------------------- Code-Definitionen...*/
  124.  
  125.  
  126. static void windowtaskcode( void )
  127. {
  128.     long wmsg=0, sgns;
  129.  
  130.     geta4();
  131.     
  132.     if( !subinit() ) return;
  133.     wmsg = 1 << mywin->UserPort->mp_SigBit;
  134.  
  135.     while(1)
  136.     {
  137.     
  138.         sgns = Wait( wmsg | abbruch );
  139.         
  140.         if( sgns & wmsg )
  141.         {
  142.             handlewindowmsg();
  143.             SetSignal( 0, wmsg );
  144.         }
  145.         
  146.         if( sgns & abbruch )
  147.         {
  148.             subclosedown();
  149.             mywin = 0;
  150.             return;
  151.         }
  152.         
  153.     }
  154. }
  155.  
  156.  
  157. /* CreateAllGadgets()
  158.  *
  159.  * Diese Routine führt alle Gadget-Initialisierungen aus.
  160.  * glistptr ist ein auf NULL initialisierter GadgetList-Zeiger
  161.  * Rückgabe ist ein Zeiger auf das zuletzt erzeugte Gadget (also
  162.  * NULL bei Fehler)
  163.  *
  164.  */
  165.  
  166. static struct Gadget *CreateAllGadgets(
  167.     struct Gadget **glistptr,
  168.     void *vi,
  169.     UWORD topborder )
  170. {
  171.     struct NewGadget ng;
  172.     struct Gadget *gad;
  173.     int i;
  174.  
  175.     /*  All the gadget creation calls accept a pointer to the previous
  176.         gadget, and link the new gadget to that gadget's NextGadget field.
  177.         Also, they exit gracefully, returning NULL, if any previous gadget
  178.         was NULL.  This limits the amount of checking for failure that
  179.         is needed.  You only need to check before you tweak any gadget
  180.         structure or use any of its fields, and finally once at the end,
  181.         before you add the gadgets. */
  182.  
  183.     /*  We obligingly perform the following operation, required of
  184.         any program that uses the toolkit.  It gives the toolkit a
  185.         place to stuff context data: */
  186.     gad = CreateContext(glistptr);
  187.  
  188.     /*  Since the NewGadget structure is unmodified by any of the
  189.         CreateGadget() calls, we need only change those fields which
  190.         are different. */
  191.  
  192.     ng.ng_LeftEdge = 72;
  193.     ng.ng_TextAttr = &Topaz80;
  194.     ng.ng_VisualInfo = vi;
  195.     ng.ng_Width = 120;
  196.     ng.ng_Height = 12;
  197.     ng.ng_Flags = 0;
  198.  
  199.     ng.ng_TopEdge = topborder + INTERHEIGHT;
  200.     ng.ng_GadgetText = "Kanal:";
  201.     ng.ng_GadgetID = GAD_KANAL;
  202.     
  203.     mgg[GAD_KANAL] = gad = CreateGadget(SLIDER_KIND, gad, &ng,
  204.         GTSL_Min, 1,
  205.         GTSL_Max, 16,
  206.         GTSL_Level, channel+1,
  207.         GTSL_LevelFormat, "%2ld",
  208.         GTSL_LevelPlace, PLACETEXT_RIGHT,
  209.         GTSL_MaxLevelLen, 2,
  210.         GA_IMMEDIATE, TRUE,
  211.         GA_RELVERIFY, TRUE,
  212.         TAG_DONE);
  213.  
  214.     ng.ng_TopEdge += 12+INTERHEIGHT;
  215.     ng.ng_GadgetText = "Instr:";
  216.     ng.ng_GadgetID = GAD_INSTR;
  217.  
  218.     mgg[GAD_INSTR] = gad = CreateGadget(SLIDER_KIND, gad, &ng,
  219.         GTSL_Min, 0,
  220.         GTSL_Max, 64,
  221.         GTSL_Level, instr+1,
  222.         GTSL_LevelFormat, "%2ld",
  223.         GTSL_LevelPlace, PLACETEXT_RIGHT,
  224.         GTSL_MaxLevelLen, 2,
  225.         GA_RELVERIFY, TRUE,
  226.         TAG_DONE);
  227.  
  228.     ng.ng_TopEdge += 12+2*INTERHEIGHT;
  229.     ng.ng_GadgetText = "F-Ber:";
  230.     ng.ng_GadgetID = GAD_FREQMITTE;
  231.  
  232.     mgg[GAD_FREQMITTE] = gad = CreateGadget(SCROLLER_KIND, gad, &ng,
  233.         GTSC_Top, freqmitte-freqabw,
  234.         GTSC_Total, 128,
  235.         GTSC_Visible, freqabw*2,
  236.         GA_RELVERIFY, TRUE,
  237.         TAG_DONE);
  238.  
  239.     ng.ng_TopEdge += 12+INTERHEIGHT;
  240.     ng.ng_GadgetText = "F-Abw:";
  241.     ng.ng_GadgetID = GAD_FREQABW;
  242.  
  243.     mgg[GAD_FREQABW] = gad = CreateGadget(SLIDER_KIND, gad, &ng,
  244.         GTSL_Min, 0,
  245.         GTSL_Max, 63,
  246.         GTSL_Level, freqabw,
  247.         GTSL_LevelFormat, "±%3ld½",
  248.         GTSL_LevelPlace, PLACETEXT_RIGHT,
  249.         GTSL_MaxLevelLen, 5,
  250.         GA_RELVERIFY, TRUE,
  251.         TAG_DONE);
  252.  
  253.     ng.ng_TopEdge += 12+2*INTERHEIGHT;
  254.     ng.ng_GadgetText = "V-Ber:";
  255.     ng.ng_GadgetID = GAD_VOLMITTE;
  256.  
  257.     mgg[GAD_VOLMITTE] = gad = CreateGadget(SCROLLER_KIND, gad, &ng,
  258.         GTSC_Top, volmitte-volabw,
  259.         GTSC_Total, 128,
  260.         GTSC_Visible, volabw*2,
  261.         GA_RELVERIFY, TRUE,
  262.         TAG_DONE);
  263.  
  264.     ng.ng_TopEdge += 12+INTERHEIGHT;
  265.     ng.ng_GadgetText = "V-Abw:";
  266.     ng.ng_GadgetID = GAD_VOLABW;
  267.  
  268.     mgg[GAD_VOLABW] = gad = CreateGadget(SLIDER_KIND, gad, &ng,
  269.         GTSL_Min, 0,
  270.         GTSL_Max, 63,
  271.         GTSL_Level, volabw,
  272.         GTSL_LevelFormat, "±%3ld½",
  273.         GTSL_LevelPlace, PLACETEXT_RIGHT,
  274.         GTSL_MaxLevelLen, 5,
  275.         GA_RELVERIFY, TRUE,
  276.         TAG_DONE);
  277.  
  278.     ng.ng_TopEdge += 12+2*INTERHEIGHT;
  279.     ng.ng_GadgetText = "Pausen:";
  280.     ng.ng_GadgetID = GAD_PAUSEN;
  281.  
  282.     mgg[GAD_PAUSEN] = gad = CreateGadget(SLIDER_KIND, gad, &ng,
  283.         GTSL_Min, 0,
  284.         GTSL_Max, 100,
  285.         GTSL_Level, (long)(pausen*100),
  286.         GTSL_LevelFormat, "%3ld %%",
  287.         GTSL_LevelPlace, PLACETEXT_RIGHT,
  288.         GTSL_MaxLevelLen, 5,
  289.         GA_RELVERIFY, TRUE,
  290.         TAG_DONE);
  291.  
  292.     ng.ng_TopEdge += 12+INTERHEIGHT;
  293.     ng.ng_GadgetText = "TonAus:";
  294.     ng.ng_GadgetID = GAD_TONAUS;
  295.  
  296.     mgg[GAD_PAUSEN] = gad = CreateGadget(SLIDER_KIND, gad, &ng,
  297.         GTSL_Min, 0,
  298.         GTSL_Max, 100,
  299.         GTSL_Level, (long)(tonaus*100),
  300.         GTSL_LevelFormat, "%3ld %%",
  301.         GTSL_LevelPlace, PLACETEXT_RIGHT,
  302.         GTSL_MaxLevelLen, 5,
  303.         GA_RELVERIFY, TRUE,
  304.         TAG_DONE);
  305.  
  306.     ng.ng_TopEdge += 12+INTERHEIGHT;
  307.     ng.ng_GadgetText = "Skala:";
  308.     ng.ng_GadgetID = GAD_SKALA;
  309.     ng.ng_Height = 14;
  310.  
  311.     mgg[GAD_SKALA] = gad = CreateGadget(STRING_KIND, gad, &ng,
  312.         GTST_MaxChars, 12,
  313.         GTST_String, skala,
  314.         STRINGA_ReplaceMode, TRUE,
  315.         TAG_DONE);
  316.  
  317.     /* String-Gadget für ListView: */
  318.     ng.ng_GadgetText = NULL;
  319.     ng.ng_GadgetID = GAD_CSKALA_STRING;
  320.     ng.ng_Height = 14;
  321.     ng.ng_Width += 40;
  322.  
  323.     mgg[GAD_CSKALA_STRING] = gad = CreateGadget(STRING_KIND, gad, &ng,
  324.         GTST_MaxChars, 15,
  325.         STRINGA_ReplaceMode, TRUE,
  326.         TAG_DONE);
  327.  
  328.     /* Liste der Continue-Skalen */
  329.     ng.ng_TopEdge += 12+2*INTERHEIGHT;
  330.     ng.ng_GadgetText = "CSkala:";
  331.     ng.ng_Flags = PLACETEXT_LEFT;
  332.     ng.ng_GadgetID = GAD_CSKALA_LIST;
  333.     ng.ng_Height = 4 + 8 * 9 + 14;
  334.     
  335.     mgg[GAD_CSKALA_LIST] = gad = CreateGadget(LISTVIEW_KIND, gad, &ng,
  336.         LAYOUTA_SPACING, 1,
  337.         GTLV_Labels, &lh_skala,
  338.         GTLV_ShowSelected, mgg[GAD_CSKALA_STRING],
  339.         TAG_DONE);
  340.  
  341.     
  342.     i = GAD_CSKALA_STRING;
  343.     bottomEdge = mgg[i]->TopEdge + mgg[i]->Height + 2*INTERHEIGHT;
  344.     
  345.     
  346.     return(gad);
  347. }
  348.  
  349.  
  350. static BOOL subinit( void )
  351. // Fenster öffnen etc.
  352. {
  353.     // zunächst mal probieren, ob wir ein Fenster kriegen können...
  354.     mywin = OpenWindowTags(NULL,
  355.         WA_Title, "AM Parameter",
  356.         WA_Width, 250,
  357.         WA_Height, bottomEdge,
  358.         
  359.         WA_MinWidth, 50,
  360.         WA_MinHeight, 50,
  361.         WA_MaxWidth, 250,
  362.         WA_MaxHeight, bottomEdge,
  363.         
  364.         WA_Activate, TRUE,
  365.         WA_DragBar, TRUE,
  366.         WA_DepthGadget, TRUE,
  367.         WA_CloseGadget, TRUE,
  368.         WA_SimpleRefresh, TRUE,
  369.         
  370.         WA_IDCMP, CLOSEWINDOW | REFRESHWINDOW | \
  371.             SLIDERIDCMP | SCROLLERIDCMP | STRINGIDCMP | \
  372.             LISTVIEWIDCMP,
  373.         
  374.         TAG_DONE);
  375.     
  376.     // Na? Haben wir's?
  377.     if( !mywin )
  378.         return FALSE;
  379.  
  380.     // Ja! Nun Gadgets anhängen und refreshen...
  381.     AddGList( mywin, glist, 0, -1, NULL );
  382.     RefreshGList( glist, mywin, NULL, -1 );
  383.     GT_RefreshWindow( mywin, NULL );
  384.     
  385.     return TRUE;
  386. }
  387.  
  388.  
  389. static void subclosedown( void )
  390. {
  391.     if(mywin) CloseWindow(mywin); mywin=0;
  392. }
  393.  
  394.  
  395. static BOOL HandleGadgetEvent(
  396.     struct Gadget *gad,
  397.     UWORD code )
  398. {
  399.     char *s;
  400.     long i;
  401.     
  402.     switch (gad->GadgetID)
  403.     {
  404.         case GAD_KANAL:
  405.             // unkritisch
  406.             AllNotesOff();
  407.             channel = (WORD) code - 1;
  408.             break;
  409.  
  410.         case GAD_INSTR:
  411.             instr = (WORD) code - 1;
  412.             if( instr>=0 ) ProgChange( instr );
  413.             break;
  414.  
  415.         case GAD_FREQMITTE:
  416.             // unkritisch
  417.             freqmitte = (WORD) code + freqabw;
  418.             break;
  419.         case GAD_FREQABW:
  420.             freqabw = (WORD) code;
  421.             // Grenzen neu checken
  422.             if( freqmitte+freqabw > 127 )
  423.                 freqmitte = 127 - freqabw;
  424.             else if( freqmitte-freqabw < 0 )
  425.                 freqmitte = freqabw;
  426.             // Scroller ändern
  427.             GT_SetGadgetAttrs( mgg[GAD_FREQMITTE], mywin, NULL,
  428.                 GTSC_Top, freqmitte-freqabw,
  429.                 GTSC_Visible, freqabw*2,
  430.                 TAG_DONE );
  431.             break;
  432.  
  433.         case GAD_VOLMITTE:
  434.             // unkritisch
  435.             volmitte = (WORD) code + volabw;
  436.             break;
  437.         case GAD_VOLABW:
  438.             volabw = (WORD) code;
  439.             // Grenzen neu checken
  440.             if( volmitte+volabw > 127 )
  441.                 volmitte = 127 - volabw;
  442.             else if( volmitte-volabw < 0 )
  443.                 volmitte = volabw;
  444.             // Scroller ändern
  445.             GT_SetGadgetAttrs( mgg[GAD_VOLMITTE], mywin, NULL,
  446.                 GTSC_Top, volmitte-volabw,
  447.                 GTSC_Visible, volabw*2,
  448.                 TAG_DONE );
  449.             break;
  450.  
  451.         case GAD_PAUSEN:
  452.             // unkritisch
  453.             pausen = (WORD) code / 100.0;
  454.             break;
  455.  
  456.         case GAD_TONAUS:
  457.             // unkritisch
  458.             tonaus = (WORD) code / 100.0;
  459.             break;
  460.  
  461.         case GAD_SKALA:
  462.             s = ((struct StringInfo *)gad->SpecialInfo)->Buffer;
  463.             // 12 Zeichen?
  464.             if( strlen(s)==12 )
  465.                 strcpy( skala, s );
  466.             else
  467.                 GT_SetGadgetAttrs( gad, mywin, NULL,
  468.                     GTST_String, skala,
  469.                     TAG_DONE );
  470.             break;
  471.         
  472.         case GAD_CSKALA_LIST:
  473.             ActivateGadget( mgg[GAD_CSKALA_STRING], mywin, NULL );
  474.             break;
  475.         
  476.         case GAD_CSKALA_STRING:
  477.             s = ((struct StringInfo *)gad->SpecialInfo)->Buffer;
  478.             i = atol(s);
  479.             
  480.             if( s[2]==':' && i>=0 && i<=11 )
  481.             {
  482.                 if( strlen(s)==15 )
  483.                 {
  484.                     // komplett -> einbauen bzw. ersetzen
  485.                     strcpy(   cskala[i], s+3 );
  486.                     strcpy( lt_skala[i], s   );
  487.                     
  488.                     GT_SetGadgetAttrs( mgg[GAD_CSKALA_LIST], mywin, NULL,
  489.                         GTLV_Labels, &lh_skala,
  490.                         TAG_DONE );
  491.                     RefreshGList( mgg[GAD_CSKALA_LIST], mywin, NULL, 1 );
  492.                 }
  493.                 else if( s[3] == 0 )
  494.                 {
  495.                     // nur noch Index -> löschen
  496.                       cskala[i][0] = 0;
  497.                     lt_skala[i][3] = 0;
  498.                     
  499.                     GT_SetGadgetAttrs( mgg[GAD_CSKALA_LIST], mywin, NULL,
  500.                         GTLV_Labels, &lh_skala,
  501.                         TAG_DONE );
  502.                     RefreshGList( mgg[GAD_CSKALA_LIST], mywin, NULL, 1 );
  503.                 }
  504.             }
  505.             break;
  506.         
  507.     }
  508. }
  509.  
  510.  
  511. static void handlewindowmsg( void )
  512. {
  513.     struct IntuiMessage *imsg;
  514.     struct Gadget *gad;
  515.     ULONG imsgClass;
  516.     UWORD imsgCode;
  517.     
  518.     while( imsg = GT_GetIMsg(mywin->UserPort) )
  519.     {
  520.         imsgClass = imsg->Class;
  521.         imsgCode = imsg->Code;
  522.         gad = (struct Gadget *)imsg->IAddress;
  523.         // ^^^ natürlich nur bei Gadgets gültig
  524.         GT_ReplyIMsg(imsg);
  525.         
  526.         switch (imsgClass)
  527.         {
  528.             case MOUSEMOVE:
  529.             case GADGETUP:
  530.                 HandleGadgetEvent(gad, imsgCode);
  531.                 break;
  532.             
  533.             case CLOSEWINDOW:
  534.                 // Nur HauptTask signalisieren
  535.                 Signal( maintask, SIGBREAKF_CTRL_C );
  536.                 break;
  537.             
  538.             case REFRESHWINDOW:
  539.                 GT_BeginRefresh(mywin);
  540.                 GT_EndRefresh(mywin, TRUE);
  541.                 break;
  542.         }
  543.     }
  544. }
  545.  
  546.  
  547. //---------------------- Nach außen sichtbare Funktionen:
  548.  
  549.  
  550. BOOL startwindow( void )
  551. // Libs öffnen, etc., Task starten
  552. {
  553.     int i;
  554.  
  555.     if( !(GfxBase = (struct GfxBase *)
  556.                     OpenLibrary("graphics.library", 36L)))
  557.         return( FALSE );
  558.  
  559.     if( !(IntuitionBase = (struct IntuitionBase *)
  560.                     OpenLibrary("intuition.library", 36L))) {
  561.         closewindow();
  562.         return( FALSE ); }
  563.         
  564.  
  565.     if( !(GadToolsBase = OpenLibrary("gadtools.library", 36L))) {
  566.         closewindow();
  567.         return( FALSE ); }
  568.  
  569.     if( !(font = OpenFont(&Topaz80))) {
  570.         closewindow();
  571.         return( FALSE ); }
  572.  
  573.     if( !(mysc = LockPubScreen(NULL))) {
  574.         closewindow();
  575.         return( FALSE ); }
  576.  
  577.     if( !(vi = GetVisualInfo(mysc,TAG_DONE))) {
  578.         closewindow();
  579.         return( FALSE ); }
  580.  
  581.     topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
  582.     
  583.     NewList( &lh_skala );
  584.     for( i=0; i<=11; i++ )
  585.     {
  586.         sprintf( lt_skala[i], "%02d:%s", i, cskala[i] );
  587.         nd_skala[i].ln_Name = lt_skala[i];
  588.         AddTail( &lh_skala, &nd_skala[i] );
  589.     }
  590.     
  591.     if( !CreateAllGadgets(&glist, vi, topborder)) {
  592.         closewindow();
  593.         return( FALSE ); }
  594.     
  595.     maintask = SysBase->ThisTask;
  596.     windowtask = CreateTask( "AMsub", 0, windowtaskcode, 4000 );
  597.     return( windowtask != 0 );
  598. }
  599.  
  600.  
  601. void closewindow( void )
  602. {
  603.     // SubTask bescheid sagen
  604.     if(windowtask)
  605.     {
  606.         Signal( windowtask, SIGBREAKF_CTRL_C );
  607.         while( mywin ) Delay(25);
  608.         windowtask=0;
  609.     }
  610.  
  611.     if(GadToolsBase)
  612.     {
  613.         FreeVisualInfo(vi); vi=0;
  614.         FreeGadgets(glist); glist=0;
  615.         CloseLibrary(GadToolsBase); GadToolsBase=0;
  616.     }
  617.  
  618.     if(mysc) UnlockPubScreen(NULL, mysc); mysc=0;
  619.     if(font) CloseFont(font); font=0;
  620.  
  621.     if(IntuitionBase) CloseLibrary(IntuitionBase); IntuitionBase=0;
  622.     if(GfxBase) CloseLibrary(GfxBase); GfxBase=0;
  623. }
  624.