home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d812 / ppmc.lha / PPMC / Source / PPMC1.2b_source.lha / ppmc.c < prev    next >
C/C++ Source or Header  |  1993-01-27  |  13KB  |  413 lines

  1. /*
  2.                             ----------------------
  3.                                     ppmc.c
  4.                              © 1992,1993 REELSOFT
  5.                             ----------------------
  6. */
  7.  
  8. #include    <proto/intuition.h>
  9. #include    <proto/gadtools.h>
  10. #include    <proto/exec.h>
  11. #include    <proto/graphics.h>
  12. #include    <proto/utility.h>
  13.  
  14. #include    <intuition/classes.h>
  15. #include    <intuition/classusr.h>
  16. #include    <intuition/imageclass.h>
  17. #include    <intuition/gadgetclass.h>
  18. #include    <graphics/gfxbase.h>
  19. #include    <graphics/gfxmacros.h>
  20. #include    <utility/hooks.h>
  21.  
  22. #include    <string.h>
  23.  
  24. #include    "protos.h"
  25. #include    "macros.h"
  26. #include    "debug.h"
  27.  
  28. #include    "ppmc.h"
  29. #include    "locale.h"
  30.  
  31. struct    Screen        *Scr        = NULL ;
  32. APTR                VisualInfo    = NULL ;
  33. struct    Window        *Wnd        = NULL ;
  34. struct    Gadget        *GList        = NULL ;
  35. struct    Menu        *Menus        = NULL ;
  36. struct    Gadget        *Gadgets[GAD_CNT] ;
  37.  
  38. extern    Class        *initGet (VOID) ;
  39. struct    IClass        *getClass    = NULL ;
  40. struct    _Object        *getImage    = NULL ;
  41.  
  42. struct    TextAttr    Fnt = { (STRPTR)"PPMC.font",8,0x00,0x20 } ;
  43.  
  44. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  45. UBYTE    SetupScreen (VOID)
  46. {
  47.     if ( NOT (Scr = LockPubScreen (sup.pubscreen))
  48.       && NOT (Scr = LockPubScreen ("Workbench")) )
  49.         return (1) ;
  50.  
  51.     VisualInfo = GetVisualInfo (Scr,TAG_DONE) ;
  52.     if (NOT VisualInfo)
  53.         return (2) ;
  54.  
  55.     getClass = initGet() ;
  56.     if (NOT getClass)
  57.         return (3) ;
  58.  
  59.     getImage = NewObject (getClass,NULL,GT_VisualInfo,VisualInfo,TAG_DONE) ;
  60.     if (NOT getImage)
  61.         return (4) ;
  62.  
  63.     return (0) ;
  64. }
  65. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  66. VOID    CloseDownScreen (VOID)
  67. {
  68.     if (getImage)
  69.         DisposeObject (getImage) ;
  70.     if (getClass)
  71.         FreeClass (getClass) ;
  72.     if (VisualInfo)
  73.         FreeVisualInfo (VisualInfo) ;
  74.     if (Scr)
  75.         UnlockPubScreen (NULL,Scr) ;
  76. }
  77.  
  78. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  79. //    Menus & Gadgets initialization :
  80. UBYTE    *Efficiency[6], *SUBuffer[4], *DecEffect[6] ;
  81. ULONG    GTags[] = {    (GTTX_Text),    NULL,                //    Status
  82.                     (GTTX_Border),    TRUE,    (TAG_DONE),
  83.                                             (TAG_DONE),    //    Load
  84.                     (GTTX_Border),    TRUE,    (TAG_DONE),    //    FileName
  85.                     (GTNM_Border),    TRUE,    (TAG_DONE),    //    Size
  86.                     (GT_Underscore), '_',                //    Encrypt
  87.                     (GTCB_Checked),    NULL,    (TAG_DONE),
  88.                     (GTNM_Border),    TRUE,    (TAG_DONE),    //    Gained
  89.                     (GTNM_Border),    TRUE,    (TAG_DONE),    //    Packed
  90.                     (GTCY_Labels),    NULL,                //    CrunEff
  91.                     (GTCY_Active),    NULL,    (TAG_DONE),
  92.                     (GTCY_Labels),    NULL,                //    SUBuffer
  93.                     (GTCY_Active),    NULL,    (TAG_DONE),
  94.                     (GTCY_Labels),    NULL,                //    DecrEff
  95.                     (GTCY_Active),    NULL,    (TAG_DONE),
  96.                                             (TAG_DONE),    //    About
  97.                     (GT_Underscore), '_',
  98.                     (GA_Disabled),    TRUE,    (TAG_DONE),    //    Save
  99.                     (GT_Underscore), '_',
  100.                     (GA_Disabled),    TRUE,    (TAG_DONE),    //    Pack
  101.                     (GT_Underscore), '_',
  102.                     (GA_Disabled),    TRUE,    (TAG_DONE),    //    UnPack
  103.                     (GA_Disabled),    TRUE,    (TAG_DONE)    //    Abort
  104. } ;
  105. UWORD    GTypes[] = {    TEXT_KIND,        //    Status
  106.                         GENERIC_KIND,    //    Load
  107.                         TEXT_KIND,        //    FileName
  108.                         NUMBER_KIND,    //    Size
  109.                         CHECKBOX_KIND,    //    Encrypt
  110.                         NUMBER_KIND,    //    Gained
  111.                         NUMBER_KIND,    //    Packed
  112.                         CYCLE_KIND,        //    CrunEff
  113.                         CYCLE_KIND,        //    SUBuffer
  114.                         CYCLE_KIND,        //    DecrEff
  115.                         BUTTON_KIND,    //    About
  116.                         BUTTON_KIND,    //    Save
  117.                         BUTTON_KIND,    //    Pack
  118.                         BUTTON_KIND,    //    UnPack
  119.                         BUTTON_KIND        //    Abort
  120. } ;
  121. struct    NewGadget    NGad[] = {
  122.      21, 9,301,14,NULL,NULL,GD_Status,    0,                NULL,NULL,
  123.      21,27, 20,14,NULL,NULL,GD_Load,    0,                NULL,NULL,
  124.      46,27,150,14,NULL,NULL,GD_FileName,PLACETEXT_LEFT,    NULL,NULL,
  125.     261,27, 61,14,NULL,NULL,GD_Size,    PLACETEXT_LEFT,    NULL,NULL,
  126.     21, 48, 26,11,NULL,NULL,GD_Encrypt,    PLACETEXT_RIGHT
  127.                                         |NG_HIGHLABEL,    NULL,NULL,
  128.     261,45, 41,14,NULL,NULL,GD_Gained,    PLACETEXT_LEFT,    NULL,NULL,
  129.     261,72, 41,14,"%", NULL,GD_Packed,    PLACETEXT_RIGHT,NULL,NULL,
  130.     356,16,101,15,NULL,NULL,GD_CrunEff,    PLACETEXT_LEFT,    NULL,NULL,
  131.     356,43,101,15,NULL,NULL,GD_SUBuffer,PLACETEXT_LEFT,    NULL,NULL,
  132.     356,70,101,15,NULL,NULL,GD_DecrEff,    PLACETEXT_LEFT,    NULL,NULL,
  133.      11,94, 66,15,NULL,NULL,GD_About,    PLACETEXT_IN,    NULL,NULL,
  134.      96,94, 66,15,NULL,NULL,GD_Save,    PLACETEXT_IN,    NULL,NULL,
  135.     181,94, 66,15,NULL,NULL,GD_Pack,    PLACETEXT_IN,    NULL,NULL,
  136.     266,94, 66,15,NULL,NULL,GD_UnPack,    PLACETEXT_IN,    NULL,NULL,
  137.     346,94,121,15,NULL,NULL,GD_Abort,    PLACETEXT_IN,    NULL,NULL
  138. } ;
  139. struct    NewMenu    NewMenu[] = {
  140.     NM_TITLE, 0, 0, 0, 0L, 0,
  141.         NM_ITEM, 0, 0, 0, 0L, 0,
  142.         NM_ITEM, (STRPTR)NM_BARLABEL, 0, 0, 0L, 0,
  143.         NM_ITEM, 0, 0, 0, 0L, 0,
  144.         NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
  145.         NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
  146.         NM_ITEM, (STRPTR)NM_BARLABEL, 0, 0, 0L, 0,
  147.         NM_ITEM, 0, 0, 0, 0L, 0,
  148.     NM_TITLE, 0, 0, 0, 0L, 0,
  149.         NM_ITEM, 0, 0, 0, 0L, 0,
  150.             NM_SUB, 0, 0, 0, 0L, 0,
  151.             NM_SUB, 0, 0, 0, 0L, 0,
  152.             NM_SUB, 0, 0, 0, 0L, 0,
  153.             NM_SUB, 0, 0, 0, 0L, 0,
  154.             NM_SUB, 0, 0, 0, 0L, 0,
  155.         NM_ITEM, 0, 0, 0, 0L, 0,
  156.             NM_SUB, 0, 0, 0, 0L, 0,
  157.             NM_SUB, 0, 0, 0, 0L, 0,
  158.             NM_SUB, 0, 0, 0, 0L, 0,
  159.         NM_ITEM, 0, 0, 0, 0L, 0,
  160.             NM_SUB, 0, 0, 0, 0L, 0,
  161.             NM_SUB, 0, 0, 0, 0L, 0,
  162.             NM_SUB, 0, 0, 0, 0L, 0,
  163.             NM_SUB, 0, 0, 0, 0L, 0,
  164.             NM_SUB, 0, 0, 0, 0L, 0,
  165.         NM_ITEM, 0, 0, 0, 0L, 0,
  166.     NM_TITLE, 0, 0, 0, 0L, 0,
  167.         NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
  168.         NM_ITEM, 0, 0, NM_ITEMDISABLED, 0L, 0,
  169.     NM_END, 0, 0, 0, 0L, 0
  170. } ;
  171. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  172. VOID    InitGadNames (VOID)
  173. {
  174.     REGISTER    UBYTE    n ;
  175.  
  176.     //    Gadget names definition (Cycle gadget names are made upper case) :
  177.     for (n=0 ; n<5 ; n++) {
  178.         Efficiency[n] = strdup (LOC(MSG_EFFICIENCY0_GAD+n)) ;
  179.         strupr (Efficiency[n]) ;
  180.         if (n<3) {
  181.             SUBuffer[n] = strdup (LOC(MSG_SUBUFFER0_GAD+n)) ;
  182.             strupr (SUBuffer[n]) ;
  183.         }
  184.         DecEffect[n] = strdup (LOC(MSG_DECEFFECT0_GAD+n)) ;
  185.         strupr (DecEffect[n]) ;
  186.     }
  187.     Efficiency[5] = SUBuffer[3] = DecEffect[5] = NULL ;
  188.  
  189.     //    Note: I should find another way to change theese tags...
  190.     GTags[1]    = (ULONG)LOC (MSG_STATUS_BEGIN) ;
  191.     GTags[24]    = (ULONG)&Efficiency[0] ;
  192.     GTags[29]    = (ULONG)&SUBuffer[0] ;
  193.     GTags[34]    = (ULONG)&DecEffect[0] ;
  194.     GTags[15]    = pac.pass ;
  195.     GTags[26]    = pac.eff ;
  196.     GTags[31]    = pac.buf ;
  197.     GTags[36]    = pac.dec ;
  198.  
  199.     NGLAB (GD_Size)        = LOC (MSG_SIZE_GAD) ;
  200.     NGLAB (GD_Encrypt)    = LOC (MSG_ENCRYPT_GAD) ;
  201.     NGLAB (GD_Gained)    = LOC (MSG_GAIN_GAD) ;
  202.     NGLAB (GD_About)    = LOC (MSG_ABOUT_GAD) ;
  203.     NGLAB (GD_Save)        = LOC (MSG_SAVE_GAD) ;
  204.     NGLAB (GD_Pack)        = LOC (MSG_PACK_GAD) ;
  205.     NGLAB (GD_UnPack)    = LOC (MSG_UNPACK_GAD) ;
  206.     NGLAB (GD_Abort)    = LOC (MSG_ABORT_GAD) ;
  207.  
  208.     //    Menu names definition :
  209.     NMLAB  (NM_Project_Menu)            = LOC (MSG_PROJECT_MENU) ;
  210.     NMLAB  (NM_Project_About)            = LOC (MSG_PROJECT_ABOUT) ;
  211.     NMLAB  (NM_Project_Load)            = LOC (MSG_PROJECT_LOAD) ;
  212.     NMLAB  (NM_Project_Save)            = LOC (MSG_PROJECT_SAVE) ;
  213.     NMLAB  (NM_Project_SaveAs)            = LOC (MSG_PROJECT_SAVEAS) ;
  214.     NMLAB  (NM_Project_Quit)            = LOC (MSG_PROJECT_QUIT) ;
  215.     NMLAB  (NM_Parameters_Menu)            = LOC (MSG_PARAMETERS_MENU) ;
  216.     NMLAB  (NM_Parameters_Efficiency)    = LOC (MSG_PARAMETERS_EFFICIENCY) ;
  217.     NMLAB  (NM_Efficiency0)                = LOC (MSG_EFFICIENCY0_GAD) ;
  218.     NMLAB  (NM_Efficiency1)                = LOC (MSG_EFFICIENCY1_GAD) ;
  219.     NMLAB  (NM_Efficiency2)                = LOC (MSG_EFFICIENCY2_GAD) ;
  220.     NMLAB  (NM_Efficiency3)                = LOC (MSG_EFFICIENCY3_GAD) ;
  221.     NMLAB  (NM_Efficiency4)                = LOC (MSG_EFFICIENCY4_GAD) ;
  222.     NMLAB  (NM_Parameters_SUBuffer)        = LOC (MSG_PARAMETERS_SUBUFFER) ;
  223.     NMLAB  (NM_SUBuffer0)                = LOC (MSG_SUBUFFER0_GAD) ;
  224.     NMLAB  (NM_SUBuffer1)                = LOC (MSG_SUBUFFER1_GAD) ;
  225.     NMLAB  (NM_SUBuffer2)                = LOC (MSG_SUBUFFER2_GAD) ;
  226.     NMLAB  (NM_Parameters_DecEffect)    = LOC (MSG_PARAMETERS_DECEFFECT) ;
  227.     NMLAB  (NM_DecEffect0)                = LOC (MSG_DECEFFECT0_GAD) ;
  228.     NMLAB  (NM_DecEffect1)                = LOC (MSG_DECEFFECT1_GAD) ;
  229.     NMLAB  (NM_DecEffect2)                = LOC (MSG_DECEFFECT2_GAD) ;
  230.     NMLAB  (NM_DecEffect3)                = LOC (MSG_DECEFFECT3_GAD) ;
  231.     NMLAB  (NM_DecEffect4)                = LOC (MSG_DECEFFECT4_GAD) ;
  232.     NMLAB  (NM_Parameters_Encrypt)        = LOC (MSG_PARAMETERS_ENCRYPT) ;
  233.     NMLAB  (NM_Crunching_Menu)            = LOC (MSG_CRUNCHING_MENU) ;
  234.     NMLAB  (NM_Crunching_Pack)            = LOC (MSG_CRUNCHING_PACK) ;
  235.     NMLAB  (NM_Crunching_UnPack)        = LOC (MSG_CRUNCHING_UNPACK) ;
  236.  
  237.     NMCKEY (NM_Project_About)            = LOC (MSG_PROJECT_ABOUT_CKEY) ;
  238.     NMCKEY (NM_Project_Load)            = LOC (MSG_PROJECT_LOAD_CKEY) ;
  239.     NMCKEY (NM_Project_Save)            = LOC (MSG_PROJECT_SAVE_CKEY) ;
  240.     NMCKEY (NM_Project_SaveAs)            = LOC (MSG_PROJECT_SAVEAS_CKEY) ;
  241.     NMCKEY (NM_Project_Quit)            = LOC (MSG_PROJECT_QUIT_CKEY) ;
  242.     NMCKEY (NM_Parameters_Encrypt)        = LOC (MSG_PARAMETERS_ENCRYPT_CKEY) ;
  243.     NMCKEY (NM_Crunching_Pack)            = LOC (MSG_CRUNCHING_PACK_CKEY) ;
  244.     NMCKEY (NM_Crunching_UnPack)        = LOC (MSG_CRUNCHING_UNPACK_CKEY) ;
  245.  
  246.     NMFLAG (NM_Parameters_Encrypt) = CHECKIT|MENUTOGGLE|(pac.pass?CHECKED:0) ;
  247. }
  248. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  249. struct    IntuiText    IText[] = {    2,0,JAM1,0, 8,&Fnt,0,&IText[1],
  250.                                 2,0,JAM1,0,35,&Fnt,0,&IText[2],
  251.                                 2,0,JAM1,0,62,&Fnt,0,NULL        } ;
  252. UWORD    pattern[] = { 0x5555,0xAAAA } ;
  253. VOID    Render (VOID)
  254. {
  255.     if (sup.fill) {
  256.         SetAPen  (WRP,sup.apen) ;
  257.         SetBPen  (WRP,0) ;
  258.         SetAfPt  (WRP,pattern,1) ;
  259.         RectFill (WRP,  4,WBT,481,WBT+112) ;
  260.  
  261.         SetAfPt  (WRP,NULL,0) ;
  262.         RectFill (WRP, 17,WBT+ 5,333,WBT+62) ;
  263.         RectFill (WRP, 17,WBT+69,333,WBT+88) ;
  264.         RectFill (WRP,352,WBT+ 5,468,WBT+88) ;
  265.  
  266.         SetAPen  (WRP,0) ;    //    Cleaning-up the overlapped gadgets..
  267.         RectFill (WRP, 27,WBT+10,323,WBT+21) ;    //    status gadget
  268.         RectFill (WRP, 52,WBT+28,197,WBT+39) ;    //    file name gadget
  269.         RectFill (WRP,267,WBT+28,323,WBT+39) ;    //    size gadget
  270.         RectFill (WRP,267,WBT+46,303,WBT+57) ;    //    % gain gadget
  271.         RectFill (WRP, 27,WBT+72,243,WBT+85) ;    //    gauge
  272.         RectFill (WRP,267,WBT+73,303,WBT+84) ;    //    % packed gadget
  273.  
  274.         RefreshGList (GList,Wnd,NULL,-1) ;
  275.         SetAfPt  (WRP,pattern,1) ;
  276.     }
  277.  
  278.     DrawBevelBox (WRP, 15,WBT +4,321,60,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;
  279.     DrawBevelBox (WRP, 15,WBT+68,321,22,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;
  280.     DrawBevelBox (WRP,350,WBT +4,121,86,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;
  281.     DrawBevelBox (WRP, 25,WBT+71,221,16,GT_VisualInfo,VI,GTBB_Recessed,TRUE,TAG_DONE) ;
  282.  
  283.     PrintIText (WRP,IText,0,WBT) ;
  284. }
  285. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  286. #define    WND_WIDTH    486
  287. #define    WND_HEIGHT    115
  288. UBYTE    SetupWindow (VOID)
  289. {
  290.     struct    IntuiText    tmpIText ;
  291.     struct    NewGadget    ng ;
  292.     struct    Gadget        *g ;
  293.     REGISTER UWORD        lc, tc, zoom[4] ;
  294.  
  295.     InitGadNames() ;
  296.  
  297.     IText[0].IText = LOC(MSG_EFFICIENCY_ITEXT) ;
  298.     IText[1].IText = LOC(MSG_SUBUFFER_ITEXT) ;
  299.     IText[2].IText = LOC(MSG_DECEFFECT_ITEXT) ;
  300.  
  301.     //    calculating the position of the cycle gadgets title..
  302.     tmpIText.ITextFont = &Fnt ;
  303.     for (tc=0 ; tc<3 ; tc++) {
  304.         tmpIText.IText = IText[tc].IText ;
  305.         IText[tc].LeftEdge = (117-IntuiTextLength(&tmpIText))/2+352 ;
  306.     }
  307.  
  308.     g = CreateContext (&GList) ;
  309.     if (NOT g)
  310.         return (1) ;
  311.  
  312.     for (lc=0,tc=0 ; lc<GAD_CNT ; lc++) {
  313.         CopyMem ((char *)&NGad[lc],(char *)&ng,(LONG)sizeof(struct NewGadget)) ;
  314.  
  315.         ng.ng_VisualInfo     = VisualInfo ;
  316.         ng.ng_TextAttr         = &Fnt ;
  317.         ng.ng_LeftEdge        += OFFX ;
  318.         ng.ng_TopEdge        += OFFY ;
  319.  
  320.         Gadgets[lc] = g = CreateGadgetA ((ULONG)GTypes[lc],g,&ng,(struct TagItem *)>ags[tc]) ;
  321.  
  322.         if (GTypes[lc]    == GENERIC_KIND) {
  323.             g->Flags        |= GFLG_GADGIMAGE | GFLG_GADGHIMAGE ;
  324.             g->Activation    |= GACT_RELVERIFY ;
  325.             g->GadgetRender     = (APTR)getImage ;
  326.             g->SelectRender     = (APTR)getImage ;
  327.         }
  328.  
  329.         while (GTags[tc])
  330.             tc += 2 ;
  331.         tc++ ;
  332.  
  333.         if (NOT g)
  334.             return (2) ;
  335.     }
  336.  
  337.     Menus = CreateMenus (NewMenu,GTMN_FrontPen,0L,TAG_DONE) ;
  338.     if (Menus == NULL)
  339.         return (3) ;
  340.  
  341.     LayoutMenus (Menus,VisualInfo,TAG_END) ;
  342.  
  343.     zoom[0] = 0 ;
  344.     zoom[1] = zoom[3] = OFFY ;
  345.     zoom[2] = TextLength (&Scr->RastPort,(UBYTE *)"PPMC",5)+80 ;
  346.  
  347.     Wnd = OpenWindowTags (    NULL,
  348.                             WA_Left,            (Scr->Width-WND_WIDTH)/2,
  349.                             WA_Top,                (Scr->Height-WND_HEIGHT)/2,
  350.                             WA_Width,            WND_WIDTH,
  351.                             WA_Height,            WND_HEIGHT+OFFY,
  352.                             WA_IDCMP,            IDCMP_REFRESHWINDOW
  353.                                                 |IDCMP_GADGETUP
  354.                                                 |IDCMP_MENUPICK
  355.                                                 |IDCMP_CLOSEWINDOW
  356.                                                 |IDCMP_VANILLAKEY,
  357.                             WA_Flags,            WFLG_DRAGBAR
  358.                                                 |WFLG_DEPTHGADGET
  359.                                                 |WFLG_CLOSEGADGET
  360.                                                 |WFLG_SMART_REFRESH
  361.                                                 |WFLG_ACTIVATE,
  362.                             WA_Gadgets,            GList,
  363.                             WA_Title,            (UBYTE *)"PPMC",
  364.                             WA_ScreenTitle,        (UBYTE *)SCREEN,
  365.                             WA_PubScreen,        Scr,
  366.                             WA_Zoom,            zoom,
  367.                             TAG_DONE    ) ;
  368.     if (NOT Wnd)
  369.         return (4) ;
  370.  
  371.     SetMenuStrip (Wnd,Menus) ;
  372.     Render() ;
  373.  
  374.     GT_RefreshWindow (Wnd,NULL) ;
  375.  
  376.     return (0) ;
  377. }
  378. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  379. VOID    CloseDownWindow (VOID)
  380. {
  381.     ClearMenus() ;
  382.     if (Wnd)
  383.         CloseWindow (Wnd) ;
  384.     if (GList)
  385.         FreeGadgets (GList) ;
  386. }
  387. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  388. VOID    SetupMenus (VOID)
  389. {
  390.     Menus = CreateMenus (NewMenu,GTMN_FrontPen,0L,TAG_DONE) ;
  391.     if (Menus) {
  392.         LayoutMenus (Menus,VisualInfo,TAG_END) ;
  393.         SetMenuStrip (Wnd,Menus) ;
  394.     }
  395. }
  396. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  397. VOID    ClearMenus (VOID)
  398. {
  399.     if (Menus) {
  400.         ClearMenuStrip (Wnd) ;
  401.         FreeMenus (Menus) ;
  402.     }
  403. }
  404. //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  405. UBYTE    ShCutKey (UBYTE appstrid,UBYTE defkey)
  406. {
  407.     UBYTE    p[2] ;
  408.  
  409.     strncpy (p,strchr(LOC(appstrid),0x5F),2) ;
  410.     return ((UBYTE)(p[1]?p[1]:defkey)) ;
  411. }
  412.  
  413. //    ...