home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / term-source.lha / InfoWindow.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  7.5 KB  |  407 lines

  1. /*
  2. **    InfoWindow.c
  3. **
  4. **    Status information window support routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #ifndef _GLOBAL_H
  11. #include "Global.h"
  12. #endif
  13.  
  14. enum    {    GAD_UPDATE=1,GAD_SESSION,GAD_BYTES_IN_OUT,GAD_CONNECT_STRING,GAD_BBS_INFO,
  15.         GAD_SCREEN_SIZE,GAD_PORT_NAME,GAD_BUFFER_SIZE,GAD_MEMORY,
  16.     };
  17.  
  18. STATIC struct Process        *InfoProcess;
  19. STATIC struct LayoutHandle    *InfoHandle;
  20.  
  21.     /* LocalRefreshInfoWindow():
  22.      *
  23.      *    Refresh, i.e. redraw, the contents of the info window.
  24.      */
  25.  
  26. STATIC VOID
  27. LocalRefreshInfoWindow(VOID)
  28. {
  29.     if(InfoWindow)
  30.     {
  31.         UBYTE DummyBuffer[256];
  32.  
  33.         SPrintf(DummyBuffer,ConvNumber,BytesIn);
  34.  
  35.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  36.             LABX_Index,    0,
  37.             LABX_Text,    DummyBuffer,
  38.         TAG_DONE);
  39.  
  40.         SPrintf(DummyBuffer,ConvNumber,BytesOut);
  41.  
  42.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  43.             LABX_Index,    1,
  44.             LABX_Text,    DummyBuffer,
  45.         TAG_DONE);
  46.  
  47.         Forbid();
  48.  
  49.         if(XEmulatorBase && XEM_IO)
  50.         {
  51.             if(XEmulatorBase -> lib_Version >= 4)
  52.             {
  53.                 ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  54.  
  55.                 SPrintf(DummyBuffer,"%ld × %ld",XEMI_EXTRACT_COLUMNS(Result),XEMI_EXTRACT_LINES(Result));
  56.             }
  57.             else
  58.                 strcpy(DummyBuffer,"???");
  59.         }
  60.         else
  61.             SPrintf(DummyBuffer,"%ld × %ld",LastColumn + 1,LastLine + 1);
  62.  
  63.         Permit();
  64.  
  65.         LT_SetAttributes(InfoHandle,GAD_SCREEN_SIZE,
  66.             GTTX_Text,    DummyBuffer,
  67.         TAG_DONE);
  68.  
  69.         SPrintf(DummyBuffer,ConvNumber,BufferSpace);
  70.  
  71.         LT_SetAttributes(InfoHandle,GAD_BUFFER_SIZE,
  72.             GTTX_Text,    DummyBuffer,
  73.         TAG_DONE);
  74.  
  75.         SPrintf(DummyBuffer,ConvNumber,AvailMem(MEMF_ANY));
  76.  
  77.         LT_SetAttributes(InfoHandle,GAD_MEMORY,
  78.             GTTX_Text,    DummyBuffer,
  79.         TAG_DONE);
  80.  
  81.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  82.             LABX_Index,    0,
  83.             LABX_Text,    CurrentBBSName[0] ? CurrentBBSName : (STRPTR)"-",
  84.         TAG_DONE);
  85.  
  86.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  87.             LABX_Index,    1,
  88.             LABX_Text,    CurrentBBSNumber[0] ? CurrentBBSNumber : (STRPTR)"-",
  89.         TAG_DONE);
  90.  
  91.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  92.             LABX_Index,    2,
  93.             LABX_Text,    CurrentBBSComment[0] ? CurrentBBSComment : (STRPTR)"-",
  94.         TAG_DONE);
  95.  
  96.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  97.             LABX_Index,    3,
  98.             LABX_Text,    UserName[0] ? UserName : (STRPTR)"-",
  99.         TAG_DONE);
  100.     }
  101. }
  102.  
  103.     /* LocalCloseInfoWindow():
  104.      *
  105.      *    Close the info window.
  106.      */
  107.  
  108. STATIC VOID
  109. LocalCloseInfoWindow(VOID)
  110. {
  111.     Forbid();
  112.  
  113.     CheckItem(MEN_STATUS_WINDOW,FALSE);
  114.  
  115.     Permit();
  116.  
  117.     if(InfoHandle)
  118.     {
  119.         LT_DeleteHandle(InfoHandle);
  120.  
  121.         InfoHandle = NULL;
  122.     }
  123.  
  124.     InfoWindow = NULL;
  125. }
  126.  
  127.     /* LocalOpenInfoWindow():
  128.      *
  129.      *    Open the info window.
  130.      */
  131.  
  132. STATIC BOOL
  133. LocalOpenInfoWindow(VOID)
  134. {
  135.     if(InfoHandle = LT_CreateHandleTags(Window -> WScreen,
  136.         LH_LocaleHook,    &LocaleHook,
  137.     TAG_DONE))
  138.     {
  139.         LT_New(InfoHandle,
  140.             LA_Type,    VERTICAL_KIND,
  141.         TAG_DONE);
  142.         {
  143.             LT_New(InfoHandle,
  144.                 LA_Type,    VERTICAL_KIND,
  145.             TAG_DONE);
  146.             {
  147.                 UBYTE DummyBuffer[256];
  148.  
  149.                 if(!FormatStamp(&SessionStart,NULL,NULL,DummyBuffer,FALSE))
  150.                     strcpy(DummyBuffer,"-");
  151.  
  152.                 LT_New(InfoHandle,
  153.                     LA_Type,        TEXT_KIND,
  154.                     LA_LabelID,        MSG_INFOWINDOW_SESSION_START_GAD,
  155.                     LA_ID,            GAD_SESSION,
  156.                     LA_Chars,        40,
  157.                     GTTX_Text,        DummyBuffer,
  158.                     GTTX_Border,        TRUE,
  159.                     GTTX_CopyText,        TRUE,
  160.                 TAG_DONE);
  161.  
  162.                 LT_New(InfoHandle,
  163.                     LA_Type,        XBAR_KIND,
  164.                 TAG_DONE);
  165.  
  166.                 LT_New(InfoHandle,
  167.                     LA_Type,        BOX_KIND,
  168.                     LA_ID,            GAD_BYTES_IN_OUT,
  169.                     LABX_FirstLabel,    MSG_INFOWINDOW_BYTES_RECEIVED_GAD,
  170.                     LABX_LastLabel,        MSG_INFOWINDOW_BYTES_SENT_GAD,
  171.                     LABX_ReserveSpace,    TRUE,
  172.                     LABX_DrawBox,        TRUE,
  173.                     LA_Chars,        40,
  174.                 TAG_DONE);
  175.  
  176.                 LT_New(InfoHandle,
  177.                     LA_Type,        XBAR_KIND,
  178.                 TAG_DONE);
  179.  
  180.                 LT_New(InfoHandle,
  181.                     LA_Type,        TEXT_KIND,
  182.                     LA_LabelID,        MSG_INFOWINDOW_CONNECTION_MESSAGE_GAD,
  183.                     LA_ID,            GAD_CONNECT_STRING,
  184.                     GTTX_Text,        BaudBuffer[0] ? BaudBuffer : (STRPTR)"-",
  185.                     GTTX_Border,        TRUE,
  186.                     GTTX_CopyText,        TRUE,
  187.                 TAG_DONE);
  188.  
  189.                 LT_New(InfoHandle,
  190.                     LA_Type,        BOX_KIND,
  191.                     LA_ID,            GAD_BBS_INFO,
  192.                     LABX_FirstLabel,    MSG_INFOWINDOW_BBS_NAME_GAD,
  193.                     LABX_LastLabel,        MSG_INFOWINDOW_BBS_USER_NAME_GAD,
  194.                     LABX_ReserveSpace,    TRUE,
  195.                     LABX_DrawBox,        TRUE,
  196.                     LA_Chars,        40,
  197.                 TAG_DONE);
  198.  
  199.                 LT_New(InfoHandle,
  200.                     LA_Type,        XBAR_KIND,
  201.                 TAG_DONE);
  202.  
  203.                 LT_New(InfoHandle,
  204.                     LA_Type,        TEXT_KIND,
  205.                     LA_LabelID,        MSG_INFOWINDOW_SCREEN_SIZE_GAD,
  206.                     LA_ID,            GAD_SCREEN_SIZE,
  207.                     GTTX_Border,        TRUE,
  208.                     GTTX_CopyText,        TRUE,
  209.                 TAG_DONE);
  210.  
  211.                 LT_New(InfoHandle,
  212.                     LA_Type,        TEXT_KIND,
  213.                     LA_LabelID,        MSG_INFOWINDOW_AREXX_PORT_NAME_GAD,
  214.                     LA_ID,            GAD_PORT_NAME,
  215.                     GTTX_Text,        RexxPortName,
  216.                     GTTX_Border,        TRUE,
  217.                     GTTX_CopyText,        TRUE,
  218.                 TAG_DONE);
  219.  
  220.                 LT_New(InfoHandle,
  221.                     LA_Type,        TEXT_KIND,
  222.                     LA_LabelID,        MSG_INFOWINDOW_BUFFER_SIZE_GAD,
  223.                     LA_ID,            GAD_BUFFER_SIZE,
  224.                     GTTX_Border,        TRUE,
  225.                     GTTX_CopyText,        TRUE,
  226.                 TAG_DONE);
  227.  
  228.                 LT_New(InfoHandle,
  229.                     LA_Type,        TEXT_KIND,
  230.                     LA_LabelID,        MSG_INFOWINDOW_FREE_MEMORY_GAD,
  231.                     LA_ID,            GAD_MEMORY,
  232.                     GTTX_Border,        TRUE,
  233.                     GTTX_CopyText,        TRUE,
  234.                 TAG_DONE);
  235.  
  236.                 LT_EndGroup(InfoHandle);
  237.             }
  238.  
  239.             LT_New(InfoHandle,
  240.                 LA_Type,VERTICAL_KIND,
  241.             TAG_DONE);
  242.             {
  243.                 LT_New(InfoHandle,
  244.                     LA_Type,    XBAR_KIND,
  245.                     LAXB_FullSize,    TRUE,
  246.                 TAG_DONE);
  247.  
  248.                 LT_EndGroup(InfoHandle);
  249.             }
  250.  
  251.             LT_New(InfoHandle,
  252.                 LA_Type,    HORIZONTAL_KIND,
  253.             TAG_DONE);
  254.             {
  255.                 LT_New(InfoHandle,
  256.                     LA_Type,    BUTTON_KIND,
  257.                     LA_LabelID,    MSG_V36_1414,
  258.                     LA_ID,        GAD_UPDATE,
  259.                     LA_ReturnKey,    TRUE,
  260.                     LABT_ExtraFat,    TRUE,
  261.                 TAG_DONE);
  262.  
  263.                 LT_EndGroup(InfoHandle);
  264.             }
  265.  
  266.             LT_EndGroup(InfoHandle);
  267.         }
  268.  
  269.         if(InfoWindow = LT_Build(InfoHandle,
  270.             LAWN_TitleID,        MSG_INFOWINDOW_STATUS_INFORMATION_TXT,
  271.             LAWN_IDCMP,        IDCMP_CLOSEWINDOW,
  272.             LAWN_AlignWindow,    ALIGNF_RIGHT,
  273.             LAWN_HelpHook,        &GuideHook,
  274.             WA_DepthGadget,        TRUE,
  275.             WA_CloseGadget,        TRUE,
  276.             WA_DragBar,        TRUE,
  277.             WA_RMBTrap,        TRUE,
  278.             WA_SimpleRefresh,    TRUE,
  279.         TAG_DONE))
  280.         {
  281.             LocalRefreshInfoWindow();
  282.  
  283.             return(TRUE);
  284.         }
  285.         else
  286.         {
  287.             LT_DeleteHandle(InfoHandle);
  288.  
  289.             InfoHandle = NULL;
  290.         }
  291.     }
  292.  
  293.     return(FALSE);
  294. }
  295.  
  296. STATIC VOID __saveds
  297. StatusProcessEntry(VOID)
  298. {
  299.     struct Process *Parent = ThisProcess;
  300.  
  301.     if(LocalOpenInfoWindow())
  302.     {
  303.         struct IntuiMessage    *Message;
  304.         ULONG             MsgClass;
  305.         struct Gadget        *MsgGadget;
  306.         BOOL             Done = FALSE;
  307.  
  308.         InfoProcess = (struct Process *)FindTask(NULL);
  309.  
  310.         Signal(Parent,SIG_HANDSHAKE);
  311.  
  312.         do
  313.         {
  314.             if(Wait(PORTMASK(InfoWindow -> UserPort) | SIG_KILL) & SIG_KILL)
  315.                 break;
  316.             else
  317.             {
  318.                 while(Message = LT_GetIMsg(InfoHandle))
  319.                 {
  320.                     MsgClass    = Message -> Class;
  321.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  322.  
  323.                     LT_ReplyIMsg(Message);
  324.  
  325.                     switch(MsgClass)
  326.                     {
  327.                         case IDCMP_CLOSEWINDOW:
  328.  
  329.                             if(!Done)
  330.                             {
  331.                                 Forbid();
  332.  
  333.                                 if(!(SetSignal(0,SIG_KILL) & SIG_KILL))
  334.                                     Parent = NULL;
  335.  
  336.                                 Done = TRUE;
  337.                             }
  338.  
  339.                             break;
  340.  
  341.                         case IDCMP_GADGETUP:
  342.  
  343.                             if(MsgGadget -> GadgetID == GAD_UPDATE)
  344.                                 LocalRefreshInfoWindow();
  345.  
  346.                             break;
  347.                     }
  348.                 }
  349.             }
  350.         }
  351.         while(!Done);
  352.  
  353.         LocalCloseInfoWindow();
  354.     }
  355.  
  356.     Forbid();
  357.  
  358.     InfoProcess = NULL;
  359.  
  360.     if(Parent)
  361.         Signal(Parent,SIG_HANDSHAKE);
  362. }
  363.  
  364. VOID
  365. CloseInfoWindow()
  366. {
  367.     Forbid();
  368.  
  369.     if(InfoProcess)
  370.     {
  371.         ClrSignal(SIG_HANDSHAKE);
  372.  
  373.         Signal(InfoProcess,SIG_KILL);
  374.  
  375.         Wait(SIG_HANDSHAKE);
  376.     }
  377.  
  378.     Permit();
  379. }
  380.  
  381. VOID
  382. OpenInfoWindow()
  383. {
  384.     Forbid();
  385.  
  386.     if(!InfoProcess)
  387.     {
  388.         if(CreateNewProcTags(
  389.             NP_Entry,    StatusProcessEntry,
  390.             NP_Name,    "term Status Window Process",
  391.             NP_WindowPtr,    -1,
  392.         TAG_END))
  393.         {
  394.             ClrSignal(SIG_HANDSHAKE);
  395.  
  396.             Wait(SIG_HANDSHAKE);
  397.         }
  398.     }
  399.  
  400.     if(InfoProcess)
  401.         CheckItem(MEN_STATUS_WINDOW,TRUE);
  402.     else
  403.         CheckItem(MEN_STATUS_WINDOW,FALSE);
  404.  
  405.     Permit();
  406. }
  407.