home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d570 / fass.lha / Fass / Fass.c < prev    next >
C/C++ Source or Header  |  1991-11-21  |  24KB  |  838 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   Fass.c
  4. *   Copyright       :   © Copyright 1991 Jaba Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   08-Sep-91
  7. *   Current version :   1.01
  8. *   Translator      :   DICE v2.6
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   17-Oct-91     1.02            FileRequester path selection added.
  15. *   21-Sep-91     1.01            Now uses the Dos ReadArgs for the Shell.
  16. *   08-Sep-91     1.00            Font directory assignment commodity.
  17. *   08-Sep-91     1.00            Based on code by Stefan Sticht. (thanks!)
  18. *
  19. *-- REV_END --*/
  20.  
  21. /*
  22.  * --- Include a whole buch of headers...
  23.  */
  24. #include <exec/types.h>
  25. #include <exec/memory.h>
  26. #include <dos/dos.h>
  27. #include <libraries/commodities.h>
  28. #include <libraries/gadtools.h>
  29. #include <libraries/asl.h>
  30. #include <intuition/intuition.h>
  31. #include <workbench/startup.h>
  32. #ifndef abs
  33. #define abs
  34. #endif
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #include <clib/alib_protos.h>
  38. #include <clib/exec_protos.h>
  39. #include <clib/dos_protos.h>
  40. #include <clib/commodities_protos.h>
  41. #include <clib/gadtools_protos.h>
  42. #include <clib/asl_protos.h>
  43. #include <clib/intuition_protos.h>
  44. #include <clib/utility_protos.h>
  45.  
  46. /*
  47.  * --- Macro's to (de)activate the commodity
  48.  */
  49. #define CxOn(b)       ActivateCxObj(b,TRUE);
  50. #define CxOff(b)      ActivateCxObj(b,FALSE);
  51.  
  52. /*
  53.  * --- Calculate a bit-mask from a signal bit.
  54.  */
  55. #define BitMask(b)    ( 1L << ((ULONG)b) )
  56.  
  57. /*
  58.  * --- Parameters and defaults.
  59.  */
  60. UBYTE *COM_PRIORITY  =  "PRIORITY";      /* PRIORITY=<pri>     */
  61. UBYTE *COM_POPWINDOW =  "POPWINDOW";     /* POPWINDOW=<YES|NO> */
  62. UBYTE *COM_POPKEY    =  "POPKEY";        /* POPKEY=<hotkey>    */
  63. UBYTE *COM_QUIT      =  "QUIT";          /* QUIT=<hotkey>      */
  64.  
  65. WORD   COM_DEF_PRI   =  0;               /* default priority   */
  66. UBYTE *COM_DEF_KEY   =  "lalt f";        /* default hotkey     */
  67. UBYTE *COM_DEF_POP   =  "NO";            /* default popwindow  */
  68. UBYTE *COM_DEF_QUI   =  "lalt q";        /* default quit       */
  69.  
  70. #define COM_KEYHOT      1L              /* event ID           */
  71. #define COM_QUITIT      2L              /* event ID           */
  72.  
  73. /*
  74.  * --- Commodity information
  75.  */
  76. #define FASS_VERSION    "v1.02"
  77. #define FASS_NAME       "Fass"
  78. #define FASS_DESCR      "Font assignment commodity."
  79. #define FASS_COPY       "© 1991 Jaba Development"
  80. #define FASS_TITLE      FASS_NAME " " FASS_VERSION ", " FASS_COPY
  81.  
  82. /*
  83.  * --- Minimum library version required
  84.  */
  85. #define MIN_LIB         36L
  86.  
  87. /*
  88.  * --- Non autoinit libraries required
  89.  */
  90. struct CxBase           *CxBase     = NULL;
  91. struct IconBase         *IconBase   = NULL;
  92.  
  93. extern struct WBStartup *_WBMsg;
  94.  
  95. /*
  96.  * --- Autoinit libraries required
  97.  */
  98. extern struct IntuitionBase *IntuitionBase;
  99. extern struct UtilityBase   *UtilityBase;
  100. extern struct GadToolsBase  *GadToolsBase;
  101.  
  102. struct MsgPort          *FASS_port  = NULL;    /* Commodity MsgPort */
  103. char                   **FASS_tool  = NULL;    /* ToolType array    */
  104. struct RDArgs           *FASS_args  = NULL;    /* Shell args        */
  105. struct RDArgs            FASS_iargs = { 0,0,0,0,0,0,0,RDAF_NOPROMPT };
  106.  
  107. ULONG                    FASS_arg[4];
  108.  
  109. UBYTE                   *FASS_temp  = "PRIORITY/n,POPWINDOW/k,POPKEY/k,QUIT/k";
  110.  
  111. struct Screen           *FASS_plock = NULL;
  112. struct Window           *FASS_wnd   = NULL;
  113. struct Gadget           *FASS_glist = NULL;
  114. struct MsgPort          *FASS_idprt = NULL;
  115.  
  116. struct Gadget           *Path, *Ass, *Hide, *Quit, *Get;
  117.  
  118. APTR                     FASS_vinfo = NULL;
  119. ULONG                    FASS_idmsk = NULL;
  120. UWORD                    FASS_open  = FALSE;
  121.  
  122. CxObj                   *FASS_brok  = NULL;    /* The broker        */
  123. CxObj                   *FASS_hkey;            /* The hotkey filter */
  124. CxObj                   *FASS_quit;            /* The quit filter   */
  125.  
  126. /*
  127.  * --- The broker data
  128.  */
  129. struct NewBroker         FASS_nbrok = {
  130.     NB_VERSION,FASS_NAME,FASS_TITLE,FASS_DESCR,
  131.     NBU_NOTIFY|NBU_UNIQUE,COF_SHOW_HIDE,NULL,0
  132. };
  133.  
  134. ULONG                    FASS_smask = NULL;    /* MsgPort signal mask */
  135. UBYTE                    FASS_dop   = FALSE;   /* Window on startup ? */
  136. UBYTE                   *FASS_keys;            /* HotKey string       */
  137. UBYTE                   *FASS_qt;              /* Quit string         */
  138.  
  139. /*
  140.  * --- Identification string for the Version CLI-command
  141.  */
  142. UBYTE                   *FASS_ver = "$VER: Fass © 1991 Jaba Development -- v1.02";
  143.  
  144. /*
  145.  * --- The window data
  146.  */
  147. struct TagItem WindowTags[] = {
  148.     WA_Left,        10,
  149.     WA_Top,         15,
  150.     WA_InnerWidth,  250,
  151.     WA_InnerHeight, 47,
  152.     WA_AutoAdjust,  TRUE,
  153.     WA_IDCMP,       IDCMP_GADGETUP | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW,
  154.     WA_Flags,       WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_SMART_REFRESH | WFLG_RMBTRAP | WFLG_GIMMEZEROZERO,
  155.     WA_PubScreen,   0,
  156.     WA_Gadgets,     0,
  157.     TAG_DONE };
  158.  
  159. UBYTE               FASS_title[40];
  160. UBYTE               FASS_def[256];
  161.  
  162. /*
  163.  * --- The ASL FileRequester data.
  164.  */
  165. struct TagItem FReqTags[] = {
  166.     ASL_Hail,       "Select FONTS: path...",
  167.     ASL_Dir,        FASS_def,
  168.     ASL_ExtFlags1,  FIL1F_NOFILES,
  169.     TAG_DONE };
  170.  
  171. /*
  172.  * --- Use topaz 80 for now
  173.  */
  174. struct TextAttr TOPAZ_80 = {
  175.     (STRPTR)"topaz.font",TOPAZ_EIGHTY,FS_NORMAL,FPF_ROMFONT };
  176.  
  177. /*
  178.  * --- EasyStruct for Say
  179.  */
  180. struct EasyStruct   FASS_say = {
  181.     sizeof(struct EasyStruct),NULL,"Fass message...",0,"OK" };
  182.  
  183. /*
  184.  * --- Program function proto-types
  185.  */
  186. void    CloseFASS( long );
  187. void    OpenFASS( void );
  188. void    CheckFASS( void );
  189. void    OpenFWin( void );
  190. void    CloseFWin( void );
  191. void    Say( char * );
  192. void    CreateFONTS( long );
  193. void    GetPath( void );
  194.  
  195. /*
  196.  * --- Open up and allocate the resources required
  197.  */
  198. void OpenFASS( void )
  199. {
  200.     UBYTE       *popup;
  201.     WORD         pri;
  202.  
  203.    /*
  204.     * --- Open up non autoinit libraries
  205.     */
  206.     if ( NOT( IconBase = (struct IconBase *)OpenLibrary( "icon.library", MIN_LIB )))
  207.         CloseFASS( 20L );
  208.     if ( NOT( CxBase = (struct CxBase *)OpenLibrary( "commodities.library", MIN_LIB )))
  209.         CloseFASS( 20L );
  210.  
  211.     if ( _WBMsg ) {
  212.        /*
  213.         * --- Initialize the ToolTypes array
  214.         */
  215.         FASS_tool = (char **)ArgArrayInit( 0L, (char **)_WBMsg );
  216.  
  217.         pri       = ArgInt( FASS_tool, COM_PRIORITY, COM_DEF_PRI );
  218.         popup     = ArgString( FASS_tool, COM_POPWINDOW, COM_DEF_POP );
  219.         FASS_keys = ArgString( FASS_tool, COM_POPKEY, COM_DEF_KEY );
  220.         FASS_qt   = ArgString( FASS_tool, COM_QUIT, COM_DEF_QUI );
  221.     } else {
  222.         if ( FASS_arg[0] )  pri       = (WORD)FASS_arg[0];
  223.         else                pri       = COM_DEF_PRI;
  224.         if ( FASS_arg[1] )  popup     = (UBYTE *)FASS_arg[1];
  225.         else                popup     = COM_DEF_POP;
  226.         if ( FASS_arg[2] )  FASS_keys = (UBYTE *)FASS_arg[2];
  227.         else                FASS_keys = COM_DEF_KEY;
  228.         if ( FASS_arg[3] )  FASS_qt   = (UBYTE *)FASS_arg[3];
  229.         else                FASS_qt   = COM_DEF_QUI;
  230.     }
  231.  
  232.    /*
  233.     * --- Set broker priority
  234.     */
  235.     FASS_nbrok.nb_Pri = pri;
  236.  
  237.    /*
  238.     * --- Check if window should be opened uppon startup
  239.     */
  240.     if ( NOT Stricmp( popup, "YES"))
  241.         FASS_dop = TRUE;
  242.  
  243.    /*
  244.     * --- Create a MsgPort
  245.     */
  246.     if ( NOT( FASS_port = CreateMsgPort()))
  247.         CloseFASS( 21L );
  248.  
  249.    /*
  250.     * --- Get the port signalmask and set the port in the broker
  251.     */
  252.     FASS_smask         = BitMask( FASS_port->mp_SigBit );
  253.     FASS_nbrok.nb_Port = FASS_port;
  254.  
  255.    /*
  256.     * --- Setup the broker
  257.     */
  258.     if ( NOT( FASS_brok = CxBroker( &FASS_nbrok, NULL )))
  259.         CloseFASS( 22L );
  260.  
  261.    /*
  262.     * --- Setup the HotKey filters and attach them to the broker
  263.     */
  264.     if ( NOT( FASS_hkey = HotKey( FASS_keys, FASS_port, COM_KEYHOT )))
  265.         CloseFASS( 23L );
  266.     AttachCxObj( FASS_brok, FASS_hkey );
  267.     if ( NOT( FASS_quit = HotKey( FASS_qt, FASS_port, COM_QUITIT )))
  268.         CloseFASS( 23L );
  269.     AttachCxObj( FASS_brok, FASS_quit );
  270.  
  271.    /*
  272.     * --- Check for occured errors
  273.     */
  274.     if (CxObjError( FASS_hkey ) || CxObjError( FASS_quit ))
  275.         CloseFASS( 24L );
  276.  
  277.    /*
  278.     * --- Activate the broker
  279.     */
  280.     CxOn( FASS_brok );
  281.  
  282.    /*
  283.     * --- Get the default FONTS path name
  284.     */
  285.     CreateFONTS( 2L );
  286. }
  287.  
  288. /*
  289.  * --- Close up and de-allocate the used resources
  290.  */
  291. void CloseFASS( long code )
  292. {
  293.     struct Message  *tmp; /* to clear the MsgPort */
  294.  
  295.    /*
  296.     * --- Delete the broker
  297.     */
  298.     if ( FASS_brok )        DeleteCxObjAll( FASS_brok );
  299.  
  300.    /*
  301.     * --- Clear and delete the MsgPort
  302.     */
  303.     if ( FASS_port ) {
  304.         while (( tmp = GetMsg( FASS_port ))) ReplyMsg( tmp );
  305.         DeleteMsgPort( FASS_port );
  306.     }
  307.  
  308.    /*
  309.     * --- If Workbench clear ArgArray else free Dos args
  310.     */
  311.     if ( _WBMsg )
  312.         ArgArrayDone();
  313.     else if ( FASS_args )
  314.         FreeArgs( FASS_args );
  315.  
  316.    /*
  317.     * --- Close the non autoinit libraries
  318.     */
  319.     if ( CxBase )           CloseLibrary( CxBase );
  320.     if ( IconBase )         CloseLibrary( IconBase );
  321.  
  322.    /*
  323.     * --- bye bye
  324.     */
  325.     exit( code );
  326. }
  327.  
  328. /*
  329.  * --- Process the messages coming through the MsgPort
  330.  */
  331. void CheckFASS( void )
  332. {
  333.     struct Message      *msg;
  334.     struct IntuiMessage *imsg;
  335.     ULONG                sig, type, id, class;
  336.     BOOL                 running = TRUE;
  337.     APTR                 obj;
  338.  
  339.     if ( FASS_dop )
  340.         OpenFWin();
  341.  
  342.     do {
  343.         sig = Wait( SIGBREAKF_CTRL_C | FASS_smask | FASS_idmsk );
  344.  
  345.         if (( sig & SIGBREAKF_CTRL_C ) == SIGBREAKF_CTRL_C ) {
  346.            /*
  347.             * --- Break signal received. Shutting down...
  348.             */
  349.             running = FALSE;
  350.         } else if (( sig & FASS_smask) == FASS_smask ) {
  351.            /*
  352.             * --- Got a message on the MsgPort. Examine it
  353.             */
  354.             while (( msg = (struct Message *)GetMsg( FASS_port ))) {
  355.  
  356.                /*
  357.                 * Get the message type and id
  358.                 */
  359.                 id   = CxMsgID((CxMsg *)msg);
  360.                 type = CxMsgType((CxMsg *)msg);
  361.                 ReplyMsg(msg);
  362.  
  363.                 switch( type ) {
  364.  
  365.                     case    CXM_IEVENT:
  366.  
  367.                         switch( id ) {
  368.  
  369.                             case    COM_KEYHOT:
  370.                                /*
  371.                                 * --- They called us...
  372.                                 */
  373.                                 OpenFWin();
  374.                                 break;
  375.  
  376.                             case    COM_QUITIT:
  377.                                /*
  378.                                 * --- bye bye
  379.                                 */
  380.                                 running = FALSE;
  381.                                 break;
  382.                         }
  383.                         break;
  384.  
  385.                     case    CXM_COMMAND:
  386.                        /*
  387.                         * --- They want us to do something...
  388.                         */
  389.                         switch( id ) {
  390.  
  391.                             case    CXCMD_KILL:
  392.                                /*
  393.                                 * --- They want us dead....
  394.                                 */
  395.                                 running = FALSE;
  396.                                 break;
  397.  
  398.                             case    CXCMD_DISABLE:
  399.                                /*
  400.                                 * --- They want us disabled...
  401.                                 */
  402.                                 CxOff( FASS_brok );
  403.                                 break;
  404.  
  405.                             case    CXCMD_ENABLE:
  406.                                /*
  407.                                 * --- They want us enabled...
  408.                                 */
  409.                                 CxOn( FASS_brok );
  410.                                 break;
  411.  
  412.                             case    CXCMD_UNIQUE:
  413.                                /*
  414.                                 * --- They tried to run a commodity
  415.                                 * --- using our name.
  416.                                 */
  417.                             case    CXCMD_APPEAR:
  418.                                /*
  419.                                 * --- They want us to open our window...
  420.                                 */
  421.                                 OpenFWin();
  422.                                 break;
  423.                             case    CXCMD_DISAPPEAR:
  424.                                /*
  425.                                 * --- They want us to close our window...
  426.                                 */
  427.                                 CloseFWin();
  428.                                 break;
  429.                         }
  430.                         break;
  431.                 }
  432.             }
  433.         } else if ( FASS_open ) {
  434.             if(( sig & FASS_idmsk ) == FASS_idmsk ) {
  435.                /*
  436.                 * --- Aha... A window message
  437.                 */
  438.                 while(( imsg = GT_GetIMsg( FASS_idprt ))) {
  439.  
  440.                    /*
  441.                     * --- Get the message class and object
  442.                     */
  443.                     class = imsg->Class;
  444.                     obj   = imsg->IAddress;
  445.                     GT_ReplyIMsg(imsg );
  446.  
  447.                     switch( class ) {
  448.  
  449.                         case IDCMP_REFRESHWINDOW:
  450.                            /*
  451.                             * --- They say it must be done....
  452.                             */
  453.                             GT_BeginRefresh( FASS_wnd );
  454.                             GT_EndRefresh( FASS_wnd, TRUE );
  455.                             break;
  456.  
  457.                         case IDCMP_CLOSEWINDOW:
  458.                            /*
  459.                             * --- They want the window closed (HIDE)
  460.                             */
  461.                             CloseFWin();
  462.                             break;
  463.  
  464.                         case IDCMP_GADGETUP:
  465.                            /*
  466.                             * --- They have pressed a gadget
  467.                             */
  468.                             if ( obj == (APTR)Path ) {
  469.                                /*
  470.                                 * --- Check you input
  471.                                 */
  472.                                 CreateFONTS( FALSE );
  473.                                 break;
  474.                             } else if ( obj == (APTR)Ass ) {
  475.                                /*
  476.                                 * --- Assign your new path
  477.                                 */
  478.                                 CreateFONTS( TRUE );
  479.                                 break;
  480.                             } else if ( obj == (APTR)Hide ) {
  481.                                /*
  482.                                 * --- Hide our window
  483.                                 */
  484.                                 CloseFWin();
  485.                                 break;
  486.                             } else if ( obj == (APTR)Quit ) {
  487.                                /*
  488.                                 * --- bye bye
  489.                                 */
  490.                                 running = FALSE;
  491.                                 break;
  492.                             } else if ( obj == (APTR)Get ) {
  493.                                /*
  494.                                 * --- Get the path using the FileRequester.
  495.                                 */
  496.                                 GetPath();
  497.                                 break;
  498.                             }
  499.                             break;
  500.                     }
  501.                     break;
  502.                 }
  503.             }
  504.         }
  505.     } while( running == TRUE );
  506.  
  507.    /*
  508.     * --- The end, Fin, Einde, Finito....
  509.     */
  510.     CloseFWin();
  511.     CxOff( FASS_brok );
  512. }
  513.  
  514. /*
  515.  * --- Open up the FASS window
  516.  */
  517. void OpenFWin( void )
  518. {
  519.     struct NewGadget    ng;
  520.     struct Gadget      *gadget, *f;
  521.  
  522.     if ( NOT FASS_open ) {
  523.        /*
  524.         * --- Lock the default public screen
  525.         */
  526.         if ( NOT( FASS_plock = LockPubScreen( NULL )))
  527.             return;
  528.  
  529.        /*
  530.         * --- Get us the screen it's visual info (for gadtools)
  531.         */
  532.         if ( NOT( FASS_vinfo = GetVisualInfo( FASS_plock, TAG_DONE )))
  533.             goto wError;
  534.  
  535.        /*
  536.         * --- Create a gadget context
  537.         */
  538.         if ( NOT ( f = gadget = CreateContext( &FASS_glist )))
  539.             goto wError;
  540.  
  541.        /*
  542.         * --- Make the path gadget
  543.         */
  544.         ng.ng_LeftEdge   = 49;
  545.         ng.ng_TopEdge    = 14;
  546.         ng.ng_Width      = 196;
  547.         ng.ng_Height     = 14;
  548.         ng.ng_TextAttr   = &TOPAZ_80;
  549.         ng.ng_GadgetID   = 0;
  550.         ng.ng_VisualInfo = FASS_vinfo;
  551.         ng.ng_GadgetText = "Please enter FONTS path :     ";
  552.         ng.ng_Flags      = PLACETEXT_ABOVE;
  553.  
  554.         if ( NOT( gadget = CreateGadget( STRING_KIND, gadget, &ng, GTST_MaxChars, 256L, GTST_String, FASS_def, TAG_DONE )))
  555.             goto wError;
  556.  
  557.         Path              = gadget;
  558.         Path->Activation |= GACT_STRINGCENTER;
  559.  
  560.        /*
  561.         * --- Make the get gadget
  562.         */
  563.  
  564.         ng.ng_LeftEdge   = 5;
  565.         ng.ng_Width      = 35;
  566.         ng.ng_GadgetText = "Get";
  567.         ng.ng_GadgetID   = 4;
  568.         ng.ng_Flags      = PLACETEXT_IN;
  569.  
  570.         gadget = CreateGadget( BUTTON_KIND, gadget, &ng, TAG_DONE );
  571.  
  572.         Get = gadget;
  573.  
  574.        /*
  575.         * --- Make the assign gadget
  576.         */
  577.         ng.ng_LeftEdge   = 5;
  578.         ng.ng_TopEdge    = 31;
  579.         ng.ng_Width      = 74;
  580.         ng.ng_GadgetID   = 1;
  581.         ng.ng_GadgetText = "Assign";
  582.         ng.ng_Flags      = PLACETEXT_IN;
  583.  
  584.         gadget = CreateGadget( BUTTON_KIND, gadget, &ng, TAG_DONE );
  585.  
  586.         Ass = gadget;
  587.  
  588.        /*
  589.         * --- Make the hide gadget
  590.         */
  591.         ng.ng_LeftEdge   = 88;
  592.         ng.ng_GadgetID   = 2;
  593.         ng.ng_GadgetText = "HIDE";
  594.  
  595.         gadget = CreateGadget( BUTTON_KIND, gadget, &ng, TAG_DONE );
  596.  
  597.         Hide = gadget;
  598.  
  599.        /*
  600.         * --- Make the quit gadget
  601.         */
  602.         ng.ng_LeftEdge   = 171;
  603.         ng.ng_GadgetID   = 3;
  604.         ng.ng_GadgetText = "QUIT";
  605.  
  606.         if ( NOT ( gadget = CreateGadget( BUTTON_KIND, gadget, &ng, TAG_DONE )))
  607.             goto wError;
  608.  
  609.         Quit = gadget;
  610.  
  611.        /*
  612.         * --- Complete our window taglist
  613.         */
  614.         WindowTags[7].ti_Data = (ULONG)FASS_plock;
  615.         WindowTags[8].ti_Data = (ULONG)f;
  616.  
  617.        /*
  618.         * --- Open our window
  619.         */
  620.         if( NOT( FASS_wnd = OpenWindowTagList( NULL, &WindowTags[0] )))
  621.             goto wError;
  622.  
  623.        /*
  624.         * --- They say it has to be done
  625.         */
  626.         GT_RefreshWindow( FASS_wnd, NULL );
  627.  
  628.        /*
  629.         * --- Activate our string gadget
  630.         */
  631.         ActivateGadget( Path, FASS_wnd, NULL );
  632.  
  633.        /*
  634.         * --- Set our window it's title
  635.         */
  636.         strcpy((char *)&FASS_title[0],FASS_NAME " " FASS_VERSION " : ");
  637.         strncat((char *)&FASS_title[0],(char *)FASS_keys,26L);
  638.  
  639.         SetWindowTitles( FASS_wnd, (char *)&FASS_title[0], (char *)-1L );
  640.  
  641.        /*
  642.         * --- Needed to read the window messages
  643.         */
  644.         FASS_idprt = FASS_wnd->UserPort;
  645.         FASS_idmsk = BitMask( FASS_idprt->mp_SigBit );
  646.  
  647.         FASS_open = TRUE;
  648.         return;
  649.     }
  650.     return;
  651.  
  652. wError:
  653.     CloseFWin();
  654.     return;
  655. }
  656.  
  657. /*
  658.  * --- Close up the FASS window
  659.  */
  660. void CloseFWin( void )
  661. {
  662.     if( FASS_open ) {
  663.        /*
  664.         * --- Close our window
  665.         */
  666.         if ( FASS_wnd ) {
  667.             CloseWindow( FASS_wnd );
  668.             FASS_idprt = NULL;
  669.             FASS_idmsk = NULL;
  670.             FASS_wnd   = NULL;
  671.         }
  672.  
  673.        /*
  674.         * --- Free our gadgets
  675.         */
  676.         if ( FASS_glist ) {
  677.             FreeGadgets( FASS_glist );
  678.             FASS_glist = NULL;
  679.         }
  680.  
  681.        /*
  682.         * --- Free our visualinfo
  683.         */
  684.         if ( FASS_vinfo ) {
  685.             FreeVisualInfo( FASS_vinfo );
  686.             FASS_vinfo = NULL;
  687.         }
  688.  
  689.        /*
  690.         * --- And unlock the used public screen
  691.         */
  692.         if ( FASS_plock ) {
  693.             UnlockPubScreen( NULL, FASS_plock );
  694.             FASS_plock = NULL;
  695.         }
  696.  
  697.         FASS_open = FALSE;
  698.     }
  699. }
  700.  
  701. /*
  702.  * --- Display a requester
  703.  */
  704. void Say( char *message )
  705. {
  706.     FASS_say.es_TextFormat = message;
  707.  
  708.     EasyRequest( NULL, &FASS_say, NULL, NULL );
  709. }
  710.  
  711. /*
  712.  * --- Get the FONTS: path using the ASL FileRequester.
  713.  */
  714. void GetPath( void )
  715. {
  716.     struct FileRequester    *freq = 0l;
  717.  
  718.     if ( freq = AllocAslRequest( ASL_FileRequest, TAG_DONE )) {
  719.         if ( AslRequest( freq, FReqTags )) {
  720.             strcpy( FASS_def, freq->rf_Dir );
  721.             GT_SetGadgetAttrs( Path, FASS_wnd, 0l, GTST_String, FASS_def, TAG_DONE );
  722.         }
  723.         FreeAslRequest( freq );
  724.     }
  725. }
  726.  
  727. /*
  728.  * --- Try to assign the new FONTS path
  729.  */
  730. void CreateFONTS( long set )
  731. {
  732.     struct FileInfoBlock    *finfo = NULL;
  733.     UBYTE                   *pbuf;
  734.     BPTR                     lock = NULL;
  735.     BOOL                     succ = FALSE;
  736.  
  737.    /*
  738.     * --- Get the FONTS directory full path name
  739.     */
  740.     if (( lock = Lock( "FONTS:" , ACCESS_READ )))
  741.         succ = NameFromLock( lock, (char *)&FASS_def[0], 256L );
  742.     if (( NOT succ) || ( NOT lock ))
  743.         strcpy((char *)&FASS_def[0],"SYS:Fonts");
  744.     if ( lock ) {
  745.         UnLock( lock );
  746.         lock = NULL;
  747.     }
  748.  
  749.    /*
  750.     * --- If set is 2 we dont want to do more
  751.     */
  752.     if( set == 2 ) return;
  753.  
  754.    /*
  755.     * --- Is there another way to get this ???????
  756.     */
  757.     pbuf = (char *)((struct StringInfo *)Path->SpecialInfo)->Buffer;
  758.  
  759.    /*
  760.     * --- Allocate a FileInfoBlock structure
  761.     */
  762.     if (( finfo = (struct FileInfoBlock *)AllocMem( (ULONG)sizeof(struct FileInfoBlock) , MEMF_PUBLIC | MEMF_CLEAR ))) {
  763.        /*
  764.         * --- Try to lock your input
  765.         */
  766.         if (( lock = Lock( pbuf, ACCESS_READ ))) {
  767.            /*
  768.             * --- Examine the lock
  769.             */
  770.             if (( Examine( lock, finfo ))) {
  771.                /*
  772.                 * --- Check if it's a directory
  773.                 */
  774.                 if ( finfo->fib_DirEntryType > 0 ) {
  775.                    /*
  776.                     * --- Check if it must be assigned
  777.                     */
  778.                     if( set ) {
  779.                        /*
  780.                         * Try to assign the directory
  781.                         */
  782.                         if (( AssignLock( "FONTS", lock ))) {
  783.                             Say("Directory assigned!");
  784.                             strcpy( (char *)&FASS_def[0], pbuf );
  785.                             goto suxxess;
  786.                         } else
  787.                             Say("Can't make the assign!");
  788.                     } else
  789.                         goto checked;
  790.                 } else
  791.                     Say("Not a directory!");
  792.             } else
  793.                 Say("Can't examine object!");
  794.         } else
  795.             Say("Can't lock the object!");
  796.     } else
  797.         Say("Out of memory!");
  798.  
  799.    /*
  800.     * --- Faulty input! Redisplay old path
  801.     */
  802.     strcpy(pbuf,(char *)&FASS_def[0]);
  803.     RefreshGList(Path,FASS_wnd,NULL,1L);
  804.     ActivateGadget( Path, FASS_wnd, NULL );
  805. checked:
  806.    /*
  807.     * --- Only unlock if lock isn't used for the assignment
  808.     */
  809.     if(lock) UnLock(lock);
  810. suxxess:
  811.     if(finfo)   FreeMem( finfo, (ULONG)sizeof(struct FileInfoBlock ));
  812. }
  813.  
  814. /*
  815.  * --- Simple main which set's things in motion
  816.  */
  817. void _main( void )
  818. {
  819.     if ( NOT _WBMsg ) {
  820.         setmem( (void *)&FASS_arg[0], 16L, 0L );
  821.         if (( FASS_args = ReadArgs( FASS_temp, &FASS_arg[0], &FASS_iargs ))) {
  822.             OpenFASS();
  823.             CheckFASS();
  824.             CloseFASS( 0L );
  825.         }
  826.         CloseFASS( 27L );
  827.     } else {
  828.         if ( _WBMsg->sm_ArgList->wa_Lock )
  829.             CurrentDir( _WBMsg->sm_ArgList->wa_Lock );
  830.  
  831.         OpenFASS();
  832.         CheckFASS();
  833.         CloseFASS( 0L );
  834.     }
  835.     atoi(""); /*** otherwise we get a link error and we don't want that ***/
  836.     _waitwbmsg();
  837. }
  838.