home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / comms / network / grn1src.lha / requesters.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-05  |  32.3 KB  |  833 lines

  1. #include        "defs.h"
  2.  
  3. // #define PROCDEBUG
  4.  
  5. #ifdef PROCDEBUG
  6. #define D(x)    printf x
  7. #else
  8. #define D(x)
  9. #endif
  10.  
  11. static TATTR    topaz80 = { "topaz.font", 8, 0,0 };
  12. static VINFO    *vi;
  13.  
  14. // The 1x1 null requester that is used to disable the gadtools gadgets,
  15. // as per the flamewars on usenet:
  16. static struct Requester req = {
  17.         0,
  18.         0,0,
  19.         1,1,
  20.         0,0,
  21.         0,
  22.         0,
  23.         0,
  24.         0,
  25.         0,
  26.         0,
  27.         0,
  28.         0,
  29. };
  30.  
  31. static short    windowDisableCount = 0;
  32.  
  33. // FIXME: Defines!
  34.  
  35. void    DisableWindow (void)
  36. {
  37.         if (!windowDisableCount)
  38.                 Request (&req, mainWindow);
  39.         windowDisableCount++;
  40.         return;
  41. }
  42.  
  43. void    EnableWindow (void)
  44. {
  45.         if (!windowDisableCount)
  46.                 return;
  47.         windowDisableCount--;
  48.         if (!windowDisableCount)
  49.                 EndRequest(&req, mainWindow);
  50.         return;
  51. }
  52.  
  53. BOOL    GuageRequest (UWORD percent, char *titleText,
  54.                       char *reqText, char *buttonText)
  55. {
  56.         int             titleLen;
  57.         int             reqLen;
  58.         int             buttonLen;
  59.         static WINDOW   *reqWindow = 0;
  60.         WINDOW          *win = NULL;
  61.         int             width = 0;
  62.         int             height;
  63.         static GADGET   *gList = 0, *gadget = 0;
  64.         NEWGAD          ng;
  65.         static RPORT    *reqrp = 0;
  66.         IMSG            *m, msg;
  67.         static UWORD    guageX = 0, guageY = 0, guageW = 0, guageH = 0;
  68.         UWORD           ww;
  69.         static BOOL     activeFlag = 0;
  70.  
  71.         if (!screen)
  72.                 return 0;
  73.  
  74.         // these can't be initializers because topazRP may not have been
  75.         // set up if we were called with the UPDATERC ('-u') option.
  76.  
  77.         titleLen =  TextLength (topazRP, titleText,  strlen (titleText));
  78.         reqLen =    TextLength (topazRP, reqText,    strlen (reqText));
  79.         buttonLen = TextLength (topazRP, buttonText, strlen (buttonText));
  80.  
  81.         win = mainWindow;
  82.         width = titleLen;
  83.         height = topazRP->TxHeight*6 + screen->BarHeight;
  84.  
  85.         vi = GetVisualInfo (screen, TAG_DONE);
  86.         if (reqLen > width)
  87.                 width = reqLen;
  88.         if (buttonLen > width)
  89.                 width = buttonLen;
  90.         width += 10;
  91.  
  92.         if (!reqWindow) {
  93.                 if (percent >= 100)
  94.                         return 0;
  95.                 gadget = CreateContext (&gList);
  96.                 if (!gadget)
  97.                         return 0;
  98.  
  99.                 ng.ng_GadgetID   = 0;
  100.                 ng.ng_TextAttr   = &topaz80;
  101.                 ng.ng_VisualInfo = vi;
  102.                 ng.ng_LeftEdge   = (width - buttonLen) / 2;
  103.                 ng.ng_TopEdge    = height - topazRP->TxHeight - 6 - INTERHEIGHT;
  104.                 ng.ng_Width      = buttonLen + 6;
  105.                 ng.ng_Height     = topazRP->TxHeight + 6;
  106.                 ng.ng_GadgetText = buttonText;
  107.                 ng.ng_Flags      = NG_HIGHLABEL;
  108.                 gadget = CreateGadget (BUTTON_KIND, gadget, &ng,
  109.                                        GT_Underscore, ' ', TAG_DONE);
  110.                 if (!gadget) {
  111.                         FreeGadgets (gList);
  112.                         gList = 0;
  113.                         return 0;
  114.                 }
  115.  
  116.                 DisableWindow ();
  117.                 reqWindow = OpenWindowTags (NULL,
  118.                         WA_Left, win->LeftEdge + (win->Width  - width) / 2,
  119.                         WA_Top,  win->TopEdge  + (win->Height - height) / 2,
  120.                         WA_Width,width,
  121.                         WA_Height,height,
  122.                         WA_DetailPen,3,
  123.                         WA_BlockPen,1,
  124.                         WA_IDCMP,BUTTONIDCMP|INACTIVEWINDOW,
  125.                         WA_Gadgets,gList,
  126.                         WA_Title,titleText,
  127.                         WA_CustomScreen,screen,
  128.                         WA_SuperBitMap,0,
  129.                         WA_MinWidth,30,
  130.                         WA_MinHeight,30,
  131.                         WA_MaxWidth,-1,
  132.                         WA_MaxHeight,-1,
  133.                         WA_SizeGadget,FALSE,
  134.                         WA_DragBar,FALSE,
  135.                         WA_DepthGadget,FALSE,
  136.                         WA_CloseGadget,FALSE,
  137.                         WA_Backdrop,FALSE,
  138.                         WA_ReportMouse,FALSE,
  139.                         WA_Borderless,FALSE,
  140.                         WA_Activate,TRUE,
  141.                         WA_RMBTrap,TRUE,
  142.                         WA_SimpleRefresh,TRUE,
  143.                         TAG_DONE
  144.                 );
  145.                 if (!reqWindow) {
  146.                         FreeGadgets (gList);
  147.                         gList = 0;
  148.                         EnableWindow ();
  149.                         return 1;
  150.                 }
  151.                 activeFlag = 1;
  152.                 GT_RefreshWindow (reqWindow, NULL);
  153.  
  154.                 reqrp = reqWindow->RPort;
  155.                 SetFont (reqrp, topaz80Font);
  156.  
  157.                 SetAPen (reqrp, 2);
  158.                 Move (reqrp, (width - reqLen) / 2, screen->BarHeight + 2 + reqrp->TxBaseline);
  159.                 Text (reqrp, reqText, strlen (reqText));
  160.                 guageH = 12;
  161.                 guageW = width - 16;
  162.                 guageX = (width - guageW) / 2;
  163.                 guageY = screen->BarHeight + 2 + reqrp->TxHeight + 2;
  164.                 DrawBevelBox (reqrp, guageX, guageY, guageW, guageH,
  165.                               GTBB_Recessed, TRUE, GT_VisualInfo, vi, TAG_DONE);
  166.                 guageW -=4;
  167.                 guageH -= 3;
  168.         }
  169.         if (percent >= 100) {
  170.                 CloseWindow (reqWindow);
  171.                 reqWindow = 0;
  172.                 FreeGadgets (gList);
  173.                 gList = 0;
  174.                 // GT_RefreshWindow (mainWindow, NULL);
  175.                 GT_BeginRefresh (mainWindow);
  176.                 GT_EndRefresh (mainWindow, TRUE);
  177.                 EnableWindow ();
  178.                 return 0;
  179.         }
  180.         ww = percent * guageW / 100;
  181.         SetAPen (reqrp, 2);
  182.         Move (reqrp, (width - reqLen) / 2, screen->BarHeight + 2 + reqrp->TxBaseline);
  183.         Text (reqrp, reqText, strlen (reqText));
  184.         guageH = 12;
  185.         guageW = width - 16;
  186.         guageX = (width - guageW) / 2;
  187.         guageY = screen->BarHeight + 2 + reqrp->TxHeight + 2;
  188.         DrawBevelBox (reqrp, guageX, guageY, guageW, guageH,
  189.                       GTBB_Recessed, TRUE, GT_VisualInfo, vi, TAG_DONE);
  190.         guageW -=4;
  191.         guageH -= 3;
  192.         ww = percent * guageW / 100;
  193.         if (ww) {
  194.                 SetAPen (reqrp,3);
  195.                 RectFill (reqrp, guageX + 2, guageY + 1,
  196.                                  guageX + ww + 2, guageY + 1 + guageH);
  197.         }
  198.         while (m = GT_GetIMsg (reqWindow->UserPort)) {
  199.                 msg = *m;
  200.                 GT_ReplyIMsg (m);
  201.                 switch (msg.Class) {
  202.                         case IDCMP_GADGETUP:
  203.                         case IDCMP_GADGETDOWN:
  204.                                 CloseWindow (reqWindow);
  205.                                 reqWindow = 0;
  206.                                 FreeGadgets (gList);
  207.                                 gList = 0;
  208.                                 EnableWindow ();
  209.                                 return 1;
  210.  
  211.                         case IDCMP_REFRESHWINDOW:
  212.                                 GT_BeginRefresh (reqWindow);
  213.                                 GT_EndRefresh (reqWindow, TRUE);
  214.                                 break;
  215.  
  216.                         case IDCMP_INACTIVEWINDOW:
  217.                                 activeFlag = 0;
  218.                                 break;
  219.                 }
  220.         }
  221.         if (!activeFlag && IntuitionBase->ActiveWindow == win) {
  222.                 MoveWindowInFrontOf(reqWindow, win);
  223.                 ActivateWindow(reqWindow);
  224.                 activeFlag = !0;
  225.         }
  226.         return 0;
  227. }
  228.  
  229. BOOL    OneGadgetRequest (char *titleText, char *reqText, char *buttonText)
  230. {
  231.         int     titleLen;
  232.         int     reqLen;
  233.         int     buttonLen;
  234.         WINDOW  *reqWindow = 0, *win = mainWindow;
  235.         int     width;
  236.         int     height;
  237.         GADGET  *gList = 0, *gadget;
  238.         NEWGAD  ng;
  239.         RPORT   *reqrp;
  240.         IMSG    *m, msg;
  241.         BOOL    activeFlag = 0;
  242.  
  243.         D (("OneGadgetRequest(): enter\n"));
  244.  
  245.         if (!screen || !topazRP) {
  246.                 D (("OneGadgetRequest(): exit, either no screen or no topaz\n"));
  247.                 return 0;
  248.         }
  249.  
  250.         vi = GetVisualInfo (screen, TAG_DONE);
  251.  
  252.         titleLen  = TextLength (topazRP, titleText,  strlen (titleText));
  253.         reqLen    = TextLength (topazRP, reqText,    strlen (reqText));
  254.         buttonLen = TextLength (topazRP, buttonText, strlen (buttonText));
  255.         width     = titleLen;
  256.         height    = (topazRP->TxHeight * 4) + screen->BarHeight;
  257.  
  258.         if (reqLen > width)
  259.                 width = reqLen;
  260.         else
  261.                 if (buttonLen > width)
  262.                         width = buttonLen;
  263.         width += 10;
  264.  
  265.         gadget = CreateContext(&gList);
  266.         if (!gadget) {
  267.                 D (("OneGadgetRequest(): exit, can't CreateContext()\n"));
  268.                 return 0;
  269.         }
  270.  
  271.         ng.ng_GadgetID   = 0;
  272.         ng.ng_TextAttr   = &topaz80;
  273.         ng.ng_VisualInfo = vi;
  274.         ng.ng_LeftEdge   = (width - buttonLen) / 2;
  275.         ng.ng_TopEdge    = height - topazRP->TxHeight - 6 - INTERHEIGHT;
  276.         ng.ng_Width      = buttonLen + 6;
  277.         ng.ng_Height     = topazRP->TxHeight + 6;
  278.         ng.ng_GadgetText = buttonText;
  279.         ng.ng_Flags      = NG_HIGHLABEL;
  280.         gadget = CreateGadget (BUTTON_KIND, gadget, &ng,
  281.                                GT_Underscore, '_', TAG_DONE);
  282.         if (!gadget) {
  283.                 FreeGadgets(gList);
  284.                 D (("OneGadgetRequest(): exit, can't CreateGadget (0)\n"));
  285.                 return 0;
  286.         }
  287.  
  288.         DisableWindow ();
  289.         reqWindow = OpenWindowTags (NULL,
  290.                 WA_Left, win->LeftEdge + (win->Width - width) / 2,
  291.                 WA_Top,  win->TopEdge  + (win->Height - height) / 2,
  292.                 WA_Width,width,
  293.                 WA_Height,height,
  294.                 WA_DetailPen,3,
  295.                 WA_BlockPen,1,
  296.                 WA_IDCMP,BUTTONIDCMP|INACTIVEWINDOW|IDCMP_RAWKEY,
  297.                 WA_Gadgets,gList,
  298.                 WA_Title,titleText,
  299.                 WA_CustomScreen,screen,
  300.                 WA_SuperBitMap,0,
  301.                 WA_MinWidth,30,
  302.                 WA_MinHeight,30,
  303.                 WA_MaxWidth,-1,
  304.                 WA_MaxHeight,-1,
  305.                 WA_SizeGadget,FALSE,
  306.                 WA_DragBar,FALSE,
  307.                 WA_DepthGadget,FALSE,
  308.                 WA_CloseGadget,FALSE,
  309.                 WA_Backdrop,FALSE,
  310.                 WA_ReportMouse,FALSE,
  311.                 WA_Borderless,FALSE,
  312.                 WA_Activate,TRUE,
  313.                 WA_RMBTrap,TRUE,
  314.                 WA_SimpleRefresh,TRUE,
  315.                 TAG_DONE
  316.         );
  317.         if (!reqWindow) {
  318.                 FreeGadgets(gList);
  319.                 EnableWindow ();
  320.                 D (("OneGadgetRequest(): exit, can't OpenWindow(reqWindow)\n"));
  321.                 return 0;
  322.         }
  323.         GT_RefreshWindow (reqWindow, NULL);
  324.         activeFlag = 1;
  325.  
  326.         reqrp = reqWindow->RPort;
  327.         SetFont (reqrp, topaz80Font);
  328.  
  329.         SetAPen (reqrp, 2);
  330.         Move (reqrp, (width - reqLen) / 2, screen->BarHeight + 2 + reqrp->TxBaseline);
  331.         Text (reqrp, reqText, strlen (reqText));
  332.         MoveWindowInFrontOf (reqWindow, win);
  333.  
  334.         while (1) {
  335. #if 1
  336.                 WaitPort (reqWindow->UserPort);
  337. #else
  338.                 Delay (25);
  339. #endif
  340.                 while (m = GT_GetIMsg (reqWindow->UserPort)) {
  341.                         msg = *m;
  342.                         GT_ReplyIMsg (m);
  343.                         switch (msg.Class) {
  344.                                 case IDCMP_GADGETUP:
  345.                                 case IDCMP_GADGETDOWN:
  346.                                         CloseWindow (reqWindow);
  347.                                         FreeGadgets (gList);
  348.                                         // GT_RefreshWindow (mainWindow, NULL);
  349.                                         GT_BeginRefresh (mainWindow);
  350.                                         GT_EndRefresh (mainWindow, TRUE);
  351.                                         EnableWindow ();
  352.                                         return 1;
  353.  
  354.                                 case IDCMP_REFRESHWINDOW:
  355.                                         GT_BeginRefresh (reqWindow);
  356.                                         SetAPen (reqrp, 2);
  357.                                         Move (reqrp, (width - reqLen) / 2, screen->BarHeight + 2 + reqrp->TxBaseline);
  358.                                         Text (reqrp, reqText, strlen (reqText));
  359.                                         GT_EndRefresh (reqWindow, TRUE);
  360.                                         break;
  361.  
  362.                                 case IDCMP_RAWKEY:
  363.                                         // ESC
  364.                                         if (msg.Code == 0x45) {
  365.                                                 CloseWindow (reqWindow);
  366.                                                 FreeGadgets (gList);
  367.                                                 EnableWindow ();
  368.                                                 return 1;
  369.                                         }
  370.                                         break;
  371.  
  372.                                 case IDCMP_INACTIVEWINDOW:
  373.                                         activeFlag = 0;
  374.                                         break;
  375.  
  376.                         }  // switch (msg.Class)...
  377.                 }   // while (GT_GetIMsg())....
  378.                 if (!activeFlag && IntuitionBase->ActiveWindow == win) {
  379.                         MoveWindowInFrontOf (reqWindow, win);
  380.                         ActivateWindow (reqWindow);
  381.                         activeFlag = 1;
  382.                         SetAPen (reqrp, 2);
  383.                         Move (reqrp, (width - reqLen) / 2, screen->BarHeight + 2 + reqrp->TxBaseline);
  384.                         Text (reqrp, reqText, strlen (reqText));
  385.                 }
  386.         }   // while (1)....
  387.         /* NOTREACHED */
  388.         return 0;
  389. }
  390.  
  391. BOOL    TwoGadgetRequest (const char *titleText, const char *reqText,
  392.                           const char *leftText,  const char *rightText)
  393. {
  394.         int     titleLen;
  395.         int     reqLen;
  396.         int     leftLen;
  397.         int     rightLen;
  398.         WINDOW  *reqWindow = 0, *win;
  399.         int     width;
  400.         int     height;
  401.         GADGET  *gList = 0, *gadget;
  402.         NEWGAD  ng;
  403.         RPORT   *reqrp;
  404.         IMSG    *m;
  405.         BOOL    activeFlag = 0;
  406.         int     i;
  407.         int     gad_id;
  408.  
  409.         D (("TwoGadgetRequest(): enter\n"));
  410.  
  411.         if (!screen || !topazRP) {
  412.                 D (("TwoGadgetRequest(): exit, either screen or topaz not set up\n"));
  413.                 return 0;
  414.         }
  415.  
  416.         titleLen = TextLength (topazRP, titleText, strlen (titleText));
  417.         reqLen =   TextLength (topazRP, reqText,   strlen (reqText));
  418.         leftLen =  TextLength (topazRP, leftText,  strlen (leftText));
  419.         rightLen = TextLength (topazRP, rightText, strlen (rightText));
  420.         win = mainWindow;
  421.         width = titleLen;
  422.         height = (topazRP->TxHeight * 4) + screen->BarHeight;
  423.  
  424.         vi = GetVisualInfo (screen, TAG_DONE);
  425.  
  426.         if (leftLen > rightLen)
  427.                 rightLen = leftLen;
  428.         else
  429.                 if (rightLen > leftLen)
  430.                         leftLen = rightLen;
  431.         if (reqLen > width)
  432.                 width = reqLen;
  433.         if ((leftLen + rightLen + 20) > width)
  434.                 width = leftLen + rightLen + 32;
  435.         width += 10;
  436.  
  437.         gadget = CreateContext (&gList);
  438.         if (!gadget) {
  439.                 D (("TwoGadgetRequest(): exit, CreateContext() failure\n"));
  440.                 return 0;
  441.         }
  442.  
  443.         ng.ng_GadgetID   = 0;
  444.         ng.ng_TextAttr   = &topaz80;
  445.         ng.ng_VisualInfo = vi;
  446.         ng.ng_LeftEdge   = 6;
  447.         ng.ng_TopEdge    = height - topazRP->TxHeight - 6 - INTERHEIGHT;
  448.         ng.ng_Width      = leftLen + 6;
  449.         ng.ng_Height     = topazRP->TxHeight + 6;
  450.         ng.ng_GadgetText = leftText;
  451.         ng.ng_Flags      = NG_HIGHLABEL;
  452.         gadget = CreateGadget (BUTTON_KIND, gadget, &ng,
  453.                                GT_Underscore, '_', TAG_DONE);
  454.         if (!gadget) {
  455.                 FreeGadgets (gList);
  456.                 D (("TwoGadgetRequest(): exit, CreateGadget (0) failure\n"));
  457.                 return 0;
  458.         }
  459.         ng.ng_GadgetID   = 1;
  460.         ng.ng_TextAttr   = &topaz80;
  461.         ng.ng_VisualInfo = vi;
  462.         ng.ng_LeftEdge   = width - rightLen - 12;
  463.         ng.ng_TopEdge    = height - topazRP->TxHeight - 6 - INTERHEIGHT;
  464.         ng.ng_Width      = rightLen + 6;
  465.         ng.ng_Height     = topazRP->TxHeight + 6;
  466.         ng.ng_GadgetText = rightText;
  467.         ng.ng_Flags      = NG_HIGHLABEL;
  468.         gadget = CreateGadget (BUTTON_KIND, gadget, &ng,
  469.                                GT_Underscore, '_', TAG_DONE);
  470.         if (!gadget) {
  471.                 FreeGadgets (gList);
  472.                 D (("TwoGadgetRequest(): exit, CreateGadget (1) failure\n"));
  473.                 return 0;
  474.         }
  475.  
  476.         DisableWindow ();
  477.         reqWindow = OpenWindowTags (NULL,
  478.                 WA_Left, win->LeftEdge + (win->Width - width)/2,
  479.                 WA_Top,  win->TopEdge + (win->Height - height)/2,
  480.                 WA_Width,width,
  481.                 WA_Height,height,
  482.                 WA_DetailPen,3,
  483.                 WA_BlockPen,1,
  484.                 WA_IDCMP,BUTTONIDCMP|INACTIVEWINDOW|VANILLAKEY,
  485.                 WA_Gadgets,gList,
  486.                 WA_Title,titleText,
  487.                 WA_CustomScreen,screen,
  488.                 WA_SuperBitMap,0,
  489.                 WA_MinWidth,30,
  490.                 WA_MinHeight,30,
  491.                 WA_MaxWidth,-1,
  492.                 WA_MaxHeight,-1,
  493.                 WA_SizeGadget,FALSE,
  494.                 WA_DragBar,FALSE,
  495.                 WA_DepthGadget,FALSE,
  496.                 WA_CloseGadget,FALSE,
  497.                 WA_Backdrop,FALSE,
  498.                 WA_ReportMouse,FALSE,
  499.                 WA_Borderless,FALSE,
  500.                 WA_Activate,TRUE,
  501.                 WA_RMBTrap,TRUE,
  502.                 WA_SimpleRefresh,TRUE,
  503.                 TAG_DONE
  504.         );
  505.         if (!reqWindow) {
  506.                 FreeGadgets (gList);
  507.                 EnableWindow ();
  508.                 D (("TwoGadgetRequest(): exit, OpenWindow (reqWindow) failure\n"));
  509.                 return 0;
  510.         }
  511.         GT_RefreshWindow (reqWindow, NULL);
  512.         activeFlag = 1;
  513.         reqrp = reqWindow->RPort;
  514.         SetFont (reqrp, topaz80Font);
  515.  
  516.         SetAPen (reqrp, 2);
  517.         Move (reqrp, (width - reqLen)/2, screen->BarHeight + 2 + reqrp->TxBaseline);
  518.         Text (reqrp, reqText, strlen (reqText));
  519.  
  520.         MoveWindowInFrontOf (reqWindow, win);
  521.         while (1) {
  522. #if 1
  523.                 WaitPort (reqWindow->UserPort);
  524. #else
  525.                 Delay (25);  // why do this?
  526. #endif
  527.                 while (m = GT_GetIMsg (reqWindow->UserPort)) {
  528.                         switch (m->Class) {
  529.                                 case IDCMP_GADGETUP:
  530.                                 case IDCMP_GADGETDOWN:
  531.                                         gadget = (GADGET *) m->IAddress;
  532.                                         gad_id = gadget->GadgetID;
  533.                                         GT_ReplyIMsg (m);
  534.                                         CloseWindow (reqWindow);
  535.                                         // FreeVisualInfo (vi);
  536.                                         FreeGadgets (gList);
  537.                                         // GT_RefreshWindow (mainWindow, NULL);
  538.                                         GT_BeginRefresh (mainWindow);
  539.                                         GT_EndRefresh (mainWindow, TRUE);
  540.                                         EnableWindow ();
  541.                                         if (gad_id) {
  542.                                                 D (("TwoGadgetRequest(): exit, Mouse NO (%d, 0x%x)\n", gad_id, gadget));
  543.                                                 return 0;
  544.                                         }
  545.                                         else {
  546.                                                 D (("TwoGadgetRequest(): exit, Mouse YES (%d, 0x%x)\n", gad_id, gadget));
  547.                                                 return 1;
  548.                                         }
  549.  
  550.                                 case IDCMP_REFRESHWINDOW:
  551.                                         GT_ReplyIMsg (m);
  552.                                         GT_BeginRefresh (reqWindow);
  553.                                         SetAPen (reqrp, 2);
  554.                                         Move (reqrp, (width - reqLen)/2,screen->BarHeight + 2 + reqrp->TxBaseline);
  555.                                         Text (reqrp, reqText, strlen (reqText));
  556.                                         GT_EndRefresh (reqWindow, TRUE);
  557.                                         break;
  558.  
  559.                                 case IDCMP_INACTIVEWINDOW:
  560.                                         GT_ReplyIMsg (m);
  561.                                         activeFlag = 0;
  562.                                         break;
  563.  
  564.                                 case IDCMP_VANILLAKEY:
  565.                                         i = m->Code;
  566.                                         GT_ReplyIMsg (m);
  567.                                         if (i == 'y' || i == 'Y' ||
  568.                                             i == 'n' || i == 'N' || i == 0x1b) {
  569.  
  570.                                                 CloseWindow (reqWindow);
  571.                                                 // FreeVisualInfo (vi);
  572.                                                 FreeGadgets (gList);
  573.                                                 EnableWindow ();
  574.  
  575.                                                 if (i == 'y' || i == 'Y') {
  576.                                                         D (("TwoGadgetRequest(): exit, keyboard YES\n"));
  577.                                                         return 1;
  578.                                                 }
  579.                                                 else {
  580.                                                         D (("TwoGadgetRequest(): exit, keyboard NO\n"));
  581.                                                         return 0;
  582.                                                 }
  583.                                         }
  584.                                         break;
  585.                                 default:
  586.                                         GT_ReplyIMsg (m);
  587.                                         break;
  588.                         }   // switch...
  589.                 }   // while (GT_GetIMsg())...
  590.                 if (!activeFlag && IntuitionBase->ActiveWindow == win) {
  591.                         MoveWindowInFrontOf (reqWindow, win);
  592.                         ActivateWindow (reqWindow);
  593.                         activeFlag = 1;
  594.                         SetAPen (reqrp, 2);
  595.                         Move (reqrp, (width - reqLen)/2, screen->BarHeight + 2 + reqrp->TxBaseline);
  596.                         Text (reqrp, reqText, strlen(reqText));
  597.                 }
  598.         }   // while (1)...
  599.         /* NOTREACHED */
  600.         return;
  601. }
  602.  
  603. static char     *postText[] = {
  604.         "You are about to post news.  This will cause a zillion Unix machines",
  605.         "to spread your article all over the explored universe at a cost of",
  606.         "several trillion dollars.  And to top it off, you can expect other",
  607.         "lunatics in NetLand to follow up to your article and do likewise.",
  608.         "If you are lucky, you won't get flamed to a crisp.",
  609.         " ",
  610.         "          Are you really sure you want to proceed?       ",
  611.         0,
  612. };
  613.  
  614. BOOL    SendItRequest (void)
  615. {
  616.         char    *titleText = "GRn - Read Carefully before answering...";
  617.         char    *leftText = "_YES, I have guts";
  618.         char    *rightText = "_NO, I am a gutless worm";
  619.         int     titleLen;
  620.         int     reqLen;
  621.         int     leftLen;
  622.         int     rightLen;
  623.         int     width;
  624.         int     height;
  625.         WINDOW  *reqWindow = 0, *win = mainWindow;
  626.         GADGET  *gList = 0, *gadget;
  627.         NEWGAD  ng;
  628.         RPORT   *reqrp;
  629.         IMSG    *m;
  630.         BOOL    activeFlag = 0;
  631.         int     i, y;
  632.         int     gad_id;
  633.  
  634.         D (("SendItRequest(): enter\n"));
  635.  
  636.         if (!screen || !topazRP)
  637.                 return 0;
  638.  
  639.         titleLen = TextLength (topazRP, titleText,    strlen (titleText));
  640.         reqLen   = TextLength (topazRP, postText [0], strlen (postText [0]));
  641.         leftLen  = TextLength (topazRP, leftText,     strlen (leftText)) + INTERWIDTH;
  642.         rightLen = TextLength (topazRP, rightText,    strlen (rightText)) + INTERWIDTH;
  643.         width    = titleLen;
  644.         height   = (topazRP->TxHeight * 10) + screen->BarHeight;
  645.  
  646.         vi = GetVisualInfo (screen, TAG_DONE);
  647.  
  648.         if (leftLen > rightLen)
  649.                 rightLen = leftLen;
  650.         else
  651.                 if (rightLen > leftLen)
  652.                         leftLen = rightLen;
  653.         if (reqLen > width)
  654.                 width = reqLen;
  655.         if ((leftLen + rightLen + 20) > width)
  656.                 width = leftLen + rightLen + 32;
  657.         width += 10;
  658.  
  659.         gadget = CreateContext (&gList);
  660.         if (!gadget) {
  661.                 D (("SendItRequest(): exit, CreateContext() failure\n"));
  662.                 return 0;
  663.         }
  664.  
  665.         ng.ng_GadgetID   = 0;
  666.         ng.ng_TextAttr   = &topaz80;
  667.         ng.ng_VisualInfo = vi;
  668.         ng.ng_LeftEdge   = 6;
  669.         ng.ng_TopEdge    = height - topazRP->TxHeight - 6 - INTERHEIGHT;
  670.         ng.ng_Width      = leftLen + 6;
  671.         ng.ng_Height     = topazRP->TxHeight + 6;
  672.         ng.ng_GadgetText = leftText;
  673.         ng.ng_Flags      = NG_HIGHLABEL;
  674.         gadget = CreateGadget (BUTTON_KIND, gadget, &ng,
  675.                                GT_Underscore, '_', TAG_DONE);
  676.         if (!gadget) {
  677.                 FreeGadgets (gList);
  678.                 D (("SendItRequest(): exit, CreateGadget (0) failure\n"));
  679.                 return 0;
  680.         }
  681.  
  682.         ng.ng_GadgetID   = 1;
  683.         ng.ng_TextAttr   = &topaz80;
  684.         ng.ng_VisualInfo = vi;
  685.         ng.ng_LeftEdge   = width - rightLen - 12;
  686.         ng.ng_TopEdge    = height - topazRP->TxHeight - 6 - INTERHEIGHT;
  687.         ng.ng_Width      = rightLen+6;
  688.         ng.ng_Height     = topazRP->TxHeight + 6;
  689.         ng.ng_GadgetText = rightText;
  690.         ng.ng_Flags      = NG_HIGHLABEL;
  691.         gadget = CreateGadget (BUTTON_KIND, gadget, &ng,
  692.                                GT_Underscore, '_', TAG_DONE);
  693.         if (!gadget) {
  694.                 FreeGadgets (gList);
  695.                 D (("SendItRequest(): exit, CreateGadget (1) failure\n"));
  696.                 return 0;
  697.         }
  698.  
  699.         DisableWindow ();
  700.         reqWindow = OpenWindowTags (NULL,
  701.                 WA_Left, win->LeftEdge + (win->Width - width)/2,
  702.                 WA_Top,  win->TopEdge  + (win->Height - height)/2,
  703.                 WA_Width,width,
  704.                 WA_Height,height,
  705.                 WA_DetailPen,3,
  706.                 WA_BlockPen,1,
  707.                 WA_IDCMP,BUTTONIDCMP|INACTIVEWINDOW|VANILLAKEY,
  708.                 WA_Gadgets,gList,
  709.                 WA_Title,titleText,
  710.                 WA_CustomScreen,screen,
  711.                 WA_SuperBitMap,0,
  712.                 WA_MinWidth,30,
  713.                 WA_MinHeight,30,
  714.                 WA_MaxWidth,-1,
  715.                 WA_MaxHeight,-1,
  716.                 WA_SizeGadget,FALSE,
  717.                 WA_DragBar,FALSE,
  718.                 WA_DepthGadget,FALSE,
  719.                 WA_CloseGadget,FALSE,
  720.                 WA_Backdrop,FALSE,
  721.                 WA_ReportMouse,FALSE,
  722.                 WA_Borderless,FALSE,
  723.                 WA_Activate,TRUE,
  724.                 WA_RMBTrap,TRUE,
  725.                 WA_SimpleRefresh,TRUE,
  726.                 TAG_DONE
  727.         );
  728.         if (!reqWindow) {
  729.                 FreeGadgets (gList);
  730.                 EnableWindow ();
  731.                 D (("SendItRequest(): exit, OpenWindow (reqWindow) failure\n"));
  732.                 return 0;
  733.         }
  734.         GT_RefreshWindow (reqWindow, NULL);
  735.         activeFlag = 1;
  736.         reqrp = reqWindow->RPort;
  737.         SetFont (reqrp, topaz80Font);
  738.  
  739.         y = screen->BarHeight + 2 + reqrp->TxBaseline;
  740.         for (i = 0; postText [i]; i++) {
  741.                 SetAPen (reqrp, 1);
  742.                 Move (reqrp, (width - reqLen)/2, y);
  743.                 Text (reqrp, postText [i], strlen (postText [i]));
  744.                 y += reqrp->TxHeight;
  745.         }
  746.  
  747.         MoveWindowInFrontOf (reqWindow, win);
  748.         while (1) {
  749. #if 1
  750.                 WaitPort (reqWindow->UserPort);
  751. #else
  752.                 Delay (25);
  753. #endif
  754.                 while (m = GT_GetIMsg (reqWindow->UserPort)) {
  755.                         switch (m->Class) {
  756.                                 case IDCMP_GADGETUP:
  757.                                 case IDCMP_GADGETDOWN:
  758.                                         gadget = (GADGET *) m->IAddress;
  759.                                         gad_id = gadget->GadgetID;
  760.                                         GT_ReplyIMsg (m);
  761.                                         CloseWindow (reqWindow);
  762.                                         FreeGadgets (gList);
  763.                                         // GT_RefreshWindow (mainWindow, NULL);
  764.                                         GT_BeginRefresh (mainWindow);
  765.                                         GT_EndRefresh (mainWindow, TRUE);
  766.                                         EnableWindow ();
  767.                                         if (gad_id) {
  768.                                                 D (("SendItRequest(): exit, Mouse NO (%d, 0x%x)\n", gad_id, gadget));
  769.                                                 return 0;
  770.                                         }
  771.                                         else {
  772.                                                 D (("SendItRequest(): exit, Mouse YES (%d, 0x%x)\n", gad_id, gadget));
  773.                                                 return 1;
  774.                                         }
  775.  
  776.                                 case IDCMP_REFRESHWINDOW:
  777.                                         GT_ReplyIMsg (m);
  778.                                         GT_BeginRefresh (reqWindow);
  779.                                         SetAPen (reqrp, 2);
  780.                                         y = screen->BarHeight + 2 + reqrp->TxBaseline;
  781.                                         for (i = 0; postText [i]; i++) {
  782.                                                 SetAPen (reqrp, 1);
  783.                                                 Move (reqrp, (width - reqLen)/2, y);
  784.                                                 Text (reqrp, postText [i], strlen (postText[i]));
  785.                                                 y += reqrp->TxHeight;
  786.                                         }
  787.                                         GT_EndRefresh (reqWindow, TRUE);
  788.                                         break;
  789.  
  790.                                 case IDCMP_INACTIVEWINDOW:
  791.                                         GT_ReplyIMsg (m);
  792.                                         activeFlag = 0;
  793.                                         break;
  794.  
  795.                                 case IDCMP_VANILLAKEY:
  796.                                         i = m->Code;
  797.                                         GT_ReplyIMsg (m);
  798.                                         if (i == 'y' || i == 'Y' ||
  799.                                             i == 'n' || i == 'N' || i == 0x1b) {
  800.  
  801.                                                 CloseWindow (reqWindow);
  802.                                                 FreeGadgets (gList);
  803.                                                 EnableWindow ();
  804.                                                 if (i == 'y' || i == 'Y') {
  805.                                                         D (("SendItRequest(): exit, keyboard YES\n"));
  806.                                                         return 1;
  807.                                                 }
  808.                                                 D (("SendItRequest(): exit, keyboard NO\n"));
  809.                                                 return 0;
  810.                                         }
  811.                                         break;
  812.                                 default:
  813.                                         GT_ReplyIMsg (m);
  814.                                         break;
  815.                         }   // switch (m->Class)...
  816.                 } // while (m = GT_GetIMsg())....
  817.                 if (!activeFlag && IntuitionBase->ActiveWindow == win) {
  818.                         MoveWindowInFrontOf (reqWindow, win);
  819.                         ActivateWindow (reqWindow);
  820.                         activeFlag = 1;
  821.                         y = screen->BarHeight + 2 + reqrp->TxBaseline;
  822.                         for (i = 0; postText [i]; i++) {
  823.                                 SetAPen (reqrp, 1);
  824.                                 Move (reqrp, (width - reqLen)/2, y);
  825.                                 Text (reqrp, postText [i], strlen (postText [i]));
  826.                                 y += reqrp->TxHeight;
  827.                         }
  828.                 }
  829.         }   // while (1)
  830.         /* NOTREACHED */
  831.         return;
  832. }
  833.