home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 568b.lha / PowerSource_v3.0 / source.lzh / source / func.c < prev    next >
C/C++ Source or Header  |  1991-09-15  |  17KB  |  604 lines

  1. /*----------------------------------------------------------------------*
  2.    func.c Version 3.0 - © Copyright 1990-91 Jaba Development
  3.  
  4.    Author  : Jan van den Baard
  5.    Purpose : Special subroutines used by the program
  6.  *----------------------------------------------------------------------*/
  7.  
  8. extern struct Gadget     *Gadget, TextGadget;
  9. extern struct Window     *MainWindow;
  10. extern struct Screen     *MainScreen;
  11. extern struct GadgetList  Gadgets;
  12. extern struct MemoryChain Memory;
  13. extern struct ge_prefs    prefs;
  14. extern ULONG              Class, WindowFlags;
  15. extern UWORD              FrontPen, GadgetCount, id, BackFill;
  16. extern UWORD              LightSide, DarkSide;
  17. extern BOOL               Saved;
  18. extern BOOL               REQUESTER;
  19.  
  20. SHORT  LB,TB;
  21.  
  22. /*
  23.  * gadgets, borders and texts for the 'Error' requester
  24.  */
  25. static SHORT MainPairs1[] =
  26.  { 2,1,307,1,307,37,2,37,2,1 };
  27. static struct Border MainBorder1 =
  28.  { 0,0,0,0,JAM1,5,MainPairs1,NULL };
  29. static SHORT MainPairs[] =
  30.  { 2,0,307,0 };
  31. static struct Border MainBorder =
  32.  { 0,12,0,0,JAM1,2,MainPairs,&MainBorder1 };
  33.  
  34. static SHORT CPairs[] =
  35.  { 0,0,111,0,111,10,0,10,0,0 };
  36. static struct Border CBorder =
  37.  { -1,-1,0,0,JAM1,5,CPairs,NULL };
  38.  
  39. static struct IntuiText CText =
  40.  { 0,0,JAM1,23,1,NULL,(UBYTE *)"CONTINUE",NULL };
  41. static struct Gadget C =
  42.  { NULL,101,25,110,9,NULL,RELVERIFY,BOOLGADGET,
  43.    (APTR)&CBorder,NULL,&CText,NULL,NULL,NULL,NULL };
  44.  
  45. static struct IntuiText TText =
  46.  { 0,0,JAM1,51,3,NULL,(UBYTE *)"PowerSource System Message",NULL };
  47. static struct NewWindow err_req =
  48.  { 5,15,310,39,0,1,GADGETUP,NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
  49.    NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN };
  50.  
  51. /*
  52.  * gadgets, borders and texts for the 'Ask' Requester
  53.  */
  54. static SHORT MPairs2[] =
  55.  { 0,0,295,0,295,53,0,53,0,0 };
  56. static struct Border MBorder2 =
  57.  { 2,1,0,0,JAM1,5,MPairs2,NULL };
  58. static SHORT MPairs1[] =
  59.  { 0,0,295,0 };
  60. static struct Border MBorder1 =
  61.  { 2,12,0,0,JAM1,2,MPairs1,&MBorder2 };
  62.  
  63. static SHORT YNPairs[] =
  64.  { 0,0,126,0,126,12,0,12,0,0 };
  65. static struct Border YNBorder =
  66.  { -1,-1,0,0,JAM1,5,YNPairs,NULL };
  67.  
  68. static struct IntuiText YText =
  69.  { 0,0,JAM1,48,2,NULL,(UBYTE *)"YES",NULL };
  70. static struct Gadget Y =
  71.  { NULL,11,38,125,11,NULL,RELVERIFY,BOOLGADGET,
  72.    (APTR)&YNBorder,NULL,&YText,NULL,NULL,0,NULL };
  73.  
  74. static struct IntuiText NText =
  75.  { 0,0,JAM1,55,2,NULL,(UBYTE *)"NO",NULL };
  76. static struct Gadget N =
  77.  { &Y,162,38,125,11,NULL,RELVERIFY,BOOLGADGET,
  78.    (APTR)&YNBorder,NULL,&NText,NULL,NULL,1,NULL };
  79.  
  80. static struct IntuiText TTText =
  81.  { 0,0,JAM1,100,3,NULL,(UBYTE *)"Pleasy Verify",NULL };
  82. static struct NewWindow ask_req =
  83.  { 10,15,300,56,0,1,GADGETUP,NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
  84.    NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN };
  85.  
  86. /*
  87.  * gadgets, borders and texts for the 'About' Requester
  88.  */
  89. static SHORT ABPairs2[] =
  90.  { 0,0,295,0 };
  91. static struct Border ABBorder2 =
  92.  { 2,12,0,0,JAM1,2,ABPairs2,NULL };
  93. static SHORT ABPairs1[] =
  94.  { 0,0,295,0,295,91,0,91,0,0 };
  95. static struct Border ABBorder1 =
  96.  { 2,1,0,0,JAM1,5,ABPairs1,&ABBorder2 };
  97.  
  98. static struct IntuiText ABText6 =
  99.  { 0,0,JAM1,42,61,NULL,(UBYTE *)"Free FAST:",NULL };
  100. static struct IntuiText ABText5 =
  101.  { 0,0,JAM1,42,50,NULL,(UBYTE *)"Free CHIP:",&ABText6 };
  102. static struct IntuiText ABText4 =
  103.  { 0,0,JAM1,78,39,NULL,(UBYTE *)"Jan van den Baard",&ABText5 };
  104. static struct IntuiText ABText3 =
  105.  { 0,0,JAM1,40,28,NULL,(UBYTE *)"written in Aztec C V5.0a by",&ABText4 };
  106. static struct IntuiText ABText2 =
  107.  { 0,0,JAM1,9,17,NULL,(UBYTE *)"(c) Copyright 1991 Jaba Development",&ABText3 };
  108. static struct IntuiText ABText1 =
  109.  { 0,0,JAM1,42,3,NULL,(UBYTE *)"- PowerSource Version 3.0 -",&ABText2 };
  110.  
  111. static SHORT CONTPairs[] =
  112.  { 0,0,157,0,157,16,0,16,0,0 };
  113. static struct Border CONTBorder =
  114.  { -1,-1,0,0,JAM1,5,CONTPairs,NULL };
  115.  
  116. static struct IntuiText CONTText =
  117.  { 0,0,JAM1,48,4,NULL,(UBYTE *)"CONTINUE",NULL };
  118. static struct Gadget CONT =
  119.  { NULL,68,73,156,15,NULL,RELVERIFY,BOOLGADGET,
  120.    (APTR)&CONTBorder,NULL,&CONTText,NULL,NULL,NULL,NULL };
  121.  
  122. static struct NewWindow ab_req =
  123.  { 10,15,300,94,0,1,GADGETUP,SMART_REFRESH+NOCAREREFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
  124.    NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN };
  125.  
  126. /*
  127.  * draw the graphics of the window
  128.  */
  129. VOID draw(window,gadget,border,itext)
  130.     struct Window    *window;
  131.     struct Gadget    *gadget;
  132.     struct Border    *border;
  133.     struct IntuiText *itext;
  134. {
  135.     struct RastPort          *rp;
  136.     register struct Gadget   *g, *g1;
  137.     register UWORD            x, y, x1, y1;
  138.  
  139.     rp = window->RPort;
  140.     SetDrMd(rp,JAM1);
  141.     SetAPen(rp,1);
  142.     RectFill(rp,0,0,window->Width,window->Height);
  143.  
  144.     g = gadget;
  145.     while(1) {
  146.         if(TestBits((ULONG)g->GadgetType,STRGADGET)) {
  147.             x = g->LeftEdge; y = g->TopEdge;
  148.             x1 = x + g->Width; y1 = y + g->Height;
  149.             SetAPen(rp,0);
  150.             RectFill(rp,x,y,x1,y1);
  151.         }
  152.         g1 = g->NextGadget;
  153.         if((TestBits((ULONG)g->GadgetType,BOOLGADGET)) AND
  154.            (NOT TestBits((ULONG)g->GadgetType,GADGET0002)))
  155.                ShadowGadget(window,g,NULL,0);
  156.         if(NOT g1) break;
  157.         g = g1;
  158.     }
  159.     if(itext)  PrintIText(rp,itext,0,0);
  160.     if(border) DrawBorder(rp,border,0,0);
  161.     if(gadget) {
  162.         AddGList(window,gadget,-1L,-1L,NULL);
  163.         RefreshGList(gadget,window,NULL,-1L);
  164.     }
  165. }
  166.  
  167. /*
  168.  * put up the error window
  169.  */
  170. VOID Error(message)
  171.     UBYTE         *message;
  172. {
  173.     struct Window *erw;
  174.  
  175.     err_req.Screen = MainScreen;
  176.     if(NOT(erw = OpenWindow(&err_req))) return;
  177.     draw(erw,&C,&MainBorder,&TText);
  178.     ok();
  179.     SetDrMd(erw->RPort,JAM1);
  180.     SetAPen(erw->RPort,2);
  181.     Move(erw->RPort,155-(strlen((char *)message) << 2),21);
  182.     Text(erw->RPort,(char *)message,strlen((char *)message));
  183.     disable_window();
  184.     do {
  185.         Wait(1 << erw->UserPort->mp_SigBit);
  186.         while(read_msg(erw));
  187.     } while(Class != GADGETUP);
  188.     CloseWindow(erw);
  189.     enable_window();
  190. }
  191.  
  192. /*
  193.  * add a border to gadget 'g'
  194.  */
  195. BOOL add_border(gad)
  196.     struct MyGadget *gad;
  197. {
  198.     register SHORT *XY;
  199.     struct Border  *border,*border1,*hb,*hb1;
  200.     struct SharedBorder *sbrd, *CreateSBorder();
  201.     struct Gadget  *g;
  202.     SHORT           x,y,w,h,xo=0,yo=0;
  203.  
  204.     g = &gad->Gadget;
  205.  
  206.     if(NOT TestBits((ULONG)gad->SpecialFlags,OS20BORDER)) {
  207.         x = g->LeftEdge - 1;
  208.         y = g->TopEdge  - 1;
  209.         w = g->Width;
  210.         h = g->Height;
  211.  
  212.         if(NOT(border = (struct Border *)Alloc(&Memory,sizeof(struct Border))))
  213.             return(FALSE);
  214.         if(NOT(XY = (SHORT *)Alloc(&Memory,(ULONG)20)))
  215.             return(FALSE);
  216.  
  217.         XY[0] = XY[1] = XY[3] = XY[6] = XY[8] = XY[9] = -1;
  218.         XY[2] = XY[4] = w;
  219.         XY[5] = XY[7] = h;
  220.  
  221.         border->FrontPen     = FrontPen;
  222.         border->DrawMode     = JAM1;
  223.         border->Count        = 5;
  224.         border->XY           = XY;
  225.  
  226.         g->GadgetRender = (APTR)border;
  227.  
  228.         if((NOT TestBits((ULONG)gad->SpecialFlags,BORDERONLY)) AND
  229.            (NOT TestBits((ULONG)gad->SpecialFlags,NOBORDER))) {
  230.             if(NOT(sbrd = CreateSBorder(border)))
  231.                 return(FALSE);
  232.             sbrd->SpecialFlags = NULL;
  233.         }
  234.         return(TRUE);
  235.     } else {
  236.         x = g->LeftEdge;
  237.         y = g->TopEdge;
  238.         w = g->Width-1;
  239.         h = g->Height-1;
  240.  
  241.         if(TestBits((ULONG)g->GadgetType,STRGADGET)) {
  242.             x--; y--; w+=2; h++; xo=-2; yo=-1;
  243.         }
  244.  
  245.         if(NOT(border = (struct Border *)Alloc(&Memory,sizeof(struct Border))))
  246.             return(FALSE);
  247.         if(NOT(XY = (SHORT *)Alloc(&Memory,(ULONG)20)))
  248.             return(FALSE);
  249.  
  250.         XY[0] = XY[2] = xo;
  251.         XY[4] = XY[6] = xo+1;
  252.         XY[1] = XY[7] = XY[9] = yo;
  253.         XY[3] = h;
  254.         XY[5] = h;
  255.         XY[8] = w-1;
  256.  
  257.         border->FrontPen     = LightSide;
  258.         border->DrawMode     = JAM1;
  259.         border->Count        = 5;
  260.         border->XY           = XY;
  261.  
  262.         g->GadgetRender = (APTR)border;
  263.  
  264.         if(NOT(border1 = (struct Border *)Alloc(&Memory,sizeof(struct Border))))
  265.             return(FALSE);
  266.         if(NOT(XY = (SHORT *)Alloc(&Memory,(ULONG)20)))
  267.             return(FALSE);
  268.  
  269.         XY[1] = XY[3] = XY[9] = h;
  270.         XY[2] = XY[4] = w-1;
  271.         XY[6] = XY[8] = w;
  272.         XY[0] = xo+1;
  273.         XY[5] = yo+1;
  274.         XY[7] = yo;
  275.  
  276.         border1->FrontPen     = DarkSide;
  277.         border1->DrawMode     = JAM1;
  278.         border1->Count        = 5;
  279.         border1->XY           = XY;
  280.  
  281.         border->NextBorder    = border1;
  282.  
  283.         if(NOT TestBits((ULONG)gad->SpecialFlags,BORDERONLY)) {
  284.             if(NOT(sbrd = CreateSBorder(border)))
  285.                 return(FALSE);
  286.             sbrd->SpecialFlags = NULL;
  287.         }
  288.  
  289.         if(prefs.os2_hborder AND (NOT TestBits((ULONG)gad->SpecialFlags,BORDERONLY))) { /* selected border */
  290.             gad->SpecialFlags |= OS20HIGHBORDER;
  291.             g->Flags          |= GADGHIMAGE;
  292.  
  293.             if(NOT(hb = (struct Border *)Alloc(&Memory,sizeof(struct Border))))
  294.                 return(FALSE);
  295.  
  296.             hb->FrontPen = DarkSide;
  297.             hb->DrawMode = JAM1;
  298.             hb->Count    = 5;
  299.             hb->XY       = border->XY;
  300.  
  301.             g->SelectRender = (APTR)hb;
  302.  
  303.             if(NOT(hb1 = (struct Border *)Alloc(&Memory,sizeof(struct Border))))
  304.                 return(FALSE);
  305.  
  306.             hb1->FrontPen = LightSide;
  307.             hb1->DrawMode = JAM1;
  308.             hb1->Count    = 5;
  309.             hb1->XY       = border1->XY;
  310.  
  311.             hb->NextBorder = hb1;
  312.  
  313.             if(NOT TestBits((ULONG)gad->SpecialFlags,BORDERONLY)) {
  314.                 if(NOT(sbrd = CreateSBorder(hb)))
  315.                     return(FALSE);
  316.                 sbrd->SpecialFlags = SB_HIGHBORDER;
  317.             }
  318.         } else
  319.             g->SelectRender = NULL;
  320.         return(TRUE);
  321.     }
  322. }
  323.  
  324. /*
  325.  * Renumber GadgetIDs and all gadget names which do not have
  326.  * a User specified label.
  327.  */
  328. VOID renumber()
  329. {
  330.     register struct MyGadget    *g;
  331.     register UWORD               i = 0;
  332.  
  333.     for(g = Gadgets.TailPred; g != (struct MyGadget *)&Gadgets.Head; g = g->Pred) {
  334.         if(NOT TestBits((ULONG)g->SpecialFlags,BORDERONLY)) {
  335.             if(NOT TestBits((ULONG)g->SpecialFlags,USERLABEL))
  336.                 StringFormat((char *)&g->GadgetLabel,"Gadget%ld",i);
  337.             g->Gadget.GadgetID = i++;
  338.         } else
  339.             strcpy((char *)&g->GadgetLabel,"BorderOnly");
  340.     }
  341. }
  342.  
  343. /*
  344.  * add a gadget to the edit window and to the list
  345.  */
  346. VOID add_gadget(w,x,y,x1,y1)
  347.     struct Window *w;
  348.     SHORT          x,y,x1,y1;
  349. {
  350.     struct MyGadget *gadget;
  351.     SHORT            tmp;
  352.  
  353.     Saved = FALSE;
  354.  
  355.     if(x > x1) { tmp = x; x = x1; x1 = tmp; }
  356.     if(y > y1) { tmp = y; y = y1; y1 = tmp; }
  357.  
  358.     if(((x1 - x) < 9) OR ((y1 - y) < 9)) {
  359.         draw_box(w,x,y,x1,y1);
  360.         Error("Gadget to small !");
  361.         return;
  362.     }
  363.  
  364.     if(NOT(gadget = (struct MyGadget *)Alloc(&Memory,sizeof(struct MyGadget)))) {
  365.         Error("Out of memory !");
  366.         return;
  367.     }
  368.  
  369.     AddHead((void *)&Gadgets,(void *)gadget);
  370.  
  371.     gadget->Gadget.GadgetType      = BOOLGADGET;
  372.     gadget->Gadget.Flags           = GADGHCOMP;
  373.     gadget->Gadget.Activation      = RELVERIFY;
  374.  
  375.     gadget->Gadget.LeftEdge        = x + 1;
  376.     gadget->Gadget.TopEdge         = y + 1;
  377.     gadget->Gadget.Width           = (x1 - x) - 1;
  378.     gadget->Gadget.Height          = (y1 - y) - 1;
  379.  
  380.     if(NOT(add_border(gadget))) {
  381.         RemHead((void *)&Gadgets);
  382.         FreeGadget(gadget);
  383.         Error("Out of memory !");
  384.         return;
  385.     }
  386.  
  387.     AddGList(w,&gadget->Gadget,-1L,1,NULL);
  388.     RefreshGList(&gadget->Gadget,w,NULL,1);
  389.     GadgetCount++;
  390.     renumber();
  391. }
  392.  
  393. /*
  394.  * set the absolute dimensions of a 'GREL' gadget
  395.  */
  396. VOID un_grel(wi,g)
  397.     struct Window *wi;
  398.     struct Gadget *g;
  399. {
  400.     SHORT l,t,w,h,ww,wh;
  401.  
  402.     l = g->LeftEdge - 1;
  403.     t = g->TopEdge  - 1;
  404.     w = g->Width    - 1;
  405.     h = g->Height   - 1;
  406.  
  407.     if(TestBits((ULONG)wi->Flags,GIMMEZEROZERO)) {
  408.         ww = wi->GZZWidth;
  409.         wh = wi->GZZHeight;
  410.     } else {
  411.         ww = wi->Width;
  412.         wh = wi->Height;
  413.     }
  414.  
  415.     if(TestBits((ULONG)g->Flags,GRELBOTTOM))
  416.         g->TopEdge  = t + wh;
  417.     if(TestBits((ULONG)g->Flags,GRELRIGHT))
  418.         g->LeftEdge = l + ww;
  419.     if(TestBits((ULONG)g->Flags,GRELWIDTH))
  420.         g->Width    = (w + ww) + 1;
  421.     if(TestBits((ULONG)g->Flags,GRELHEIGHT))
  422.         g->Height   = (h + wh) + 1;
  423. }
  424.  
  425. /*
  426.  * set the relative dimensions of a 'GREL' gadget
  427.  */
  428. VOID grel(wi,g)
  429.     struct Window *wi;
  430.     struct Gadget *g;
  431. {
  432.     SHORT l,t,w,h,ww,wh;
  433.  
  434.     l = g->LeftEdge + 1;
  435.     t = g->TopEdge  + 1;
  436.     w = g->Width    - 1;
  437.     h = g->Height   - 1;
  438.  
  439.     if(TestBits((ULONG)wi->Flags,GIMMEZEROZERO)) {
  440.         ww = wi->GZZWidth;
  441.         wh = wi->GZZHeight;
  442.     } else {
  443.         ww = wi->Width;
  444.         wh = wi->Height;
  445.     }
  446.  
  447.     if(TestBits((ULONG)g->Flags,GRELBOTTOM))
  448.         g->TopEdge  = t - wh;
  449.     if(TestBits((ULONG)g->Flags,GRELRIGHT))
  450.         g->LeftEdge = l - ww;
  451.     if(TestBits((ULONG)g->Flags,GRELWIDTH))
  452.         g->Width    = (w - ww) + 1;
  453.     if(TestBits((ULONG)g->Flags,GRELHEIGHT))
  454.         g->Height   = (h - wh) + 1;
  455. }
  456.  
  457. un_gzz()
  458. {
  459.     struct MyGadget  *gad;
  460.     struct Gadget    *g;
  461.     struct IntuiText *t;
  462.     ULONG             act;
  463.     SHORT             lb,tb;
  464.  
  465.     lb = MainWindow->BorderLeft;
  466.     tb = MainWindow->BorderTop;
  467.  
  468.     if(REQUESTER) return;
  469.  
  470.     if(TestBits(WindowFlags,GIMMEZEROZERO)) {
  471.         for(gad = Gadgets.Head; gad->Succ; gad = gad->Succ) {
  472.             g   = &gad->Gadget;
  473.             act = (ULONG)g->Activation;
  474.  
  475.             un_grel(MainWindow,g);
  476.  
  477.             if(TestBits((ULONG)gad->SpecialFlags,GZZGADGET)) {
  478.                 if(TestBits(act,LEFTBORDER)) {
  479.                     if((g->LeftEdge + g->Width) > lb)
  480.                         lb = g->LeftEdge + g->Width;
  481.                 } else if(TestBits(act,TOPBORDER)) {
  482.                     if((g->TopEdge + g->Height) > tb)
  483.                         tb = g->TopEdge + g->Height;
  484.                 }
  485.             }
  486.             grel(MainWindow,g);
  487.         }
  488.         LB = lb; TB = tb;
  489.         for(gad = Gadgets.Head; gad->Succ; gad = gad->Succ) {
  490.             g   = &gad->Gadget;
  491.  
  492.             un_grel(MainWindow,g);
  493.  
  494.             if(NOT TestBits((ULONG)gad->SpecialFlags,GZZGADGET)) {
  495.                 g->LeftEdge -= lb;
  496.                 g->TopEdge  -= tb;
  497.             }
  498.             grel(MainWindow,g);
  499.         }
  500.  
  501.         if((t = TextGadget.GadgetText)) {
  502.             while(1) {
  503.                 t->LeftEdge -= lb;
  504.                 t->TopEdge  -= tb;
  505.                 if(NOT(t = t->NextText)) break;
  506.             }
  507.         }
  508.     }
  509. }
  510.  
  511. do_gzz()
  512. {
  513.     struct MyGadget  *gad;
  514.     struct Gadget    *g;
  515.     struct IntuiText *t;
  516.  
  517.     if(REQUESTER) return;
  518.  
  519.     if(TestBits(WindowFlags,GIMMEZEROZERO)) {
  520.         for(gad = Gadgets.Head; gad->Succ; gad = gad->Succ) {
  521.             g   = &gad->Gadget;
  522.  
  523.             un_grel(MainWindow,g);
  524.  
  525.             if(NOT TestBits((ULONG)gad->SpecialFlags,GZZGADGET)) {
  526.                 g->LeftEdge += LB;
  527.                 g->TopEdge  += TB;
  528.             }
  529.             grel(MainWindow,g);
  530.         }
  531.  
  532.         if((t = TextGadget.GadgetText)) {
  533.             while(1) {
  534.                 t->LeftEdge += LB;
  535.                 t->TopEdge  += TB;
  536.                 if(NOT(t = t->NextText)) break;
  537.             }
  538.         }
  539.     }
  540. }
  541.  
  542. /*
  543.  * put up the ask window
  544.  */
  545. LONG Ask(text,text1)
  546.     UBYTE         *text, *text1;
  547. {
  548.     struct Window   *aw;
  549.     struct RastPort *rp;
  550.     USHORT          y,id;
  551.     BOOL            ret;
  552.  
  553.     if(text1) y = 21;
  554.     else      y = 27;
  555.     ask_req.Screen = MainScreen;
  556.     if(NOT(aw = OpenWindow(&ask_req))) return;
  557.     rp = aw->RPort;
  558.     draw(aw,&N,&MBorder1,&TTText);
  559.     SetDrMd(rp,JAM1);
  560.     SetAPen(rp,2);
  561.     Move(rp,150-((strlen((char *)text) << 3) >> 1),y);
  562.     Text(rp,(char *)text,strlen((char *)text));
  563.     if(text1) {
  564.         Move(rp,150-((strlen((char *)text1) << 3) >> 1),y+10);
  565.         Text(rp,(char *)text1,strlen((char *)text1));
  566.     }
  567.     disable_window();
  568.     do {
  569.         Wait(1 << aw->UserPort->mp_SigBit);
  570.         while(read_msg(aw));
  571.         id = Gadget->GadgetID;
  572.     } while(Class != GADGETUP);
  573.     CloseWindow(aw);
  574.     if(id == 1) ret = FALSE;
  575.     else ret = TRUE;
  576.     enable_window();
  577.     return(ret);
  578. }
  579.  
  580. /*
  581.  * put up the about window
  582.  */
  583. VOID About()
  584. {
  585.     struct Window *abw;
  586.  
  587.     ab_req.Screen = MainScreen;
  588.     if(NOT(abw = OpenWindow(&ab_req))) return;
  589.     draw(abw,&CONT,&ABBorder1,&ABText1);
  590.     disable_window();
  591.     SetAPen(abw->RPort,0);
  592.     SetDrMd(abw->RPort,JAM1);
  593.     Move(abw->RPort,130,56);
  594.     FormatText(abw->RPort,"%10.10ld Bytes.",AvailMem(MEMF_CHIP));
  595.     Move(abw->RPort,130,67);
  596.     FormatText(abw->RPort,"%10.10ld Bytes.",AvailMem(MEMF_FAST));
  597.     do {
  598.         Wait(1 << abw->UserPort->mp_SigBit);
  599.         while(read_msg(abw));
  600.     } while(Class != GADGETUP);
  601.     CloseWindow(abw);
  602.     enable_window();
  603. }
  604.