home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 514a.lha / TplEdit_v1.00_alpha / Src / main.c < prev    next >
C/C++ Source or Header  |  1991-06-08  |  14KB  |  623 lines

  1.  
  2. /*
  3.  *  MAIN.C
  4.  *
  5.  *  TPLEDIT [project]
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10. Prototype void HandleMenu(IMsg *);
  11. Prototype void BoxComplete();
  12. Prototype void Title(char *);
  13. Prototype void TitleState(void);
  14. Prototype void TitleXY(short, short);
  15. Prototype TplRegion *SetCurRegion(TplRegion *);
  16.  
  17.  
  18. Prototype char    ProjName[256];
  19. Prototype char    ProjSrcName[256];
  20. Prototype char    TmpBuf[256];
  21. Prototype Window    *Win;
  22. Prototype Screen    *Scr;
  23. Prototype NewGadget Ng;
  24. Prototype NewMenu   Nm[];
  25. Prototype Gadget    *GList;
  26. Prototype Menu        *GMenu;
  27. Prototype List        RegList;
  28. Prototype List        PPList;
  29. Prototype TplRegion *CurRegion;
  30. Prototype short     CurState;
  31.  
  32. Prototype ProjHeader    Ph;
  33. Prototype short     NotDone;
  34. Prototype short     DDebug;
  35. Prototype uword     IdNo;
  36. Prototype short     NewType;
  37. Prototype long        NewFlags;
  38.  
  39. void myexit(void);
  40.  
  41. NewMenu     Nm[] = {
  42.     {    NM_TITLE,   "Project" },
  43.     {    NM_ITEM,    "Save",         NULL, 0, 0, MENU_PROJ_SAVE      },
  44.     {    NM_ITEM,    "SaveC",        NULL, 0, 0, MENU_PROJ_SAVESRC   },
  45.     {    NM_ITEM,    "SaveAs",       NULL, 0, 0, MENU_PROJ_SAVEAS    },
  46.     {    NM_ITEM,    "SaveAsC",      NULL, 0, 0, MENU_PROJ_SAVEASSRC },
  47.     {    NM_ITEM,    "Load",         NULL, 0, 0, MENU_PROJ_LOAD      },
  48.     {    NM_ITEM,    "Merge",        NULL, 0, 0, MENU_PROJ_MERGE     },
  49.     {    NM_ITEM,    "Quit",         NULL, 0, 0, MENU_PROJ_QUIT      },
  50.  
  51.     {    NM_TITLE,   "Linking" },
  52.     {    NM_ITEM,    "LockTo",       NULL, 0, 0, MENU_LINK_LOCK      },
  53.  
  54.     {    NM_TITLE,   "Snap" },
  55.     {    NM_ITEM,    "1",       NULL, 0, 0, MENU_SNAP+1      },
  56.     {    NM_ITEM,    "2",       NULL, 0, 0, MENU_SNAP+2      },
  57.     {    NM_ITEM,    "4",       NULL, 0, 0, MENU_SNAP+4      },
  58.     {    NM_ITEM,    "6",       NULL, 0, 0, MENU_SNAP+6      },
  59.     {    NM_ITEM,    "8",       NULL, 0, 0, MENU_SNAP+8      },
  60.     {    NM_ITEM,    "10",      NULL, 0, 0, MENU_SNAP+10     },
  61.     {    NM_ITEM,    "12",      NULL, 0, 0, MENU_SNAP+12     },
  62.     {    NM_ITEM,    "14",      NULL, 0, 0, MENU_SNAP+14     },
  63.     {    NM_ITEM,    "16",      NULL, 0, 0, MENU_SNAP+16     },
  64.     {    NM_ITEM,    "18",      NULL, 0, 0, MENU_SNAP+18     },
  65.     {    NM_ITEM,    "20",      NULL, 0, 0, MENU_SNAP+20     },
  66.  
  67.  
  68.     {    NM_END    }
  69. };
  70.  
  71. char        ProjName[256];
  72. char        ProjSrcName[256];
  73. char        TitleBuf[256];
  74. char        TmpBuf[256];
  75. Window        *Win;
  76. Screen        *Scr;
  77. NewGadget   Ng;
  78. Gadget        *GList;
  79. Menu        *GMenu;
  80. List        RegList;
  81. List        PPList;
  82. TplRegion   *CurRegion;
  83. short        CurState;
  84. short        ButState;
  85. short        DDebug;
  86. short        CoorSnap = 1;
  87. uword        IdNo;
  88. short        NewType  = 0;
  89. long        NewFlags = 0x0001;
  90. long        WinMask;
  91.  
  92. ProjHeader  Ph;
  93.  
  94. short        NotDone = 1;
  95. Box        TBox;
  96. short        TX, TY;
  97.  
  98. main(ac, av)
  99. char *av[];
  100. {
  101.     short i;
  102.  
  103.     NewList(&RegList);
  104.     NewList(&PPList);
  105.  
  106.     atexit(myexit);
  107.  
  108.     for (i = 1; i < ac; ++i) {
  109.     char *ptr = av[i];
  110.     if (*ptr != '-') {
  111.         strcpy(ProjName, ptr);
  112.         continue;
  113.     }
  114.     ptr += 2;
  115.     switch(ptr[-1]) {
  116.     case 'd':
  117.         ++DDebug;
  118.         break;
  119.     }
  120.     }
  121.  
  122.     if ((Scr = LockPubScreen(NULL)) == NULL)
  123.     exit(20);
  124.     if ((Ng.ng_VisualInfo = GetVisualInfo(Scr, TAG_END)) == NULL)
  125.     exit(22);
  126.  
  127.     GMenu = CreateMenus(Nm,
  128.     GTMN_FullMenu, 1,
  129.     TAG_END
  130.     );
  131.     if (GMenu == NULL)
  132.     exit(24);
  133.  
  134.     if (LayoutMenus(GMenu, Ng.ng_VisualInfo, TAG_END) == 0)
  135.     exit(25);
  136.  
  137.     Ph.ph_WinDim.bo_Xs      = 0;
  138.     Ph.ph_WinDim.bo_Ys      = 0;
  139.     Ph.ph_WinDim.bo_Xe      = 200;
  140.     Ph.ph_WinDim.bo_Ye      = 200;
  141.     Ph.ph_MinMaxDim.bo_Xs = 32;
  142.     Ph.ph_MinMaxDim.bo_Ys = 32;
  143.     Ph.ph_MinMaxDim.bo_Xe = -1;
  144.     Ph.ph_MinMaxDim.bo_Ye = -1;
  145.  
  146.     if (OpenEditWindow() < 0)
  147.     exit(26);
  148.  
  149.     if (ProjName[0] == 0)
  150.     strcpy(ProjName, "unnamed");
  151.     else
  152.     LoadProject(ProjName);
  153.  
  154.     MakeAllGadgets();
  155.  
  156.     /*
  157.      *    Open Window
  158.      */
  159.  
  160.     Win = OpenWindowTags(NULL,
  161.     WA_Flags,   WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|
  162.             WFLG_SIMPLE_REFRESH|WFLG_REPORTMOUSE|
  163.             WFLG_SIZEGADGET,
  164.  
  165.     WA_IDCMP,   IDCMP_NEWSIZE|IDCMP_MOUSEBUTTONS|IDCMP_GADGETDOWN|
  166.             IDCMP_GADGETUP|IDCMP_MENUPICK|IDCMP_VANILLAKEY|
  167.             IDCMP_RAWKEY|IDCMP_CHANGEWINDOW|IDCMP_CLOSEWINDOW|
  168.             IDCMP_REFRESHWINDOW|IDCMP_MOUSEMOVE|IDCMP_ACTIVEWINDOW,
  169.  
  170.     WA_Left,    Ph.ph_WinDim.bo_Xs,
  171.     WA_Top,     Ph.ph_WinDim.bo_Ys,
  172.     WA_Width,   Ph.ph_WinDim.bo_Xe - Ph.ph_WinDim.bo_Xs,
  173.     WA_Height,  Ph.ph_WinDim.bo_Ye - Ph.ph_WinDim.bo_Ys,
  174.     WA_Title,   ProjName,
  175.     WA_MinWidth,  Ph.ph_MinMaxDim.bo_Xs,
  176.     WA_MinHeight, Ph.ph_MinMaxDim.bo_Ys,
  177.     WA_MaxWidth,  Ph.ph_MinMaxDim.bo_Xe,
  178.     WA_MaxHeight, Ph.ph_MinMaxDim.bo_Ye,
  179.     WA_AutoAdjust, 1,
  180.     WA_PubScreen, NULL,
  181.     WA_PubScreenFallBack, 1,
  182.     WA_Gadgets, GList,
  183.     TAG_END
  184.     );
  185.  
  186.     if (Win == NULL)
  187.     exit(27);
  188.  
  189.     WinMask = 1 << Win->UserPort->mp_SigBit;
  190.  
  191.     SetMenuStrip(Win, GMenu);
  192.  
  193.     Title("TPLEDIT 1.0 PUBLIC DOMAIN, Matthew Dillon");
  194.  
  195.     /*
  196.      *    Main Loop
  197.      */
  198.  
  199.     GT_RefreshWindow(Win, NULL);
  200.  
  201.     while (NotDone) {
  202.     IMsg *im;
  203.     long mask;
  204.  
  205.     mask = Wait(WinMask | EWinMask | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F);
  206.  
  207.     if (mask & SIGBREAKF_CTRL_C)
  208.         NotDone = 0;
  209.  
  210.     if (Win) {
  211.         while (im = GT_GetIMsg(Win->UserPort)) {
  212.         short saveX = im->MouseX;
  213.         short saveY = im->MouseY;
  214.  
  215.         im->MouseX = (saveX + (CoorSnap >> 1)) / CoorSnap * CoorSnap;
  216.         im->MouseY = (saveY + (CoorSnap >> 1)) / CoorSnap * CoorSnap;
  217.  
  218.         if (DDebug && im->Class != IDCMP_MOUSEMOVE)
  219.             printf("CLASS %08lx CODE %d IA=%08lx\n", im->Class, im->Code, im->IAddress);
  220.  
  221.         switch(im->Class) {
  222.         case IDCMP_ACTIVEWINDOW:
  223.             ClearMenuStrip(EWin);
  224.             SetMenuStrip(Win, GMenu);
  225.             break;
  226.         case IDCMP_CHANGEWINDOW:
  227.             Ph.ph_WinDim.bo_Xs = Win->LeftEdge;
  228.             Ph.ph_WinDim.bo_Ys = Win->TopEdge;
  229.             Ph.ph_WinDim.bo_Xe = Win->LeftEdge + Win->Width;
  230.             Ph.ph_WinDim.bo_Ye = Win->TopEdge + Win->Height;
  231.             break;
  232.         case IDCMP_CLOSEWINDOW:
  233.             NotDone = 0;
  234.             break;
  235.         case IDCMP_REFRESHWINDOW:
  236.             GT_BeginRefresh(Win);
  237.             GT_EndRefresh(Win, TRUE);
  238.             break;
  239.         case IDCMP_GADGETDOWN:
  240.         case IDCMP_GADGETUP:
  241.             if (SetCurRegion(FindRegionByGad((Gadget *)im->IAddress))) {
  242.             UpdateEWinInfo(CurRegion);
  243.             TitleState();
  244.             }
  245.             break;
  246.         case IDCMP_RAWKEY:    /*  HELP KEY        */
  247.             break;
  248.         case IDCMP_MENUPICK:
  249.             HandleMenu(im);
  250.             break;
  251.         case IDCMP_MOUSEBUTTONS:
  252.             switch(im->Code) {
  253.             case SELECTDOWN:
  254.             switch(CurState) {
  255.             case STATE_NEWREGION:
  256.                 TBox.bo_Xs = TBox.bo_Xe = im->MouseX;
  257.                 TBox.bo_Ys = TBox.bo_Ye = im->MouseY;
  258.                 DrawBox(&TBox);
  259.                 TitleState();
  260.                 ButState |= 4;
  261.                 break;
  262.             case STATE_DELREGION:
  263.                 if (SetCurRegion(FindRegion(saveX, saveY))) {
  264.                 DeleteTplRegion(CurRegion);
  265.                 ReMakeEverything();
  266.                 }
  267.                 break;
  268.             case STATE_MOVEREGION:
  269.             case STATE_SIZEREGION:
  270.                 if (SetCurRegion(FindRegion(saveX, saveY))) {
  271.                 TX = im->MouseX;
  272.                 TY = im->MouseY;
  273.                 UpdateEWinInfo(CurRegion);
  274.                 TBox = CurRegion->rg_Box;
  275.                 DrawBox(&TBox);
  276.                 TitleState();
  277.                 ButState |= 4;
  278.                 }
  279.                 break;
  280.             case STATE_LINKREGION:
  281.                 if (CurRegion) {
  282.                 TplRegion *tr;
  283.  
  284.                 if (tr = FindRegion(saveX, saveY)) {
  285.                     CurRegion->rg_LockedTo = tr;
  286.  
  287.                     /*
  288.                      *    Apparently the width (Xe-Xs) must be
  289.                      *    exactly the same as the listview width,
  290.                      *    and all other parameters are ignored.
  291.                      */
  292.  
  293.                     tr->rg_Box.bo_Xs = CurRegion->rg_Box.bo_Xs;
  294.                     tr->rg_Box.bo_Xe = CurRegion->rg_Box.bo_Xe;
  295.                     tr->rg_Box.bo_Ys = CurRegion->rg_Box.bo_Ye;
  296.                     tr->rg_Box.bo_Ye = tr->rg_Box.bo_Ys + 16;
  297.                     ReMakeEverything();
  298.                     Title("Link Successful");
  299.                 }
  300.                 }
  301.                 CurState = STATE_WANDER;
  302.                 EnableGadgets();
  303.                 break;
  304.             case STATE_WANDER:
  305.                 if (SetCurRegion(FindRegion(saveX, saveY))) {
  306.                 UpdateEWinInfo(CurRegion);
  307.                 TitleState();
  308.                 }
  309.                 break;
  310.             }
  311.             ButState |= 1;
  312.             break;
  313.             case SELECTUP:
  314.             if (ButState & 4) {
  315.                 DrawBox(&TBox);
  316.                 TitleState();
  317.  
  318.                 switch(CurState) {
  319.                 case STATE_NEWREGION:
  320.                 TBox.bo_Xe = im->MouseX;
  321.                 TBox.bo_Ye = im->MouseY;
  322.                 break;
  323.                 case STATE_MOVEREGION:
  324.                 TBox.bo_Xs += im->MouseX - TX;
  325.                 TBox.bo_Xe += im->MouseX - TX;
  326.                 TBox.bo_Ys += im->MouseY - TY;
  327.                 TBox.bo_Ye += im->MouseY - TY;
  328.                 break;
  329.                 case STATE_SIZEREGION:
  330.                 TBox.bo_Xe += im->MouseX - TX;
  331.                 TBox.bo_Ye += im->MouseY - TY;
  332.                 break;
  333.                 }
  334.                 FixBounds(&TBox);
  335.                 BoxComplete();
  336.             }
  337.             ButState &= ~(1|4);
  338.             break;
  339.             case MENUDOWN:
  340.             ButState |= 2;
  341.             break;
  342.             case MENUUP:
  343.             ButState &= ~2;
  344.             break;
  345.             default:
  346.             break;
  347.             }
  348.             break;
  349.         case IDCMP_MOUSEMOVE:
  350.             if (ButState & 4) {
  351.             DrawBox(&TBox);
  352.  
  353.             switch(CurState) {
  354.             case STATE_NEWREGION:
  355.                 TBox.bo_Xe = im->MouseX;
  356.                 TBox.bo_Ye = im->MouseY;
  357.                 break;
  358.             case STATE_MOVEREGION:
  359.                 TBox.bo_Xs += im->MouseX - TX;
  360.                 TBox.bo_Xe += im->MouseX - TX;
  361.                 TBox.bo_Ys += im->MouseY - TY;
  362.                 TBox.bo_Ye += im->MouseY - TY;
  363.                 break;
  364.             case STATE_SIZEREGION:
  365.                 TBox.bo_Xe += im->MouseX - TX;
  366.                 TBox.bo_Ye += im->MouseY - TY;
  367.                 break;
  368.             }
  369.             TX = im->MouseX;
  370.             TY = im->MouseY;
  371.             DrawBox(&TBox);
  372.             TitleState();
  373.             }
  374.             break;
  375.         default:
  376.             break;
  377.         }
  378.         im->MouseX = saveX;
  379.         im->MouseY = saveY;
  380.         GT_ReplyIMsg(im);
  381.         }
  382.     }
  383.     if (EWin) {
  384.         while (im = GT_GetIMsg(EWin->UserPort)) {
  385.         if (DDebug && im->Class != IDCMP_MOUSEMOVE)
  386.             printf("CLASS %08lx CODE %d IA=%08lx\n", im->Class, im->Code, im->IAddress);
  387.  
  388.         switch(im->Class) {
  389.         case IDCMP_ACTIVEWINDOW:
  390.             ClearMenuStrip(Win);
  391.             SetMenuStrip(EWin, GMenu);
  392.             break;
  393.         case IDCMP_CHANGEWINDOW:
  394.             break;
  395.         case IDCMP_CLOSEWINDOW:
  396.             NotDone = 0;
  397.             break;
  398.         case IDCMP_REFRESHWINDOW:
  399.             GT_BeginRefresh(EWin);
  400.             GT_EndRefresh(EWin, TRUE);
  401.             break;
  402.         case IDCMP_GADGETUP:
  403.             HandleEditGadget(im);
  404.             break;
  405.         case IDCMP_RAWKEY:    /*  HELP KEY        */
  406.             break;
  407.         case IDCMP_MENUPICK:
  408.             HandleMenu(im);
  409.             break;
  410.         case IDCMP_MOUSEBUTTONS:
  411.             switch(im->Code) {
  412.             case SELECTDOWN:
  413.             break;
  414.             case SELECTUP:
  415.             break;
  416.             case MENUDOWN:
  417.             break;
  418.             case MENUUP:
  419.             break;
  420.             default:
  421.             break;
  422.             }
  423.             break;
  424.         case IDCMP_MOUSEMOVE:
  425.             break;
  426.         default:
  427.             break;
  428.         }
  429.         GT_ReplyIMsg(im);
  430.         }
  431.     }
  432.     }
  433.     return(0);
  434. }
  435.  
  436. void
  437. myexit(void)
  438. {
  439.     if (Win) {
  440.     ClearMenuStrip(Win);
  441.     CloseWindow(Win);
  442.     }
  443.     CloseEditWindow();
  444.     if (GList)
  445.     FreeGadgets(GList);
  446.     if (GMenu)
  447.     FreeMenus(GMenu);
  448.     if (Ng.ng_VisualInfo)
  449.     FreeVisualInfo(Ng.ng_VisualInfo);
  450.     if (Scr)
  451.     UnlockPubScreen(NULL, Scr);
  452. }
  453.  
  454. void
  455. BoxComplete()
  456. {
  457.     switch(CurState) {
  458.     case STATE_WANDER:
  459.     break;
  460.     case STATE_NEWREGION:
  461.     {
  462.         short dx = TBox.bo_Xe - TBox.bo_Xs;
  463.         short dy = TBox.bo_Ye - TBox.bo_Ys;
  464.  
  465.         if ((dx < 5 && dy < 5) || dx < 3 || dy < 3)
  466.         return;
  467.     }
  468.     if (RegName[0] == 0) {
  469.         puts("no region name");
  470.         return;
  471.     }
  472.     DrawBox(&TBox);
  473.     {
  474.         TplRegion *rg = AllocTplRegion();
  475.  
  476.         UpdateTplRegion(rg);
  477.  
  478.         rg->rg_Box = TBox;
  479.         rg->rg_MinMax.bo_Xs = rg->rg_MinMax.bo_Xe = TBox.bo_Xe - TBox.bo_Xs;
  480.         rg->rg_MinMax.bo_Ys = rg->rg_MinMax.bo_Ye = TBox.bo_Ye - TBox.bo_Ys;
  481.  
  482.         SetCurRegion(rg);
  483.         UpdateEWinInfo(CurRegion);
  484.         ReMakeEverything();
  485.     }
  486.     break;
  487.     case STATE_MOVEREGION:
  488.     if (CurRegion) {
  489.         CurRegion->rg_Box = TBox;
  490.         ReMakeEverything();
  491.     }
  492.     break;
  493.     case STATE_SIZEREGION:
  494.     if (CurRegion) {
  495.         CurRegion->rg_Box = TBox;
  496.         ReMakeEverything();
  497.     }
  498.     break;
  499.     }
  500. }
  501.  
  502. void
  503. HandleMenu(im)
  504. IMsg *im;
  505. {
  506.     MenuItem *mi;
  507.  
  508.     if (mi = ItemAddress(GMenu, im->Code)) {
  509.     switch(GTMENUITEM_USERDATA(mi)) {
  510.     case MENU_PROJ_SAVEAS:
  511.         strcpy(ProjSrcName, ProjName);
  512.         if (GetSaveFile(ProjSrcName) >= 0)
  513.         SaveProject(ProjSrcName);
  514.         break;
  515.     case MENU_PROJ_SAVE:
  516.         SaveProject(ProjName);
  517.         break;
  518.     case MENU_PROJ_SAVESRC:     /*    ProjName.c  */
  519.         sprintf(ProjSrcName, "%s.c", ProjName);
  520.         SaveProjectAsSrc(ProjSrcName);
  521.         break;
  522.     case MENU_PROJ_SAVEASSRC:
  523.         sprintf(ProjSrcName, "%s.c", ProjName);
  524.         if (GetSaveFile(ProjSrcName)) {
  525.         SaveProjectAsSrc(ProjSrcName);
  526.         }
  527.         break;
  528.     case MENU_LINK_LOCK:
  529.         if (CurRegion) {
  530.         Title("Choose Link Destination");
  531.         CurState = STATE_LINKREGION;
  532.         DisableGadgets();
  533.         }
  534.         break;
  535.     case MENU_PROJ_LOAD:
  536.         if (GetSaveFile(ProjName) >= 0) {
  537.         TplRegion *rg;
  538.         while (rg = GetHead(&RegList))
  539.             DeleteTplRegion(rg);
  540.         LoadProject(ProjName);
  541.         ReMakeEverything();
  542.         }
  543.         break;
  544.     case MENU_PROJ_MERGE:
  545.         if (GetSaveFile(ProjSrcName) >= 0) {
  546.         TplRegion *rg;
  547.         LoadProject(ProjSrcName);
  548.         ReMakeEverything();
  549.         }
  550.         break;
  551.     case MENU_PROJ_QUIT:
  552.         NotDone = 0;
  553.         break;
  554.     case MENU_SNAP + 1:
  555.     case MENU_SNAP + 2:
  556.     case MENU_SNAP + 4:
  557.     case MENU_SNAP + 6:
  558.     case MENU_SNAP + 8:
  559.     case MENU_SNAP + 10:
  560.     case MENU_SNAP + 12:
  561.     case MENU_SNAP + 14:
  562.     case MENU_SNAP + 16:
  563.     case MENU_SNAP + 18:
  564.     case MENU_SNAP + 20:
  565.         CoorSnap = (short)GTMENUITEM_USERDATA(mi) - MENU_SNAP;
  566.         break;
  567.     default:
  568.         break;;
  569.     }
  570.     }
  571. }
  572.  
  573. void
  574. Title(tit)
  575. char *tit;
  576. {
  577.     if (Win) {
  578.     SetWindowTitles(Win, NULL, NULL);
  579.     sprintf(TitleBuf, "%s  %s  %s",
  580.         ProjName,
  581.         (CurRegion) ? CurRegion->rg_Node.ln_Name : "<none>",
  582.         tit
  583.     );
  584.     SetWindowTitles(Win, TitleBuf, NULL);
  585.     }
  586. }
  587.  
  588. void
  589. TitleState()
  590. {
  591.     switch(CurState) {
  592.     case STATE_NEWREGION:
  593.     case STATE_SIZEREGION:
  594.     TitleXY(TBox.bo_Xe - TBox.bo_Xs, TBox.bo_Ye - TBox.bo_Ys);
  595.     break;
  596.     case STATE_MOVEREGION:
  597.     TitleXY(TBox.bo_Xs, TBox.bo_Ys);
  598.     break;
  599.     }
  600. }
  601.  
  602. void
  603. TitleXY(x, y)
  604. short x, y;
  605. {
  606.     if (x < 0)
  607.     x = -x;
  608.     if (y < 0)
  609.     y = -y;
  610.     sprintf(TmpBuf, "%dx%d", x, y);
  611.     Title(TmpBuf);
  612. }
  613.  
  614. TplRegion *
  615. SetCurRegion(rg)
  616. TplRegion *rg;
  617. {
  618.     CurRegion = rg;
  619.     Title("");
  620.     return(rg);
  621. }
  622.  
  623.